Найпростіший спосіб перевірити, чи поточний рядок "порожній" (ігноруючи пробіл)?


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
У рядовій послідовності написання \sрівносильно письму s. Можливо, ви мали на увазі "^\\s*$".
YoungFrog

3
Як загальний коментар, elisp матиме більше сенсу, коли ви почнете думати з точки зору дій над буферами , на відміну від (як це робиться в інших мовах) робити речі з рядками . Ізоляція та вилучення струни для проведення певного тесту, ймовірно, (a) виявиться неефективною та (b) різко зменшить кількість інструментів у вашому розпорядженні. Elisp дуже добре робити речі безпосередньо на вмісті буферів.
філс

1
@YoungFrog, також це має бути \\s-замість \\s. Цей дефіс необхідний у elisp regexp.
Каушал Моді

Відповіді:



12

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

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

Мені подобається це рішення, оскільки воно не змінюється match-data.
nispio

1
Вам потрібно мати \\s-замість цього \s. Ви спробували це рішення?
Kaushal Modi

Як не дивно, я цим користуюся зовсім небагато. Але я щойно це записав із пам’яті. Ви праві.
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.