momo zone

调核人的blog

[转]vim的自动补全

Vim 一共提供了 15 种自动补全的模式(:help ins-completion)。其中有两种的补全列表内容与另外两种相同,只是排序不同,这 15 种模式:

1 文字编辑用的 3 种:

—- 文字编辑显然是不用 Vim 的,所以这三种模式比较悲催,我从没用过:

K 模式    (Vim 默认: CTRL-X CTRL-K) — 字典补全,查找字典文件中的匹配单词,组成补全列表
H 模式    (Vim 默认: CTRL-X CTRL-T) — 分类补全,查找分类文件(thesaurus 文件)中的匹配单词,组成补全列表
S 模式    (Vim 默认: CTRL-X s)        — 拼写建议

2 Vim 牛人用的两种:

—- 自定义的,我也没用过:

O 模式    (Vim 默认: CTRL-X CTRL-O) — 全能补全,由一个自定义函数生成补全列表
U 模式    (Vim 默认: CTRL-X CTRL-U) — 自定义补全,也是由自定义函数生成补全列表

3 所有人都喜欢的四种:

—- 我用来应付 99% 的情况:

n 模式    (Vim 默认: CTRL-N)        — 关键字补全,查找 ‘complete’ 选项指定文件中的匹配单词,组成补全列表
N 模式    (Vim 默认: CTRL-X CTRL-N) — 关键字补全,查找当前 buffer 里的匹配单词,组成补全列表

另外两种: p 模式与 P 模式,分别与 n 模式和 N 模式相同,只是补全列表中候选词的排序相反。

4 程序员用的三种:

    T 模式    (Vim 默认: CTRL-X CTRL-]) — tag 补全,查找 tag 中的匹配单词,组成补全列表
    I 模式    (Vim 默认: CTRL-X CTRL-I) — 头文件补全,查找当前 buffer 和 include file 中的匹配单词,组成补全列表
D 模式    (Vim 默认: CTRL-X CTRL-D) — 定义补全,查找当前 buffer 与 include file 中匹配的名称定义,组成补全列表

5 特殊语境下专用的三种:

—- 还好,偶尔用一用 …

V 模式    (Vim 默认: CTRL-X CTRL-V) — Vim 补全,查找 Vim 的命令名, 函数名等等,组成补全列表
F 模式    (Vim 默认: CTRL-X CTRL-F) — 文件名补全,查找匹配的路径或文件名,组成补全列表

L 模式    (Vim 默认: CTRL-X CTRL-L) — 整行补全,查找 ‘complete’ 选项指定文件中匹配的整行内容,组成补全列表

问题1 用O模式需要在.vimrc中设置:

set omnifunc=ccomplete#Complete

问题2 T模式需要tags文件已经排序,奇怪的是内核的make tags竟然没有排序,改scripts/tags.sh:

xtags()
{
	if $1 --version 2>&1 | grep -iq exuberant; then
		exuberant $1
	elif $1 --version 2>&1 | grep -iq emacs; then
		emacs $1
	else
		all_sources | xargs $1 $2 -a
        fi
}

........................

case "$1" in
	"cscope")
		docscope
		;;

	"gtags")
		dogtags
		;;

	"tags")
		rm -f tags
		xtags ctags --sort=yes
		;;

	"TAGS")
		rm -f TAGS
		xtags etags
		;;
esac

问题3 补全菜单需要修改一下才好用:

“让Vim的补全菜单随着用户输入自动调整匹配内容,否则一旦输入的没有匹配的,就退出了匹配模式
set completeopt+=longest

“离开插入模式后自动关闭菜单
autocmd InsertLeave * if pumvisible() == 0|pclose|endif

“回车选中当前项
inoremap pumvisible() ? “\” : “\”

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: