• Stars
    star
    1,024
  • Rank 43,374 (Top 0.9 %)
  • Language
    Emacs Lisp
  • License
    GNU General Publi...
  • Created over 11 years ago
  • Updated about 1 year ago

Reviews

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

Repository Details

The long lost Emacs string manipulation library.

s.el s.el testing Coverage Status

The long lost Emacs string manipulation library.

Installation

It's available on Melpa:

M-x package-install s

Or you can just dump s.el in your load path somewhere.

Functions

Tweak whitespace

To shorter string

To longer string

To and from lists

Predicates

The misc bucket

Pertaining to words

Documentation and examples

s-trim (s)

Remove whitespace at the beginning and end of s.

(s-trim "trim ") ;; => "trim"
(s-trim " this") ;; => "this"
(s-trim " only  trims beg and end  ") ;; => "only  trims beg and end"

s-trim-left (s)

Remove whitespace at the beginning of s.

(s-trim-left "trim ") ;; => "trim "
(s-trim-left " this") ;; => "this"

s-trim-right (s)

Remove whitespace at the end of s.

(s-trim-right "trim ") ;; => "trim"
(s-trim-right " this") ;; => " this"

s-chomp (s)

Remove one trailing \n, \r or \r\n from s.

(s-chomp "no newlines\n") ;; => "no newlines"
(s-chomp "no newlines\r\n") ;; => "no newlines"
(s-chomp "some newlines\n\n") ;; => "some newlines\n"

s-collapse-whitespace (s)

Convert all adjacent whitespace characters to a single space.

(s-collapse-whitespace "only   one space   please") ;; => "only one space please"
(s-collapse-whitespace "collapse \n all \t sorts of \r whitespace") ;; => "collapse all sorts of whitespace"

s-word-wrap (len s)

If s is longer than len, wrap the words with newlines.

(s-word-wrap 10 "This is too long") ;; => "This is\ntoo long"
(s-word-wrap 10 "This is way way too long") ;; => "This is\nway way\ntoo long"
(s-word-wrap 10 "It-wraps-words-but-does-not-break-them") ;; => "It-wraps-words-but-does-not-break-them"

s-center (len s)

If s is shorter than len, pad it with spaces so it is centered.

(s-center 5 "a") ;; => "  a  "
(s-center 5 "ab") ;; => "  ab "
(s-center 1 "abc") ;; => "abc"

s-pad-left (len padding s)

If s is shorter than len, pad it with padding on the left.

(s-pad-left 3 "0" "3") ;; => "003"
(s-pad-left 3 "0" "23") ;; => "023"
(s-pad-left 3 "0" "1234") ;; => "1234"

s-pad-right (len padding s)

If s is shorter than len, pad it with padding on the right.

(s-pad-right 3 "." "3") ;; => "3.."
(s-pad-right 3 "." "23") ;; => "23."
(s-pad-right 3 "." "1234") ;; => "1234"

s-truncate (len s)

If s is longer than len, cut it down to len - 3 and add ... at the end.

(s-truncate 6 "This is too long") ;; => "Thi..."
(s-truncate 16 "This is also too long") ;; => "This is also ..."
(s-truncate 16 "But this is not!") ;; => "But this is not!"

s-left (len s)

Returns up to the len first chars of s.

(s-left 3 "lib/file.js") ;; => "lib"
(s-left 3 "li") ;; => "li"

s-right (len s)

Returns up to the len last chars of s.

(s-right 3 "lib/file.js") ;; => ".js"
(s-right 3 "li") ;; => "li"

s-chop-left (len s)

Remove the first len chars from s.

(s-chop-left 3 "lib/file.js") ;; => "/file.js"
(s-chop-left 3 "li") ;; => ""

s-chop-right (len s)

Remove the last len chars from s.

(s-chop-right 3 "lib/file.js") ;; => "lib/file"
(s-chop-right 3 "li") ;; => ""

s-chop-suffix (suffix s)

Remove suffix if it is at end of s.

(s-chop-suffix "-test.js" "penguin-test.js") ;; => "penguin"
(s-chop-suffix "\n" "no newlines\n") ;; => "no newlines"
(s-chop-suffix "\n" "some newlines\n\n") ;; => "some newlines\n"

s-chop-suffixes (suffixes s)

Remove suffixes one by one in order, if they are at the end of s.

(s-chop-suffixes '("_test.js" "-test.js" "Test.js") "penguin-test.js") ;; => "penguin"
(s-chop-suffixes '("\r" "\n") "penguin\r\n") ;; => "penguin\r"
(s-chop-suffixes '("\n" "\r") "penguin\r\n") ;; => "penguin"

s-chop-prefix (prefix s)

Remove prefix if it is at the start of s.

(s-chop-prefix "/tmp" "/tmp/file.js") ;; => "/file.js"
(s-chop-prefix "/tmp" "/tmp/tmp/file.js") ;; => "/tmp/file.js"

s-chop-prefixes (prefixes s)

Remove prefixes one by one in order, if they are at the start of s.

(s-chop-prefixes '("/tmp" "/my") "/tmp/my/file.js") ;; => "/file.js"
(s-chop-prefixes '("/my" "/tmp") "/tmp/my/file.js") ;; => "/my/file.js"

s-shared-start (s1 s2)

Returns the longest prefix s1 and s2 have in common.

(s-shared-start "bar" "baz") ;; => "ba"
(s-shared-start "foobar" "foo") ;; => "foo"
(s-shared-start "bar" "foo") ;; => ""

s-shared-end (s1 s2)

Returns the longest suffix s1 and s2 have in common.

(s-shared-end "bar" "var") ;; => "ar"
(s-shared-end "foo" "foo") ;; => "foo"
(s-shared-end "bar" "foo") ;; => ""

s-repeat (num s)

Make a string of s repeated num times.

(s-repeat 10 " ") ;; => "          "
(s-concat (s-repeat 8 "Na") " Batman!") ;; => "NaNaNaNaNaNaNaNa Batman!"

s-concat (&rest strings)

Join all the string arguments into one string.

(s-concat "abc" "def" "ghi") ;; => "abcdefghi"

s-prepend (prefix s)

Concatenate prefix and s.

(s-prepend "abc" "def") ;; => "abcdef"

s-append (suffix s)

Concatenate s and suffix.

(s-append "abc" "def") ;; => "defabc"

s-splice (needle n s)

Splice needle into s at position n. 0 is the beginning of the string, -1 is the end.

(s-splice "abc" 0 "def") ;; => "abcdef"
(s-splice "abc" -1 "def") ;; => "defabc"
(s-splice "needle" 2 "A  in a haystack.") ;; => "A needle in a haystack."

s-lines (s)

Splits s into a list of strings on newline characters.

(s-lines "abc\ndef\nghi") ;; => '("abc" "def" "ghi")
(s-lines "abc\rdef\rghi") ;; => '("abc" "def" "ghi")
(s-lines "abc\r\ndef\r\nghi") ;; => '("abc" "def" "ghi")

s-match (regexp s &optional start)

When the given expression matches the string, this function returns a list of the whole matching string and a string for each matched subexpressions. If it did not match the returned value is an empty list (nil).

When start is non-nil the search will start at that index.

(s-match "^def" "abcdefg") ;; => nil
(s-match "^abc" "abcdefg") ;; => '("abc")
(s-match "^/.*/\\([a-z]+\\)\\.\\([a-z]+\\)" "/some/weird/file.html") ;; => '("/some/weird/file.html" "file" "html")

s-match-strings-all (regex string)

Return a list of matches for regex in string.

Each element itself is a list of matches, as per match-string. Multiple matches at the same position will be ignored after the first.

(s-match-strings-all "{\\([^}]+\\)}" "x is {x} and y is {y}") ;; => '(("{x}" "x") ("{y}" "y"))
(s-match-strings-all "ab." "abXabY") ;; => '(("abX") ("abY"))
(s-match-strings-all "\\<" "foo bar baz") ;; => '(("") ("") (""))

s-matched-positions-all (regexp string &optional subexp-depth)

Return a list of matched positions for regexp in string. subexp-depth is 0 by default.

(s-matched-positions-all "l+" "{{Hello}} World, {{Emacs}}!" 0) ;; => '((4 . 6) (13 . 14))
(s-matched-positions-all "{{\\(.+?\\)}}" "{{Hello}} World, {{Emacs}}!" 0) ;; => '((0 . 9) (17 . 26))
(s-matched-positions-all "{{\\(.+?\\)}}" "{{Hello}} World, {{Emacs}}!" 1) ;; => '((2 . 7) (19 . 24))

s-slice-at (regexp s)

Slices s up at every index matching regexp.

(s-slice-at "-" "abc") ;; => '("abc")
(s-slice-at "-" "abc-def") ;; => '("abc" "-def")
(s-slice-at "[.#]" "abc.def.ghi#id") ;; => '("abc" ".def" ".ghi" "#id")

s-split (separator s &optional omit-nulls)

Split s into substrings bounded by matches for regexp separator. If omit-nulls is non-nil, zero-length substrings are omitted.

This is a simple wrapper around the built-in split-string.

(s-split "|" "a|bc|12|3") ;; => '("a" "bc" "12" "3")
(s-split ":" "a,c,d") ;; => '("a,c,d")
(s-split "\n" "z\nefg\n") ;; => '("z" "efg" "")

s-split-up-to (separator s n &optional omit-nulls)

Split s up to n times into substrings bounded by matches for regexp separator.

If omit-nulls is non-nil, zero-length substrings are omitted.

See also s-split.

(s-split-up-to "\\s-*-\\s-*" "Author - Track-number-one" 1) ;; => '("Author" "Track-number-one")
(s-split-up-to "\\s-*-\\s-*" "Author - Track-number-one" 2) ;; => '("Author" "Track" "number-one")
(s-split-up-to "|" "foo||bar|baz|qux" 3 t) ;; => '("foo" "bar" "baz|qux")

s-join (separator strings)

Join all the strings in strings with separator in between.

(s-join "+" '("abc" "def" "ghi")) ;; => "abc+def+ghi"
(s-join "\n" '("abc" "def" "ghi")) ;; => "abc\ndef\nghi"

s-equals? (s1 s2)

Is s1 equal to s2?

This is a simple wrapper around the built-in string-equal.

(s-equals? "abc" "ABC") ;; => nil
(s-equals? "abc" "abc") ;; => t

s-less? (s1 s2)

Is s1 less than s2?

This is a simple wrapper around the built-in string-lessp.

(s-less? "abc" "abd") ;; => t
(s-less? "abd" "abc") ;; => nil
(s-less? "abc" "abc") ;; => nil

s-matches? (regexp s &optional start)

Does regexp match s? If start is non-nil the search starts at that index.

This is a simple wrapper around the built-in string-match-p.

(s-matches? "^[0-9]+$" "123") ;; => t
(s-matches? "^[0-9]+$" "a123") ;; => nil
(s-matches? "1" "1a" 1) ;; => nil

s-blank? (s)

Is s nil or the empty string?

(s-blank? "") ;; => t
(s-blank? nil) ;; => t
(s-blank? " ") ;; => nil

s-present? (s)

Is s anything but nil or the empty string?

(s-present? "") ;; => nil
(s-present? nil) ;; => nil
(s-present? " ") ;; => t

s-ends-with? (suffix s &optional ignore-case)

Does s end with suffix?

If ignore-case is non-nil, the comparison is done without paying attention to case differences.

Alias: s-suffix?

(s-ends-with? ".md" "readme.md") ;; => t
(s-ends-with? ".MD" "readme.md") ;; => nil
(s-ends-with? ".MD" "readme.md" t) ;; => t

s-starts-with? (prefix s &optional ignore-case)

Does s start with prefix?

If ignore-case is non-nil, the comparison is done without paying attention to case differences.

Alias: s-prefix?. This is a simple wrapper around the built-in string-prefix-p.

(s-starts-with? "lib/" "lib/file.js") ;; => t
(s-starts-with? "LIB/" "lib/file.js") ;; => nil
(s-starts-with? "LIB/" "lib/file.js" t) ;; => t

s-contains? (needle s &optional ignore-case)

Does s contain needle?

If ignore-case is non-nil, the comparison is done without paying attention to case differences.

(s-contains? "file" "lib/file.js") ;; => t
(s-contains? "nope" "lib/file.js") ;; => nil
(s-contains? "^a" "it's not ^a regexp") ;; => t

s-lowercase? (s)

Are all the letters in s in lower case?

(s-lowercase? "file") ;; => t
(s-lowercase? "File") ;; => nil
(s-lowercase? "filä") ;; => t

s-uppercase? (s)

Are all the letters in s in upper case?

(s-uppercase? "HULK SMASH") ;; => t
(s-uppercase? "Bruce no smash") ;; => nil
(s-uppercase? "FöB") ;; => nil

s-mixedcase? (s)

Are there both lower case and upper case letters in s?

(s-mixedcase? "HULK SMASH") ;; => nil
(s-mixedcase? "Bruce no smash") ;; => t
(s-mixedcase? "BRÃœCE") ;; => nil

s-capitalized? (s)

In s, is the first letter upper case, and all other letters lower case?

(s-capitalized? "Capitalized") ;; => t
(s-capitalized? "I am capitalized") ;; => t
(s-capitalized? "I Am Titleized") ;; => nil

s-numeric? (s)

Is s a number?

(s-numeric? "123") ;; => t
(s-numeric? "onetwothree") ;; => nil
(s-numeric? "7a") ;; => nil

s-replace (old new s)

Replaces old with new in s.

(s-replace "file" "nope" "lib/file.js") ;; => "lib/nope.js"
(s-replace "^a" "\\1" "it's not ^a regexp") ;; => "it's not \\1 regexp"

s-replace-all (replacements s)

replacements is a list of cons-cells. Each car is replaced with cdr in s.

(s-replace-all '(("lib" . "test") ("file" . "file_test")) "lib/file.js") ;; => "test/file_test.js"
(s-replace-all '(("lib" . "test") ("test" . "lib")) "lib/test.js") ;; => "test/lib.js"

s-downcase (s)

Convert s to lower case.

This is a simple wrapper around the built-in downcase.

(s-downcase "ABC") ;; => "abc"

s-upcase (s)

Convert s to upper case.

This is a simple wrapper around the built-in upcase.

(s-upcase "abc") ;; => "ABC"

s-capitalize (s)

Convert the first word's first character to upper case and the rest to lower case in s.

(s-capitalize "abc DEF") ;; => "Abc def"
(s-capitalize "abc.DEF") ;; => "Abc.def"

s-titleize (s)

Convert each word's first character to upper case and the rest to lower case in s.

This is a simple wrapper around the built-in capitalize.

(s-titleize "abc DEF") ;; => "Abc Def"
(s-titleize "abc.DEF") ;; => "Abc.Def"

s-with (s form &rest more)

Threads s through the forms. Inserts s as the last item in the first form, making a list of it if it is not a list already. If there are more forms, inserts the first form as the last item in second form, etc.

(s-with "   hulk smash   " s-trim s-upcase) ;; => "HULK SMASH"
(s-with "My car is a Toyota" (s-replace "car" "name") (s-replace "a Toyota" "Bond") (s-append ", James Bond")) ;; => "My name is Bond, James Bond"
(s-with "abc \ndef  \nghi" s-lines (mapcar 's-trim) (s-join "-") s-reverse) ;; => "ihg-fed-cba"

s-index-of (needle s &optional ignore-case)

Returns first index of needle in s, or nil.

If ignore-case is non-nil, the comparison is done without paying attention to case differences.

(s-index-of "abc" "abcdef") ;; => 0
(s-index-of "CDE" "abcdef" t) ;; => 2
(s-index-of "n.t" "not a regexp") ;; => nil

s-reverse (s)

Return the reverse of s.

(s-reverse "abc") ;; => "cba"
(s-reverse "ab xyz") ;; => "zyx ba"
(s-reverse "") ;; => ""

s-presence (s)

Return s if it's s-present?, otherwise return nil.

(s-presence nil) ;; => nil
(s-presence "") ;; => nil
(s-presence "foo") ;; => "foo"

s-format (template replacer &optional extra)

Format template with the function replacer.

replacer takes an argument of the format variable and optionally an extra argument which is the extra value from the call to s-format.

Several standard s-format helper functions are recognized and adapted for this:

(s-format "${name}" 'gethash hash-table)
(s-format "${name}" 'aget alist)
(s-format "$0" 'elt sequence)

The replacer function may be used to do any other kind of transformation.

(s-format "help ${name}! I'm ${malady}" 'aget '(("name" . "nic") ("malady" . "on fire"))) ;; => "help nic! I'm on fire"
(s-format "hello ${name}, nice day" (lambda (var-name) "nic")) ;; => "hello nic, nice day"
(s-format "hello $0, nice $1" 'elt '("nic" "day")) ;; => "hello nic, nice day"

s-lex-format (format-str)

s-format with the current environment.

format-str may use the s-format variable reference to refer to any variable:

(let ((x 1)) (s-lex-format "x is: ${x}"))

The values of the variables are interpolated with "%s" unless the variable s-lex-value-as-lisp is t and then they are interpolated with "%S".

(let ((x 1)) (s-lex-format "x is ${x}")) ;; => "x is 1"
(let ((str1 "this") (str2 "that")) (s-lex-format "${str1} and ${str2}")) ;; => "this and that"
(let ((foo "Hello\\nWorld")) (s-lex-format "${foo}")) ;; => "Hello\\nWorld"

s-count-matches (regexp s &optional start end)

Count occurrences of regexp in `s'.

start, inclusive, and end, exclusive, delimit the part of s to match.

(s-count-matches "a" "aba") ;; => 2
(s-count-matches "a" "aba" 0 2) ;; => 1
(s-count-matches "\\w\\{2\\}[0-9]+" "ab1bab2frobinator") ;; => 2

s-wrap (s prefix &optional suffix)

Wrap string s with prefix and optionally suffix.

Return string s with prefix prepended. If suffix is present, it is appended, otherwise prefix is used as both prefix and suffix.

(s-wrap "foo" "\"") ;; => "\"foo\""
(s-wrap "foo" "(" ")") ;; => "(foo)"
(s-wrap "foo" "bar") ;; => "barfoobar"

s-split-words (s)

Split s into list of words.

(s-split-words "under_score") ;; => '("under" "score")
(s-split-words "some-dashed-words") ;; => '("some" "dashed" "words")
(s-split-words "evenCamelCase") ;; => '("even" "Camel" "Case")

s-lower-camel-case (s)

Convert s to lowerCamelCase.

(s-lower-camel-case "some words") ;; => "someWords"
(s-lower-camel-case "dashed-words") ;; => "dashedWords"
(s-lower-camel-case "under_scored_words") ;; => "underScoredWords"

s-upper-camel-case (s)

Convert s to UpperCamelCase.

(s-upper-camel-case "some words") ;; => "SomeWords"
(s-upper-camel-case "dashed-words") ;; => "DashedWords"
(s-upper-camel-case "under_scored_words") ;; => "UnderScoredWords"

s-snake-case (s)

Convert s to snake_case.

(s-snake-case "some words") ;; => "some_words"
(s-snake-case "dashed-words") ;; => "dashed_words"
(s-snake-case "camelCasedWords") ;; => "camel_cased_words"

s-dashed-words (s)

Convert s to dashed-words.

(s-dashed-words "some words") ;; => "some-words"
(s-dashed-words "under_scored_words") ;; => "under-scored-words"
(s-dashed-words "camelCasedWords") ;; => "camel-cased-words"

s-capitalized-words (s)

Convert s to Capitalized words.

(s-capitalized-words "some words") ;; => "Some words"
(s-capitalized-words "under_scored_words") ;; => "Under scored words"
(s-capitalized-words "camelCasedWords") ;; => "Camel cased words"

s-titleized-words (s)

Convert s to Titleized Words.

(s-titleized-words "some words") ;; => "Some Words"
(s-titleized-words "under_scored_words") ;; => "Under Scored Words"
(s-titleized-words "camelCasedWords") ;; => "Camel Cased Words"

s-word-initials (s)

Convert s to its initials.

(s-word-initials "some words") ;; => "sw"
(s-word-initials "under_scored_words") ;; => "usw"
(s-word-initials "camelCasedWords") ;; => "cCW"

s-blank-str? (s)

Is s nil or the empty string or string only contains whitespace?

(s-blank-str? "  \t \r   ") ;; => t
(s-blank-str? "    ") ;; => t
(s-blank-str? "\t\r") ;; => t

What's with the built-in wrappers?

Imagine looking through the function list and seeing s-ends-with?, but s-starts-with? is nowhere to be found. Why? Well, because Emacs already has string-prefix-p. Now you're starting out slightly confused, then have to go somewhere else to dig for the command you were looking for.

The wrapping functions serve as both documentation for existing functions and makes for a consistent API.

Other string related libraries

  • inflections package provides functions for strings pluralization and singularization.

  • levenshtein package provides a function to calculate the Levenshtein distance between two strings.

  • string-utils is another general string manipulation library.

Changelist

From 1.11.0 to 1.12.0

  • Alias all functions ending in ? (Tianxiang Xiong)
  • Add s-blank-str? (Aborn Jiang)
  • Several bugfixes

From 1.10.0 to 1.11.0

  • Add s-matched-positions-all (ono hiroko)

From 1.9.0 to 1.10.0

  • Add s-wrap (Johan Andersson)
  • Add s-split-up-to (Matus Goljer)
  • Fix s-reverse for Unicode combining characters. (Christopher Wellons)

From 1.8.0 to 1.9.0

  • Add s-count-matches (Lars Andersen)

From 1.7.0 to 1.8.0

  • Add s-present? and s-present? (Johan Andersson)
  • Better handling of international characters

From 1.6.0 to 1.7.0

  • Add s-word-initials (Sylvain Rousseau)
  • Better handling of camel cased strings (@Bruce-Connor)

From 1.5.0 to 1.6.0

  • Add s-pad-left and s-pad-right
  • Bugfixes for s-format (Nic Ferrier)

From 1.4.0 to 1.5.0

  • Add s-all-match-strings (Geoff Gole)
  • Add s-lex-format (Nic Ferrier)

From 1.3.1 to 1.4.0

  • Add s-capitalized?
  • Add s-replace-all
  • Add s-slice-at
  • Add s-split alias for split-string (Rüdiger Sonderfeld)
  • Add s-less? predicate (Rüdiger Sonderfeld)
  • Add START parameter to s-matches? (Rüdiger Sonderfeld)
  • Bugfixes

From 1.3.0 to 1.3.1

  • Add s-numeric?
  • Add s-match (Arthur Andersen)
  • Add s-format (Nic Ferrier)
  • Move .el files out of root to avoid problems with require.

From 1.2.1 to 1.3.0

  • Breaking change: s-capitalize now converts the first word's first character to upper case and the rest to lower case. s-titleize works like the old s-capitalize and capitalizes each word. (Johan Andersson)

  • s-capitalized-words and s-titleized-words mirror this change.

Contributors

Thanks!

Contribute

Yes, please do. Pure functions in the string manipulation realm only, please. There's a suite of tests in dev/examples.el, so remember to add tests for your function, or I might break it later.

You'll find the repo at:

https://github.com/magnars/s.el

Run the tests with

./run-tests.sh

Create the docs with

./create-docs.sh

I highly recommend that you install these as a pre-commit hook, so that the tests are always running and the docs are always in sync:

cp pre-commit.sh .git/hooks/pre-commit

Oh, and don't edit README.md directly, it is auto-generated. Change readme-template.md or examples-to-docs.el instead.

License

Copyright (C) 2012-2022 Magnar Sveen

Authors: Magnar Sveen [email protected] Maintainer: Jason Milkins [email protected] Keywords: strings

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

More Repositories

1

multiple-cursors.el

Multiple cursors for emacs.
Emacs Lisp
2,222
star
2

dash.el

A modern list library for Emacs
Emacs Lisp
1,636
star
3

expand-region.el

Emacs extension to increase selected region by semantic units.
Emacs Lisp
1,334
star
4

prone

Better exception reporting middleware for Ring.
Clojure
512
star
5

optimus

A Ring middleware for frontend performance optimization.
Clojure
364
star
6

stasis

Some Clojure functions for creating static websites.
Clojure
345
star
7

parens-of-the-dead

A series of zombie-themed games written with Clojure and ClojureScript.
Clojure
152
star
8

mark-multiple.el

An extension to emacs that sorta lets you mark several regions at once
Emacs Lisp
114
star
9

string-edit.el

Avoid escape nightmares by editing strings in a separate buffer
Emacs Lisp
100
star
10

tagedit

A collection of paredit-like functions for editing in html-mode.
Emacs Lisp
96
star
11

multifiles.el

Work in progress: View and edit parts of multiple files in one buffer
Emacs Lisp
74
star
12

fold-this.el

Fold the active region in Emacs
Emacs Lisp
71
star
13

change-inner.el

Emacs version of vim's ci and co commands
Emacs Lisp
60
star
14

angular-snippets.el

Yasnippets for AngularJS
Emacs Lisp
45
star
15

autolint

Autolint watches your files for jslint-errors
JavaScript
43
star
16

kaocha-runner.el

An emacs package for running Kaocha tests via CIDER.
Emacs Lisp
32
star
17

smart-forward.el

semantic navigation based on expand-region.el
Emacs Lisp
31
star
18

hardcore-mode.el

Disable arrow keys + optionally backspace and return
Emacs Lisp
28
star
19

java-time-literals

A Clojure library that defines literals for java.time classes.
Clojure
27
star
20

confair

Confair is a configuration library for Clojure.
Clojure
26
star
21

parens-of-the-dead-s2

The code for Parens of the Dead season 2
Clojure
21
star
22

yesql-ghosts

Display ghostly yesql defqueries inline, in Emacs
Emacs Lisp
18
star
23

catenate

A deprecated Ring middleware to serve concatenated static files with cache buster URLs in production.
Clojure
16
star
24

emacsd-reboot

Reboot of .emacs.d
Emacs Lisp
16
star
25

emacsrocks.com

The emacsrocks.com site implemented in Clojure with Stasis and Optimus
Clojure
15
star
26

realize

Realizing clojure data structures, no more laziness
Clojure
15
star
27

test-with-files

A Clojure library to easily write tests with files.
Clojure
15
star
28

datomic-type-extensions

A Clojure library that wraps Datomic API functions to add type extensions.
Clojure
14
star
29

datoms-differ

Find the diff between two txes in datoms.
Clojure
14
star
30

datomic-snippets

Yasnippets for Datomic.
Emacs Lisp
14
star
31

mapdown

A lightweight markup format to turn strings into maps in Clojure.
Clojure
13
star
32

cljs-styles

Vendor prefixes for React inline styles with ClojureScript.
Clojure
13
star
33

html5-walker

Search and replace in HTML5 strings.
Clojure
12
star
34

zombie-clj

An zombie themed web game made with Clojure and ClojureScript
Clojure
12
star
35

what-the-emacsd

The code for http://whattheemacsd.com
HTML
11
star
36

www.parens-of-the-dead.com

The code that generates parens-of-the-dead.com
Clojure
11
star
37

kaocha-noyoda

Don't talk like yoda. This kaocha plugin lets you write `(is (= actual expected))`.
Clojure
11
star
38

Zombie-TDD

Bli med når jeg lager et nettspill fra scratch med javascript på både frontend og backend. Det blir zombier, mafia og testdrevet utvikling.
JavaScript
10
star
39

annoying-arrows-mode.el

Emacs gets annoyed when you navigate around your document one char at a time.
Emacs Lisp
10
star
40

helpful-loader

A Clojure library to load resources with helpful error messages.
Clojure
9
star
41

buster-mode

A minor mode for emacs to speed up development when writing tests with Buster.JS
Emacs Lisp
8
star
42

stubadub

A small stubbing library for Clojure and ClojureScript
Clojure
8
star
43

bang.el

Used to be a modern list library for Emacs (renamed to dash)
Emacs Lisp
8
star
44

optimus-angular

Angular.JS optimizations for Optimus
Clojure
8
star
45

buster.tmbundle

TextMate bundle for Buster.js
6
star
46

java-time-dte

Datomic type extensions for java.time classes
Clojure
6
star
47

optimus-img-transform

An Optimus image transformation middleware.
Clojure
6
star
48

simplezen.el

A simple subset of zencoding-mode for Emacs
Emacs Lisp
5
star
49

zombieclj-s02

Koden til ZombieCLJ Sesong 2
CSS
5
star
50

server-facade

Code and slides belonging to my JavaZone-talk about wrapping your ajax-calls to get cleaner code and nicer testing.
JavaScript
4
star
51

naive-xml-reader

A naive Clojure library that turns XML into maps.
Clojure
4
star
52

blockout

Recreating one of my first games for the web to learn Canvas.
JavaScript
4
star
53

norsk-extreme-startup

Oversatt til norsk og tilpassett FINN
Ruby
3
star
54

crappy-jsp-mode

Seriously, this is not a good jsp-mode, it just solves some of my problems
Emacs Lisp
3
star
55

optimus-jsx

A React JSX asset loader for Optimus.
JavaScript
3
star
56

optimus-less

A LESS asset loader for Optimus.
Clojure
3
star
57

zombieclj.no

Koden bak www.zombieclj.no
Clojure
2
star
58

zombieclj-s2

Koden for andre sesong av Zombie CLJ.
CSS
2
star
59

mytomatoes.clj

mytomatoes.com rescue operation
Clojure
2
star
60

creator.js

A tiny library for creating create-methods for your objects.
JavaScript
2
star
61

roll20-scripts

Scripts for roll20
JavaScript
2
star
62

buster-snippets.el

Yasnippets for the Buster test framework.
Emacs Lisp
2
star