39

I would like to write an if statement that will do something base on whether a string is empty. For example:

(defun prepend-dot-if-not-empty (user-str)
   (interactive "s")
   (if (is-empty user-str)
     (setq user-str (concat "." user-str)))
   (message user-str))

In this contrived example, I'm using (is-empty) in place of the real elisp method. What is the right way of doing this?

Thanks

Luke Girvin
  • 13,221
  • 9
  • 64
  • 84
oneself
  • 38,641
  • 34
  • 96
  • 120

5 Answers5

55

Since in elisp, a String is an int array, you can use

(= (length user-str) 0)

You can also use (string=) which is usually easier to read

(string= "" user-str)

Equal works as well, but a bit slower:

(equal "" user-str)
mihi
  • 6,507
  • 1
  • 38
  • 48
  • 1
    Are you *sure* `equal` is slower? Last time I looked at this (many years ago), it was somewhere between "identicall" and "a bit faster". – Stefan Oct 19 '18 at 01:19
9

Starting in emacs 24.4, there are two different functions available for you to call, depending on what you mean by 'empty'.

(string-empty-p " ")
nil

(string-blank-p " ")
0

I'm having trouble finding docs to link to, but emacsredux.com has more information.

If you get the error Symbol's function definition is void., include (require 'subr-x) in the initialization file (it's a package for trimming and string manipulation).

miguelmorin
  • 5,025
  • 4
  • 29
  • 64
Gina White
  • 200
  • 3
  • 5
7

If you work with strings heavily in your code, i strongly recommend using Magnar Sveen's s.el string manipulation library.

s-blank? checks if the string is empty:

(s-blank? "") ; => t
Mirzhan Irkegulov
  • 17,660
  • 12
  • 105
  • 166
6

I keep this one in my utils.lisp:

(defun empty-string-p (string)
  "Return true if the STRING is empty or nil. Expects string type."
  (or (null string)
      (zerop (length (string-trim string)))))

then I do:

(not (empty-string-p some-string))
Joe
  • 965
  • 11
  • 16
3

I'm not sure what the canonical way of testing this is, but you could use the length function and check to see if your string's length is greater than zero:

(length "abc")  
=> 3
(length "")  
=> 0

The EmacsWiki elisp cookbook has an example of a trim function if you want to remove whitespace before testing.

Brighid McDonnell
  • 4,293
  • 4
  • 36
  • 61
zimbu668
  • 1,295
  • 10
  • 12