vim
vim 是从 vi 发展而来的一个文本编辑器,这种效率神器实在是深得我心,用它来写 markdown 文件既能写的快又能熟悉语法。在拜读完 vimtutor 之后,我马上使用它来写下这篇文章来记录 vim 的那些基本操作。
基本原理
命令和对象
vim 的许多命令都是都是由一个操作符和一个动作构成,比如使用删除操作的命令:
d motion
一个简短的动作列表:
w:word从当前光标当前位置到下一个单词的起始处,不包括它的第一个字符。e: 从当前光标当前位置到当前单词的末尾,包括最后一个字符。b:back从当前光标到上一个单词的起始处$: 从当前光标直到行末。 text object:s: 句子w: 单词p: 段落iw:inner word当前单词内部it:inner tagHTML 标签内的内容i":inner quotesquotes 周围的内容,比如'',"",[]ip:inner paragraph段落内as:a sentence句子内ae:entire当前文件所有内容ii:indent相同缩进的内容
操作符:
d:Delete删除c:Change更改>:Indent缩进v:Visual select视图选择y:Yank复制f(F):find查找到匹配项t(T):find查找到匹配项但不包括匹配项[other] custom operators,一些插件:Surround:ds"当前所在位置周围的 quotes 比如'',"",[]删除Commentary:cml将当前行注释ReplaceWithRegister:griw将剪切板内容代替当前单词Title case:gtip将title首字母大写,用于markdownSort case: vim 在可视模式下有sort操作,但不方便,gsip将当前段落排序System copy: 将剪切板内容显示
使用计数指定动作
在动作前输入数字可以使它重复这么多次,比如删除动作:
d number motion
模式
normal正常模式insert插入模式command命令模式,比如:wq,:q!,:vs分屏,sp(split),通过:q退出分屏模式visual可视模式,一般用于块状选择文本,V选择行,ctrl v块状选择
文本操作
移动光标
h左移j下移k上移l右移0移动到行首第一个字符^移动到第一个非空白字符$移动到行尾g_移动到行尾非空白字符gi快速跳到最后一次编辑的地方并进入插入模式w移动到下一个单词的开头,此处指的是以为空白符分割的单词W移动到下一个单词的开头,此处是指以空白符分割的单词e E b B和w W相同逻辑n <enter>光标向下移动n行f<char>可以移动到char字符上t<char>可以移动到char的前一个字符上,如果搜到,可以使用分号;或,继续搜索该行上一个,下一个F<char>搜索前面的字符()在句子间进行移动{}在段落间进行移动ctrl o移动到上一个位置H(head)跳到当前屏幕开头M(middle)跳到当前屏幕中间L(lower)跳到当前屏幕结尾ctrl b翻到上一页ctrl f翻到下一页ctrl u翻到上半页ctrl d翻到下半页zz把屏幕置为中间+非空格行的下一行-非空格行的上一行
复制动作
.可以重复你的上一次动作
删除
d 开头的删除命令可以将删除的内容放入一个寄存器中,使用 p 命令可以取出
x删除光标所在的当前字符dw可以删除当前单词,当输入d时,屏幕右下会出现d单词,如果单词不对,需要按下esc重新再来daw表示delete around word会删除单词以及周围的空格,实际上就是dwd$删除当前单词到末尾dd删除当前行,因为这个命令实在太高频了
插入
i可以进入插入模式,按下esc键可以退出插入模式
添加
a:append可以在当前位置后面添加文本内容,需要使用esc键退出A: 可在当前行的最后加入内容I: 在本行开头插入内容
撤销
u撤销最后执行的命令U撤销对整行的修改Ctrl r可以重做被撤销的命令,也就是撤销掉撤销命令
更改
c相当于d命令,只不过是操作是更改cw以及正确的单词可以更改单词,但它会进入插入模式,记得使用esc退出插入模式
置入
p可以将最后一次删除的内容置于光标之后
替换
r(replace)可以输入一个字符替换当前字符R可连续替换多个字符s(substitute)替换一个字符并进入插入模式S把整行删除并进入插入模式C删除整行并进入插入模式
打开
o可以在当前行下方打开新的一行,同时进入插入模式O可以在当前行上方打开新的一行,同时进入插入模式
复制粘贴
vim 的复制粘贴会在 normal 模式或是 insert 模式下有不同的行为
vim 里操作的是寄存器而不是系统剪切板, d 或是 y 复制的内容都放到了一个无名寄存器中,vim 使用多组寄存器
"<register>前缀可以指定寄存器,不指定默认使用无名寄存器,比如"ayy将当前行复制到a寄存器中:reg <register>可查看寄存器中保存的内容 除了有名寄存器a - z,vim 中还有一些其他常见寄存器"0复制专用寄存器,使用y复制文本时会被拷到复制寄存器0"+"复制到系统剪切板"%当前文件名".上次插入的文本:set clipboard=unnamed可以直接复制粘贴系统剪切板内容normal模式y用于复制文本,可输入v进入可视模式之后使用y进行复制,之后输入p进行粘贴yw也是操作符可以加入w或是e之类的进行操作insert模式ctrl c | v进行复制粘贴
插入模式命令
ctrl h删除上一个字符ctrl w删除上一个单词ctrl u删除当前行 可以设置ctrl c或是ctrl [进行正常模式和插入模式的切换
补全
ctrl n普通关键字- 当补全有列表时,使用
ctrl n | ctrl p选择上一个或是下一个,n: next,p: previous ctrl x + ctrl f文件名补全,会展示文件路径ctrl x + ctrl 0全能补全,补全代码,需要加上插件
文件操作
定位及文件状态
ctrl g可以显示当前编辑文件中当前光标所在行位置以及文件状态信息G可以直接跳转到某一指定行,先输入行号再输入大写G
搜索类命令
\加上一个字符串可以在当前文件中查找该字符串n可以重复查找搜索的字符串?加上一个字符串可在当前文件中逆向查找该字符串*或是#进行当前单词的前向或是后向匹配ctrl o可以回退到之前的位置ctrl i跳转到较新的位置:set ic可以设置忽略大小写搜索:set noic可以设置不忽略大小写搜索:set hls高亮所有匹配短语
配对括号的查找
- 把光标放在任何一个
(,{,或是[上,按%字符,此时光标会出现在配对的括号处,再按%可以跳会第一次按括号的地方
替换操作
:s/old/new/ 回车可以替换光标所在行的第一个匹配的old为new:s/old/new/g则该行的所有匹配串都被替换:#,#s/old/new/g其中#,#表示替换操作的若干行中首尾两行的行号:%s/old/new/g替换整个文件的匹配字符串:%s/old/new/gc对整个文件的每个匹配字符串提示是否进行替换g(global)全局替换c(confirm)表示确认,可以确认或替换修改n(number)报告匹配的次数而不替换,可用来查询匹配次数ctrl r用于撤销替换unix2dos和dos2unix可让整个文件的换行符根据系统互换iconv编码转换,比如将Big5转换为UTF-8
在 vim 内执行外部操作
:!输入一行命令,所有以:开头输入的命令都需要以回车结束才会执行
保存文件
:q!不保存文件强行退出:wq保存文件修改退出:w 文件名可以将当前文件以文件名保存v键可以进入可视模式,移动光标对文本进行选取,之后按:可以看到屏幕底部出现了:'<,'>之后输入w 文件名就可以将选中文本保存到另一个文件
提取和合并文件
:r 文件名可以将创建的文件提取进来,所提取的文件将在光标处置入
多文件操作
多文件操作有几个概念
Buffer指打开一个文件的内存缓冲区,vim 打开文件都是打开缓冲区,修改的都是针对文件中的缓冲区,直到运行:w就可将修改内容写入文件Window指Buffer可视化的分割区域Tab可以组织窗口为一个工作区Buffer命令:ls列举当前缓冲区:b n跳转到第 n 个缓冲区:bpre | :bnext | :bfirst | :blast跳转到对应 buffer:e <文件路径>可以编辑对应文件Window命令 一个缓冲区可分割为多个窗口,每个窗口可打开不同缓冲区Ctrl w切换窗口Ctrl w + h移动到左边窗口Ctrl w + j移动到下边窗口Ctrl w + k移动到上边窗口Ctrl w + l移动到右边窗口Ctrl w + s水平分割,或:spCtrl w + v垂直分割,或:vs每个窗口可以被无限分割Tab是可以容纳一系列窗口的容器
其他命令
:colorsheme用于显示当前的主题配色,默认是default:colorsheme <ctrl + d>显示所有配色:colorsheme <配色名>修改配色 配色主题下载
宏(macro)
宏可以看成是一系列操作的集合,可以使用宏录制一系列操作,然后用于回放,宏的使用分为录制和回放
q来进行录制,同时也是q结束录制q<register>选择想要保存的寄存器,把录制的命令保存其中@<register>回放寄存器中保存的一系列命令:normal可使用normal模式下命令: + ctrl p可复制上一个命令
配置
常见配置
:h option-list查找所有可配置项set number设置行号colorsheme hybird设置主题"进行注释:w保存.vimrc之后要通过:source ~/.vimrc让配置效
映射
vim 映射就是把一个操作映射到另一个操作
:map <新操作符> <代替的操作符>可以临时设置代替的映射:unmap <新操作符>取消映射let mapleader = ","用于设置leader键,常用的是,或是空格,比如inoremap <leader>w <Esc>:w<cr>在插入模式保存 vim 的normal/visual/insert模式下都可以定义映射nmap | vmap | imap定义映射只在normal/visual/insert模式下分别有效 比如:imap <c-d> <Esc>ddi可以在插入模式下使用ctrl d删除一行 递归映射就是a命令替换为b命令,再用c命令替换b命令,会发现c命令允许的是a命令的动作。map命令就有这个风险 vim 提供了非递归映射,这些命令不会递归解释,比如nnoremap/vnoremap/inoremap其中nore表示no recursive非递归- *innoremap jj
^*其中的*^*表示的是回到插入模式编辑的地方 cnoremap w!! w !sudo tee % >/dev/null可以执行外部命令,此处是使用w!!进行使用sudo写入
开源配置
在线帮助
- 按下
HELP键 - 按下
F1键 - 输入
:help 回车键 - 提供一个正确的参数给
help命令,可以找到该主题的在线帮助
创建启动脚本
:edit ~/.vimrc用于编辑 vim 配置文件
补全功能
ctrl D会显示匹配的命令列表,之后按tab键可补全命令,它对于:help命令非常有效
插件
Vim 插件是使用 vimscript 或是其他语言编写的 vim 功能扩展。
在原来管理插件就是复制插件的代码,现在 vim 有很多插件管理器
vim-plug
- 首先需要下载
Plug(<插件名>)在~/.vimrc中增加该插件名称- 重新启动 vim 或是
:source ~/.vimrc :PlugInstall安装插件
一些插件
搜寻插件可以去vimawesome
- vim-startify配置开屏画面
- vim-airline美化状态栏
- indentline增加代码缩进线
- vim-hybird配色
- solarized配色
- gruvbox配色
- nerdtree文件管理
- ctrlp用于快速查找并打开一个文件
- easymotion文件内快速移动插件
- vimsurround编辑包围的符号
- fzf模糊搜索
- deoplete.nvim异步补全代码插件,支持模糊匹配,需要安装对应组件的扩展
- coc.nvim异步补全插件,支持 LSP
- Neoformat代码异步格式化,但需要安装对应语言的库,比如 js 的 prettier
- alelint 插件,需要对应的 eslnt 库,比如 eslint
- vim-commentary注释代码
- fugitive在 vim 中使用 git
- vim-gitgutter修改文件之后显示文件的变动
- tig在命令行查看提交记录
tips
. 操作
- 使用泛用性更强的命令,比如使用
iw代替w即使是在句子开头 - 尽可能地使用文本对象代替动作
- 使用重复插件
Repeat.vim