You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 场景1测试:
    原内容(|代表光标):

    hello this is a line | 
    

    按<C-BS>后:

    hello this is a line| 
    
  2. 场景2测试:
    原内容:

    hello this is a line| 
    

    按<C-BS>后:

    hello this is a | 
    

内容的提问来源于stack exchange,提问作者Rian Rizvi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:05:52