shell 一些常用的指令 vi(六)
1. 启动和退出vi
- 启动vi
vi
- 退出vi
:q
shell 提示符应该重新出现。如果由于某种原因,vi 不能退出(通常因为我们对文件做了修改,却没有保存文件)。 通过给命令加上叹号,我们可以告诉 vi 我们真要退出 vi。(注意感叹号是命令的一部分)
:q!
小贴示:如果你在 vi 中“迷失”了,试着按下 Esc 键两次来回到普通模式。
2. 插入文本
为了在文件中添加文本,我们需要先进入插入模式。按下 ”i” 键进入插入模式。之后,我们应当 在屏幕底部看到如下的信息,如果 vi 运行在高级模式下( vi 在兼容模式下不会显示这行信息):
-- INSERT --
现在我们就能输入一些文本了。
若要退出插入模式返回命令模式,按下 Esc 按键。
2.1 保存修改
为了保存我们刚才对文件所做的修改,我们必须在命令模式下输入一个 ex 命令。 通过按下 ”:” 键,这很容易完成。按下冒号键之后,一个冒号字符应该出现在屏幕的底部。
为了写入我们修改的文件,我们在冒号之后输入”w”字符,然后按下回车键。
文件将会写入到硬盘,而且我们会在屏幕底部看到一行确认信息,就像这样:
"foo.txt" [New] 1L, 46C written
3. 光标移动按键
不在编辑模式下,按下这些按键,
4. vi 中的撤销删除
更改文本之后,不想要更改,想要回到上一次的修改,
退出编辑模式,按esc按键,然后按下 “U” 按键。(输入语法一定要在英文的状态)
5. 追加文本,向句子末尾追加文本
因为我们几乎总是想要在行尾添加文本,所以 vi 提供了一个快捷键。光标将移动到行尾,同时 vi 进入输入模式。 它是”A”命令。
首先,使用”0”(零)命令,将光标移动到行首。现在我们输入”A”,光标就会在句子的末尾,并且进入到插入模式。
6. 追加文本,向当前行,追加一行文本
- 输入小写 “o” ,向当前行下方打开一行
- 输入大写 “O” ,向当前行上方打开一行
当输入o之后,这会在两行之间插入一个空白行,并且进入到插入模式。按下 Esc,退出插入模式。按下 u 按键,可以撤销我们的修改。
7. 删除文本
正如我们所愿,vi 提供了各种删除文本到的方法,而且只需一或两个按键。首先, x 按键会删除光标位置的一个字符。可以在 x 命令之前带上一个数字,来指明要删除的字符个数。 d 按键更通用一些。跟 x 命令一样,d 命令之前可以带上一个数字,来指定要执行的删除次数。另外, d 命令之后总是带上一个移动命令,用来控制删除的范围。这里有些实例:
按下 dG 按键删除从当前行到文件末尾的所有行。
重复按下 x 按键删除当前字符。重复按下 u 按键 直到恢复原貌。
8. 剪切,复制和粘贴文本
这个 d 命令不仅删除文本,它还“剪切”文本。每次我们使用 d 命令,删除的部分被复制到一个 粘贴缓冲区中(看作剪切板)。过后我们执行小 p 命令把剪切板中的文本粘贴到光标位置之后, 或者是大 P 命令把文本粘贴到光标之前。
9. 连接行
vi 对于行的概念相当严格。通常,用户不可能通过删除“行尾结束符”(end-of-line character)来连接 当前行和它下面的一行。由于这个原因,vi 提供了一个特定的命令,大写的 J(不要与小写的 j 混淆了, j 是用来移动光标的)用于链接行与行。
我们先把光标放到第三行的末尾:
输入大写的 J 命令:
10. 查找一行
f 命令能搜索一特定行,并将光标移动到下一个匹配的字符上。例如,命令 fa 会把光标定位到同一行中 下一个出现的”a”字符上。在进行了一次行内搜索后,输入分号能重复这次搜索。
11. 查找整个文件
移动光标到下一个出现的单词或短语上,使用 / 命令。这个命令和我们之前在 less 程序中学到 的一样。当你输入/命令后,一个”/”字符会出现在屏幕底部。接下来,输入要查找的单词或短语, 按下回车。光标就会移动到下一个包含所查找字符串的位置。通过 n 命令来重复先前的查找。
12. 全局查找和替代
vi 使用 ex 命令来执行查找和替代操作(vi 中叫做“替换”)。将整个文件中的单词“Line”更改为“line”, 输入以下命令:
:%s/Line/line/g
我们把这个命令分解为几个单独的部分,看一下每部分的含义:
我们也可以指定一个需要用户确认的替换命令。通过添加一个”c”字符到这个命令的末尾,来完成 这个替换命令。执行完之后就是全部替换,例如:
:%s/Line/line/gc
这个命令会把我们的文件恢复先前的模样;然而,在执行每个替换命令之前,vi 会停下来, 通过下面的信息,来要求我们确认这个替换:
replace with Line (y/n/a/q/l/^E/^Y)?
括号中的每个字符都是一个可能的选择,如下所示:
13 . 文件之间切换
同时能够编辑多个文件是很有用的。你可能需要更改多个文件或者从一个文件复制内容到 另一个文件。通过 vi,我们可以打开多个文件来编辑,只要在命令行中指定要编辑的文件名。
vi text.txt t.txt
vi 启动,我们会看到第一个文件显示出来:
从这个文件切换下一个文件,使用这个 ex 命令:
:n
第二个文件显示出来:
回到上一个文件使用:
:N
当我们从一个文件移到另一个文件时,如果当前文件没有保存修改,vi 会阻止我们切换文件, 这是 vi 强制执行的政策。在命令之后添加感叹号,可以强迫 vi 放弃修改而转换文件。
我们可以查看正在编辑的文件列表,使用:buffers 命令。运行这个 命令后,屏幕顶部就会显示出一个文件列表:
:buffers
要切换到另一个缓冲区(文件),输入 :buffer, 紧跟着你想要编辑的缓冲器编号。比如,要从包含文件 foo.txt 的1号缓冲区切换到包含文件 ls-output.txt 的2号缓冲区,我们会这样输入:
:buffer 2
我们的屏幕现在会显示第二个文件。
14 . 打开另一个文件并编辑
在我们的当前的编辑会话里也能添加别的文件。ex 命令 :e (编辑(edit) 的简写) 紧跟要打开的文件名将会打开 另外一个文件。 让我们结束当前的会话回到命令行。
重新启动vi并只打开一个文件
vi text.txt
要加入我们的第二个文件,输入:
:e t.txt
它应该显示在屏幕上。 我们可以这样来确认第一个文件仍然存在:
:buffers
注意:当文件由 :e 命令加载,你将无法用 :n 或 :N 命令来切换文件。 这时要使用 :buffer 命令加缓冲区号码,来切换文件。
:buffer 1
15 . 跨文件复制黏贴
当我们编辑多个文件时,经常地要复制文件的一部分到另一个正在编辑的文件。使用之前我们学到的 拉(yank)和粘贴命令,这很容易完成。说明如下。以打开的两个文件为例,首先转换到缓冲区1(foo.txt) ,输入:
buffer 1
下一步,把光标移到第一行,并且输入 yy 来复制这一行。
转换到第二个缓冲区,输入:
:buffer 2
移动光标到第一行,输入 p 命令把我们从前面文件中复制的一行粘贴到这个文件中,你就可以看到复制的内容了。
16 . 插入整个文件到另一个文件
我们也可以把整个文件插入到我们正在编辑的文件中。看一下实际操作,结束 vi 会话,重新 启动一个只打开一个文件的 vi 会话:
vi text.txt
移动光标到你想插入文本的那一行,我移动了文本的末尾,向末尾添加,然后输入以下 ex 命令:
:r t.txt
这个:r 命令(是”read”的简称)把指定的文件插入到光标位置之前。按下回车键,文本末尾追加了t.txt中的文字:
17 . 保存文件
- 在命令模式下,输入 ZZ 就会保存并退出当前文件。同样地,ex 命令:wq 把:w 和:q 命令结合到 一起,来完成保存和退出任务。
- 这个:w 命令也可以指定可选的文件名。这个的作用就如”Save As…“。例如,如果我们 正在编辑 foo.txt 文件,想要保存一个副本,叫做 foo1.txt,那么我们可以执行以下命令:
:w foot1.txt
注意:当上面的命令以一个新名字保存文件时,它并没有更改你正在编辑的文件的名字。 如果你继续编辑,你还是在编辑文件 foo.txt,而不是 foo1.txt。
参考链接: http://billie66.github.io/TLCL/book/index.html