Najłatwiejszym sposobem sprawdzenia, czy bieżąca linia jest „pusta” (ignorowanie białych znaków)?


14

Chcę tylko sprawdzić, czy bieżąca linia jest pusta, czy nie (jeśli zawiera tylko białe znaki, nadal uważam ją za pustą).

Oto moja początkowa wersja:

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

Jak najłatwiej sprawdzić, czy bieżąca linia jest pusta?


3
W łańcuchu lisp pisanie \sjest równoznaczne z pisaniem s. Być może miałeś na myśli "^\\s*$".
YoungFrog,

3
Jako ogólny komentarz, elisp nabierze większego sensu, gdy zaczniesz myśleć o działaniach na buforach , w przeciwieństwie do (jak to zwykle bywa w innych językach) robienia rzeczy z łańcuchami . Wyodrębnienie i wyodrębnienie łańcucha w celu wykonania jakiegoś testu prawdopodobnie (a) będzie nieefektywne i (b) radykalnie zmniejszy liczbę dostępnych narzędzi. Elisp jest naprawdę dobry w robieniu rzeczy bezpośrednio na zawartości buforów.
phils

1
@YoungFrog, też powinno być \\s-zamiast \\s. Ten łącznik jest wymagany w wyrażeniu regularnym elisp.
Kaushal Modi

Odpowiedzi:


24

Czy coś takiego byłoby „łatwiejsze”?

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

12

Prosta metoda, blisko tego, co masz:

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

Podoba mi się to rozwiązanie, ponieważ się nie modyfikuje match-data.
nispio 25.04.16

1
Musisz mieć \\s-zamiast \s. Wypróbowałeś to rozwiązanie?
Kaushal Modi

Co dziwne, używam go dość często. Ale właśnie spisałem to z pamięci. Masz rację.
PythonNut

1
nadal brakuje łącznika? :)
Kaushal Modi

Było wcześnie i jeszcze się nie obudziłem.
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

Sugeruję:

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

(Zauważ, że progns są w rzeczywistości niepotrzebne, ponieważ funkcje pomijania nigdy nie zwracają wartości zero). Tak jak Dan w swojej odpowiedzi, skip-syntax-*można go również użyć.


3
Nie oznacza to, że wiersz zawierający tylko tabulatory jest pusty. skip-syntax-*to odpowiedni zestaw funkcji do użycia tutaj.
Gilles „SO- przestań być zły”

1

Oto inne proste rozwiązanie, wzięte z comment-dwim-2pakietu

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

1

To jest modyfikacja odpowiedzi na PythonNut, która nie działała dla mnie (dlaczego?):

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

string-match-pzwracał indeks następnego wiersza, ilekroć bieżący wiersz nie był pusty. Sprawdziłem więc, czy zwracana wartość to 0.


Indeks następnej linii? Co miałeś dokładnie na myśli? (i witamy na emacs.SE!)
JeanPierre 10.09.19

@JeanPierre (thing-at-point 'line)zawiera nową linię na końcu linii. Jeśli bieżący wiersz nie jest pusty, wyrażenie regularne pasuje do tej nowej linii. Jedyny czas, który string-match-pzwraca tutaj zero, znajduje się w ostatnim wierszu bufora (i Dario, twoja wersja nie działa w ostatnim wierszu, jeśli bufor nie kończy się na nowej linii).
Gilles „SO- przestań być zły”

Lepszym rozwiązaniem byłoby dopasowanie początku ciągu zamiast dopasowywania początku dowolnej linii w ciągu. Zredagowałem odpowiedź PythonNut.
Gilles „SO- przestań być zły”

0

current-indentation daje kolumnę z następującymi odstępami, które można porównać z kolumną na końcu wiersza:

(defun blank-line-p ()
  (= (current-indentation)
     (- (line-end-position) (line-beginning-position))))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.