Der einfachste Weg, um zu überprüfen, ob die aktuelle Zeile "leer" ist (Leerzeichen werden ignoriert)?

14

Ich möchte nur prüfen, ob die aktuelle Zeile leer ist oder nicht (wenn sie nur Leerzeichen enthält, halte ich sie immer noch für leer).

Hier ist meine erste Version:

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

Was ist der einfachste Weg, um zu überprüfen, ob die aktuelle Zeile leer ist?

ChillarAnand
quelle
3
In einer Lisp-Zeichenfolge \sentspricht das Schreiben dem Schreiben s. Vielleicht hast du gemeint "^\\s*$".
YoungFrog
3
Als allgemeiner Kommentar macht elisp mehr Sinn, wenn Sie anfangen, über Aktionen auf Puffern nachzudenken , als Dinge mit Strings zu tun (wie man es in anderen Sprachen tut) . Das Isolieren und Extrahieren eines Strings zur Durchführung eines Tests ist wahrscheinlich (a) ineffizient und (b) reduziert die Anzahl der Werkzeuge, die Ihnen zur Verfügung stehen, erheblich. Elisp ist wirklich gut darin , Dinge direkt auf den Inhalt von Puffern anzuwenden .
Phils
1
@YoungFrog, sollte es auch \\s-statt \\s. Dieser Bindestrich wird in elisp regexp benötigt.
Kaushal Modi

Antworten:

24

Wäre so etwas "einfacher"?

(defun current-line-empty-p ()
  (save-excursion
    (beginning-of-line)
    (looking-at "[[:space:]]*$")))
François Févotte
quelle
12

Eine einfache Methode, die Ihren Vorstellungen nahe kommt:

(defun current-line-empty-p ()
  (string-match-p "\\`\\s-*$" (thing-at-point 'line)))
PythonNut
quelle
Ich mag diese Lösung, weil sie nicht modifiziert match-data.
Nispio
1
Sie müssen \\s-statt haben \s. Haben Sie diese Lösung ausprobiert?
Kaushal Modi
Seltsamerweise benutze ich es ziemlich oft. Aber ich habe das nur auswendig geschrieben. Du hast Recht.
PythonNut
1
Fehlt noch der Bindestrich? :)
Kaushal Modi
Es war früh und ich war noch nicht ganz aufgewacht.
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)))))
Dan
quelle
1

Ich schlage vor:

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

(Beachten Sie, dass die progns in der Tat unnötig sind, da die Sprungfunktionen niemals nil zurückgeben). Wie Dan es in seiner Antwort tut, skip-syntax-*könnte auch stattdessen verwendet werden.

Jungfrosch
quelle
3
Dies identifiziert eine Zeile, die nur Tabulatoren enthält, nicht als leer. skip-syntax-*ist der richtige Satz von Funktionen, um hier zu verwenden.
Gilles 'SO- hör auf böse zu sein'
1

Hier ist eine weitere einfache Lösung aus dem comment-dwim-2Paket

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

Dies ist eine Modifikation der Antwort von PythonNut, die bei mir nicht funktioniert hat (warum?):

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

string-match-pGibt den Index der nächsten Zeile zurück, wenn die aktuelle Zeile nicht leer ist. Also habe ich überprüft, ob der Rückgabewert 0 ist.

Dario
quelle
Der Index der nächsten Zeile? Was genau meinst du? (und willkommen auf emacs.SE!)
JeanPierre
@JeanPierre (thing-at-point 'line)schließt den Zeilenumbruch am Ende der Zeile ein. Wenn die aktuelle Zeile nicht leer ist, stimmt der reguläre Ausdruck mit dieser neuen Zeile überein. Der einzige Zeitpunkt, an dem string-match-pnil zurückgegeben wird, befindet sich in der letzten Zeile des Puffers (und Dario, Ihre Version funktioniert nicht in der letzten Zeile, wenn der Puffer nicht mit einer neuen Zeile endet).
Gilles 'SO - hör auf, böse zu sein'
Eine bessere Lösung besteht darin, den Anfang der Zeichenfolge abzugleichen, anstatt den Anfang einer Zeile in der Zeichenfolge abzugleichen. Ich habe die Antwort von PythonNut bearbeitet.
Gilles 'SO- hör auf böse zu sein'
0

current-indentation gibt der Spalte folgende führende Leerzeichen, die mit der Spalte am Zeilenende verglichen werden können:

(defun blank-line-p ()
  (= (current-indentation)
     (- (line-end-position) (line-beginning-position))))
npostavs
quelle