删除向后技巧

  • 如何删除左边的单词?换句话说,当光标位于单词的末尾时,删除该单词。
  • 如何删除行首的字符?
  • 如何删除到左边的第一个空格?

  • 还有其他关于删除单词的把戏吗?

69474 次浏览

在命令模式下:

  1. bdw,后退删除字。
  2. d^(到第一个非空格) ,d0(到第一个字符)
  3. BdW(转到第一个空格删除到下一个空格)

(社区维基,请随意入侵)

在插入模式:

  • ^ w
  • ^ u
  • 无法从我的脑海中回答出来; -)

否则:

  • DW
  • V0x
  • 无法从我的脑海中回答出来; -)

/ <CR>x

(向前搜索一个空格,点击回车到那里,x 删除)

也许有更神奇的方法,但我不知道。

  1. db(如果光标在单词后面)或 bdw
  2. d0(如果要删除第一个非空字符,则为 d^)
  3. dEdtSpace删除到第一个空格或 d/\sEnter删除到下一个空格字符。

剪辑

因为问题已经被修改,3被删除到第一个空白字符 在左边,我的答案应该改为:

  1. dBdShiftTSpace要删除回第一个空格或 d?\sEnter要删除回前一个空格字符。

参见:

:help motion.txt
:help WORD

一般来说,d < motion > 会在 < motion > 之后从当前位置删除到结束位置。这意味着:

  1. D < left 箭头 > 将删除当前字符和左字符
  2. D $将从当前位置删除到行尾
  3. D ^ 将从当前向后删除到第一个非空白字符
  4. D0将从当前向后删除到行首
  5. Dw 删除从当前词尾到当前词尾的当前值(包括尾随空格)
  6. Db 删除当前单词的当前到当前单词的开头

阅读 这个来学习所有可以与“ d”命令结合使用的内容。

为了回答第三点,diwdaw是非常好的。

这种情况我经历过很多次。我想去掉第10行中的所有空格,这样它就会和逗号后面的第9行连接起来。

enter image description here

这基本上是 VIM 中的一个简单的行连接。

kJ完成了这个任务(请看下面)

Vim Join Lines

更新: 看到很多人喜欢我在这里提到的一些附加技巧,一定要检查底部的“其他(酷)边界部分”

我觉得没有一个答案是完整的:

通常,您通常使用 d<motion>启动删除操作,很少使用 x

注意: 如果没有指定 N,vim 的行为就像 N=1(删除一个字符)

离散字符:

删除右侧的 N 个字符

删除左侧的 N 个字符

删除右侧的 N 个字符

词语界限:

注意: 前面/后面的第一个单词是光标下面的单词

从前面第 N 个单词的开头删除到当前位置

从当前位置删除后面的第 N 个单词

d<N>e相同,但是是 包括尾随的空格

diw-删除光标下的整个单词

diw相同,但是是 包括尾随的空格

线条边界:

从行首删除到当前位置

从第一个非空白字符中删除到当前位置

从当前位置删除到行尾

其他(冷却)边界:

这些技巧即使是经验丰富的 vim 用户通常也不知道,但它们可能是 vim 中最强大的工具之一。

di(di)-如果你位于括号范围内的任何地方,即 (int a, int b, int c),删除括号之间的所有内容,留下 ()。在更改函数原型、条件、循环等时非常有用。

di{di}-与上面的相同,但删除花括号范围内的所有内容。对于轻松地更改方法实现非常有用。

di[di]-你明白我的意思,对吧? ;)

dit-删除标记的内容。例如,给定 <a href="..."><img src="smiley.gif"></a>,如果您将光标放在 <a...>标记中并按下 dit,它将删除整个 <img...>部分(感谢@Eric 提到这一点)。

其他重要提示:

以防万一你不知道,每个以 d开始的序列都可以用 c代替删除,然后直接进入插入模式!

db将向后删除到单词的末尾,但是它将字符保留在光标下面。 因此,如果光标位于单词的最后一个字符,db将删除除最后一个字符之外的所有字符。

要删除光标下的字符,您可以将 db重新映射到 ldb,这会在删除之前移动光标,从而捕获最后一个位。

nnoremap db ldb

它工作得很好,除非在光标的原始位置后有一个空格(这个空格将被留下)。

另一个选择是使用 dge,它会向后删除到单词的末尾——但是由于它是一个包含性的动作,所以它也会删除前一个单词的第一个字符。

daw可以很好地处理所有的空格和周围的单词,但总是会删除整个单词,即使不是在最后一个字符。

我找到的最好的解决办法是写我的小脚本,它能巧妙地处理各种事情:

" Map db and dB to using the function
" Allows a smarter db
nnoremap db :call DeleteBackWord(0)<CR>
" Allows a smarter dB
nnoremap dB :call DeleteBackWord(1)<CR>


function! DeleteBackWord(capital_mode)
" Gets the character after the cursor
let l:next_char = getline(".")[col(".")]
" Check if it's a whitespace
if l:next_char !~# '\S'
" whitespace, delete around word
if a:capital_mode == 0
call feedkeys('daw', 'n')
else
call feedkeys('daW', 'n')
endif
else
" NOT whitespace, go 1 char right, then delete backward
if a:capital_mode == 0
call feedkeys('ldb', 'n')
else
call feedkeys('ldB', 'n')
endif
endif
endfunction

这段代码甚至区分了删除单词和 WORDS。

我最喜欢的两个 vi delete 命令是:

dt<char>删除到 dT<char>向后删除到

这对于处理标点符号特别有用,但也可以通过使用 dt<space>dT<space>快速删除单词。

正在寻找这个,伟大的答案,这里有两个更多的技巧,伙计们:

  1. vbdvbx-视觉后删除
  2. vbc-视觉回变