supprimer le mot après ou autour du curseur dans VIM

212

Je passe maintenant VIMde TextMate. J'ai trouvé ^+Wen mode INSERT très utile. Cependant, je voudrais supprimer non seulement le mot avant le curseur, mais aussi le mot après ou autour du curseur.

J'ai fait quelques recherches sur Google, mais la seule chose que je puisse trouver était ^+Wde supprimer le mot AVANT le curseur.

Mantas
la source

Réponses:

78

Ce que vous devez faire est de créer une imap d'une certaine clé à une série de commandes, dans ce cas, les commandes vous déposeront en mode normal, supprimeront le mot actuel et vous remettront en insertion:

:imap <C-d> <C-[>diwi
Whaledawg
la source
29
": h diw" pour de nombreux articles utiles!
klokop
12
Points bonus bonus pour l'utilisation de <Co>. Il exécute une commande en mode Normal et revient directement dans Insert, donc quelque chose comme ça imap <C-d> <C-o>diwmarche aussi. Il ne crée pas non plus de point d'annulation, ce que <Esc> fait presque toujours.
zelk
<Co> en mode insertion a fait ma journée :)
Lusk116
541

Mode normal:

daw : delete the word under the cursor    
caw : delete the word under the cursor and put you in insert mode 
Amjith
la source
125
Il est utile pour moi de le considérer comme daw: supprimer un mot et caw: changer un mot.
welbornio
1
Dieu , j'ai utilisé da)et ci)mais jamais pensé à cela!
Sky
1
C'est de l'or Jerry! OR! J'ai mappé ces bébés sur mon .vimrcfichier comme ceci: nmap <Leader>d daw etnmap <Leader>c caw
racl101
1
Il vaut probablement la peine de mentionner que awc'est un exemple de sélection d'objet. Vous pouvez essayer les sélections d'objets en mode visuel pour voir leur effet: vimdoc.sourceforge.net/htmldoc/motion.html#object-select
crantok
103

Je pense que c'est juste daw

daw - delete a word
Steve
la source
1
Je sais que ac'est une commande pour Append text after the cursor [count] times.mais comment ça dawmarche?
syntagma
3
@REACHUS le caractère initial indique dque vous "supprimerez". Le «a» est une sorte de paramètre, spécifiant que la suppression doit inclure un délimiteur. Enfin le «w», un autre parameter-si vous voulez- spécifie qu'une wordunité sera supprimée.
vlad-ardelean
2
quelle est la différence entre dwet daw?
AK_
5
@AK_ Réponse tardive, mais si vous êtes au milieu d'un mot, dwsupprimera du curseur jusqu'à la fin du mot, tandis que dawsupprimera le mot entier avec un espace. diwsupprimera le mot entier sans toucher les espaces autour.
Dmiters
67

Ce qui suit fonctionne pour le mode normal: je suis d'accord avec la réponse de Dan Olson selon laquelle vous devriez probablement être en mode normal pour la plupart des suppressions. Plus de détails ci-dessous.

Si le curseur est à l'intérieur du mot:
diwà supprimer dans le mot (n'inclut pas les espaces)
daw supprimer autour du mot (inclut les espaces avant le mot suivant).

Si le curseur est au début du mot, appuyez simplement sur dw .

Cela peut être multiplié en ajoutant les nombres habituels pour le mouvement, par exemple 2w pour avancer de 2 mots, donc d2w supprime deux mots.

Mode d'insertion ^ w
L'idée d'utiliser hjkl pour se déplacer dans Vim est qu'il est plus productif de garder les mains sur la ligne de départ. À la fin d'un mot, ^ w fonctionne très bien pour supprimer rapidement le mot. Si vous êtes passé en mode insertion, saisissez du texte et utilisez les touches fléchées pour vous retrouver au milieu du mot que vous êtes allé à l'encontre de la philosophie de la ligne de départ.
Si vous êtes en mode normal et que vous voulez changer le mot, vous pouvez simplement utiliser le c(changer) plutôt que d(supprimer) si vous souhaitez changer complètement le mot et revenir en mode d'insertion sans avoir à appuyer sur ipour revenir à taper.

Andy
la source
42

Voulez-vous dire comme?

dw
Nadia Alramli
la source
10
En retard à la fête, mais dw supprimera de la position actuelle à la fin du mot, pour supprimer le mot entier depuis le début, utilisez diw ou daw
Dvid Silva
1
dwne supprimera pas au-delà d'un trait d'union ou d'une autre ponctuation.
ccpizza
* Remarque: Cela écrasera le tampon / le dernier tirage. Il s'agit plus d'une opération «Couper», pas seulement «Supprimer».
MD. Mohiuddin Ahmed
23

Pour supprimer tous les caractères entre deux espaces blancs, en mode normal:

daW

Pour supprimer un seul mot:

daw 
krmld
la source
20

Il ne semble pas y avoir de moyen intégré de le faire en mode insertion, c'était la question. Certaines des autres réponses sont correctes pour le mode normal, tout en soulignant qu'un mappage personnalisé pourrait être créé pour ajouter la fonctionnalité en mode insertion.

Honnêtement, vous devriez probablement faire la plupart de vos suppressions en mode normal. ^ W est bien connu, mais je ne suis pas sûr de pouvoir penser à une situation où je préférerais le faire plutôt qu'esc pour passer en mode normal et avoir les commandes de suppression les plus puissantes à ma disposition.

Vim est très différent d'un certain nombre d'autres éditeurs (y compris TextMate) de cette façon. Si vous l'utilisez de manière productive, vous constaterez probablement que vous ne passez pas beaucoup de temps en mode insertion.

Dan Olson
la source
1
J'utilise beaucoup ^ wa, surtout lorsque je tape un mot mal - au lieu de revenir en arrière et d'ajouter la lettre manquante / etc, je supprime le tout et recommence .. Passer en mode normal pour supprimer un mot semble être un gaspillage de quelques frappes. Par exemple, "exemple wrd [^ w] mot" est moins de touches que "exemple wrd [^ c] [dw] [i] mot"
dbr
1
dbr: Il ne demandait pas le comportement de base de ^ W, supporté par vim. Il demandait de supprimer tout un mot au milieu en mode insertion, ce qui est une situation un peu bizarre pour vim et donc il n'y a pas de commande pour le faire. Vous pouvez toujours lier ^ Q à <Esc> ciw si vous voulez vraiment la fonctionnalité. Oh, aussi le [i] dans [^ c] [dw] [i] est redondant, vous pouvez utiliser [^ c] [ciw]
bfabry
4
"Il ne semble pas qu'il y ait un moyen ..." - eh bien, il existe d'innombrables façons de le faire - il n'y a tout simplement pas de méthode intégrée, afaik. Bien que je sois entièrement d'accord avec la déclaration de Dan sur le mode d'insertion par rapport au mode normal, vous pouvez bien sûr simplement définir un mappage du mode d'insertion, voir ": help imap" qui fait tout ce que vous voulez réaliser si vous avez vraiment besoin des fonctionnalités en mode d'insertion.
user55400
13

Pour supprimer le mot entier, votre curseur est diw
activé. Pour supprimer le mot entier, votre curseur est activé et vous mettre en mode insertion ciw
si vous ne voulez pas supprimer le mot entier mais supprimez d'où vous êtes.dw/cw

Naseeruddin VN
la source
8

Puisqu'il y a tellement de façons de supprimer un mot, illustrons-les.

En supposant que vous modifiez:

foo-bar quux

et appeler une commande alors que le curseur est sur la barre 'a' dans ':

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
la source
5

Le mode d'insertion n'a malheureusement pas une telle commande. Dans VIM, pour supprimer le mot entier sous le curseur, vous pouvez taper viwden mode NORMAL. Ce qui signifie " V isual-block I nner W ord D elete". Utilisez des majuscules Wpour inclure la ponctuation.

mycelo
la source
3

La réponse acceptée échoue lorsque vous essayez de répéter la suppression de mots, essayez plutôt cette solution:

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

Il mappe CTRL-BackSpace, fonctionnant également en mode normal.


la source
J'aime mieux cette réponse juste parce qu'elle fonctionne également en mode normal.
sivabudh
2

Pour supprimer une certaine quantité de caractères avant le curseur, vous pouvez utiliser X. Pour supprimer un certain nombre de mots après le curseur, vous pouvez utiliser dw (plusieurs mots peuvent être supprimés en utilisant 3dw pour 3 mots par exemple). Pour supprimer autour du curseur en général, vous pouvez utiliser daw.

John T
la source
2

Dans l'ancien vi, b déplace le curseur au début du mot avant curseur, wdéplace le curseur au début du mot après curseur, edéplace le curseur à la fin du mot après curseur et dwsupprime du curseur à la fin du mot.

Si vous tapez wbdw, vous supprimez le mot autour du curseur, même si le curseur se trouve au début ou à la fin du mot. Notez que les espaces après un mot sont considérés comme faisant partie du mot à supprimer.

mouviciel
la source
2

Pas vraiment sûr de votre utilisation de "avant" et "après", mais avez-vous essayé

dw

?

Edit: je suppose que vous cherchez quelque chose à utiliser en mode insertion. Curieusement, il n'y a rien dans la documentation, ctrl-w semble être tout ce qu'il y a.

innaM
la source
2

J'ai fait deux mappages afin que je puisse obtenir une cohérence en mode insertion et hors mode insertion.

:map <'Key of your choice'> caw

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

userFog
la source
0

Je voudrais supprimer non seulement le mot avant le curseur, mais aussi le mot après ou autour du curseur.

Dans ce cas, la solution proposée par OP (c'est-à-dire en utilisant <c-w>) peut être combinée avec la réponse acceptée pour donner:

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

alternativement (solution plus courte):

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

Exemple d'entrée:

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

Production:

word1 word4
sergio
la source