检查当前行是否为“空”(忽略空格)的最简单方法?


14

我只想检查当前行是否为空(如果它仅包含空格,那么我仍然认为它为空)。

这是我的初始版本:

(defun strip-text-properties(txt)
  (set-text-properties 0 (length txt) nil txt)
  txt)

(defun is-current-line-empty ()
  (interactive)
  (setq c-line (thing-at-point 'line))
  (string-match "^\s*$" (strip-text-properties c-line)))

检查当前行是否为空的最简单方法是什么?


3
在Lisp字符串中,写作\s等同于Writing s。也许你是说"^\\s*$"
YoungFrog

3
作为一般性评论,elisp的会更有意义,一旦你对行动等方面开始思考缓冲区,而不是(如人们往往在其他语言做)做的事情。隔离和提取字符串以执行某些测试很可能(a)效率低下,并且(b)大大减少了您可以使用的工具数量。Elisp 确实擅长直接在缓冲区的内容上执行操作。
phils 2015年

1
@YoungFrog,也应该\\s-代替\\s。在elisp regexp中需要连字符。
Kaushal Modi

Answers:


24

这样的事情会更“容易”吗?

(defun current-line-empty-p ()
  (save-excursion
    (beginning-of-line)
    (looking-at "[[:space:]]*$")))

12

一个简单的方法,接近您所拥有的:

(defun current-line-empty-p ()
  (string-match-p "\\`\\s-*$" (thing-at-point 'line)))

我喜欢此解决方案,因为它不会修改match-data
nispio '16

1
您需要拥有\\s-而不是\s。您是否尝试过该解决方案?
Kaushal Modi

奇怪的是,我确实使用了很多。但是我只是在记忆中写下了这一点。你是对的。
PythonNut

1
还缺少连字符吗?:)
Kaushal Modi

还很早,我还没有完全醒来。
PythonNut

4
(defun blank-line-p (&optional pos)
  "Returns `t' if line (optionally, line at POS) is empty or
composed only of whitespace."
  (save-excursion
    (goto-char (or pos (point)))
    (beginning-of-line)
    (= (point-at-eol)
       (progn (skip-syntax-forward " ") (point)))))

1

我建议:

(defun blank-line-p ()
  (and (progn (skip-chars-backward " ") (bolp))
       (progn (skip-chars-forward " ") (eolp))))

(请注意,progn实际上s是不必要的,因为skip函数从不返回nil)。正如Dan在回答中所做的那样,skip-syntax-*也可以使用它代替。


3
这不会将仅包含选项卡的行标识为空白。skip-syntax-*是在此处使用的正确功能集。
吉尔(Gilles)“所以,别再邪恶了”

1

这是从comment-dwim-2包装中取出的另一个简单解决方案

(defun is-empty-line-p ()
  (string-match "^[[:blank:]]*$"
        (buffer-substring (line-beginning-position)
                          (line-end-position))))

1

这是PythonNut回答的对我不起作用的修改(为什么?):

(defun current-line-blank ()
  (= 0 (string-match-p "^\\s-*$" (thing-at-point 'line))))

string-match-p当前行不为空时,返回下一行的索引。因此,我检查了返回值是否为0。


下一行的索引?你到底是什么意思 (并欢迎使用emacs.SE!)
JeanPierre

@JeanPierre在行末(thing-at-point 'line)包含换行符。如果当前行不为空,则regexp在该换行符处匹配。唯一一次string-match-p返回nil的地方是缓冲区的最后一行(而Dario,如果缓冲区的结尾不是换行符,则您的版本将无法在最后一行工作)。
吉尔(Gilles)“所以,别再邪恶了”,

更好的解决方法是匹配字符串的开头,而不是匹配字符串中任何行的开头。我已经编辑了PythonNut的答案。
吉尔斯(Gillles)“所以-别再作恶了”(

0

current-indentation 为您提供前导空白后面的列,可以将其与行尾的列进行比较:

(defun blank-line-p ()
  (= (current-indentation)
     (- (line-end-position) (line-beginning-position))))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.