VIM 基本使用

2019-11-24

开始编辑

需要进入编辑模式。

  • 开始进入 VIM 时为 normal 模式,输入 i(insert) 、a(append)、o(open a line below) 进入编辑模式。
  • i:在当前光标所在位置之前插入。
  • a:在当前光标所在位置之后插入(此时光标会向后移动一位,然后继续在光标之前插入)
  • o:在当前光标所在行的下一行插入。
  • I:在当前行的最前面进行插入。(insert before line)
  • A:在当前行的最后面进行插入。(append after line)
  • O:在当前行的上一行新建一行进行插入。(append a line above)
  • 使用 Esc 又可以回到 normal 模式(此时光标会向前移动一位)。输入 :wq (write quit) 保存退出;输入 :q退出;输入:q!强制退出(不会保存做出的修改);使用 :e! 重新加载而不保存。

VIM 的模式

  • 进入 VIM 默认为 normal(普通)模式。使用 Escinsert(插入)模式(插入模式下可以直接编辑)回到普通模式(普通模式下可以进行各种命令操作和移动操作);在插入模式下输入 Ctrl + O 可以在插入模式下执行命令模式下的命令。
  • command (命令)模式:normal(普通)模式下输入 : 之后执行命令。比如:

分屏 :vs(vertical split)左右分屏;:sp(split)上下分屏
设置行号::set nu;设置语法高亮::syntax on

  • visual (可视)模式:一般用来块状选择文本。
  • normal 模式下输入 v(小写) 进入 visual 选择模式;输入 V(大写) 选择行;使用 Ctrl + v 进行方块选择。

VIM 编辑技巧

插入模式下如何快速纠错

  • Ctrl + h:删除上一个字符
  • Ctrl + w:删除上一个单词
  • Ctrl + u:删除当前行

快速切换 insert 和 normal 模式

  1. insert 模式进入 normal 模式(主要是 Esc 按起来不方便)
  • 使用 Ctrl + c(可能会中断某些插件)或者 Ctrl + [ 代替 Esc
  1. normal 模式进入 insert 模式中最后一次编辑的位置进行插入
  • normal 模式下输入 gi 快速跳转到你最后一次编辑的位置并进入插入模式

VIM 快速移动

  • h(左移)、j(下移)、k(上移)、l(右移)
  • w/W移动到下一个 world/WORLD 开头
  • e/E移动到下一个 world/WORLD 结尾
  • b/B 移动到上一个 world/WORLD 开头
  • word 指的是以非空白符分割的单词;WORD 指的是以空白符分割的单词

括号间跳转 %

使用 % 可以在一对括号间跳转。
小括号跳转(当光标在括号内部时使用)

  • ]):紧挨着的下一个 )
  • [(:紧挨着的上一个 (
  • [:往上
  • ]:往下

函数间跳转

  • [m:跳转到上一个函数开头
  • [M:跳转到上一个函数结尾
  • ]m:跳转到下一个函数开头
  • ]M:跳转到本函数结尾

跳转到定义处(和 Ctrl + 左键点击类似)
gd(goto global declaration):找到本地定义

行间搜索移动

同一行快速移动的方式其实是搜索一个字符并且移动到该字符所在位置

  • 使用 f{char}可以移动到 char 字符上,t 移动到 char前一个字符
  • 如果第一次没搜索到,可以用分号(;)或者逗号(,)继续搜索该行下一个上一个字符
  • F 表示反向搜索光标之前的字符

水平移动

  • 0移动到行首第一个字符,^移动到行首第一个非空白字符(可以使用 0w 代替)
  • $移动到行尾,g_移动到行尾非空白字符

垂直移动

可以在句子(sentence)和段落(paragraph)间移动

  • 使用括号()在句子间移动,可以用:help( 来查看帮助
  • 使用 {} 在段落间移动
  • -:移动到一行行首
  • +:移动到一行行首
操作 含义
Ctrl + Y 滚动一行
Ctrl + U 向上滚动半屏
Ctrl + B 向上滚动一屏
Ctrl + E 滚动一行
Ctrl + D 向下滚动半屏
Ctrl + F 向下滚动一屏

页面移动

  • gg[[ 移动到文件开头;G]] 移动到文件结尾;可使用 Ctrl + o 快速返回
  • H/M/L 跳转到屏幕的开头(Head)、中间(Middle)、结尾(Lower)
  • Ctrl + u向上翻页(upword);Ctrl + f向下翻页(forward)
  • zt把光标所在行置为顶部
  • zz把光标所在行置为中间
  • zb把光标所在行置为底部
``     # 移动到上次位置,只能在两次位置间互相移动

VIM 快速增删改查

1. 增加字符

  • 进入插入模式编辑文本

2.快速删除

  • normal模式下使用 x 快速删除一个字符;
  • 使用 d(delete)配合文本对象 快速删除一个单词,如:daw(delete around word)、diwdw
  • dd 删除当前行;
  • dt):删除括号内的内容,dt":删除双引号内的内容;(delete to char:删除当前位置到指定字符处的内容)
  • d$:删除到行尾;d0:删除到行首;
  • dx 都可以搭配数字来执行多次,如2dd:删除两行;2x:删除两个字符。

3. 快速修改

  • normal模式下使用 r(replace)可以替换一个字符;R 输入字符覆盖掉光标之后的内容并进入插入模式;s(substitute)为删除当前字符并进入插入模式(可配合数字使用);S 删除当前行并进入插入模式
  • 使用c(change)配合文本对象,可以快速修改 ,如caw删除当前单词并进入插入模式,ct" 删除双引号中的内容并进入插入模式;C 删除当前行光标所在位置之后的内容并进入插入模式
  • 也可配合数字使用
  • :help 命令:查看命令用法及意义,如 :help s

4. 快速查找

可以使用 :set hls 将搜索到的内容进行高亮显示;使用 :set incsearch 搜索时边搜索边高亮显示

  • 使用 / 或者 ? 进行 向前向后 搜索
  • 使用 nN 跳转到 下一个上一个 匹配
  • 使用 *# 进行当前单词的 前向后向 匹配

VIM 替换命令

substitute命令允许我们查找并且替换掉文本,其支持正则表达式

  • :[range]s[ubstitute]/{pattern}/{string}/[flags]
  • 使用冒号表示在命令模式下执行
  • range表示操作范围,比如:10,20表示10\sim 20行,%表示全部
  • pattern表示要替换的模式
  • string表示替换后的文本
  • flags表示标志,其有几个常用的标志,如下所示
    • g(global)表示全局范围内执行
    • c(confirm)表示确认,可以确认或拒绝修改(每次替换前会进行确认)
    • n(number)报告匹配到的次数而不替换,可以用来查询匹配次数

:% s/this/self/g 表示将文本中所有的 this 替换为 self
:% s/self//n 查询文本中所有 self 的出现次数

VIM 多文件操作

1.Buffer 是指打开的一个文件的内存缓冲区

VIM 打开一个文件后会加载文件内容到缓冲区,之后的修改都是针对内存中的缓冲区,并不会直接保存到文件,直到执行 :w (write)的时候才会把修改的内容写入到文件中。

如何在 Buffer 之间切换?

  • 用 VIM 打开一个文件后,输入 :e file_name可以打开另一个文件(file_name为文件名)
  • 使用 :ls 会列举当前缓冲区,然后使用 :b n 跳转到第 n 个缓冲区
  • :bpre(跳转到上一个缓冲区)、:bnext(跳转到下一个缓冲区)、:bfirst(跳转到第一个缓冲区)、:blast(跳转到最后一个缓冲区)
  • 或者用 :b buffer_name 加上 Tab 补全来跳转

2. 窗口是 Buffer 可视化的分割区域

  • 一个缓冲区可以分割成多个窗口,每个窗口也可以打开不同的缓冲区
  • Ctrl + w + s水平分割,Ctrl + w + v垂直分割,或者用 :sp:vs
  • 每个窗口可以继续被无限分割


    分割窗口.PNG

如何切换窗口

切换窗口的命令都是使用 Ctrl + w(window)作为前缀

命令 用途
Ctrl + w + w 在窗口间循环切换
Ctrl + w + h 切换到左边窗口 H时,可以左移窗口
Ctrl + w + j 切换到下边窗口 J时,可以下移窗口
Ctrl + w + k 切换到上边窗口 K时,可以上移窗口
Ctrl + w + l 切换到右边窗口 L时,可以右移窗口

如何重排窗口

重排窗口可以改变窗口的大小 :h window-resize 查看文档

命令 用途
Ctrl + w + = 使所有窗口等宽、等高
Ctrl + w + _ 最大化活动窗口的高度
Ctrl + w + | 最大化活动窗口的宽度
[N] + Ctrl + w + _ 把活动窗口的高度设为N
[N] + Ctrl + w + | 把活动窗口的宽度设为N

3. Tab 可以将窗口组织为一个工作区,可以将窗口分组

Tab 是可以容纳一系列窗口的容器 :h tabpage

命令 用途
:tab[edit] {filename} 在新标签页打开 {filename}
Ctrl + w + T 把当前窗口移动到一个新标签页
:tab[close] 关闭当前标签页及其中的所有窗口
:tab[only] 只保留活动标签页,关闭其他所有标签页

Tab 切换操作

Ex 命令 普通模式命令 用途
tab[next] {N} {N}gt 切换到编号为 {N} 的标签页
:tab[next] gt 切换到下一标签页
:tab[previous] gT 切换到上一标签页

Text Object(文本对象)

VIM里文本也有对象的概念,比如一个单词、一段句子、一个段落 ,很多其他编辑器经常只能操作单个字符来修改文本,比较低效;VIM 通过操作文本对象来修改要比只操作单个字符高效。

文本对象操作方式

  • [number]<command>[text object]
  • number 表示次数,command 是命令,d(delete)、c(change)、y(yank)、v(visual)
  • text object表示要操作的文本对象,比如单词(w,word),句子(s,sentence),段落(p,paragraph)。

iw 表示 inner word,如果键入viw命令,那么首先v进入可视模式,然后iw选中当前单词。
aw 表示 around word,它不但会选中当前单词,还会包含当前单词之后的空格。

VIM 复制粘贴与寄存器的使用

1. normal 模式下复制粘贴

  • normal 模式下复制粘贴分别使用 y(yank)和 p(put),剪贴:dp(先删除后粘贴)
  • 我们可以使用 v(visual)进入可视模式选中要复制的内容,然后使用 y复制,使用 p 粘贴
  • 配合文本对象:比如使用 yiw 复制一个单词,yy 复制一行
  • 使用 u 可以撤回
  • 使用 Ctrl + r 可以反撤回

2. Insert 模式下复制粘贴

  • 和其他文本编辑器相同,即使用Ctrl + c复制,Ctrl + V粘贴;但是粘贴代码时会出现缩进混乱;
  • 当在插入模式下粘贴系统剪贴板的内容时,需要先按 Ctrl + r,然后按下 + 即可;
  • 很多人在 vimrc 中设置了 autoindent,粘贴 python 代码时缩进混乱,此时就需要使用 :set paste:set nopaste解决(使用 o 进入下一行时会与上一行对齐)

深入寄存器(register)

VIM 不使用单一剪贴板进行剪贴、复制与粘贴,而是使用多组寄存器;VIM 在 normal 模式下复制剪贴的内容去哪了?VIM 里操作的是寄存器而不是系统剪贴板,这和其他编辑器不同。

  • 默认使用 d 删除或者 y 复制的内容都放到了“无名寄存器”

  • x 删除一个字符放到无名寄存器,然后用 p 粘贴,可以调换两个字符

  • 通过 "{register_name} 前缀可以指定寄存器,不指定默认使用无名寄存器

  • 比如使用 "ayiw 复制一个单词到寄存器a 中,"bdd删除当前行到寄存器b 中。

  • 可以使用 :reg register_name查看 register_name寄存器中的内容

  • VIM中""表示无名寄存器,缺省使用。"" p就等同于p

  • normal 模式下操作 d/y/x 等命令时,通过在命令前面加入寄存器的名字如 "ayy,来将命令生成的内容放入指定的寄存器中,如上面的 a 寄存器中,而不是 vim 默认使用的 "" 寄存器和 "0 寄存器。

  • 粘贴时,normal 模式下通过在 p 命令的前面加入寄存器的名字如 "ap,来将寄存器中的内容放入到光标所在的位置行上或下;insert 模式下使用 <Ctrl>+R"a 来粘贴。

除了有名寄存器 a\sim z,VIM 中还有一些其他常见寄存器

  • 复制专用寄存器,"0使用y复制文本同时会被拷贝到复制寄存器 0
  • 系统剪贴板"+,可以在复制前加上"+复制到系统剪贴板
    • vim --version | grep clipboard 查看 VIM 是否支持系统剪贴板,如果出现-clipboard,说明你的 VIM 不支持系统剪切板。一般重新安装一下,然后配置 set clipboard=unnamedplus 即可。执行 sudo apt install vim-gtk 安装 vim-gtk 即可(或者安装 gvim),安装完成后再执行 vim --version | grep clipboard 此时应该已经支持 clipboard 功能。
    • :echo has('clipboard')输出为1表示支持系统剪贴板。还可以使用:set clipboard=unnamed直接使用系统剪贴板。
  • 其他一些寄存器,比如 "% 当前文件名,". 上次插入的文本

VIM宏(macro)

宏可以看做一系列命令的集合;可以使用宏“录制”一系列操作,然后用于“回放”;宏可以非常方便地把一系列命令用在多行文本上。

如何使用宏

宏的使用分为录制和回放

  • normal 模式下使用 q 来录制,同时 q 也表示结束录制
  • 使用 q{register} 选择要保存的寄存器,把录制的命令保存在其中
  • 使用 @{register} 回放寄存器中保存的一系列命令

实例:给多行超链接加双引号

  • 先给一行加上双引号,然后再回放到其他所有行
  • 先使用 q 录制,给一行加上双引号,之后使用 q 退出
  • 在剩下的所有行中回放录制的宏(先使用可视模式选中所有内容,然后输入 :normal @{register},即在可视模式下执行命令)

VIM 补全

  • 使用 Ctrl + nCtrl + p补全单词
  • 使用Ctrl + xCtrl + f补全文件名
  • 使用Ctrl + xCtrl + o补全代码,需要开启文件类型检查(在执行 :filetype on之后执行 :set filetype),也可安装插件
  • 当补全有多项匹配出现提示时,可以通过 Ctrl + n 选择下一个,通过 Ctrl + p 选择上一个

VIM更换配色

  • 使用 :colorscheme显示当前的主题配色,默认为default
  • 使用 :colorscheme <Ctrl + d>可以显示所有的配色(注:colorscheme后有空格)
  • 使用:colorscheme 配色名可以更换配色

还可以从网上下载配色

VIM 映射

VIM 映射就是把一个操作映射到另一个操作。

基本映射

基本映射指的是 normal 模式下的映射。

  • 使用 map 就可以实现映射。比如: :map - x:将 - 映射为 x:unmap - 取消映射;按下 - 就可以删除字符;:map <space> viw:按下空格可以选中整个单词;:map <c-d> dd:使用 Ctrl + d 执行 dd 删除一行

其他模式映射

nmap/vmap/imap 定义映射只在 normal/visual/insert 模式下分别有效。

非递归映射

使用 *map 对应的 nnoremap/vnoremap/inoremap(nore 表示 no recursion 非递归) normal 模式下的非递归映射/ visual 模式下的非递归映射/ insert 模式下的非递归映射

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353