VI的几点记忆技巧
- 在vi模式下,"
"
代表的是结尾,而
"
0
"
代表的是开头。例如:
‘
0
‘
:光标移至当前行首
‘
"代表的是结尾,而"0"代表的是开头。例如: `0`:光标移至当前行首 `
"代表的是结尾,而"0"代表的是开头。例如:‘0‘:光标移至当前行首‘
:光标移至当前行尾
d0:删除至开头;
d$`:删除至结尾 - 在vi模式下,小括号是句,大括号是段。例如:
(
:光标移至句子开头
)
:光标移至句子结尾
{
:光标移至段落开头
}
:光标移至段落结尾 - 在vi模式下,b、e、w均代表的是单词。例如:
w
:光标移动到下一个单词的开头(word)
e
:光标移动到下一个单词的结尾(end)
b
:光标移动到上一个单词(back)
dw
:删除下一个单词
de
:删除下一个单词
db
:删除上一个单词 - 在vi模式下,按下d之后代表启动了删除操作,此时配合移动光标命令可以实现各种删除操作。例如:
d(
:从光标删除到句首
d)
:从光标删除到句尾
d{
:从光标删除到段首
d}
:从光标删除到段尾
dw
:删除下一个单词
db
:删除上一个单词
dl
:删除光标右边一个字符(相当于windows下按了delete键)
dh
:删除光标左边一个字符
dk
:删除本行以及上边一行(共删除两行)
dj
:删除本行以及下边一行(共删除一行)
dd
:删除当前行
Vim语
动词:动词代表了我们打算对文本进行什么样的操作。
d 表示删除 delete
r 表示替换 replace
c 表示修改 change
y 表示复制 yank
v 表示选取 visual select
名词:名词代表了我们即将处理的文本。Vim 中有一个专门的术语叫做文本对象,下面是一些文本对象的示例:
w 表示一个单词 word
s 表示一个句子 sentence
p 表示一个段落 paragraph
t 表示一个 HTML标签 tag
引号或者各种括号所包含的文本称作一个文本块。
介词:介词界定了待编辑文本的范围或者位置。例如:
i 表示“在…之内” inside
a 表示“环绕…” around
t 表示“到…位置前” to
f 表示“到…位置上” forward
下面是几个有关范围的示意图,你们感受一下:
数词:数词指定了待编辑文本对象的数量,从这个角度而言,数词也可以看作是一种介词。
组词为句:有了这些基本的语言元素,就可以着手构造一些简单的命令了。
动词 介词 名词
dip
-delete inside paragraph:删除一个段落
vis
-visual select inside sentence:选取一个句子
ciw
-change inside word:修改一个单词
caw
-change around word:修改一个单词
dtx
-delete to x:删除文本直到字符“x”(不包括字符“x”)
dfx
-delete forward x:删除文本直到字符“x”(包括字符“x”)动词 介词/数词 名词
c3w
- change three words: 修改三个单词
d2w
- delete two words : 删除两个单词数词 动词 名词
— 数词修饰动词,表示将操作执行 n 次
2dw
- twice delete word : 两次删除单词(等价于删除两个单词)
3x
-three times delete character: 三次删除字符(等价于删除三个字符)
vi命令
- 进入vi的命令
vi filename :打开或新建文件,并将光标置于第一行首
vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename…filename :打开多个文件,依次进行编辑 - 移动光标类命令
h :光标左移一个字符
l :光标右移一个字符
space:光标右移一个字符
Backspace:光标左移一个字符
k或Ctrl+p:光标上移一行
j或Ctrl+n :光标下移一行
Enter :光标下移一行
w或W :光标右移一个字至字首
b或B :光标左移一个字至字首
e或E :光标右移一个字至字尾
) :光标移至句尾
( :光标移至句首
}:光标移至段落开头
{:光标移至段落结尾
nG:光标移至第n行首
n+:光标下移n行
n-:光标上移n行
n$:光标移至第n行尾
H :光标移至屏幕顶行
M :光标移至屏幕中间行
L :光标移至屏幕最后行
0:(注意是数字零)光标移至当前行首
$:光标移至当前行尾 - 屏幕翻滚类命令
Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
Ctrl+f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。 - 插入文本类命令
i :在光标前
I :在当前行首
a:光标后
A:在当前行尾
o:在当前行之下新开一行
O:在当前行之上新开一行
r:替换当前字符
R:替换当前字符及其后的字符,直至按ESC键
s:从当前光标位置处开始,以输入的文本替代指定数目的字符
S:删除指定数目的行,并以所输入文本代替之
ncw或nCW:修改指定数目的字
nCC:修改指定数目的行 - 删除命令
ndw或ndW:删除光标处开始及其后的n-1个字
d0:删至行首
d$:删至行尾
ndd:删除当前行及其后n-1行
x或X:删除一个字符,x删除光标后的,而X删除光标前的
Ctrl+u:删除输入方式下所输入的文本 - 搜索及替换命令
/pattern:从光标开始处向文件尾搜索pattern
?pattern:从光标开始处向文件首搜索pattern
n:在同一方向重复上一次搜索命令
N:在反方向上重复上一次搜索命令
:s/p1/p2/g:将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:将文件中所有p1均用p2替换 - 选项设置
all:列出所有选项设置情况
term:设置终端类型
ignorance:在搜索中忽略大小写
list:显示制表位(Ctrl+I)和行尾标志($)
number:显示行号
report:显示由面向行的命令修改过的数目
terse:显示简短的警告信息
warn:在转到别的文件时若没保存当前文件则显示NO write信息
nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符
nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
mesg:允许vi显示其他用户用write写到自己终端上的信息 - 最后行方式命令
:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d :将n1行到n2行之间的内容删除
:w :保存当前文件
:e filename:打开文件filename进行编辑
:x:保存当前文件并退出
:q:退出vi
:q!:不保存文件并退出vi
:!command:执行shell命令command
:n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,
若不指定n1,n2,则表示将整个文件内容作为command的输入
:r!command:将命令command的输出结果放到当前行 - 寄存器操作
"?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
"?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字
ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。
vi命令
-
插入动作
a
:在光标后插入文本
A
:在当前行插入文本
i
:在光标前插入文本
I
:在当前行前插入文本
o
:在当前行的下边插入新行
O
:在当前行的上边插入新行
s
:删除光标所在处字符,并进入插入模式
S
:删除光标所在的行,并进入插入模式 -
光标移动命令
H
:移动到视窗的第一列
M
:移动到视窗的中间列
L
:移动到视窗的最后列
gg
:跳到文件头
G
:移动到文件最后列
nG
:直接用数字n加上大写G移动到第n行(等同于命令“:n”)
w
:向前移动一个word
nw
:向前移动n个word -
删除操作命令
x
:删除光标所在的字符【delete】
dw
:删除光标所在的单词
d$
:删除光标至行尾的所有字符
dd
:删除当前行
ndd
:删除当前n行
dG
:删除当前行到最后一行 -
拷贝与粘贴命令
yw
:将光标所在单词拷入剪贴板
y$
:将光标至行尾的字符拷入剪贴板
yy
:将当前行拷入剪贴板
nyy
:将当前n行拷入剪贴板
p
:将剪贴板中的内容粘贴在光标后
P
:将剪贴板中的内容粘贴在光标前 -
查找与替换
/string
:往前搜索string
n
:查找下一个
?string
:往后搜索string
:%s/string/string/g
:替换 -
文件编辑、保存及退出vi命令
:q
:不保存退出
:q!
:不保存强制性退出
:w
:保存编辑
:wfilename
:存入文件filename中
:w!filename
:强制性存入文件filename中
:wq/:x/ZZ
:保存退出
:wq!
:强制保存然后退出 -
快速对引号或括号等标点内的内容进行选中、删除、复制操作的超级技巧
ci'、ci"、ci(、ci[、ci{、ci<
:分别更改这些配对标点符号中的文本内容
di'、di"、di(或dib、di[、di{或diB、di<
:分别删除这些配对标点符号中的文本内容
yi'、yi"、yi(、yi[、yi{、yi<
:分别复制这些配对标点符号中的文本内容
vi'、vi"、vi(、vi[、vi{、vi<
:分别选中这些配对标点符号中的文本内容 -
vi小技巧
在命令模式下按“.”键可以重复上一个操作。 -
快速跳转到第100行:100G(按完100后,按大写的G)
-
写程序时,修改代码前需要将原先的注释掉以备份:
4yy:将光标所在位置开始共4行拷贝到linux的剪贴板
p:复制到光标所在行的下边
P:粘贴到光标所在行的上边 -
在以普通用户打开的vim当中保存一个root用户文件
:w !sudo tee %
这题目读起来纠结,其实是很常见的,常常忘记了sudo就直接用vim编辑/etc内的文件,等编辑好了,保存时候才发现没权限。
曲线方法是先保存个临时文件,退出后再sudo cp回去。不过实际上在vim里面可以直接完成这个过程的,命令就是如此。
查阅vim的文档(输入:help :w),会提到命令:w!{cmd},让vim执行一个外部命令{cmd},然后把当前缓冲区的内容从stdin传入。
tee是一个把stdin保存到文件的小工具。
而%,是vim当中一个只读寄存器的名字,总保存着当前编辑文件的文件路径。
所以执行这个命令,就相当于从vim外部修改了当前编辑的文件,好完工。
其他小知识点
1、vi是visual edit的缩写
2、vi强制退出:在末尾加上“!”。
3、必须记住的几个命令
移动光标:
屏幕翻滚:
ctrl+u:向上翻半屏(up)
ctrl+d:向下翻半屏(down)
ctrl+ f:向上翻一屏(forward)
ctrl+b:向下翻一屏(backward)
插入文本:
i:光标所在位置开始插入
删除命令:
搜索及替换命令:
\:转义字符
/:从光标开始处向下查找
?:从光标开始出向上查找
n:在同一方向上重复上次搜索的命令
N:在相反方向上重复上次搜索的命令
注意:替换命令中,s代表singnal,g代表global
:s/p1/p2/g:将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:将文件中所有p1均用p2替换