Vim 入门:基础
我还清晰地记得我第一次接触 Vim 的时候。那时我还是一名大学生,计算机学院的机房里都装着 Ubuntu 系统。尽管我在上大学前也曾接触过不同的 Linux 发行版(比如 RHEL —— Red Hat 在百思买出售它的 CD),但这却是我第一次要在日常中频繁使用 Linux 系统,因为我的课程要求我这样做。当我开始使用 Linux 时,正如我的前辈和将来的后继者们一样,我感觉自己像是一名“真正的程序员”了。
![Real Programmers comic](/data/attachment/album/201904/20/104307h6o5ntn9h225onn0.jpg "Real Programmers comic")
真正的程序员,来自 xkcd
学生们可以使用像 Kate 一样的图形文本编辑器,这也安装在学校的电脑上了。对于那些可以使用 shell 但不习惯使用控制台编辑器的学生,最流行的选择是 Nano,它提供了很好的交互式菜单和类似于 Windows 图形文本编辑器的体验。
我有时会用 Nano,但当我听说 Vi/Vim 和 Emacs 能做一些很棒的事情时我决定试一试它们(主要是因为它们看起来很酷,而且我也很好奇它们有什么特别之处)。第一次使用 Vim 时吓到我了 —— 我不想搞砸任何事情!但是,一旦我掌握了它的诀窍,事情就变得容易得多,我就可以欣赏这个编辑器的强大功能了。至于 Emacs,呃,我有点放弃了,但我很高兴我坚持和 Vim 在一起。
在本文中,我将介绍一下 Vim(基于我的个人经验),这样你就可以在 Linux 系统上用它来作为编辑器使用了。这篇文章不会让你变成 Vim 的专家,甚至不会触及 Vim 许多强大功能的皮毛。但是起点总是很重要的,我想让开始的经历尽可能简单,剩下的则由你自己去探索。
第 0 步:打开一个控制台窗口
在使用 Vim 前,你需要做一些准备工作。在 Linux 操作系统打开控制台终端。(因为 Vim 也可以在 MacOS 上使用,Mac 用户也可以使用这些说明)。
打开终端窗口后,输入 ls
命令列出当前目录下的内容。然后,输入 mkdir Tutorial
命令创建一个名为 Tutorial
的新目录。通过输入 cd Tutorial
来进入该目录。
![Create a folder](/data/attachment/album/201904/20/104312nbyok8arxho0bnok.jpg "Create a folder")
这就是全部的准备工作。现在是时候转到有趣的部分了——开始使用 Vim。
第 1 步:创建一个 Vim 文件和不保存退出
还记得我一开始说过我不敢使用 Vim 吗?我当时在害怕“如果我改变了一个现有的文件,把事情搞砸了怎么办?”毕竟,一些计算机科学作业要求我修改现有的文件。我想知道:如何在不保存更改的情况下打开和关闭文件?
好消息是你可以使用相同的命令在 Vim 中创建或打开文件:vim <FILE_NAME>
,其中 <FILE_NAME>
表示要创建或修改的目标文件名。让我们通过输入 vim HelloWorld.java
来创建一个名为 HelloWorld.java
的文件。
你好,Vim!现在,讲一下 Vim 中一个非常重要的概念,可能也是最需要记住的:Vim 有多种模式,下面是 Vim 基础中需要知道的的三种:
模式 | 描述 |
---|---|
正常模式 | 默认模式,用于导航和简单编辑 |
插入模式 | 用于直接插入和修改文本 |
命令行模式 | 用于执行如保存,退出等命令 |
Vim 也有其他模式,例如可视模式、选择模式和命令模式。不过上面的三种模式对我们来说已经足够用了。
你现在正处于正常模式,如果有文本,你可以用箭头键移动或使用其他导航键(将在稍后看到)。要确定你正处于正常模式,只需按下 esc
(Escape)键即可。
提示:
Esc
切换到正常模式。即使你已经在正常模式下,点击Esc
只是为了练习。
现在,有趣的事情发生了。输入 :
(冒号键)并接着 q!
(完整命令::q!
)。你的屏幕将显示如下:
![Editing Vim](/data/attachment/album/201904/20/104313nxbiqx37yq3kk5qx.jpg "Editing Vim")
在正常模式下输入冒号会将 Vim 切换到命令行模式,执行 :q!
命令将退出 Vim 编辑器而不进行保存。换句话说,你放弃了所有的更改。你也可以使用 ZQ
命令;选择你认为更方便的选项。
一旦你按下 Enter
(回车),你就不再在 Vim 中。重复练习几次来掌握这条命令。熟悉了这部分内容之后,请转到下一节,了解如何对文件进行更改。
第 2 步:在 Vim 中修改并保存
通过输入 vim HelloWorld.java
和回车键来再次打开这个文件。你可以在插入模式中修改文件。首先,通过 Esc
键来确定你正处于正常模式。接着输入 i
来进入插入模式(没错,就是字母 i)。
在左下角,你将看到 -- INSERT --
,这标志着你这处于插入模式。
![Vim insert mode](/data/attachment/album/201904/20/104315z2klgi2lwlbvthgg.jpg "Vim insert mode")
写一些 Java 代码。你可以写任何你想写的,不过这也有一份你可以参照的例子。你的屏幕将显示如下:
public class HelloWorld {
public static void main([String][11][] args) {
}
}
非常漂亮!注意文本是如何在 Java 语法中高亮显示的。因为这是个 Java 文件,所以 Vim 将自动检测语法并高亮颜色。
保存文件:按下 Esc
来退出插入模式并进入命令行模式。输入 :
并接着 x!
(完整命令::x!
),按回车键来保存文件。你也可以输入 wq
来执行相同的操作。
现在,你知道了如何使用插入模式输入文本并使用以下命令保存文件::x!
或者 :wq
。
第 3 步:Vim 中的基本导航
虽然你总是可以使用上箭头、下箭头、左箭头和右箭头在文件中移动,但在一个几乎有数不清行数的大文件中,这将是非常困难的。能够在一行中跳跃光标将会是很有用的。虽然 Vim 提供了不少很棒的导航功能,不过在一开始,我想向你展示如何在 Vim 中到达某一特定的行。
单击 Esc
来确定你处于正常模式,接着输入 :set number
并键入回车。
瞧!你现在可以在每一行的左侧看到行号。
![Showing Line Numbers](/data/attachment/album/201904/20/104319ow29q27wwzs00s0y.jpg "Showing Line Numbers")
好,你也许会说,“这确实很酷,不过我该怎么跳到某一行呢?”再一次的,确认你正处于正常模式。接着输入 :<LINE_NUMBER>
,在这里 <LINE_NUMBER>
是你想去的那一行的行数。按下回车键来试着移动到第二行。
:2
现在,跳到第三行。
![Jump to line 3](/data/attachment/album/201904/20/104322x033zctfxff9ff2z.jpg "Jump to line 3")
但是,假如你正在处理一个一千多行的文件,而你正想到文件底部。这该怎么办呢?确认你正处于正常模式,接着输入 :$
并按下回车。
你将来到最后一行!
现在,你知道如何在行间跳跃了,作为补充,我们来学一下如何移动到一行的行尾。确认你正处于有文本内容的一行,如第三行,接着输入 $
。
![Go to the last character](/data/attachment/album/201904/20/104325w6poo9hhj9x6ozi9.jpg "Go to the last character")
你现在来到这行的最后一个字节了。在此示例中,高亮左大括号以显示光标移动到的位置,右大括号被高亮是因为它是高亮的左大括号的匹配字符。
这就是 Vim 中的基本导航功能。等等,别急着退出文件。让我们转到 Vim 中的基本编辑。不过,你可以暂时顺便喝杯咖啡或茶休息一下。
第 4 步:Vim 中的基本编辑
现在,你已经知道如何通过跳到想要的一行来在文件中导航,你可以使用这个技能在 Vim 中进行一些基本编辑。切换到插入模式。(还记得怎么做吗?是不是输入 i
?)当然,你可以使用键盘逐一删除或插入字符来进行编辑,但是 Vim 提供了更快捷的方法来编辑文件。
来到第三行,这里的代码是 public static void main(String[] args) {
。双击 d
键,没错,就是 dd
。如果你成功做到了,你将会看到,第三行消失了,剩下的所有行都向上移动了一行。(例如,第四行变成了第三行)。
![Deleting A Line](/data/attachment/album/201904/20/104329i0oripvlg8wz8lk7.jpg "Deleting A Line")
这就是 删除 命令。不要担心,键入 u
,你会发现这一行又回来了。喔,这就是 撤销 命令。
![Undoing a change in Vim](/data/attachment/album/201904/20/104332o8nnv8qlqqlnelim.jpg "Undoing a change in Vim")
下一课是学习如何复制和粘贴文本,但首先,你需要学习如何在 Vim 中突出显示文本。按下 v
并向左右移动光标来选择或反选文本。当你向其他人展示代码并希望标识你想让他们注意到的代码时,这个功能也非常有用。
![Highlighting text in Vim](/data/attachment/album/201904/20/104335ol7u6u61uprm7bmr.jpg "Highlighting text in Vim")
来到第四行,这里的代码是 System.out.println("Hello, Opensource");
。高亮这一行的所有内容。好了吗?当第四行的内容处于高亮时,按下 y
。这就叫做 复制 模式,文本将会被复制到剪贴板上。接下来,输入 o
来创建新的一行。注意,这将让你进入插入模式。通过按 Esc
退出插入模式,然后按下 p
,代表 粘贴 。这将把复制的文本从第三行粘贴到第四行。
![Pasting in Vim](/data/attachment/album/201904/20/104338li1hb4qmyeq46d2h.jpg "Pasting in Vim")
作为练习,请重复这些步骤,但也要修改新创建的行中的文字。此外,请确保这些行对齐工整。
提示: 您需要在插入模式和命令行模式之间来回切换才能完成此任务。
当你完成了,通过 x!
命令保存文件。以上就是 Vim 基本编辑的全部内容。
第 5 步:Vim 中的基本搜索
假设你的团队领导希望你更改项目中的文本字符串。你该如何快速完成任务?你可能希望使用某个关键字来搜索该行。
Vim 的搜索功能非常有用。通过 Esc
键来进入命令模式,然后输入冒号 :
,我们可以通过输入 /<SEARCH_KEYWORD>
来搜索关键词, <SEARCH_KEYWORD>
指你希望搜索的字符串。在这里,我们搜索关键字符串 Hello
。在下面的图示中没有显示冒号,但这是必须输入的。
![Searching in Vim](/data/attachment/album/201904/20/104340tlsr8a33l2zr2zdl.jpg "Searching in Vim")
但是,一个关键字可以出现不止一次,而这可能不是你想要的那一个。那么,如何找到下一个匹配项呢?只需按 n
键即可,这代表 下一个 。执行此操作时,请确保你没有处于插入模式!
附加步骤:Vim 中的分割模式
以上几乎涵盖了所有的 Vim 基础知识。但是,作为一个额外奖励,我想给你展示 Vim 一个很酷的特性,叫做 分割 模式。
退出 HelloWorld.java
并创建一个新文件。在控制台窗口中,输入 vim GoodBye.java
并按回车键来创建一个名为 GoodBye.java
的新文件。
输入任何你想输入的让内容,我选择输入 Goodbye
。保存文件(记住你可以在命令模式中使用 :x!
或者 :wq
)。
在命令模式中,输入 :split HelloWorld.java
,来看看发生了什么。
![Split mode in Vim](/data/attachment/album/201904/20/104345e9e9ucep9o9cruo4.jpg "Split mode in Vim")
Wow!快看! split
命令将控制台窗口水平分割成了两个部分,上面是 HelloWorld.java
,下面是 GoodBye.java
。该怎么能在窗口之间切换呢? 按住 Control
键(在 Mac 上)或 Ctrl
键(在 PC 上),然后按下 ww
(即双击 w
键)。
作为最后一个练习,尝试通过复制和粘贴 HelloWorld.java
来编辑 GoodBye.java
以匹配下面屏幕上的内容。
![Modify GoodBye.java file in Split Mode](/data/attachment/album/201904/20/104349vqbzq47gnzq4x99u.jpg "Modify GoodBye.java file in Split Mode")
保存两份文件,成功!
提示 1: 如果你想将两个文件窗口垂直分割,使用
:vsplit <FILE_NAME>
命令。(代替:split <FILE_NAME>
命令,<FILE_NAME>
指你想要使用分割模式打开的文件名)。提示 2: 你可以通过调用任意数量的
split
或者vsplit
命令来打开两个以上的文件。试一试,看看它效果如何。
Vim 速查表
在本文中,您学会了如何使用 Vim 来完成工作或项目,但这只是你开启 Vim 强大功能之旅的开始,可以查看其他很棒的教程和技巧。
为了让一切变得简单些,我已经将你学到的一切总结到了 一份方便的速查表 中。
via: https://opensource.com/article/19/3/getting-started-vim
作者:Bryant Son 选题:lujun9972 译者:Modrisco 校对:wxy
本文转载来自 Linux 中国: https://github.com/Linux-CN/archive