L o a d i n g . . .
SHIWIVI-文章

//sunny forever
while(life<end){
love++;
beAwesome :)}

    <
  • 主题:
  • + -
  • 清除背景
  • 禁用背景

vim笔记

字数:9830 写于:2021-06-15
最新更新:2021-06-15 阅读本文预计花费您29分钟
第一次接触到vim时连字都不会打...后来在某管乱逛的时候看到两个Google的 秃头 工程师用vim花式结对编程时,vim就深深折服了我,那效率真是芜湖~,谁不想有个这样的 jiyou 普通朋友来次愉快的多线程交流呢๑乛◡乛๑

vi 与 vim 简介

vi:为 visual interface 的简称,是Linux操作系统中最经典的文本编辑器。

vim:全称为vi improved,从vi 发展而来的文本编辑器,支持代码补全、编译、错误跳转等功能。在很多Linux发行版中,直接预装有vim编辑器,vim本身也发布了支持Windows、Unix、MacOS等不同操作系统的编辑器版本,并且很多优秀的IDE都有支持vim的插件,因此使用vim命令可以在各种操作系统环境下高效编辑代码/文本。

vim官方网站:https://www.vim.org/

    vim的特点:
  • 熟练掌握vim以后可以极大地提高编辑速率
  • 所有操作可以靠键盘完成,免去了键盘鼠标来回切换的时间
  • 甚至于在部分终端中不支持鼠标操作,无UI界面,所有操作靠命令
  • 无花里胡哨的排版功能,但有很多花里胡哨的的插件可以玩
  • 命令操作一切
  • 大多数服务器默认安装

vim 的三种工作模式

不同文档对命令、工作模式的翻译可能不同,不过在vim中操作是一样的

命令模式

打开文件会首先进入命令模式,是 vim 使用的入口。该模式下可对文件内容进行基本的快捷操作,如:定位、翻页、复制、粘贴、删除等

在命令模式下输入i进入编辑模式,进入编辑模式后按下esc返回命令模式

在命令模式下输入:进入末行模式,进入末行模式后按下esc返回命令模式

使用I、o、a等命令也可进入编辑模式,具体用法详见插入命令。
末行模式

在vim最底部输入命令的模式,也是vim 的出口,当要退出 vim 返回控制台时,需要在末行模式下输入命令。该模式下可对文件整体进行基本的操作,如:保存、退出、另存、搜索与替换等操作。

末行模式下输入wq可快速保存并关闭文件

编辑模式

用于编辑文件具体内容的模式

此外

还有可视模式替换模式两个用于选取字符、替换内容等具体操作的模式

文件打开与保存

打开与新建文件

  • vim 文件名 打开/新建文件
  • vim 文件名 +行号 打开文件并跳转到对应行号
  • vim 文件名 +打开文件并跳转到文件末尾
  • vim 文件名1 文件名2 ... 同时打开多个文件

使用命令时,若文件名对应的文件存在,则会用vim编辑器打开该文件,若文件不存在,则会新建一个文件。打开多个文件时,默认显示第一个文件,可以通过命令:ls让vim列出所有打开的文件,使用:b数字来使对应序号的文件显示在屏幕上。

保存与退出(末行模式下)

需要先切换到末行模式下,因此下述命令前的 : 号用于换到末行模式

  • :w 保存
  • :w! 强制保存
  • :q 退出,如果没有保存则不允许退出
  • :q! 不保存,强制退出
  • :wq 保存并退出
  • :x 保存并退出

更多末行模式下的命令在末行模式下的命令小节

异常退出

如果 vim 异常退出,会为当前编辑但尚未保存的文件创建一个后缀名为.swp交换文件,该文件默认隐藏,下次打开未保存的文件会询问如何进行操作,可以根据vim提示选择恢复、直接编辑等操作。

光标移动

移动光标

基础移动
  • h  向左
  • j   向下
  • k  向上
  • l   向右
行内移动
  • 0   行首
  • $   行尾
  • w  移动到下一个单词开头(word)
  • b   向前移动一个单词(back)
  • ^   行首,第一个不是空白的字符位置
  • g_   行尾,最后一个不是空白的字符位置
  •   e   下一个单词结尾
  •   f字符  下一个对应字符位置
  •   nf字符  下n个对应字符位置
  •   F字符  上一个对应字符位置
  •   nF字符  上n个对应字符位置
  •   t字符  下一个该字符的前一个字符位置
  •   nt字符  下n个该字符的前一个字符位置
  •   T字符  上一个该字符的后一个字符位置
  •   nT字符  上n个字符的后一个字符位置

当使用f、F、t、T关键字跳转时,使用 ; 可以快速跳转到下一个指定字符,使用 , 可以跳转到上一个指定字符。

行间移动
  • gg    跳转到文件第一行行首
  • G      跳转到文件最后一行行首
  • 数字gg  跳转到数字对应行数
  • 数字G    跳转到数字对应行的行首
  • : 数字    跳转到数字对应行数
屏幕内移动
  • Ctrl+b   向上翻页(back)
  • Ctrl+f    向下翻页(forward)
  • H       当前屏幕第一行行首(Head)
  • M      屏幕中间(Middle)
  • L        屏幕底部(Low)
  • zt       把当前行移动到屏幕顶部
  • zz       把当前行移动到屏幕中央
  • zb       把当前行移动到屏幕尾部
段落切换

vim 中以空白行来区分段落,开发程序时将同一个功能相关的代码写在一起,不留空行。而在不同功能间留下空白行方便切换。

  • {  上一个段落
  • }  下一个段落
括号间切换

用于在程序中出现频率很高的( )[ ]{ }间切换,需要先把光标移动到其中一个括号上,然后使用%可切换到与其匹配的另外一边括号

  • %  括号匹配及切换
添加标记与跳转

在开发时,某段代码可能需要稍后处理,此时可用标记功能并在稍后快速跳转。

  • m字母      添加标记,字母可用a-z或A-Z间的任意字母(mark)
  • ' 标记的字母  跳转到该字母标记的行首(英文单引号)
  • `标记的字母  跳转到该字母标记处(esc下的撇号)
  • :marks  列出所有标记
  • :delmarks 标记名 标记名....  删除对应标记名(可单个删除可多个删除)
  • :delmarks!  删除所有小写字母标记

大写字母标记符可以实现文件间的跳转,因此大写字母通常用于文件间的标记

如果添加标记的行被删除,标记也将被删除。

如果其他行添加了同名标记,之前添加的标记将被替换掉。

可视模式与文本选取

在命令模式下使用下列命令可切换到可视模式,vim 有三种可视模式。

可视模式通过与光标移动命令搭配使用来选取文本,如:ggVG可用于选中所有文本,选取的文本可通过esc放弃选中并返回命令模式。

  • v(常规可视模式)    选中光标经过的所有文本
  • V(可视行模式)    整行选中光标经过的所有文本
  • Ctrl+v(可视块模式)  垂直方向选中文本(类似于vscode的shift+Alt+鼠标点击,用于多行输入/删除)

文本编辑命令

撤销与恢复撤销

用于撤销错误的编辑操作,或者恢复撤销的命令,可用多次使用!

  • u      撤销上一个命令(undo)
  • Ctrl+r  恢复撤销的命令(redo)
  • U      撤销所有在最近编辑的行上的操作

删除换行符

  • J 删除该行的换行符,将该行与下一行合并为一行

删除文本

  • x         删除光标所在字符或选中的文本(cut)
  • d移动命令  删除移动命令对应的内容(delete)
  • dd      删除光标所在行
  • D        删除光标至行尾间的内容
  • :n1,n2d   多行删除,n1为起始行号,n2为结束行号(末行模式下)

删除命令与移动命令的常用组合

  • dw      从光标位置删除到单词末尾
  • dnw      删除n个单词
  • df字符    从光标处删除到下一个该字符处
  • d$      删除光标到本行末尾
  • d0      从光标位置删除到该行起始位置(光标前该行的所有内容)
  • d}       从光标位置删除到段落结尾
  • ndd     从光标位置向下连续删除 n 行
  • d行号G   删除光标所在行到指定代码行之间的所有内容
  • d'标记符  从光标所在行删除到标记符之间的所有代码
  • dH      删除屏幕第一行到光标所在行
  • dG      删除光标所在行到文件结束

复制粘贴

vim提供一个用于保存被复制、删除文本的缓冲区

复制命令会将选中的文字保存在该缓冲区

删除命令会将删除内容保存在该缓冲区

粘贴命令会将缓冲区内容插入光标所在位置

  • y移动命令  复制(copy)
  • yy      复制一行,nyy会复制n行(copy)
  • y$      复制光标到本行结尾
  • yH      复制屏幕第一行到光标所在行
  • yG      复制光标所在行到文件结束
  • p       粘贴于光标之后(paste)
  • P       粘贴于光标之前(paste)
vim中的文本缓冲区只有一个,后续做过复制、删除命令操作后,之前缓冲区中的内容会被替换
输入替换(替换模式)

r命令用于轻量级修改,不需要进入替换模式

R可进入替换模式,修改完成后通过esc返回命令模式

  • r   替换当前字符(replace)命令模式
  • R  替换当前行光标后的所有字符(replace)替换模式
缩排和重复执行

用于编排代码格式

  • >>   向右增加缩进(增加4个空格)
  • <<   向左减少缩进(减少4个空格)
  • .    重复上次命令

可视模式下,缩排命令只需一个><即可。缩排一次后,用 . 命令执行多次缩排快速进行排版

查找
1.指定字符查找
  • /字符   查找指定的字符

输入查找内容后回车,vim会高亮找到的内容,此时可使用n/N命令跳转

  • n   查找下一个(next)
  • N   查找上一个(next)
2.快速匹配单词
  • *   向后查找光标所在单词
  • N   向前查找光标所在单词

直接按上述键,vim会识别当前光标所在的单词,然后查找相同的单词
vim会高亮显示查找到的内容,若想取消高亮显示,使用/字符命令查找一个不存在的字符串将取消高亮显示。搜索支持正则表达式 !
查找并替换

替换指定的内容,vim中查找并替换命令需要在末行模式下执行,语法组成为:作用范围s/替换内容/新内容/标识符,标识符可由下列3类自由组成。

i表示大小写不敏感查找

I表示大小写敏感查找

g指定区域中找到的所有目标

c替换前需确认

1.仅替换第一个目标
  • :s/替换内容/新内容  仅替换当前行中的第一个目标内容
  • :%s/替换内容/新内容  替换文件中所有行的第一个目标内容
2.文件全局替换
  • :%s/替换内容/新内容/g  全局替换
一次性替换整个文件中的所有指定内容
3.局部替换
  • :s/替换内容/新内容/g  替换当前行中的所有目标内容
  • :行号1,行号2s/替换内容/新内容/g  替换行号1到行号2之间的所有目标内容
4.在选取内容中替换(可视模式下)

只替换选中区域中的指定内容,需要在可视模式下先选中需要替换的区域,选取区域后输入:,vim会自动补全为:’<,>’,完整语法为:

  • :'<,>'s/替换内容/新内容/g  替换选择区域中的所有目标
5.确认替换(使用标识符c时)

进行替换操作时会依次询问每一个内容是否要替换,可依次选择每个目标是否替换然后退出,或执行全部替换。

  • :s/替换内容/新内容/gc  确认替换(comfirm)

确认/取消替换命令:

  1. y  替换(yes)
  2. n  不替换(no)
  3. a  替换所有(all)
  4. q  退出替换(quit)
  5. l   最后一个,并把光标移动到行首(last)
  6. ^E  向下滚屏
  7. ^Y  向上滚屏
插入命令

用于进入编辑模式

  • i  在当前字符前插入文本(insert)
  • I  在行首插入文本(insert)
  • a  在当前字符后插入文本(append)
  • A  在行末插入文本(append)
  • o  在当前行后插入一个空行
  • O  在当前行前插入一个空行
  • s  删除光标所在字符然后插入文本
  • S  删除光标所行然后插入文本
  • cw  删除光标所在单词然后插入文本
大小写转换
  • ~  改变光标所在字母大小写
  • n~  改变光标开始的n个字母大小写
  • g~~  改变当前行字母大小写
  • gUU  将当前行字母改成大写
  • guu  将当前行字母改成小写
  • ngUU  将光标所在行开始的后n行改成大写
  • gUw  将光标所处单词改成大写
  • guw  将光标所处单词改成小写

重复执行命令

数字+命令的组合会让部分命令执行指定次数
如: 10x 删除光标后的10个字符 10>> 让光标后的10行文本进行缩进 10yy 复制10行内容
如:输入10个相同的字符串 执行步骤 1. 在命令模式下输入10 2. 输入i进入编辑模式 3. 输入需要重复的字符串 4. 输入完毕后esc返回命令模式,vim会把输入字符这个命令执行10次
以上原因,在进入编辑模式前,尽量不要触碰数字,否则可能导致命令的重复执行
执行某个命令后使用 . 号可重复执行该命令
如: dd 删除光标当前所在行后 之后每使用一次 . 会删除一行
运用举例
利用可视块将多行文本改为注释(注释符号为:#) 执行步骤 1. 移动光标到要添加注释的第一行代码,使用^定位到行首 2. 使用Ctrl+v进入可视块模式 3. 使用I进入编辑模式,并输入#。注:可视块模式下使用i插入无效 4. 输入完毕后esc返回命令模式,vim会把选中的每一行文本前都插入#
注意
重复执行只对部分命令有效,而对如 u(撤销)命令无效,vim依旧会重复执行u 命令前执行的命令。

末行模式下的命令

文件操作

末行命令主要用于文件的保存、退出、搜索与替换,以及浏览、新建、另存文件等操作

  • :e.  打开内置文件浏览器,浏览当前目录下的文件
  • :e 文件名  打开另外一个文件并切换到其中(edit)
  • :e!  放弃对所有文件的修改,恢复文件到上次保存的位置
  • :n 文件名  新建文件(new)
  • :w 文件名  保存当前文件修改到对应文件中(没有时会新建)(write)
  • :saveas 文件名  另存为新文件
  • :bn 切换到上一个文件(打开多个文件时)
  • :bp 切换到下一个文件(打开多个文件时)

切换文件时若当前文件未保存时不能切换,但可用!强制执行。文件另存为操作不会将编辑界面跳转到新另存的文件里,依旧会在当前文件编辑界面中。

输入文件名时,输入部分文件名后按下Tab键,vim会提示文件名

设置

  • :set nu  显示行号
  • :set nonu  取消行号显示
  • :数字  定位到对应的行
  • :set ic  不区分大小写
  • :set noic  区分大小写

分屏命令

分屏打开多个文件

  • vim -On 文件名1 文件名2 ...  横向分屏打开文件,从左到右依次显示
  • vim -on 文件名1 文件名2 ...  竖向分屏打开文件,从上到下依次显示

拆分当前屏幕

方便同时编辑、浏览多个文件

  • :sp [文件名]  增加横向分屏(split)
  • :vsp [文件名]  增加竖向分屏(vertical split)

可以不跟文件名,当无文件名时分屏命令会将当前文件也显示在分屏上。输入文件名忘记全称时,使用Tab键,vim会提示文件名

上述命令不添加文件名时,功能同如下两个命令,但下面两个命令使用前需先执行Ctrl+w命令

  • s  上下屏幕同时显示当前文件
  • v  左右屏幕同时显示当前文件

切换分屏窗口

切换分屏窗口都是基于Ctrl+w命令,使用下述命令前都要先执行该命令。

光标在分屏窗口中切换
  • w  按顺序切换到下一个窗口(window)(从上到下从左到右)
  • W  逆顺序切换到下一个窗口(window)(从下到上从右到左)
  • h  切换到左边的窗口
  • l  切换到右边的窗口
  • j  切换到下面的窗口
  • k  切换到上面的窗口
移动分屏窗口
  • r  按顺序互换窗口(reverse)
  • R  逆顺序互换窗口(reverse)
  • H  将当前分屏移动到左边
  • L  将当前分屏移动到右边
  • J  关将当前分屏移动到下面
  • K  将当前分屏移动到上面

以从上到下的窗口分布为例,将7个窗口比作7个楼层,按顺序互换窗口指顶楼7楼变6楼,6楼变5楼,依次往下,而1楼移动到7楼变成顶楼。而当4楼还分割了左右多个窗口时,无法将窗口上下移动,使用命令vim报错。但仍可以将光标切换到4楼以后,在4楼内部移动4楼分割的左右窗口。

窗口左右分布时类似,窗口可以在左右间移动,而某个窗口内部还分割了上下窗口时,使用命令报错。逆顺序类似,移动方向相反。

关闭分屏
  • c  关闭当前窗口,只剩一个时无法使用(close)
  • q  关闭当前窗口,只剩一个时退出vim(quit)
  • o  关闭其他窗口(other)

标签(tab)

标签类似于在浏览器中打开多个网页,会在窗口顶部列出各个标签,标签相当于一个vim

  • :tabnew [标签名]  创建一个对应名字的新标签(标签名省略时创建一个无名标签)
  • :tabc  关闭当前标签
  • :tabn  切换到下一个标签
  • :tabp  切换到上一个标签
  • :tabs  查看一共有几个标签
  • gt  依次在标签间切换(在命令模式下)
  • 数字gt  切换到对应顺序的标签中

执行Linux命令

  • :!Linux命令  让vim执行Linux命令(执行完Enter会返回文件)
  • :r !Linux命令  让vim执行Linux命令并添加执行结果到光标处

定义字符串快捷输入(ab)

用于需要频繁输入某个长字符串时,使用一个较短的字符串快速打出该长字符串

  • :ab 短字符 长字符串  定义一个长字符串快捷输入
如:当需要频繁输入邮箱时,可以用一个短字符串定义邮箱地址 :ab gmail sheiyoubingbayouxiangxiezhemechang@Gmail.com 之后只需输入gmail空格或者回车,vim会自动补全该长字符串

使用寄存器

使用复制粘贴时,vim是将内容缓存在寄存器中。用户可以自定义寄存器,vim中使用“字母来定义一个该字母(大小写均可)命名的寄存器,寄存器后往往加上具体命令,空定义寄存器无效。

  • "字母yy  复制当前行到该寄存器中
  • "字母p  从该寄存器中取出内容并粘贴
  • :reg  列出所有寄存器
  • :reg 字母  查看对应寄存器中内容
  • “”  定义一个无名寄存器(使用复制粘贴时vim启用的是该寄存器)

定义快捷键

自定义一个用于某个操作的快捷键

  • :map key value  使用快捷键key快速执行value的步骤
快捷键通常使用Ctrl+某个不冲突的按键,而定义时该组合按键时需要通过Ctrl+v+该按键来输入
如:将某行代码注释掉 输入的命令为 :map Ctrl+v+/ I#<esc> 命令就会定义Ctrl+/为快捷键,执行的操作为:在行首插入(I的功能)#号,然后esc退出编辑模式,即以后只需要按下Ctrl+/就可以在当前行首插入#号把当前行注释掉(同vscode里的注释快捷键)
:map 命令的应用很广

结语

vim还有其他诸如宏定义、运用插件等能显著提升效率和编程体验的功能,再展开文章就显得有点冗长了,边写边设计样式人麻了,文中可能存在错误。

上一篇:Linux 系统与信息
下一篇:听歌软件推荐-Spotify
z z z z z