Linux学习笔记 4 vim编辑器
之前一直觉得vi/vim的指令比较繁琐,所以用的都是轻量一些的nano,但是轻量的代价就是如果想要进行一些复杂的操作就不太方便了,另外好几次在没有联网的linux系统计算机上编辑文件时,也发现只有自带的vi而没有安装nano,操作起来就很生疏。另外vim不光是一个“文本”编辑器,他还是一个“程序“编辑器,可以对代码进行高亮显示,多窗口显示等等,另外熟悉了vi的快捷键之后,编辑效率还是要高上不少的,所以还是学习一下吧。
vi是所有的unix like系统都会内置的编辑器,其他的编辑器不一定存在,vim是vi的升级版,兼容所有vi的操作,还可以对程序进行高亮甚至检查语法,以及增加了一些参数的显示。
vi的使用
基本使用
三种模式
vi有三种模式:
一般指令模式
vi打开文件时进入的就是一般指令模式,该模式下可以移动光标,对文本进行删除,复制,粘贴,搜索等操作,也可以通过按键切换到另外两个模式,该模式下无法编辑(打字输入)文本内容。
编辑模式
一般指令模式按下
i,I,o,O,a,A,r,R
中的任何一个字母之后会进入到编辑模式(详细模式不一样),按下esc返回一般指令模式。进入编辑模式后,只有esc键时特殊的,其他按键都当作一般输入。命令行命令模式
按下
: / ?
三个中任意一个,光标会移动到最下面的一列,进入到命令行模式,该模式下可以进行查找数据,读取,保存,大量替换字符,退出vi,设置编辑器(如显示行号)等操作。
一些按键组合
vi有大量的快捷键,这里记录部分用得比较多的。
一般指令模式
vbird的书里面貌似都是用的”列“来表述我们文本中的一行。
移动光标以及查找
按键 | 作用 |
---|---|
←或者h | 光标左移 |
↓或者j | 下移 |
↑或者k | 上移 |
→或者l | 右移 |
n(数字)+上面的方向键 | 向指定方向移动n次 |
ctrl+f | 屏幕向下翻页 |
ctrl+b | 屏幕向上翻页 |
ctrl+d | 向下移动半页 |
ctrl+u | 向上移动半页 |
+ | 光标移动到非空白字符的下一行 |
- | 上一行(感觉这两个指令就是切换行?) |
n空格 | 光标向右移动n个字符 |
0或者home | 到达这一行的起始字符处 |
$或者end | 到达这一行的最后一个字符处 |
H | 移动到当前屏幕最上方的一行的第一个字符处 |
M | 移动到屏幕中央的一行的第一个字符 |
L | 移动到屏幕下方一行的第一个字符 |
G | 移动到文件的最后一行 |
nG | 移动到文件的第n行 |
gg | 移动到文件的第一行(1G) |
n Enter | 向下移动n行 |
/word | 从光标处开始向下查找word字符串 |
?word | 向上查找 |
n | 按照当前查找顺序,查找下一个 |
N | 和当前相反的查找顺序查找下一个 |
:n1,n2s/word1/word2/g | 查找n1到n2行之间的word1并替代为word2 /gc 在替换时要求用户确认 |
删除 复制 粘贴
按键 | 功能 |
---|---|
x,X | x向后删除一个字符(del),X向前删除(backspace 退格) |
nx/X | 连续向后/前删除n个字符 |
dd | 删除光标所在的那一行 |
ndd | 删除光标所在的向下n行 |
d1G | 删除光标所在到第一行的所有数据 |
dG | 删除光标所在到最后一行的所有数据 |
d$ | 删除光标到所在行最后一个字符 |
d0 | 删除光标所在到所在行的第一个字符 |
yy | 复制光标所在行 |
nyy | 复制光标所在行以及下面的n行 |
y1G | 复制光标所在行到第一行的所有数据 |
yG | 复制光标所在行到最后一行 |
y0 | 复制光标所在行第一个字符的所有数据(不包括光标圈起来的那个字符。光标实际在字符的左侧) |
y$ | 复制到行尾的数据 |
p,P | p 将已复制的内容在光标的下一行粘贴,P则为上一行 |
J | 将光标所在行与下一行合并成一行 |
n+c+方向 | 向一个方向重复删除n行 |
u | 撤销 |
ctrl+r | 取消撤销 |
. | 重复执行上一个动作 |
编辑模式
一般模式进入到编辑模式有多种按钮,他们是不一样的
按钮 | 作用 |
---|---|
i,I | 进入插入模式,i为从当前光标处插入,I为在当前行的第一个非空白字符前开始插入 |
a,A | 进入插入模式,a从光标所在的下一个字符出开始插入(append),A表示从所在行的最后一个字符出开始插入。 |
o,O | 插入模式,o表示向下插入新的一行,O为向上插入新的一行 |
r,R | 进入取代模式,r只取代光标所在的字符一次,R会持续接受输入,持续替换。 |
esc | 退出到一般模式 |
命令行模式
按键 | 作用 |
---|---|
:w | 保存到硬盘中 |
:w! | 强制写入(前提是你要有权限,而文件属性是r) |
:q | 退出vi |
:q! | 修改过文件,但是不考虑保存,强制退出 |
:wq | 保存并退出 |
ZZ | 文件没变化就直接离开,否则先储存再离开 |
:w filename | 将数据储存成另外一个文件 |
:r filename | 编辑数据时,读入另一个文件的数据 |
:n1,n2 w filename | 将n1到n2行的内容保存到文件中 |
:! command | 暂时离开vi,在命令行中执行命令 |
:set nu | 显示行号 |
:set nonu | 不显示行号 |
vim暂存盘
vim在编辑的时候会在文件的目录下再新建一个隐藏的.swp文件作为暂存盘,记录用户的操作,如果编辑异常中断(ctrl+z或者死机),下次编辑该文件的时候会提示你有错误出现。(如果打开一个正在被编辑的文件也会出现这个提示)
如果之前是异常退出的,可以使用R,来恢复之前的工作,如果是有其他人在编辑,你只是想查看文件的话可以使用O,以只读模式打开文件,也可以使用E继续编辑。如果你确定不需要该暂存盘,使用D删除即可。
vim额外功能
区块选择
我们可以选择一个区块范围。并进行粘贴,删除等操作,很多传统编辑器做不到这种操作(个人感觉类似于excel,可以选中一个块而不是整个行)
区块选择在一般指令模式下进行
按键 | 作用 |
---|---|
v | 选择光标经过的地方的字符 |
V | 选择光标经过的行 |
ctrl+v | 区块选择,可以用长方形的方式进行选择 |
y | 复制选择区域 |
d | 删除选择区域 |
p | 粘贴复制的区域 |
多文件编辑
我们可以使用:r filename
在当前编辑窗口中读入某个文件的内容,但是这样读入的是整个文件,总还是有一些不便,这时我们可以使用多文件编辑,在编辑器内打开多个文件,并按需求切换。并且由于是一个编辑器打开的多个文件,他们直接也可以直接使用vi的指令进行复制。vim file1 file2
即可打开两个文件。
|
|
多窗口编辑
多文件编辑虽然已经让我们的操作变得简单了,但是如果某些时候我们想要对照的查看编辑两个文件,频繁的切换总还是有些麻烦,这种情况下我们可以在编辑器中打开多个窗口进行编辑。在命令行模式中输入:sp [filename可选(如果希望在新窗口打开新文件就加上文件名,不加的话就是当前的文件)]
窗口间的切换使用ctrl+w+↑(k)
与ctrl+w+下(j)
,使用ctrl+w+q
为退出窗口。
vim 补全
关键字提示/补全功能是在插入模式下使用的 都是用ctrl+x作为命令前缀。
- ctrl+x -> ctrl+n 通过正在编辑的文件的内容作为关键字进行补全(先输入ctrl+x 在输入 ctrl+n)
- ctrl+x -> ctrl+f 以当前目录内的文件名作为关键字,提示补全
- ctrl+x -> ctrl+o 以扩展名作为语法补充,使用vim内置关键字
第一个组合键对于补全之前输入过的关键字有效,第三个则会提示你符合文件扩展名的关键字。
还是相当好用的。
vim环境设置
当我们在文件中搜索了某个字符串,然后退出了程序,下次进入的时候会发现,我们依旧在搜索模式中,甚至编辑其他的文件,该关键词依旧处于高亮状态,并且重复进入之前编辑的文件时,我们的光标还停留在之前退出时所在的地方。
因为vim**会主动记录用户的行为,方便用户之后继续作业。**记录文件位于~/.viminfo,另外是否缩进,是否设置高亮,这些都是可以在环境参数中自己设置的,命令行模式下输入:set all
可以查看所有的设置(超级多.)。
记录一些常用的环境参数,
命令 | 解释 |
---|---|
:set u | 设置行号 |
:set nonu | 取消行号 |
:set autoindent | 自动缩进 |
:set noautoindent | 关闭自动缩进 |
:set backup | 是否自动备份,如果开启,在编辑一个文件时原始文件会被另存为一个名为filename~的文件,一般关闭 |
:set backspace=(0/1/2) | 编辑模式下,是否允许使用退格键删除字符(某些发行版默认不允许),设置为2的时候就是可以删除,0/1只能删除刚刚输入的字符,无法删除之前就有的。 |
:set syntax on/off | 开启/关闭语法高亮 |
:set bg=dark/light | 背景色调 |
:set ruler | 是否在右下角显示状态说明 |
:set showmode | 是否显示当前的模式 |
:set | 显示与默认值不同的设置参数 (all的话,就是现实所有的环境参数设置) |
这个设置如果只是在一个vim窗口中进行设置的话,只作用于当前窗口,不过我们可以修改*/etc/vimrc*配置文件(不存在就手动创建)手动写入全局配置参数。
补充
这篇文章中的:set 我全部使用了全角符号,因为editor.md把:s解析成了emoji…真是令人尴尬
vim真的相当的强大,不过真的要把那么多指令都熟练掌握还是有不小的难度,刚学完vim,在对文件进行操作之前总要想一想第一步该怎么做,不过虽然麻烦一些,但是从今天开始能用vi/vim就不用nano了,毕竟熟能生巧嘛,之后应该还会遇到一些问题,都会记录在这下面了。