Como posso excluir a linha atual no Emacs?


122

Qual é o equivalente do emacs do vi dd? Eu quero excluir a linha atual. Tentei CTRL+ kmas exclui apenas da posição atual.

Respostas:


212
C-a # Go to beginning of line
C-k # Kill line from current point

Há também

C-S-backspace   # Ctrl-Shift-Backspace

que invoca M-x kill-whole-line.

Se você deseja definir uma ligação de chave global diferente, coloque isso em ~ / .emacs:

(global-set-key "\C-cd" 'kill-whole-line)     # Sets `C-c d` to `M-x kill-whole-line`

Se você deseja excluir um número de linhas inteiras, é possível prefixar o comando com um número:

C-u 5 C-S-backspace    # deletes 5 whole lines
M-5 C-S-backspace      # deletes 5 whole lines

C-u C-S-backspace      # delete 4 whole lines. C-u without a number defaults to 4

C-u -5 C-S-backspace   # deletes previous 5 whole lines
M--5 C-S-backspace     # deletes previous 5 whole lines

Às vezes também acho C-x zútil:

C-S-backspace         # delete 1 whole line
C-x z                 # repeat last command
z                     # repeat last command again. 
                      # Press z as many times as you wish. 
                      # Any other key acts normally, and ends the repeat command.

Isso funciona. Existe uma maneira de fazer isso usando um comando? Terei que criar uma ligação de chave personalizada para fazer isso?
Manoj Govindan

14
Não sabia C-x z, isso é muito legal. E resposta agradável e precisa entre.
Slu

2
Também existe um C-k C-ktipo que funciona como um d$ S-jno vim, mas isso pode excluir linhas para a frente bastante bem.
Theo Belaire

Por que não há espaço C-cd?
Elliot Gorokhovsky

@ RenéG: O espaço é opcional.
unutbu

11

Caso você não queira eliminar a linha (o que a colocaria na área de transferência do sistema operacional e mataria o anel), basta excluí-la:

(defun delete-current-line ()
  "Delete (not kill) the current line."
  (interactive)
  (save-excursion
    (delete-region
     (progn (forward-visible-line 0) (point))
     (progn (forward-visible-line 1) (point)))))

3

Outro método para excluir a linha sem colocá-la no anel de morte:

(defun delete-current-line ()
  "Deletes the current line"
  (interactive)
  (delete-region
   (line-beginning-position)
   (line-end-position)))

Isso deixará o ponto no início de uma linha em branco. Para se livrar disso também, você pode adicionar algo como (delete-blank-lines)ao final da função, como neste exemplo, que é talvez um pouco menos intuitivo:

(defun delete-current-line ()
 "Deletes the current line"
 (interactive)
 (forward-line 0)
 (delete-char (- (line-end-position) (point)))
 (delete-blank-lines))

1

A maneira mais rápida / simples de excluir (matar) uma linha completa, a partir de qualquer ponto da linha, sem selecionar nada, é:

C-w  ; kill-region

É versátil na exclusão do que estiver selecionado ou de uma linha por padrão, se nada estiver selecionado.

Dada a pergunta, você provavelmente também está interessado em replicar o "puxão" de Vim yy(embora no jargão do Emacs um "puxão" seja confuso, o "puxe" de Vim p). Isto é:

M-w  ; kill-ring-save

Agradável e congruente, e muito fácil de lembrar. Mesmo um pouco semelhante ao Vim i_CTRL-W.

Depois de colocar algo no ringue de matar com qualquer um dos itens acima, você provavelmente desejará "puxá-lo" (colar):

M-y  ; yank-pop

(Observe que o CS-backspace pode não funcionar no Emacs terminal.)


1

Em vez de ter uma chave separada para excluir a linha ou ter que invocar o prefixo-argumento. Você pode usar o crux-smart-kill-line que "mata até o final da linha e mata a linha inteira na próxima chamada". Mas se você preferir, em deletevez de kill, você pode usar o código abaixo.

Para operação ponto a string (kill / delete), recomendo usar zop-to-char

(defun aza-delete-line ()
  "Delete from current position to end of line without pushing to `kill-ring'."
  (interactive)
  (delete-region (point) (line-end-position)))

(defun aza-delete-whole-line ()
  "Delete whole line without pushing to kill-ring."
  (interactive)
  (delete-region (line-beginning-position) (line-end-position)))

(defun crux-smart-delete-line ()
  "Kill to the end of the line and kill whole line on the next call."
  (interactive)
  (let ((orig-point (point)))
    (move-end-of-line 1)
    (if (= orig-point (point))
        (aza-delete-whole-line)
      (goto-char orig-point)
      (aza-delete-line))))

fonte

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.