Vim Linux 内核开发的配置
Vim configuration for Linux kernel development
内核开发实际上不同于传统的C项目开发(我认为,作为新手)。所以,我一直想知道内核黑客的vim配置是什么。
最重要的是如何在 vim 中导航内核源代码树。我试过 ctags
,但是,它工作得非常糟糕。
有人可以给我线索吗?
Linux 内核和常规 C 项目(从开发人员的角度来看)的主要区别如下:
- 内核是一个很大的工程(所以你应该选择要索引的代码)
- 它有依赖架构的代码(你一次只对一种特定的架构感兴趣;其他架构不应该被索引)
- 它有非常具体的 coding style 你应该坚持(并且 vim 应该配置为相应地显示代码)
- 它不使用 C 标准库,而是有自己类似的例程(所以你的索引工具不应该索引 libc headers)
正在安装索引工具
为了浏览内核代码,我建议使用 cscope
和 ctags
工具。要安装它们 运行 下一个命令:
$ sudo aptitude install cscope exuberant-ctags
一点解释:
cscope
:将用于导航代码(在功能之间切换等)。它能够跳转到符号定义,查找所有符号用法等
ctags
:Tagbar
插件(将进一步讨论)和 Omni completion
(vim 中的自动完成机制)需要;也可用于导航。 ctags
不像 cscope 那样是 C 代码导航的好选择,因为 ctags
只能跳转到符号定义(不能跳转到它的调用者)。
正在创建索引数据库
现在你应该索引你的内核源文件。这里有两种方法:手动创建索引或使用内核中可用的脚本。如果你不确定哪种方式最适合你,我建议使用内核脚本,因为它在幕后做了很多巧妙的技巧(比如忽略 non-built 源并将 header 文件移动到顶部结果列表)。
但首先,为您的 architecture/board 配置和构建内核,因为构建的文件稍后可用于改进索引过程。
索引 scripts/tags.sh
内核有非常好的脚本 (scripts/tags.sh
) 用于创建内核索引数据库。应该使用 make cscope
和 make tags
规则来创建索引,而不是 运行 直接使用该脚本。
示例:
$ make O=. ARCH=arm SUBARCH=omap2 COMPILED_SOURCE=1 cscope tags
哪里
O=.
- 使用绝对路径(如果你想在内核目录之外加载创建的 cscope/ctags 索引文件很有用,例如用于 out-of-tree 内核模块的开发)。如果你想使用相对路径(即你将只在内核目录中进行开发),只需省略该参数
ARCH=...
- select CPU 架构被索引。请参阅 arch/
下的目录以供参考。例如,如果 ARCH=arm
,则 arch/arm/
目录将被索引,其余 arch/*
个目录将被忽略
SUBARCH=...
- select sub-architecture(即 board-related 个文件)被索引。例如,如果 SUBARCH=omap2
,只有 arch/arm/mach-omap2/
和 arch/arm/plat-omap/
目录将被索引,其余机器和平台将被忽略。
COMPILED_SOURCE=1
- 仅索引编译文件。您通常只对构建(因此编译)中使用的源文件感兴趣。如果您还想索引未构建的文件,只需省略此选项。
cscope
- 创建 cscope 索引的规则
tags
- 创建 ctags 索引的规则
手动索引
内核脚本 (tags.sh
) 可能无法正常工作,或者您可能希望更好地控制索引过程。在这些情况下,您应该手动索引内核源代码。
关于手动索引的见解来自 here。
首先您需要创建 cscope.files
文件,该文件将列出您要索引的所有文件。例如,我正在使用下一个命令列出 ARM 体系结构 (arch/arm
) 的文件,特别是 OMAP 平台(不包括其余平台以保持导航方便):
find $dir \
-path "$dir/arch*" -prune -o \
-path "$dir/tmp*" -prune -o \
-path "$dir/Documentation*" -prune -o \
-path "$dir/scripts*" -prune -o \
-path "$dir/tools*" -prune -o \
-path "$dir/include/config*" -prune -o \
-path "$dir/usr/include*" -prune -o \
-type f \
-not -name '*.mod.c' \
-name "*.[chsS]" -print > cscope.files
find $dir/arch/arm \
-path "$dir/arch/arm/mach-*" -prune -o \
-path "$dir/arch/arm/plat-*" -prune -o \
-path "$dir/arch/arm/configs" -prune -o \
-path "$dir/arch/arm/kvm" -prune -o \
-path "$dir/arch/arm/xen" -prune -o \
-type f \
-not -name '*.mod.c' \
-name "*.[chsS]" -print >> cscope.files
find $dir/arch/arm/mach-omap2/ \
$dir/arch/arm/plat-omap/ \
-type f \
-not -name '*.mod.c' \
-name "*.[chsS]" -print >> cscope.files
对于 x86 架构 (arch/x86
) 你可以使用这样的东西:
find $dir \
-path "$dir/arch*" -prune -o \
-path "$dir/tmp*" -prune -o \
-path "$dir/Documentation*" -prune -o \
-path "$dir/scripts*" -prune -o \
-path "$dir/tools*" -prune -o \
-path "$dir/include/config*" -prune -o \
-path "$dir/usr/include*" -prune -o \
-type f \
-not -name '*.mod.c' \
-name "*.[chsS]" -print > cscope.files
find $dir/arch/x86 \
-path "$dir/arch/x86/configs" -prune -o \
-path "$dir/arch/x86/kvm" -prune -o \
-path "$dir/arch/x86/lguest" -prune -o \
-path "$dir/arch/x86/xen" -prune -o \
-type f \
-not -name '*.mod.c' \
-name "*.[chsS]" -print >> cscope.files
其中 dir
变量可以具有以下值之一:
.
: 如果你只在内核源代码目录中工作;在这种情况下,这些命令应该 运行 来自内核源代码的根目录
- 内核源代码目录的绝对路径:如果你要开发一些out-of-tree内核模块;在这种情况下,脚本可以是来自任何地方的 运行
我正在使用第一个选项 (dir=.
),因为我没有开发任何 out-of-tree 模块。
现在 cscope.files
文件准备就绪后,我们需要 运行 实际索引:
$ cscope -b -q -k
其中 -k
参数告诉 cscope
不要索引 C 标准库(因为内核不使用它)。
现在是时候创建 ctags
索引数据库了。为了加速这个阶段,我们将重用已经创建的 cscope.files
:
$ ctags -L cscope.files
好的,cscope
和ctags
索引数据库已经建好了,你可以删除cscope.files
文件,因为我们不再需要它了:
$ rm -f cscope.files
下一个文件包含索引数据库(对于 cscope
和 ctags
):
- cscope.in.out
- cscope.out
- cscope.po.out
- tags
将它们保存在内核源目录的根目录中。
[=244=vim 插件
注意:我进一步展示了如何使用 pathogen 来处理 Vim 插件。但是现在 Vim 8 发布了,可以使用 native package loading 达到同样的目的。
接下来我们将为 vim 安装一些插件。为了更好地掌握它,我鼓励您使用 pathogen 插件。它允许你只 git clone
vim 插件到你的 ~/.vim/bundle/
并保持它们隔离,而不是在 ~/.vim
目录中混合来自不同插件的文件。
按照 here.
的描述安装 pathogen
别忘了做接下来的事情(正如 link 中所描述的):
Add this to your vimrc
:
execute pathogen#infect()
If you're brand new to Vim and lacking a vimrc
, vim ~/.vimrc
and paste in the following super-minimal example:
execute pathogen#infect()
syntax on
filetype plugin indent on
正在为 vim
安装 cscope 映射
Vim 已经支持 cscope(见 :help cscope
)。您可以使用 :cs f g kfree
等命令跳转到符号或文件。虽然不是很方便。要加快速度,您可以改用快捷方式(这样您就可以将光标放在某个功能上,按一些组合键并跳转到该功能)。为了为 cscope 添加快捷方式,您需要获取 cscope_maps.vim
文件。
要使用 pathogen 安装它,您只需将 this 存储库克隆到您的 ~/.vim/bundle
:
$ git clone https://github.com/joe-skb7/cscope-maps.git ~/.vim/bundle/cscope-maps
现在您应该能够使用快捷方式在 vim 中的函数和文件之间导航。打开一些内核源文件,将键盘光标放在某个函数调用上,然后按 Ctrl+\ 然后按 g。它应该带您进入功能实现。或者它可以向您显示所有可用的函数实现,然后您可以选择使用哪一个: .
对于其余的键映射,请参阅 cscope_maps.vim 文件。
您还可以在 vim 中使用命令,例如:
:cs f g kmalloc
有关详细信息,请参阅 :help cscope
。
ctags 注释
ctags 仍然可以用于导航,例如在查找一些 #define
声明时。您可以将光标放在此定义用法上,然后按 g,然后按 Ctrl+]。有关详细信息,请参阅 this answer。
cscope 注释
下一个技巧可用于在内核中查找结构声明:
:cs f t struct device {
请注意,上述命令依赖于特定的结构声明样式(在内核中使用),因此我们知道结构声明始终采用这种形式:struct some_stuct {
。此技巧可能不适用于其他编码风格的项目。
out-of-tree模块开发笔记
如果您正在开发 out-of-tree 模块,您可能需要从内核目录加载 cscope
和 ctags
数据库。它可以通过 vim 中的下一个命令完成(在命令模式下)。
加载外部 cscope 数据库:
:cs add /path/to/your/kernel/cscope.out
加载外部ctags数据库:
:set tags=/path/to/your/kernel/tags
vimrc
您的 ~/.vimrc
也需要进行一些修改,以便更好地支持内核开发。
首先,让我们用竖线突出显示第 81 列(因为内核编码要求您的行长度最多应保持在 80 个字符):
" 80 characters line
set colorcolumn=81
"execute "set colorcolumn=" . join(range(81,335), ',')
highlight ColorColumn ctermbg=Black ctermfg=DarkRed
如果您还想突出显示 80 多个列,请取消注释第二行。
内核编码风格禁止尾随空格,因此您可能需要突出显示它们:
" Highlight trailing spaces
" http://vim.wikia.com/wiki/Highlight_unwanted_spaces
highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()
内核编码风格
为了vim尊重内核编码风格,你可以拉取准备使用的插件:vim-linux-coding-style.
有用的插件
下一个插件是常用的,所以你会发现它们也很有用:
这些也是有趣的插件,但您可能需要为内核配置它们:
全方位补全
Vim 7(及以上)已经内置了自动完成支持。它调用 Omni completion
。有关详细信息,请参阅 :help new-omni-completion。
Omni 补全在像内核这样的大项目上运行起来相当慢。如果你仍然想要它,你可以启用它添加下一行到你的 ~/.vimrc
:
" Enable OmniCompletion
" http://vim.wikia.com/wiki/Omni_completion
filetype plugin on
set omnifunc=syntaxcomplete#Complete
" Configure menu behavior
" http://vim.wikia.com/wiki/VimTip1386
set completeopt=longest,menuone
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
inoremap <expr> <C-n> pumvisible() ? '<C-n>' :
\ '<C-n><C-r>=pumvisible() ? "\<lt>Down>" : ""<CR>'
inoremap <expr> <M-,> pumvisible() ? '<C-n>' :
\ '<C-x><C-o><C-n><C-p><C-r>=pumvisible() ? "\<lt>Down>" : ""<CR>'
" Use Ctrl+Space for omni-completion
" https://whosebug.com/questions/510503/ctrlspace-for-omni-and-keyword-completion-in-vim
inoremap <expr> <C-Space> pumvisible() \|\| &omnifunc == '' ?
\ "\<lt>C-n>" :
\ "\<lt>C-x>\<lt>C-o><c-r>=pumvisible() ?" .
\ "\"\<lt>c-n>\<lt>c-p>\<lt>c-n>\" :" .
\ "\" \<lt>bs>\<lt>C-n>\"\<CR>"
imap <C-@> <C-Space>
" Popup menu hightLight Group
highlight Pmenu ctermbg=13 guibg=LightGray
highlight PmenuSel ctermbg=7 guibg=DarkBlue guifg=White
highlight PmenuSbar ctermbg=7 guibg=DarkGray
highlight PmenuThumb guibg=Black
" Enable global scope search
let OmniCpp_GlobalScopeSearch = 1
" Show function parameters
let OmniCpp_ShowPrototypeInAbbr = 1
" Show access information in pop-up menu
let OmniCpp_ShowAccess = 1
" Auto complete after '.'
let OmniCpp_MayCompleteDot = 1
" Auto complete after '->'
let OmniCpp_MayCompleteArrow = 1
" Auto complete after '::'
let OmniCpp_MayCompleteScope = 0
" Don't select first item in pop-up menu
let OmniCpp_SelectFirstItem = 0
并使用Ctrl+Space自动补全
养眼颜值
256 色
首先你要确定你的终端支持256色。例如,可以使用 urxvt-256 终端来实现。对于 gnome-terminal
,您只需将下一行添加到 ~/.bashrc
:
export TERM="xterm-256color"
完成后,将下一行放入 ~/.vimrc
:
set t_Co=256
配色方案
现在下载您喜欢 ~/.vim/colors
和 select 的方案 ~/.vimrc
:
set background=dark
colorscheme hybrid
使用哪种配色方案是基于强烈意见的事情。对于初学者,我可能会推荐 mrkn256, hybrid and solarized。
字体
那里有很多适合编程的好字体。 Linux上很多程序员都用Terminus字体,初学者可以试试
知道缺点
vim 中仍然缺少某些功能。
- cscope/ctags 无法使用
include/generated/autoconf.h
中的定义并忽略未构建的代码。对所有代码进行索引以在编码时将其用作参考可能仍然有用。
- 没有宏扩展(嗯,是一些function(基于
gcc -E
),但我不确定是否它会为内核工作)。
据我所知,唯一可以处理这些问题的 IDE 是 Eclipse with CDT。
内核开发实际上不同于传统的C项目开发(我认为,作为新手)。所以,我一直想知道内核黑客的vim配置是什么。
最重要的是如何在 vim 中导航内核源代码树。我试过 ctags
,但是,它工作得非常糟糕。
有人可以给我线索吗?
Linux 内核和常规 C 项目(从开发人员的角度来看)的主要区别如下:
- 内核是一个很大的工程(所以你应该选择要索引的代码)
- 它有依赖架构的代码(你一次只对一种特定的架构感兴趣;其他架构不应该被索引)
- 它有非常具体的 coding style 你应该坚持(并且 vim 应该配置为相应地显示代码)
- 它不使用 C 标准库,而是有自己类似的例程(所以你的索引工具不应该索引 libc headers)
正在安装索引工具
为了浏览内核代码,我建议使用 cscope
和 ctags
工具。要安装它们 运行 下一个命令:
$ sudo aptitude install cscope exuberant-ctags
一点解释:
cscope
:将用于导航代码(在功能之间切换等)。它能够跳转到符号定义,查找所有符号用法等ctags
:Tagbar
插件(将进一步讨论)和Omni completion
(vim 中的自动完成机制)需要;也可用于导航。ctags
不像 cscope 那样是 C 代码导航的好选择,因为ctags
只能跳转到符号定义(不能跳转到它的调用者)。
正在创建索引数据库
现在你应该索引你的内核源文件。这里有两种方法:手动创建索引或使用内核中可用的脚本。如果你不确定哪种方式最适合你,我建议使用内核脚本,因为它在幕后做了很多巧妙的技巧(比如忽略 non-built 源并将 header 文件移动到顶部结果列表)。
但首先,为您的 architecture/board 配置和构建内核,因为构建的文件稍后可用于改进索引过程。
索引 scripts/tags.sh
内核有非常好的脚本 (scripts/tags.sh
) 用于创建内核索引数据库。应该使用 make cscope
和 make tags
规则来创建索引,而不是 运行 直接使用该脚本。
示例:
$ make O=. ARCH=arm SUBARCH=omap2 COMPILED_SOURCE=1 cscope tags
哪里
O=.
- 使用绝对路径(如果你想在内核目录之外加载创建的 cscope/ctags 索引文件很有用,例如用于 out-of-tree 内核模块的开发)。如果你想使用相对路径(即你将只在内核目录中进行开发),只需省略该参数ARCH=...
- select CPU 架构被索引。请参阅arch/
下的目录以供参考。例如,如果ARCH=arm
,则arch/arm/
目录将被索引,其余arch/*
个目录将被忽略SUBARCH=...
- select sub-architecture(即 board-related 个文件)被索引。例如,如果SUBARCH=omap2
,只有arch/arm/mach-omap2/
和arch/arm/plat-omap/
目录将被索引,其余机器和平台将被忽略。COMPILED_SOURCE=1
- 仅索引编译文件。您通常只对构建(因此编译)中使用的源文件感兴趣。如果您还想索引未构建的文件,只需省略此选项。cscope
- 创建 cscope 索引的规则tags
- 创建 ctags 索引的规则
手动索引
内核脚本 (tags.sh
) 可能无法正常工作,或者您可能希望更好地控制索引过程。在这些情况下,您应该手动索引内核源代码。
关于手动索引的见解来自 here。
首先您需要创建 cscope.files
文件,该文件将列出您要索引的所有文件。例如,我正在使用下一个命令列出 ARM 体系结构 (arch/arm
) 的文件,特别是 OMAP 平台(不包括其余平台以保持导航方便):
find $dir \
-path "$dir/arch*" -prune -o \
-path "$dir/tmp*" -prune -o \
-path "$dir/Documentation*" -prune -o \
-path "$dir/scripts*" -prune -o \
-path "$dir/tools*" -prune -o \
-path "$dir/include/config*" -prune -o \
-path "$dir/usr/include*" -prune -o \
-type f \
-not -name '*.mod.c' \
-name "*.[chsS]" -print > cscope.files
find $dir/arch/arm \
-path "$dir/arch/arm/mach-*" -prune -o \
-path "$dir/arch/arm/plat-*" -prune -o \
-path "$dir/arch/arm/configs" -prune -o \
-path "$dir/arch/arm/kvm" -prune -o \
-path "$dir/arch/arm/xen" -prune -o \
-type f \
-not -name '*.mod.c' \
-name "*.[chsS]" -print >> cscope.files
find $dir/arch/arm/mach-omap2/ \
$dir/arch/arm/plat-omap/ \
-type f \
-not -name '*.mod.c' \
-name "*.[chsS]" -print >> cscope.files
对于 x86 架构 (arch/x86
) 你可以使用这样的东西:
find $dir \
-path "$dir/arch*" -prune -o \
-path "$dir/tmp*" -prune -o \
-path "$dir/Documentation*" -prune -o \
-path "$dir/scripts*" -prune -o \
-path "$dir/tools*" -prune -o \
-path "$dir/include/config*" -prune -o \
-path "$dir/usr/include*" -prune -o \
-type f \
-not -name '*.mod.c' \
-name "*.[chsS]" -print > cscope.files
find $dir/arch/x86 \
-path "$dir/arch/x86/configs" -prune -o \
-path "$dir/arch/x86/kvm" -prune -o \
-path "$dir/arch/x86/lguest" -prune -o \
-path "$dir/arch/x86/xen" -prune -o \
-type f \
-not -name '*.mod.c' \
-name "*.[chsS]" -print >> cscope.files
其中 dir
变量可以具有以下值之一:
.
: 如果你只在内核源代码目录中工作;在这种情况下,这些命令应该 运行 来自内核源代码的根目录- 内核源代码目录的绝对路径:如果你要开发一些out-of-tree内核模块;在这种情况下,脚本可以是来自任何地方的 运行
我正在使用第一个选项 (dir=.
),因为我没有开发任何 out-of-tree 模块。
现在 cscope.files
文件准备就绪后,我们需要 运行 实际索引:
$ cscope -b -q -k
其中 -k
参数告诉 cscope
不要索引 C 标准库(因为内核不使用它)。
现在是时候创建 ctags
索引数据库了。为了加速这个阶段,我们将重用已经创建的 cscope.files
:
$ ctags -L cscope.files
好的,cscope
和ctags
索引数据库已经建好了,你可以删除cscope.files
文件,因为我们不再需要它了:
$ rm -f cscope.files
下一个文件包含索引数据库(对于 cscope
和 ctags
):
- cscope.in.out
- cscope.out
- cscope.po.out
- tags
将它们保存在内核源目录的根目录中。
[=244=vim 插件注意:我进一步展示了如何使用 pathogen 来处理 Vim 插件。但是现在 Vim 8 发布了,可以使用 native package loading 达到同样的目的。
接下来我们将为 vim 安装一些插件。为了更好地掌握它,我鼓励您使用 pathogen 插件。它允许你只 git clone
vim 插件到你的 ~/.vim/bundle/
并保持它们隔离,而不是在 ~/.vim
目录中混合来自不同插件的文件。
按照 here.
的描述安装 pathogen别忘了做接下来的事情(正如 link 中所描述的):
Add this to your
vimrc
:execute pathogen#infect()
If you're brand new to Vim and lacking a
vimrc
,vim ~/.vimrc
and paste in the following super-minimal example:execute pathogen#infect() syntax on filetype plugin indent on
正在为 vim
安装 cscope 映射Vim 已经支持 cscope(见 :help cscope
)。您可以使用 :cs f g kfree
等命令跳转到符号或文件。虽然不是很方便。要加快速度,您可以改用快捷方式(这样您就可以将光标放在某个功能上,按一些组合键并跳转到该功能)。为了为 cscope 添加快捷方式,您需要获取 cscope_maps.vim
文件。
要使用 pathogen 安装它,您只需将 this 存储库克隆到您的 ~/.vim/bundle
:
$ git clone https://github.com/joe-skb7/cscope-maps.git ~/.vim/bundle/cscope-maps
现在您应该能够使用快捷方式在 vim 中的函数和文件之间导航。打开一些内核源文件,将键盘光标放在某个函数调用上,然后按 Ctrl+\ 然后按 g。它应该带您进入功能实现。或者它可以向您显示所有可用的函数实现,然后您可以选择使用哪一个:
对于其余的键映射,请参阅 cscope_maps.vim 文件。
您还可以在 vim 中使用命令,例如:
:cs f g kmalloc
有关详细信息,请参阅 :help cscope
。
ctags 注释
ctags 仍然可以用于导航,例如在查找一些 #define
声明时。您可以将光标放在此定义用法上,然后按 g,然后按 Ctrl+]。有关详细信息,请参阅 this answer。
cscope 注释
下一个技巧可用于在内核中查找结构声明:
:cs f t struct device {
请注意,上述命令依赖于特定的结构声明样式(在内核中使用),因此我们知道结构声明始终采用这种形式:struct some_stuct {
。此技巧可能不适用于其他编码风格的项目。
out-of-tree模块开发笔记
如果您正在开发 out-of-tree 模块,您可能需要从内核目录加载 cscope
和 ctags
数据库。它可以通过 vim 中的下一个命令完成(在命令模式下)。
加载外部 cscope 数据库:
:cs add /path/to/your/kernel/cscope.out
加载外部ctags数据库:
:set tags=/path/to/your/kernel/tags
vimrc
您的 ~/.vimrc
也需要进行一些修改,以便更好地支持内核开发。
首先,让我们用竖线突出显示第 81 列(因为内核编码要求您的行长度最多应保持在 80 个字符):
" 80 characters line
set colorcolumn=81
"execute "set colorcolumn=" . join(range(81,335), ',')
highlight ColorColumn ctermbg=Black ctermfg=DarkRed
如果您还想突出显示 80 多个列,请取消注释第二行。
内核编码风格禁止尾随空格,因此您可能需要突出显示它们:
" Highlight trailing spaces
" http://vim.wikia.com/wiki/Highlight_unwanted_spaces
highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()
内核编码风格
为了vim尊重内核编码风格,你可以拉取准备使用的插件:vim-linux-coding-style.
有用的插件
下一个插件是常用的,所以你会发现它们也很有用:
这些也是有趣的插件,但您可能需要为内核配置它们:
全方位补全
Vim 7(及以上)已经内置了自动完成支持。它调用 Omni completion
。有关详细信息,请参阅 :help new-omni-completion。
Omni 补全在像内核这样的大项目上运行起来相当慢。如果你仍然想要它,你可以启用它添加下一行到你的 ~/.vimrc
:
" Enable OmniCompletion
" http://vim.wikia.com/wiki/Omni_completion
filetype plugin on
set omnifunc=syntaxcomplete#Complete
" Configure menu behavior
" http://vim.wikia.com/wiki/VimTip1386
set completeopt=longest,menuone
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
inoremap <expr> <C-n> pumvisible() ? '<C-n>' :
\ '<C-n><C-r>=pumvisible() ? "\<lt>Down>" : ""<CR>'
inoremap <expr> <M-,> pumvisible() ? '<C-n>' :
\ '<C-x><C-o><C-n><C-p><C-r>=pumvisible() ? "\<lt>Down>" : ""<CR>'
" Use Ctrl+Space for omni-completion
" https://whosebug.com/questions/510503/ctrlspace-for-omni-and-keyword-completion-in-vim
inoremap <expr> <C-Space> pumvisible() \|\| &omnifunc == '' ?
\ "\<lt>C-n>" :
\ "\<lt>C-x>\<lt>C-o><c-r>=pumvisible() ?" .
\ "\"\<lt>c-n>\<lt>c-p>\<lt>c-n>\" :" .
\ "\" \<lt>bs>\<lt>C-n>\"\<CR>"
imap <C-@> <C-Space>
" Popup menu hightLight Group
highlight Pmenu ctermbg=13 guibg=LightGray
highlight PmenuSel ctermbg=7 guibg=DarkBlue guifg=White
highlight PmenuSbar ctermbg=7 guibg=DarkGray
highlight PmenuThumb guibg=Black
" Enable global scope search
let OmniCpp_GlobalScopeSearch = 1
" Show function parameters
let OmniCpp_ShowPrototypeInAbbr = 1
" Show access information in pop-up menu
let OmniCpp_ShowAccess = 1
" Auto complete after '.'
let OmniCpp_MayCompleteDot = 1
" Auto complete after '->'
let OmniCpp_MayCompleteArrow = 1
" Auto complete after '::'
let OmniCpp_MayCompleteScope = 0
" Don't select first item in pop-up menu
let OmniCpp_SelectFirstItem = 0
并使用Ctrl+Space自动补全
养眼颜值
256 色
首先你要确定你的终端支持256色。例如,可以使用 urxvt-256 终端来实现。对于 gnome-terminal
,您只需将下一行添加到 ~/.bashrc
:
export TERM="xterm-256color"
完成后,将下一行放入 ~/.vimrc
:
set t_Co=256
配色方案
现在下载您喜欢 ~/.vim/colors
和 select 的方案 ~/.vimrc
:
set background=dark
colorscheme hybrid
使用哪种配色方案是基于强烈意见的事情。对于初学者,我可能会推荐 mrkn256, hybrid and solarized。
字体
那里有很多适合编程的好字体。 Linux上很多程序员都用Terminus字体,初学者可以试试
知道缺点
vim 中仍然缺少某些功能。
- cscope/ctags 无法使用
include/generated/autoconf.h
中的定义并忽略未构建的代码。对所有代码进行索引以在编码时将其用作参考可能仍然有用。 - 没有宏扩展(嗯,是一些function(基于
gcc -E
),但我不确定是否它会为内核工作)。
据我所知,唯一可以处理这些问题的 IDE 是 Eclipse with CDT。