excluir palavra após ou ao redor do cursor no VIM

212

Agora estou mudando para o VIMTextMate. Achei ^+Wno modo INSERT muito útil. No entanto, gostaria de excluir não apenas a palavra antes do cursor, mas também a palavra depois ou ao redor do cursor.

Eu pesquisei no Google, mas a única coisa que encontrei foi ^+Wexcluir a palavra ANTES do cursor.

Mantas
fonte

Respostas:

78

O que você deve fazer é criar um imap de uma certa chave para uma série de comandos; nesse caso, os comandos o colocarão no modo normal, excluirão a palavra atual e o colocarão novamente:

:imap <C-d> <C-[>diwi
Whaledawg
fonte
29
": h diw" para muitos shrtcts úteis!
Klokop 4/05
12
Pontos de bônus bônus por usar <Co>. Ele executa um comando no modo Normal e volta diretamente para o Insert, então algo como imap <C-d> <C-o>diwfunciona também. Também não cria um ponto de desfazer, o que <Esc> praticamente sempre cria.
Zelk
<Co> no modo de inserção fez o meu dia :)
Lusk116
541

Modo normal:

daw : delete the word under the cursor    
caw : delete the word under the cursor and put you in insert mode 
Amjith
fonte
125
É útil pensar nisso como daw: exclua uma palavra e caw: altere uma palavra.
welbornio
1
Deus eu tenho usado da)e ci)nunca pensei nisso!
Sky
1
Isso é ouro, Jerry! OURO! Eu mapeei esses bebês no meu .vimrcarquivo da seguinte maneira: nmap <Leader>d daw enmap <Leader>c caw
racl101
1
Provavelmente vale a pena mencionar que awé um exemplo de seleção de objetos. Você pode tentar a seleção de objetos no modo visual para ver qual efeito eles têm: vimdoc.sourceforge.net/htmldoc/motion.html#object-select
crantok
103

Eu acho que é só daw

daw - delete a word
Steve
fonte
1
Eu sei que aé um comando para, Append text after the cursor [count] times.mas como dawfunciona?
Syntagma
3
@REACHUS, o caractere inicial ddetermina que você estará 'excluindo'. O 'a' é um tipo de parâmetro, especificando que a exclusão deve incluir um delimitador. Finalmente, o 'w', outro parameter- se você desejar - especifica que uma wordunidade será excluída.
Vlad-ardelean
2
qual é a diferença entre dwe daw?
AK_ 13/03/19
5
@AK_ Resposta tardia, mas se você estiver no meio de uma palavra, dwserá excluído do cursor até o final da palavra, enquanto dawexcluirá a palavra inteira junto com um espaço. diwexcluirá a palavra inteira sem tocar em espaço em branco ao redor dela.
Dmiters
67

O abaixo funciona para o modo Normal: concordo com a resposta de Dan Olson de que você provavelmente deve estar no modo normal para a maioria das exclusões. Mais detalhes abaixo.

Se o cursor estiver dentro da palavra:
diwexcluir na palavra (não inclui espaços)
dawpara excluir ao redor da palavra (inclui espaços antes da próxima palavra).

Se o cursor estiver no início da palavra, basta pressionar dw.

Isso pode ser multiplicado adicionando os números usuais de movimento, por exemplo, 2w para avançar duas palavras, de modo que d2w exclui duas palavras.

Modo de inserção ^ w
A idéia de usar hjkl para movimento no Vim é que é mais produtivo manter as mãos na linha de casa. No final de uma palavra ^ w funciona muito bem para excluir rapidamente a palavra. Se você entrou no modo de inserção, inseriu algum texto e usou as teclas de seta para terminar no meio da palavra que foi contra a filosofia da linha inicial.
Se você estiver no modo normal e quiser alterar a palavra, basta usar o botão c(alterar) em vez de d(excluir) se quiser alterar completamente a palavra e entrar novamente no modo de inserção sem precisar pressionar ipara voltar. para digitar.

Andy
fonte
42

Você quer dizer como?

dw
Nadia Alramli
fonte
10
Atrasado para a festa, mas dw irá apagar a partir da posição atual para o final da palavra, para apagar a palavra inteira do DIW uso início ou daw
DVID Silva
1
dwnão excluirá além de um hífen ou outra pontuação.
Ccpizza
* Nota: Isso substituirá o buffer / última arrancada. Esta é mais uma operação de 'Recortar', não apenas 'Excluir'.
MD. Mohiuddin Ahmed
23

Para excluir todos os caracteres entre dois espaços em branco, no modo normal:

daW

Para excluir apenas uma palavra:

daw 
krmld
fonte
20

Parece que não há nenhuma maneira integrada de fazê-lo no modo de inserção, que era a questão. Algumas das outras respostas estão corretas para o modo normal, além de apontar que um mapeamento personalizado pode ser criado para adicionar a funcionalidade no modo de inserção.

Honestamente, você provavelmente deve fazer a maior parte de sua exclusão no modo normal. É interessante saber o que é, mas não tenho certeza se consigo pensar em uma situação em que prefiro fazê-lo do que esc para entrar no modo normal e ter os comandos de exclusão mais poderosos à minha disposição.

O Vim é muito diferente de vários outros editores (incluindo o TextMate) dessa maneira. Se você o estiver usando produtivamente, provavelmente descobrirá que não passa muito tempo no modo de inserção.

Dan Olson
fonte
1
Eu uso ^ wa lote, principalmente quando digito uma palavra incorretamente - em vez de voltar e adicionar a letra que faltava / etc, apenas apago a coisa toda e começo de novo .. Ir para o modo normal apenas para excluir uma palavra parece um desperdício de algumas teclas pressionadas .. Por exemplo, "exemplo wrd [^ w] palavra" é menos pressionamento de tecla que "exemplo wrd [^ c] [dw] [i] palavra"
dbr
1
dbr: Ele não estava pedindo para fazer o comportamento básico ^ W, que o vim suporta. Ele estava pedindo para excluir todas as palavras no meio enquanto estava no modo de inserção, o que é uma situação meio estranha para o vim e, portanto, não há comando para fazê-lo. Você sempre pode vincular ^ Q a <Esc> ciw se realmente desejar a funcionalidade. Oh, também o [i] em [^ c] [dw] [i] é redundante, você pode usar [^ c] [CIW]
bfabry
4
"Não parece que há uma maneira ..." - bem, existem inúmeras maneiras de fazê-lo - simplesmente não há uma maneira embutida, no entanto. Embora eu concorde plenamente com a afirmação de Dan sobre o modo de inserção versus o modo normal, é claro que você pode simplesmente definir um mapeamento do modo de inserção, consulte ": help imap" que faz o que você deseja obter se realmente precisar da funcionalidade no modo de inserção.
User55400
13

Para excluir a palavra inteira, seu cursor está sendo usado. diw
Para excluir a palavra inteira, seu cursor está ativado e para colocá-lo no modo de inserção. ciw
Se você não deseja excluir a palavra inteira, exclua de onde está.dw/cw

Naseeruddin VN
fonte
8

Como existem muitas maneiras de excluir uma palavra, vamos ilustrá-las.

Supondo que você edite:

foo-bar quux

e invoque um comando enquanto o cursor estiver no 'a' na 'barra':

foo-bquux  # dw:  letters then spaces right of cursor
foo-quux   # daw: letters on both sides of cursor then spaces on the right 
foo- quux  # diw: letters on both sides of cursor
foo-bquux  # dW:  non-whitespace then spaces right of cursor
quux       # daW: non-whitespace on both sides of cursor then spaces on the right
 quux      # diW: non-whitespace on both sides of cursor
0xF
fonte
5

Infelizmente, o modo de inserção não possui esse comando. No VIM, para excluir a palavra inteira sob o cursor, você pode digitar viwdno modo NORMAL. Que significa " V isual-bloco I nner W ord D elete". Use uma letra maiúscula Wpara incluir pontuação.

mycelo
fonte
3

A resposta aceita falha ao tentar repetir a exclusão de palavras, tente esta solução:

" delete current word, insert and normal modes
inoremap <C-BS> <C-O>b<C-O>dw
noremap <C-BS> bdw

Ele mapeia o CTRL-BackSpace, também trabalhando no modo normal.


fonte
Eu gosto mais desta resposta apenas porque também funciona no modo normal.
Sivabudh 26/10/11
2

Para excluir uma certa quantidade de caracteres antes do cursor, você pode usar X. Para excluir um certo número de palavras após o cursor, você pode usar dw (várias palavras podem ser excluídas usando 3dw por 3 palavras, por exemplo). Para excluir ao redor do cursor em geral, você pode usar daw.

John T
fonte
2

No antigo vi, bmove o cursor para o início da palavra antes do cursor, wmove o cursor para o início da palavra após o cursor, emove o cursor no final da palavra após o cursor e dwexclui do cursor para o final da palavra.

Se você digitar wbdw, excluirá a palavra ao redor do cursor, mesmo se o cursor estiver no início ou no final da palavra. Observe que os espaços em branco após uma palavra consideram parte da palavra a ser excluída.

mouviciel
fonte
2

Não tenho muita certeza sobre o uso de "antes" e "depois", mas você já tentou

dw

?

Edit: Eu acho que você está procurando algo para usar no modo de inserção. Estranhamente, não há nada para ser encontrado nos documentos, ctrl-w parece ser tudo o que existe.

innaM
fonte
2

Fiz dois mapeamentos para obter consistência no modo de inserção e fora do modo de inserção.

:map <'Key of your choice'> caw

:imap <'Key of your choice'> <'Esc'> caw

userFog
fonte
0

Gostaria de excluir não apenas a palavra antes do cursor, mas também a palavra depois ou ao redor do cursor.

Nesse caso, a solução proposta pelo OP (ou seja, usando <c-w>) pode ser combinada com a resposta aceita para fornecer:

inoremap <c-d> <c-o>daw<c-w>

alternativamente (solução mais curta):

inoremap <c-d> <c-o>vawobd

Entrada de amostra:

word1 word2 word3 word4
               ^------------- Cursor location

Resultado:

word1 word4
sergio
fonte