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


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эквивалентна записи s. Возможно, вы имели в виду "^\\s*$".
YoungFrog

3
В качестве общего комментария, elisp будет иметь больше смысла, как только вы начнете думать с точки зрения действий с буферами , в отличие от (как это обычно бывает в других языках), выполняющих операции со строками . Выделение и извлечение строки для выполнения какого-либо теста может (а) быть неэффективным и (б) резко сократить количество инструментов в вашем распоряжении. Elisp действительно хорош в работе с содержимым буферов.
Филс

1
@YoungFrog, так и должно быть \\s-вместо \\s. Этот дефис требуется в регулярном выражении elisp.
Каушал Моди

Ответы:



12

Простой метод, близкий к тому, что у вас есть:

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

Мне нравится это решение, потому что оно не модифицируется 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-*также может быть использован вместо.


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

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 (thing-at-point 'line)включает перевод строки в конце строки. Если текущая строка не пуста, регулярное выражение совпадает с этой новой строкой. Единственное время, когда string-match-pздесь возвращается ноль, - это последняя строка буфера (и Дарио, ваша версия не работает на последней строке, если буфер не заканчивается новой строкой).
Жиль "ТАК - прекрати быть злым"

Лучшим решением было бы сопоставить начало строки, а не начало любой строки в строке. Я отредактировал ответ PythonNut.
Жиль "ТАК - перестать быть злым"

0

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

(defun blank-line-p ()
  (= (current-indentation)
     (- (line-end-position) (line-beginning-position))))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.