↓ 跳过正文
  1. 文章/

Vim 安装与插件配置指南.md

·3988 字·8 分钟· loading · loading · ·
QiYue
作者
QiYue
技术探索者,记录 Linux、数据库、开发工具的实践经验。
目录

Debian Vim 安装与插件配置指南
#

这份文档适用于 Debian 上的 Vim,不是 Neovim 的 init.lua。配置基于 vim-plug 管理插件,并针对目录树、项目搜索、Vue/JavaScript 编辑和中文编码做了设置。1 2

配置已在 Debian 13、Vim 9.1 下测试:包括插件安装、NERDTree、J/K 移动、Vue 语法识别、中文搜索和不创建 swap 文件。其他 Debian/Vim 版本的插件兼容性可能有差异。

**不会自动修改你的服务器。**请在目标 Debian 机器上备份原配置,然后按下面步骤保存和安装。

1. 安装 Vim 与依赖
#

sudo apt update
sudo apt install -y vim git curl ca-certificates ripgrep diffutils
  • vim:完整 Vim,不要只使用功能受限的 vim-tiny。
  • git:供 vim-plug 下载插件,也供 Git 插件使用。
  • ripgrep:提供 rg 命令,供项目内容搜索使用。
  • diffutils:提供 diff,供 UndoTree 的差异窗口使用。

查看版本:

vim --version | head -n 5
git --version
rg --version | head -n 1

安装 vim-plug
#

如果之前已经安装,可以跳过。以下命令以日常使用 Vim 的普通用户执行:

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

这一步和后面的 :PlugInstall 都需要访问 GitHub。不要用 sudo 下载到普通用户的插件目录;sudo vim 也可能使用不同的用户配置。

2. 备份并编辑配置
#

如果已经有 ~/.vimrc,先备份:

if [ -f ~/.vimrc ]; then
  cp -L ~/.vimrc ~/.vimrc.bak."$(date +%Y%m%d-%H%M%S)"
fi

然后编辑配置:

vim -u NONE ~/.vimrc

-u NONE 只在这次编辑时不加载旧配置,避免旧配置报错。

如果要用下面的配置整体替换旧内容:

  1. 在 Vim 中按 Esc,输入 :%delete 并回车。
  2. 按 i,粘贴下一节的完整配置。
  3. 按 Esc,输入 :wq 并回车保存。

如果旧配置里有自己需要保留的内容,应先备份并手动合并,不要盲目覆盖。

3. 完整的 ~/.vimrc
#

__FULL_VIMRC__

4. 安装或更新插件
#

保存 .vimrc 后,重新打开 Vim:

vim

在 Vim 中输入并回车:

:PlugInstall

等待下载完成,然后输入 :qa 退出所有窗口,重新打开 Vim。首次安装完成并重启后,配色和插件才会完整加载。

以后更新已安装插件:

:PlugUpdate

查看插件安装状态:

:PlugStatus

5. 插件列表
#

插件作用备注
preservim/nerdtree左侧文件目录树重点插件
Xuyuanp/nerdtree-git-plugin在目录树中显示 Git 状态需要 git
ctrlpvim/ctrlp.vim按文件名模糊查找Ctrl+p
jremmen/vim-ripgrep在项目中搜索文件内容新增;需要 rg
tpope/vim-commentary注释和取消注释gcc、可视模式下 gc
tpope/vim-surround、vim-repeat操作括号、引号,并增强重复操作不等同于自动补全代码
jiangmiao/auto-pairs输入括号、引号时自动配对新增;可在当前缓冲区切换
mbbill/undotree图形化查看当前文件的撤销历史新增;不是 swap 崩溃恢复
vim-airline/vim-airline底部状态栏配置不要求 Nerd Font
tpope/vim-fugitive在 Vim 中查看和操作 Git需要在 Git 项目中使用
airblade/vim-gitgutter在行号附近标记 Git 修改对 Git 跟踪的文件生效
pangloss/vim-javascript、posva/vim-vueJavaScript 和 Vue 单文件组件语法高亮新增;结合你的 Vue 项目
morhetz/gruvbox深色配色首次安装前使用默认配色

这套配置中的 Vue 插件主要是语法高亮,不是语言服务器或智能代码补全;没有自动安装 Node.js、Vue LSP 或 TypeScript LSP。插件文档:CtrlP 3、vim-ripgrep 1、UndoTree 1、vim-vue 1。

6. 常用快捷键
#

先按 Esc,进入普通模式。本配置将 <leader> 设为空格:例如 空格 e 指先按空格,再按 e。

6.1 移动、文件树和窗口
#

操作按键或命令
向下移动 1 行j
向上移动 1 行k
向下移动 3 行J
向上移动 3 行K
打开或关闭目录树Ctrl+n
在树中定位当前文件空格 e 或 :NERDTreeFind
在窗口之间切换Ctrl+w,松开后再按 w
在树中展开目录或打开文件Enter
刷新整棵目录树在树窗口按 R
查看目录树内的帮助在树窗口按 ?
退出所有窗口:qa

J/K 移动的是三条实际文本行,不是三条屏幕折行。它们在普通模式的编辑窗口和 NERDTree 中生效;其他插件的专用窗口可能有自己的局部映射。

原本的按键功能已保留:

  • Vim 默认的 J 是合并行,现改为 空格 j。
  • Vim 默认的 K 是查询光标下关键字,现改为 空格 k;具体查询内容取决于 keywordprg。
  • NERDTree 原本的 J / K 用于跳到同级目录项末尾 / 开头,现改为树窗口内的 gJ / gK。

不带文件参数执行 vim 时会自动打开目录树。如果用 vim 文件名 打开文件,按 Ctrl+n 即可切换目录树。

6.2 查找文件和内容
#

建议先进入项目目录:

cd /你的/项目目录
vim
操作按键或命令
按文件名查找Ctrl+p
查找已打开的缓冲区空格 b
搜索项目内容空格 r,输入关键词后回车
直接搜索项目内容:Rg 关键词
查看当前工作目录:pwd
打开 / 关闭搜索结果列表:copen / :cclose
跳到下一条 / 上一条结果:cnext / :cprev
清除上一次搜索高亮空格 h

:Rg 默认从 Vim 当前工作目录搜索;所以最好先 cd 到项目目录。CtrlP 的文件搜索默认跳过 .git、node_modules 和 __pycache__,但目录树仍可浏览这些目录。

6.3 注释、括号、撤销与 Git
#

操作按键或命令
注释或取消注释当前行gcc
注释选中的多行V 选择行,再按 gc
给光标所在单词加双引号ysiw"
把双引号改成单引号cs"'
切换当前缓冲区的括号自动配对空格 a
打开或关闭撤销历史树空格 u
普通撤销 / 重做u / Ctrl+r
查看 Git 状态空格 g 或 :Git

UndoTree 展示 Vim 的撤销历史;本配置没有额外开启持久撤销文件,通常退出会话后历史不会保留。它不能代替下面关闭的 swap 崩溃恢复功能。

7. 不生成 .swp 文件
#

完整配置里已有:

set noswapfile

它禁止 Vim 为缓冲区创建 swap 文件。要查看当前缓冲区是否关闭 swap,可在 Vim 中执行:

:setlocal swapfile?

正常情况下显示 noswapfile。

重要风险:

  • Vim、终端或系统异常退出时,无法依靠 swap 恢复未保存的修改;请经常用 :w 保存。
  • 不再有基于 swap 的并发编辑提示;避免多个 Vim 同时修改同一个文件。
  • 此设置不会自动删除之前已经存在的 .swp 文件,也不等同于关闭所有其他备份或撤销文件。

如需检查项目中遗留的旧 swap 文件,可先只列出、不删除:

find . -type f \( -name '*.swp' -o -name '*.swo' -o -name '*.swn' \) -print

只有在确认没有其他 Vim 正在编辑对应文件,且不需要通过该文件恢复内容后,才手动删除对应旧文件;不要批量盲删。

8. 中文与编码
#

8.1 这份配置做了什么
#

set encoding=utf-8
set fileencodings=ucs-bom,utf-8,gb18030,big5,latin1
set fileformats=unix,dos
  • encoding=utf-8:Vim 内部使用 UTF-8;在未被其他设置覆盖时,新建文件通常也会按 UTF-8 保存。
  • fileencodings:打开文件时按顺序尝试识别 BOM、UTF-8、GB18030、Big5 和 Latin-1。
  • fileformats:识别常见的 Unix LF 与 Windows CRLF 换行。
  • 不在配置里强制 fileencoding=utf-8,因此读取到的已有文件不会仅因这份配置就被强制转码。

**自动识别不是万能的。**GB18030 与 Big5 有重叠的合法字节序列,文件可能被误判;latin1 也是宽松的兜底选项。若你主要处理 Big5 繁体中文文件,可以把 big5 调到 gb18030 前面,但仍需要检查内容。

8.2 终端与系统 locale
#

Vim 的编码设置不能代替终端的 UTF-8 支持和中文字体。通过 SSH 连接时,负责显示字符的通常是本地终端软件和本地字体;中文输入也依赖本地输入法。

在 Debian 机器中检查:

locale
locale -a | grep -i utf

若系统列出了 C.utf8,可临时用它启动 Vim:

LANG=C.utf8 LC_ALL=C.utf8 vim

LC_ALL 会覆盖 LANG,因此需要一并检查。若没有可用的 UTF-8 locale,可按系统管理规范安装 locales 并配置合适的 locale;不要未经确认修改服务器的全局语言设置。

在 Vim 中查看当前设置:

:set encoding? fileencoding? fileencodings? fileformat?

8.3 遇到乱码时
#

先确认文件没有未保存修改,并留存备份。可以尝试按指定编码重新读取当前文件:

:e ++enc=gb18030

或:

:e ++enc=big5

检查中文显示正确后再编辑。不要随意使用 :e!,因为它可能丢弃未保存的修改。

如果明确需要把已正确读取并备份的文件转换成 UTF-8,再执行:

:setlocal fileencoding=utf-8
:w

这会以 UTF-8 保存并覆盖当前文件,不是单纯改变屏幕显示。

9. 常见问题
#

:PlugInstall 不存在
#

确认下载文件存在,且是当前用户安装的:

ls -l ~/.vim/autoload/plug.vim

若不存在,重新执行第 1 节的 vim-plug 下载命令,之后重新打开 Vim。

:NERDTreeToggle、:Rg 或其他插件命令不存在
#

确认已经保存完整的 .vimrc,重启 Vim,执行 :PlugInstall,等待安装完成后再重启。:Rg 还需要系统能找到 rg:

command -v rg

仍然有光标行横线
#

本配置同时设置了 set nocursorline 和 let g:NERDTreeHighlightCursorline = 0,分别关闭编辑窗口和 NERDTree 自带的光标行高亮。保存配置后重新打开 Vim;若只想临时关闭当前标签页内所有窗口的光标行,可执行:

:windo setlocal nocursorline

想调整默认缩进
#

配置默认使用 4 个空格,Makefile 使用 Tab。如果项目要求两个空格,可以按需调整 tabstop、shiftwidth 和 softtabstop;不要把 Makefile 所需的 Tab 全部替换成空格。

10.完整配置
#

" Debian Vim 8/9:安装 vim-plug 后,进入 Vim 执行 :PlugInstall。
" 已有配置请先备份;本配置适用于 Vim,不适用于 Neovim 的 init.lua。

set nocompatible

" 中文与文件编码:按顺序尝试检测,不强制转换已有文件
set encoding=utf-8
set fileencodings=ucs-bom,utf-8,gb18030,big5,latin1
set fileformats=unix,dos
let mapleader = ' '

" 把 NERDTree 原有 J/K 映射移到 gJ/gK,让 J/K 也能在目录树里快步移动
let g:NERDTreeMapJumpLastChild = 'gJ'
let g:NERDTreeMapJumpFirstChild = 'gK'
let g:NERDTreeHighlightCursorline = 0
" 仅加载 Vue 文件实际用到的预处理语言语法
let g:vue_pre_processors = 'detect_on_enter'

" 插件列表:安装到当前用户的 ~/.vim/plugged
if filereadable(expand('~/.vim/autoload/plug.vim'))
  call plug#begin('~/.vim/plugged')

  " 文件树与文件树中的 Git 状态
  Plug 'preservim/nerdtree'
  Plug 'Xuyuanp/nerdtree-git-plugin'

  " 搜索文件和项目内容;vim-ripgrep 需要系统中的 rg 命令
  Plug 'ctrlpvim/ctrlp.vim'
  Plug 'jremmen/vim-ripgrep'

  " 注释、括号/引号操作、重复操作、自动补全括号
  Plug 'tpope/vim-commentary'
  Plug 'tpope/vim-surround'
  Plug 'tpope/vim-repeat'
  Plug 'jiangmiao/auto-pairs'

  " 撤销历史树
  Plug 'mbbill/undotree'

  " 状态栏和 Git 集成
  Plug 'vim-airline/vim-airline'
  Plug 'tpope/vim-fugitive'
  Plug 'airblade/vim-gitgutter'

  " Vue 单文件组件和 JavaScript 语法高亮
  Plug 'pangloss/vim-javascript'
  Plug 'posva/vim-vue'

  " 配色主题
  Plug 'morhetz/gruvbox'

  call plug#end()
else
  echohl WarningMsg
  echom '未找到 vim-plug:请先安装 ~/.vim/autoload/plug.vim'
  echohl None
endif

" 基本界面
syntax on
filetype plugin indent on
set number
set nocursorline
set showcmd
set ruler
set laststatus=2
set signcolumn=yes
set scrolloff=3
set splitbelow
set splitright
set wildmenu
set hidden
set backspace=indent,eol,start
set updatetime=500

" 不生成 Vim swap 文件;崩溃时不能通过 swap 恢复未保存内容
set noswapfile

" 搜索:默认忽略大小写,搜索词包含大写时区分大小写
set ignorecase
set smartcase
set incsearch
set hlsearch

" 默认四空格缩进;Makefile 命令需要真正的 Tab
set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
set autoindent
augroup user_filetypes
  autocmd!
  autocmd FileType make setlocal noexpandtab softtabstop=0
augroup END

" 普通模式:大写 J/K 分别向下/上移动三行
nnoremap <silent> J 3j
nnoremap <silent> K 3k
" 保留 Vim 原本的 J(合并行)和 K(关键字帮助)
nnoremap <silent> <leader>j J
nnoremap <silent> <leader>k K

" NERDTree
let g:NERDTreeShowHidden = 1
let g:NERDTreeWinSize = 30
" 避免某些主题没有 Method 高亮组时,Git 扩展产生颜色错误
let g:NERDTreeGitStatusHighlightingCustom = {
      \ 'Clean': 'ctermfg=Green guifg=#b8bb26',
      \ }
nnoremap <silent> <C-n> :NERDTreeToggle<CR>
nnoremap <silent> <leader>e :NERDTreeFind<CR>

" 不带文件参数启动 Vim 时自动打开目录树;插件未安装时跳过
augroup user_nerdtree_startup
  autocmd!
  autocmd VimEnter * if argc() == 0 && exists(':NERDTree') == 2 | NERDTree | endif
augroup END

" CtrlP:Ctrl+p 搜索文件;不搜索这些常见大型目录
let g:ctrlp_map = '<c-p>'
let g:ctrlp_cmd = 'CtrlP'
let g:ctrlp_working_path_mode = 'ra'
let g:ctrlp_custom_ignore = {
      \ 'dir': '\v[\/](\.git|node_modules|__pycache__)$',
      \ }

" 不需要 Powerline/Nerd Font 字体
let g:airline_powerline_fonts = 0

" 空格是 Leader:切换括号补全、搜索缓冲区、Git、清除高亮、搜索内容、撤销树
nnoremap <silent> <leader>a :call AutoPairsToggle()<CR>
nnoremap <silent> <leader>b :CtrlPBuffer<CR>
nnoremap <silent> <leader>g :Git<CR>
nnoremap <silent> <leader>h :nohlsearch<CR>
nnoremap <leader>r :Rg<Space>
nnoremap <silent> <leader>u :UndotreeToggle<CR>

" 主题插件未安装时沿用默认配色
set background=dark
if !empty(globpath(&runtimepath, 'colors/gruvbox.vim'))
  colorscheme gruvbox
endif

相关文章


← InstaBox_Survival_Guide