设置完成+ = k [文件]不适用于整行完成?

时间:2015-03-28 15:55:32

标签: vim

我的~/.bash_history包含sudo apt-get installaplay foo.wav等行。我认为如果我可以在编写shell脚本时使用这些行来完成整行,这将会很方便。

:h compl-whole-line说:

  

CTRL-X CTRL-L
  向后搜索以。开头的行             与之前的当前行中的字符相同             光标。缩进被忽略。匹配线是             插在光标前面。             **'完整'选项用于决定哪些缓冲区             搜索匹配。既加载又卸载             使用缓冲区。**

请注意我插入的星号。 :h 'complete'说:

 k      k{dict} scan the file {dict}.  Several "k" flags can be given,
        patterns are valid too.  For example: >
        :set cpt=k/usr/dict/*,k~/spanish

所以我认为:set complete+=k~/.bash_history会胜任这项工作。它没有。

使用

启动vim
$ vim -u NONE -N

然后

:set complete+=k~/.bash_history
:set complete?
" complete=.,w,b,u,t,i,k~/.bash_history

,我进入插入模式(i),然后输入

su<C-x><C-l>

,vim说Whole line completion (^L^N^P) Pattern not found。完成是为单词,所以当我键入

su<C-p>
建议

sudo

我错过了什么?如何在没有:sp ~/.bash_history的情况下使用我的历史记录进行整行完成?

1 个答案:

答案 0 :(得分:2)

set complete+=k[file]与行完成无关:您提供给它的任何文件都只会被字典完成<C-x><C-k>)和用作来源关键字完成<C-n> / <C-p>)。

:help i_ctrl-x_ctrl-l很明确:行完成仅适用于在加载和卸载缓冲区中找到的行。由于~/.bash_history未作为缓冲区加载,因此行完成显然永远将其用作来源。

所以是的,唯一的实用解决方案是加载该文件。

:sp ~/.bash_history并不是最佳选择,因为a)它在物理上和缓冲区列表中占用了太多空间,并且b)它需要太多的击键。

&#34;太多的空间&#34; 部分问题可以通过更合适的命令轻松解决:

:badd ~/.bash_history

&#34;太多的键击&#34; 部分问题可以通过自动命令解决,每次编辑shell脚本时都会运行上面的命令:

augroup shell
    autocmd!
    autocmd BufNewFile,BufRead *.sh badd ~/.bash_history
augroup END