本篇是在学习了PegasusWang的课程:玩转Vim 从放弃到爱不释手 后总结的常用操作笔记。此课程从Vim入门开始,由浅入深地讲解了Vim的基础操作、配置及常用插件,可以免去学习的许多弯路,是非常优秀的Vim课程,同时也是免费的。
下面进入我们此次的正文。
目录
基础操作
0.多模式
nomal模式 -> 插入模式
- a/i/o:光标后进入插入模式/光标前进入插入模式/下面新增一行进入插入模式
- A/I/O:行尾进入插入模式/行首进入插入模式/上面新增一行进入插入模式
可视化模式
- v: 进入字符选择
- V: 进入行选择
- <C-v>: 进入块选择
常用操作
- :<C-p> 重复上次命令
- vim filename1 filename2 -O 在终端下,使用vim同时打开两个文件,且自动垂直分屏
- zz 让当前行显示在屏幕中间
- :e! 重新加载并且不保存当前文件
- :syntax on 打开语法高亮
- set nu/set nonu 显示行号/不显示行号
- set hls/noh 搜索词高亮/取消高亮
- set incsearch 增量搜索
- set autoindent 打开自动缩进
1.终端命令行操作
-
ctrl+w: 删除上一个单词
-
ctrl+u: 删除当前行
-
ctrl+a: 定位到开始
-
ctrl+e: 定位到结尾
2.快速移动
normal模式:
- w/W: 移动到下一个word/WORD 开头
- [ word指的是以非空白符分割的单词,WORD是以空白符分割的单词 ]
- e/E: 移动到下一个 word/WORD 结尾
- b/B: 移动到上一个 word/WORD 开头 (backword)
- hjkl: 代替上下左右按键
- 0/$: 行首/行尾
- gg/G: 移动到文本开始位置/移动到文本结束位置
- ctrl+f / ctrl+u: 向下翻页/向上翻页
3.快速增删改查
-
dw/daw/diw: 删除单词(光标及之后的,包括空格)/删除单词(光标所处单词,包括空格)/删除单词(光标及之后的,不包括空格)
- a表示around环绕,i表示inner
-
cw/caw/ciw: 删除当前光标后的单词并进入插入模式(包括空格)/删除当前光标所处的单词并进入插入模式(包括空格)/ 删除当前光标所处的单词并进入插入模式(不包括空格)
- ci" 可以快速删除当前光标所处的由""包裹的内容并进入插入模式
- ci( 可以快速删除当前光标所处的由()包裹的内容并进入插入模式
- ci{ 可以快速删除当前光标所处的由{}包裹的内容并进入插入模式
同理,利用可视化模式的vi" / ( / { 可以做到选中的功能
-
d/dd: 配合文本对象快速删除一个单词/删除整行
-
x: 删除一个字符
-
r/R: 替换一个字符/从当前字符开始一直替换
-
y/p/d: 复制(yank)/粘贴(put)/剪切(delete)
- yiw/yy: 复制一个单词/复制一行
-
u/ctrl+r: 撤销上一步操作/取消上一次撤销操作
4.搜索替换
normal模式下,:[range] s/[pattern]/[string]/[flags] 搜索并替换,其中:
-
[range]: 文本范围
-
10,20: 从10到20行
-
%: 全部
-
-
[pattern]: 源字符串(可正则)
-
[string]: 替换后的文本
-
[flags]: 几个常用标志
- g(global): 全局范围内执行
- c(confirm): 每次替换时可以确认或者拒绝修改
- n(number): 只报告匹配到的次数而不替换
5.多文件操作
相关概念:
- Buffer: 打开的一个文件的内存缓冲区
- Window: Buffer 可视化的分割区域
- Tab: 可以组织窗口(Window)为一个工作区
Buffer操作:
- :ls 列举当前缓冲区
- :b [num] 跳转到[num]缓冲区
- :b [name] 跳转到[name]缓冲区
- :bpre/bnext/bfirst/blast 跳转到上一个/下一个/第一个/最后一个缓冲区
- :e [name] 打开[name]文件
Window操作:(<C-w>代表ctrl+w)
- <C-w> s 水平分割窗口
- <C-w> v 垂直分割窗口
- <C-w> w 循环切换窗口
- <C-w> h/j/k/l 切换到←/↓/↑/→窗口
- <C-w> H/J/K/L 移动当前窗口向←/↓/↑/→
- <C-w> = 所有窗口等宽高
- <C-w> _ / <C-w> | 当前窗口最大化高度/宽度
- [num]<C-w> _ / [num]<C-w> | 当前窗口高度设为[num]行/列
6.复制粘贴与寄存器的使用
-
:set paste/:set nopaste 在网上复制一段代码后,粘贴进vim之前,为防止缩进错乱需要先使用命令,粘贴后再执行取消命令
-
:reg 查看所有的寄存器
-
"{register} 指定寄存器
-
“” 代表默认寄存器
-
"+ 代表系统剪切板
-
"+ p 将系统剪贴的代码复制到vim中
-
:set clipboard=unnamed 统一寄存器和系统剪贴板
7.宏的使用 - 批量操作
宏的使用分为录制和回放, 适用于批量重复性操作。
- q[register] 录制宏到[register]寄存器
- @[register] 回放
批量操作过程:
nomal模式下使用q来录制,同时也是q来结束录制
使用q[register]选择要保存的寄存器(例如qa),把录制的命令保存其中
使用@[register]回放寄存器中保存的一系列命令(例如@a)
V选择一行进入到可视化模式,使用G移动到文件尾部全选剩下的,然后在命令行模式下输入 :normal 就是使用normal模式下的命令, :normal @a 就可以将剩下的全部执行记录下的宏。
对已选中的内容执行normal命令的操作方式:
-
:normal command 执行normal模式下的command命令
-
:<C-p> 重复上次命令
批量操作也可以不使用宏,第二种方式:
选择需要操作的内容,例如gg + V + G完成文件内容全选
使用命令 :normal [要执行的normal命令] 完成对选中内容的批量操作
- 例如 :normal A " 表示对选中内容的每行行尾添加"
- 可以使用 :<C-p> 重复上次命令
8.补全
- <C-n> + <C-p> 补全单词
- <C-x> + <C-f> 补全文件名
- <C-x> + <C-o> 补全代码,需要开启文件类型检查(:filetype on),安装插件
补全时出现选项条时,<C-n> 往下, <C-p> 往上
9.配色方案
- :colorscheme 显示当前主题配色
- :colorscheme <C-d> 显示所有配色
- :colorscheme 配色名 修改配色
vim配置及插件
1.常用配置
在~/.vimrc文件写入vim的持久化配置:
" 设置行号
set number
" 开启语法高亮
syntax on
" 设置配色方案
set background=dark
colorscheme hybrid
" 设置高亮搜索
set hlsearch
set incsearch
" 按F2 进入粘贴模式
set pastetoggle=<F2>
" 设置折叠方式
set foldmethod=indent
" 一些方便的映射
let mapleader=','
let g:mapleader=','
" 使用jj进入normal模式
inoremap jj <Esc>`^
noremap <C-h> <C-w>h
noremap <C-j> <C-w>j
noremap <C-k> <C-w>k
noremap <C-l> <C-w>l
" json格式化
com! FormatJSON %!python3 -m json.tool
" 插件设置,这里使用了vim-plug插件管理器
call plug#begin('~/.vim/plugged')
Plug 'mhinz/vim-startify'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'Yggdroot/indentLine'
Plug 'w0ng/vim-hybrid'
Plug 'altercation/vim-colors-solarized'
Plug 'preservim/nerdtree'
Plug 'kien/ctrlp.vim'
call plug#end()
map <C-n> :NERDTreeToggle<CR>
let g:ctrlp_map = '<c-p>'
- inoremap: insert non-recursive map,插入模式下的非递归映射
- n/i/v: normal模式/插入模式/可视化模式
- <cr> 换行
- :source +文件路径 激活配置文件
2.常用插件
1.1 美化插件
- 修改启动界面:https://github.com/mhinz/vim-startify
- 状态栏美化:https://github.com/vim-airline/vim-airline
- 增加代码缩进线条:https://github.com/Yggdroot/indentLine
1.2 配色方案
- vim-hybrid配色:https://github.com/w0ng/vim-hybrid
- solarized配色:https://github.com/altercation/vim-colors-solarized
1.3 文件目录和搜索
- 文件目录树nerdtree:https://github.com/preservim/nerdtree
- 快速搜索文件ctrlp:https://github.com/kien/ctrlp.vim
~/.vimrc配置:
" nerdtree settings
nnoremap <leader>f :NERDTreeFind<cr>
nnoremap <leader>t :NERDTreeToggle<cr>
" set width
let NERDTreeWinSize=31
" show hidden files
let NERDTreeShowHidden=1
" not show files listed
let NERDTreeIgnore= [
\ '\.git$', '\.hg$', '\.svn$', '\.stversions$', '\.pyc$', '\.pyo$', '\.swp$',
\ '\.DS_Store$', '\.sass-cache$', '__pycache__$', '\.egg-info$', '\.ropeproject$',
\ ]
" ctrlp settings
let g:ctrlp_map = '<c-p>'
配置完成后,<learder>f 打开目录树并定位到当前文件,<leader>t 开关目录树。
使用 <leader>t 打开目录树后,按<Ctrl>wp 可跳转回窗口之前编辑的位置。
1.4 快速定位
- 在文件窗口区域跳转到任意字符位置:https://github.com/easymotion/vim-easymotion
~/.vimrc配置:
" easymotion settings
nmap ss <Plug>(easymotion-s2)
- 此处使用的是递归映射,ss映射到easymotion-s2
配置好后,在nomal模式下输入ss,再输入需要定位的字符(屏幕可视化范围内),再根据高亮字符,选择要去的位置即可完成定位。
1.5 模糊搜索
-
模糊搜索工具:https://github.com/junegunn/fzf.vim
- Ag [PATTERN] 模糊搜索字符串(当前目录下所有文件内搜素)
- Files [PATH] 模糊搜索目录,效果等同于ctrlp
-
搜索替换插件:https://github.com/brooth/far.vim
-
Far [原单词] [替换单词] [搜索路径]
- 例如 :Far foo bar **/*.py
-
再使用 :Fardo 命令确认替换
-
1.6 python-mode打造轻量Python IDE
git:https://github.com/python-mode/python-mode
~/.vimrc配置:
let g:pymode_python = 'python3'
let g:pymode_trim_whitespaces = 1
let g:pymode_doc = 1
let g:pymode_doc_bind = 'K'
let g:pymode_rope_goto_definition_bind = '<C-]>'
let g:pymode_lint = 1
let g:pymode_lint_checkers = ['pyflakes', 'pep8', 'mccabe', 'pylint']
let g:pymode_options_max_line_length = 120
- 使用<Ctrl+]>可跳转到光标所处代码的定义
- 使用<Ctrl+X> + <Ctrl+O> 补全代码
- 使用 :PymodeLintAuto 整理代码格式
- 使用 :w 进行代码保存时,会自动检查错误(静态检查)
- 使用<Ctrl+C>ro 整理python模块导入顺序
1.7 tagbar浏览代码大纲
-
tagbar:https://github.com/majutsushi/tagbar
- 安装tagbar之前,需要进入 https://docs.ctags.io/en/latest/autotools.html#gnu-linux-distributions 安装好需要的依赖
- 向 ~/.vimrc 中添加tagbar的插件 Plug ‘majutsushi/tagbar’
- 在 ~/.vimrc 中设置映射 nmap <F8> :TagbarToggle<CR>
此后可使用 F8 开关代码大纲。
-
在代码中高亮感兴趣的单词:https://github.com/lfv89/vim-interestingwords
- 使用 <leader> k 高亮当前光标所处单词,可同时高亮不同的单词
- 使用 <leader> K 取消所有的高亮
- 使用 n 移动到下一个,N 移动到上一个
1.8 代码补全
- 强大的 neovim/vim8 异步补全插件deoplete.nvim:https://github.com/Shougo/deoplete.nvim
- 支持模糊匹配,需要安装对应编程语言的扩展
1.9 代码格式化与静态检查
-
代码格式化 neoformat:https://github.com/sbdchd/neoformat
-
安装后还需安装对应语言的格式化库,例如python可安装autopep8,使用
pip install autopep8
安装,并在 ~/.vimrc 文件中加入如下配置:" 指定neoformat在格式化python代码时使用的格式化库 let g:neoformat_enabled_python = ['autopep8']
-
使用 :Neoformat 格式化代码
-
-
静态检查 ale:https://github.com/dense-analysis/ale
- 安装后还需安装对应语言的静态检查库,例如python可安装pylint,使用
pip install pylint
安装
- 安装后还需安装对应语言的静态检查库,例如python可安装pylint,使用
1.10 快速注释代码
- vim-commentary:https://github.com/tpope/vim-commentary
- 使用 gcc 注释一行代码,使用 gcgc 取消注释一行代码
- 使用 V 块选一段代码,使用 gc 可注释或取消注释该选中的代码