vim编辑器
Posted 未知007
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vim编辑器相关的知识,希望对你有一定的参考价值。
vi编辑器3种模式:
一般模式
编辑模式
命令行模式
vim编辑器常用按键说明
一、一般模式可用的按钮说明,光标移动、复制粘贴、查找替换等
移动
h(光标向左移动一个字符)
j(光标向下移动一个字符)
k(光标向上移动一个字符)
l(光标向右移动一个字符)
如果想要进行多次移动的话,例如向下移动30行,可以使用“30j”的组合键,即加上想要进行的次数(数字)后,按下操作即可
Ctrl+f(屏幕向下移动一页,相当于Page Down键)
Ctrl+b(屏幕向上移动一页,相当于Page Up键)
Ctrl+d(屏幕向下移动半页)
Ctrl+u(屏幕向上移动半页)
+(光标移动到非空格行的下一行)
-(光标移动到非空格行的上一行)
n<space>(n表示数字,按下数字后再按空格键,光标会向右移动这一行的n个字符
0或^(移动到这一行的最前面)
$(移动到这一行的最后面)
G(移动到这个文件的最后一行)
nG(移动到这个文件的第n行,可配合set nu使用)
gg(移动到这个文件的第一行,相当于1G)
n[Enter](光标向下移动n行)
查找与替换
/word(向下寻找一个名称为word的字符串)
?(向上寻找一个名称为word的字符串)
n(重复前一个查找操作)
N(反向进行前一个查找操作)
:n1,n2s/word1/word2/g(在第n1行到n2行之间查找word1,并将其替换为word2)
:1,$s/word1/word2/gc(从第1行到最后一行查找word1,并将其替换为word2,其在替换之前提示用户是否替换)
删除、复制、粘贴
x,X(在一行字当中,x为向后删除一个字符(相当于del键),X为向前删除一个字符(相当于Backspace键))
nx(连续删除n个字符)
dd(删除光标所在的那一整行)
ndd(删除光标所在向下n行)
d1G(删除光标所在行到第一行数据)
dG(删除光标所在行到最后一行数据)
d$(删除光标所在行到该行最后一个字符)
d0或d^(删除光标所在行到该行最前面一个字符)
dw(删除一个单词)
d)(删除至句尾)
yy(复制光标所在行)
nyy(复制光标所在的向下n行)
y1G(复制光标所在行到第一行的所有数据)
yG(复制光标所在行到最后一行的所有数据)
y0或y^(复制光标所在的字符到该行行首的所有数据)
y$(复制光标所在的那个字符到该行行尾所有数据)
p,P(p将已复制的数据在该行下一行粘贴,P粘贴在光标上一行)
J(将光标所在行的数据结合成同一行)
u(复原上一个操作)
Ctrl+r(重复上一个操作)
.(重复上一个操作)
二、一般模式切换到编辑模式
i,I(进入插入模式,i从目前光标所在处插入,I在目前所在行的第一个非空格符处插入)
a,A(a从目前光标所在的下一个字符处开始插入,A为从光标所在行的最后一个字符处开始插入)
o,O(在目前光标所在下一行处插入新一行,O在目前光标所在上一行插入新的一行)
r,R(r只会替换光标所在字符一次,R会一直替换光标所在的文字,知道按下esc键)
ESC(退出编辑模式,回到一般模式)
三、一般模式切换到命令行模式
命令行保存、离开命令
:w(将编辑的数据写入硬盘文件)
:w!(若文件为“只读”时,强制写入该文件,能否强制写入与权限有关)
:q(离开vim)
:q!(若修改过,又不想存储,使用!强制离开不保存)
:wq(保存并退出,:wq!强制保存并退出)
ZZ(若文件改动,保存并退出)
:w[filename](将编辑的数据保存成另一个文件)
:r[filename](在编辑数据种,读入另一个文件,即将filename文件内容加到光标所在行后面)
:n1,n2 w[filename](将n1到n2的内容保存成filename文件)
:! command(暂时离开命令模式下执行command的显示结果,例如::! ls -l /
:set nu(显示行号)
:set nonu(取消行号)
vim的保存文件、恢复与打开时的警告信息
当使用vim编辑文件时系统出现某些原因断线,导致编辑的文件还没有保存,.*.swp文件可以进行恢复
例如:
[root@demo ~]# vim 3
Jul 30 02:30:59 localhost cloud-init: Cloud-init v. 0.7.5 running 'init' at Thu, 30 Jul 2015 02:30:59 +0000. Up 9.88 seconds.
aaaaaaaaad231231
23131
31
31
31
313
1
3
13
1
使用Ctrl+Z使vim后台执行
[1]+ Stopped vim 3
[root@demo ~]# kill -9 %1模拟断线
[1]+ Stopped vim 3
将会生成以下文件
[root@demo ~]# ll -a
-rw-r--r-- 1 root root 1669 Apr 16 15:35 3
-rw-r--r-- 1 root root 4096 Apr 16 15:44 .3.swp
再次编辑效果
E325: ATTENTION
Found a swap file by the name ".3.swp"
owned by: root dated: Mon Apr 16 15:44:39 2018
file name: ~root/3
modified: YES
user name: root host name: demo
process ID: 13841
While opening file "3"
dated: Mon Apr 16 15:35:36 2018
(1) Another program may be editing the same file. If this is the case,
be careful not to end up with two different instances of the same
file when making changes. Quit, or continue with caution.
(2) An edit session for this file crashed.
If this is the case, use ":recover" or "vim -r 3"
to recover the changes (see ":help recovery").
If you did this already, delete the swap file ".3.swp"
to avoid this message.
Swap file ".3.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
解决方案
[O]pen Read-Only,只读形式打开
(E)dit anyway, 正常方式打开文件
(R)ecover, 加载暂存文件的内容
(Q)uit,退出
(A)bort:忽略
D:删除缓存文件,,,同rm -rf .3.swp
块选择
v或者V或者Ctrl+v
v字符选择,会将光标经过的地方反白选择
V行选择
Ctrl+v块选择,可以用矩形的方式选择数据
y将反白的地方复制起来
d将反白的地方删除
r替换
多文件编辑
同时打+开多个文件时
:n(编辑上一个文件)
:N(编辑下一个文件)
:files(列出目前这个vim的打开的所有文件)
例如
[root@demo ~]# vim 3 5 同时打开多个文件
:files查看同时打开的文件
:n编辑下一个文件
yy复制
:编辑上一个文件
p粘贴
多窗口功能
在命令行模式输入“:sp{filename}”进行切割窗口
filename可有可无,如果想要在新窗口启动另一个文件,就加入文件名,否则仅输入:sp时,出现的则是同一个文件在两个窗口间
两个窗口切换
Ctrl+w+j(光标移动到下方窗口)
Ctrl+w+k(光标移动到上方窗口)
Ctrl+w+q(离开)
:sq [filename](打开新窗口)
使用vim重复编辑同一个文件时,当第二次进入该文件时,光标会在离开的的那一行,原因:vim会主动将曾经做过的行为记录下来,记录文件~/.viminfo
:set all(查看vim可设置的参数)
常用参数设置
:set nu(设置行号)
:set nonu(取消行号)
:set hlsearch(设置高亮查找,默认设置)
:set nohlsearch(取消)
:set autoindent(设置是否自动缩排,no取消)
:set backup(设置是否自动备份,一般不备份)
:set backspace=(012)(在编辑模式下可以利用退格键 为2时可以删除任意值)
:syntax on(语法颜色)
:syntax off
vim设置值一般放置位置[root@demo ~]# vim /etc/vimrc
编码
winxp的big5中文编码乱码问题
修改编码
[root@demo ~]# LANG=zh_CN.big5
编码转换
[root@demo ~]# iconv --list 列出支持的语系数据
[root@demo ~]# iconv -f big5 -t utf8 -o vi.utf8
-f原本编码格式
-t新编码格式
-o 新文件名
file查看文件编码
vim其他操作
启动vim
vim + file: 从文件的末尾开始;
vim +num file: 从第num行开始;
vim +/string file: 打开file,并将光标停留在第一个找到的string上
文档操作
:e file --关闭当前编辑的文件,并开启新的文件。 如果对当前文件的修改未保存,vi会警告。
:e! file --放弃对当前文件的修改,编辑新的文件。
:e+file -- 开始新的文件,并从文件尾开始编辑。
:e+n file -- 开始新的文件,并从第n行开始编辑。
:e -- 重新加载当前文档。
:e! -- 重新加载当前文档,并丢弃已做的改动。
:e#或ctrl+^ -- 回到刚才编辑的文件,很实用。
:f或ctrl+g -- 显示文档名,是否修改,和光标位置。
:f filename -- 改变编辑的文件名,这时再保存相当于另存为。
x -- 保存并退出。
:help ---vim帮助信息
:Sex -- 水平分割一个窗口,浏览文件系统
:Vex -- 垂直分割一个窗口,浏览文件系统
:reg显示寄存器的内容
/pattern/+number: 将光标停在包含pattern的行后面第number行上。
/pattern/-number: 将光标停在包含pattern的行前面第number行上。
vi -o filenames 在水平分割的多个窗口中编辑多个文件
vi -O filenames 在垂直分割的多个窗口中编辑多个文件
:buffers或:ls或:files 显示缓冲区列表。
ctrl+^:在最近两个缓冲区间切换。
:bn -- 下一个缓冲区。
:bp -- 上一个缓冲区。
:bl -- 最后一个缓冲区。
:b[n]或:[n]b -- 切换到第n个缓冲区。
:nbw(ipeout) -- 彻底删除第n个缓冲区。
:nbd(elete) -- 删除第n个缓冲区,并未真正删除,还在unlisted列表中。
:ba[ll] -- 把所有的缓冲区在当前页中打开,每个缓冲区占一个窗口。
水平分割
:split(:sp) -- 把当前窗水平分割成两个窗口。(CTRL-W s 或 CTRL-W CTRL-S) 注意如果在终端下,CTRL-S可能会冻结终端,请按CTRL-Q继续。
:split filename -- 水平分割窗口,并在新窗口中显示另一个文件。
:nsplit(:nsp) -- 水平分割出一个n行高的窗口。
:[N]new -- 水平分割出一个N行高的窗口,并编辑一个新文件。 (CTRL-W n或 CTRL-W CTRL-N)
ctrl+w f --水平分割出一个窗口,并在新窗口打开名称为光标所在词的文件 。
C-w C-^ -- 水平分割一个窗口,打开刚才编辑的文件。
垂直分割
:vsplit(:vsp) -- 把当前窗口分割成水平分布的两个窗口。 (CTRL-W v或CTRL CTRL-V)
:[N]vne[w] -- 垂直分割出一个新窗口。
:vertical 水平分割的命令: 相应的垂直分割。
关闭子窗口
:qall -- 关闭所有窗口,退出vim。
:wall -- 保存所有修改过的窗口。
:only -- 只保留当前窗口,关闭其它窗口。(CTRL-W o)
:close -- 关闭当前窗口,CTRL-W c能实现同样的功能。 (象 :q :x同样工作 )
调整窗口大小
ctrl+w + --当前窗口增高一行。也可以用n增高n行。
ctrl+w - --当前窗口减小一行。也可以用n减小n行。
ctrl+w _ --当前窗口扩展到尽可能的大。也可以用n设定行数。
:resize n -- 当前窗口n行高。
ctrl+w = -- 所有窗口同样高度。
n ctrl+w _ -- 当前窗口的高度设定为n行。
ctrl+w < --当前窗口减少一列。也可以用n减少n列。
ctrl+w > --当前窗口增宽一列。也可以用n增宽n列。
ctrl+w | --当前窗口尽可能的宽。也可以用n设定列数。
切换和移动窗口
如果支持鼠标,切换和调整子窗口的大小就简单了:
ctrl+w ctrl+w: 切换到下一个窗口。或者是ctrl+w w。
ctrl+w p: 切换到前一个窗口。
ctrl+w h(l,j,k):切换到左(右,下,上)的窗口。
ctrl+w t(b):切换到最上(下)面的窗口。<BR>
ctrl+w H(L,K,J): 将当前窗口移动到最左(右、上、下)面。
ctrl+w r:旋转窗口的位置。
ctrl+w T: 将当前的窗口移动到新的标签页上。
文件加解密
vim -x file: 开始编辑一个加密的文件。
:X -- 为当前文件设置密码。
:set key= -- 去除文件的密码。
宏
. --重复上一个编辑动作
qa:开始录制宏a(键盘操作记录)
q:停止录制
@a:播放宏a
文件的编码
:e ++enc=utf8 filename, 让vim用utf-8的编码打开这个文件。
:w ++enc=gbk,不管当前文件什么编码,把它转存成gbk编码。
:set fenc或:set fileencoding,查看当前文件的编码。
在vimrc中添加set fileencoding=ucs-bom,utf-8,cp936,vim会根据要打开的文件选择合适的编码。 注意:编码之间不要留空格。 cp936对应于gbk编码。 ucs-bom对应于windows下的文件格式。
下面的括号匹配对编程很实用的。
ci', di', yi':修改、剪切或复制'之间的内容。
ca', da', ya':修改、剪切或复制'之间的内容,包含'。
ci", di", yi":修改、剪切或复制"之间的内容。
ca", da", ya":修改、剪切或复制"之间的内容,包含"。
ci(, di(, yi(:修改、剪切或复制()之间的内容。
ca(, da(, ya(:修改、剪切或复制()之间的内容,包含()。
ci[, di[, yi[:修改、剪切或复制[]之间的内容。
ca[, da[, ya[:修改、剪切或复制[]之间的内容,包含[]。
ci{, di{, yi{:修改、剪切或复制{}之间的内容。
ca{, da{, ya{:修改、剪切或复制{}之间的内容,包含{}。
ci<, di<, yi<:修改、剪切或复制<>之间的内容。
ca<, da<, ya<:修改、剪切或复制<>之间的内容,包含<>。
:tag xyz<tab> -- 补齐以xyz开头的tag名,继续按tab键,会显示其他的。
:tag /xyz<tab> -- 会用名字中含有xyz的tag名补全。
把 Vim 变为十六进制编辑器
这不是我最喜欢的窍门,但有时会很有趣。你可以把 Vim 和 xxd 功能连起来来把文件转换为十六进制模式。命令如下:
:%!xxd
类似的,你可以通过下面的命令恢复原来的状态:
:%!xxd -r
基本计算器
在插入模式下,你可以使用 Ctrl+r 键然后输入 =,再输入一个简单的算式。按 Enter 键,计算结果就会插入到文件中。例如,尝试输入:
Ctrl+r '=2+2' ENTER
然后计算结果“4 ”会被插入到文件中。
查找重复的连续的单词
当你很快地打字时,很有可能会连续输入同一个单词两次,就像 this this。这种错误可能骗过任何一个人,即使是你自己重新阅读一遍也不可避免。幸运的是,有一个简单的正则表达式可以用来预防这个错误。使用搜索命令(默认是 /)然后输入:
这会显示所有重复的单词。要达到最好的效果,不要忘记把下面的命令:
set hlsearch
放到你的 .vimrc 文件中高亮所有的匹配。
缩写
一个很可能是最令人印象深刻的窍门是你可以在 Vim 中定义缩写,它可以实时地把你输入的东西替换为另外的东西。语法格式如下:
:ab [缩写] [要替换的文字]
一个通用的例子是:
:ab asap as soon as possible
会把你输入的 “asap” 替换为 “as soon as possible”。
在你忘记用 root 方式打开文件时的文件保存
这可能是一个在论坛中一直受欢迎的命令。每当你打开一个你没有写入权限的文件(比如系统配置文件)并做了一些修改,Vim 无法通过普通的 “:w” 命令来保存。
你不需要重新以 root 方式打开文件再进行修改,只需要运行:
:w !sudo tee %
这会直接以 root 方式保存。
实时加密文本
如果你不想让别人看懂你的屏幕上的内容,你可以使用一个内置的选项,通过下面的命令使用 ROT13 来对文本进行编码:
ggVGg?
gg 把光标移动到 Vim 缓冲区的第一行,V 进入可视模式,G 把光标移动到缓冲区的最后一行。因此,ggVG 使可视模式覆盖这个当前缓冲区。最后 g? 使用 ROT13 对整个区域进行编码。
注意它可以被映射到一个最常使用的键。它对字母符号也可以很好地工作。要对它进行撤销,最好的方法就是使用撤销命令:u。
自动补全
这是另外一个令我感到惭愧的功能,但我发现周围很多人并不知道。Vim 默认有自动补全的功能。的确这个功能是很基本的,并且可以通过插件来增强,但它也很有帮助。方法很简单。Vim 尝试通过已经输入的单词来预测单词的结尾。比如当你在同一个文件中第二次输入 “compiler” 时,仅仅输入 “com” 然后保持在插入模式,按 Ctrl+n 键就可以看到 Vim 为你补全了单词。很简单,但也很有用。
比较两个文件的不同
你们中的大多数很可能都知道 vimdiff 命令,它可以使用分离模式打开 Vim 并比较两个文件的不同。语法如下:
$ vimdiff [文件1] [文件2]
但同样的结果也可以通过下面的 Vim 命令来获得:
:diffthis
首先在 Vim 中打开原始文件。然后使用分离模式带来第二个文件:
:vsp [文件2]
最后在第一个缓冲区里输入:
:diffthis
通过 Ctrl+w 来切换缓冲区并再次输入:
:diffthis
这样两个文件中不同的部分就会被高亮。
(译者注:可以直接在一个缓冲区里使用命令 :windo diffthis,而不用输入 :diffthis 两次)
要停止比较,使用:
:diffoff
按时间回退文件
Vim 会记录文件的更改,你很容易可以回退到之前某个时间。该命令是相当直观的。比如:
:earlier 1m
会把文件回退到 1 分钟以前的状态。
注意,你可以使用下面的命令进行相反的转换:
:later
删除标记内部的文字
当我开始使用 Vim 时,一件我总是想很方便做的事情是如何轻松的删除方括号或圆括号里的内容。转到开始的标记,然后使用下面的语法:
di[标记]
比如,把光标放在开始的圆括号上,使用下面的命令来删除圆括号内的文字:
di(
如果是方括号或者是引号,则使用:
di{
和:
di"
删除指定标记前的内容
和删除标记内部有些相似,但目的不同。命令如下:
dt[标记]
会删除所有光标和标记之间的内容(保持标记不动),如果在同一行有这个标记的话。例如
dt.
会删除至句子的末尾,但保持 ‘.’ 不动。
把 Vim 变为十六进制编辑器
这不是我最喜欢的窍门,但有时会很有趣。你可以把 Vim 和 xxd 功能连起来来把文件转换为十六进制模式。命令如下:
:%!xxd
类似的,你可以通过下面的命令恢复原来的状态:
:%!xxd -r
把光标下的文字置于屏幕中央
我们所要做的事情如标题所示。如果你想强制滚动屏幕来把光标下的文字置于屏幕的中央,在可视模式中使用命令(译者注:在普通模式中也可以):
zz
跳到上一个/下一个位置
当你编辑一个很大的文件时,经常要做的事是在某处进行修改,然后跳到另外一处。如果你想跳回之前修改的地方,使用命令:
Ctrl+o
来回到之前修改的地方
类似的:
Ctrl+i
会回退上面的跳动。
把当前文件转化为网页
这会生成一个 html 文件来显示文本,并在分开的窗口显示源代码:
:%TOhtml
------END
以上是关于vim编辑器的主要内容,如果未能解决你的问题,请参考以下文章