
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 | 将光标移动文件的最后一行。 |
| nG | n 为数字,将光标移动到 n 指定的一行 |
| gg | 移动到这个文件的第一行,相当于 1G 。 |
| n <Enter> | n 为数字,光标向下移动 n 行 |
搜索与替换
| 命令 | 说明 |
|---|---|
| /word | 在当前光标的下方开始查找 word 字符串。 |
| ?word | 在当前光标的上方开始查找 word 字符串 |
| [n] | 小写 n 键,表示继续向下搜索,可以将其理解为英文中 next (下一个) |
| [N] | 大写 n 键,表示继续向上搜索。与 n 刚好相反。 |
| :n1,n2s/word1/word2/g | n1 与 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,X | x(小写) 表示删除光标所在位置的后一个字符,X(大写) 表示删除光标所在位置的前一个字符。 |
| nx | n 为数字,表示连续删除 n 字符。 |
| dd | 删除当前光标所在的一整行。 |
| ndd | 删除当前光标所在的向下 n 行。例:20dd 表示删除 由当前行向下的 20 行。 |
| d1G | 删除光标所在行到第一行的所有数据 |
| dG | 删除光标所在行到最最后一行的所有数据。 |
| d$ | 删除光标所在处,到该行的最后一个字符。 |
| d0 | 删除光标所在处,到改行的第一个字符。 |
| yy | 复制光标所在的哪一行内容。 |
| nyy | n 为数字。复制光标所在的向下 n 行,例如 20yy 则表示向下复制 20 行的内容。 |
| y1G | 复制光标所在行的到第一行的所有数据 |
| yG | 复制光标所在行到最后一行的所有数据。 |
| y0 | 复制光标所在行到该行行首的所有数据 |
| y$ | 复制光标所在行到改行行尾的所有数据。 |
| p,P | p 表示复制数据在光标下 |
| 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。
我们可以通过 [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