Vim插入模式下如何一键向后删除连续空白/非空白内容?
智能向后删除至前一个单词末尾的Vim配置
兄弟,你这个需求太戳我了!Vim里确实没内置这么精准的一键操作,但咱们完全可以自己动手配置,完美实现你要的两种场景~
需求回顾
你想要的是在插入模式下按一个键,实现两种智能删除:
- 场景1:光标处于连续空白中(比如
hello this is a line |),删除后光标贴到前面单词的末尾:hello this is a line| - 场景2:光标前是非空白内容(比如
hello this is a line|),删除后回到前一个单词的末尾:hello this is a |
实现配置
把下面的代码加到你的~/.vimrc(Neovim用户加在~/.config/nvim/init.vim)里就行:
" 映射Ctrl+退格键为智能删除键,可换成你习惯的按键比如<M-d> inoremap <silent> <C-BS> <C-o>:call SmartDelete()<CR> function! SmartDelete() let current_line = getline('.') let cursor_col = col('.') " 获取光标之后的所有内容 let after_cursor = strpart(current_line, cursor_col - 1) " 判断光标后是否全是空白 if after_cursor =~ '^\s*$' " 跳到前面最近的空格前的字符,再删除到行尾的所有空白 execute 'normal! T ' execute 'normal! D' else " 删除光标前的整个单词,再移到前一个单词后的空格位置 execute 'normal! db' execute 'normal! l' endif endfunction
配置解释
- 我们用
<C-BS>(Ctrl+退格)作为触发键,你可以改成自己顺手的键,比如<M-d>(Alt+d)只要替换<C-BS>就行。 SmartDelete函数会自动判断当前场景:- 如果光标后面全是空白,就用
T跳到前面最近的空格前的字符,再用D删除从当前位置到行尾的所有内容,直接清掉所有后续空白。 - 如果光标后面不是空白,就用
db删除光标前的整个单词,再用l把光标移到前一个单词后面的空格位置,刚好符合你的需求。
- 如果光标后面全是空白,就用
效果验证
场景1测试:
原内容(|代表光标):hello this is a line |按
<C-BS>后:hello this is a line|场景2测试:
原内容:hello this is a line|按
<C-BS>后:hello this is a |
内容的提问来源于stack exchange,提问作者Rian Rizvi
相关产品推荐
相关产品推荐

