¿La forma más fácil de verificar si la línea actual está "vacía" (ignorando los espacios en blanco)?


14

Solo quiero verificar si la línea actual está vacía o no (si contiene solo espacios en blanco, entonces todavía la considero vacía).

Aquí está mi versión inicial:

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

¿Cuál es la forma más fácil de verificar si la línea actual está vacía?


3
En una cadena de lisp, escribir \ses equivalente a escribir s. Quizás quisiste decir "^\\s*$".
YoungFrog

3
Como comentario general, elisp tendrá más sentido una vez que comience a pensar en términos de acciones en los buffers , en lugar de (como se hace en otros idiomas) hacer cosas con cadenas . Es probable que aislar y extraer una cadena para realizar algunas pruebas (a) sea ineficiente y (b) reduzca drásticamente la cantidad de herramientas a su disposición. Elisp es realmente bueno haciendo cosas directamente sobre el contenido de los buffers.
phils

1
@YoungFrog, también debería ser en \\s-lugar de \\s. Ese guión se requiere en elisp regexp.
Kaushal Modi

Respuestas:


24

¿Algo como esto sería "más fácil"?

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

12

Un método simple, cercano a lo que tienes:

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

Me gusta esta solución porque no se modifica match-data.
nispio

1
Necesitas tener en \\s-lugar de \s. ¿Has probado esa solución?
Kaushal Modi

Curiosamente, lo uso bastante. Pero acabo de escribir esto de memoria. Estás en lo correcto.
PythonNut

1
¿Aún te falta el guión? :)
Kaushal Modi

Era temprano y aún no me había despertado por completo.
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

Yo sugiero:

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

(Tenga en cuenta que los progns de hecho son innecesarios porque las funciones de omisión nunca devuelven nil). Como lo hace Dan en su respuesta, skip-syntax-*también podría usarse en su lugar.


3
Esto no identifica una línea que contiene solo pestañas como en blanco. skip-syntax-*es el conjunto correcto de funciones para usar aquí.
Gilles 'SO- deja de ser malvado'

1

Aquí hay otra solución simple para ello, tomada del comment-dwim-2paquete

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

1

Esta es una modificación de lo que respondió PythonNut que no funcionó para mí (¿por qué?):

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

string-match-pdevolvió el índice de la siguiente línea cuando la línea actual no estaba en blanco. Así que verifiqué que el valor de retorno es 0.


El índice de la siguiente línea? ¿Qué quieres decir exactamente? (y bienvenido en emacs.SE!)
JeanPierre

@JeanPierre (thing-at-point 'line)incluye la nueva línea al final de la línea. Si la línea actual no está en blanco, la expresión regular coincide en esa nueva línea. El único momento que string-match-pdevuelve nil aquí es en la última línea del búfer (y Dario, su versión no funciona en la última línea si el búfer no termina con una nueva línea).
Gilles 'SO- deja de ser malvado'

Una solución mejor sería hacer coincidir el comienzo de la cadena en lugar de hacer coincidir el comienzo de cualquier línea en la cadena. He editado la respuesta de PythonNut.
Gilles 'SO- deja de ser malvado'

0

current-indentation le proporciona la columna que sigue los espacios en blanco iniciales, que se pueden comparar con la columna al final de la línea:

(defun blank-line-p ()
  (= (current-indentation)
     (- (line-end-position) (line-beginning-position))))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.