Como excluir os primeiros n caracteres de cada linha?

15

Eu recentemente perguntei:

Como adicionar um prefixo para cada linha?

Então vá do código abaixo:

I said Hello
I said There
I said I am some code

Para codificar como:

Hello
There
I am some code

Agora, como faço para excluir n número de caracteres de uma linha?

Lucas
fonte
IMHO é o mesmo que sua pergunta anterior.
A_P

Respostas:

28

É ainda mais fácil! Mais uma vez, use comandos retangulares . Vá para um canto do retângulo que deseja excluir, pressione C-SPCpara definir a marca. Vá para o outro canto do retângulo e pressione C-x r d( delete-rectangle). Por exemplo, vá para a primeira linha em que deseja atuar, pressione C-aou homepara ir para o início da linha, vá para a última linha em que deseja atuar, para ir para o canto inferior direito e depois para excluir.C-u number C-fC-x r d

Se a última linha tiver menos do que o número desejado de caracteres, pode ser mais conveniente usar os cantos inferior esquerdo e superior direito. Como alternativa, você pode inserir caracteres indesejados (isso é útil se a primeira linha e a última linha forem mais curtas).

Você pode usar C-x r kpara matar o retângulo, o que permite puxá- C-x r ylo ( ) mais tarde (vá para o canto superior esquerdo do local onde você deseja inseri-lo).

Você também pode usar C-x r t( string-rectangle) e inserir uma sequência vazia.

Os comandos de retângulo são baseados nas posições da coluna. Se você deseja excluir n caracteres, em vez de n colunas (o que faz diferença com caracteres de várias colunas, como guias), você pode usar a substituição de expressão regular : substitua ^.\{42\}por nada para excluir os primeiros 42 caracteres de cada linha.

Gilles 'SO- parar de ser mau'
fonte
3
em vez de tentar lembrar de todos os comandos do retângulo, você também pode usar o Cx spc, em vez do C-spc, que transforma sua região em um retângulo e tudo funciona.
Malabarba 27/10/2014
11
@ Malabarba Apenas desde o Emacs 24, no entanto. (Escrevendo isso em uma máquina com o Emacs 23. Eles ainda estão por aí.)
Gilles 'para de ser mau'
2
Minhas condolências ... :-(
Malabarba
Isso só trabalhou para mim em GNU Emacs 23.4.1 (x86_64-pc-linux-gnu, GTK + versão 2.24.21) de 2013/10/25 na pimenta da Jamaica, modificado por Debian
davidrmcharles
4

Outra possibilidade: eu realmente gosto de usar vários cursores para tarefas como esta. Disponível na package.elMELPA, tornou-se parte indispensável do meu emacs. Eu simplesmente selecionaria I said(e possivelmente incluiria a quebra de linha antes dela), usaria M-x mc/mark-all-like-thise estaria a caminho. Se você deseja um controle mais refinado, pode usar mc/mark-next-like-thisou mc/mark-next-lines.

Minhas combinações de teclas:

(use-package multiple-cursors
  :bind (("C->"   . mc/mark-next-like-this)
         ("C-M->" . mc/mark-all-like-this-dwim)))

O obrigatório Emacs Rocks! episódio: http://emacsrocks.com/e13.html

Sean Allred
fonte
3

Se você cua-modeativou, então:

  • C-a para passar para o início da linha,
  • C-RET para iniciar retângulo,
  • Em seguida, mova-se com as setas ou qualquer comando emacs move como C-f
  • DEL excluir seleção

Prefiro a cua-modemaneira de trabalhar, em comparação com o retângulo padrão do Emacs, onde o equivalente seria:

  • C-a para passar para o início da linha,
  • C-SPC para iniciar retângulo,
  • Em seguida, mova-se com as setas ou qualquer comando emacs move como C-f
  • C-x r d excluir seleção

Ele cua-modesalva três pressionamentos de tecla em comparação com o retângulo Emacs padrão.

thdox
fonte
3

Por uma questão de completude: a exclusão dos três primeiros caracteres de cada linha (formalmente: a partir do momento ou na região) pode ser feita substituindo regexp ^...(ou mais geralmente :) por ^.\{3\}uma string vazia.

Explicação: em regexen, ^significa "início de linha", .significa "qualquer caractere" e \{n\}significa " n repetições da coisa anterior".

Isso tem um benefício adicional de ser interativo (a menos que você pressione !, o que query-regexp-replacesubstitui tudo a partir de agora sem mais perguntas).

mbork
fonte
11
Por que os votos negativos?
mbork
0

E mais uma possibilidade:

F3C-aC-3C-dC-nF4

grava uma macro de teclado, dizendo basicamente "vá para o início da linha, exclua três caracteres e vá para a próxima linha". Em seguida, você pode reproduzi-lo até o final do buffer C-uF4, ou C-xC-kraplicá-lo às linhas da região. Isso tem uma desvantagem: ele será interrompido quando qualquer linha tiver menos de 3 caracteres.

mbork
fonte
-1

Se for apenas uma linha, você pode zap-to-char com Mz assumindo que esse caractere não se repete entre o ponto e o ponto que você deseja excluir. Para alguns casos, isso é mais rápido do que criar uma região.

Willyfrog
fonte