# vimkernel **Repository Path**: SeaflyGitee/vimkernel ## Basic Information - **Project Name**: vimkernel - **Description**: vim for kernel source code - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 2 - **Created**: 2022-01-21 - **Last Updated**: 2025-08-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 获取和安装vimkernel ## 下载 ```bash git clone https://gitee.com/SeaflyGitee/vimkernel ``` ## 安装 ```bash cd vimkernel bash setup.sh ``` # 特点 - vimkernel 名称由来,是由于本人常用它来阅读和编辑内核代码。 - 对于一般工程,直接 VSCode 即可,对于Linux下的大工程且电脑性能资源不是很厉害的情况下,vimkernel 可能适合你。 - 相比其他编辑器,对于代码量庞大的 C/C++ 项目,占用内存少,可以快速完成代码检索和阅读。 - 本人常用它来阅读和编辑Linux内核代码,因为内核代码量非常大,其他IDE不是太吃资源就是检索功能失效。 - 支持结构体成员补全,即当敲入 ```结构体指针实例->``` 时会自动弹出补全提示,大工程也能正常工作。 - 当执行保存写入文件操作时,会自动更新工程数据并自动载入工程数据。 - 自动保存窗口布局,自动加载窗口布局; - 自动保持```:pwd``` 或者 ```getcwd()``` 始终在顶层目录,这是为了保证tags相关的功能正常使用。 - 核心辅助工具不多,就只有 ctags 和 cscope。 # 工程文件建立 ```bash # cd到源代码目录,比如:/home/mdl/workspace/project/linux-kernel cd /home/mdl/workspace/project/linux-kerne # 生成配置文件: vim_project/config.ini vim_project_update.elf `pwd` config # 加载配置文件,生成工程数据,或者更新工程数据 vim_project_update.elf `pwd` # 然后就直接打开vim了,一般情况下,我习惯打开顶层某个文本文件比如 Makefile vim Makefile # 删除vim使用的工程文件 # 比如代码要打包出版本了,这些工程文件又占空间又对发布没用,可以删除: vim_project_update.elf `pwd` clean ``` --- 工程文件介绍: ```txt output_tags_* 这些是多线程分工生成的tags文件,vim会自动载入使用,用户无需关心。 vim_project/config.ini 这里面保存了用户配置的参数,基本上C/C++用户只需要关心里面的线程个数配置和srcdirs 参数即可。 thread_jobs = 4 —— 配置文件里面的这个项可以根据实际CPU情况修改 srcdirs = include,src,libs/include,libs/src ——这个也是根据实际情况添加源码目录,用绝对路径。 vim_project/vim_project_preload.vim 这是预加载文件,里面定义了插件的初始化函数,由工具自动生成,用户无需关心。 vim_project/vim_session.vim 这里面保存了上一次打开工程的窗口布局,如果用户不想使用上次的布局,打开vim之前删除该文件即可。 vim_project/其他文件、数据库文件 是vim需要用到的数据库文件,用户不需要关心。 ``` 1. 先说下一步操作,后续再讲配置文件里的配置项。 2. 工程生成完之后,修改配置文件里的 thread_jobs,根据你实际电脑情况修改,一般是核的个数乘以2,该参数主要启用多线程来生成工程文件,提高生成效率。 3. 配置文件中,srcdirs 配置项,可以配置多个目录,多个目录之间用逗号隔开,比如你还想把第三方库接口啥的也添加进来,可以配置多个目录,这样查找文件时就会搜索多个目录。且 srcdirs 第一个永远是你当前所在目录。 4. 如果你修改了配置文件中的目录,那么就需要重新执行一下 ```vim_project_update.elf `pwd```` 命令,从而把第三方库接口相关代码索引信息也添加进来。 5. 工程生成完之后,就可以使用vim查看和修改代码了。 6. 启动vim并打开顶层文本文件,比如我这里打开顶层的 Makefile 文件。```vim Makefile```。 # 常用插件功能 ## 插件——TagList - F2 键,打开 TagList 窗口,显示文件列表; - 选中文件,然后按回车,即可打开文件。 --- - 1.显示目录树:(直接按F2) - 2.通过鼠标或者vim方向键打开指定文件 ![images](images/20221012173830.gif) **说明**:在打开顶层文件情况下,按一下F2即可打开目录树,再按一下F2即可关闭目录树显示,在目录树打开的情况下,双击指定的文件夹或者文件,就能在右边编辑窗口打开。 ## 插件——LookupFile - F3 键,打开 Minibuf 窗口,用户此时可以输入文件名,然后 Ctrl+p 和 Ctrl+n 键可以向上或向下选择,选中后,回车即可打开文件。 --- 案例: - 1.查找文件,输入```:LookupFile```然后回车,然后在上方输入文件名 - 2.当输入文件名前几个字母时,就开始弹出列表了 - 3.可以通过组合键```Ctrl n```来往下选择列表项,```Ctrl p```来往上选择列表项 - 4.选中指定文件列表项后,直接回车即可打开该文件. ![images](images/20221012183830.gif) ## 插件——SrcExpl - F4 键,打开 SrcExpl 定义预览窗口 - Ctrl+i 键,进入到定义预览; - Ctrl+b 键,返回上一级 --- **通过SrcExpl插件查找函数定义** - 1.按下F4弹出SrcExpl预览窗口,预览窗口在下方 - 2.当光标停留在某个变量或者函数时,预览窗口就能显示其定义处 - 3.预览窗口可能会显示多个文件中存在相同定义,根据自己需要选择 - 4.在预览窗口选择自己想要的定义位置,然后鼠标双击该项即可进入定义处 - 5.按下组合键```Ctrl+b```即可从定义处返回至上一次浏览处 - 6.再次按下F4即可关闭SrcExpl预览窗口. ![images](images/20221012184830.gif) ![images](images/20221012185000.gif) - 7.SrcExpl预览窗口反应时间取决于工程文件中所有 ```output_ctags_*``` 文件的总大小以及你电脑性能,比如下图所示,经过本人实测,总和2GB的tags文件,你用SrcExpl预览某个函数的定义,当你编辑窗口中光标停留在该函数上后,大约5~6秒后,预览窗口才会弹出定义信息。 ![image](images/project_clean_all.png) - 8.SrcExpl预览窗口跳转:它会把多个信息列出来让你选择,比如我想让编辑窗口直接打开代码定义处,当弹出 SrcExpl 定义信息后,直接按一下 ```Ctrl+i``` 键,即可跳转到预览窗口指示处,如果有多个定义信息,则按 ```Ctrl+n``` 键和 ```Ctrl+p``` 键来进行上下选择,然后回车即可打开定义处。 ## 插件——TlistToggle - F7 键,打开 TlistToggle 窗口,显示当前文件符号列表,再按一下即可关闭窗口; ## 插件——跳转到标签定义 - 这里提供几种方法,用户任选一种即可达到目的; - 方法1:在编辑窗口中,Normal模式下,首先光标停留在你要找的标签上,然后分别按下: ```Ctrl+]``` 即可跳转到标签定义,然后按下 ```Ctrl+t``` 键,即可回退回来。 - 方法2:使用cscope命令,在编辑窗口中,Normal模式下,输入: ```:cs find g testfunc1```,即可找到函数定义,如果找不到会反馈找不到的结果。 ## 插件——cscope内置命令 - 下面是cscope几个常用内置命令: - 查看使用帮助:```:cs help``` - 查找函数定义:```:cs find g testfunc1```,查看结构体定义:```:cs find g teststruct1``` - 查找调用者(caller),即查找哪些代码调用了该函数:```:cs find c testfunc1``` - 查找被调者(callee),即查找哪些代码被该函数调用:```:cs find d testfunc1``` - 查找字符串:```:cs find t teststring1``` - 查找赋值位置,即查找哪个位置为该变量赋值:```:cs find a testvar1``` ## 插件——mark - 1.鼠标选中某个变量,然后分别按下:```,m```,再次分别按下这两个键即可取消高亮; - 2.该功能类似于SourceInsight的黄色高亮一样,起到醒目的作用,只不过SourceInsight3.x只支持黄色高亮,而vim-mark插件最多支持同时6种不同颜色的高亮。 - 3.高亮标签跳转,比如我标记了var1这个变量,光标选中它,然后按一下 ```#``` 键,就是找到上一个var1位置,```*``` 键,就是找到下一个var1位置。 ![images](images/plugin_mark_highlight20221012185500.gif) ## 插件——code_complete 1. 函数参数提示,比如在编辑模式下,输入 ```test_func(``` 然后按一下 Tab 键,就会提示出 test_func() 函数的参数。这个功能不是很好用,有些宏函函数就提示不出来,这时候就要结合tags的 ```Ctrl+]``` 跳转到定义处来手动查看其参数情况。 ## 文件——查找文件 1. 如下图所示,比如我要查找 env.c 这个文件; 2. 首先按ESC键,然后输入:```:LookupFile```(左下角),然后回车就会在窗口上面打开小小的一行输入窗口,或者直接按一下F3也能打开这个小小的搜索窗口,然后输入你要找的文件名(比如图中 env.c),在你输入文件名的时候会不断刷新匹配表,然后比如你已经在列表中看到了你要找的文件,然后你可以通过按住Ctrl键,然后按一下n键进行向下选择(n=next,p=previous),选中之后,直接按回车,就打开了你要找的文件。 ![image](images/plugin_use_lookupfile2508172215.png) ## 文件——保存文件 1. 一种是保存当前光标所在的文件,一种是保存所有已修改的文件。 2. 在vim中你对任何文件的修改,在主动保存之前,都还暂存在内存里,直到你主动保存,才会写入对应文件。 3. 保存当前文件,首先按一下ESC键,然后输入: ```:w``` 然后回车即可保存,如果是以只读方式打开的文件,则需要输入: ```:w!``` 然后回车即可保存。如果加感叹号了还是不让保存,那么你就要检查该文件的读写权限了。 4. 保存所有文件,同样是上面操作,只不过w变成 ```wall``` 或者 ```wall!``` 了。 ## 窗口——关闭当前窗口 1. 如下图所示,首先把一闪一闪的光标点到你想要关闭的窗口里; 2. 然后按一下ESC键,然后输入: ```:q```,然后回车即可关闭该窗口。也可以通过组合键关闭指定窗口,同样把光标移到目标窗口里,然后按一下ESC键,然后顺序按下组合键: ```Ctrl+w```,然后松开组合键,然后再按一下```q```,然后回车即可关闭该窗口。 3. 强制关闭的话,直接在q后面加个英文的感叹号即可。 4. 如果想要关闭所有窗口,即退出vim编辑器,输入: ```:qall``` 或者 ```:qall!```,然后回车即可。其中的感叹号表示强制执行。 ![image](images/window_close_singlewindow.png) ## 窗口——鼠标的开和关 1. 默认情况下,鼠标功能是打开的,在 ~/.vimrc 文件中里有一句 ```set mouse=a```,如果想要默认关闭鼠标功能,可以修改 ~/.vimrc 文件,把 ```set mouse=a``` 改为 ```set mouse=```。如果只想关闭当前vim窗口的鼠标功能,可以按一下ESC键,然后输入: ```:set mouse=```,然后回车即可关闭当前窗口的鼠标功能;重新打开鼠标功能的话,可以按一下ESC键,然后输入: ```:set mouse=a```,然后回车即可打开当前窗口的鼠标功能。 ## 窗口——冻结窗口和解冻窗口 1. 首先按一下ESC键,然后按下组合键按一下: ```Ctrl+s``` 即可立即冻结窗口,它会冻结全部窗口,在防止被操作时使用,能有效保护窗口内正在查看或者编辑的文件不会误触修改。 2. 如果窗口已被冻结,想要解冻窗口,请按一下ESC键,然后按下组合键按一下: ```Ctrl+q``` 即可立即恢复窗口。 ## 窗口——启用折叠 1. 默认折叠自动启用,如果想关闭,打开 ~/.vimrc 文件,找到 set foldenable 注释掉即可。 2. 常用折叠命令: - 操作:za,打开或关闭当前折叠;zM,关闭所有折叠;zR,打开所有折叠,形象记忆(M就像伞柄朝下伞尖朝上并逐渐收拢的折叠伞),(R——Release——释放展开折叠) - zc 折叠,c——close - zC 对所在范围内所有嵌套的折叠点进行折叠 - zo 展开折叠,o——open - zO 对所在范围内所有嵌套的折叠点展开 - [z 到当前打开的折叠的开始处。(无论是]还是[,z始终在后面) - ]z 到当前打开的折叠的末尾处。 - zj 向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。 - zk 向上移动到前一折叠的结束处。关闭的折叠也被计入。