【Vim】常用总结

都21世纪了,为什么还需要学习vim?

只要你用服务器,vim就是个必备技能

后端和运维工程师必须掌握的编辑器,不然服务器上操作很尴尬

可以纯键盘编辑,提升编辑效率

初识vim

据说Stackoverflow帮助过上百万开发者退出过vim!

输入vim命令进入vim

进去之后似乎没法输入东西,起始默认进去是normal模式

使用:q可以退出vim

开始编辑

进入编辑模式就可以像其他编辑器一样编辑了

使用i(insert)进入编辑模式,开始输入文字

i表示(insert),a(append),o(open a line below)

使用Esc可以退出编辑模式,又回到normal模式。

使用:wq保存退出

w(write),q(quit)

insert -> normal:使用Esc

normal -> insert:(小写是操作字符大写是操作

i:(insert)表示进入insert编辑模式后,在当前字符的前面插入

insert

a:(append)表示进入insert编辑模式后,在当前字符后附加插入

append

o:(open a line below)表示进入insert编辑模式后,在当前行下新启一行插入

append

I:(insert before line)表示在当前行的最前面插入

insert before line

A:(append after line)表示在当前行的最后附加插入

append after line

O:(append a line above)表示在当前行上新启一行插入

append a line above

保存:

:w:(write)写入,保存

write

:q:(quit)退出

quit

:wq:(write and quit)保存并退出

write and quit

vim,为什么你有这么多模式 怪异的vim模式

vim和其他很多编辑器的区别在于多种模式

进入vim默认是normal(普通)模式?为什么不是编辑模式呢?

使用a(append)、i(insert)等进入编辑模式

还有cmd命令模式和v(visual)可视化模式

为什么进入vim不能插入-normal模式

奇怪的是,为什么vim进入之后不像其他编辑器一样直接插入?

进入Vim默认是normal(普通)模式。使用Esc从插入回到普通模式

普通模式下可以进行各种命令操作和移动

大部分情况下你是在浏览而不是编辑,所以Vim默认是normal

Insert(插入)模式

插入模式下Vim可以直接编辑,和其他编辑器一样

使用i(insert) 、a(append) 、o (open a line below)进入插入模式

使用Esc退出插入模式到normal模式

Command(命令)模式

Normal模式下输入:之后执行命令,比如保存退出:wq一气呵成

顾名思义,执行Vim命令,比如保存:w,退出:q

比如分屏::vs (vertical split),:sp(split)

比如使用::% s/foo/bar/g全局替换

%:表示本文件全部文本
g:表示全局替换

Visual(可视)模式

Visual模式一般用来块状选择文本(类比使用Alt+鼠标拖动)

Normal模式下使用v进入visual选择

使用V选择行

使用ctrl+v进行方块选择

vim编辑小技巧 如何快速纠错(insert模式下)

代码就像人生,总是经常出错,需要我们快速修正

进入Vim之后首先使用a/i/o之一进入插入模式

ctrl+h 删除上一个字符,ctrl+w删除上一个单词,ctrl+u删除当前行

快速切换insert和normal模式

很多键盘的键位设置, Esc按起来不方便,不方便切换到normal

使用Ctrl+c代替Esc (但是可能会中断某些插件)或者ctrl+[

gi 快速跳转到你最后一次编辑的地方并进入插入模式

在配置章节我们会讲解如何映射方便的快捷键来替代Esc

vim快速移动大法 反人类的hjkl

众所周知,vim normal模式使用了反人类的hjkl来移动

据说编辑器作者在编写vim的时候键盘还没流行上下左右按键

h(左) ,j(下) ,k(上) ,l(右) ,移动也不会让手指脱离主键盘区

相信我,逼着自己使用hjkl一段时间之后,你会体会到它非常有效率

使用hjkl

只需要几天的适应,你就可以熟练使用hjkl来移动

【Vim】常用总结

在单词之间“飞舞”(normal模式下)

在单词之间移动是我们浏览操作中最常使用的命令

w/W移到下一个word/WORD开头。e/E 下一个word/WORD尾

b/B 回到上一个word/WORD开头,可以理解为backword

word指的是以非空白符分割的单词, WORD以空白符分割的单词

行间搜索移动

同一行快速移动的方式其实是搜索一个字符并且移动到该字符

使用f{char}可以移动到char字符上,t{char}移动到char的前一个字符

f:(find)
t:(until)

可以配合删除使用,如 dt)从当前字符开始删除直到)。

如果第一次没搜到,可以用分号(;)/逗号(,)继续搜该行下一个/上一个

大写的F{char}表示反过来搜前面的字符

vim水平移动

如何快速移动到一行的行首或者行尾呢?

0移动到行首第一个字符,^移动到第一个非空白字符

^:在正则表达式中,表示行的开头

$移动到行尾,g_ 移动到行尾非空白字符

$:在正则表达式中,表示行的结尾

记住常用的0和$就可以满足日常需求了

Vim垂直移动

我们还可以在句子(sentence)和段落(paragraph)间移动(不常用)

使用括号()在句子间移动,你可以用:help (来查看帮助

使用{}在段落之间移动

插件章节我们会讲如何用easy-motion插件移动,这些命令就都不用记忆啦

Vim页面移动

翻页命令太多, 2/8定律,记住常见的就能满足需求

gg/G移动到文件开头和结尾,你可以使用ctrl+o快速返回

nG移动到文件第n行,可以配合命令使用,如 dnG表示删除到第n行

H/M/L跳转到屏幕的开头(Head),中间(Middle)和结尾(Lower)

Ctrl+u,ctrl+f上下翻页(upword/forward)。zz 把屏幕置为中间

什么是vim的text object Text Object(文本对象)

如果你学过主流的编程语言,一定知道面向对象编程

Vim里文本也有对象的概念,比如一个单词,一段句子,一个段落

很多其他编辑器经常只能操作单个字符来修改文本,比较低效

通过操作文本对象来修改要比只操作单个字符高效

文本对象操作方式

之前我们已经使用过文本对象了,回忆下dw (删除一个单词)

[number] <command> [text object]

或者 <command> [number] [text object]

number表示次数,command是命令,d(delete),c(change),y(yank)

text object是要操作的文本对象

比如单词w(word),句子s(sentence),段落p(paragraph),标签t(tag)

通过示例来学习

iw表示inner word,如果键入viw命令,那么首先v将进入选择模式,然后iw将选中当前单词。

aw表示around word,它不但会选中当前单词,还会包含当前单词之后的空格。

以下实例中的[]表示作用范围

iw
This is a [test] sentence.

aw
This is a [test ]sentence.

iw
This is a [...test...] sentence.

aw
This is a [...test... ]sentence.

is
...sentence. [This is a sentence.] This...

as
...sentence. [This is a sentence. ]This...
End of previous paragraph.

ip
[This is a paragraph. It has two sentences.]
The next.
End of previous paragraph.

ap
[This is a paragraph. It has two sentences.
]The next.

ip
<xml>[hello world]</xml>

ap
[<xml>hello world</xml>]

i( or i)
1*([2+3])

a( or a)
1*[(2+3)]

i< or i>
The <[tag]>

a< or i>
The [<tag>]

i{ or i}
some {[code block]}

a{ or a}
some [{code block}]

i[ or i]
some [[code block]]

a[ or a]
some [[code block]]

i"
The "[best]"

a"
The ["best"]

i\'
The \'[best]\'

a\'
The [\'best\']

vim快速增删改查

数字+命令表示多次执行命令,如 2dw

或者 命令+数字+对象,如 d2w

Vim增加字符

增加字符就是进入插入模式,开始敲键盘吧

进入插入模式编辑文本

使用a/i/o进入插入模式

还记得A/I/O是什么作用么?

Vim快速删除

如何快速删除一个字符或者单词呢 ?

Vim在normal模式下使用x快速删除一个字符

使用d (delete)配合文本对象快速删除一个单词 daw (delete around word)

dw:默认为daw

d和x都可以搭配数字来执行多次

Vim快速修改

相比删除,更常用修改,一般是删除之后改成我们期望的文本

normal 模式下,常用有三个, r (replace),c (change),s(substitute)

使用r可以替换一个字符。

使用s替换并进入插入模式

使用c配合文本对象,我们可以快速进行修改整个文本对象。如ci"、ciw

Vim查询

查询单词也是一个常用操作

使用/或者?进行前向或者反向搜索

使用n/N跳转到下一个或者上一个匹配

next

使用*或者#进行当前单词的前向和后向匹配

*:在正则表达式中表示出现0次或多次。

vim如何搜索替换 Vim替换命令

substitute命令允许我们查找并且替换掉文本,并且支持正则式

:[range]s(substitute)/{pattern}/{string}/[flags]

range:表示范围。比如:10,20表示10-20行,%表示本文件中所有的行。

pattern:是要替换的模式,正则表达式

string:是替换后文本

注意:此命令不仅能用来替换,还能用来删除!如 删除所有星号*,命令为:%s/\*//g

替换范围range

你可以在命令之前设置一个范围。以下是一些方法:

m, n:表示范围为从第 m 行到第 n 行

1,:表示范围为从第 1 行到当前行

注意:第一行的行号是已知的,行号为 1;而最后一行的行号是未知的,所以我们只用给最后一行分配一个符号代表即可。

除了数字之外,还可以使用这些符号作为范围:

.:表示当前行,可以省略。如 .,3表示当前行到第 3 行。

$:表示文件中的最后一行。如 3,$表示第 3 行到最后一行。

+n:表示当前行的后 n 行。3,+1 或者 3,.+1,.可以用或不用,表示第 3 行到当前行后的 1 行。

%:表示本文件中所有的行。

在 Vim 中,%通常表示整个文件。

示例:

:1,5g/console/d 匹配第 1 行和第 5 行之间的字符串"console"并删除它们。

:,5g/console/d 如果逗号之前没有地址,则从当前行开始。它在当前行和行 5 之间寻找字符串"console"并删除它们。

:3,g/console/d 如果逗号后没有地址,则以当前行结束。它寻找第 3 行和当前行之间的字符串"console"并删除它们。

:3g/console/d 如果仅传递一个没有逗号的地址,则它只执行第 3 行的命令。它查看第 3 行,如果字符串"console",它将删除它。

替换模式pattern

请参照正则表达式

替换标志位flag

Flags有几个常用的标志

默认为空,表示仅替换一行上的第一个匹配项

g(global) 表示改变一行上的每个符合条件的匹配项,全局范围内执行

global

c(confirm)表示确认 ,可以确认或者拒绝修改

confirm

n(number)报告匹配到的次数而不替换,可以用来查询匹配次数

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zypdsp.html