在VIM中删除光标之后或周围的单词


211

我现在VIM从TextMate 切换到。我发现^+W在INSERT模式下非常有用。但是,我不仅要删除光标之前的单词,还要删除光标之后或周围的单词。

我做了一些谷歌搜索,但是我唯一能找到的就是^+W删除光标之前的单词。

Answers:


77

您应该做的是为一系列命令创建一个具有特定键的imap,在这种情况下,这些命令将使您进入正常模式,删除当前单词,然后将您重新插入:

:imap <C-d> <C-[>diwi

29
“:h diw”提供了许多有用的技巧!
2011年

12
使用<Co>的奖励积分。它在“普通”模式下执行一个命令,然后直接跳回“插入”,因此类似的操作imap <C-d> <C-o>diw也可以。它也不会创建撤消点,<Esc>通常会这样做。
zelk 2012年

<Co>在插入模式下开始了我的一天:)
Lusk116 '16

540

正常模式:

daw : delete the word under the cursor    
caw : delete the word under the cursor and put you in insert mode 

124
对我来说,将其视为daw是很有帮助的:删除一个单词,然后caw:更改一个单词。
welbornio 2014年

1
上帝,我一直在使用da)ci)但从未想到!

1
那是金杰里!金!我映射那些孩子在我的.vimrc文件,像这样: nmap <Leader>d dawnmap <Leader>c caw
racl101

1
可能值得一提的aw是对象选择的一个例子。您可以在可视模式下尝试对象选择,以查看其效果:vimdoc.sourceforge.net/htmldoc/motion.html#object-select
crantok

103

我认为只是 daw

daw - delete a word

1
我知道这a是一个命令,Append text after the cursor [count] times.但是如何daw工作?
宪法2014年

3
@REACHUS初始字符d指示您将要“删除”。“ a”是一种参数,指定删除要包含定界符。最后,“ w”(parameter如果愿意的话,另一个)指定word将删除一个单位。
vlad-ardelean

2
dw和之间有什么区别daw
AK_17年

5
@AK_响应较晚,但如果您在单词的中间,dw则会从光标删除到单词的结尾,而daw会删除整个单词以及空格。diw将删除整个单词而不会触碰周围的空格。
德米特斯(Dmiters)

67

以下内容适用于普通模式:我同意Dan Olson的回答,对于大多数删除操作,您可能应该处于普通模式。下面有更多详细信息。

如果光标位于单词:内
diw,则删除该单词(不包含空格),
daw以删除单词周围(在下一个单词之前包含空格)。

如果光标位于单词的开头,请按dw

这可以乘以移动的常用数字来乘以,例如2w向前移动2个单词,因此d2w删除了两个单词。

插入模式^ w
在vim中使用hjkl进行移动的想法是,将手放在主行上会更有效率。单词^ w可以很好地快速删除单词。如果您已进入插入模式,请输入一些文本,然后使用箭头键结束出现在单词中间的单词,这与本行哲学背道而驰。
如果你在正常模式和想改变的话,你可以简单地使用c(变更),而不是d(删除),如果你想彻底改变这个词,并插入模式重新进入,不必按i找回打字。



23

要删除两个空格之间的所有字符,请在正常模式下:

daW

要删除一个单词:

daw 

20

看起来没有任何内置方法可以在插入模式下执行此操作,这就是问题所在。其他一些答案对于正常模式是正确的,并且指出可以创建自定义映射以在插入模式下添加功能。

老实说,您可能应该在普通模式下执行大部分删除操作。^ W很清楚,但是我不确定我能想到的是我宁愿这样做而不是进入正常模式并拥有更强大的删除命令的情况。

Vim通过这种方式与许多其他编辑器(包括TextMate)有很大的不同。如果您有效率地使用它,则可能会发现在插入模式下您不会花费太多时间。


1
我使用^ wa很多,主要是当我输错单词时-而不是返回并添加缺少的字母/等,而是删除整个内容并重新开始。.进入普通模式只是删除一个单词似乎是一种浪费例如,“ example wrd [^ w] word”比“ example wrd [^ c] [dw] [i] word”少击键
dbr

1
dbr:vim支持,但是他并没有要求做基本的^ W行为。他要求在插入模式下的中间删除所有单词,这对于vim来说是一种奇怪的情况,因此没有命令可以执行此操作。如果确实需要功能,可以始终将^ Q绑定到<Esc> ciw。噢,[^ c] [dw] [i]中的[i]也是多余的,您可以使用[^ c] [
ciw

4
“看起来好像没有办法...”-嗯,有无数种方法可以做到-没有内置的方法,afaik。虽然我完全同意Dan关于插入模式与普通模式的说法,但是您当然可以简单地定义插入模式映射,如果真正需要插入模式的功能,请参见“:help imap”,它可以完成您想实现的一切。
user55400 2009年

13

删除光标所在的整个单词要删除光标所在diw
的整个单词并使其处于插入模式,请使用以下方式:ciw
如果您不想删除整个单词,而是从当前位置删除dw/cw


8

由于删除单词的方法有很多,因此我们来举例说明。

假设您编辑:

foo-bar quux

并在光标位于“栏”中的“ a”上时调用命令:

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

5

不幸的是,插入模式没有这样的命令。在VIM中,要删除光标下的整个单词,可以viwd在NORMAL模式下键入。这意味着“ V isual块 nner W¯¯ ORD d elete”。使用大写字母W来包含标点符号。


3

尝试重复删除单词时,接受的答案失败,请尝试以下解决方案:

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

它映射CTRL-BackSpace,也可以在正常模式下工作。


我更喜欢此答案,因为它也可以在正常模式下工作。
sivabudh 2011年

2

要删除光标前面的一定数量的字符,可以使用X。要删除光标后面的一定数量的单词,可以使用dw(例如,可以使用3dw删除3个单词来删除多个单词)。通常,要删除光标周围的内容,可以使用daw。


2

在旧版vi中,b将光标移动到光标之前的单词的开头,将光标w移动到光标之后的单词的开头,将光标移动到光标之后的单词e的结尾,然后dw从光标删除到单词的结尾。

如果键入wbdw,则删除光标周围的单词,即使光标位于单词的开头或结尾。请注意,单词后的空白被认为是要删除的单词的一部分。


2

不确定您使用“之前”和“之后”,但是您是否尝试过

dw

编辑:我想你正在寻找在插入模式下使用的东西。奇怪的是,在文档中什么也找不到,ctrl-w似乎已经全部存在。


2

我做了两个映射,这样我就可以在插入和退出插入模式下保持一致。

:map <'Key of your choice'> caw

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


0

我不仅要删除光标之前的单词,还要删除光标之后或周围的单词。

在那种情况下,OP提出的解决方案(即使用<c-w>)可以与公认的答案结合使用以得出:

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

或者(较短的解决方案):

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

输入样例:

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

输出:

word1 word4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.