当前位置: 首页 > news >正文

vim扩展

使用 Vim 阅读 Linux 内核源码是一种高效、轻量级的方式。Linux 源码工程非常庞大,因此推荐你结合 Vim 的一些插件和功能来提高代码导航和阅读效率。

下面是一个完整的指南,帮你用 Vim 更高效地阅读 Linux 源码。


🔧 一、准备工作

1. 克隆 Linux 源码(可选)

git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux

🛠 二、配置 Vim

1. 启用语法高亮

~/.vimrc 中添加:

syntax on
set number
set relativenumber
set autoindent
set tabstop=8 shiftwidth=8 noexpandtab  " 保持和 Linux 源码一致

🔍 三、代码导航工具推荐

1. ctags(生成标签索引)

sudo apt install exuberant-ctags  # Ubuntu/Debian
ctags -R .

然后在 Vim 中可以使用:

  • Ctrl-]:跳转到定义
  • Ctrl-T:跳转回上一个位置
  • :tag function_name:跳转到某个函数定义

2. cscope(跨文件查找符号/函数调用)

sudo apt install cscope
cscope -Rbkq

~/.vimrc 中添加:

if has("cscope")set cscopequickfix=s-,c-,d-,i-,t-,e-cs add cscope.out
endif

在 Vim 中使用命令:

  • :cs find c FUNCTION:查找调用 FUNCTION 的地方
  • :cs find d FUNCTION:查找 FUNCTION 的定义
  • :cs find s SYMBOL:查找符号
  • :cs find t TEXT:查找文本

3. 插件建议

使用插件管理器(如 vim-plug):

vim-plug 示例配置:
call plug#begin('~/.vim/plugged')Plug 'preservim/tagbar'          " 结构导航
Plug 'majutsushi/tagbar'         " 或 tagbar 的其它版本
Plug 'dense-analysis/ale'        " 静态分析/语法检查
Plug 'junegunn/fzf.vim'          " 模糊查找
Plug 'ludovicchabant/vim-gutentags' " 自动生成 tagscall plug#end()

安装插件后,在 Vim 中运行:

:PlugInstall

📘 四、使用技巧

1. 打开 Tagbar 查看结构(需安装 ctags

:TagbarToggle

2. 使用搜索查找符号

/gpio_request

3. 快速跳转文件

:e drivers/gpio/gpio.c

4. 使用 marks 和跳转命令

  • mA:标记位置 A
  • 'A:跳转到位置 A

🧠 五、阅读建议

  • init/main.c 开始,了解 Linux 启动过程。
  • 跟踪 start_kernel() 函数的调用。
  • 熟悉 include/linux/arch/ 下的结构。

✅ 六、总结

工具功能
ctags函数/变量跳转
cscope函数调用、定义、引用
tagbar显示当前文件的结构
fzf.vim快速搜索文件/函数
gutentags自动维护 tags 文件

在 Ubuntu 上怎么安装 vim-plug

这里是Ubuntu 上安装 vim-plug 的完整步骤,根据你用的是 Vim 还是 Neovim 我分别写清楚:


✅ 1. 安装 Vim 或 Neovim(如尚未安装)

安装 Vim:

sudo apt update
sudo apt install vim

安装 Neovim(推荐开发):

sudo apt update
sudo apt install neovim

✅ 2. 安装 vim-plug 插件管理器

👉 对于 Vim:

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

👉 对于 Neovim:

curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

✅ 3. 配置插件(添加到配置文件)

如果你使用的是 Vim,编辑 ~/.vimrc

vim ~/.vimrc

添加以下内容作为起点:

call plug#begin('~/.vim/plugged')" 插件示例(NERDTree 文件管理器)
Plug 'preservim/nerdtree'" C/C++ 补全(依赖 clangd)
Plug 'neoclide/coc.nvim', {'branch': 'release'}call plug#end()

如果你使用的是 Neovim,编辑 ~/.config/nvim/init.vim

mkdir -p ~/.config/nvim
vim ~/.config/nvim/init.vim

添加同样的配置:

call plug#begin('~/.vim/plugged')Plug 'preservim/nerdtree'
Plug 'neoclide/coc.nvim', {'branch': 'release'}call plug#end()

✅ 4. 安装插件

打开 Vim 或 Neovim,执行命令:

:PlugInstall

这一步会下载你配置中的所有插件。


✅ 5. 检查 Coc.nvim 是否工作(自动补全)

安装 clangd(C/C++ 补全需要):

sudo apt install clangd

然后在 Vim 中运行:

:CocInstall coc-clangd

之后打开 .c.cpp 文件,就能体验自动补全、跳转定义等功能。


✅ 示例效果图(安装成功后):

~/.vimrc 或 ~/.config/nvim/init.vim:call plug#begin('~/.vim/plugged')
Plug 'preservim/nerdtree'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
call plug#end()

在 Vim 中:

:PlugInstall

成功后你就有一个“类 IDE”的 Vim 环境了!


👍 很好!你已经成功下载并安装了 vim-plug 插件管理器!


✅ 配置插件(编辑 ~/.vimrc

运行以下命令编辑你的 Vim 配置文件:

vim ~/.vimrc

粘贴以下内容:

call plug#begin('~/.vim/plugged')" 示例插件:NERDTree 文件浏览器
Plug 'preservim/nerdtree'" 自动补全(推荐:C/C++ 用 coc.nvim)
Plug 'neoclide/coc.nvim', {'branch': 'release'}call plug#end()" 一些基础设置
syntax on
set number
set relativenumber
set tabstop=4
set shiftwidth=4
set expandtab
set clipboard=unnamedplus
set mouse=a
filetype plugin indent on

保存并退出 Vim(按 Esc,输入 :wq 回车)。


要在 Vim 中使用 C/C++ 自动补全功能(通过 coc.nvim + coc-clangd),你只需要完成以下几步配置和操作👇


✅ 一次性设置:启用 C/C++ 自动补全

1️⃣ 安装 clangd(语言服务器)

sudo apt install clangd

确认版本:

clangd --version

2️⃣ 在 Vim 中安装 coc-clangd 插件

打开 Vim,输入命令:

:CocInstall coc-clangd

等待几秒,安装完成后会提示成功。


3️⃣ 检查 .vimrc 是否有 coc.nvim 插件(你应该已经添加过):

call plug#begin('~/.vim/plugged')
Plug 'neoclide/coc.nvim', {'branch': 'release'}
call plug#end()

如果你修改过 .vimrc,记得在 Vim 中执行:

:source ~/.vimrc
:PlugInstall

🧪 使用补全功能:打开 .c.cpp 文件

示例步骤:

vim hello.cpp
#include <iostream>int main() {std::cout << "Hello, ";return 0;
}

你可以尝试输入:

std::

如果安装成功,会弹出一个补全菜单,比如:

┌──────────────┐
│ cout         │
│ cin          │
│ endl         │
└──────────────┘

TabEnter 选择,继续输入。


🚀 常用快捷键(使用自动补全 & coc)

操作快捷键
触发补全Ctrl + Space(默认会自动触发)
选中补全项TabEnter
跳转到定义gd
显示函数文档K
格式化代码:CocCommand editor.action.formatDocument
重命名变量<leader>rn(通常为 \rn

🛠 如果补全没生效怎么办?

✅ 检查项目根目录是否有 compile_commands.json(对大型项目有帮助)

如果你使用的是 CMake 项目,在构建目录中生成它:

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..

然后将 compile_commands.json 软链接或拷贝到项目根目录。


在 Vim 中使用插件(如 coc.nvim)进行代码提示补全时,选中并插入候选项的方式依赖于你的补全引擎。下面以 最常用的 coc.nvim 为例,详细说明如何“选中输入”。


✅ 使用 coc.nvim 补全时如何选中候选项

当你输入代码看到提示列表时:

✔ 常见按键操作:

按键功能
<Tab>选择下一个候选项
<Shift-Tab>选择上一个候选项
<CR>(回车)确认并插入选中项
<Esc>取消补全

🛠 如果你按回车没插入,而是换行了?

说明你的 coc.nvim 没有正确绑定 <CR> 行为。你需要在 ~/.vimrc 中添加如下配置:

" Use <CR> to confirm completion and fallback if no selection
inoremap <silent><expr> <CR> pumvisible() ? coc#_select_confirm() : "\<CR>"

这个配置的意思是:

  • 如果补全菜单显示,就选中当前项并插入;
  • 否则就是普通的回车换行。

🔄 Tab 补全不工作?

添加这两个映射(推荐):

" Use <Tab> and <S-Tab> to navigate completion menu
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"

🧪 示意操作流程:

假设你在 C 文件中输入:

pri

然后会出现提示:

printf
private
priority

你按:

  • <Tab> 选中 printf
  • <CR> 插入 printf → 变成:printf

✅ 总结:你需要配置的快捷键

" 回车键:补全确认 or 正常换行
inoremap <silent><expr> <CR> pumvisible() ? coc#_select_confirm() : "\<CR>"" Tab 和 Shift-Tab:切换候选项
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"

🎁 可选:显示文档提示窗口

你也可以加一个快捷键,比如:

nnoremap <silent> K :call CocActionAsync('doHover')<CR>

然后光标放在函数名上,按 K 显示文档说明(和 LSP 一样)。


在 Ubuntu 上为 Vim 安装 Gruvbox 主题,你可以按照以下步骤操作:


✅ 步骤一:确保 Vim 支持 256 色或 true color

运行以下命令检查 Vim 是否为完整版(支持插件和颜色):

vim --version | grep +clipboard

如果你看到类似 +clipboard+python 等,就说明是完整版。

如果没有,可以安装 vim-gtkvim-gtk3

sudo apt update
sudo apt install vim-gtk3

✅ 步骤二:安装 Gruvbox 主题

你可以通过 Git 将 Gruvbox 克隆到 Vim 的 colors 文件夹中:

mkdir -p ~/.vim/pack/themes/start
cd ~/.vim/pack/themes/start
git clone https://github.com/morhetz/gruvbox.git

✅ 步骤三:配置 Vim 使用 Gruvbox

编辑你的 Vim 配置文件:

vim ~/.vimrc

添加以下内容:

syntax enable
set background=dark " 或 light,根据你的喜好
colorscheme gruvbox

如果你使用的是 true color 终端(如 alacritty, kitty, wezterm 或新版 gnome-terminal),你可以添加:

set termguicolors

✅ 步骤四:重启 Vim 以应用主题

vim

你应该能看到 gruvbox 的配色效果。


可选:使用插件管理器(如 vim-plug)

如果你使用 vim-plug,可以在 ~/.vimrc 中添加:

call plug#begin('~/.vim/plugged')
Plug 'morhetz/gruvbox'
call plug#end()syntax enable
set background=dark
colorscheme gruvbox

然后在 Vim 中运行 :PlugInstall 即可。


当然!Gruvbox 是 Vim 中非常受欢迎的主题之一,但它并不是唯一的选择。有些主题在对比度、可读性、语言支持(特别是搭配 Tree-sitter 或 LSP)方面甚至更胜一筹。


🌈 以下是一些 比 Gruvbox 更好用(或不同风格更适合你) 的 Vim 主题推荐:

1. Tokyonight 🌙

  • ⭐️ 风格现代,颜色清晰柔和,适合长时间编码
  • ✅ 支持真彩色(termguicolors)、支持 Tree-sitter、高亮精准
  • 🎨 多种风格(night, storm, day, moon
Plug 'folke/tokyonight.nvim', { 'branch': 'main' }
set termguicolors
colorscheme tokyonight-night

2. Catppuccin 🐱☕️

  • 🔥 近年非常流行,极为舒适、色彩协调
  • ☕️ 主题柔和不刺眼,支持多语言语法高亮
  • 🎨 多种口味(latte, frappe, macchiato, mocha
Plug 'catppuccin/vim', { 'as': 'catppuccin' }
colorscheme catppuccin-mocha

3. Everforest 🌲

  • 🌿 中性色+森林绿,暗色柔和但对比足够
  • ✅ 支持 terminal / GUI / truecolor
  • 📖 适合日常开发,眼睛不累
Plug 'sainnhe/everforest'
set background=dark
let g:everforest_background = 'hard' " soft / medium / hard
colorscheme everforest

4. Solarized (Dark & Light) ☀️🌑

  • 📘 经典耐看,科学配色
  • 📦 非常适合终端工具党
  • 🚫 有人觉得对比度太低(可调)
Plug 'altercation/vim-colors-solarized'
set background=dark " 或 light
colorscheme solarized

5. One Dark / One Light (VSCode 风格) ⚙️

  • 🎯 喜欢 VSCode 的人几乎都喜欢这个
  • ✅ 对比适中、简洁、清晰
Plug 'joshdick/onedark.vim'
colorscheme onedark

6. Nightfox (支持多主题) 🦊

  • 🧠 支持多种风格:nightfox, dawnfox, nordfox, terafox
  • ✅ 高级语法支持、广泛语言覆盖
Plug 'EdenEast/nightfox.nvim'
lua << EOF
vim.cmd("colorscheme nightfox")
EOF

📷 对比预览(视觉风格简略说明)

Theme风格特点
Tokyonight现代、清爽清晰对比、非常舒服的蓝紫色调
Catppuccin柔和、温润适合长时间工作,搭配很好
Everforest自然、护眼有点 Gruvbox 的味道,但更清爽
Onedark工业风 VSCode如果你喜欢 VSCode 的配色
Nightfox多变、风格化一个主题包多个风格,非常灵活

✅ 我的推荐(不同用户类型)

  • 👁️‍🗨️ 护眼党Everforest / Catppuccin
  • 👨‍💻 现代风格Tokyonight / Nightfox
  • 🎮 VSCode 党Onedark
  • 📼 复古怀旧Solarized / Gruvbox

在 Vim 中使用 coc.nvim 实现代码格式化功能,主要依赖于 CoC 的 语言服务插件(language server extensions),这些插件提供了格式化能力。

下面是配置 coc.nvim 实现代码自动格式化的完整指南:


🧩 第一步:安装 coc.nvim(如果你还没装)

使用插件管理器,例如 vim-plug

Plug 'neoclide/coc.nvim', {'branch': 'release'}

安装后,在 Vim 中运行:

:PlugInstall

📦 第二步:安装对应语言的 Coc 扩展

进入 Vim,运行:

:CocInstall coc-json coc-tsserver coc-python coc-html coc-css

你可以根据需要选择语言,比如:

  • JavaScript / TypeScript: coc-tsserver
  • Python: coc-python
  • Go: coc-go
  • Rust: coc-rust-analyzer
  • JSON: coc-json

✨ 第三步:格式化快捷键设置(推荐)

在你的 ~/.vimrcinit.vim 中添加:

" 使用 <leader>f 格式化当前 buffer
nmap <leader>f :call CocActionAsync('format')<CR>

使用时只需要按 <leader>f(通常 <leader>\)就可以格式化代码。


🛠️ 可选:保存时自动格式化

如果你希望在保存时自动格式化代码,添加以下内容:

autocmd BufWritePre * silent! :call CocAction('format')

这会在每次保存文件前自动格式化(前提是当前语言的 LSP 支持格式化)。


✅ 检查格式化是否启用

你可以用以下命令手动格式化当前文件:

:CocCommand editor.action.formatDocument

📝 检查是否支持格式化

在 Vim 中用这个命令:

:CocList services

看看对应语言服务是否启用了 format 功能。


⚠️ 注意事项

  • 如果格式化没有生效,可能是没有安装对应语言的格式化工具(如 prettier, black, gofmt 等)。
  • 某些语言服务器不内置格式化能力,需要手动配置工具。

在 Vim 中进行 C 语言开发,可以结合一些快捷键、配置和插件,使编辑、编译、调试变得高效。下面是常见的 C语言 Vim 快捷键推荐 + 实用插件配置,适合初中高级用户:


✅ 1. 基础快捷键(原生 Vim)

功能快捷键说明
缩进>> / <<向右 / 向左缩进一行
编译:make使用 Makefile 编译
保存并编译:w<CR>:make<CR>保存后调用 make
跳到函数定义gd跳转到局部变量/函数定义(需要 tags 支持)
跳转上一个位置Ctrl-o类似“返回”
跳转下一个位置Ctrl-i类似“前进”
显示行号:set number
自动缩进==gg=G当前行 / 全文自动缩进

✅ 2. 配置 C 文件专用选项(在 ~/.vimrc

" 针对 C 文件设置
autocmd FileType c setlocal tabstop=4 shiftwidth=4 expandtab
autocmd FileType c setlocal makeprg=gcc\ %\ -o\ %< && ./ %< 

说明:

  • makeprg 设置 :make 命令为用 gcc 编译当前文件,然后运行;
  • % 表示当前文件,%< 表示不带扩展名的当前文件名。

✅ 3. 插件推荐(用 vim-plug)

call plug#begin('~/.vim/plugged')Plug 'neoclide/coc.nvim', {'branch': 'release'}        " 智能补全、跳转、语法检查
Plug 'preservim/tagbar'                                " 显示函数、结构体列表
Plug 'tpope/vim-commentary'                            " 快速注释
Plug 'ludovicchabant/vim-gutentags'                    " 自动生成 tags 文件
Plug 'vim-airline/vim-airline'                         " 状态栏增强call plug#end()

安装后,在 Vim 中运行 :PlugInstall


✅ 4. 常用快捷键建议(自定义)

你可以在 ~/.vimrc 里添加:

" 编译当前 C 文件并运行
nnoremap <F5> :w<CR>:!gcc % -o %< && ./%<<CR>" 打开 Tagbar 显示结构
nnoremap <F8> :TagbarToggle<CR>" 使用 coc 格式化
nnoremap <leader>f :call CocActionAsync('format')<CR>" 快速插入行末注释
nnoremap <leader>c A // 

✅ 5. C 语言跳转支持(配合 ctags)

sudo apt install ctags

在项目根目录生成标签:

ctags -R .

然后在 Vim 中就可以使用:

跳转功能快捷键
跳转到定义Ctrl-]
跳回Ctrl-T

✅ 6. 编译 & 运行整合(无 makefile 时)

nnoremap <F9> :w<CR>:!gcc % -Wall -o %< && ./%<<CR>

F9 会编译并直接运行当前文件,适合小测试程序。


🔚 总结(最推荐的快捷键):

快捷键功能
F5编译并运行当前文件
<leader>f格式化代码(配合 coc)
<F8>切换 Tagbar(函数列表)
gd跳转到定义(配合 coc)
<leader>c在行末添加注释 //

最终的~/.vimrc 如下

call plug#begin('~/.vim/plugged')" 示例插件:NERDTree 文件浏览器
Plug 'preservim/nerdtree'" 自动补全(推荐:C/C++ 用 coc.nvim)
Plug 'neoclide/coc.nvim', {'branch': 'release'}" 主题
Plug 'morhetz/gruvbox'Plug 'preservim/tagbar'                                " 显示函数、结构体列表
Plug 'tpope/vim-commentary'                            " 快速注释
Plug 'ludovicchabant/vim-gutentags'                    " 自动生成 tags 文件
Plug 'vim-airline/vim-airline'                         " 状态栏增强call plug#end()" 一些基础设置
syntax on
set background=dark
colorscheme gruvbox
set number
"set relativenumber
set tabstop=4
set shiftwidth=4
set expandtab
set clipboard=unnamedplus
"set mouse=a
set termguicolors
filetype plugin indent on" 回车键:补全确认 or 正常换行
inoremap <silent><expr> <CR> pumvisible() ? coc#_select_confirm() : "\<CR>"" Tab 和 Shift-Tab:切换候选项
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"" 编译当前 C 文件并运行
nnoremap <F5> :w<CR>:!gcc % -o %< && ./%<<CR>" 打开 Tagbar 显示结构
nnoremap <F8> :TagbarToggle<CR>" 使用 coc 格式化
nnoremap <leader>f :call CocActionAsync('format')<CR>" 快速插入行末注释
nnoremap <leader>c A // 
http://www.dtcms.com/a/279349.html

相关文章:

  • Python Web框架对比:Flask vs FastAPI
  • Kubernetes控制器详解
  • 重复频率较高的广告为何一直在被使用?
  • JAVA经典单例模式
  • 纯CSS轮播
  • 动手学深度学习13.9. 语义分割和数据集 -笔记练习(PyTorch)
  • 文件摆渡系统:如何攻克跨网文件交换难点,实现安全合规传输?
  • ISO-IEC-IEEE 42010架构规范
  • 用Finalshell连接服务器后出现文件目录不显示,且刷新报错空指针问题记录
  • 【WRFDA实操第一期】服务器中安装 WRFPLUS 和 WRFDA
  • 探索文本切分的多种方法与应用场景
  • 学习 Flutter (三):玩安卓项目实战 - 上
  • 152.Vue3中使用OpenLayers+Turf实现遮罩布挖洞效果
  • MCP终极篇!MCP Web Chat项目实战分享
  • 消费 Kafka 一个TOPIC数据,插入到另一个KAFKA的TOPIC
  • c#如何将不同类型的数据存储到一起
  • 项目进度依赖纸面计划,如何提升计划动态调整能力
  • 基于FinRL深度强化学习框架的股票预测和回测交易
  • 迁移学习:知识复用的智能迁移引擎 | 从理论到实践的跨域赋能范式
  • 什么是神经网络,常用的神经网络,如何训练一个神经网络
  • python 循环遍历取出偶数
  • 「日拱一码」027 深度学习库——PyTorch Geometric(PyG)
  • MCP基础知识二(实战通信方式之Streamable HTTP)
  • 【CTF学习】PWN基础工具的使用(binwalk、foremost、Wireshark、WinHex)
  • ewdyfdfytty
  • LangChain教程——文本嵌入模型
  • 20250714让荣品RD-RK3588开发板在Android13下长按关机
  • Debezium日常分享系列之:提升Debezium性能
  • 制造业实战:数字化集采如何保障千种备件“不断供、不积压”?
  • 16.避免使用裸 except