/*
Vi的常用用法~~\\
灯下野狐04.08at JUST
转载注出处就OK
Hope to
*/
===================================vi========================================
开始时就进入命令模式(按下插入键i等)==>插入模式(按下esc)==>命令模式(按下:)==>第行模式
vi+n filename打开文件时定位到第n行(这个在程序出错时打开就定位很有用)
vi+filename打开文件时就定位到文件的结尾
vi+/pattern filename打开文件时就定位到第一个模式匹配处
vi-n filename打开文件时不使用交换文件
vi-R filename仍可编辑缓冲区中的文件,但是不能保存
vi-o3file1file2file3分3个窗口打开3个文件
vi-r filename将上次崩溃的文件恢复再打开
==========================vi的多文件编辑===================================== (这个也很管用,特别是在模块化程序设计中,头文件,函数实现文件,主文件之间的跳转)
vi file1file2file3同时打开3个文件
:args显示所有文件列表,其中[file]中的就是当前文件
:n(或:next)切换到文件列表中当前文件的下一个文件
:2n切换到向下的第二个文件
:N(或:prev)向前切换,同样支持数字操作
:rew(或:rewind)切换到文件列表的第一个文件
:last跳到文件列表的最后一个
(注:以上情况,在切换之前必须先保存当前文件)
:n!(或:next!)强制切换到文件列表中当前文件中的下一个文件,可不保存
:N!(或:prev!)强制向前切换文件
:e#切换到上次编辑的文件
:e#n切换到文件列表中的第n个文件
ctrl+^当前文件和上次编辑的文件之间的切换
[多文件中的复制问题]
"ayy第一个为引号,后面a为缓冲器,即把当前行复制到缓冲器a
"anyy把从当前行开始的总共n行复制到缓冲器a中
(注:缓冲器不仅仅只有a,还有b ,总共a~z1~9之多)
"ap把缓冲器a中的内容复制到当前行的下面
"aP把缓冲器a中的内容复制到当前行的上面
:1,10ya a将开头的10行复制到缓冲器a中
:pu a将缓冲器a中的内容复制到当前文件中
=========================命令模式->插入模式==================================== i在当前光标前插入
I在行首插入
a在光标之后插入
A在行末插入
o(小写字母)在当前行之下新建一行插入
O(大写字母)在当前行之上新建一行插入
============================移动光标===========================================命令模式下
h(或向左方向键)向左移动
nh(n为数字)向左移动n个字符
j(或向下方向键或+)向下移动
nj(n为数字)向下移动n个字符
k(或向上方向键或-)向上移动
nk(n为数字)向上移动n个字符
l(或向右方向键)向右移动
nl(n为数字)向右移动n个字符
(建议不要用方向键来移动,方向键在那个角落,你不觉得别扭么,hjkl移动要方便得多)
ctrl+f前翻一页
ctrl+b后翻一页
ctrl+d前翻半页
ctrl+u后翻半页
0(数字0)移动到行首
^移动到行首(行首空格之后)
$移动到行尾
fx往右移动到字符x上(假如有的话)
Fx往左移动到字符x上(假如有的话)
tx往右移动到字符x之前(同上)
Tx往左移动到字符x之后
;(分号)配合f(F)和t(T)使用,重复一次
,(逗号)配合f(F)和t(T)使用,重复一次
w下一个单词开头
nw下n个单词开头
W下一个单词开头(将特殊字符也当作单词的一部分)
nW下n个单词开头(将特殊字符也当作单词的一部分)
b上一个单词词首
B上一个单词词首(将特殊字符也当作单词的一部分)
(同样支持+数字n的操作)
e到单词词尾
E到单词词尾(将特殊字符也当作单词的一部分)
(同样支持+数字n的操作)
H移动到当前屏幕的最上面的最上面一行
nH移动到当前屏幕的最上面的第n行
M移动到当前屏幕的中间行正则匹配前半部分到某个字符结束
L移动到当前屏幕的最下面一行
nL移动到当前屏幕的倒数第n行
gg跳到文件开头
1G跳到文件开头(和gg相同的效果)
ngg跳到文件的第n行
nG(n为数字)跳到文件的第n行(效果同上)
G跳到文件结尾
gg ctrl+v shirt+g实现全选功能
<1~100>%以百分比跳到相应的行数
zz将当前光标所在的行调整至当前屏幕的中间(光标还在那一个上,跟着移动)
ctrl+y上卷一行(光标还在原来的行,除非滚至屏幕下界,则光标始终在最下面一行) ctrl+e下卷一行(光标还在原来的行,除非滚至屏幕上界,则光标始终在最上面一行)
``(ESC下面的那个键两次)光标回到上次停靠的位置
''(两个单引号)光标回到上一标记或上下文的所在行的开始
%跳到与当前括号匹配的另一个括号上去(写程序时有用)
[[跳转到代码块的开头去(要求"{"必须独占一行)
]]跳转到代码块的结尾去(要求同上)
gD跳到局部变量的定义处(写程序时要添加一个局部变量时很方便)
(跳到句首
)跳到句尾
{跳到当前段落的开始
}跳到当前段落的结尾
插入模式下
很遗憾,目前我所知的只有使用四个方向键,其实可用模式绑定来实现更好的移动方法
================================复制,剪切,粘帖=================================== yy复制当前行(yank)
nyy复制从当前行开始的向下n行
yw复制当前单词(若在单词中间,则复制从当前字符到最后)
nyw复制从当前单词开始的n个单词
y0复制当前光标所在字符到行首字符(包括空格)
y^复制当前光标所在字符到行首字符(不包括空格)
y$复制当前光标所在字符到行尾字符(不包括换行符)
:n1,n2co n3将n1到n2之间的内容拷贝到n3行之下
:n1,n2mv n3将n1到n2之间的内容剪切到n3行之下
-----------------------------------------------------------------------------------
x剪切当前光标所在的字符(起到删除效果)
nx向后剪切连同光标在内的n个字符
X剪切当前光标所在的前一个字符
nX向前剪切n个字符(不包括当前光标)
dl删除当前字符(和x等效)
dL删除直到屏幕上最后一行的内容
dd剪切整行
ndd向下剪切连同当前行所在的n行
dgg剪切当前行到开头的所有行
dG剪切当前行到最后的将所有行
dw剪切从当前字符开始的单词(若在一个单词中间则截断)
ndw剪切从当前字符开始的n个单词
de似乎和dw同效果
nde似乎和ndw同效果
db剪切上一个单词(不包括当前光标所在的字符)
ndb剪切上n个单词(同样不包括当前光标所在的单词)
:n1,n2d将n1到n2删除
d0剪切当前光标所在字符到行首字符(包括空格)
d^剪切当前光标所在字符到行首字符(不包括空格)
d$剪切当前光标所在字符到行尾字符(不包括换行符)
d(剪切到某个语句的开头位置(假如光标在句尾标点上,标点不删除)
d)剪切到某个语句的结尾位置(在句中可以删掉最后的标点)
d{剪切到某个段落的开头位置
d}剪切到某个段落的结尾位置
(上述四种情况都支持数字n操作)
eg:dn)dn(dn}dn{
cl剪切当前字符,并进入插入模式
cL剪切直到屏幕上最后一行的内容并进入插入模式
cc剪切当前行并进入插入模式
ncc剪切当前行开始的n行,并进入插入模式
cgg cG cw ncw 这里不赘述,情况和上面的d大项类似,只是他剪切后进入插入模式
s将当前字符先删除再进入插入模式
S将当前行删除然后进入插入模式
-----------------------------------------------------------------------------------
P(大写)粘帖到当前行的上一行
p(小写)粘帖到当前行的下一行
xp实现当前字符和下一个字符的交换
ddp将当前行与之下一行对调
=======================可视模式下的剪切,复制,粘帖===============================
v(小写,进入可视模式,以字符为单位)+光标移动(方向键或hjkl)选中文字,然后按y则复制,
按下d则剪切,按下这写键后自动进入到命令模式,然后就是是否粘帖的事了
V(大写,进入可视模式,以行为单位)+光标移动,然后y或d,进入命令模式,然后粘帖等等.
ctrl+V(以块模式进入到可视模式)+光标移动,然后同上
==============================搜索=============================================
/str由上往下搜寻字符串str
?str反向由下往上搜寻字符串str
*向上搜索光标所指向的单词
#向下搜索光标所指向的单词
n(小写字母,不是数字)跳到下一个匹配的模式,到文件结尾时自动从文件开始再往下跳转
N跳到上一个匹配的模式,同上也是循环模式
:nohls取消搜索之后的高亮模式(黑斑)
/\<the搜寻所有以"the"开头的单词(eg:the )
/the\>搜寻所有以"the"结尾的单词(eg:)
/
\<the\>搜寻单词"the"等同于/the
/\<....\>搜寻搜有四个字符的单词vi支持通配符
/jwf\|frank搜寻jwf或frank
/\<\d\d\d\d\>精确搜寻四个数字字符的单词
/^\n\{3}查3个空行
(搜索时是支持通配符的,比如*.)
==============================替换=============================================
rc将当前光标所在处的字符替换为c
nrc用c来替换从当前光标开始的n个字符
R从当前字符开始替换(按esc结束)
:s/old/new/在文件中将第一次出现的old替换为new
:
s/old/new/g将当前行中所有满足的情况之下的old都替换为new
:s/old/new/g3当前文件中把old替换为new,但他只是替换3行
:%s/old/new/g在全文件中将old替换为new
:2,10s/old/new/g将2~10行中的old替换为new
(注:注意上面4种情况)
:%s/old/new/gc将第一行到最后的old替换为new(加c每次替换都需要确认)
:$s/old/new/ge在整个文件中替换(e表示即使没到,也不给出报错信息)
:1,$s/old/new/g将第一行到最后的old替换为new(和:%s/old/new/g等效)
:%s/^/hello/g在每一行前加上hello
:%s/$/end/g在每一行最后加上end
:s/tom/Tom/将当前行中第一个tom替换为Tom
ctrl+a将当前光标所在的数字加1
ctrl+x将当前光标所在的数字减1(可以变为负的)
:s或:&或:s//~/相同重复上次替换
*************************************************************************
tips:在搜索和替换时,可以使用正则表达式来进行匹配
^行首$行尾
.匹配除换行符之外的任何一个字符(包括空格)
[]匹配括号内包含的任何一个字符
\<;在单词的开始\>在单词的结尾
~匹配上次搜索中使用的任何表达式
*************************************************************************
================================删除============================================== :g/hello/d将包含hello的行删除
:v/hello/d将不包含hello的行删除(并返回搜索hello单词状态)
================================其他============================================== Vu将当前行的字符全部变为小写
VU将当前行的字符全部变为大写
g~~反置(即小写变大写,大写变小写)
v+移动光标+u可以和Vu类似看,即把你光标选中的单词都变为小写
v+移动光标+U可以和VU类似看,即把你光标选中的单词都变为大写
ggguG把整个文件中的字符都变为小写
gggUG把整个文件中的字符都变为大写
=============================读写文件============================================= :1,10w outfil
e把从开头到第10行的内容写入outfile文件中
:1,10w>>outfile将从开头到第10行的内容追加到outfile文件中
:r insert_filnam将文件插入到当前文件当前光标所在的下一行
:9r insert_filnam将文件插入到第9行的下一行(第10行)
gf打开以当前光标所在单词为文件名的文件(匹配当前光标所在的全词)(记得跳转时要先保存当前正在编辑的文件) ==========================改变当前工作目录=======================================
:cd/root进入到/root目录
:pwd显示当前工作目录
==========================行转换,窗口变换=======================================
J将下一行接到当前行之后
:e filename在当前窗口中编辑filename文件,退出filename文件之后还返回到原来的文件
:f filename改变编辑中的文件名
:r filename将光标所在处插入一个文件的内容
:35r filename将文件插入至35行之下
gf打开光标所在处以word为名的文件,若当前目录无此文件报错
:new新建一栏空白窗口(上下)
:split将当前文件分两个窗口分别显示(上下)
:vnew新建一栏空白窗口(左右)
:vsplit将当前文件分两个窗口分别显示(左右)
:split filename同时打开另一个文件
:vsplit file列形式打开另一个文件(这种形式可能更好一点,尤其是在写程序分割文件时)
:sview file以只读形式上下模式打开另一个文件
ctrl+w在按j,k,l,h可以切换到其他窗口
(注:一般输入的命令只对当前的窗口有效,若相对其他的窗口也有效,在命令后加all
例如:qall退出所有文件)
ctrl+w f打开光标所在处的文件,通常用来打开头文件(path路径中寻)
ctrl+w_使当前活动的文件最大化
:set scrollbind设定滚动绑定
:set noscrollbind解除滚动绑定
ctrl w-缩小窗口并且缩小字体
ctrl w+放大窗口并放大字体
:hide关闭当前窗口
:only只保留当前窗口,关闭其他所有的文件
=====做标记=====
m a在当前位置做上标记
`a跳到标记a处
'a跳到标记所在的行首
=====行操作=====
:set cindent进行自动缩进(这在写程序的缩进时很有用)
:syntax on进行此设置后,所有关键字高亮(写程序时很有用)
:syntax off关闭语法高亮(假如你受不了那些花花绿绿的字符的话,它也很有用)
n>>(n为数字)将当前光标及下面的(n-1)行后退一个tab长度
n<<;将当前光标及下面的(n-1)行前进一个tab长度
===================================其他==========================================
u撤销操作
ctrl+r恢复操作
:set nu(number)设置行号
:set nonu(nonumber)取消设置的行号
:wq保存退出
:x效用同上,保存退出
ZZ效用同上,保存退出(它较方便,不用回到底行模式)
:wa保存当前打开的所有文件
:wqa保存当前打开的所有文件并推出
:qa全部退出,不保存
ctrl+g(或:f)显示当前的行号,同时给出位置百分数
ctrl+p向上搜索类似单词并自动补全当前输入的单词
ctrl+n向下搜索类似单词并自动补全当前输入的单词
ctrl+x ctrl+l自动补全一行
ctrl+x ctrl+f在文件系统中搜索,补全一个文件名
(注:若在当前文件中没有到,那么vi会自动到#include文件按中查)
e!不管你是否已经保存,都回到打开文件的初始状态
使用帮助
:help显示帮助
ctrl+]在:help帮助中遇到超链接可以跳转
ctrl+t在:help帮助中可以返回跳到那个
:!+命令可以在vi之中调用shell命令
80i=esc一次可以输入80个字符'='
iabbrev ubt ubuntu插入模式下输入ubt后,编辑器都会自动将其变为后者ubuntu
(注意:可以临时启用,也可以放入配置文件一直有效)
K(大写)查看光标所标识的man帮助页
ctrl+v I//esc按ctrl+v再选择要注释掉的行,再按I,插入//,然后esc,结果选中的行就被注释掉了ctrl+v d删除掉开头的//注释
插入模式下ctrl+o可以在插入模式下面执行一次命令,然后自动回到插入模式,不用esc
插入模式下ctrl+v输入特殊的ASCII字符或键
.重复上一次的命令操作
ctrl+o光标跳到更老的位置
ctrl+i光标跳到更新的位置
插入模式下ctrl+a重复上次在插入模式下的动作
插入模式下ctrl+x ctrl+n在文件中自动补全以前出现过的单词(最新的列在最上边)
插入模式下ctrl+x ctrl+p在文件中自动补全以前出现过的单词(最新的列在最下边)
插入模式下ctrl+x ctrl+f补全文件名
插入模式下ctrl+x ctrl+k单词补全
插入模式下ctrl+x ctrl+t同义词补全
V选中多行后!sort实现排序功能
g ctrl+g统计全文字数(也可以先进入可视模式选中再计算特定区域的字数)
:grep abc*匹配到所有包含abc的文件:cn下一个:cp上一个:cl文件列表
ctrl+c效用等效于esc
:history命令记录
q:打开命令行历史窗口(然后可以选中历史命令,回车即可实现操作)
q/打开查历史窗口(同上)
插入模式下ctrl+w删除前一个单词
插入模式下ctrl+u删除此行光标前所有单词
:set showmatch输入括号等等时,会自动跳到匹配的括号处停留很短时间在跳回
guu将当前行都变为小写
gUU将当前行都变为大写
:set tabstop=4将tab长度定位4个字符长
:set list显示制表符^I以及文件行尾符$
:set nowrapscan在搜索时遇到文件的两头时就停止搜索
插入模式下ctrl+g相当于回车,可以跳到下一行的开头输入
~将当前字符转换大小写,或将高亮区域大小写反置

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。