missing-semester(3)-vim

missing-semester(3)-vim
Holi本文参考💻【Linux】Vim 入门笔记,仅供自己查阅使用
基本概念
模式
vim编辑器是一种多模态编辑器,其允许用户切换不同的模式来进行不同的编辑任务:
- normal:最初始的模式,主要用于查询和移动
- insert:
i
- replace:
r
- visual:
v
- visual line:
shift-v
- visual block:
ctrl-v
- command line:
:
buffer, window, tab
每一个buffer对应一个文件,一个window可以显示一个buffer(多个window可以对应同一个buffer),每一个tab可以打开多个window。
基本操作
执行命令
:
后输入命令
退出vim
:q
或:quit
:退出当前tab中所在window,直到最后一个window则退出tab:q!
:退出并丢弃已有操作:wq
:保存更改(write)并退出(quit)ZZ
:等价于:wq
保存文件
:w
:保存更改:w <filename>
:将当前内容保存到新的文件中
[M]基本移动
使用h
、j
、k
、l
而不是左下右上的方向键
[M]前进到第一行或最后一行
gg
:前往第一行1G
:同gg
G
:前往最后一行
[M]前往第n行
nG
:前往第n行,可以在标准模式下使用set number
来显示行号:n
:同样前往第n行
[M]向右移动一个单词
w
:向右移动一个单词,光标处于首字符e
:向右移动一个单词,光标落在当前单词的最后一个字符
注意此处单词的定义是连续的「数字+字母+下划线」,或者连续的「特殊字符」。hello, world!!!
里包含 hello
、,
、world
和 !!!
四个单词。
W
:向右移动一个连续的「非空字符」,光标处于首字符E
:向右移动一个连续的「非空字符」,光标落在当前单词的最后一个字符
[M]向左移动一个单词
b
:向左移动到前一个单词的首字符ge
:向左移动到前一个单词的末尾B
:向左移动一个连续的「非空字符」gE
:向左移动一个连续的「非空字符」,到末尾
[M]前往当前行的开头和末尾字符
0
:前往开头$
:前往末尾_
:前往第一个非空字符(编写python等缩进代码时很有用)^
:与_
等价
[E]删除字符
x
:删除当前字符X
:删除前一个字符
[E]删除单词
dw
:删除单词dW
:删除下一个空格前的单词
[E]删除当前行
dd
[E]在当前位置插入
i
:在当前位置前面插入(insert)a
:在当前位置后面插入(append)
[E]在当前行开头或末尾插入
I
:在当前行开头插入A
:在当前行末尾插入
[E]在当前行上或下插入新的行
o
:在上面插入新的行O
:在下面插入新的行
[E]改变大小写
~
:将光标下的字母改变大小写gu<motion>
:指定范围的字母变成小写,比如guw
是后一个单词全变成小写,guj
是当前整行改成小写gU<motion>
:指定范围的字母变成大写guu
:将当前行的字母改成小写gUU
:将当前行的字母改成大写guiw
:将光标所在的单词改成小写
[F]移动到写一个指定字符
f<target>
:移动到下一个<target>
出现的位置,比如ft
就是移动到下一个t
出现的位置F<target>
:移动到前一个<target>
出现的位置t<target>
:类似于f
,但是会移动到下一个指定字符之前T<target>
:类似于F
,但是会移动到前一个指定字符之后
[E]撤销或重做
u
:撤销(undo)<ctrl>+r
:重做(redo)
一些模式
重复n次操作
n<action>
,重复n次<action>
操作
操作任意范围
<verb><motion>
,任意的操作<verb>
都可以和范围<motion>
拼接,使得指定一个范围进行操作。w
是跳到下一个单词的开头,那么 dw
就是删除到下一个单词的开头。
大部分命令都支持 <verb><n><motion>
和 <n><verb><motion>
两种模式,比如 d2w
和 2dw
都是删除后两个单词。
命令大小写
不同的方向:
x
向右、X
向左p
向下、P
向上o
向下、O
向上f
向右、F
向左
更严格的条件:
w
将特殊字符作为独立单词,W
只将空格作为单词分隔符e
/E
、b
/B
同理
更大的范围:
a
在当前位置后面插入、A
在当前行末尾插入i
在当前位置前插入、I
在当前行开始插入d
删除一个范围、D
删除到行末尾c
删除一个范围、C
删除到行末尾,并进入编辑模式s
删除当前字符,并进入编辑模式;S
删除当前整行,并进入编辑模式
连续操作:
r
替换一个字符、R
连续替换多个字符直到按下<Esc>
两个字母重复
两个 verb 字母重复,表示对当前整行操作:
dd
:删除整行cc
:删除整行,并进入编辑模式yy
:复制整行guu
:当前整行变成小写gUU
:当前整行变成大写
重复上次操作
.
:重复上次的编辑操作,
或;
:重复当前行内的上一次 / 下一次f
查找n
或N
:按/bar<Enter>
搜索bar
字符串后,按n
可以查找下一个,按N
查找上一个
进阶操作
[E]替换一个字符
r
:再按下任意键,替换(replace)当前字符,等同于 x
+ i
。
[E]替换连续多个字符
R
:替换连续的多个字符,按下 <Esc>
可以退出替换模式。
[E]更改一个范围的内容
c
相当于将删除和进入编辑模式合二为一(change)。
cw
:更改下一个单词,等同于dw
+i
[E]删除当前字符并进入编辑模式
s
等价于x
+i
。
[E]删除当前整行并进入编辑模式
S
等价于dd
+o
。也可以用cc
。
[E]从当前位置开始向右删除整行
D
等价于d$
。
[E]从当前位置开始向右删除整行并进入编辑模式
C
等价于c$
,或者d$
+a
,或者D
+a
。
[V]可视模式选择内容
按下 v
进入可视模式(visual mode),然后移动光标以选择文本。可以针对选中的文本执行任意操作 (verb),比如
- 按下
y
可以复制选中的文本,再移动到别的位置按下p
粘贴这些文本 - 按下
d
可以删除选中的文本
按下 ctrl + v
可以进入 Visual Block Mode,选择一个矩形块里的内容。
按下大写 V
可以选中整行。常见的使用技巧:
- 按
V
选中整行,按j
向下选中多行,然后y
复制。 - 按
V
选中整行,按j
向下选中多行,按<
向左缩进,按.
继续缩进。 - 按
V
选中整行,按j
向下选中多行,按=
格式化。
复制单词
y
可以进行复制(yank)。
yw
:复制下一个单词
y
和c
、d
一样可以和光标移动操作符相结合。
复制当前行
yy
:复制当前行nyy
:复制当前行向下的n行,包括当前行ynj
:同nyy
粘贴到下一行或上一行
p
:粘贴复制内容到目标位置,使用dd
删除某一行后,也可以按下p
,将删除掉的内容放置到当前光标位置下一行(但是此时是放置(put)而不是粘贴)P
:粘贴到上一行
当前行置顶
zt
:把当前行置于屏幕顶端,z
字取其象形意义,模拟一张纸的折叠变形,t
取 top 的首字母zz
:将当前行至于屏幕中央zb
:将当前行至于屏幕底端
缩进
<
:选中文本后,向左缩进>
:选中文本后,向右缩进】
格式化
=
:通过V
选中多行,然后按=
格式化选中的文本
高级
[E]inside和around
对于 Vim 的删除命令 d
,还有一类比较常用的操作是以 i
(inside或 inner) 和 a
(around) 为后缀的命令,用于删除以当前光标所在的语法元素内部或周围的字符。
diw
和daw
:前者删除当前光标所在的单词,后者会删除当前光标所在的单词与后面的空格di(
和da(
:前者会删除括号内的内容,后者还会删除括号本身。类似的还有di[
、da[
、di{
、da{
等dib
和dab
:等价于di(
和da)
,b
表示 bracketdi"
和da"
:前者删除双引号内的内容,后者还会删除引号本身dit
和dat
:修改 tag 包围的内容,vim 会自动将<tag>
和</tag>
识别为一对 tagdip
:删除当前整段 (paragraph) 的内容
除了 d
命令,c
/ v
/ gu
等命令也可以和 inside、around 组合。比如 ciw
是修改当前单词,viw
是选中当前单词。
inside、around 也可以和上面的重复n次结合使用。比如光标位于 (a * (b + c))
的字符 c
时,按 di(
将删除内层括号里的 b + c
,按 d2i(
将删除外层括号里的全部内容。
[F]查找文档中的关键字
/
从光标所在位置向后查找关键字,n
/ N
查找下一个 / 上一个匹配的位置。
?
向前查找,不过很少使用。如果想向前查找的话,使用 /
+ N
就可以了。
q/
、q?
可以列出 /
、?
的查找历史,上下选择,按 i
编辑,回车执行,:q
退出。
<pattern>
可以是正则表达式,比如 /vim$
查找位于行尾的 vim
。查找特殊字符时需要转义,比如 /vim\$
查找 vim$
。
在查找模式中加入 \c
表示大小写不敏感查找,\C
表示大小写敏感,比如 /foo\c
会查找 foo
、Foo
等。默认是大小写敏感,可以执行 :set ignorecase
或写入配置文件设置大小写不敏感为默认的查找模式。
[F]查找当前光标对应的完整单词
按下*
,将向后查找,按下#
是向前查找。
[F]在代码块匹配的括号之间跳转
%
在匹配的括号之间跳转。需要将光标放在 {}[]()
上,然后按 %
。 如果光标所在的位置不是 {}[]()
,那么会向右查找第一个 {}[]()
。
[F]光标跳转到前一个位置/后一个位置
在标准模式下,<Ctrl> + o
将光标跳转到前一个位置,<Ctrl> + i
跳转到后一个位置。h
/ j
/ k
/ l
/ w
等移动将不会记录在「跳转表」中,只有通过 gg
/ nG
/ 查找时的 n
/ N
等命令执行的跳转操作,才可以通过 <Ctrl> + o
/ <Ctrl> + i
来回跳转。
- 在 VS Code 中,向前一个 / 后一个位置跳转的快捷键是
<Ctrl> + [
/<Ctrl> + ]
。
[F][E]替换文本
:s
(substitute)命令用来查找和替换文本。语法如下:
:{range}s/{old}/{new}/{flag}
表示在指定范围 range
内查找字符串 old
并替换为 new
,flag
说明了替换模式,如只替换首次出现、或全部替换。
作用范围range
分为当前行、全文、行范围、选区等:
- 当前行:空白,默认,如
:s/foo/bar/g
- 全文:
%
,如:%s/foo/bar/g
- n~m 行:
n,m
,如:5,12s/foo/bar/g
表示 5~12 行 - 当前行与之后 n 行:
.,+n
,如:.,+2s/foo/bar/g
表示当前行与之后 2 行 - 选区:略
替换模式flag
:
- 空白:默认,只替换光标位置之后的首次出现,如
:%s/foo/bar
g
:全局替换,替换每次出现(global),如:%s/foo/bar/g
i
:忽略大小写c
:交互式替换,每次替换前需要用户确认(confirm),如:%s/foo/bar/gc
表示查找全文的所有foo
并替换为bar
,每次替换前都需要确认:- 按下回车执行后,提示 `replace with bar (y/n/a/q/l/^E/^Y)?``
`y
表示替换n
表示不替换a
表示替换后续所有q
表示退出查找模式l
表示替换当前位置并退出查找模式^E
、^Y
用于向上、向下滚动屏幕,^
表示<Ctrl>
键
也可以配合v
可视模式选择替换区域。
首先按 v
进入可视模式,选择要替换的文本范围。接下来,输入替换命令:
:'<,'>s/old_text/new_text/g
这将在选择的区域内替换所有匹配到的 old_text
。
录制宏
Vim 的宏提供了将一系列操作记录下来然后重复执行的机制。它可以大大提高重复性的操作效率。使用宏的步骤如下:
- 录制宏。按下
q
键,然后再按下一个字母 (如a
,这是宏的名字),开始录制宏。这时会在状态栏显示recording a
。在录制时,执行要重复的操作,包括移动、删除、插入等等。执行完操作后,按下q
键结束录制。 - 执行宏。按下
@
键,然后在输入框中输入之前记录宏的字母 (如a
),按下回车键即可执行宏。也可以连续执行多次,比如执行 10 次,只需在@a
后面加上10
即可。
另外,按下 v
键进入 visual mode 选中多行,可以批量针对多行文本执行宏。使用 :reg
命令可以查看所有已经保存的宏。如果在执行宏时出现错误,可以通过使用 :debug
命令进入调试模式。
在vim中执行shell命令
比如通过 vim 编辑文本的时候,希望打印当前目录,但是又不想退出 vim,那么就可以直接在 vim 中执行::!pwd
,这等同于在 shell 中执行 pwd
。
获得命令提示:
- 在 vim 中输入
:
,再按下<Ctrl> + d
,将展示所有可以在 vim 中使用的命令。 - 输入
:w
,再按下<Ctrl> + d
,将展示所有可以在 vim 中使用的、以w
开头的命令。
配置文件
配置文件位于 ~/.vimrc
,其内容是若干行可在 vim 中执行的命令,会在每次打开 vim 时自动执行。