Vim 编辑器平时使用到的功能总结
vim文件编辑器 [重点]
vim 是一个强大的文件编辑工具, 学习文件编辑之前, 首先要学习一下文件编码格式:
vim 是 vi的高级扩展, 如果Linux为最小安装版是不包含vim的,只能使用vi编辑
vim 对比vi 可以支持语法格式高亮显示, 语法检查等
文件编码格式
1:在vim中通过set属性, 修改当前文件编码:
:set fileencoding=utf-8
enconv 转换文件编码
要将一个GBK编码的文件修改为utf-8编码
enconv -L zh_CN -x UTF-8 filename
iconv 转换
指令格式: iconv -f encoding -t encoding inputfile -o outputfile
例如将一个UTF-8的文件转为GBK编码文件
iconv -f GBK -t utf-8 file1 -0 file2
基本上vi分为三种模式: 一般指令模式 ; 编辑模式; 指令列命令模式
1:一般命令模式:
使用vim filename 打开文件之后,默认的模式,进入之后最下面会显示当前文件的行数L 和字数C, 此时还不能编辑文件内容,但是可以使用文件操作命令执行光标调整, 执行删除,复制,查找,和替换等操作;
2: 编辑模式:
首先在一般命令模式下: 使用 i , a ,o 命令进入编辑模式;
插入模式 --insert--
i:从当前光标位置的前面进行插入内容;
a:从当前光标位置的后面进行插入内容;
o:从当前光标位置所在行插入下一行插入内容;
替代模式 -- replace--
r: 录入以覆盖原内容方式输入内容;
进入编辑模式后,就可以从光标位置进行编辑
3:指令类命令模式(命令行模式)
在一般模式下, 通过输入: 冒号后, 可在冒号之后输入命令,回车执行该命令;
一般命令模式的常用操作:
光标移动: 可以通过键盘上下左右,或者pageUp 或者pageDown 进行光标移动
也可以使用j 光标下移, k光标上移 , h光标左移 , l 光标右移
Ctrl+f : pageDown
Ctrl+b: pageUp
-
-
-
- 行跳转:
-
-
G : 光标移动到文档最后一行,相当于1G
nG : 其中n是数字,标识移动到第n行且光标自动为0位置, 可配合set nu 显示行号;
gg: 光标移动到文档第一行
n<Enter> : n为数字, 光标向下移动n行
-
-
-
- 列跳转:
-
-
0 : 光标移动到当前行0位置
$ : 光标移动到当前行最后位置
x : 删除光标处的字符;
b: 光标左移一个字符
nb : 光标左移n个字符
w : 光标右移一个字符;
nw : 光标右移n个字符;
ndb / ndw : 光标向左/右删除n个字符
nyb/ nyw : 光标向左/右 拷贝n个字符;
(: 移动到本句的句首
): 移动到下一句的句首
{: 移动到本段的段首;
} : 移动到下一段的段首;
-
-
-
- 查找:
-
-
/world : 表示从光标位置向下查找world, 并高亮显示, 使用n 可以像下跳转到匹配点, 使用N 向上跳转到匹配点
?world : 标识从光标位置向上查找world, 通过n和N的进行匹配点的跳转
想查找内容中的某个单词, 可以将贯标放在单词上, Shift +* 就可以高亮显示;
在编辑重复使用的变量名称书写验证时非常有用,
验证完 注意使用 /[email protected]#[email protected]#[email protected]# 随便输入一些不存在的查找一下,取消关键字高亮显示
-
-
-
- 查找光标当前所在的词
-
-
shift +*
-
-
-
- 在查找关键词之间跳转:
-
-
n 向后
N 向前
-
-
-
- 替换 注意行号之间用逗号分隔:
- 关于range的规定为:
-
-
如果不指定range,则表示当前行。
m,n: 从m行到n行。
0: 最开始一行(可能是这样)。
$: 最后一行
.: 当前行
%: 所有行
-
-
-
- 替换 注意分隔符的使用 / , | . @ , $
-
-
其中的 / , | , @ 仅仅为分割符, 避免与内容冲突即可
-
-
-
- 替换 注意引用变量使用双引号
-
-
- content 替换内容中如果使用到变量,使用"s|lod-content|${new}|g" 双引号
- 's|lod-content|${new}|g'单引号不支持变量, 仅替换为 ${new} 原样字符串
实际案例:
我们使用cat 输入流生成Makefile文件:
cat > Makefile <<EOF
bootsect.o
@as --32 bootsect.s -o bootsect.o #前面编辑时的tab文件中为空格
EOF
由于Makefile文件的指令入口是Tab, 而 上面创建的Makefile的target指令是以8个空格起始
要修改Makefile 中的8个空格为Tab空格, 注意这里的8需要根据vim的tab空格设置而定
sed 替换方式:
sed -i "s/ /\t/g" Makefile
高级的查找替换就要用到正则表达式。
\d: 表示十进制数(我猜的)
\s: 表示空格
\S: 非空字符
\a: 英文字母
\|: 表示 或
\.: 表示.
{m,n}: 表示m到n个字符。这要和 \s与\a等连用,如 \a\{m,n} 表示m 到n个英文字母。
{m,}: 表示m到无限多个字符。
**: 当前目录下的所有子目录。
起始和结束行标说明:
- 有起始行号, 有结束行号, 在范围内操作[n1,n2] 包含行号本身
- 省略起始行号, 省略结束行号 , 省略的行号代表当前行 :s/old/new/g
- 省略起始行,有结束行号:操作当前行到结束行号的数据 : ,8s/old/new/g
- 有起始行号, 省略结束行,操作起始行号到当前行的数据 :5,s/old/new/g
- $代表结束行标号,有起始和结束行号, $-2 , 表示从起始行号到倒数第2行
实例: 2,$-2d 删除2值倒数第2行数据 d表示删除
实例:$-5,$-2y 拷贝倒数第5行至倒数第2行数据 y表示拷贝
-
-
-
- 使用实例:
-
-
:72,73s/keyworld/setworld/g : 在72行到73行之间执行setworld 替换 keyworkd 操作
:72,73s/keyworld/setworld/gc: 同上的替换操作,每个替换位置都会给出提示,是否替换;
:1,s/old/new/g 全文替换;
:%s/old/new/g 全文替换:
其中的 / , | , @ 仅仅为分割符, 避免与内容冲突即可
:%[email protected][email protected][email protected]
-
-
-
- 使用替换多行添加注释 n1,n2s/^/#/g
-
-
其实就是将开头^表示起始位置, 替换为#即可;
-
-
-
- 行整体左右移动 n1,n2 > , n1,n2 <
-
-
n1,n2 > n1 到n2行数据整体右移
n1,n2 < n1 到n2行数据整体左移
-
-
-
- 删除字符
-
-
x /X : x向后删除一个字符, X向前删除一个字符
nx : n为数字, nx 表示向后删除n个字符
-
-
-
- 向后删除一个单词 dw, 遇到空格停止
- 删除列:
-
-
dd: 光标所在行
ndd: n为数字, 表示从光标所在在行向后删除n行;
1,d : 从第一行到最后一行删除
n1,n2y 从底n1行到底n2行珊瑚
d1G : 删除光标所在行到第一行之间的所有行
dG : 删除光标所在行到最后一行之间的所有行;
d0 : 删除当前行光标位置左边的所有字符, 0为当前行首位置,删除0到光标位置之间内容
d$ : 删除当前行光标位置右边的所有字符, $为当前行末位置,删除光标位置到末位置内容
-
-
-
- 复制列
-
-
yy: 复制光标所在行
nyy : n为数字, 表示从光标所在行及以下n行的内容进行复制;
1,y 从第一行到最后一行复制
n1,n2y 从底n1行到底n2行复制
y1G: 复制光标所在行到第一行所有内容
yG : 复制光标所在行到最后一行所有内容
y0 : 复制当前行光标位置左侧所有内容
y$: 复制当前行光标位置右侧所有内容
p, P : 粘贴, p 表示从当前行向后插入所复制内容, P 表示向当前行之前插入复制内容
J : 将当前行 和下一行 合并到当前行 , 之间会插入一个空格;
撤销与恢复:
u 撤销上一个动作, 类似上一步
Ctrl + r 恢复执行动作, 类似下一步
. 重复前一个动作;
一般指令模式切换到编辑模式
i I : i为从目前光标处插入, I为从当前行的第一个非空字符开始插入;
a A : a 为从当前光标的下一个字符处插入, A为从当前行最后一个字符处插入
o O : o 从当前行下一行插入一个新行, O 为从当前行上一行插入一个新行
r R : 进入取代模式, r只会取代光标位置字符一次, R会从光标位置一直取代插入至Esc退出
Esc : 退出编辑模式 , 回到一般命令模式
第三: 从一般命令模式进入命令行模式
只需要在一般命令行模式下输入 : 冒号即可编辑相关命令
:w 将编辑的输入写入硬盘文件中, 保存
:w! 若文件为只读,则强制写入, 但是是否写入成功,要根据文件权限而定,通常需要时文件 拥有者才可以
:q 离开vi编辑模式
:q! 若修改过内容, 不写入直接离开;
注意: ! 在vi模式下由强制执行的意思
:wq 存储后离开, 如果为wq! 强制存储后离开
:ZZ 如果文件没有变动则不存储离开, 如果文件有变动则存储后离开
:w [filename] 将编辑的数据存储位filename 文件,相当于另存为
:r [filename] 在编辑的数据中读入另一个文件, 即将filename这个文件内容加入光标所 在列的后面
:n1 n2 w [filename] 将n1 到n2 的数据 存入到文件filename
:! command 暂时离开vi 指令模式执行command命令
例如 :! ls /home 即在vi中关在 ls /home 命令 结果
:set nu 显示行号
:set nonu 取消显示行号
:$ 跳转到最后一行
:n 跳转到第n行
在Vi中 数字常常是很有用的,通常标识连续执行操作的次数, 20dd 标识联系删除20行
也有去到n的位置, n<Enter> 跳转到n行 或者 10j 向下移动10行, 20l向后移动20个字符
查看系统别名: alias
vim的暂存档 救援回复 和 开启时的警告功能
当我们使用vim 编辑文件时, vim会在被编辑文件所在目录下,创建一个.filename.swp 暂存档文件,用以在编辑如果出现意外时的回复;
测试
使用vim file1打开一个文件, 编辑部分内容
输入命令 Ctrl -z 组合键, vim会被丢到背景中去执行;
此时我们再次使用vim fiel1 会看到回复提示信息
由于暂存档的原因, vim 在打开文件时会对于可能有问题的文件给出以上提示信息
这些问题原因:
1:可能有其他人或者程序正在使用该文件
2:该文件的编辑出现意外
此时可以选择不同的模式对文件进行处理
- pen Read-Only : 只读方式打开文件
- dit anyway : 正常打开文件,忽略暂存盘的内容, 这样可能存在风险,两个人可能互 相改变对方编辑文件内容, 不好
[R]ecover : 打开暂存档内容, 用于执行意外情况下文件内容的回复, 但是当确认暂存档内容并保存好文件之后,记得删除掉同目录底下的.filename.swp暂存档文件,否则在次打开还会有该风险提示信息;
[D]elete it : 当确定暂存档无用, 源文件内容正确时,可以选择 D ,删除掉同目录底下的暂存档文件
[Q]uit : 输入q 离开本次编辑
[A]bout : 忽略这个编辑行为, 类似于q ;
Vim的额外功能:
centOs中 目前即使使用vi 也模式使用的vim的编辑模式;
可是使用alias 即可查看到vi 已经内设为vim的别称;
区块选择:
当我们选择v 或者 V 为行选择模式; 此时上下移动光标,会选择扫过的整行
按Ctrl +v 时 ,表示进入区块选择模式, 此时使用jkhl移动光标位置,在光标经过的地方会反白显示,表示该区域为被选择区块;
v 字符选择, 会将光标经过的地方反白显示,标识已选择字符
V 列选择, 会将光标经过的列反白显示,表示已选择列
Ctrl+v 区块选择 , 此时调整光标位置,会反白选择一个长方形区块
y 将反白选择的区块复制
d 将反白选择的区块删除
p 将反白选择的区块粘贴
实际操作中发现, ctrl+v 矩形区块选择中会有因为行结尾无法扩展位置造成的部分区域无法选中的问题: 区块选择对于不连续或者区域分散的内容支持不好;
可以看到,当我从/usr/man 该行结束位置比较靠前,但是对下面的行进行选择时,返现22行有部分不发达到选择的目的; 我们执行拷贝或者删除操作只能是反白的区域
多文件编辑
有时我们可能会从一个文件中复制部分内容到另一文件中,这在windows中非常方便,直接同时打开两个文件, 一个拷贝完在另一个中粘贴; 这在linux中也是可以实现的
vim file1 file2 file3 ... 可以同时打开多个文件
但是需要在文件之间切换:
:n 切换到下一个文件
:N 切换到上一个文件
:files 查看当前编辑的多个文件列表
使用:n (next) 或者N 在每次切换时, 会在左下角显示当前文件的名字
多窗口功能:
#method one
#单页面操作,打开一个文件后
:e [otherfile] #打开另一个文件,进行操作即可
#method two
#双页操作
:sp [otherfile] #水平分页
:vsp [otherfile] #垂直分页
我们打开一个非常大的文件, 有时候我们需要对比文件前后的部分内容,却发现使用pageUp或者pageDn在文件前后挑战非常麻烦, 此时使用多窗口会非常方便;
Linux 中实现多窗口功能: 在命令行模式下
:sp [filename]
即可增加一个分屏窗口, 后面的filename 为可选项,如果新窗口是当前文件,可以不输入, 如果要加入另一个文件,就输入文件名
在多个分屏之间切换:
切换到下面分屏: 注意: ctrl +w 是组合键, 之后松开在按j 或者↓
[Ctrl+w] + j
[Ctrl+w] +↓
切换到上面分屏: 注意: ctrl +w 是组合键, 之后松开在按k 或者↑
[Ctrl+w] + k
[Ctrl+w] + ↑
测试示例:
sp newFile
在两个屏幕之间切换, 他们可以相互复制粘贴信息;或者对比文件内容
挑字补全功能
如果在vim编辑时, 我们希望使用Table 键那样的提示功能
可以使用如下一些常用的组合键:
[Ctrl -x] -> [Ctrl - n ] : 通过正在编辑的[文件内容文字] 作为关键字,进行补全
[Ctrl -x] -> [Ctrl - f ] : 通过当前目录内的[文件名] 作为关键字,进行补全
[Ctrl -x] -> [Ctrl - o ] : 以扩展名进行语法补充,以vim内建的关键词,进行补全
测试:
vim ht.html
打开一个html文件, 注意,vim内建的关键字会匹配,文件扩展名给出提示
进入编辑模式后在需要编辑的位置
Ctrl+x --> Ctrl+o
可见如下提示信息:
vim环境设定与记录: ~/.vimrc ~/.viminfo
~/.vimrc vim reference config vim参数设定
~/.viminfo vim 操作历史记录文档 记录条数 ${HISTSIZE}
我们发现当编辑文件是使用了/keyworld 查询关键字, 文件内容会以反白显示,当我们关闭后,再次打开该文件, 返现上次查找的关键字仍然是反白显示,且光标位置也是上次退出的位置;
这是怎么做到的? 这些操作信息一定被记录下来了;
我们编辑文件时, vim 会自动将你曾将操作的行为记录下来, 方便再次打开时的作业, 而那个记录的文件就是 ~/.viminfo
vim 编辑文件时的各种状态,都是由许多参数定义的, 那么浙西参数是什么?
:set all
查看当前vim的环境参数设定值
:set
查看当前vim 设定与预设不同的参数值
我们可以添加自定义的一些属性
在打开文件时,通过命令设置参数 :例如
set nu
如果想保存这些设定,避免每次设定: 编辑 ~/.vimrc
将set nu 添加到文件中保存
再次编辑文件,发现set nu 显示行号功能已经打开;
vim中执行shell命令 [重点]
-
-
-
- 第一种 :!command
-
-
例如在一般模式下
:!ls -al 就可以列出当前目录的文件信息,且回车后返回vim
特别是
:!bash 命令非常好用 ,在vim中开启一个bash窗口, 使用完后,exit退出,发现还是在vim模式下, 避免了退出vim , bash 命令执行, 然后在进入vim 的麻烦;
另一个相当好用的是如果我们想将bash执行结果输入vim
可以使用
-
-
-
- 第二种:r!command
-
-
例如
:r!date 就可以直接将当前系统时间写入vim的当前行的下一个新行内;
-
-
-
- 第三种:n1,n2!command
-
-
n1 和n2 都是数字, 表示起始行,和结束行
该命令是将当前编辑文档的n1到n2行的数据替换为command执行结果信息
特别好用的一个例子
:1,4!sort 可以将第一行到第4行的内容排序后在重新写回到文档中;
另一个应用
:14!tr '[a-z]' '[A-Z]' 可以将第14行的内容小写转为大写, 1表示第一行
:.!tr '[a-z]' '[A-Z]'可以将当前行的内容小写转大写 , .表示当前行
-
-
-
- 第四种:n1,n2w!command
-
-
n1,n2为数字,表示起始行和结束行
该命令将n1~n2行内的数据最为shell命令执行,执行结果会在vim编辑区域下方开辟一个新的区域显示,但并不会改变当前文档的内容
例如:1,4w!sort 会将1到4行的内容排除输出到vim文档下面
特殊的使用:1w!bash 将会把第一行的内容最为bash命令来执行,并在下方写入
同样的:.w!bash 将会把当前行的内容作为bash命令执行,在下方写入
vim 额外的问题:
中文乱码问题:
Dos 与Linux 的断行字符问题
语系编码问题