vim/vi 如何高效使用(键盘图打印版)
https://blog.csdn.net/zhlh_xt/article/details/52458672
vim的ex模式用法
https://blog.csdn.net/u013408061/article/details/77853130
本文是在学习《使用vi编辑器, Lamb & Robbins编著》时在evernote写的其中一章笔记,现在整理好,一方面温故而知新,一方面希望对大家能有些帮助。ex的命令在vim编程中都是非常常用的,熟练这些命令对于提高编程效率有很大的帮助。
主要内容:
1. 使用行号在文件中移动
2. 使用ex命令对文本块进行复制,移动和删除
3. 保存文件和部分文本
4. 操作多个文件(读入文本或命令,在文件间切换)
本文约定:
$ + 命令 表示在普通的bash的命令行下
: + 命令 表示在vim的ex(命令)模式, 按"Ctrl" + ":" 进入
vim有4种模式:普通模式,插入模式,可视模式,ex(命令)模式。
ex并不是另一个编辑器,应该说vi是更一般更基本的ex行编辑器的可视模式,所以ex算是vi的底层行编辑器。由于一些ex命令可以节省大量的编辑时间,因此在使用vi时它们是非常有用的。这些命令的大部分都可以在不离开vi的情况下使用。
可以把文件看成一系列以编号的行。ex可以使你更灵活,更有选择地执行编辑命令。使用ex,可以容易地在文件之间移动,并以各种方式把文本从一个文件移动到另一个文件,还可以快速地对大于单个屏幕的文本块进行编辑。通过全局替换,可以在整个文件中使用给定的模式进行替换。等
在命令行中:
$ ex filename
可以看到有关文件总行数信息
ex命令由行地址(行号)和命令组成,它们都以回车键结束。
最基本的命令是用来打印(到屏幕)的p.
:2 p
显示当前文件的第二行内容
如果要显示多行,可以指定行号范围:
:2 , 10 p
显示2~10行的内容
没有行号的命令被认为作用于当前行。 假设当前光标在12行,输入命令
: s/hello/hehe
会把第12行的第一个"hello"改为"hehe"
使用ex进行编辑
ex常用编辑命令:
d (delete) 删除行
m (move) 移动行
co (copy) 复制行
t 复制行,和co同义
定义行的范围:
ex可以使用行号明确地定义一行或连续数行范围。使用明确数字的地址成为绝对行地址。
使用行范围,可以行范围内的行进行命令操作,例如:
:3, 18 d 删除3~18行
:11, 15 m 23 把11~15行移动到23行下面。
:23, 29 co 100 复制23~29行并把它们粘贴到100行下面
:set nu 或 :set number 显示行号
:set nonu 或:set nonumber 不显示行号
:= 显示总行数
: . = 显示当前行号
: /pattern/= 显示地一个与模式pattern想匹配的行号
行地址符
.(点) 代表当前行
$ 代表文件的最后一行;
% 代表文件的每一行,等同于1, $的组合
这些符号可以与绝对行地址组合使用,例如:
: . , $ d 删除从当前行到文件末尾
:20, . m $ 把20~当前行的文本移动到文件末尾
:% d 删除文件中的所有行
:% t $ 复制所有行并把它们粘贴到文件的尾部(成为连续的副本)
除了绝对行地址外,也可以指定一个相对当前行的地址。符号+和-就像数学运算符一样,当将其放置在数字前面时,这些符号就会加上或减去跟在它们后面的数值。例如:
:. , . + 20 d 删除从当前行到当前行以下20行
:226 , $ m .-2 把226行到文件末尾的文本移动到当前行的上面两行的后面。
:. , +20 # 显示从当前行下面20行的行号
事实上,由于当前行是假定的开始位置,因此在使用+或-时不需要输入圆点
如果在+或-后面没有数字,那么就等价于+1和-1
数字0代表文件的开头(等于0行)。
:-, + t 0 复制三行(当前行,前一行,后一行),并粘贴到文件开头
搜索模式
ex定位行的另一种方法是使用搜索模式。例如:
:/pattern/ d 删除下一个包行模式pattern的行
:/pattern/+ d 删除下一个包行模式pattern的行的下一行(也i可使用+1来代替)
:/pattern1/,/pattern2/ d 删除第一个包行pattern1的行与第一个包行pattern2的行之间的所有行
:. , /pattern/ m 23 从当前行到第一个包行pattern的行之间的文本移动到23行后面。
重新定义当前行的位置
假设当前光标在第一行。
:100, +5 p
会发生错误, 因为这个命令等价于:100, 6p,
而我们是希望显示100~105行, 为了达到这个目的,我们要把当前行为第一行变成当前行为100,然后+5.
ex提供了这个方法, 当使用“分号”代替“逗号”时,就会将第一个行地址当成“当前行”。
:100 ; +5 p 就会显示100~105行
分号也可以用于搜索模式的相对地址中,例如,显示下一个包行模式pattern的行和它下面的10行:
:/patter/ ; +10 p
全局搜索
我们已经知道在vi中使用/(斜杆)来搜索文件中的字符模式。ex也有全局命令g, 可以让你搜索模式并显示找出的所有包含该模式的行。命令:g!的作用与:g相反,使用:g!(或它的同义词:v)可以搜索不包行该模式的行
可以对文件中的所有行使用全局命令,也可以使用行地址把全局搜索限定在指定的行或行范围内。
:g /pattern 寻找(移动到)模式pattern在文件中最后出现的位置
:g /pattern/ p 寻找并显示文件中所有包含模式pattern的行
:g!/pattern/nu 寻找并显示文件中所有不包行模式pattern的行,并显示这些行号
:20, 40g/pattern/p 寻找并显示第20到40行之间所有包含模式pattern的行
组合ex命令
你不必一直输入冒号来开始新的ex命令。在ex中,竖直线(|)是命令的分割符,它允许用户把多个命令组合在同一个ex提示符下(与此类似的是分号分隔符UNIX shell提示符下的多个命令)。同时使用|时,要注意制定的行地址。如果一个命令影响到文件中行的顺序,那么下一个命令将使用新的行位置进行工作。例如:
:1 , 3d | s/thier/their/
把第1行到第3行删除,然后在当前行(该行是调用ex提示符以前的第4行)进行替换
:1 , 5 m 10 | g/pattern/nu
把第1行到第5行移动到第10行后面,然后显示所有包含模式pattern的行。
注意,使用空格会使命令更容易阅读
保存和退出文件
:w 把缓冲区写(保存)到文件中但不退出,可以(和应该)在编辑会话期间使用:w来保护编辑操作以避免系统瘫痪或重大的编辑错误
:q 退出编辑器,返回系统提示符
:wq 写文件并退出编辑器,即使没有修改文件,写操作也会无条件的进行
:x 写文件并退出编辑器,只有修改了文件写操作才能进行
有时候vi编辑器会有警告,可以在命令后面加上感叹号!来强制执行,忽略警告
保存部分文件到新文件中
有时候,希望把当前文件的一部分保存为一个新的单独文件。
:20 , $w newfile 把第20行到文件末尾文本保存到新文件newfile中
:. , 500 w newfile 从当前行到500行文本保存到新文件newfile中
添加到现有文件中
可以使用重定向添加符(>>)和w把缓冲区的全部或部分内容添加到现有文件尾。
:30 , $w >> file 把30行到文件末尾添加到文件file的末尾
把文件复制到另一个文件中
有时想把系统中已有的文本或数据复制到正在编辑的文件中,在vi中可以使用ex命令读取另一个文件的内容:
:read filename
或者使用缩写形式
:r filename
这个命令会把filename文件的内容插入当前编辑文本的光标位置后面一行。
如果想指定其它行,只需要在read或r命令之前输入行号即可。 例如:
:10 r filename 将会把filename的文本输入到当前第10行后 。
如果文件在其他目录下,只需要加上路径即可。例如:
:r /home/time/data 把/home/time目录下的data内容插入当前编辑文件
应用地址符组合或搜索模式可以更灵活:
:$r /home/tim/data 把读取的文件内容加到当前编辑文件的末尾
:0r /home/tim/data 把读取的文件内容加到文件开头位置
:/pattern/r /home/tim/data 将读取的文件内容加到当前文件包行模式/pattern的行的后面
编辑多个文件
ex命令可以在多个文件之间切换。同时编辑多个文件的好处是速度快。在同一编辑会话中,在文件之间切换不仅能加速访问,而且还能保留已制定的缩写和命令序列,以及复制缓冲区,这样可以在文件之间复制文本。
1. 调用vi打开多个文件
在首次调用vi时,可以制定要编辑的多个文件,然后使用ex命令在文件之间进行切换。例如:
$ vi file1 file2 首先编辑file1,完成第一个文件的编辑后,ex的:w命令写(保存)file1,:next 命令(缩写:n)调用下一个文件(file2)
2. 使用参数列表
除了使用:n移动到下一个文件。还有其他参数可以使用
:args命令(缩写:ar)列出在所有编辑的文件,当前文件使用方括号括起来。
:rewind(缩写:rew) 把当前文件设置为上一个编辑的文件
:last(缩写:la) 把当前文件设置为最后一个文件
3. 调用新文件
你不必在编辑会话的开始就调用多个文件,可以使用ex的:e命令在任何时候切换到另一个文件。如果想在vi中编辑另一个文件,那么首先需要保存当前文件(:w),然后给出命令:
:e filename
使用这个命令切换到新文件filename时,vi把之前的文件名记为#, 当前文件名记为%,使用这两个文件可以迅速切换
:e # 切换到上一个文件中
:r # 把上一个文件的内容粘贴到当前文件中
:e! # 放弃当前文件编辑,并返回上一个文件中
:e #的快捷键:
由于切换到前面的文件会经常发生,因此不必在ex命令行下进行这种操作。
可以使用快捷键Ctrl + ^来使用,和:e #效果相同。
VIM分屏
Vim分屏功能是通过分割窗口来实现的,这是提高工作效率的一大利器。无论我们想同时显示两个文件,或者同时显示一个文件的两个不同的位置,又或者并排比较两个文件,等等,这些都能通过分屏来实现,这样子很方便代码的比对和复制粘贴
水平方向分屏打开新文件
:sp filename
或者
:split filename
这个命令把窗口横向切分为两个窗口,并把光标置于上面的窗口中。
垂直方向分屏打开新文件
:vsp filename
:vsplit filename
:sview filename ->只读分屏打开文件
另外,要打开窗口编辑一个新的文件时,可以用以下命令:
:new
从命令行直接打开多个文件且是分屏
vim -On file1, file2 ... ->垂直分屏
vim -on file1, file2 ... ->水平分屏
注:-O垂直分屏,-o水平分屏,n表示分几个屏
实时调整当前窗口的宽度
ctrl-w > //向右加宽,默认值为1
ctrl-w N > //向右加宽宽度N
ctrl-w < // 同理
横屏/竖屏分屏打开当前文件
ctrl+w s
ctrl+w v
切换分屏
ctrl+w h,j,k,l
ctrl+w 上下左右键
crtl+w进行分屏窗口的切换 按完以后再按一个w
crtl+w进行分屏窗口的切换 按完以后再按一个r 互换窗口
crtl+w进行分屏窗口的切换 按完以后再按一个c 关闭窗口
关闭分屏
关闭窗口有以下几个个命令:
ctrl+W c 关闭当前窗口
ctrl+w q 关闭当前窗口,若只有一个分屏且退出vim
:only 仅保留当前分屏
:hide 关闭当前分屏
调整分屏的大小(宽度与高度)
ctrl+w = 所有分屏都统一高度
ctrl+w + 增加高度,默认值为1
ctrl+w - 减少高度
10 ctrl+w + 增加10行高度
ctrl-w N + //当前屏高度加N
使用指定当前屏的调整高度
: res[ize] N
移动分屏
ctrl+W H,J,K,L
将屏幕移动到最顶端
ctrl-w + K
将屏幕移动到最低端
ctrl-w + J
将屏幕移动到最左边
ctrl-w + H
将屏幕移动到最右边
ctrl-w + L
VIM多标签页(TAB)
Vim 7.0开始引入了多标签页(Tabs)概念,用于同时编辑多个文件,每一个标签页也可以包含多个缓冲区或窗口。通常作用于所有打开的缓冲区和窗口的命令将只影响当前标签页中的缓冲区和窗口。
新建标签页
:tabedit 在新标签页中打开指定的文件。
:tabnew 在新标签页中编辑新的文件。
:tab split 保留当前标签页,并在新标签页中打开当前缓冲区中的文件。
:sp filename,在当前标签页中创建了一个新窗口;
Ctrl-WT 快捷键,在当前标签页中关闭该文件,并在新建标签页中打开该文件。
:tab ball 为每一个打开的缓冲区,分别新建单独的标签页。
:tabfind 允许搜索并在新标签页中打开文件。此命令只能打开一个文件,如果搜索出多个匹配文件,将提示“E77: 文件名过多”
技巧:Vim默认最多只能打开10个标签页。可以用set tabpagemax=15改变这个限制。
列示标签页
:tabs可以显示已打开标签页的列表,并用“>”标识出当前页面,用“+”标识出已更改的页面。
关闭标签页
:tabclose 可以关闭当前标签页。
:tabonly 将仅保留当前标签页,而关闭其它所有的标签页。
如果使用Ctrl-Wc快捷键,关闭了当前标签页中的最后一个窗口,那么当前标签页也会随之关闭。
切换标签页
使用以下任一命令,可以移动到下一个标签页:
:tabn
gt
Ctrl-PgDn
使用以下任一命令,可以移动到上一个标签页:
:tabp
gT
Ctrl-PgUp
:tabfirst或:tabr命令,移动到第一个标签页。
:tablast命令,移动到最后一个标签页。
移动标签页
:tabm # 标签页次序是从0开始计数的。比如命令:tabm 1将把当前标签页移动到第2的位置。如果没有为:tabm命令指定参数,那么当前标签页将会被移动到最后。
配置标签页
set showtabline=1 (默认情况)只有用户新建了标签页才会在窗口上方显示标签栏
set showtabline=2 总是显示标签栏,
set showtabline=0 完全不显示标签栏。
多标签页命令
:tabdo 同时在多个标签页中执行命令。比如
打开了多个标签页,需要把这些文件中的“food”都替换成“drink”,那么就可以使用:tabdo %s/food/drink/g命令,一次完成对所有文件的替换操作,而不用针对每个文件重复操作。