A peek at Emacs 24.4: New string manipulation functions
Emacs has often been criticized for failing to provide a more extensive string manipulation API (compared to that of programming languages like Ruby and Perl, for instance). As many programs (extensions) running on top of it are doing quite a lot of string manipulation, having a good string API is important. To compensate the lack of certain primitives in Emacs itself a lot of package authors are using these days packages like s.el or simply adding the string functions they need directly to their packages (to reduce the number of third-party deps).
In Emacs 24.4 finally the situation is improving. Finally, we’re getting
string-suffix-p
, which was mysteriously missing even though string-prefix-p
has been part of Emacs for years:
(string-suffix-p "test" "my_test")
; => t
(string-suffix-p "tester" "my_test")
; => nil
More importantly, Emacs 24.4 ships with a new built-in library called subr-x
, which features
a bunch of other string manipulation functions:
string-blank-p
string-empty-p
string-join
string-reverse
string-trim-left
string-trim-right
string-trim
string-remove-prefix
string-remove-suffix
Here’s a brief demo of them in action:
;; all functions in the library are defined as inline, so you don't
;; need to require the library at runtime
(eval-when-compile (require 'subr-x))
(string-empty-p "")
; => t
(string-empty-p " ")
; => nil
(string-blank-p " ")
; => 0 (#o0, #x0, ?\C-@)
(string-reverse "Batman")
; => "namtaB"
(string-join '("one" "two" "three"))
; => "onetwothree"
(string-join '("one" "two" "three") ",")
; => "one,two,three"
(string-trim " Peter Parker ")
; => "Peter Parker"
(string-remove-prefix "Mr. " "Mr. Smith")
; => "Smith"
(string-remove-suffix "Smith" "Mr. Smith")
; => "Mr. "
Sure, subr-x
is not as extensive as s.el
(and will never be), but
I think that it’s a big step in the right direction. It’s likely that
subr-x
will be extended in subsequent Emacs versions and some of the
functions from it will be promoted to built-in
.
That’s all I have for now. Until next time!