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:同ggG:前往最后一行
[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/gi:忽略大小写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 时自动执行。







