我想写一个if语句来根据一个字符串是否为空来执行一些操作。例如:
(defun prepend-dot-if-not-empty (user-str)
(interactive "s")
(if (is-empty user-str)
(setq user-str (concat "." user-str)))
(message user-str))
在这个人为制造的例子中,我使用(is-empty)代替真正的elisp方法。 应该如何正确地做这件事呢?谢谢。
由于在elisp中,字符串是一个整数数组,因此您可以使用
(= (length user-str) 0)
你还可以使用(string=),这通常更容易阅读(string= "" user-str)
使用Equal也可以,但速度会慢一些:
(equal "" user-str)
equal
更慢吗?上次我看这个(很多年前),它的速度介于“完全相同”和“稍微快一点”之间。 - Stefan从Emacs 24.4 开始,有两个不同的函数可供调用,具体取决于您对“空”含义的理解。
(string-empty-p " ")
nil
(string-blank-p " ")
0
我在寻找可以链接的文档方面遇到了麻烦,但是emacsredux.com有更多信息。
如果你遇到了错误Symbol's function definition is void.
,请在初始化文件中包含(require 'subr-x)
(这是一个用于修剪和字符串操作的软件包)。
(require 'subr-x)
。这对我解决了问题。 - Cadence我把这个函数保存在我的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)))))
(not (empty-string-p some-string))
我不确定测试这个的规范方法是什么,但你可以使用length函数并检查你的字符串长度是否大于零:
(length "abc")
=> 3
(length "")
=> 0
(message "%s" (if (is-empty user-str) "." user-str))
。 - Stefan