Please enable Javascript to view the contents

Linux经验-VIM-常见操作

 ·  ☕ 7 分钟

1. VIM的特性

Vim 是一款高度可定制的文本编辑器,具有以下特点:

  • 多模式编辑:Vim 采用多模式设计,主要包括普通模式(Normal Mode)、插入模式(Insert Mode)、命令模式(Command Mode)和可视模式(Visual Mode),每种模式都有其特定的功能。
  • 高效操作:通过键盘快捷键和命令,用户可以快速执行各种编辑操作,无需频繁切换鼠标和键盘,从而提高编辑效率。
  • 可扩展性:Vim 支持插件扩展,用户可以根据自己的需求安装各种插件,以增强编辑器的功能。
  • 跨平台:Vim 可以在多种操作系统上运行,包括 Linux、macOS、Windows 等。
  • 丰富的文档和社区支持:Vim 拥有庞大的用户社区和丰富的文档资源,用户可以轻松找到相关的帮助和教程。

2. VIM的模式

  • Normal(default): 普通模式,Vim 将键盘输入视为命令,而不是直接插入文本。此模式提供了强大的文本编辑功能,例如移动光标、删除文本、复制粘贴等。
  • Insert: 插入模式,Vim 会将键盘输入直接插入到文件中。
    进入Insert模式:
    - 按 i 进入 Insert 模式,位置: 当前光标前插入
    - 按 a 进入 Insert 模式,位置: 当前光标后插入
    - 按 I 进入 Insert 模式,位置: 光标当前行开头插入
    - 按 A 进入 Insert 模式,位置: 光标当前行末尾插入
    - 按 o 进入 Insert 模式,位置: 光标当前行下方插入新行
    - 按 O 进入 Insert 模式,位置: 光标当前行上方插入新行
    退出Insert模式:
    - 按 键返回到 Normal 模式
  • Visual: 可视模式,用于选择文本范围,对选中文本进行操作。
    进入Visual模式:
    - 按 v 进入 Visual模式, 逐个字符选择
    - 按 V 进入 Visual-Line模式, 逐行选择
    - 按 Ctrl+v 进入 Visual-Block模式,逐列选择
    可用命令:
    - 方向键(h j k l)选择文本
    - y 复制 选中的文本
    - d 删除 选中的文本
    - > 缩进 选中的文本
    - < 反缩进 选中的文本
    - : 对选中文本执行Ex命令
    退出Insert模式:
    - 按 键返回到 Normal 模式
  • Command: 命令模式

3. VIM的命令

3.1 撤销、恢复

按键描述
u撤销
Ctrl-r恢复撤销

3.2 插入操作

i, I, a, A, o, O 相同点是:都会进入Insert模式,不同是:光标的位置不同。

i光标前、I行首、a光标后、A行尾、o下一行、O上一行

3.2.1 插入 Insertion

按键操作步骤描述
i操作:i 输入字符 <ESC>光标所在处进入插入模式
I操作:I 输入字符 <ESC>在光标所在行,行首非空字符 进入插入模式
gI操作:gI 输入字符 <ESC>在光标所在行,行首第一个字符 进入插入模式

注意: 按下 将进入NORMAL模式, 或取消不想要的和部分完成的命令。

3.2.2 追加 Appending

命令使用说明详细描述
aa 输入字符 光标后追加字符
AA 输入字符 光标行尾追加字符

3.2.3 另开新行 Open

o 在光标下方打开一行,并进入Insert模式.
O 在光标上方打开一行,并进入Insert模式.

3.3 删除操作 Delete

命令说明示例
d$D删除至行尾d$
d0删除至行首d0
dG删除至文件末尾dG
dgg删除至文件开头dgg
dd删除多行,缺省值 13dd 向下删除 3 行
dw删除多个单词,缺省值 13dw 向后删除 3 单词,至下个单词开头
di"删除"引号内的内容"游标移动到修改所在行,键入di",会自动删除就近匹配的第一个双引号内的文本
x删除多个字符 向后,缺省值 13x删除 3 字符
X删除多个字符 向前,缺省值 13X删除 3 字符

3.4 修改操作 Change

除 x 外,其他删除的操作可以照搬到 修改操作c, 两者的区别是修改会进入Insert模式,而删除会保留在Normal模式。

命令说明示例
c$C删除至行尾,并进入Insert模式c$
c0删除至行首,并进入Insert模式d0
cG删除至文件末尾,并进入Insert模式dG
dgg删除至文件开头,并进入Insert模式cgg
cc删除多行,并进入Insert模式,缺省值 13cc 向下删除 3 行
cw删除多个单词,并进入Insert模式,缺省值 13cw 向后删除 3 单词,至下个单词开头
ci"删除"引号内的内容", 并进入Insert模式游标移动到修改所在行,键入ci",会自动删除就近匹配的第一个双引号内的文本

3.5 抽取 Yank

始终在 Normal 模式

命令说明示例
y复制光标所在的一个字符y
yw复制从光标到下一个字开头的中间内容yw
ye复制从光标到当前字结尾的中间内容ye
y$复制从光标到当前行结尾的中间内容y$
y0复制从光标到当前行首的中间内容y0
yy复制光标所在一整行内容yy
ygg复制至文件开头ygg
yi"复制"引号内的内容"游标移动到复制所在行,键入yi",会复制就近匹配的第一个双引号内的文本

自定义复制:按 v进入Visual模式,再通过 hjkl 选择内容,再按 y 对内容进行复制,最后通过 p 在合适位置进行粘贴。

3.6 粘贴 Paste

puts (pastes):通过 yy ye 命令复制的内容、通过 dd dw删除的内容等,都可以通过 p将其粘贴到其他位置。

光标字符后,粘贴内容 p

/<search phrase> 向下搜索 n 反向搜索 N

命令使用说明详细描述
//目标字符串n: 向下搜索,下一个 N: 反向搜索,上一个
??目标字符串n: 反向搜索,上一个 N: 向下搜索,下一个
%光标移动到 { [ (字符时, 然后键入%字符光标会移动与之对应的 } ] )

3.8 替换 Substitute

命令格式是:
:[range]s/{old-string|pattern}/{string}/[flags]
[range] 指定行范围, %表示全文件 1,10表示1-10行 '<,'>可视模式选中范围
{old-string|pattern} 表示旧字符串,也可以使用正则
{string} 新字符串
[flags] 标志, g表示全局替换 c交互 1,10跨行可自由组合

  1. 单行内替换

:s/old/new 当前行,匹配到的 第一个 old,替换为new
:s/old/new/g 当前行,匹配到的 所有 old,替换为new

  1. 跨行替换

:1,10s/old/new/g 1-10行, 匹配到的所有old,替换为new
:'<,'>s/old/new/g 在可视模式**选中的区域**, 匹配到所有old,全部替换为new(操作步骤为:v进入可视模式visual, jkhl移动光标进行区域选择, :s/old/new/g 替换)。

  1. 全文件替换

:%s/old/new/g **全文件**替换

  1. 交互替换(c confirm确认)

:s/old/new/c 替换时会弹出确认,每次替换前都会询问是否替换

  1. 正则表达式替换(有问题)

:s/$\d\+$/[new-\1]/g

3. VIM选项设置 Set

命令格式如下:
:set options[x xx]

选项options:
nu number 显示行号
ic ignorecase 搜索、替换时, 忽略大小写(ic ignorecase)
is incsearch 显示搜索短语的部分匹配结果
hls hlsearch 高亮 (highlight) 所有匹配(search)的字符串

可以通过option前增加no来关闭相应option, 例如 :set noic

4. 用例

4.1 批量注释代码

4.1.1 方式一:可视模式-行 + :s 进行替换

注释代码

  1. 将光标移动到需要注释的代码的起始行。
  2. 按下 V(大写v, 即Shift + v) 进入可视模式(行选择模式)。
  3. 使用方向键( j )选择需要注释的多行。
  4. 输入以下命令之一:
    • 添加单行注释:在命令模式下输入 :s/^/#/(适用于 # 注释,如 Python、Shell 等)
    • 添加其他注释符号:例如,对于 // 注释(如 C/C++、JavaScript),输入:s/^/\/\//

取消注释

  1. 将光标移动到需要取消注释的代码的起始行。
  2. 按下 V(大写v, 即Shift + v) 进入可视模式,选择多行。
  3. 输入以下命令:
    • 删除单行注释:在命令模式下输入 :s/^#//
    • 删除其他注释符号:例如,对于 // 注释,输入 :s/^\/\///

4.1.2 方式二:可视模式-列 + IA

注释代码

即,列插入# (I所选列前面插入 A后面插入)

  1. Ctrl + v 进入可视模式。
  2. 使用方向键( h j k l )选择需要注释的所有行的首列。
  3. 选择好列后,按下 I(大写 i)进入插入模式,并在所选列的前面插入字符。
  4. 按下Esc键退出插入模式,完成插入操作。

第3步,将按下 I 改成 A, 将在所选列的后面插入字符。

取消注释

列删除字符 #

  1. Ctrl + v 进入可视模式。
  2. 使用方向键( h j k l )选择需要取消注释行首#列。
  3. 选择好列后,按下 x(小写 x)或 x 删除选中的所有列。

4.2 修改引号、括号内的内容

ci' ci" ci( ci[ ci{

4.3 快速找到引号、括号的闭口

光标移动到 { [ (字符时, 然后键入%字符 | 光标会移动与之对应的 } ] )

4.4 列替换

Ctrl + v 列视图 + r 替换所选列内容

  1. Ctrl + v 进入可视模式。
  2. 使用方向键( h j k l )选择需要取消注释行首#列。
  3. 选择好列后,按下 r(小写 r), 光标变成下划线,等待字符输入。
  4. 输入字符,完成替换。

4.5 跨文件内容拷贝

通过 :split <file-path>,垂直切分,打开多个文件

  1. vim打开第一个文件A;
  2. 键入: split B-file, 打开第二个文件;
  3. 从源文件 y 复制字符;
  4. :wincmd j 向下切换窗口(根据目标窗口当前窗口的相对位置, 决定输入 h j k l, 也可以换成快捷键 Ctrl + w + <hjkl>
  5. 进入目标文件后,通过方向键移动到目标位置,p 粘贴内容。
分享

Hex
作者
Hex
CloudNative Developer

目录