原 文: http://www.vim.org/tips/tip.php?tip_id=102 翻 译: Peng Xiaoyu peng.xiaoyu@gmail.com 修 订: 更新日期: 2006-05-22 VimTip 102: 智能tab补全 ----------------------------------------- 我习惯使用键进行补全,可是编辑源程序时,不能仅仅映射键到自动补全,因为有时我需要的是真正的。因为后者总是出现在一行的开始,或者在;号后面。所以我发现下面的东西非常有用。 下面是你应该怎样在插入模式下使用键补全,而在行首或前一个字符不是关键字时仍然能正常工作 将下面的脚本放到你的脚本文件夹中,或者.vimrc中: 这个函数能够通过判断上下文来返回或者 function InsertTabWrapper() let col = col('.') - 1 if !col || getline('.')[col - 1] !~ '\k' return "\" else return "\" endif endfunction 然后就是适当的映射 inoremap =InsertTabWrapper() 这里有个小技巧就是在插入模式下使用=,使得你能够不离开插入模式而调用函数。 相关评论: (译者:推荐这个) ------------------------------------------------- 在:help ins-completion里,有下面一段设置: function! CleverTab() if strpart( getline('.'), 0, col('.')-1 ) =~ '^\s*$' return "\" else return "\" endfunction inoremap =CleverTab() 它工作正常,但是没有使用vim7的omni-completion。 为了在omni-completion有效时优先使用omni-completion,应该是下面这样 function! CleverTab() if pumvisible() return "\" endif if strpart( getline('.'), 0, col('.')-1 ) =~ '^\s*$' return "\" elseif exists('&omnifunc') && &omnifunc != '' return "\\" else return "\" endif endfunction inoremap =CleverTab()