• Stars
    star
    159
  • Rank 235,916 (Top 5 %)
  • Language
    Emacs Lisp
  • License
    GNU General Publi...
  • Created almost 6 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Emacs timestamp and date-time library

ts.el

https://melpa.org/packages/ts-badge.svg https://stable.melpa.org/packages/ts-badge.svg

ts is a date and time library for Emacs. It aims to be more convenient than patterns like (string-to-number (format-time-string "%Y")) by providing easy accessors, like (ts-year (ts-now)).

To improve performance (significantly), formatted date parts are computed lazily rather than when a timestamp object is instantiated, and the computed parts are then cached for later access without recomputing. Behind the scenes, this avoids unnecessary (string-to-number (format-time-string... calls, which are surprisingly expensive.

Contents

Examples

Get parts of the current date:

;; When the current date is 2018-12-08 23:09:14 -0600:
(ts-year (ts-now))       ;=> 2018
(ts-month (ts-now))      ;=> 12
(ts-day (ts-now))        ;=> 8
(ts-hour (ts-now))       ;=> 23
(ts-minute (ts-now))     ;=> 9
(ts-second (ts-now))     ;=> 14
(ts-tz-offset (ts-now))  ;=> "-0600"

(ts-dow (ts-now))        ;=> 6
(ts-day-abbr (ts-now))   ;=> "Sat"
(ts-day-name (ts-now))   ;=> "Saturday"

(ts-month-abbr (ts-now)) ;=> "Dec"
(ts-month-name (ts-now)) ;=> "December"

(ts-tz-abbr (ts-now))    ;=> "CST"

Increment the current date:

;; By 10 years:
(list :now (ts-format)
      :future (ts-format (ts-adjust 'year 10 (ts-now))))
;;=> (   :now "2018-12-15 22:00:34 -0600"
;;    :future "2028-12-15 22:00:34 -0600")

;; By 10 years, 2 months, 3 days, 5 hours, and 4 seconds:
(list :now (ts-format)
      :future (ts-format
               (ts-adjust 'year 10 'month 2 'day 3
                          'hour 5 'second 4
                          (ts-now))))
;;=> (   :now "2018-12-15 22:02:31 -0600"
;;    :future "2029-02-19 03:02:35 -0600")

What day of the week was 2 days ago?

(ts-day-name (ts-dec 'day 2 (ts-now)))             ;=> "Thursday"

;; Or, with threading macros:
(thread-last (ts-now) (ts-dec 'day 2) ts-day-name) ;=> "Thursday"
(->> (ts-now) (ts-dec 'day 2) ts-day-name)         ;=> "Thursday"

Get timestamp for this time last week:

(ts-unix (ts-adjust 'day -7 (ts-now)))
;;=> 1543728398.0

;; To confirm that the difference really is 7 days:
(/ (- (ts-unix (ts-now))
      (ts-unix (ts-adjust 'day -7 (ts-now))))
   86400)
;;=> 7.000000567521762

;; Or human-friendly as a list:
(ts-human-duration
 (ts-difference (ts-now)
                (ts-dec 'day 7 (ts-now))))
;;=> (:years 0 :days 7 :hours 0 :minutes 0 :seconds 0)

;; Or as a string:
(ts-human-format-duration
 (ts-difference (ts-now)
                (ts-dec 'day 7 (ts-now))))
;;=> "7 days"

;; Or confirm by formatting:
(list :now (ts-format)
      :last-week (ts-format (ts-dec 'day 7 (ts-now))))
;;=> (      :now "2018-12-08 23:31:37 -0600" 
;;    :last-week "2018-12-01 23:31:37 -0600")

Some accessors have aliases similar to format-time-string constructors:

(ts-hour (ts-now))   ;=> 0
(ts-H (ts-now))      ;=> 0

(ts-minute (ts-now)) ;=> 56
(ts-min (ts-now))    ;=> 56
(ts-M (ts-now))      ;=> 56

(ts-second (ts-now)) ;=> 38
(ts-sec (ts-now))    ;=> 38
(ts-S (ts-now))      ;=> 38

(ts-year (ts-now))   ;=> 2018
(ts-Y (ts-now))      ;=> 2018

(ts-month (ts-now))  ;=> 12
(ts-m (ts-now))      ;=> 12

(ts-day (ts-now))    ;=> 9
(ts-d (ts-now))      ;=> 9

Parse a string into a timestamp object and reformat it:

(ts-format (ts-parse "sat dec 8 2018 12:12:12"))  ;=> "2018-12-08 12:12:12 -0600"

;; With a threading macro:
(->> "sat dec 8 2018 12:12:12"
     ts-parse
     ts-format)  ;;=> "2018-12-08 12:12:12 -0600"

Format the difference between two timestamps:

(ts-human-format-duration
 (ts-difference (ts-now)
                (ts-adjust 'day -400
                           'hour -2 'minute -1 'second -5
                           (ts-now))))
;; => "1 years, 35 days, 2 hours, 1 minutes, 5 seconds"

;; Abbreviated:
(ts-human-format-duration
 (ts-difference (ts-now)
                (ts-adjust 'day -400
                           'hour -2 'minute -1 'second -5
                           (ts-now)))
 'abbr)
;; => "1y35d2h1m5s"

Parse an Org timestamp element directly from org-element-context and find the difference between it and now:

(with-temp-buffer
  (org-mode)
  (save-excursion
    (insert "<2015-09-24 Thu .+1d>"))
  (ts-human-format-duration
   (ts-difference (ts-now)
                  (ts-parse-org-element (org-element-context)))))
;;=> "3 years, 308 days, 2 hours, 24 minutes, 21 seconds"

Parse an Org timestamp string (which has a repeater) and format the year and month:

;; Note the use of `format' rather than `concat', because `ts-year'
;; returns the year as a number rather than a string.

(let* ((ts (ts-parse-org "<2015-09-24 Thu .+1d>")))
  (format "%s, %s" (ts-month-name ts) (ts-year ts)))
;;=> "September, 2015"

;; Or, using dash.el:

(--> (ts-parse-org "<2015-09-24 Thu .+1d>")
     (format "%s, %s" (ts-month-name it) (ts-year it)))
;;=> "September, 2015"

;; Or, if you remember the format specifiers:

(ts-format "%B, %Y" (ts-parse-org "<2015-09-24 Thu .+1d>"))
;;=> "September, 2015"

How long ago was this date in 1970?

(let* ((now (ts-now))
       (then (ts-apply :year 1970 now)))
  (list (ts-format then)
        (ts-human-format-duration
         (ts-difference now then))))
;;=> ("1970-08-04 07:07:10 -0500"
;;    "49 years, 12 days")

How long ago did the epoch begin?

(ts-human-format-duration
 (ts-diff (ts-now) (make-ts :unix 0)))
;;=> "49 years, 227 days, 12 hours, 12 minutes, 30 seconds"

In which of the last 100 years was Christmas on a Saturday?

(let ((ts (ts-parse "2019-12-25"))
      (limit (- (ts-year (ts-now)) 100)))
  (cl-loop while (>= (ts-year ts) limit)
           when (string= "Saturday" (ts-day-name ts))
           collect (ts-year ts)
           do (ts-decf (ts-year ts))))
;;=> (2010 2004 1999 1993 1982 1976 1971 1965 1954 1948 1943 1937 1926 1920)

For a more interesting example, does a timestamp fall within the previous calendar week?

;; First, define a function to return the range of the previous calendar week.

(defun last-week-range ()
  "Return timestamps (BEG . END) spanning the previous calendar week."
  (let* (;; Bind `now' to the current timestamp to ensure all calculations
         ;; begin from the same timestamp.  (In the unlikely event that
         ;; the execution of this code spanned from one day into the next,
         ;; that would cause a wrong result.)
         (now (ts-now))
         ;; We start by calculating the offsets for the beginning and
         ;; ending timestamps using the current day of the week.  Note
         ;; that the `ts-dow' slot uses the "%w" format specifier, which
         ;; counts from Sunday to Saturday as a number from 0 to 6.
         (adjust-beg-day (- (+ 7 (ts-dow now))))
         (adjust-end-day (- (- 7 (- 6 (ts-dow now)))))
         ;; Make beginning/end timestamps based on `now', with adjusted
         ;; day and hour/minute/second values.  These functions return
         ;; new timestamps, so `now' is unchanged.
         (beg (thread-last now
                ;; `ts-adjust' makes relative adjustments to timestamps.
                (ts-adjust 'day adjust-beg-day)
                ;; `ts-apply' applies absolute values to timestamps.
                (ts-apply :hour 0 :minute 0 :second 0)))
         (end (thread-last now
                (ts-adjust 'day adjust-end-day)
                (ts-apply :hour 23 :minute 59 :second 59))))
    (cons beg end)))

(-let* (;; Bind the default format string for `ts-format', so the
        ;; results are easy to understand.
        (ts-default-format "%a, %Y-%m-%d %H:%M:%S %z")
        ;; Get the timestamp for 3 days before now.
        (check-ts (ts-adjust 'day -3 (ts-now)))
        ;; Get the range for the previous week from the function we defined.
        ((beg . end) (last-week-range)))
  (list :last-week-beg (ts-format beg)
        :check-ts      (ts-format check-ts)
        :last-week-end (ts-format end)
        :in-range-p    (ts-in beg end check-ts)))
;;=> (:last-week-beg "Sun, 2019-08-04 00:00:00 -0500"
;;    :check-ts      "Fri, 2019-08-09 10:00:34 -0500"
;;    :last-week-end "Sat, 2019-08-10 23:59:59 -0500"
;;    :in-range-p t)

Usage

Accessors

ts-B (STRUCT)
Access slot “month-name” of ts struct STRUCT.
ts-H (STRUCT)
Access slot “hour” of ts struct STRUCT.
ts-M (STRUCT)
Access slot “minute” of ts struct STRUCT.
ts-S (STRUCT)
Access slot “second” of ts struct STRUCT.
ts-Y (STRUCT)
Access slot “year” of ts struct STRUCT.
ts-b (STRUCT)
Access slot “month-abbr” of ts struct STRUCT.
ts-d (STRUCT)
Access slot “day” of ts struct STRUCT.
ts-day (STRUCT)
Access slot “day” of ts struct STRUCT.
ts-day-abbr (STRUCT)
Access slot “day-abbr” of ts struct STRUCT.
ts-day-name (STRUCT)
Access slot “day-name” of ts struct STRUCT.
ts-day-of-month-num (STRUCT)
Access slot “day” of ts struct STRUCT.
ts-day-of-week-abbr (STRUCT)
Access slot “day-abbr” of ts struct STRUCT.
ts-day-of-week-name (STRUCT)
Access slot “day-name” of ts struct STRUCT.
ts-day-of-week-num (STRUCT)
Access slot “dow” of ts struct STRUCT.
ts-day-of-year (STRUCT)
Access slot “doy” of ts struct STRUCT.
ts-dom (STRUCT)
Access slot “day” of ts struct STRUCT.
ts-dow (STRUCT)
Access slot “dow” of ts struct STRUCT.
ts-doy (STRUCT)
Access slot “doy” of ts struct STRUCT.
ts-hour (STRUCT)
Access slot “hour” of ts struct STRUCT.
ts-internal (STRUCT)
Access slot “internal” of ts struct STRUCT. Slot represents an Emacs-internal time value (e.g. as returned by current-time).
ts-m (STRUCT)
Access slot “month” of ts struct STRUCT.
ts-min (STRUCT)
Access slot “minute” of ts struct STRUCT.
ts-minute (STRUCT)
Access slot “minute” of ts struct STRUCT.
ts-month (STRUCT)
Access slot “month” of ts struct STRUCT.
ts-month-abbr (STRUCT)
Access slot “month-abbr” of ts struct STRUCT.
ts-month-name (STRUCT)
Access slot “month-name” of ts struct STRUCT.
ts-month-num (STRUCT)
Access slot “month” of ts struct STRUCT.
ts-moy (STRUCT)
Access slot “month” of ts struct STRUCT.
ts-sec (STRUCT)
Access slot “second” of ts struct STRUCT.
ts-second (STRUCT)
Access slot “second” of ts struct STRUCT.
ts-tz-abbr (STRUCT)
Access slot “tz-abbr” of ts struct STRUCT.
ts-tz-offset (STRUCT)
Access slot “tz-offset” of ts struct STRUCT.
ts-unix (STRUCT)
Access slot “unix” of ts struct STRUCT.
ts-week (STRUCT)
Access slot “woy” of ts struct STRUCT.
ts-week-of-year (STRUCT)
Access slot “woy” of ts struct STRUCT.
ts-woy (STRUCT)
Access slot “woy” of ts struct STRUCT.
ts-year (STRUCT)
Access slot “year” of ts struct STRUCT.

Adjustors

ts-apply (&rest SLOTS TS)
Return new timestamp based on TS with new slot values. Fill timestamp slots, overwrite given slot values, and return new timestamp with Unix timestamp value derived from new slot values. SLOTS is a list of alternating key-value pairs like that passed to make-ts.
ts-adjust (&rest ADJUSTMENTS)
Return new timestamp having applied ADJUSTMENTS to TS. ADJUSTMENTS should be a series of alternating SLOTS and VALUES by which to adjust them. For example, this form returns a new timestamp that is 47 hours into the future:

(ts-adjust ’hour -1 ’day +2 (ts-now))

Since the timestamp argument is last, it’s suitable for use in a threading macro.

ts-dec (SLOT VALUE TS)
Return a new timestamp based on TS with its SLOT decremented by VALUE. SLOT should be specified as a plain symbol, not a keyword.
ts-inc (SLOT VALUE TS)
Return a new timestamp based on TS with its SLOT incremented by VALUE. SLOT should be specified as a plain symbol, not a keyword.
ts-update (TS)
Return timestamp TS after updating its Unix timestamp from its other slots. Non-destructive. To be used after setting slots with, e.g. ts-fill.

Destructive

ts-adjustf (TS &rest ADJUSTMENTS)
Return timestamp TS having applied ADJUSTMENTS. This function is destructive, as it calls setf on TS.

ADJUSTMENTS should be a series of alternating SLOTS and VALUES by which to adjust them. For example, this form adjusts a timestamp to 47 hours into the future:

(let ((ts (ts-now))) (ts-adjustf ts ’hour -1 ’day +2))

ts-decf (PLACE &optional (VALUE 1))
Decrement timestamp PLACE by VALUE (default 1), update its Unix timestamp, and return the new value of PLACE.
ts-incf (PLACE &optional (VALUE 1))
Increment timestamp PLACE by VALUE (default 1), update its Unix timestamp, and return the new value of PLACE.

Comparators

ts-in (BEG END TS)
Return non-nil if TS is within range BEG to END, inclusive. All arguments should be ts structs.
ts< (A B)
Return non-nil if timestamp A is less than timestamp B.
ts<= (A B)
Return non-nil if timestamp A is <= timestamp B.
ts= (A B)
Return non-nil if timestamp A is the same as timestamp B. Compares only the timestamps’ unix slots. Note that a timestamp’s Unix slot is a float and may differ by less than one second, causing them to be unequal even if all of the formatted parts of the timestamp are the same.
ts> (A B)
Return non-nil if timestamp A is greater than timestamp B.
ts>= (A B)
Return non-nil if timestamp A is >= timestamp B.

Duration

ts-human-duration (SECONDS)
Return plist describing duration SECONDS in years, days, hours, minutes, and seconds. This is a simple calculation that does not account for leap years, leap seconds, etc.
ts-human-format-duration (SECONDS &optional ABBREVIATE)
Return human-formatted string describing duration SECONDS. If SECONDS is less than 1, returns ~”0 seconds”. If ~ABBREVIATE is non-nil, return a shorter version, without spaces. This is a simple calculation that does not account for leap years, leap seconds, etc.

Formatting

ts-format (&optional TS-OR-FORMAT-STRING TS)
Format timestamp with format-time-string. If TS-OR-FORMAT-STRING is a timestamp or nil, use the value of ts-default-format. If both TS-OR-FORMAT-STRING and TS are nil, use the current time.

Parsing

ts-parse (STRING)
Return new ts struct, parsing STRING with parse-time-string.
ts-parse-fill (FILL STRING)
Return new ts struct, parsing STRING with parse-time-string. Empty hour/minute/second values are filled according to FILL: if begin, with 0; if end, hour is filled with 23 and minute/second with 59; if nil, an error may be signaled when time values are empty. Note that when FILL is end, a time value like “12:12” is filled to “12:12:00”, not “12:12:59”.
ts-parse-org (ORG-TS-STRING)
Return timestamp object for Org timestamp string ORG-TS-STRING. Note that function org-parse-time-string is called, which should be loaded before calling this function.
ts-parse-org-fill (FILL ORG-TS-STRING)
Return timestamp object for Org timestamp string ORG-TS-STRING. Note that function org-parse-time-string is called, which should be loaded before calling this function. Hour/minute/second values are filled according to FILL: if begin, with 0; if end, hour is filled with 23 and minute/second with 59. Note that org-parse-time-string does not support timestamps that contain seconds.
ts-parse-org-element (ELEMENT)
Return timestamp object for Org timestamp element ELEMENT. Element should be like one parsed by org-element, the first element of which is timestamp. Assumes timestamp is not a range.

Misc.

copy-ts (TS)
Return copy of timestamp struct TS.
ts-difference (A B)
Return difference in seconds between timestamps A and B.
ts-diff
Alias for ts-difference.
ts-fill (TS &optional ZONE)
Return TS having filled all slots from its Unix timestamp. This is non-destructive. ZONE is passed to format-time-string, which see.
ts-now
Return ts struct set to now.
ts-p (STRUCT)
ts-reset (TS)
Return TS with all slots cleared except unix. Non-destructive. The same as:

(make-ts :unix (ts-unix ts))

ts-defstruct (&rest ARGS)
Like cl-defstruct, but with additional slot options.

Additional slot options and values:

:accessor-init: a sexp that initializes the slot in the accessor if the slot is nil. The symbol struct will be bound to the current struct. The accessor is defined after the struct is fully defined, so it may refer to the struct definition (e.g. by using the cl-struct pcase macro).

:aliases: A list of symbols which will be aliased to the slot accessor, prepended with the struct name (e.g. a struct ts with slot year and alias y would create an alias ts-y).

Tips

ts-human-format-duration vs. format-seconds

Emacs has a built-in function, format-seconds, that produces output similar to that of ts-human-format-duration. Its output is also controllable with a format string. However, if the output of ts-human-format-duration is sufficient, it performs much better than format-seconds. This simple benchmark, run 100,000 times, shows that it runs much faster and generates less garbage:

(bench-multi-lexical :times 100000
  :forms (("ts-human-format-duration" (ts-human-format-duration 15780.910933971405 t))
          ("format-seconds" (format-seconds "%yy%dd%hh%mm%ss%z" 15780.910933971405))))
Formx faster than nextTotal runtime# of GCsTotal GC runtime
ts-human-format-duration5.820.83294530.574929
format-secondsslowest4.848253173.288799

(See the Emacs Package Developer’s Handbook for the bench-multi-lexical macro.)

Changelog

0.3

Added

  • Function ts-fill accepts a ZONE argument, like that passed to format-time-string, which see.

0.2.1

Fixed

  • ts-human-format-duration returned an empty string for durations less than 1 second (now returns ~”0 seconds”~).

0.2

Added

  • Functions ts-parse-fill and ts-parse-org-fill.
  • Function ts-in.

Changed

  • Function ts-now is no longer inlined. This allows it to be changed at runtime with, e.g. cl-letf, which is helpful in testing.

Fixed

  • Save match data in ts-fill. (Function split-string, which is called in it, modifies the match data.)
  • Save match data in ts-parse-org. (Function org-parse-time-string, which is called in it, modifies the match data.)

Documentation

  • Improve description and commentary.

0.1

First tagged release. Published to MELPA.

License

GPLv3

More Repositories

1

org-super-agenda

Supercharge your Org daily/weekly agenda by grouping items
Emacs Lisp
1,182
star
2

org-ql

An Org-mode query language, including search commands and saved views
Emacs Lisp
1,159
star
3

emacs-package-dev-handbook

An Emacs package development handbook. Built with Emacs, by Emacs package developers, for Emacs package developers.
JavaScript
987
star
4

magit-todos

Show source files' TODOs (and FIXMEs, etc) in Magit status buffer
Emacs Lisp
601
star
5

org-web-tools

View, capture, and archive Web pages in Org-mode
Emacs Lisp
519
star
6

org-sidebar

A helpful sidebar for Org mode
Shell
492
star
7

org-rifle

Rifle through your Org-mode buffers and acquire your target
Emacs Lisp
488
star
8

org-protocol-capture-html

Capture HTML from the browser selection into Emacs as org-mode content
Emacs Lisp
442
star
9

bufler.el

A butler for your buffers. Group buffers into workspaces with programmable rules, and easily switch to and manipulate them.
Emacs Lisp
378
star
10

ement.el

Matrix client for Emacs
Emacs Lisp
354
star
11

unpackaged.el

A collection of useful Emacs Lisp code that isn't substantial enough to be packaged
Emacs Lisp
345
star
12

solarized-everything-css

A collection of Solarized user-stylesheets for...everything?
CSS
277
star
13

burly.el

Save and restore frames and windows with their buffers in Emacs
Emacs Lisp
252
star
14

matrix-client.el

A Matrix client for Emacs! (deprecated in favor of Ement.el)
Emacs Lisp
242
star
15

prism.el

Disperse Lisp forms (and other languages) into a spectrum of colors by depth
Emacs Lisp
228
star
16

org-graph-view

View Org buffers as a clickable, graphical mind-map
Emacs Lisp
190
star
17

pocket-reader.el

Emacs client for Pocket reading list (getpocket.com)
Emacs Lisp
188
star
18

yequake

Drop-down Emacs frames, like Yakuake
Emacs Lisp
175
star
19

dogears.el

Never lose your place in Emacs again
Emacs Lisp
154
star
20

with-emacs.sh

Script to easily run Emacs with specified configurations
Shell
142
star
21

makem.sh

Makefile-like script for building and testing Emacs Lisp packages
Shell
128
star
22

plz.el

An HTTP library for Emacs
Emacs Lisp
126
star
23

bucket

A bucket for your shell (like a set of registers, or a clipboard manager)
Shell
118
star
24

restic-runner

Configure and run Restic more easily
Shell
108
star
25

hammy.el

Programmable, interactive interval timers (e.g. for working/resting)
Emacs Lisp
103
star
26

org-sticky-header

Show off-screen Org heading at top of window
Emacs Lisp
103
star
27

alpha-org

A powerful Org configuration
Emacs Lisp
100
star
28

org-make-toc

Automatic tables of contents for Org files
Shell
83
star
29

taxy.el

Programmable taxonomical hierarchies for arbitrary objects
Emacs Lisp
82
star
30

transclusion-in-emacs

Resources about implementing transclusion in Emacs
79
star
31

topsy.el

Simple sticky header showing definition beyond top of window
Emacs Lisp
77
star
32

org-bookmark-heading

Emacs bookmark support for Org-mode
Emacs Lisp
75
star
33

snow.el

Let it snow in Emacs!
Emacs Lisp
72
star
34

org-now

Conveniently show current Org tasks in a sidebar window
Emacs Lisp
50
star
35

bashcaster

An actually simple screen recorder for Linux
Shell
48
star
36

org-recent-headings

Go to recently used Org headings
Shell
47
star
37

obvious.el

Who needs comments when the code is so obvious
Emacs Lisp
46
star
38

frame-purpose.el

Purpose-specific frames for Emacs
Emacs Lisp
46
star
39

org-almanac

Almanac for Org mode
43
star
40

mosey.el

Mosey around inside your Emacs buffer
Emacs Lisp
37
star
41

org-html-theme-darksun

A Solarized Dark version of the Bigblow Org HTML export theme
JavaScript
36
star
42

salv.el

Local minor mode to save a buffer when Emacs is idle
Emacs Lisp
33
star
43

sword-to-org

Convert Sword modules to Org-mode outlines
Emacs Lisp
33
star
44

org-auto-expand

Automatically expand certain Org headings
Shell
28
star
45

mangle

Mangle man pages to show just the parts you need (suitable for aliasing to "man")
Shell
26
star
46

magit.sh

Run Magit in a separate Emacs instance
Shell
26
star
47

org-notely

Pop to new Org headings for quick notetaking
Shell
26
star
48

scrollkeeper.el

Configurable scrolling commands with visual guidelines, for Emacs
Emacs Lisp
22
star
49

ap.el

A simple, Emacs Lisp-focused Emacs config
Emacs Lisp
21
star
50

highlight-function-calls

Highlight function/macro calls in Emacs
Emacs Lisp
21
star
51

org-quick-peek

Quick inline peeks at agenda items and linked nodes in Org-mode
Emacs Lisp
21
star
52

defrepeater.el

Easily define repeatable Emacs commands
Emacs Lisp
20
star
53

pocket-lib.el

Emacs library for the getpocket.com API
Emacs Lisp
19
star
54

org-pocket

Tools to use Pocket with Org-mode
Emacs Lisp
16
star
55

elexandria

Alexandria-like library for Emacs Lisp
Emacs Lisp
13
star
56

sword-converter

Convert SWORD modules to JSON and SQLite and search the converted files
Emacs Lisp
13
star
57

frecency.el

Library to sort items by "frecency" in Emacs
Emacs Lisp
11
star
58

chromatext.el

Apply color gradients to lines of text in Emacs (possibly increasing legibility)
Emacs Lisp
9
star
59

plamix

Mix together M3U playlists, optionally with a desired duration, outputting either a list of files to STDOUT, or writing an M3U playlist to a file
Python
9
star
60

pyza

A command-line/terminal/console Songza player, using VLC or MPD to play audio
Python
8
star
61

melpa-stats

Stats tools for MELPA
Emacs Lisp
6
star
62

org-books

Tools for books in Org-mode
Emacs Lisp
5
star
63

rubbish.py

WIP: A CLI to the XDG trash bin in Python
Python
5
star
64

tp.el

Emacs text-property convenience library
Emacs Lisp
5
star
65

org-search-goto

org-search-goto
Emacs Lisp
5
star
66

buffer-groups.el

A lightweight, automatic grouping rule-based buffer grouper and switcher
Emacs Lisp
5
star
67

ibuffer-auto-groups

Automatically make groups for ibuffer
Emacs Lisp
5
star
68

ampd-tools

A small collection of MPD-related tools
Python
4
star
69

reddit-emacs-css

CSS for /r/emacs
CSS
4
star
70

ox-elisp

Export Org buffers to Emacs Lisp comments
Emacs Lisp
3
star
71

dbg.el

Simple debugging macros
Emacs Lisp
3
star
72

tabtint

Firefox extension which tints Firefox tabs to match color of web page
JavaScript
3
star
73

ya-solarized.el

Yet Another Solarized theme for Emacs
Emacs Lisp
2
star
74

overwatch-formula76

A racing custom game type for Overwatch
C
2
star
75

overwatch-custom-games

A collection of custom games for Overwatch
Emacs Lisp
2
star
76

listen.el

Audio/music player for Emacs
Emacs Lisp
2
star
77

unsplash.hy

Hy
1
star
78

helm-swish

Like helm-swoop, but a little bit faster
Emacs Lisp
1
star
79

greek-hebrew-emacs

How to set up Emacs to easily type Greek and Hebrew
1
star
80

source-status-linker

Turns output of Source engine's status command into links to Steam user profiles
Python
1
star
81

pentadactyl-tabmattach

JavaScript
1
star
82

github-solarized

A Solarized user stylesheet for GitHub made with Stylus
CSS
1
star