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: gtiptitle首字母大写,用于markdown
  • Sort 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 Bw 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会删除单词以及周围的空格,实际上就是dw
  • d$ 删除当前单词到末尾
  • 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: nextp: 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/ 回车可以替换光标所在行的第一个匹配的oldnew
  • :s/old/new/g则该行的所有匹配串都被替换
  • :#,#s/old/new/g其中#,#表示替换操作的若干行中首尾两行的行号
  • :%s/old/new/g替换整个文件的匹配字符串
  • :%s/old/new/gc对整个文件的每个匹配字符串提示是否进行替换
  • g(global)全局替换
  • c(confirm)表示确认,可以确认或替换修改
  • n(number)报告匹配的次数而不替换,可用来查询匹配次数
  • ctrl r用于撤销替换
  • unix2dosdos2unix可让整个文件的换行符根据系统互换
  • iconv编码转换,比如将Big5转换为UTF-8

在 vim 内执行外部操作

  • :!输入一行命令,所有以:开头输入的命令都需要以回车结束才会执行

保存文件

  • :q!不保存文件强行退出
  • :wq保存文件修改退出
  • :w 文件名可以将当前文件以文件名保存
  • v键可以进入可视模式,移动光标对文本进行选取,之后按:可以看到屏幕底部出现了:'<,'>之后输入w 文件名就可以将选中文本保存到另一个文件

提取和合并文件

  • :r 文件名可以将创建的文件提取进来,所提取的文件将在光标处置入

多文件操作

多文件操作有几个概念

  • Buffer指打开一个文件的内存缓冲区,vim 打开文件都是打开缓冲区,修改的都是针对文件中的缓冲区,直到运行:w就可将修改内容写入文件
  • WindowBuffer可视化的分割区域
  • 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水平分割,或:sp
  • Ctrl 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

tips

. 操作

  • 使用泛用性更强的命令,比如使用iw代替w即使是在句子开头
  • 尽可能地使用文本对象代替动作
  • 使用重复插件Repeat.vim