VIM 编辑器操作详解

1 vim 使用介绍

1.1 vim 安装

# CentOS 安装:
yum install -y vim

# Ubuntu 安装:
sudu apt-get install vim

安装完成后,可使用 vim -v 查看版本号

1.2 vim 命令格式

vim [OPTION]... FILE...

常用选项

选项 说明
+n 打开文件后,直接让光标处于第 n 行的行首;+默认行尾 ;vim + filename 末行行首
+/PATTERN 打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行首;vim +/for filename 文件第一个for所在行的行首
-b file 二进制方式打开文件
-d file1 file2... 比较多个文件,相当于 vimdiff
-m file 只读打开文件
-e file 直接进入 ex 模式,相当于执行 ex file
-y file Easy mode (like "evim", modeless),直接可以操作文件,`ctrl+o:wq

说明:

  • 如果该文件存在,文件被打开并显示内容

  • 如果该文件不存在,当编辑后第一次存盘时创建它

1.3 vim:模式化编辑器

vim 是 一个模式编辑器,击键行为是依赖于 vim的 的“模式”

三种常见模式

  • 命令或普通(Normal)模式:默认模式,可以实现移动光标,剪切/粘贴文本

  • 插入(Insert)或编辑模式:用于修改文本

  • 扩展命令(extended command)或命令(末)行模式:保存,退出等

模式转换

  • 命令模式 --> 插入模式
命令 解释
i insert 在光标所在处输入
I 在当前光标所在行的行首输入
a append 在光标所在处后面输入
A 在当前光标所在行的行尾输入
o 在当前光标所在行的下方打开一个新行
O 在当前光标所在行的上方打开一个新行
  • 插入模式 --- ESC-----> 命令模式
  • 命令模式 ---- : ----> 扩展命令模式
  • 扩展命令模式 ----ESC,enter----> 命令模式

示例:插入颜色字符

1 切换至插入模式
2 按ctrl+v+[ 三个键,显示^[
3 后续输入颜色信息,如:^[[32mhello^[[0m 
4 切换至扩展命令模式,保存退出
5 cat 文件可以看到下面显示

1.4 扩展命令模式

按“:”进入Ex模式 ,创建一个命令提示符: 处于底部的屏幕左侧

1.4.1 扩展命令模式基本命令

命令 解释
w 写(存)磁盘文件
wq 写入并退出
x 写入并退出
X 加密
q 退出
q! 不存盘退出,及时更改都将丢失
r filename 读文件内容到当前文件中
w filename 将当前文件内容写入另一个文件
!command 执行命令
r!command 读入命令的输出

1.4.2 地址定界

格式

:start_pos,end_pos CMD
1.4.2.1 地址定界格式
命令 解释

| 表示特定的第#行,例如5即表示第5行

,# | 指定行范围,从左侧 # 表示起始行,到右侧 # 表示结尾行

,+# | 指定行范围,左侧为起始行绝对编号,右侧为相对左侧行号的偏移量,例如:3,+7,意思是从第3行开始,再向后加7行

. | 表示当前行;如 :.,$y 表示复制从当前行开始到最后一行
$ | 最后一行
.,$-1 | 当前行到倒数第二行
% | 表示全文, 相当于1,$
/pattern/ | 从光标所在处起始向文件尾部,第一次被模式所匹配到的行,例,/first/,$ 表示从第一次能被first匹配的行开始到最后一行结束
/pat1/,/pat2/ | 从光标所在处起始,第一次由 pat1 匹配到的行开始,至第一次由 pat2 匹配到的行结束之间的所有行

,/pat/ | 从指定行开始,一直找到第一个匹配 pattern 的行结束

/pat/,$ | 向下找到第一个匹配 patttern 的行到整个文件的结尾的所有行

1.4.2.2 地址定界后跟一个编辑命令
命令 解释
d 删除
y 复制
w file 将范围内的行另存至指定文件中
r file 在指定位置插入指定文件中的所有内容

可同编辑命令一同使用,实现编辑操作:d,y,c,w /path/to/somefile(将范围内的文本保存至指定的文件中)

合并两个文件

vim /etc/fstab
:5r /tmp/test.txt

将文件/tmp/test.txt写入到文件/etc/fstab第5行后面

1.4.3 查找并替换

格式

s/要查找的内容/替换为的内容/修饰符

说明

  • 要查找的内容:可使用基末正则表达式模式

  • 替换为的内容:不能使用正则表达式,如果“要查找的内容”部分在模式中使用分组符号,在“替换的内容”中使用后可以使用\1, \2, ...等后向引用符号;还可以使用“&”引用前面查找时查 找到的整个内容

  • 直接引用查找模式匹配到的全部文本

修饰符

命令 说明
i 查找时忽略大小写
g 全局替换,意味着一行中如果匹配多次,则均替换,默认情况下,每一行只替换第一次出现
gc 全局替换,每次替换前询问

示例

# 将文本中所有的this替换为This		
:%s/this/This/gi

# 将文本中1到20行的this替换为This	
:1,20s/this/This/gi

# 将文本中所有的t替换为T,还要保持t后面的字符不变	
:%s@\<t\([[:alpha:]]\+\)\>@T\1@g

# 将文本中所有的t开头的,后面加上er				
:%s@\<t[[:alpha:]]\+\>@&er@g

# 将文件中所有的enable=0替换为enable=1,将所有的gpgcheck=0替换为gpgcheck=1
:%s@\(enable\|gpgcheck\)=0@\1=1@g

查找替换中的分隔符/可替换为其它字符,如:#,@

示例

s@/etc@/var@g

s#/boot#/#i

1.4.4 定制 vim 的工作特性

每个人都有自己喜欢的配置,比如背景颜色,空格缩进大小等,vim 提供配置文件供使用者保存自己的偏好,下面经常使用的配置文件:
编辑:前登录用户的宿主目录下,比如root 用户就是/root/,文件为.vimrc

注意:在末行模式下的设定,仅对当前vim进程有效

扩展命令模式的配置只是对当前vim进程有效,可将配置存放在文件中持久保存

配置文件

/etc/vimrc   # 全局

~/.vimrc     # 用户个人,可能需要创建
命令 说明
行号显示 set number, 简写set nu
行号取消显示 set nomber, 简写set nonu
忽略字符大小写启用 set ignorecase,简写 set ic
忽略字符大小写禁用 set noic
括号匹配高亮匹配 set showmatch,简称为set sm
括号匹配高亮取消 set noshowmatch,简称为set nosm
自动缩进启用 set autoindent,简写 set ai
自动缩进取消 set noai
复制保留格式启用 set paste
复制保留格式禁用 set nopaste
显示 Tab ^I 和换行符和 $ 显示 set list
取消 Tab ^I 和换行符和 $ 显示 set nolist
高亮搜索启用 set hlsearch
高亮搜索取消 set nohlsearch 简写:nohl
语法高亮启用 syntax on
语法高亮取消 syntax off
文件格式 启用windows格式:set fileformat=dos
启用unix格式:set fileformat=unix
简写 set ff=dos
Tab 用空格代替启用 set expandtab 默认为8个空格代替Tab
Tab 用空格代替禁用 set noexpandtab,简写:set et
Tab用指定空格的个数代替 启用:set tabstop=# 指定#个空格代替Tab
简写:set ts=4
设置文本宽度 set textwidth=65 (vim only) #从左向右计数
set wrapmargin=15 #从右到左计数
设置光标所在行的标识线启用 set cursorline,简写 set cul
设置光标所在行的标识线禁用 set nocursorline
加密启用 set key=password
机密禁用 set key=

了解更多

set 帮助

:help option-list

:set or :set all

示例

cat ~/.vimrc
set nu                   # 行号
set sm                   # 括号匹配高亮
set ai                   # 自动缩进
set hlsearch             # 高亮搜索
syntax on                # 语法高亮
set colorscheme default  # 设置颜色主题
set nocompatible         # vi 和 vim 兼容
set noerorbells          # 错误铃声
set showmatch            # 括号匹配查找
set ignorecase           # 查找忽略大小写
set incsearch            # 搜索时自动跳转光标
set tabstop=4            # 空格
set guifont=Menlo:h10    # 字体
set autowrite            # 自动存盘
set history=3000
set colorcolumn=82

1.5 命令模式

命令模式,又称为Normal模式,功能强大,只是此模式输入指令并在屏幕上显示,所以需要记忆大量
的快捷按键才能更好的使用

1.5.1 退出 vim

命令 说明
ZZ 保存退出
ZQ 不保存退出

1.5.2 光标跳转

字符间跳转(Ncommand 跳转由 N 指定的个数的字符)

命令 说明
h
l
j
k

单词间跳转(Ncommand 由 N 指定一次跳转的单词数)

命令 说明
w 下一个单词的词首
e 当前或下一个单词的词尾
b 当前或前一个单词的词首

当前页跳转

命令 说明
H 页首
M 页中间行
L 页底
zt 将光标所在当前行移到屏幕顶端
zz 将光标所在当前行移到屏幕中间
zb 将光标所在当前行移到屏幕底端

行首行尾跳转

命令 说明
^ 跳转至行首的第一个非空白字符
0 跳转至行首
$ 跳转至行尾

行间跳转

命令 说明

G | 跳转至由 # 号指定的行

:# | 跳转至由第 # 行
1G 和 gg | 跳转至第一行
G | 跳转至最后一行

句间跳转

命令 说明
) 跳转到下一句
( 跳转到上一句

段落间跳转

命令 说明
} 下一段
{ 上一段

命令模式翻屏操作

命令 说明
Ctrl+f 向文件尾部翻一屏,相当于 Pagedown
Ctrl+b 向文件首部翻一屏,相当于 Pageup
Ctrl+d 向文件尾部翻半屏
Ctrl+u 向文件首部翻半屏
Enter 按行向后翻

1.5.3 字符编辑

命令 说明
x 删除光标所在处的字符

x | 删除光标所在处起始的 # 个字符

xp | 交换光标所在处的字符与其后面的字符的位置,如serach,将光标放在r上,按xp,可以换成search
| 转换大小写
J | 删除当前行后的换行符

1.5.4 替换命令(replace)

命令 说明
r 替换光标所在处的字符,如:将小写n替换为大写N,命令为 r 后面跟上N
R 切换成 REPLACE 模式(在末行出现-- REPLACE -- 提示),按 ESC 回到命令模式

1.5.5 删除命令(delete)

命令 说明
d 删除命令,可结合光标跳转字符,实现范围删除
d$ 删除当前字符至行尾的字符
d^ 删除当前字符至非空行首的字符
d0 删除当前字符至行首的字符
dw

dw | 删除 # 个单词

de |
db |
dd | 删除光标所在处的行,也支持加数字,如3dd是删除光标所在处的行起始的共3行

dd | 多行删除

D | 从当前光标位置一直删除到行尾,等同于d$

1.5.6 粘贴命令(paste)

命令 说明
p 缓冲区中的内容如果为整行,则粘贴在当前光标所在行的下方,否则,则粘贴至当前光标所在处的后方
P 缓冲区中的内容如果为整行,则粘贴在当前光标所在行的上方,否则,则粘贴至当前光标所在处的前方

1.5.7 复制命令(yank)

命令 说明
y 复制,工作行为相似于d命令
y$
y0
y^
ye
yw
yb
yy 复制一整行

yy | 复制#行

Y | 复制整行

1.5.8 改变命令(change)

从编辑模式-->输入模式,实际实现删除操作

命令 说明
c$
c^
c0
cb
ce
cw

cw |

cc | 删除光标所在的行,并转换为输出模式,即删除当前行并输入新内容,相当于S

cc | 删除#行

C | 删除当前光标到行尾,并切换成插入模式,相当于c$

1.5.9 查找

命令 说明
/PATTERN 从当前光标所在处向文件尾部查找能够被当前模式匹配到的所有字符串
?PATTERN 从当前光标所在处向文件首部查找能够被当前模式匹配到的所有字符串
n 下一个,与命令方向相同
N 上一个,与命令方向相反

1.5.10 撤销(undo)操作

命令 说明
u 撤销最近的更改,相当于windows中ctrl+z

u | 撤销此前的 # 个操作

U | 撤消光标落在这行后所有此行的更改
Ctrl+r | 撤销此前的撤销,相当于windows中crtl+y
. | 重复执行前一个编辑操作

. | 重复执行前 # 个编辑操作

1.5.11 高级用法

<start position><command><end position>

常见Command:y 复制、d 删除、gU 变大写、gu 变小写

示例

0y$ 命令
0 → 先到行头
y → 从这里开始拷贝
$ → 拷贝到本行最后一个字符

示例:粘贴 song 100 次

100isong [ESC]
命令 说明
di" 光标在” “之间,则删除” “之间的内容
yi( 光标在()之间,则复制()之间的内容
vi[ 光标在[]之间,则选中[]之间的内容
dtx 删除字符直到遇见光标之后的第一个 x 字符
ytx 复制字符直到遇见光标之后的第一个 x 字符

1.6 可视化模式

在末行有”-- VISUAL -- “指示,表示在可视化模式

允许选择的文本块

命令 说明
v 按字符选定,面向字符,-- VISUAL --
V 按行选定,面向整行,-- VISUAL LINE --
ctrl-v 面向块,-- VISUAL BLOCK --

可视化键可用于与移动键结合使用

w ) } 箭头等

突出显示的文字可被删除,复制,变更,过滤,搜索,替换等

示例:在文件指定行的行首插入#

1、先将光标移动到指定的第一行的行首
2、输入ctrl+v 进入可视化模式
3、向下移动光标,选中希望操作的每一行的第一个字符
4、输入大写字母 I 切换至插入模式
5、输入 # 
6、按 ESC 键

示例:在指定的块位置插入相同的内容

1、光标定位到要操作的地方
2、CTRL+v 进入“可视 块”模式,选取这一列操作多少行
3、SHIFT+i(I)
4、输入要插入的内容
5、按 ESC 键

1.7 多文件模式

命令 说明
:next 下一个
:prev 上一个
:first 第一个
:last 最后一个
:wall 保存所有
:qall 不保存退出所有
:wqall 保存所有文件并退出

例:

vim file1 file2 file3
在file1中 :next  切换到file2
在file1中 :last  切换到file3
在file3中 :prev  切换到file2
在file3中 :first  切换到file1
注:file1 和 file2 和 file3可以实现跨文件复制

1.8 多窗口模式

1.8.1 多文件分割

命令 说明
-o 水平或上下分割窗口
-O 垂直或左右分割窗口(vim only)

示例

vim -o|-O FILE1 FILE2 ...

在窗口间切换,Ctrl+w <h|j|k|l>

注意:单个文件也可以分割为多个窗口进行查看

1.8.2 单文件窗口分割

命令 说明
Ctrl+w,s split, 水平分割,上下分屏
Ctrl+w,v vertical, 垂直分割,左右分屏
ctrl+w,q 取消相邻窗口
ctrl+w,o 取消全部窗口
:wqall 退出

1.9 vim的寄存器

有26个命名寄存器和1个无命名寄存器,常存放不同的剪贴版内容,可以在同一个主机的不同会话(终 端窗口)间共享

寄存器名称 a,b,...,z,格式: 寄存器放在数字和命令之间

示例

3"tyy 表示复制3行到t寄存器中 ,末行显示`3 lines yanked into "t` 

"tp 表示将t寄存器内容粘贴

未指定,将使用无命名寄存器

有10个数字寄存器,用0,1,...,9表示,0存放最近复制内容,1存放最近删除内容。当新的文本变更
和删除时,1转存到2,2转存到3,以此类推。数字寄存器不能在不同会话间共享

1.10 标记和宏(macro)

命令 描述
ma 将当前位置标记为a,26个字母均可做标记, mb 、 mc 等等
'a 跳转到a标记的位置,实用的文档内标记方法,文档中跳跃编辑时很有用
qa 录制宏 a,a为宏的名称,末行提示: recording @a
q 停止录制宏
@a 执行宏a
@@ 重新执行上次执行的宏

1.11 编辑二进制文件

# 以二进制方式打开文件
vim -b binaryfile 
# 扩展命令模式下,利用xxd命令转换为可读的十六进制 
:%!xxd
# 切换至插入模式下,编辑二进制文件 
# 切换至扩展命令模式下,利用xxd命令转换回二进制 
:%!xxd -r
# 保存退出

1.12 帮助

:help

:help topic

Use :q to exit help

vimtutor

2. 总结

命令 说明
i 光标前插入
a 光标后插入
o 光标下一行
O 光标上一行
A 光标尾部
esc 返回 NORMAL
:wq 保存 + 退出
:q! 强制退出
hjkl 上下左右
:set nu 设置行号
dd 删除一整行
$ 光标移动到行尾
0 光标移动到行首
/ text 查找 text
yy 复制
p 粘贴
u 撤销
5dd 删除第5行
gg 回到文件首行
G 回到文件末尾
ggdG 删除文本所有内容
w 移动到下一个单词开头
e 移动到下一个单词结尾
v 进入可视模式
:vs 分屏
:hide 隐藏分屏
ctrl + ww 切换分屏

3. 实战

3.1 在vim中设置tab缩进为4个字符

缩进用 tab 制表符还是空格,这不是个问题,就像 python 用四个空格来缩进一样,这是要看个人喜好的。在 Vim 中可以很方便的根据不同的文件类型来设置使用 tab 制表符或者空格,还可以设置长度,非常灵活。
首先来看如何设定 tab 的宽度以及如何确定用 tab 制表符还是空格来表示一个缩进:

set tabstop=4
set softtabstop=4
set shiftwidth=4
set expandtab / noexpandtab

其中 tabstop 表示一个 tab 显示出来是多少个空格的长度,默认 8。

softtabstop 表示在编辑模式的时候按退格键的时候退回缩进的长度,当使用 expandtab 时特别有用。

shiftwidth 表示每一级缩进的长度,一般设置成跟 softtabstop 一样。

当设置成 expandtab 时,缩进用空格来表示,noexpandtab 则是用制表符表示一个缩进

3.2 vim在同一个窗口中同时编辑多个文件

一、如果在终端中开没有打开vim,可以:

# 横向分割显示:
$ vim -o filename1 filename2  

# 纵向分割显示:
$ vim -O filename1 filename2

二、如果已经用vim打开了一个文件,想要在窗口中同时再打开另一个文件:

# 横向分割显示:
:vs filename

# 纵向分割显示:
:sp filename

其中,vs可以用vsplit替换,sp可以用split替换。
如果finename不存在,则会新建该文件并打开。

三、关闭窗口

# 关闭光标所在的窗口:
:q
# 或
:close

# 关闭除光标所在的窗口之外的其他窗口:
:only

# 关闭所有窗口:
:qa

四、切换窗口

打开了多个窗口,需要在窗口之间切换时:
ctrl + w w
即按住ctrl键,再按两下w键。
或者ctrl + w <h|j|k|l>
即按住ctrl键,按一次w键,再按一次表示方向的h或j或k或l,则光标会切换到当前窗口的 左|下|上|右 侧的窗口

根据网上的教程综合整理而成,希望能够帮助到需要的人~~~

posted @ 2021-03-30 17:05  临江仙我亦是行人  阅读(461)  评论(0编辑  收藏  举报