Le moyen le plus simple de vérifier si la ligne actuelle est «vide» (en ignorant les espaces blancs)?

14

Je veux juste vérifier si la ligne actuelle est vide ou non (si elle ne contient que des espaces, alors je la considère toujours vide).

Voici ma version initiale:

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

Quelle est la façon la plus simple de vérifier si la ligne actuelle est vide?

ChillarAnand
la source
3
Dans une chaîne lisp, l'écriture \séquivaut à l'écriture s. Peut-être que vous vouliez dire "^\\s*$".
YoungFrog
3
En général, elisp aura plus de sens une fois que vous commencerez à penser en termes d'actions sur les tampons , par opposition à (comme on a tendance à le faire dans d'autres langues) à faire des choses avec des chaînes . Isoler et extraire une chaîne afin d'effectuer un test est susceptible (a) d'être inefficace et (b) de réduire considérablement le nombre d'outils à votre disposition. Elisp est vraiment bon pour faire des choses directement sur le contenu des tampons.
phils
1
@YoungFrog, il devrait également être \\s-au lieu de \\s. Ce trait d'union est requis dans elisp regexp.
Kaushal Modi

Réponses:

24

Est-ce que quelque chose comme ça serait "plus facile"?

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

Une méthode simple, proche de ce que vous avez:

(defun current-line-empty-p ()
  (string-match-p "\\`\\s-*$" (thing-at-point 'line)))
PythonNut
la source
J'aime cette solution car elle ne se modifie pas match-data.
nispio
1
Vous devez avoir \\s-au lieu de \s. Avez-vous essayé cette solution?
Kaushal Modi
Curieusement, je l'utilise pas mal. Mais je viens d'écrire cela de mémoire. Vous avez raison.
PythonNut
1
manque toujours le trait d'union? :)
Kaushal Modi
Il était tôt et je ne m'étais pas encore complètement réveillé.
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
la source
1

Je suggère:

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

(Notez que les progns sont en fait inutiles car les fonctions de saut ne renvoient jamais nul). Comme Dan le fait dans sa réponse, skip-syntax-*pourrait également être utilisé à la place.

YoungFrog
la source
3
Cela n'identifie pas une ligne contenant uniquement des tabulations comme vide. skip-syntax-*est le bon ensemble de fonctions à utiliser ici.
Gilles 'SO- arrête d'être méchant'
1

Voici une autre solution simple, tirée de l' comment-dwim-2emballage

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

Ceci est une modification de ce que PythonNut a répondu qui n'a pas fonctionné pour moi (pourquoi?):

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

string-match-pa renvoyé l'index de la ligne suivante chaque fois que la ligne actuelle n'était pas vide. J'ai donc vérifié que la valeur de retour est 0.

Dario
la source
L'index de la ligne suivante? Que voulez-vous dire exactement? (et bienvenue sur emacs.SE!)
JeanPierre
@JeanPierre (thing-at-point 'line)inclut la nouvelle ligne à la fin de la ligne. Si la ligne actuelle n'est pas vide, l'expression rationnelle correspond à cette nouvelle ligne. Le seul temps de string-match-pretour nul ici est sur la dernière ligne du tampon (et Dario, votre version ne fonctionne pas sur la dernière ligne si le tampon ne se termine pas par une nouvelle ligne).
Gilles 'SO- arrête d'être méchant'
Une meilleure solution serait de faire correspondre le début de la chaîne au lieu de faire correspondre le début d'une ligne de la chaîne. J'ai édité la réponse de PythonNut.
Gilles 'SO- arrête d'être méchant'
0

current-indentation vous donne la colonne suivant les blancs en tête, qui peuvent être comparés à la colonne à la fin de la ligne:

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