A maneira mais fácil de verificar se a linha atual está "vazia" (ignorando espaços em branco)?


14

Eu só quero verificar se a linha atual está vazia ou não (se ela contém apenas espaço em branco, ainda a considero vazia).

Aqui está a minha versão 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)))

Qual é a maneira mais fácil de verificar se a linha atual está vazia?


3
Em uma string lisp, escrever \sé equivalente a escrever s. Talvez você quis dizer "^\\s*$".
YoungFrog

3
Como um comentário geral, o elisp fará mais sentido quando você começar a pensar em termos de ações em buffers , em vez de (como costuma fazer em outras línguas) fazer coisas com strings . Isolar e extrair uma sequência para realizar algum teste provavelmente (a) é ineficiente e (b) reduz drasticamente o número de ferramentas à sua disposição. Elisp é realmente bom em fazer coisas diretamente no conteúdo dos buffers.
Phill

1
@YoungFrog, também deve ser em \\s-vez de \\s. Esse hífen é necessário no elisp regexp.
27516 Kaushal Modi

Respostas:


24

Algo assim seria "mais fácil"?

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

12

Um método simples, próximo ao que você tem:

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

Eu gosto desta solução porque não modifica match-data.
Nispio 25/04

1
Você precisa ter em \\s-vez de \s. Você já tentou essa solução?
27416 Kaushal Modi

Estranhamente, eu o uso bastante. Mas acabei de escrever isso fora da memória. Você está certo.
PythonNut

1
ainda falta o hífen? :)
Kaushal Modi

Era cedo e eu ainda não tinha acordado completamente.
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

Eu sugiro:

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

(Observe que os progns são de fato desnecessários porque as funções de ignorar nunca retornam nulo). Como Dan faz em sua resposta, skip-syntax-*também pode ser usado.


3
Isso não identifica uma linha que contém apenas guias como em branco. skip-syntax-*é o conjunto certo de funções para usar aqui.
Gilles 'SO- stop be evil'

1

Aqui está outra solução simples, retirada do comment-dwim-2pacote

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

1

Esta é uma modificação do que o PythonNut respondeu que não funcionou para mim (por quê?):

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

string-match-pretornou o índice da próxima linha sempre que a linha atual não estivesse em branco. Então eu verifiquei que o valor de retorno é 0.


O índice da próxima linha? O que você quer dizer exatamente? (e bem-vindo em emacs.SE!)
JeanPierre

@JeanPierre (thing-at-point 'line)inclui a nova linha no final da linha. Se a linha atual não estiver em branco, a regexp corresponderá à nova linha. O único tempo string-match-pretornado nulo aqui é na última linha do buffer (e Dario, sua versão não funciona na última linha se o buffer não terminar com uma nova linha).
Gilles 'SO- stop be evil

Uma correção melhor seria corresponder ao início da string em vez de corresponder ao início de qualquer linha da string. Eu editei a resposta do PythonNut.
Gilles 'SO- stop being evil

0

current-indentation fornece a coluna a seguir aos espaços em branco à esquerda, que podem ser comparados com a coluna no final da linha:

(defun blank-line-p ()
  (= (current-indentation)
     (- (line-end-position) (line-beginning-position))))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.