Linux 文本编辑(vim)

内容来自实验楼

模式切换

对于从普通模式切换到插入模式下,除了使用 i 命令,我们还有一些其它的实现方式。

命令说明
i在当前光标处进行编辑
I在行首插入
A在行末插入
a在光标后插入编辑
o在当前行后插入一个新行
O在当前行前插入一个新行

需要注意的是每次要先回到普通模式才能切换成以不同的方式进入插入模式

对于从普通模式到命令行模式的切换,只需要在普通模式下输入 : 冒号,或者 /? ,在编辑器界面的最后一行(不是文本内容的最后一行),就会出现一个输入的冒号或/?,在此,我们可以输入一些命令,例如下图所示,我们在标准模式下输入:

:set number

通过输入回车键 `` ,执行该命令后,会显示文本内容的行号

光标移动

上下移动

对于 vim 来说,除了使用方向键来移动光标之外,我们还可以在标准模式下通过使用 hjkl 键来移动光标:

  • h 键,代表左移
  • j 键,向下移动
  • k 键,向上移动
  • l 键,向右移动
  • w 键,移动到下一个单词
  • b 键,移动到上一个单词

除此之外,我们还可以使用与数字结合的方式,例如普通模式下输入 5l ,代表向右移动 5 位。此处需要说明的是,下面介绍的很多命令都能与数字键结合使用,并不会特殊说明。希望大家能够自己多尝试练习使用,加深印象。

行首和行尾

对于移动到行首和行尾,我们可以分别使用下面的方式去实现。

  • HOME 键,移动到行首
  • END 键,移动到行尾
  • ^ 符号,普通模式下,该符号会移动到行首。
  • $ 符号,普通模式下,该符号会移动到行尾。

移动行

  • gg 普通模式下,移动到文件的第一行
  • G 移动到文件的最后一行
  • nG 这里 n 代表跳转的行号

对于如上所述的普通模式,我们说过,普通模式下,键入的字符会被当作命令执行。

我们还可以通过输入 :n ,这里的 n 代指行号,执行后可以将光标跳转到对应的行的行首。

位置

对于文本文件很多的时候,可能需要定位当前光标的位置,如下图所示,勾选的内容中的 1,13 代表所在的位置,行号和列号。

这一功能在实验环境中是默认开启的,未开启的情况下可以通过如下方式启用:

:set ruler

对应的取消该功能的操作为:

:set noruler
删除操作

对于文本内容的操作来说,我们可以切换到 Insert 模式下进行操作,而下面的内容,是在普通模式下通过命令进行操作。

命令说明
x删除游标所在的字符
X删除游标所在前一个字符
dd删除整行
dw删除一个单词(不适用中文)
d$D删除至行尾
d^删除至行首
dG删除到文档结尾处
d1G删至文档首部
  • 删除字符

    在普通模式下,删除字符,我们可以通过键入 x 执行删除操作。键入 x 执行的操作是删除光标所在位置的字符,如果你需要删除指定位置的字符,可以通过移动光标,然后键入 x

  • 删除一行

    要删除整行,我们可以使用 dd 命令。在普通模式下,我们在输入 dd 命令会删除光标所在的 ,而不是单个字符。

  • 删除多行

    删除多行操作,需要使用 ndd ,这里 n 代表的是一个正数,例如使用 10dd,代表着从光标所在行开始计算,往下的 10 行内容都将被删除。

  • 删除换行符

    除了删除文本内容之外,我们还可以将两行内容连接成一行内容,对于有过编程基础的同学可能知道,文本的换行都是通过换行符实现的,所以此处其实是删除 换行符。 对于删除换行符,我们使用的是大写字母 J

撤销和重做

以我们常见的删除命令为例,如果你不小心实现了误操作,删除了不应删除的行,此时你可以通过 u 命令来撤销操作。

相应的,如果撤销了太多次,此时我们可以通过 ctrl + R 键来撤销上一次的撤销操作,这儿可能有一点绕口。简单为例,如果我们的操作处于一根时间线上,那么 uctrl + R 则分别是往左和往右。

复制粘贴和剪切
  • 普通模式中使用 y 复制
    • 普通模式中,yy 复制游标所在的整行(3yy 表示复制3行)
    • 普通模式中,y^ 复制至行首,或 y0。不含光标所在处字符。
    • 普通模式中,y$ 复制至行尾。含光标所在处字符。
    • 普通模式中,yw 复制一个单词。
    • 普通模式中,y2w 复制两个单词。
    • 普通模式中,yG 复制至文本末。
    • 普通模式中,y1G 复制至文本开头。
  • 普通模式中使用 p 粘贴
    • 普通模式中,p(小写)代表粘贴至光标后(下)
    • 普通模式中,P(大写)代表粘贴至光标前(上)
  • 普通模式种使用 dd 剪切
    • 前面讲得 dd 删除命令其实就是剪切,这里不在赘述
    • ddp,快速实现光标所在行与它下面的行的交换
快速查找

对于搜索字符串的方式,我们可以通过 /string?string 的方式,这里的 string 代表需要搜索的字符串,/? 分别代表向下和向上搜索。对于有多个查询结果的时候,我们可以通过 nN 来定位下一个或上一个查询结果。

对于搜索单词时,我们设定忽略大小写以及取消设定:

: set ignorecase
: set noignorecase
查找替换

:s(substitute)命令用来查找和替换字符串,语法如下:

:{作用范围}s/{目标}/{替换}/{替换标志}

例如 :%s/foo/bar/g 会在全局范围(%)查找 foo 并替换为 bar,通过 g 标志指示整行替换(默认只会替换每行第一个)。

作用范围

作用范围包括当前行、全文和选区。

默认为当前行:

:s/foo/bar

% 表示全文:

:%s/foo/bar

选区为由 , 分隔的起始行数和结束行数之间的区域:

:5,12s/foo/bar

. 表示当前行,+ 后的数字表示从起始行开始的多少行:

:.,+2s/foo/bar

在 Visual 模式下选中一块区域后输入 :,即可自动补全为 :'<,'>,表示当前所选区域范围:

:'<,'>s/foo/bar

替换标志

替换命令最后为可选的替换标志,除了前面提到的 g 整行替换,还有一些其它的。

i 表示大小写不敏感,I 表示大小写敏感(默认):

:s/foo/bar/i

c 表示在执行每次替换前进行确认:

:s/foo/bar/gc

确认时 y 表示替换,n 表示不替换,a 表示替换所有,q 表示退出查找模式,l 表示替换当前位置并退出。

保存和退出

对于使用 vim 编辑文件来说,我们常使用如下的三种方式:

$ vim

$ vim file       # file 为已存在的文件名  

$ vim file       # file 为未存在的文件名

对于常见的几种打开方式保存退出的操作有:

  • w 保存
  • w filename 保存为 filename
  • q 不保存退出
  • q! 强制退出,使用 ! 强制执行
  • wq 保存退出
  • wq! 强制保存退出
  • wq filename 保存为 filename,并退出

针对上述三种打开文件的方式需要使用对应的保存退出的方法,这其中是否修改文件也会有相应的影响。

例如,使用 $ vim,未修改时,退出直接使用 :q,修改后,直接退出需要使用 :q!。保存时,需要指定文件名,使用 w filename

多文件编辑

编辑多个文件

编辑多个文件有两种形式,一种是在进入 vim 前使用的参数就是多个文件。另一种就是进入 vim 后再编辑其他的文件。 同时创建两个新文件并编辑

$ vim 1.txt 2.txt

默认进入 1.txt 文件的编辑界面

  • 命令行模式下输入 :n 编辑 2.txt 文件,可以加 !:n! 强制切换,之前一个文件的输入没有保存,仅仅切换到另一个文件
  • 命令行模式下输入 :N 编辑 1.txt 文件,可以加 !:N! 强制切换,之前文件内的输入没有保存,仅仅是切换到另一个文件

进入 vim 后打开新文件

  • 命令行模式下输入 :e 3.txt 打开新文件 3.txt
  • 命令行模式下输入 :e# 回到前一个文件
  • 命令行模式下输入 :ls可以列出以前编辑过的文档
  • 命令行模式下输入 :b 2.txt(或者编号)可以直接进入文件 2.txt 编辑
  • 命令行模式下输入 :bd 2.txt(或者编号)可以删除以前编辑过的列表中的文件项目
  • 命令行模式下输入 :e! 4.txt,新打开文件 4.txt,放弃正在编辑的文件
  • 命令行模式下输入 :f 显示正在编辑的文件名
  • 命令行模式下输入 :f new.txt,改变正在编辑的文件名字为 new.txt
多个窗口

注意Ctrl+w 是浏览器关闭标签页的快捷键,所以如果用网页实验就没法用 Ctrl+w 来操作 Vim 窗口了。

vim 可以在一个界面里打开多个窗口进行编辑,这些编辑窗口称为vim的视窗。 打开方法有很多种,例如可以使用在命令行模式下输入 :new 打开一个新的vim视窗,并进入视窗编辑一个新文件(普通模式下输入 Ctrl+w 也可以),除了 :new 命令,下述列举的多种方法也可以在命令模式或普通模式下打开新的视窗(熟悉一些常用的内容即可):

  • 命令行模式下输入 :sp 1.txt 打开新的水平分屏视窗来编辑1.txt
  • 命令行模式下输入 :vsp 2.txt 打开新的垂直分屏视窗来编辑2.txt
  • 普通模式下 Ctrl+w s 将当前窗口分割成两个水平的窗口
  • 普通模式下 Ctrl+w v 将当前窗口分割成两个垂直的窗口
  • 普通模式下 Ctrl+w q 即 :q 结束分割出来的视窗。如果在新视窗中有输入需要使用强制符!即:q!
  • 普通模式下 Ctrl+w o 打开一个视窗并且隐藏之前的所有视窗
  • 普通模式下 Ctrl+w j 移至下面视窗
  • 普通模式下 Ctrl+w k 移至上面视窗
  • 普通模式下 Ctrl+w h 移至左边视窗
  • 普通模式下 Ctrl+w l 移至右边视窗
  • 普通模式下 Ctrl+w J 将当前视窗移至下面
  • 普通模式下 Ctrl+w K 将当前视窗移至上面
  • 普通模式下 Ctrl+w H 将当前视窗移至左边
  • 普通模式下 Ctrl+w L 将当前视窗移至右边
  • 普通模式下 Ctrl+w - 减小视窗的高度
  • 普通模式下 Ctrl+w + 增加视窗的高度
配置 vim

对于 vim 的配置来说,这里只是简单介绍。

对于一些特定的环境来说,我们可能会经常使用一些命令,对此,我们可以通过配置文件来配置自己的环境。

vim 的配置文件是 vimrc 文件。我们可以通过打开 vim 编辑器,使用如下命令来查看。

:scriptname

这个命令会列出 vim 的一些加载脚本。对于当前用户来说,我们只需要在用户的根目录下创建 .vimrc 文件,写入相应的配置项。就可以使配置生效。在创建该文件后,再次使用 :scriptname 的时候,你也会发现 .vimrc 的文件路径出现。如下,给出一个 vimrc 的示例:

" 设置与 vi 编辑器不兼容
set nocompatible

" 设置自动缩进
set autoindent

" 设置显示光标位置
set ruler

" 显示行号
set number

该配置文件只有简短的四行配置,但是在我们保存文件后,再次打开 vim 使用时,就能看出相应的区别,例如显示行号。

命令行模式

在上面的内容中我们简单的介绍了命令行模式下经常使用的一些命令,例如: vim

# 不兼容 vi 
:set nocompatible

# 兼容
:set compatible

# 显示行号
:set number

# 不显示行号
:set nonumber

# 行号缩写的方式
:set nu
:set nonu

对于命令行的定义严格意义上应该是,当我们在使用冒号 :/? 时,光标会位于屏幕的底部,我们可以在那里输入命令或者搜索文本内容,这被称为命令行。

不仅如此,对于命令行来说,也有一些快捷的操作方式,例如使用上下键寻找历史命令等,此处不再描述。 下面我们将介绍一些使用 :set [option] 项的内容:

# 显示行尾为 `$` ,显示制表符即 `<tab>` 键为`^I`
:set list

# 设置 tab 键的字符长为 4
:set tabstop=4

# 文件只读
:set readonly

# 设置编码格式
:set encoding=utf-8

# 设置文件编码
:set fileencoding=utf-8

# 设置 tab 为4个空格
:set softtabstop=4

# 生成备份文件
:set backup

# 不生成备份文件
:set nobackup
其它模式

除了我们上述介绍的三种模式外,vim 还有一些相对使用较少的其它模式,简单介绍如下。

视觉模式

视觉模式(visual mode),这个模式与普通模式比较相似。但是移动命令会扩大高亮的文本区域。高亮区域可以是字符、行或者是一块文本。当执行一个非移动命令时,命令会被执行到这块高亮的区域上。Vim 的"文本对象"也能和移动命令一样用在这个模式中。

视觉模式可以由正常模式下按 v 键或 V 键进入

替换模式

替换模式(replace mode),可以在普通模式下通过大写的 R ,进入到替换模式下,此模式下,对光标所在字符执行替换操作。而小写的 r ,只能替换单个字符。

选择模式

选择模式(select mode) 类似于视觉模式,因为选择模式用于选择文本内容。不同的是,选择模式针对的是 gui 版本的 vim ,例如我们使用如下命令打开文件:

$ gvim 

对于选择模式来说,我们可能需要手动开启该模式,使用:

:set selectmode+=mouse

这时,我们可以通过鼠标去选择对应的行,这时左下角会显示 选择 字样,

选择的内容会被高亮显示,并且我们输入的任意字符将会替代被选择的内容,然后切换到插入模式下。

内置教程

对于上面的部分内容来说,有些操作并不是常用的内容,只需要简单了解即可。vim还有一个内置教程,为 vimtutor,只需在命令行界面输入该命令:

$ vimtutor