Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux内核开发的Vim配置_Linux_Vim_Linux Kernel - Fatal编程技术网

Linux内核开发的Vim配置

Linux内核开发的Vim配置,linux,vim,linux-kernel,Linux,Vim,Linux Kernel,内核开发实际上不同于传统的C项目开发(在我看来,作为一个新手)。所以,我总是想知道内核黑客的vim配置是什么 最重要的是如何在vim中导航内核源代码树。。我尝试了ctags,但是效果很差 有人能给我一个线索吗?Linux内核和常规C项目(从开发人员的角度来看)之间的主要区别如下: 内核是一个非常大的项目(所以您应该选择要索引的代码) 它具有依赖于体系结构的代码(并且您一次只对一个特定的体系结构感兴趣;其他体系结构不应该被索引) 它有非常具体的说明,您应该坚持(并且vim应该配置为相应地显示代码

内核开发实际上不同于传统的C项目开发(在我看来,作为一个新手)。所以,我总是想知道内核黑客的vim配置是什么

最重要的是如何在vim中导航内核源代码树。。我尝试了
ctags
,但是效果很差


有人能给我一个线索吗?

Linux内核和常规C项目(从开发人员的角度来看)之间的主要区别如下:

  • 内核是一个非常大的项目(所以您应该选择要索引的代码)
  • 它具有依赖于体系结构的代码(并且您一次只对一个特定的体系结构感兴趣;其他体系结构不应该被索引)
  • 它有非常具体的说明,您应该坚持(并且vim应该配置为相应地显示代码)
  • 它不使用C标准库,而是有自己的类似例程(所以您的索引工具不应该索引libc头)
安装索引工具 要浏览内核代码,我建议使用
cscope
ctags
工具。要安装它们,请运行下一个命令:

$ sudo aptitude install cscope exuberant-ctags
一点解释:

  • cscope
    :将用于导航代码(在功能之间切换等)。它能够跳转到符号定义,找到所有符号用法,等等
  • ctags
    :需要
    Tagbar
    插件(将进一步讨论)和
    Omni completion
    (vim中的自动完成机制);也可用于导航
    ctags
    不像cscope那样是C代码导航的好选择,因为
    ctags
    只能跳转到符号定义(而不是它的调用者)
创建索引数据库 现在,您应该为内核源文件编制索引。这里有两种方法:手动创建索引或使用内核中可用的脚本。如果您不确定哪种方式最适合您,我建议使用内核脚本,因为它在幕后有很多巧妙的技巧(比如忽略未构建的源代码和在结果列表顶部移动头文件)

但首先,为您的体系结构/电路板配置和构建内核,构建后的文件可用于改进索引过程

使用
scripts/tags.sh编制索引
内核有非常好的脚本(
scripts/tags.sh
)来创建内核索引数据库。应该使用
makecscope
maketags
规则来创建索引,而不是直接运行该脚本

例如:

$ make O=. ARCH=arm SUBARCH=omap2 COMPILED_SOURCE=1 cscope tags
在哪里

  • O=。
    -使用绝对路径(如果您希望在内核目录之外加载创建的cscope/ctags索引文件,例如用于开发树外内核模块,则非常有用)。如果您想使用相对路径(即,只在kerneldir中进行开发),只需省略该参数即可
  • ARCH=…
    -选择要索引的CPU体系结构。有关参考信息,请参见
    arch/
    下的目录。例如,如果
    ARCH=arm
    ,则
    ARCH/arm/
    目录将被索引,其余的
    ARCH/*
    目录将被忽略
  • subrach=…
    -选择要索引的子架构(即与板相关的文件)。例如,如果
    subrach=omap2
    ,只有
    arch/arm/mach-omap2/
    arch/arm/plat-omap/
    目录将被索引,其余机器和平台将被忽略
  • COMPILED\u SOURCE=1
    -仅为编译文件编制索引。您通常只对构建(因此编译)中使用的源文件感兴趣。如果还想为未生成的文件编制索引,只需省略此选项
  • cscope
    -创建cscope索引的规则
  • 标记
    -生成ctags索引的规则
手动索引 内核脚本(
tags.sh
)可能无法正常工作,或者您可能希望对索引过程有更多的控制。在这些情况下,您应该手动为内核源编制索引

有关手动索引的见解来自

首先,您需要创建
cscope.files
文件,该文件将列出您要索引的所有文件。例如,我正在使用next命令列出ARM体系结构(
arch/ARM
)的文件,特别是OMAP平台(不包括其他平台以方便导航):

find$dir\
-路径“$dir/arch*”-prune-o\
-路径“$dir/tmp*”-prune-o\
-路径“$dir/Documentation*”-prune-o\
-路径“$dir/scripts*”-prune-o\
-路径“$dir/tools*”-prune-o\
-路径“$dir/include/config*”-prune-o\
-路径“$dir/usr/include*”-prune-o\
-f型\
-非-名称'*.mod.c'\
-名称“*[chsS]”-print>cscope.files
查找$dir/arch/arm\
-路径“$dir/arch/arm/mach-*”-prune-o\
-路径“$dir/arch/arm/plat-*”-prune-o\
-路径“$dir/arch/arm/configs”-修剪-o\
-路径“$dir/arch/arm/kvm”-修剪-o\
-路径“$dir/arch/arm/xen”-修剪-o\
-f型\
-非-名称'*.mod.c'\
-名称“*[chsS]”-打印>>cscope.files
查找$dir/arch/arm/mach-omap2/\
$dir/arch/arm/plat omap/\
-f型\
-非-名称'*.mod.c'\
-名称“*[chsS]”-打印>>cscope.files
对于x86体系结构(
arch/x86
),可以使用以下内容:

find$dir\
-路径“$dir/arch*”-prune-o\
-路径“$dir/tmp*”-p
$ cscope -b -q -k
$ ctags -L cscope.files
$ rm -f cscope.files
- cscope.in.out
- cscope.out
- cscope.po.out
- tags
execute pathogen#infect()
execute pathogen#infect()
syntax on
filetype plugin indent on
$ git clone https://github.com/joe-skb7/cscope-maps.git ~/.vim/bundle/cscope-maps
:cs f g kmalloc
:cs f t struct device {
:cs add /path/to/your/kernel/cscope.out
:set tags=/path/to/your/kernel/tags
" 80 characters line
set colorcolumn=81
"execute "set colorcolumn=" . join(range(81,335), ',')
highlight ColorColumn ctermbg=Black ctermfg=DarkRed
" 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()
" 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://stackoverflow.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
set t_Co=256
set background=dark
colorscheme hybrid