Loading...
墨滴

misaka

2021/03/22  阅读:25  主题:默认主题

vim 常用基本操作

vim 基本常用操作

前言

这篇文章介绍的是 vim 的基本常用操作,完成本文的学习就可以跨越 vim 入门的障碍。这篇文章还没有涉及到使用插件,仅是使用 vim 原先就带有的基本编辑器功能。

强烈建议:阅读本文时最好打开 vim 配合操作学习以达到最佳阅读效果。

模式

在 vim 中,每次按键在不同的模式中产生的结果是不同的。vim 8.2 的版本中,一共有 7 种基本模式和 7 种附加模式,附加模式是基本模式的变种。虽然 vim 有着 14 种模式,但是我日常常用的只有以下几种模式:

  1. 插入模式(Insert mode):插入模式是我们用的最多的模式,正常码字就是在这个插入模式。
  2. 正常模式(Normal mode):如果我们不用鼠标上下滑动查看的话,我们就需要在正常模式下进行移动,当然移动只是在正常模式下的众多操作中的一个点。
  3. 命令行模式(Command-line mode / Cmdline mode):在这个模式下可以运行一些命令,包括查看命令帮助,输入命令进行查找、替换等一系列强大操作。
  4. 可视模式(Visual mode):在这个模式下我通常用来复制多个单词,然后粘贴。
  5. 替换模式(Replace mode):在这个模式下我会用来替换文本。
  6. 终端作业模式(Terminal-Job mode):这个模式可以让我进入终端暂时查看一些东西。

更多关于 vim 模式方面的知识,可以在正常模式下 :help vim-modes 查阅。下面分模式分别介绍下一些简单的操作。

正常模式

默认的,当我们使用 vim 打开文件时,vim 就处于正常模式。许多 vim 用户可能有一个习惯,就是喜欢狂按键盘左上角的 <esc> 键,因为从插入模式回到正常模式默认的操作就是按 <esc> ,不过有时按一次可能还没反应,然后就狂按了 😶。还有一个原因就是遇事不决狂按 <esc> ,这个至少我在用 vim 时是这样的。正常模式基本操作我分为以下几点:

  1. 移动
  2. 删除
  3. 撤销
  4. 替换
  5. 查找
  6. 复制 && 粘贴

切换到正常模式

正常模式是其他各种模式切换的中转站,譬如要从可视模式切换到插入模式,就得先切换到正常模式,然后再从正常模式切换到插入模式。那么如何切换到正常模式呢,从我的使用经验中总结有两种情况:

  1. 从终端作业模式切换:键入Ctrl-\ Ctrl-N ,不过这个切换的模式理应叫终端正常模式(Termianl-Normal mode),它是 7 种附加模式之一,不过在这里把它归为正常模式的一种特殊情形了,具体信息请看下面的终端作业模式章节。
  2. 从其他模式切换:按一次 <esc> / 狂按 <esc> 。这是我办公的大部分情况,不过真实情形是我把<esc> 按键禁用了,映射成了其他键,觉得<esc> 有点远,不方便按。

移动

    ^
    k
<h      l>
    j
    v

每次按下 h 就会向左移动,按下 j 就会向下移动,按下 k 就会向右移动,按下 l 就会向右移动。当然,vim 也是支持方向键移动的,不过当你习惯于用 hjkl 移动时,你的手指活动将集中在键盘的主要活动区域,而不用在需要移动时将手指从键盘主区域移开到方向键。唯一的 tips 就是勤加练习,多用 vim 打代码。

移动
移动

折行移动

在上图中使用 vim 进行移动时,你可能会发现这么一个问题,当你在一行中输入过长的字符之后,vim 默认会将超出屏幕的部分在下一行显示,这个和 vim 中默认的 wrap 属性相关,这个属性的内容会在下一篇文章中介绍。当文字被这行之后,用 jk 移动是到不了被折的那一行的,这时候你需要的是 gjgk ,也就是快速键入两个字符。

折行移动
折行移动

总结:一般来说,正常的移动 hjkl 已经足够,但是当遇到折行时,你就可能需要 gjgk 了。

删除

单词

为了更方便地描述,我在这里先说下 vim 中单词的含义,单词是指由 vim 中 iskeyword 变量指定的字符组成的字符串,单词之间由空白字符(空格、TAB、<EOL>)分隔的,特别的,一个空白行也是一个单词。在这篇文章中我们不讨论多字节字符集,譬如中文。在 vim 中,默认的,像 谢谢 这四个字是被当做一个单词的,谢谢关注 也是一个单词。在 vim 的正常模式下,键入 :echo &iskeyword 就可以看到 iskeyword 的定义了:@,48-57,_,192-255

  1. @表示 isalpha()返回 true 的字符,也即是字母

  2. 48-57192-255 可通过以下方法查看: :echo map(range(48, 57), 'nr2char(v:val)'):echo map(range(192, 255), 'nr2char(v:val)') 查看,命令具体的含义在之后的 vim 脚本系列会讲。这两条命令的输出如下:

    ['0''1''2''3''4''5''6'
    '7''8''9']

    ['À''Á''Â''Ã''Ä''Å''Æ'
    'Ç''È''É''Ê''Ë''Ì'
    '
    'Î''Ï''Ð''Ñ''Ò''Ó''
    Ô'
    'Õ''Ö''×''Ø''Ù''Ú',
    'Û''Ü''Ý''Þ''ß''à''á',
     'â''ã''ä''å''æ''ç''è'
    'é''ê''ë''ì''í''î'
    '
    'ð''ñ''ò''ó''ô''õ''
    ö'
    '÷''ø''ù''ú''û''ü',
    'ý''þ''ÿ']
  3. _ 就是 '_' 字符。

iskeyword 也是可以由我们用户来自定义修改的,譬如我要改成是字母和逗号::set iskeyword=@,\,就可以了。

有了单词是什么的认知之后,接下来我们就可以学习有关删除的操作了。

删除操作我分为字符删除和单词删除,字符删除由 xX 来控制,单词删除由 d 来操作,当然,通过一些小技巧,字符删除由 d ,单词删除由 x 也可以做到,不过就是不方便。

字符删除

在正常模式下,键入 x 将删除光标当前字符,键入 X 将删除光标前一个字符。

单词删除

删除一个单词由 d 来控制,既然 d 是操作单词的,那么它的行为就和 iskeyword 属性绑在了一起,读者可以自行修改 iskeyword 体验一番。d 常用的操作有以下这些:

  1. dw:删除一个单词到下一个单词开始位置,dw 会连空白字符一起删除。但是dw 除了删除单词之外,像---><> 这样的也会当作一个单词删除。
  2. de:行为和dw 类似,但是不会删除空白字符。
  3. db:行为和 dw 类似,但是不是删除后一个单词,而是删除前面一个单词。
  4. dd:删除一整行。

撤销

撤销主要有两种行为:撤销和撤销之前的撤销。撤销是由u控制,撤销之前的撤销由Ctrl-R控制。

替换

替换分为单个字符替换和单词替换。

  1. 单个字符替换是由字符r控制的,先键入r,然后键入要替换的字符。
  2. 单词替换由c来控制,将单词替换一节的d换成c就是对应的行为了,只不过c会自动进入插入模式等待输入。
  3. 更强的替换:R进入替换模式,随移替换光标所在位置,替换完成之后按<esc>退出替换模式。

查找

在正常模式中查找是键入/ ,键入之后在 vim 窗口下方你会看到 vim 正在等待你输入要查找的字符串,输入字符串之后按回车就可以查找了。查找到之后按n 跳转到下一个匹配项,按N 跳转到上一个匹配项。vim 支持快速查找光标处单词,键入* ,不过这是完全匹配查找。

vim 还支持更加强大的正则表达式查找,不过这已经超出本文讨论的主题,留到之后的文章中再叙。

复制 && 粘贴

  1. yy :复制一行,vim 中的复制术语不是叫做 copy,而是 yank。
  2. p :粘贴

vim 中使用了寄存器的概念,我们上述很多操作都使用了寄存器,只是这些工作 vim 在默默的做了,我们不知道罢了,譬如删除一行dd ,会将删除了的内容放在一个未命名的寄存器中,可以通过:reg " 来查看未命名的寄存器,yy 操作也会把内容默认放在未命名的寄存器中,粘贴时再从中将内容拿出来,所以如果 yy 之后 dd ,接着 p ,发现粘贴的结果和复制的不一样,可以查下寄存器内容。更多寄存器知识,请用 :help reg 查看。

插入模式

插入模式可以说是我们的工作模式,在插入模式中我们可以像在记事本中做文本输入一样。在正常模式中,键入 i 就可以进入插入模式了,狂按<esc> 就可以返回正常模式了。根据光标插入位置的不同,vim 为我们提供了其他指令从正常模式进入插入模式:

  1. i : 在光标之前进入
  2. I :在行首进入
  3. a :在光标之后进入
  4. A :在行末进入
  5. o :在下一行插入新行
  6. O :在上一行插入新行
  7. s :删除当前字符并进入插入模式,相当于xi ,先删除当前字符,再在当前位置进入插入模式。
  8. S :删除当前行并进入插入模式。

在以上 8 条指令中,前 6 条是我用的最多的,这些都是可以快速提高效率的命令,需要勤加练习。

命令行模式

命令行模式是一个很强大的模式,从最简单的保存退出到支持各式各样的函数,插件。在本文中,我只挑选在办公中常用的命令叙述。

进入命令行模式

键入: 就可以看到 vim 窗口下方等待你键入命令了。

注意:以下操作都是进入命令模式之后的操作!

保存

  1. 保存文件:w
  2. 退出:vim 要求文件如果修改了不能退出,如果要强制退出,使用 q! 。正常退出使用q
  3. 保存并退出:wq

行数跳转

跳转到文件的哪一行可以通过:n 来实行跳转,n 表示要跳转到第几行,譬如要到第 100 行,就是 :100

帮助手册

:help 字符串 进入某条帮助手册,譬如 :help vim-modes 查看 vim-modes 的帮助手册,值得一提的是,vim 命令行模式支持 TAB 键帮忙补全。

执行 shell 命令

:! shell命令 可以到 shell 中执行 shell 命令,譬如 :!pwd 查看当前目录是什么(中间有无空格无所谓,如 :! pwd 也可以),按 q 返回到 vim。

进入终端工作模式

这个请阅读下面关于终端工作模式章节。

可视模式

在可视模式中,我们可以删除、复制任意多的字符。进入可视模式有两种方式:

  1. v :逐个字符选择,使用 hjklggG进行移动。
  2. V :逐行选择,使用 hjklggG进行移动。

在可视模式下选择了字符之后,可以键入 d 就可以删除选择的字符,键入y 就可以复制选择的字符。譬如我要删除从光标行到首行的内容,就可以先键入V 进入逐行可视模式,然后键入gg 选中从光标处到首行的文本,键入d 删除这段内容。

替换模式

替换模式在正常模式的替换一节中也提到了,键入R 就进入替换模式,然后就可以随意输入替换光标处文本了。

终端作业模式

首先通过:echo has('terminal') 查看是否支持 terminal 模式,结果为 1 才支持。

进入终端作业模式就相当于进入了一个终端,然后就可以正常键入 shell 命令来执行了。我一般是直接通过:terminal 进入,在终端页面键入Ctrl-\ Ctrl-N 进入终端正常模式,在终端正常模式下,可以使用正常模式的那些指令,不过不能修改里面的内容,在终端正常模式下,键入i 就可以回到终端作业模式了,在作业模式下,键入exit 就可以退出作业模式了。在终端作业模式下,你可能还需要时不时地跳到 vim 的其他“面板”,可以用Ctrl-W + hjkl 来跳转,譬如 Ctrl-W j 跳到下面那个“面板”,Ctrl-W k 跳到上面那个“面板”。

结束语

至此,vim 的基本操作就结束了,学会这篇文章的内容之后,在 vim 上做一些基础编辑阅读操作基本上就没什么问题了,但是如果需要更有效率的码代码,就需要插件的配合了,关于插件的内容,在接下来 vim 系列文章中将会介绍。

由于 vim 的学习曲线是比较难,但是认真学习过一段时间之后,路就比较平坦了。重点是勤加练习,多使用 help 命令,多上网查资料。vim 还自带教程,在终端中通过vimtutor 可以查看。

misaka

2021/03/22  阅读:25  主题:默认主题

作者介绍

misaka