一、vi和vim
vi 编辑器是所有 Unix 及 Linux 系统下标准的编辑器,类似于 Windows 系统下的记事本,属于字符界面编辑器,无需图形化环境,可直接在终端中操作,很多软件(如crontab、git等)默认使用 vi 作为他们编辑的接口。vim(Vi Improved)是 vi 的进阶增强版,不仅兼容所有 vi 的命令,还新增了语法高亮、代码补全、多级撤销、可视化编辑等强大功能,可视为一款专业的程序编辑器,尤其适合编写代码、配置文件等场景。
注意:/etc/passwd 文件是系统用户配置文件,直接修改可能导致系统用户登录异常,因此必须先复制到自己的目录下(如当前用户家目录)再进行操作,复制命令如下:
# 复制/etc/passwd到当前用户家目录,并重命名(可选,避免与其他文件冲突) cp /etc/passwd ~/passwd_demo
后续所有vim命令演示,均使用 ~/passwd_demo 文件进行操作。
vim安装(适用于Debian/Ubuntu系统):sudo apt-get install vim若为CentOS/RHEL系统,安装命令为:sudo yum install vim -y
vim启动用法(补充细节):
- 用法1:#vim 文件路径 含义:打开指定的文件;若文件不存在,vim会先创建该文件(仅在保存时生效),若文件存在则直接打开。
- 用法2:#vim + 数字 文件的路径 含义:打开指定的文件,并且将光标移动到指定行;若数字超过文件总行数,则光标定位到文件末行。
- 用法3:#vim + /关键词 文件的路径 含义:打开指定的文件,并且高亮显示所有匹配的关键词,光标默认定位到第一个匹配项;若关键词不存在,会提示“Pattern not found”。
- 用法4:#vim 文件路径1 文件路径2 文件路径3 含义:同时打开多个文件,默认显示第一个文件;可通过末行模式的切换命令在多个文件间切换。
- 用法5:#vim -d 文件路径1 文件路径2 含义:以对比模式打开两个文件,高亮显示两个文件的不同之处(常用于代码对比、配置文件差异查看);按ctrl+w切换两个文件的光标,按q退出对比模式。
- 补充用法:#vim -u 配置文件路径 文件路径 含义:指定vim的配置文件启动,常用于临时使用自定义配置(默认vim配置文件为~/.vimrc)。
二、vim三种模式
vim 中存在三种核心模式:命令模式、编辑模式(输入模式)、末行模式,三种模式相互切换,覆盖所有vim操作,掌握模式切换是使用vim的基础。
- 命令模式:打开文件之后默认进入该模式,无法直接编辑文本,可输入快捷键进行各类操作:删除、复制、粘贴、移动光标、撤销、恢复等,是vim操作的核心模式。
- 编辑模式:可对文件的内容进行编辑(输入、修改、删除字符等),进入该模式后,终端左下角会显示“– INSERT –”提示,退出后回到命令模式。
- 末行模式:在命令模式下输入特定符号(:、/、?)进入,终端左下角会显示对应的提示符(:、/、?),可输入命令对文件进行操作:搜索、替换、保存、退出、设置行号、执行shell指令等,执行完命令后自动回到命令模式。
模式切换按键说明:
1. 进入编辑模式(从命令模式切换):
- i:insert,在光标当前位置插入文本,光标位置不变。
- I:行首插入,将光标移动到当前行的第一个非空字符前插入文本(若行为空,则移动到行首插入)。
- a:append,在光标当前位置的下一个字符后插入文本,光标自动后移一位。
- A:行尾插入,将光标移动到当前行的末尾,在末尾插入文本。
- o:open,在光标当前行的下方插入一个空白行,并将光标移动到新行的行首,进入编辑模式。
- O:在光标当前行的上方插入一个空白行,并将光标移动到新行的行首,进入编辑模式。
- s:subst,删除光标当前所在的字符,并进入编辑模式(相当于“删除+插入”)。
- S:取代当前行,删除光标当前所在的整行内容,并进入编辑模式,重新输入该行内容。
- 补充:ctrl+i 与 i 功能一致;ctrl+a 与 A 功能一致(部分系统支持)。
2. 退回命令模式(从编辑模式/末行模式切换):
按 [Esc] 键,无论当前是编辑模式还是末行模式,均可立即退回命令模式;若多次按Esc,不会报错,仅会停留在命令模式(可用于确认当前模式)。
3. 进入末行模式(从命令模式切换):
- : (冒号):进入末行模式,用于输入保存、退出、替换、设置等命令(最常用)。
- / (斜杠):进入末行搜索模式,后面接字符串进行正向查找(从光标位置向下查找)。
- ? (问号):进入末行搜索模式,后面接字符串进行反向查找(从光标位置向上查找)。
4. 退出vim(末行模式/命令模式):
- :q:退出vim,仅适用于文件未被修改的情况;若文件已修改,会提示“E37: No write since last change (add ! to override)”,无法直接退出。
- :wq:保存并退出vim,会将当前修改写入文件,然后退出;若文件为只读(如root用户创建的文件,普通用户打开),会提示无法保存,需加!强制保存退出。
- :q!:强制退出vim,不保存任何修改(无论文件是否修改),常用于放弃当前编辑的内容。
- x:等价于:wq(仅在命令模式下生效),文件没有修改时直接退出,文件修改时保存并退出;注意:不要使用X(大写X),X是对文件进行加密操作(设置文件密码),加密后再次打开需输入密码。
- 补充:ZZ(命令模式下,连续按两次大写Z):等价于:wq,快速保存并退出;ZQ(命令模式下,按Z+Q):等价于:q!,快速强制退出。
5. 异常退出及解决办法:
异常退出:在编辑文件之后并没有正常执行:wq(保存退出),而是遇到突然关闭终端、断电、强制终止vim进程等情况,再次打开该文件时,会显示“E325: ATTENTION”提示,同时生成一个以 .swp 结尾的隐藏临时文件(如 .passwd_demo.swp),该文件用于保存异常退出前的编辑内容,避免数据丢失。
解决办法:
补充:临时文件 .swp 是隐藏文件,可通过ls -a命令查看当前目录下的所有隐藏文件,避免误删其他文件。
三、命令模式
打开文件之后默认进入该模式,所有操作均通过快捷键完成,无需输入冒号,以下是常用命令及补充说明:
1. 光标移动
- 光标上下左右移动:方向键(上下左右)或 kjhl(vim默认快捷键,更高效),其中k=上、j=下、h=左、l=右。
- 光标上下左右移动指定行或字符:[数字]方向键 或 [数字]kjhl;例如:3j 表示向下移动3行,5l 表示向右移动5个字符。
- 光标移动到行首:^(shift+6),定位到当前行的第一个非空字符;补充:0(数字0)也可移动到行首,无论该行是否有空格(定位到行的最开头)。
- 光标移动到行尾:$(shift+4),定位到当前行的最后一个字符。
- 光标移动到首行:gg,快速定位到文件的第一行。
- 光标移动到末行:G(大写G),快速定位到文件的最后一行。
- 自动格式化程序:gg=G,对整个文件进行代码格式化(适用于代码文件,如.sh、.py、.c等),会自动调整缩进,让代码更规整。
- 光标移动到指定行:[数字]G 或 [数字]gg;例如:10G 或 10gg,均表示移动到第10行。
- 向上翻屏:按键 ctrl + b(back)或 PgUp,翻屏幅度为一整屏。
- 向下翻屏:按键 ctrl + f(forward)或 PgDn,翻屏幅度为一整屏。
- 补充:向上翻半屏:ctrl + u(up);向下翻半屏:ctrl + d(down);光标移动到当前屏幕的顶部:H(大写H);光标移动到当前屏幕的中间:M(大写M);光标移动到当前屏幕的底部:L(大写L)。
2. 复制/粘贴/剪切
- 复制光标所在行:yy(yank),复制后内容会存入vim的剪贴板。
- 光标所在行的下一行新开一行粘贴(paste):p(小写p);补充:P(大写P),在光标所在行的上一行新开一行粘贴。
- 以光标所在行为准(包含当前行),向下复制指定的行数:[数字]yy;例如:5yy 表示复制当前行及下方4行(共5行)。
- 剪切/删除光标所在行(剪切了不粘贴就是删除)(delete):dd,剪切后内容存入剪贴板,可通过p/P粘贴。
- 剪切/删除光标所在行为准(包含当前行),向下剪切/删除指定行:[数字]dd;例如:3dd 表示剪切当前行及下方2行(共3行)。
- 剪切/删除光标所在的当前行之后的内容:D(大写D),等价于d$,删除光标位置到行尾的所有字符(不删除当前行)。
- 删除光标所在字符:x(小写x);删除光标所在字符及后面的指定个数字符:[数字]x;例如:3x 表示删除光标当前字符及后面2个字符(共3个)。
- 删除光标所在字符的前一个字符:X(大写X),等价于dh。
- 可视化操作(view):v(字符可视模式)、V(行可视模式)、ctrl + v(块可视模式),然后按下方向键来选中需要操作的区块,按下 y 复制、按下 d 删除、按下 c 剪切并进入编辑模式。
- 补充:复制选中的内容到剪贴板:选中后按y;剪切选中的内容:选中后按d;粘贴剪贴板内容:按p/P;可视模式下取消选中:按Esc退回命令模式。
3. 撤销/恢复
- 撤销(undo):u(命令模式)或者 :u(末行模式),撤销上一步操作;多次按u可撤销多次操作(默认最多撤销100次,可通过配置文件修改)。
- 恢复(取消)之前的撤销操作:ctrl + r(redo),恢复被撤销的操作;多次按ctrl + r可恢复多次撤销的操作。
- 补充:撤销当前行的所有修改(命令模式):U(大写U),仅对当前行有效,若当前行已被保存,则无法撤销。
四、末行模式
在命令模式下输入:、/、?进入,输入命令后按Enter执行,以下是常用命令及补充说明:
1. 保存与退出文件
- 保存操作(write)::w,将当前修改写入文件;若文件为只读,需加!强制保存(:w!),但仅root用户或文件所有者可强制保存。
- 另存为::w 路径,将当前文件的内容保存到指定路径下;例如::w ~/new_passwd,将内容另存为家目录下的new_passwd文件。
- 退出(quit)::q,仅适用于文件未修改的情况;若文件已修改,需加!强制退出(:q!)。
- 保存并退出::wq,等价于ZZ(命令模式);若文件只读,需加!强制保存退出(:wq!)。
- 强制执行:!,用于强制执行命令(如:w!、:q!、:wq!),忽略系统提示的权限不足或修改未保存等问题。
- 补充:保存所有打开的文件并退出::wqa,若有只读文件,需加!(:wqa!);退出当前文件,保留其他打开的文件::q,切换到下一个文件。
2. 查找与替换
- 查找:/关键词(正向查找)或 ?关键词(反向查找),按Enter执行;查找时忽略大小写:/关键词\\c(正向)或 ?关键词\\c(反向);查找时区分大小写:/关键词\\C(正向)或 ?关键词\\C(反向)(默认区分大小写)。
- 在搜索结果中切换上/下一个结果(next):n(小写n),按搜索方向继续查找下一个;N(大写N),反向搜索方向查找上一个。
- 取消高亮(no highlight)::nohl(全称:nohlsearch),仅取消当前搜索关键词的高亮,不影响后续搜索;若关闭文件再重新打开,高亮也会自动取消。
- 替换(核心补充,含实操示例):
- 替换光标所在行第一条原数据::s/原数据/新数据,例如::s/root/admin,替换当前行第一个“root”为“admin”。
- 替换光标所在行全部原数据::s/原数据/新数据/g,g表示全局(global),例如::s/root/admin/g,替换当前行所有“root”为“admin”。
- 替换整个文件每行第一条原数据::%s/原数据/新数据,%表示整个文件,例如::%s/root/admin,替换文件中每一行的第一个“root”为“admin”。
- 替换整个文件全部原数据::%s/原数据/新数据/g,例如::%s/root/admin/g,替换文件中所有“root”为“admin”。
- 替换时确认每一次替换:在命令末尾加c(confirm),例如::%s/root/admin/gc,每次替换前会提示“replace with admin (y/n/a/q/l/^E/^Y)?”,y=替换、n=不替换、a=替换所有、q=退出替换、l=替换当前并退出。
- 替换指定范围的内容::起始行,结束行s/原数据/新数据/g,例如::5,10s/root/admin/g,替换第5行到第10行所有“root”为“admin”。
符号含义补充:%表示整个文件,g表示全局(当前行/指定范围),c表示确认,\\c表示忽略大小写,\\C表示区分大小写。
3. 显示行号
- 显示行号(临时)(number)::set nu(全称:set number),仅对当前打开的文件有效,关闭文件后失效。
- 取消显示行号::set nonu(全称:set nonumber)。
- 显示相对行号::set rnu(全称:set relativenumber),光标所在行显示绝对行号,其他行显示相对于光标行的行数(便于快速移动光标,如5j表示向下移动5行)。
- 补充:永久显示行号:编辑vim配置文件~/.vimrc,添加“set nu”,保存退出后,每次打开vim都会自动显示行号;若需永久显示相对行号,添加“set rnu”。
4. 执行shell指令
- 执行shell指令::![shell 指令],vim会暂时退出,执行shell指令,指令执行结束后,按下任意键回到vim。
- 举例::!ls / (查看根目录下的文件)、:!pwd (查看当前工作目录)、:!cat /etc/hosts (查看hosts文件内容)、:!grep root ~/passwd_demo (查找passwd_demo文件中的root相关内容)。
- 补充:执行shell指令后,结果不会写入当前vim文件,仅在终端中显示;若需将shell指令的执行结果写入当前vim文件,可使用:r !shell指令,例如::r !ls /,将根目录下的文件列表写入当前光标位置。
5. 切换文件
- 查看当前已经打开的文件名称::files 或 :ls,会显示所有打开的文件列表,列表中“%a”表示当前正在编辑的文件,“#”表示上一个编辑的文件。
- 切换指定文件::open 已经打开的文件名 或 :e 已经打开的文件名(e=edit),例如::open passwd_demo,切换到passwd_demo文件。
- 切换到上一个文件(back prev)::bp(全称:bprevious)。
- 切换到下一个文件(back next)::bn(全称:bnext)。
- 关闭当前打开的文件::bd(全称:bdelete),若当前是最后一个打开的文件,关闭后会退出vim;强制关闭当前文件::bd!。
- 补充:新建文件并打开::new 文件名,会在新的窗口中新建并打开文件;编辑新文件(不新建窗口)::e 新文件名,若文件不存在,保存时会创建。
五、分屏查看
vim支持分屏操作,可将一个终端屏幕分割成多个窗口,同时显示多个文件或同一个文件的不同部分,分为左右分屏和上下分屏两种方式,适用于对比文件、同时编辑多个文件等场景。
1. 启动分屏
- 启动左右分屏:vim -On 文件1 文件2(O为大写,n为分屏数量,默认分屏数量等于文件数量);例如:vim -O2 ~/passwd_demo ~/new_passwd,左右分屏显示两个文件,分屏数量为2。
- 启动上下分屏:vim -on 文件1 文件2(o为小写);例如:vim -o2 ~/passwd_demo ~/new_passwd,上下分屏显示两个文件。
- 补充:启动分屏时,若文件数量多于分屏数量,剩余文件会在后台打开,可通过:bn/:bp切换;若仅启动分屏不指定文件,可输入vim -O或vim -o,进入后通过:e 文件名打开文件。
2. 编辑器中分屏
- 上下分割当前打开的文件:ctrl+w s(s=split),将当前窗口上下分割,两个窗口显示同一个文件。
- 上下分割,并打开一个新的文件::sp filename(sp=split),例如::sp ~/new_passwd,上下分割窗口,下方窗口打开new_passwd文件。
- 左右分割当前打开的文件:ctrl+w v(v=vsplit),将当前窗口左右分割,两个窗口显示同一个文件。
- 左右分割,并打开一个新的文件::vsp filename(vsp=vsplit),例如::vsp ~/new_passwd,左右分割窗口,右侧窗口打开new_passwd文件。
- 补充:分屏时调整窗口大小:ctrl+w +(放大当前窗口)、ctrl+w -(缩小当前窗口)、ctrl+w =(所有窗口平均分配大小);将当前窗口最大化:ctrl+w |(左右分屏时)、ctrl+w _(上下分屏时)。
3. 关闭分屏
- 关闭当前窗口:ctrl+w c(c=close),若只剩最后一个窗口,关闭后会退出vim。
- 关闭当前窗口,如果只剩最后一个,则退出vim:ctrl+w q(q=quit),与ctrl+w c功能类似,区别在于:ctrl+w q会在关闭最后一个窗口时退出vim,而ctrl+w c不会(会提示“E444: Cannot close last window”)。
- 关闭除当前窗口外的所有窗口:ctrl+w o(o=only),仅保留当前窗口,关闭其他所有分屏窗口。
4. 分屏间光标的移动
vim中的方向键是h,j,k,l,要在各个分屏窗口之间切换,需先按一下ctrl+w(快捷键前缀),再按方向键或对应字母,具体操作如下:
- 把光标移动到上边的屏:ctrl+w k 或者 ctrl+w 上方向键。
- 把光标移动到下边的屏:ctrl+w j 或者 ctrl+w 下方向键。
- 把光标移动到右边的屏:ctrl+w l 或者 ctrl+w 右方向键。
- 把光标移动到左边的屏:ctrl+w h 或者 ctrl+w 左方向键。
- 把光标移动到另一个屏(循环切换):ctrl+w w(连续按两次w),按顺序在所有分屏窗口中切换光标。
- 补充:交换两个分屏窗口的位置:ctrl+w x;将当前窗口移动到左边:ctrl+w H;移动到右边:ctrl+w L;移动到上边:ctrl+w K;移动到下边:ctrl+w J。
六、vim拓展用法
1. 代码补全
vim默认支持基础代码补全,在编辑模式下按ctrl+n或ctrl+p,可自动补全当前输入的单词(基于当前文件中已有的单词);若需更强大的代码补全(如语法补全、函数补全),可安装插件(如YouCompleteMe),但默认vim已能满足基础使用需求。
2. 注释操作
批量注释(块可视模式):
- 按ctrl+v进入块可视模式,选中需要注释的行的开头部分。
- 按I(大写I)进入编辑模式,输入注释符号(如#、//)。
- 按Esc,即可为选中的所有行添加注释。
批量取消注释:
- 按ctrl+v进入块可视模式,选中所有注释符号。
- 按x删除选中的注释符号,即可取消注释。
3. 配置vim(优化使用体验)
vim的配置文件为~/.vimrc(用户级配置),若该文件不存在,可手动创建(touch ~/.vimrc),添加以下常用配置,提升使用体验:
set nu " 永久显示行号 set rnu " 显示相对行号 set tabstop=4 " 设置Tab键缩进4个字符 set shiftwidth=4 " 设置自动缩进4个字符 set expandtab " 将Tab键转换为空格 set autoindent " 自动缩进(新行与上一行缩进一致) set hlsearch " 搜索关键词高亮 set ignorecase " 搜索时忽略大小写 set mouse=a " 启用鼠标支持(终端中可使用鼠标操作) set encoding=utf-8 " 设置编码为UTF-8,避免中文乱码
配置完成后,保存退出(:wq),再次打开vim即可生效。
4. 其他实用命令
- 查看vim帮助文档::help 命令名,例如::help dd,查看dd命令的详细用法;按q退出帮助文档。
- 跳转到光标所在单词的下一个匹配项:*(命令模式);上一个匹配项:#(命令模式)。
- 删除光标所在到行首的内容:d^;删除光标所在到行尾的内容:d$。
- 将当前行内容移动到下一行:ddp;移动到上一行:ddP。





