Il modo più semplice per verificare se la riga corrente è "vuota" (ignorando gli spazi bianchi)?


14

Voglio solo verificare se la riga corrente è vuota o meno (se contiene solo spazi, quindi la considero ancora vuota).

Ecco la mia versione iniziale:

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

Qual è il modo più semplice per verificare se la riga corrente è vuota?


3
In una stringa lisp, la scrittura \sequivale alla scrittura s. Forse intendevi "^\\s*$".
YoungFrog,

3
Come commento generale, elisp avrà più senso una volta che inizi a pensare in termini di azioni sui buffer , al contrario di (come si tende a fare in altre lingue) facendo cose con le stringhe . L'isolamento e l'estrazione di una stringa per eseguire alcuni test probabilmente (a) sarà inefficiente e (b) ridurrà drasticamente il numero di strumenti a vostra disposizione. Elisp è davvero bravo a fare le cose direttamente sul contenuto dei buffer.
phils,

1
@YoungFrog, anche dovrebbe essere \\s-invece di \\s. Questo trattino è richiesto in elisp regexp.
Kaushal Modi,

Risposte:


24

Una cosa del genere sarebbe "più semplice"?

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

12

Un metodo semplice, vicino a quello che hai:

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

Mi piace questa soluzione perché non modifica match-data.
nispio,

1
Devi avere \\s-invece di \s. Hai provato quella soluzione?
Kaushal Modi,

Stranamente, lo uso abbastanza. Ma l'ho appena scritto per memoria. Hai ragione.
PythonNut,

1
manca ancora il trattino? :)
Kaushal Modi,

Era presto e non mi ero ancora completamente svegliato.
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

Suggerisco:

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

(Si noti che gli progns non sono in realtà necessari perché le funzioni skip non restituiscono mai zero). Come fa Dan nella sua risposta, skip-syntax-*potrebbe anche essere usato.


3
Ciò non identifica una riga contenente solo schede come vuote. skip-syntax-*è il giusto set di funzioni da utilizzare qui.
Gilles 'SO- smetti di essere malvagio' il

1

Ecco un'altra semplice soluzione per questo, presa dal comment-dwim-2pacchetto

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

1

Questa è una modifica della risposta di PythonNut che non ha funzionato per me (perché?):

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

string-match-pha restituito l'indice della riga successiva ogni volta che la riga corrente non era vuota. Quindi ho verificato che il valore restituito sia 0.


L'indice della riga successiva? Cosa intendi esattamente? (e benvenuto su emacs.SE!)
JeanPierre,

@JeanPierre (thing-at-point 'line)include la nuova riga alla fine della riga. Se la riga corrente non è vuota, la regexp corrisponde a quella nuova riga. L'unica volta che string-match-prestituisce zero qui è sull'ultima riga del buffer (e Dario, la tua versione non funziona sull'ultima riga se il buffer non termina con una nuova riga).
Gilles 'SO- smetti di essere malvagio' il

Una soluzione migliore sarebbe quella di abbinare l'inizio della stringa invece di far coincidere l'inizio di qualsiasi riga nella stringa. Ho modificato la risposta di PythonNut.
Gilles 'SO- smetti di essere malvagio' il

0

current-indentation ti dà la colonna che segue gli spazi vuoti iniziali, che possono essere confrontati con la colonna alla fine della riga:

(defun blank-line-p ()
  (= (current-indentation)
     (- (line-end-position) (line-beginning-position))))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.