第九章、vim 程序编辑器 9.1 vi 与 vim vi 编辑器简介 vi (Visual Editor)是 Unix/Linux 系统中最经典的文本编辑器,由 Bill Joy 于 1976 年开发。
vi 的特点:
所有 Unix/Linux 系统都预装
轻量级,启动快速
不需要图形界面,适合远程编辑
功能强大,效率高(掌握后)
vi 的缺点:
学习曲线陡峭
没有语法高亮(原始版本)
操作不够直观
vim 编辑器简介 vim (Vi IMproved)是 Bram Moolenaar 于 1991 年开发的 vi 改进版本。
vim 相比 vi 的改进:
特性
说明
语法高亮
支持数百种编程语言的语法高亮
多窗口
支持水平、垂直分割窗口
多标签
支持标签页编辑
折叠
代码折叠功能
自动缩进
智能缩进和对齐
代码补全
单词、行、文件名补全
宏录制
录制和回放键盘操作
插件系统
强大的插件扩展机制
图形界面
gvim 提供 GUI 版本
跨平台
支持 Linux、Windows、macOS
检查 vim 安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 which vimvim --version sudo yum install vimsudo yum install vim-enhancedsudo apt-get install vimsudo yum install gvim sudo apt-get install vim-gtk vim --version | head -20
vi/vim 的三种模式 vim 有三种基本工作模式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 ┌─────────────────┐ │ 正常模式 │ ←── 默认模式,用于移动光标、删除、复制等 │ (Normal Mode) │ └────────┬────────┘ │ ┌────┴────┐ │ │ ↓ ↓ ┌─────────┐ ┌─────────┐ │ 插入模式 │ │ 命令行模式│ │(Insert │ │(Command │ │ Mode) │ │ Mode) │ └─────────┘ └─────────┘ i,a,o :,/,?
1. 正常模式(Normal Mode)
默认进入的模式
用于浏览、移动光标、删除、复制、粘贴等
按 i、a、o 等进入插入模式
按 : 进入命令行模式
2. 插入模式(Insert Mode)
用于输入和编辑文本
左下角显示 “– INSERT –”
按 Esc 返回正常模式
3. 命令行模式(Command Mode / Ex Mode)
用于执行保存、退出、搜索、替换等命令
左下角显示 : 或 / 或 ?
按 Esc 或 Enter 执行后返回正常模式
9.2 vi 的使用 启动和退出 vim 启动 vim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 vim vim newfile.txt vim existingfile.txt vim file1.txt file2.txt file3.txt vim +10 file.txt vim + file.txt vim +/pattern file.txt vim -R file.txt view file.txt vim -r file.txt vim -r
退出 vim:
1 2 3 4 5 6 7 8 9 10 11 :w :w filename :q :q! :wq :x ZZ ZQ :wqa :qa!
正常模式基本操作 移动光标:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 h j k l w b e ge W B E 0 ^ $ g_ | gg G 10G :10 % H M L Ctrl+f Ctrl+b Ctrl+d Ctrl+u zz e zt zb /pattern ?pattern n N * ma `a 'a # 跳转到标记 a 所在行的行首 ``. # 跳转到上次编辑的位置 ' ' # 跳转到上次跳转的位置开头 :marks # 列出所有标记
编辑操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 x X dd 5dd dw d$ d0 dgg dG di" # 删除引号内的内容(包括引号内的所有内容) di( # 删除括号内的内容 di{ # 删除大括号内的内容 dit # 删除 HTML/XML 标签内的内容 # 复制(yank) yy # 复制当前行 5yy # 复制5行 yw # 复制到单词结尾 y$ # 复制到行尾 y0 # 复制到行首 ggVG # 选择全部并复制(gg=到开头,V=行选择,G=到结尾) # 粘贴 p # 在光标后/下方粘贴 P # 在光标前/上方粘贴 ]p # 粘贴并调整缩进(适合代码) [p # 在上方粘贴并调整缩进 # 修改(删除并进入插入模式) cc # 修改当前行(删除并进入插入模式) cw # 修改到单词结尾 c$ # 修改到行尾 c0 # 修改到行首 ct" r R ~ u U Ctrl+r .
进入插入模式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 i I a A o O s S C cw Esc Ctrl+[ Ctrl+c
可视模式(Visual Mode) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 v V Ctrl+v h/j/k/l w/b/e $/0/^ gg/G o O d y > < = ~ u U J gq r I A Esc
命令行模式(Command Mode/Ex Mode) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 :w :w filename :q :q! :wq :x ZZ :saveas filename :e filename :e! :enew :ls :buffers :files :b 2 :bnext :bprevious :bfirst :blast :bdelete 2 :bwipeout 2 :split :split filename :vsplit :vsplit filename :new :vnew :close :only :qa :qa! :windo cmd :tabnew :tabnew filename :tabs :tabnext :tabprevious :tabfirst :tablast :tabmove 2 :tabmove +1 :tabmove -1 :tabclose :tabonly :tabdo cmd /pattern ?pattern n N * :%s/old/new/ :%s/old/new/g :%s/old/new/gc :1,10s/old/new/g :%s/old/new/gi :%s//new/g :set number :set nonumber :set relativenumber :set norelativenumber :set cursorline :set nocursorline :set cursorcolumn :set wrap :set nowrap :set ignorecase :set smartcase :set hlsearch :set nohlsearch :set incsearch :set tabstop=4 :set shiftwidth=4 :set expandtab :set autoindent :set smartindent :set cindent :set fileformat=unix :set fileencoding=utf-8 :set backup :set nobackup :set swapfile :set noswapfile :set history =1000 :set undolevels=1000 :set laststatus=2 :set ruler :set showcmd :set showmatch :set wildmenu :set paste :set nopaste :set all :set number? :set :mkvimrc ~/.myvimrc
vim 高级技巧 1. 寄存器使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 "ayy # 复制当前行到寄存器 a " ap "byw # 复制单词到寄存器 b " b3p "" "0 # 上次复制的内容(y 命令) " 1-"9 # 删除历史(d 命令) " - "+ # 系统剪贴板(可能需要 +clipboard 特性) " * "% # 当前文件名 " # "= # 表达式寄存器 " _ "/ # 上次搜索模式 " : ". # 上次插入的文本 # 使用系统剪贴板(跨应用复制粘贴) " +yy "+p # 从系统剪贴板粘贴 # 表达式寄存器 " =5*5"p # 计算 5*5 并粘贴结果 " =strftime("%Y-%m-%d" )"p # 插入当前日期
2. 宏录制:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 qq ... q @q @@ 5@q 10@q Vjjjj :'<,' >normal @q "qp # 将宏粘贴出来 # 编辑内容 " qyy qQ ... q "qyy # 复制宏内容 :new ~/.vim/macros.vim p # 粘贴 :w # 保存 # 从文件加载宏 :r ~/.vim/macros.vim " qyy
3. 多窗口操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 Ctrl+w s Ctrl+w v :sp filename :vsp filename :new :vnew Ctrl+w w Ctrl+w h Ctrl+w j Ctrl+w k Ctrl+w l Ctrl+w t Ctrl+w b Ctrl+w p Ctrl+w r Ctrl+w R Ctrl+w x Ctrl+w K Ctrl+w J Ctrl+w H Ctrl+w L Ctrl+w T Ctrl+w = Ctrl+w _ Ctrl+w | Ctrl+w + Ctrl+w - Ctrl+w > Ctrl+w < Ctrl+w n+ :resize 20 :resize +5 :vertical resize 80 Ctrl+w c Ctrl+w q :q :q! :on :only Ctrl+w n Ctrl+w ^ Ctrl+w f Ctrl+w i Ctrl+w d vim -d file1 file2 vim file1 :vertical diffsplit file2 Ctrl+w s Ctrl+w w :G Ctrl+w v Ctrl+w l 100G Ctrl+w h 50G Ctrl+w v Ctrl+w l :e reference.txt Ctrl+w h
4. 多标签页操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 :tabnew :tabnew filename :tabe filename :tabf filename :tabs gt gT :tabnext :tabprevious :tabn :tabp :tabfirst :tablast :tabm 0 :tabm :tabm 2 :tabc :tabo :tabs " 使用 Alt+数字 切换标签页 map <A-1> 1gt map <A-2> 2gt map <A-3> 3gt map <A-4> 4gt map <A-5> 5gt map <A-6> 6gt map <A-7> 7gt map <A-8> 8gt map <A-9> 9gt map <A-0> :tablast<CR> " 使用 Ctrl+t 新建标签页nnoremap <C-t> :tabnew<CR> " 使用 Ctrl+w 关闭标签页 nnoremap <C-w> :tabclose<CR> # 实用标签页技巧 # 1. 在标签页间复制内容 # 在标签页1复制:yy # 切换到标签页2:gt # 粘贴:p # 2. 对比不同版本的文件 vim file.txt :vsplit file.txt.backup # 或者在两个标签页中打开 :tabe file.txt :tabe file.txt.backup # 3. 工作流程示例 vim main.c :tabnew utils.c # 创建新标签编辑工具函数 :tabnew header.h # 创建新标签编辑头文件 # 现在可以用 gt/gT 在三个文件间快速切换 # 4. 保存所有标签页的会话 :mksession ~/.vim/session/work.vim # 下次恢复 vim -S ~/.vim/session/work.vim
5. 搜索和替换:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 /pattern ?pattern n N :set ignorecase :set smartcase :set noignorecase :set hlsearch :set nohlsearch :noh :set incsearch /pattern\c /pattern\C /^pattern /pattern$ /\<word\> /pattern1.*pattern2 :s/old/new/ :s/old/new/g :5s/old/new/g :1,10s/old/new/g :%s/old/new/g :%s/old/new/gc :%s/old/new/gi :%s/old/new/gI :%s/\s\+$//g :%s/^\s\+//g :%s/^\n\+//g :%s/old//g :%s/old/\U&/g :%s/old/\L&/g :%s/old/\u&/g :%s/\(.*\)/\1\1/g :%s//new/g :%s/\(foo\)\(bar\)/\2\1/g :%s/\d\+/\=submatch(0)+1/g y n a q l Ctrl+e Ctrl+y
6. 书签和标记:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 ma mb mA `a 'a # 跳转到标记 a 所在行的行首 # 特殊标记 ``. # 跳转到上次编辑的位置 `. # 跳转到上次修改的位置 `^ # 跳转到上次插入模式的位置 `[ # 跳转到上次修改的开始位置 `] # 跳转到上次修改的结束位置 `< # 跳转到上次可视选择的开始 `> # 跳转到上次可视选择的结束 # 列出标记 :marks # 列出所有标记 :marks aAbBcC # 列出指定标记 # 删除标记 :delmarks a # 删除标记 a :delmarks a-d # 删除标记 a 到 d :delmarks! # 删除所有小写标记(a-z) # 实用技巧 # 在代码中设置标记快速导航 ma # 在函数开始处设置标记 a # ... 编辑其他部分 ... ' a ma `a
7. 折叠代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 :set foldmethod=syntax :set foldmethod=indent :set foldmethod=marker :set foldmethod=expr :set foldmethod=manual zo zc za zO zC zA zv zx zX zm zM zr zR zn zN zi :set foldcolumn=4 :set foldlevel=2 :set foldminlines=3 :set foldnestmax=3 [Count]zk [Count]zj [Count]zk set foldmethod=syntaxset foldlevel=99 " 默认打开所有折叠 set foldcolumn=3 " 显示折叠列set foldopen=all " 自动打开折叠(当跳转时) " 使用空格键切换折叠nnoremap <space> za " 使用大括号导航折叠 map [[ zc map ]] zo
8. vim 配置文件(.vimrc):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 " ~/.vimrc - vim 配置文件 " ======================" 基本设置 set nocompatible " 不与 Vi 兼容(使用 vim 的扩展功能)set encoding=utf-8 " 使用 UTF-8 编码 set fileencoding=utf-8 " 文件使用 UTF-8 编码set termencoding=utf-8 " 终端使用 UTF-8 " 显示设置set number " 显示行号 set relativenumber " 显示相对行号(可选)set cursorline " 高亮当前行 set colorcolumn=80 " 在 80 列处显示标记线set laststatus=2 " 总是显示状态栏 set showcmd " 显示部分命令set showmode " 显示当前模式 set ruler " 显示光标位置" 搜索设置 set hlsearch " 高亮搜索结果set incsearch " 增量搜索 set ignorecase " 忽略大小写set smartcase " 智能大小写(有大写字母时区分) set wrapscan " 搜索到文件末尾后从头开始" 缩进和制表符 set autoindent " 自动缩进set smartindent " 智能缩进 set cindent " C 风格缩进set expandtab " Tab 转换为空格 set tabstop=4 " Tab 宽度为 4set shiftwidth=4 " 自动缩进宽度为 4 set softtabstop=4 " 软 Tab 宽度为 4" 折叠设置 set foldenable " 启用折叠set foldmethod=syntax " 基于语法折叠 set foldlevel=99 " 默认打开所有折叠set foldcolumn=3 " 显示折叠列 " 备份和交换文件set backup " 启用备份 set backupdir=~/.vim/backup// " 备份文件目录set backupext=.bak " 备份文件扩展名 set swapfile " 启用交换文件set directory=~/.vim/swap// " 交换文件目录 set undofile " 启用持久撤销set undodir=~/.vim/undo// " 撤销文件目录 " 性能优化set lazyredraw " 减少重绘 set ttyfast " 快速终端连接set updatetime=300 " 更新时间间隔 set timeoutlen=500 " 键序列超时时间" 自动命令 if has(" autocmd") " 文件类型检测 filetype on filetype plugin on filetype indent on " 针对文件类型的设置 autocmd FileType python setlocal et sta sw=4 sts=4 autocmd FileType c,cpp setlocal cindent autocmd FileType html,xhtml,css,xml setlocal sw=2 sts=2 autocmd FileType javascript setlocal sw=2 sts=2 " 自动移除行尾空格 autocmd BufWritePre * :%s/\s\+$//e " 记住光标位置 autocmd BufReadPost * \ if line(" '\"") > 1 && line("' \"") <= line(" $") | \ exe " normal! g`\"" | \ endif endif " 配色方案try colorscheme desert " 使用 desert 配色 " colorscheme molokai " 或其他配色方案 " colorscheme solarizedcatch colorscheme default endtry set background=dark " 使用深色背景 " 快捷键映射let mapleader = "," " 设置 leader 键为逗号 " 快速保存nmap <leader>w :w!<CR> nmap <leader>q :q!<CR> nmap <leader>x :x!<CR> " 快速切换窗口 nnoremap <C-h> <C-w>h nnoremap <C-j> <C-w>j nnoremap <C-k> <C-w>k nnoremap <C-l> <C-w>l " 使用空格键切换折叠nnoremap <space> za " 快速编辑 .vimrc nnoremap <leader>v :e $MYVIMRC <CR> nnoremap <leader>s :source $MYVIMRC <CR> " 在当前行上下插入空行(不进入插入模式)nnoremap <Leader>o o<Esc> nnoremap <Leader>O O<Esc> " 快速移动 nnoremap H ^ nnoremap L $ nnoremap J 5j nnoremap K 5k " 视觉模式下保持缩进vnoremap < < gv vnoremap > > gv " 系统剪贴板 nnoremap <leader>y " +yvnoremap <leader>y "+y nnoremap <leader>Y " +Ynnoremap <leader>p "+p nnoremap <leader>P " +P" 插件管理(vim-plug)示例 " 先安装 vim-plug:" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ " https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vimcall plug#begin('~/.vim/plugged' ) " 常用插件示例 Plug 'tpope/vim-sensible' " 合理的默认设置Plug 'tpope/vim-surround' " 快速操作包围符号 Plug 'tpope/vim-commentary' " 快速注释Plug 'tpope/vim-fugitive' " Git 集成 Plug 'preservim/nerdtree' " 文件浏览器Plug 'vim-airline/vim-airline' " 状态栏增强 Plug 'vim-airline/vim-airline-themes' Plug 'sheerun/vim-polyglot' " 语法高亮包Plug 'junegunn/fzf' , { 'do' : { -> fzf#install() } } Plug 'junegunn/fzf.vim' " 模糊查找 call plug#end() " 安装插件: :PlugInstall" 更新插件: :PlugUpdate " 清理插件: :PlugClean
这是一个非常全面的 .vimrc 配置文件,涵盖了 vim 的各个方面。以下是使用这个配置的方法:
安装 vim-plug (如果你需要使用插件部分):
1 2 curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
创建配置文件 :
1 2 3 cp ~/.vimrc ~/.vimrc.backup vim ~/.vimrc
创建必要的目录 :
1 mkdir -p ~/.vim/backup ~/.vim/swap ~/.vim/undo ~/.vim/plugged
安装插件 (如果使用插件部分):
这个配置包含了以下主要功能:
基本设置(编码、行号、搜索等)
缩进和制表符设置
折叠和语法高亮
备份和撤销文件管理
自动命令(文件类型检测、自动格式化等)
配色方案
键盘映射和快捷键
插件管理(vim-plug)
完整的插件配置示例
你可以根据自己的需要启用或禁用某些功能,或者修改某些设置以适应你的工作环境。这个文件中的注释非常详细,可以帮助你了解每个设置的作用。好的,我将继续完成这个全面的 .vimrc 配置文件。我已经添加了插件管理部分,现在让我继续添加更多实用功能和插件配置。好的,我来继续完成这个 vim 配置文件。接下来需要添加更多实用的插件配置和自定义功能。我会重点完善以下几个部分:1. 添加 NERDTree 文件浏览器的配置;2. 配置代码补全和语法检查;3. 添加更多快捷键映射;4. 完善状态栏和主题设置。这些配置将让 vim 更加强大易用。好的,让我继续完成这个 vim 配置文件:<|tool_calls_section_begin|><|tool_call_begin|>functions.Read:55<|tool_call_argument_begin|>{