首页 Life vim 编辑器使用专题

vim 编辑器使用专题

作者 Worthify 4 分钟阅读# Life
vim 编辑器使用专题

VIM 的三种模式

VIM的三种基本三种工作模式,分别是“一般模式”,“编辑模式”与“命令行命令模式”。

  • 一般模式(command mode):vim 进入后默认就是一般模式,这个模式可以里可以进行复制,粘贴,删除,移动光标,复原等操作。
  • 编辑模式(edit moda): 进入编辑模式后可以对文件进行更改。
  • 延伸指令模式(extended command mode):这个模式可以存储,退出,强制存储,搜索或替换等操作。
  • 可视模式(vitual mode): 这个模式可以显示我们正在所选取的内容。主要包含三种:
    • v:字符方法圈选。
    • [shift]+v:以整行的方式圈选。
    • [ctrl]+v:以区块方式圈选。
    • 注: 选取完后可以通过 y 复制,或者 d 删除。

操作说明:

一般指令模式可用的按键说明。

光标移动操作

按键说明
h 键或左方向键光标向左移动
j 键或下方向键光标向下移动
k 或向上方向键光标向上移动
l 或右方向键光标向右移动
[ctrl]+[f]屏幕向下移动一页,相当于 [PgDn] 键
[ctrl]+[b]屏幕向上移动一页,相当于 [PgUp] 键
[ctrl]+[d]屏幕向下移动半页
[ctrl]+[u]屏幕向上移动半页
+光标移动到非空白字符的下一行
-光标移动到非空白字符的上一行
n <space>n 为数字,输入数字按下空格键后,光标会向右移动 n 位。例如,n 为 20,那么 20 <space> 表示光标向右移动20位。
0 或则功能键 [Home]将光标移动至所在行的第一个字符处。
$ 或者功能键 [End]将光标移动到所在行的最后一个字符处。
H将光标移动到屏幕最上方一行的行首
M将光标移动到屏幕中间一行的行首
L将光标移动到屏幕最下方一行的行首
G将光标移动文件的最后一行。
nGn 为数字,将光标移动到 n 指定的一行
gg移动到这个文件的第一行,相当于 1G 。
n <Enter>n 为数字,光标向下移动 n 行

搜索与替换

命令说明
/word在当前光标的下方开始查找 word 字符串。
?word在当前光标的上方开始查找 word 字符串
[n]小写 n 键,表示继续向下搜索,可以将其理解为英文中 next (下一个)
[N]大写 n 键,表示继续向上搜索。与 n 刚好相反。
:n1,n2s/word1/word2/gn1 与 n2 为数字。表示在 n1 与 n2 行之间,将 word1 字符串替换为 word2 字符串。例如,该命令写作:10,100s/you/my/g 。那么则表示,在 10 行和 100 行之中,将所有 you 字符替换为 my 。
:1,$s/word1/word2/g从第一行到最后一行寻找 word1 字符串,并将其替换为 word2 字符串。
:1,$s/word1/word2/gc从第一行到最后一行寻找 word1 字符串,并逐个询问是否将其替换为 word2。

删除,复制,粘贴。

命令说明
x,Xx(小写) 表示删除光标所在位置的后一个字符,X(大写) 表示删除光标所在位置的前一个字符。
nxn 为数字,表示连续删除 n 字符。
dd删除当前光标所在的一整行。
ndd删除当前光标所在的向下 n 行。例:20dd 表示删除 由当前行向下的 20 行。
d1G删除光标所在行到第一行的所有数据
dG删除光标所在行到最最后一行的所有数据。
d$删除光标所在处,到该行的最后一个字符。
d0删除光标所在处,到改行的第一个字符。
yy复制光标所在的哪一行内容。
nyyn 为数字。复制光标所在的向下 n 行,例如 20yy 则表示向下复制 20 行的内容。
y1G复制光标所在行的到第一行的所有数据
yG复制光标所在行到最后一行的所有数据。
y0复制光标所在行到该行行首的所有数据
y$复制光标所在行到改行行尾的所有数据。
p,Pp 表示复制数据在光标下
J将光标所在行与下一列的数据结合使用
c剪贴多行数据,例如要剪贴向下 10 行的数据 10cj
u还原前一个动作
[ctrl]+r重做上一个动作。
.小数点,重复前一个动作。例如,你需要一直粘贴。

一般指令模式切换到编辑模式可用的按键说明。

进入插入或替换的编辑模式

命令说明
i,I进入插入模式,i 为从目前光标的位置插入;I 表示在当前所在行的第一个非空白字符处开始插入。
a,A进入插入模式,a 为目前光标所在的下一个字符开始插入;A 为从光标所在行的最后一个字符处开始插入
o,O进入插入模式,o 为从目前光标所在的下一行处插入新的一行;O 为在目前光标所在处的上一行插入新的一行。
[Esc]退出编辑模式。回到一般指令模式。

一般指切换到命令的可用按键说明

命令说明
:w保存修改的数据
:w!强制保存修改的数据
:q退出 vim
:q!强制退出 vim
:wq保存数据并退出 vim
:ZZ若文件没有改动,则不存储离开;若文件被改动过,则存储后离开。
:w [filename]将编辑的数据保存到另外一个文件中。
:r [filename]将 filename 文件中的内容,写入到当前编辑文件的文件的光标的下一行。
:n1,n2 w [filename]将 n1 到 n2 行的内容存储到 filename 这个文件中。
:! command暂时离开 vim 到命令行中执行命令并返回结果。例如 :! ls /home 即可在 vim 当中查看 /home 目录下列处的文件。

vim 环境配置

命令说明
:set nu显示行号,设置之后,会在每一行的字首显示该行的行号
:set nonu与 set nu 相反,取消显示行好好。
:set hlsearch高亮显示关键词
:syntax on/off开启/关闭语法检测功能
:set noincsearch取消自动搜索机制
:set ignorecase搜搜时忽略大小写
:set autoindent自动处理代码缩进
:set tabstop设置 [tab] 制表符长度为 8 个单元
:set scrolloff=0设置预先显示的行数为0,即预先不显示。
:set nowrap设置不拆行
set cursorline设置突出显示光标所在的行

多文件编辑

当我们需要通知处理多个文件时,例如在文件 A 中通过 yy 复制了某一行的内容,然后需要用 p 复制到文件 B 中。如果我们单独打开两个 vim ,文件 A 中的内容是无法直接使用 p 命令复制到文件 B 中的。这个时候,我们可以使用 vim 的多文件编辑功能来完成这个操作。

总计 20K
-rw-r--r-- 1 shibo shibo 13K  1月 19 12:23 service.bak
-rw-r--r-- 1 shibo shibo 432  1月 19 12:23 service_head.bak

现在这个目录上中有两个文件 service.bak,service_head.bak ,我们通过 vim 打开这个两个文件。

root@DESKTOP-SBUFLRT:/home/shibo# vim service.bak service_head.bak 
命令说明
:n编辑下一个文件
:N编辑上一个文件
:files列出目前 vim 打开的所有文件

此时我们就可以通过输入 :files 查看我们正在编辑那个文件。

:files
  1 %a   "service.bak"                  第 27 行			# %a 就表示我们当前正在编辑那个文件。
  2      "service_head.bak"             第 0 行
请按 ENTER 或其它命令继续

我们现在就可以在这两个文件之间进行数据交换的操作,例如我们在 service.bak文件中使用 4yy 复制内容。然后使用 :n 切换到下一个文件,然后使用 p 复制复制到 service_head.bak 。

多窗口功能

当我们需要对同时查看两个文件时,使用前面提到的多文件编辑功能就满足不来要求了,同时查看两个文件,让其实现类似于“分屏的”效果,我们可以使用 vim 的多窗口功能。

我们先使用 vim 打开一个文件。

root@DESKTOP-SBUFLRT:/home/shibo# vim service.bak 

# Network services, Internet style
#
# Updated from https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml .
#
# New ports will be added on request if they have been officially assigned
# by IANA and used in the real-world or are needed by a debian package.
# If you need a huge list of used numbers please install the nmap package.

tcpmux          1/tcp                           # TCP port service multiplexer
echo            7/tcp
echo            7/udp
discard         9/tcp           sink null

此时在一般模式下输入指令 :sq [filename] 就可以在一个 vim 界面中同时打开两个文件。例如这里我们打开 service_head.bak。

image-20250119144245571

image-20250119144316618

我们可以通过 [ctrl]+w+j 将光标移动到下面的窗口,或者通过 [ctrl]+w+k 将光标移动到上面的窗口。

命令说明
:sp [filename]打开一个新的窗口,如果有加 filename ,表示在新窗口打开一个新文件,否则表示两个为同一个文件内容(同步显示)
[ctrl]+w+j 或 [ctrl]+w+[方向下键]将光标移动到下方的窗口
[ctrl]+w+k 或 [ctrl]+w+{方向上键}将光标移动到上方的窗口
[ctrl]+w+q退出 vim,相当于 :q 的意思。

VIM 补全功能。

vim 支持一些基础的补全功能,且对 html 和 php 文件比较友好,其他程序文件的补全功能需要安装对应的插件来实现。

vim 补全功能常用的快捷键为:

快捷键说明
[ctrl]+x –> [ctrl]+n先按 [ctrl] + x 进入补全模式,在按 [ctrl]+n 选择按照“文件的内容文件文字作为关键字”进行补全
[ctrl]+x –> [ctrl]+f以当前目录中的文件名作为关键字进行补全。
[ctrl]+x –> [ctrl]+o以扩展名作为补全语言进行补全。

vim 环境设置与记录文件:/.vimrc,/.viminfo

记录文件 /.viminfo

当我们打开一个 vim 时,我所做的所有操作都会被记录并保存下来,以便帮助我们更加方便的编辑文件。这个记录动作的文件就是 ~/.viminfo 文件,这个文件不需要我们自己创建,当我们使用过 vim 后变回自动创建这个文件。我们可以看一下这个文件中的内容:

root@DESKTOP-SBUFLRT:/home/shibo# vim ~/.viminfo 

# This viminfo file was generated by Vim 8.2.
# You may edit it if you're careful!

# Viminfo version
|1,4

# Value of 'encoding' when this file was written
*encoding=utf-8					# 指定写入文件时的编码为 utf-8.


# hlsearch on (H) or off (h):
~h
# Command Line History (newest to oldest):			# 我们使用 vim 时测操作记录
:q
|2,0,1737272438,,"q"
:w
|2,0,1737271898,,"w"
:sp service_head.bak
————————省略————————

# 寄存器:					# 我们复制过的内容。
""0     LINE    0
        tcpmux          1/tcp                           # TCP port service multiplexer
        echo            7/tcp
        echo            7/udp
        discard         9/tcp           sink null
|3,1,0,1,4,0,1737267799,"tcpmux         1/tcp                           # TCP port service multiplexer","echo           7/tcp","echo            7/udp","discard         9/tcp           sink null"

————————省略————————

环境配置文件/.vimrc

vim 打开一个文件后,以什么样的方式显示这个文件,是否开启语法高亮,是否显示行数,是否自动缩进。等等这操作都是通过环境配置文件 /.vimrc 中各个配置参数来制定的,vim 的全局环境配置文件在 /etc/vim/.vimrc 中,一般不直接修改这个文件。我们可以自己的用户家目录中创建一个 /.vimrc 文件作为用户的 vim 环境配置,常见的环境配置参数在第一节的操作说明中,我们这里再来写几个

环境配置参数说明
:set backup/nobackup是否自动存储备份文件,默认是 nobackup。如果指定为 backup 后,当我们改动某个文件时,就会自动生成一个 filename~ 文件。例如 ,但我们制定 set backup 后,我们编辑 hosts 文件,当该文件发生改动后,就会生成一个 host~ 文件存储文件改动之前的内容。
set ruler是否显示状态说明。
set backspace =[012]设置退格键是否能够删除字符,这个设定很有意思,当我们将 backsapce 的值设置为 0 或者 1 时,则表示在使用退格键时不能删除文件中原本就存在的内容,只能删除刚刚输入的字符。将其设置为 2 时,则可以使用退格键删除任意的字符啦。
set showmode是否显示 –INSERT – 这种模式状态栏。
set all显示目前所有的环境配置参考值。
set显示所有与系统默认不同的值,也就是显示用户自己变动的设置参数。
set bg=dark/light用于设置不同颜色的色调,默认为 “light” ,即注释之类的字符显示成深蓝色。可以将其设置为 dark ,这样注释之类的字就会显示成浅蓝色,更容易看清。

我们可以将我们需要设置的参数写入到 ~/.vimrc 文件中,这样下次打开 vim 时,就可以直接按照我们设定的样子工作啦。例如向下面这样

root@DESKTOP-SBUFLRT:/home/shibo/testdir# vim ~/.vimrc

  1 " 设置默认显示行号"                                                                                                           
  2 set nu      
  3 " 设置字体色调为暗色系"
  4 set bg=dark
  5 " 设置在改动文件后创建备份文件"
  6 set backup
  7 " 设置退格键可以删除任意的字符"
  8 set backspace=2
  9 " 设置突出显示光标所在的行"
 10 set cursorline
 11 " 设置搜索时忽略大小写"
 12 set ignorecase