Самый простой способ проверить, является ли текущая строка «пустой» (игнорируя пробелы)?

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)))

Какой самый простой способ проверить, пуста ли текущая строка?

ChillarAnand
источник
3
В строке LISP запись \sэквивалентна записи s. Возможно, вы имели в виду "^\\s*$".
YoungFrog
3
В качестве общего комментария, elisp будет иметь больше смысла, как только вы начнете думать с точки зрения действий с буферами , в отличие от (как это обычно бывает в других языках), выполняющих операции со строками . Выделение и извлечение строки для выполнения какого-либо теста может (а) быть неэффективным и (б) резко сократить количество инструментов в вашем распоряжении. Elisp действительно хорош в работе с содержимым буферов.
Филс
1
@YoungFrog, так и должно быть \\s-вместо \\s. Этот дефис требуется в регулярном выражении elisp.
Каушал Моди

Ответы:

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)))
PythonNut
источник
Мне нравится это решение, потому что оно не модифицируется match-data.
Ниспио
1
Вам нужно иметь \\s-вместо \s. Вы пробовали это решение?
Каушал Моди
Как ни странно, я использую это совсем немного. Но я просто списал это с памяти. Ты прав.
PythonNut
1
все еще отсутствует дефис? :)
Каушал Моди
Было рано, и я еще не полностью проснулся.
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))))

(Обратите внимание, что progns на самом деле не нужны, потому что функции пропуска никогда не возвращают ноль). Как Дэн в своем ответе, skip-syntax-*также может быть использован вместо.

YoungFrog
источник
3
Это не означает, что строка, содержащая только вкладки, является пустой. skip-syntax-*это правильный набор функций для использования здесь.
Жиль "ТАК - перестань быть злым"
1

Вот еще одно простое решение, взятое из comment-dwim-2упаковки

(defun is-empty-line-p ()
  (string-match "^[[:blank:]]*$"
        (buffer-substring (line-beginning-position)
                          (line-end-position))))
ChillarAnand
источник
1

Это изменение ответа PythonNut, которое у меня не сработало (почему?):

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

string-match-pвозвращал индекс следующей строки всякий раз, когда текущая строка не была пустой. Поэтому я проверил, что возвращаемое значение равно 0.

Dario
источник
Индекс следующей строки? Что ты конкретно имеешь ввиду? (и добро пожаловать на emacs.SE!)
ЖанПьер
@JeanPierre (thing-at-point 'line)включает перевод строки в конце строки. Если текущая строка не пуста, регулярное выражение совпадает с этой новой строкой. Единственное время, когда string-match-pздесь возвращается ноль, - это последняя строка буфера (и Дарио, ваша версия не работает на последней строке, если буфер не заканчивается новой строкой).
Жиль "ТАК - прекрати быть злым"
Лучшим решением было бы сопоставить начало строки, а не начало любой строки в строке. Я отредактировал ответ PythonNut.
Жиль "ТАК - перестать быть злым"
0

current-indentation дает столбец после первых пробелов, который можно сравнить со столбцом в конце строки:

(defun blank-line-p ()
  (= (current-indentation)
     (- (line-end-position) (line-beginning-position))))
npostavs
источник