Vim教程

##. Vim

0.1 Vim简介

vim就是linux系统上的一款文本编辑器,具有语法高亮,代码补全,代码缩进,根据扩展名识别编程语言以及编译等方便编程的功能。是程序开发者一款非常好用的工具,这也是我们为什么要学习vim。

需要注意的是,作为程序员一般认为vim是一个程序开发工具而不是文字处理软件。如果学会了vim,对编程效率有极大的提高。

如果没有安装vim,可以通过:sudo apt-get install vim来安装。

https://raw.githubusercontent.com/unique-pure/NewPicGoLibrary/main/img/image-20210902190634607.png

这个就是vim的界面,界面介绍在之后会介绍,同时vim对应的键盘功能图如下:

https://raw.githubusercontent.com/unique-pure/NewPicGoLibrary/main/img/4fa748e07a8d9bc792fde0639e55f1af.gif

​ 图源:https://www.runoob.com/linux/linux-vim.html

这个键盘图特别重要,也是vim的核心。

0.2 Vim模式

在使用vim之间,我们有必要了解它的模式,也可以认为是状态,一共有四种模式:

  • 正常模式(Normal-mode);
  • 插入模式(Insert-mode);
  • 命令模式(Command -mode);
  • 可视模式(Visual-mode)。

有的时候通常也认为是三个模式,即没有可视模式(可能是因为这个模式存在感低),我们可以参考下图理解模式之间的转换:

https://raw.githubusercontent.com/unique-pure/NewPicGoLibrary/main/img/未命名文件(6).png

接下来我们分别介绍这几个模式。

0.2.1 正常模式(Normal-mode)

此模式一般用于浏览文件,包括一些复制,粘贴,删除等操作。我们从任何模式返回到正常模式,只需要按下ESC键。

当我们通过vim 文件名.后缀启动vim时,就进入到了正常模式,如果已有文件,则打开它,否则就打开一个新的文件,并命名为文件名

此时我们是无法向文件写内容的,此状态下敲击键盘会被vim识别为命令,而不是输入字符。

当我们输入iI, a,A 时会进入插入模式。

当我们输入v时会进入可视模式。

当我们输入:时会进入命令模式,即在最底下一行输入命令。所以也叫底线命令模式。

要重点介绍的一个内容就是如何删除、复制,剪切以及粘贴了。vim对于复制,剪切,粘贴有它自己的一套术语。其中复制被叫做yank(y), 剪切被叫做delete(d),粘贴被叫做put(p)

  • 删除

    • c -向下删除一行。如果要删除多行,则输入nc,即可向下删除$n$行。
    • x - 向后删除一个字符,相当于del按键。如果要连续删除多个字符,则输入nx,即可删除$n$个。
    • X -向前删除一个字符, 相当于Backspace按键。同理nX
  • 复制(yank)

    我们如果需要复制文本,那么需要将光标放到你想要复制的地方,然后根据需求按下相应命令即可。

    • y -复制选中的文本(选中文本在视图模式中会讲到)。

    • yy -复制当前行,包括换行符。

    • <number>yy -复制从光标所在的当前行开始的number行文本。

      例如3yy即可复制从当前行开始的$3$行文本。

    • y$ -复制从光标位置到行尾的文本。

    • y^ -复制从光标位置到行首的文本。

    • yw -复制到下一个词的开头。

    • yiw - 复制当前词。

    • y% -复制匹配符号范围的内容。默认支持的符号对为(),{},[]。这个在复制括号内容时,非常有用。

    • yG -复制游标所在行到最后一行的行的所有数据。

    • ynG -n为数组,复制游标所在行到第$n$行的所有数据。

  • 剪切(delete)

    这个命令正常来说也可以作删除用。剪切文本时将光标移动到想要的位置,根据需求按下相应命令即可。

    • d -剪切选中的文本。

    • dd -剪切当前行,包括换行符等。

    • <number>dd -剪切从光标位置所在的行开始的number行文本。

    • d$ - 剪切从光标位置到行尾的内容。

    • …不难发现,这些命令和复制差不多,就是将y换成d。这里就不再做阐述了。

  • 粘贴(put)

    先将光标移动到想要粘贴的位置,然后按p键即可将剪贴板的内容复制到当前光标后面。

    当然,大写的P则是复制到光标位置前面。

  • 其他常用操作

    快捷键功能
    J |将光标所在行与下一行的数据结合成同一行 |
    gg=G |将全文代码格式化 |
    u |撤销。(常用) |
    Ctrl+r |取消撤销。(常用) |
    u Ctrl+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦! ||
    . |要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用) |
    n |重复前一个查找操作(常用) |
    N |反向重复前一个查找操作(常用) |

其他的不常用操作这里不作列举。

我们可以通过方向键操作光标位置,注意linux中的方向键可以通过hjkl分别代表左下上右。这里给出移动光标的方法表格:

快捷键功能
h 或 向左箭头键(←)光标向左移动一个字符
j 或 向下箭头键(↓)光标向下移动一个字符
k 或 向上箭头键(↑)光标向上移动一个字符
l 或 向右箭头键(→)光标向右移动一个字符
如果你将右手放在键盘上的话,你会发现 hjkl 是排列在一起的,因此可以使用这四个按钮来移动光标。 如果想要进行多次移动的话,例如向下移动 30 行,可以使用 “30j” 或 “30↓” 的组合按键, 亦即加上想要进行的次数(数字)后,按下动作即可!
Ctrl] + f屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
Ctrl + b屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
Ctrl + d屏幕『向下』移动半页
Ctrl] + u屏幕『向上』移动半页
+光标移动到非空格符的下一行行首
-光标移动到非空格符的上一行行首
n<space>那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20 则光标会向后面移动 20 个字符距离。
0 或功能键``Home`这是数字『 0 』:移动到这一行的最前面字符处 (常用)
$ 或功能键``End`移动到这一行的最后面字符处(常用)
H光标移动到这个屏幕的最上方那一行的第一个字符
M光标移动到这个屏幕的中央那一行的第一个字符
L光标移动到这个屏幕的最下方那一行的第一个字符
G移动到这个档案的最后一行(常用)
:nnGn 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)
gg移动到这个档案的第一行,相当于 1G 啊! (常用)
n<Enter>n 为数字。光标向下移动 n 行(常用)
f{char}光标跳转到光标所在行从光标开始之后的char字符处。即从光标位置到该行尾检索char字符,光标位置前的不处理
F{char}光标跳转到光标所在行从光标开始之前的char字符处。即从行开头到光标处检索char字符,光标位置前的不处理
W或者w(大小写均可)跳转到下一个单词的开头。支持数字前缀
b或者B(大小写均可)跳转到上一个单词的开头。支持数字前缀。
{光标跳转到段首
}光标跳转到段尾
^光标跳转到软行首。即该行的最早非空格位置字符。
Ee(大小写均可)移动到词尾。
(句首
)下一句首
%括号匹配。

正常模式只有一些基本的命令,因此我们需要靠命令模式来输入更多的命令。

0.2.2 插入模式(Insert-mode)

由上相信大家应该知道怎么由正常模式进入输入模式,即按下i(insert)即可进入插入模式。

在插入模式中,操作和正常的文本编辑器差不多,这里不作叙述。给出对应的快捷键操作表。

快捷键功能
Ctrl + m或者Ctrl + j开启新行
Ctrl + e插入光标下的字符
Ctrl + y插入光标上的字符
Ctrl + a插入上次插入的文本
Ctrl + @插入上次插入的文本并结束插入模式
Ctrl + w删除光标前的一个单词
Ctrl + u删除当前行的所有字符
Ctrl + T在当前行首插入一个移位宽度的缩进
Ctrl + D从当前行首删除一个位移宽度的缩进

0.2.3 命令模式(Command -mode)

我们在一般命令模式下按下:/?这三个字母中的任意一个就可以进入命令行模式了,命令行在最下面,可以进行查找、替换、保存、退出、配置编译器等操作。需要注意的就是我们每执行完一个命令之后就会回到正常模式,所以在需要操作的时候一定要输入:/?这三个字母中的其中一个。

当然输入三个字母进入实现的命令是不一样的,这里给出具体操作。

  • /word -向光标之下(向后搜索)寻找第一个值为word的字符串。

  • ?word -向光标之上(向前搜索)寻找第一个值为word的字符串。

  • :n1,n2s/word1/word2/g -n1与n2为数字,在第n1行与n2行之间寻找word1这个字符串,并将字符串替换为word2。

    如果在g后面加上c命令,即:n1,n2s/word1/word2/gc那么会在替换前要求用户确认。

  • :1,$s/word1/word2/g -将全文的word1替换成word2。

    同理,如果在g后面加上c命令,也会要求确认。

  • :w -保存。

  • :w! -强制保存,当文件属性为只读时强制写入。不过这还是跟你对该文档的权限有关。

  • :q -退出vim。

  • :q! -强制退出vim。

  • :wq -保存并退出。

  • :set paste -设置成粘贴模式,取消代码自动缩进。

  • :set nopaste -取消粘贴模式,开启代码自动缩进。

  • :set nu -显示行号。

  • set nonu -隐藏行号。

  • :noh -关闭查找关键词高亮。

0.2.4 可视模式(Visual-mode)

这个模式存在感很低,有的甚至将它归结为正常模式。因为进入可视模式最直接的一个目的就是选中区域,然后再这个区域上进行操作,例如删除,替换等。不过,我认为这个模式异常重要,因为技巧性特别多。用好了这个模式,效率能大大的提高。

  • 如何选中一块区域?

    在vim中有三种激活可视模式并选择一块区域的方法:

    模式类型激活方式选择效果左下角提示(即提示你当前处于何种模式)
    符文本 |v`(小写) |逐个字符选择文本 |VISUAL |
    行文本 |V`(大写) |逐行选择文本 |VISUAL LINE |
    块文本 |Ctrl + v` |照块的方式选择文本 |VISUAL BLOCK |

    可能看着有点懵。我们来解释一下,

    • 对于字符文本选择,实际上就是从当前光标位置开始,通过方向键去逐个字符连续选取文本,和我们在平常的文本编辑器中按住shift键移动方向键选取功能相同;
    • 对于行文本选择,那么也是从当前光标位置开始选择,通过方向键去逐行连续选取文本,和上一个区别在于粒度不一样,这个方式选择的最小单位是行;
    • 而对于块文本选择为最强大的选择模式,因为前面两种选择具有局限性,这个模式它可以完全无视行的存在,可以在文本中按照需要的区域自由u许纳泽。

    我们来看一个例子:

    https://raw.githubusercontent.com/unique-pure/NewPicGoLibrary/main/img/watermark%2Ctype_d3F5LXplbmhlaQ%2Cshadow_50%2Ctext_Q1NETiBAdW5pcXVlX3B1cnN1aXQ%3D%2Csize_20%2Ccolor_FFFFFF%2Ct_70%2Cg_se%2Cx_16-20231125215318158.png

    假设我们要选择Hello,Linux,那么使用字符文本选择我们只需要将光标移动到H处,然后进入字符文本选择模式,再通过方向键选中即可。块文本选择同理操作即可。

  • 如何快速选择目标区域?

    如果通过以上模式而不使用快捷键选取,那么效率很低。而在正常模式中,我们已经介绍了很多快速移动光标的命令,而在可视模式下,这些快速移动光标的命令也是可以使用的。

  • 如何重复选择目标区域?

    可以使用gv命令来重新选中之前选中的目标区域。

  • 对选中的区域进行操作

    命令命令效果
    d` |删除选中文本 |
    c` |修改选中文本 |
    r` |替换选中文本 |
    I` |选中文本前插入 |
    A` |选中文本后插入 |
    gu` |中区域转为小写 |
    gU` |中区域转为大写 |
    g~` |大小写互调 |
    >` |右缩进一个单位 |
    <` |左缩进一个单位 |

0.3 快捷键速览图

vi-vim-cheat-sheet-sch

1 参考文献

y总Linux基础课

精通 VIM ,此文就够了-zempty

Linux vi/vim - runoob.com

vim编辑器 莫迟


相关内容

Buy me a coffee~
HeZephyr 支付宝支付宝
HeZephyr 微信微信
0%