介绍
Vim
是对经典vi
文本编辑器的改进,在编辑代码和纯文本方面非常强大。 虽然一开始它可能看起来很迟钝和困难,但由于它的语言类似于命令语法,它是编辑文本的最有效方法之一。
在之前的文章中,我们讨论了 如何安装 vim 并进行基本编辑 。 在本文档中,我们将继续介绍更高级的主题,这些主题可能有助于展示编辑时可用的多功能性。
我们假设您已经安装了 vim 并且熟悉上面链接的文章中讨论的基本移动和编辑命令。
高级导航
在开始新材料之前,让我们回顾一下我们在上一篇文章中学到的一些导航:
- 基本动作
- h:左
- l: 对
- j: 下
- k: 向上
- 其他运动
- gg:文档顶部
- G:文档底部或行号,如果数字放在 G 前面
- w:下一个词
- e:词尾
- 0:行首
- $:行尾
正如你所看到的,我们已经有相当多的移动命令可供我们使用。 但是,我们也可以通过其他方式指导运动。
我们可以使用以下命令将光标移动到页面当前可见部分的不同区域:
- H:将光标移动到当前可见页面的顶部(认为“高”)
- M:将光标移动到当前可见页面的中间
- L:将光标移动到当前可见页面的底部(认为“低”)
如果我们想移动页面而不是光标(如滚动),我们可以使用这些命令:
- CTRL-D:向下翻页
- CTRL-U:上一页
- CTRL-E:向下滚动一行
- CTRL-Y:向上滚动一行
我们还可以通过信息的逻辑块进行导航。 如果您输入的是常规文本而不是代码,这会很有用。 这些类似于单词和行导航命令。
- ):移动到下一句的开头
- (: 移动到最后一句的开头
- }:移动到下一段的开头(由空行分隔)
- {:移动到最后一段的开头(由空行分隔)
您还可以在文件中定义自己的点来跳转。 您可以在文件中的任何位置设置 marks
。 然后,您可以参考这些标记以跳转到该点或将该点传递给接受移动的命令:
- m:键入“m”后跟一个字母会创建该字母的标记引用。
- 小写字母特定于当前文档,而大写字母只能使用一次(它们可用于跳转到不同文档中的部分。
- '':单引号后跟一个标记字母(之前用上面的“m”定义),会将光标移动到包含该标记的行的开头。
- `:反引号后跟一个标记字母会将光标移动到标记的确切位置。
这些命令允许您放置标记,然后在当前位置和标记之间定义的区域上拉动、删除或格式化。 这允许对编辑选项进行非常细粒度的控制。
如何管理文件
通常,当您工作时,无论是在软件项目还是学期论文上,您都希望能够一次引用多个文档。 Vim 有几种不同的方法来做到这一点,这取决于你希望如何工作。
如何管理缓冲区
管理多个文件的一种方法是通过 buffers
。 缓冲区通常表示打开以进行编辑的文件。 它们基本上是 vim 目前已经打开并且可以轻松访问的所有内容。
我们用 vim 像这样打开多个文件:
vim file1 file2 file3
这些文件中的每一个都在自己的缓冲区中打开。目前,我们只能看到第一个文件。
我们可以通过输入 :buffers
来查看我们有哪些可用的缓冲区。
:buffers
:buffers 1 %a "file1" line 1 2 "file2" line 0 3 "file3" line 0 Press ENTER or type command to continue
如果我们想检查下一个缓冲区,我们可以输入 :bn
。 这将更改为下一个缓冲区。 类似地,我们可以通过输入 b
后跟数字或名称来按数字(在上面的第一列中)或名称切换到缓冲区。 即使文件名不完整,这也有效。
以下是一些管理缓冲区的命令:
- :buffers: 列出可用的缓冲区
- :ls: 同上
- :bn:切换到下一个缓冲区
- :bp:切换到上一个缓冲区
- :bfirst:切换到第一个缓冲区
- :blast: 切换到最后一个缓冲区
- :bdelete:删除当前缓冲区
- :badd:打开一个新的缓冲区,文件名如下
- :e:编辑新缓冲区中的另一个文件并切换到它。
如何管理 Windows
vim 用于管理多个文件的单独控制机制是 windows
或 views
的概念。 这允许您将当前编辑区域拆分为不同的窗口,以便您可以同时查看多个缓冲区。
要将当前工作区拆分为单独的窗口,您可以键入 :split
或 :sp
。 这将在当前窗口上方打开一个新窗口并将焦点更改为该窗口。 您可以使用上面显示的缓冲区命令更改新窗口中显示的缓冲区。
以下是我们可以用来创建和管理窗口的一些命令:
- :sp:将当前窗口一分为二。 最初将在每个窗口中显示相同的缓冲区。
- 在“sp”前面加上一个数字来设置新的窗口高度。
- :vs:垂直分割当前窗口。 最初将在每个窗口中显示相同的缓冲区。
- 在“vs”前面加上一个数字来设置新的窗口宽度。
- CTRL-ww:将焦点切换到下一个窗口
- CTRL-w(movement):将焦点改变到指定方向(h,j,k,l)的窗口
- CTRL-wc:关闭当前窗口
- CTRL-w+:增加当前窗口大小
- CTRL-w-:减小当前窗口的大小
- CTRL-w=:设置所有窗口大小相等
- #CTRL-w_:将高度设置为前面“#”指示的大小
- :only: 关闭除当前窗口以外的所有窗口
- CTRL-wn:打开一个带有新缓冲区的新窗口
如何管理标签
在 vim 中管理多个文档的第三个概念是 tabs
。 与许多程序不同,在 vim 中,选项卡可以包含窗口,而不是相反。 选项卡可以包含窗口,这些窗口充当缓冲区的视口。
我们可以分别管理每个选项卡的窗口布局。 要创建标签,我们可以使用 :tabnew
命令打开一个新标签。
管理选项卡的一些简单方法是:
- :tabnew: 打开新标签
- :tabclose: 关闭当前标签
- :tabn: 切换到下一个标签
- gt:切换到下一个标签
- :tabp: 切换到上一个选项卡
- gT:切换到上一个标签
- :tab ball:打开各个选项卡中的所有缓冲区
- :tabs: 列出所有可用的标签
随着缓冲区、窗口和选项卡的移动,有时会让人混淆您当前正在查看的文件。 找出您当前正在查看的文件名的一种快速方法是键入:
- CTRL-g:显示当前文件名
文档特定命令
根据您处理的文档类型,vim 具有某些可能对您有所帮助的功能。
纯文本
如果您正在编辑纯文本文档,vim 可以通过多种方式为您提供帮助。 此功能必不可少的功能之一是拼写检查。
要在 vim 中打开拼写检查,你可以输入:
:set spell
要设置正在使用的语言,您可以键入:
:set spelllang=[language abbreviation]
现在,将检查您的文档的拼写。 正常的波浪线将出现在拼写错误的单词下方。 这就是你使用它的方式。
要在拼写错误的单词之间来回跳转,请键入:
]s # Jump to next mistake [s # Jump to previous mistake
光标悬停在拼写错误的单词上后,您可以通过键入以下内容查看拼写建议:
z=
这将为您提供可能匹配的列表。 您可以通过选择关联的数字来选择所需的选项,也可以按 ENTER 以保持单词不变。
如果要将单词标记为 而不是 拼写错误,可以将其添加到拼写列表之一。 Vim 维护两个拼写列表,一个常规列表和一个将用于当前会话的临时列表。
要将单词添加到“好”单词列表中,请使用以下命令之一:
zg # Adds word to regular dictionary zG # Adds word to the current session dictionary
如果您不小心添加了一个单词,您可以通过转到该单词并键入以下内容来删除它:
zug # Remove word from regular dictionary zuG # Remove word from the current session dictionary
如果您发现自己不得不经常输入长词组,您可以添加缩写词。
如果我们输入 :ab
后跟一个缩写和一个扩展,每当我们键入缩写后跟一个空格时,vim 都会输入扩展。
例如,如果我们是按照 Richard Stallman 的例子来纠正“Linux”与“GNU/Linux”的任何用法的坚持者,我们可以创建一个自动执行此操作的缩写:
:ab Linux GNU/Linux
现在,当我们输入“Linux”时,vim 会自动替换为“GNU/Linux”。
Linux is an operating system.
更改为:
GNU/Linux is an operating system.
但是,如果我们发现自己专门谈论内核,只有 Linux 这个词是合适的,我们可以通过在输入空格之前输入 CTRL-V
来取消扩展。
GNU/Linux is an operating system with Linux(CTRL-V) as a kernel.
如果我们不再希望使用此缩写,可以使用以下命令将其删除:
:una Linux
现在我们的“Linux”将仍然是“Linux”。
您可能不时需要做的另一件事是插入传统 qwerty 键盘上没有的字符。 我们称这些为“有向图”。 您可以通过键入以下内容查看 vim 的有向图列表:
:digraphs
NU ^@ 10 SH ^A 1 SX ^B 2 EX ^C 3 ET ^D 4 EQ ^E 5 AK ^F 6 BL ^G 7 BS ^H 8 HT ^I 9 LF ^@ 10 VT ^K 11 FF ^L 12 CR ^M 13 SO ^N 14 SI ^O 15 DL ^P 16 D1 ^Q 17 D2 ^R 18 D3 ^S 19 D4 ^T 20 NK ^U 21 SY ^V 22 EB ^W 23 CN ^X 24 EM ^Y 25 SB ^Z 26 EC ^[ 27 FS ^\ 28 GS ^] 29 RS ^^ 30 US ^_ 31 SP 32 Nb # 35 DO $ 36 At @ 64
现在,您可以通过键入 CTRL-k
和左栏中的两个字母来插入右栏中的任何字符。
例如,在我的电脑上,要输入英镑符号,我可以在插入模式下输入:
CTRL-k Pd
£
源代码
如果您正在编码,有许多不同的东西可以帮助您与代码进行交互。
最基本的方法之一是语法高亮。 您可以通过键入以下内容启用语法突出显示:
:syntax on
这应该根据检测到的文件扩展名为您的文件设置语法突出显示。 如果您想更改突出显示的语言,可以通过以下方式设置语言:
:set filetype=[language]
如果您想使用系统实用程序来修改文件中的某些行,可以在正常模式下使用 !
命令调用它。
该命令接受一个动作,然后将其发送到后面的命令。
![motion] filter
例如,要对从当前位置到文件末尾的行进行排序,您可以键入:
!G sort
Sort 是一个 Linux 命令,默认按字母顺序对输入进行排序。
如果我们想将命令的输出插入到文件中,请导航到您想要输出的空白行。 类型:
!!command
这会将指定命令的输出放入文档中。
如果我们想查看命令的结果,但不想将其插入到文档中,我们也可以使用命令模式 (:) 版本,即:
:!command
这将向您显示命令的结果,但完成后将返回您未更改的文档。
减少重复
通常在编辑或创建任何类型的文件时,您会发现自己在重复许多相同或相似的操作。 幸运的是,vim 提供了一些将命令组保存到宏中的方法。
要开始录制宏,您可以键入 q
后跟一个字母来引用宏。
qa # will save macro "a"
您键入的任何命令现在都将被记录为宏的一部分。 要结束宏,您可以再次键入 q
。
所以如果我们输入:
qa0c3wDELETED<esc>q
这将启动一个宏(另存为“a”),转到行首,并将接下来的三个单词替换为单词“DELETED”。 然后它退出插入模式并结束宏。
要播放此宏,从当前光标位置开始,使用 @
字符,后跟宏引用:
@a
这将重播从当前位置开始的宏命令。
如果我们希望创建一个以插入模式结束的宏,我们必须以不同的方式结束宏(键入“q”只会插入 aq)。 我们可以在插入模式下执行普通模式命令,方法是在它前面加上 CTRL-O
。
因此,如果我们想改变这一行第一个括号的内容,你可以有一个宏说:
qi0f(lct)<CTRL-O>q
这将创建一个宏“i”。 宏移动到当前行的开头。 然后它找到左括号并向右移动一个字符(移动到括号内)。 然后它会更改所有内容,直到右括号。 在 vim 处于插入模式等待替换文本时,我们按 CTRL-O
然后按 q
结束宏,让我们处于插入模式准备替换文本。
结论
您现在应该对 vim 可以帮助您的一些更复杂的方法有所了解。 虽然这看起来很多,但这只是表面上的问题。
有很多我们没有接触过的功能,你不需要什么都知道。 根据您选择使用 vim 的方式,您将了解什么是重要的。 每天练习和使用的次数越多,感觉就越自然,它会变得越强大。