Vim 工具基本使用

Vim 基础知识

Vim(Vi IMproved)是一款强大的文本编辑器,是 Linux 和其他类 Unix 系统中最常用的编辑器之一。它不仅支持简单的文本编辑,还有许多高级功能,例如自动完成、宏录制、拼写检查和代码高亮等。Vim 是一个模式化编辑器,有多种不同的模式,其中最常用的是命令模式、插入模式和可视模式。

Vim 模式

vi 分为三种模式,一般模式、编辑模式与命令行模式:

  • 一般指令模式(Command Mode)

    用 vi 打开一个文件就进入一般模式,可以使用方向键来移动光标,删除,复制与粘贴。

  • 编辑模式(Insert Mode)

    在一般模式中,按下 “i o a r” 任何一个按键之后才会进入编辑模式,左下角会显示 INSERT 或 REPLACE 等字样。按 Esc 键可以返回一般模式。

  • 命令行模式(Command-line Mode)

    在一般模式下,输入 “: / ?” 三个中的任何一个按键,可以将光标移动到最下面一行,在此模式可以查找数据,读取保存,大量替换等操作。

界面介绍

使用 vi 打开一个已存在的文件后,显示如下所示:

[root@101c7 ~]$ vi anaconda-ks.cfg 
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
# Use graphical install
graphical
# Run the Setup Agent on first boot
"anaconda-ks.cfg" 48L, 1260C

最下面一行分别展示了:

  • “anaconda-ks.cfg”:文件名;
  • 48L:文件有 48 行;
  • 1260C:文件有 1260 个字符,也就是 1260B 大小。

按下 i 键后,进入到编辑模式,最左下角显示:

-- INSERT --

此时可以自由输入文字。按下 Esc 键退回到一般模式,再输入 :wq 按回车可以保存并离开 vi

:wq
"anaconda-ks.cfg" 48L, 1260C written

如果文件权限只读,可以使用 :wq! 来强制写入。

恢复功能

恢复功能是指,当因为某些原因导致死机的情况下,能通过一些方法将之前未保存的数据找回来。

在使用 vim 编辑文件时,vim 会在被编辑文件同目录下新建一个名为 .filename.swp 的交换文件。每当键入 200 个字符或有 4 秒没有键入内容时,交换文件都会自动地更新。

例如用 vi 新建打开一个文件,在命令模式下按 Ctrl+z 中断,再查看 .swp 文件内容:

[root@101c7 4]$ vi 1.txt
a
b
~

[1]+  Stopped                 vi 1.txt
[root@101c7 4]$ cat .1.txt.swp 
U3210#"! Utpad???

可以看到 swp 实时保存了我们输入的内容。

再次打开文件时,会提示有 swp 临时文件存在:

[root@101c7 4]$ vim 1.txt 

E325: ATTENTION
Found a swap file by the name ".1.txt.swp"
          owned by: root   dated: Sat Sep 11 03:44:17 2021
         file name: ~root/4/1.txt
          modified: YES
         user name: root   host name: 101c7
        process ID: 87510 (still running)
While opening file "1.txt"
             dated: Sat Sep 11 03:44:11 2021

(1) Another program may be editing the same file.  If this is the case,
    be careful not to end up with two different instances of the same
    file when making changes.  Quit, or continue with caution.
(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r 1.txt"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file ".1.txt.swp"
    to avoid this message.

Swap file ".1.txt.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:

提示会说明出现这一情况的两种原因:

  • 此文件正被另一个程序所使用;
  • 文件在编辑过程中非正常退出。

此时可以选择以哪种模式来打开:

按键 说明
O 以只读模式打开,显示内容为没有保存的内容;
E 以正常模式编辑文件,不会载入暂存文件内容;
R 加载暂存文件内容,恢复之前的作业。修改完毕后需要手动删除 .swp 文件;
Q 直接退出不进行操作;
A 等同于 Q,直接退出。

环境设置

在使用 vim 编辑文件时,文件会继承上一次编辑时的状态,比如光标出现在最后一行。这个记录操作文件保存在 ~/.viminfo 里面。

在命令模式下用 set 修改的设置值保存在 /etc/vimrc 这个文件中,不建议动它。需要自定义设置可以新建 ~/.vimrc 这个文件将希望设置的值写入。

例如设置自动缩进和行号功能:

[root@101c7 ~]$ vim ~/.vimrc
set nu          "hanghao
set autoindent  "suojin

再次打开 vim 即可生效:

[root@101c7 ~]$ vim ~/.vimrc
  1 set nu          "hanghao
  2 set autoindent  "suojin

Vim 基本操作

下面记录一些 Vim 的基本操作。

一般模式

光标移动针对的是在一般模式下快速浏览/定位文件。

移动

可以使用方向键 h j k l 操作光标左/右/下/上移一个字符。

可使用数字组合,例如 30k 代表光标向上移 30 行。

翻页

使用快捷键 Ctrl+f/Ctrl+b 来控制屏幕向下/上移动一页,相当于 PageDown/PageUp

跳转

输入 nG(n 为数字)将光标移动到第 n 行位置。

删除

使用 x/X 来删除当前光标后/前个字符。

可以使用数字组合,例如 9x 代表删除光标后连续 9 个字符。

剪切

使用 dd 剪切光标所在行。

可以使用数字组合,例如 9dd 代表向下删除 9 行。

复制

使用 yy 复制光标所在行。

可以使用数字组合,例如 9yy 代表复制向下 9 行。

v 键进入复制可视模式,在移动光标时高亮显示文本,选择完毕后按 y 复制选择内容。

粘贴

使用 p/P 来将剪贴板数据粘贴到光标下/上一行。

撤销

使用 u 来撤销上一次操作。

重做

使用 Ctrl+r 快捷键来反撤销操作。

块选择模式

按下Ctrl+v进入块选择模式,之后用方向键操作光标选择块:

[root@101c7 audit]$ vi c.log 
c1  ass
c2  bss
c3  css
~
-- VISUAL BLOCK --  

此模式下按y复制,按d删除。

编辑模式

进入编辑模式有两个方式:

  • 按 i:进入到插入模式(Insert Mode)。

  • 按 r/R:进入到替换/连续替换模式(Replace Mode)。

在编辑模式中主要执行文本插入和修改操作。

命令模式

在命令行模式下,可以进行文件读写、保存、退出、搜索、替换等操作,按下冒号(:)即可进入命令行模式。

搜索

搜索功能在命令模式下完成:

  • /word:向下搜索字符串 word

  • ?word:向上搜索字符串 word

对搜索结果按键 n/N 进行向下/向上跳转。

替换

  • 替换表达式::{作用范围}s/{搜索关键词}/{替换成关键词}/{替换标志}

  • 作用范围:n1,n2:n1 和 n2 为数字,表示在 n1 和 n2 行之间搜寻关键词并替换。例如在 100 到 200 行之间搜索:100,200s/XS/xs/g

    1,&s:表示从第 1 行到最后一行。

  • 替换标志

    g:表示全部替换,否则只会替换找到的第一个结果。

    i/I:表示搜索不区分/区分大小写,默认是区分大小写。

    c:表示替换前提示确认。

保存

:w 直接保存文件。

:w! 强制保存文件,针对某些设为只读权限的文件可以强制写入。

:w file2 另存为当前编辑的文件为file2

读取

:r file1 读取文件file1,并将内容加到光标所在行后面。

退出

:q 直接退出。

:q! 强制退出,针对修改了文件内容不想保存情况下退出。

:wq! 强制保存并退出。

ZZ 保存后退出,等同于:wq

设置

使用 :set all 查看所有配置。使用 :set 查看有更改过的参数。

  • 行号:set nu 设置行号,默认设置 nonu 没有行号。

  • 自动缩进:set autoindent 设置自动缩进,默认设置 noautoindent 没有自动缩进。

  • 设置备份:set backup 设置自动保存备份文件,默认设置 nobackup 没有备份。

  • 语法高亮:syntax on 依据语法来显示不同颜色。默认设置 syntax off。

  • 跳转:输入数字 n 直接跳转到第 n 行。

  • 显示文件名:f 显示正在编辑的文件名等信息。

  • 执行命令:! command 暂时离开 vim 到命令行模式下执行命令并展示结果。

多窗口模式

在命令模式下输入:sp可对当前文件切割成上下两个窗口显示:

111
11
1
~
~
1.txt                                                                                    3,1            All
111
11
1
~
1.txt                                                                                    1,1            All
:sp

通过按键Ctrl+w来切换窗口。

也可以用:sp指定文件名,这样上下窗口分别显示两个不同文件内容。

同时编辑模式

可以同时用vim打开多个文件:

[root@101c7 4]$ vi 1.txt 2.txt
2 files to edit

~
~
"1.txt" 0L, 0C                                                                           0,0-1         All

输入命令:n:N来编辑下一个或上一个文件。

输入命令:files列出目前打开的所有文件。