Vim 入门教程 Vim 备忘单

2024-02-25 开发教程 Vim 入门教程 匿名 5

inner / aroundinner / aroundVim8.2 快速参考备忘单的有用集合,可帮助您更快地学习 vim 编辑器。

开始

运动图

▼/▶ Cursor   ▽/▷ Target

左右动作

┌───────────── |      
├───────────── 0 $ ──────────────┐
│ ┌────────── ^ fe ────────┐ │
│ │ ┌─────── Fo te ───────┐│ │
│ │ │┌────── To 30| ───┐ ││ │
│ │ ││ ┌──── ge w ───┐ │ ││ │
│ │ ││ │ ┌── b e ─┐ │ │ ││ │
│ │ ││ │ │ ┌h l┐ │ │ │ ││ │
▽ ▽ ▽▽ ▽ ▽ ▽▼ ▼▽ ▽ ▽ ▽ ▽▽ ▽
echo "A cheatsheet from quickref.me"

上下动作

- SCREEN 1 START
┌─┬─────────▷ #!/usr/bin/python
│ │ ┌───▷
│ │ │ print("Hello")
│ │ { } ▶ print("Vim")
│ │ │ print("!")
│ │ └─▷
│ │ ┌───┬───▷ print("Welcome")
G gg H M L k j ▶ print("to")
│ │ └─▷ print("quickref.me")
│ │ print("/vim")
│ │
│ └─────▷
│ - SCREEN 1 END
└──────────────▷ print("SCREEN 2")

快捷键大全

h| j| k| l方向键
<C-u>/ <C-d>上/下半页
<C-b>/ <C-f>向上/向下翻页

b/ w上一个/下一个单词
ge/ e上一个/下一个词尾

线

0(零) / $行开始/结束
^行首(非空白)

特点

Fe/ fe移至上一个/下一个 e
To/ to在上一个/下一个之前/之后移动 o
|/ n|转到第一/n第列

文档

gg/ G第一行/最后一行
:n| nG去线 n
}/ {下一个/上一个空行

窗口

H/ M/ L上/中/下屏幕
zt/ zz/ zb这条线的顶部/中心/底部

插入模式

i/ a在光标前/后插入
I/ A插入行首/行尾
o/ O(字母)在下方/上方插入新行
s/ S删除字符/行并插入
C更改为行尾
gi在最后一个插入点插入
Esc| <C-[>退出插入模式

保存和退出

:w节省
:q关闭文件
:wq| :x| ZZ保存并退出
:wqa保存并退出所有文件
:q!| ZQ强制退出
:qa关闭所有文件
:qa!强制退出所有文件
:wnew.txt写给 new.txt
:savnew.txt保存和编辑 new.txt
:w!sudo tee %写入只读文件

正常模式

r替换一个字符
R进入替换模式
u/ 3u撤消更改1/3次数
U在一行上撤消更改
J加入下一行
<C-r>/ 5<C-r>重做更改1/5次数

剪切和粘贴

x删除字符(剪切)
p/ P粘贴之后/之前
xp交换两个字符
D删除到行尾(剪切)
dw删除单词(剪切)
dd删除线(剪切)
ddp交换两行
yy扬克线(复印)
"*p| "+p从系统剪贴板粘贴
"*y| "+y粘贴到系统剪贴板

在视觉模式

d| x删除选择 (剪切)
s替换选择
yYank 选择(复制)

重复

.重复上一个命令
;重复最近的f, t,FT
,重复上次的ftFT逆转
&最后重复 :s
@:重复命令行命令

视觉模式

v进入视觉模式
V进入视线模式
<C-v>进入视觉块模式
ggVG选择所有文本
>/ <向右/向左移动文本

qi录制宏 i
q停止录制宏
@i运行宏 i
7@i运行宏i7 次
@@重复上一个宏

Vim 操作符

用法

dw
Operator(操作符)
Motion(动作)

结合操作符动作来使用它们

可用的运算符

d删除
y扬克(复制)
c更改(删除然后插入)
p粘贴
=格式代码
g~切换案例
gU大写
gu小写
>缩进权
<向左缩进
!通过外部程序过滤

例子

dd删除当前行
dj删除两行
dw删除到下一个单词
db删除到词首
dfa删除直到a字符
d/hello删除直到 hello
cc更改当前行
yy复制当前行
>j缩进 2 行
ggdG删除一个完整的文档
gg=G缩进完整的文档
ggyG复制整个文档

计数

[count] <operator> <motion>
<operator> [count] <motion>

2dd删除2
6yy复制6
d3w删除3单词
d5j5向下删除行
>4k4向上缩进线

Vim 文本对象

用法

vi / ap
Operator(操作符)
inner / around
Text object(文本对象)

在文本块内部或周围使用运算符操作

文本对象

p
段落
w
单词
W
WORD
(由空格包围)
s
句子
[ ( { <[]、() 或 {} 块
] ) } >[]、() 或 {} 块
' ” `带引号的字符串
b一个块 [(
B[{ 中的一个块
t一个 HTML 标签块

:help text-objects

删除

​​​diw​​​
删除内词
​dis​
删除内句
​di​"
在引号中删除
​da​"
在引号中删除(包括引号)
​dip​
删除一个段落

选择

​v​i”选择内引号“ ...
va”选择引号 "..."
vi[选择内括号 [ ...]
va[选择括号 [...]
viw选择内词
vip选择内部段落
vipip选择更多段落

杂项

ciw改变内在的话
​​ci​”更改内部引号
cit更改内部标签 (HTML)
cip更改内部段落
yip拉取内段
yspYank 段落(包括换行符)

Vim 多个文件

缓冲器

:e file在新缓冲区中编辑文件
:bn转到下一个缓冲区
:bp转到上一个缓冲区
:bd从缓冲区列表中删除文件
:b 5打开缓冲区 #5
:b file按文件转到缓冲区
:ls列出所有打开的缓冲区
:sp file打开和拆分窗口
:vs file打开和垂直拆分窗口
:hid隐藏此缓冲区
:wn写入文件并移至下一个
:tab ba将所有缓冲区编辑为选项卡

窗口

<C-w>s拆分窗口
<C-w>v垂直拆分窗口
<C-w>w切换窗口
<C-w>q退出窗口
<C-w>T进入新标签页
<C-w>x与下一个交换当前
<C-w>-/ +降低/增加高度
<C-w></ >减少/增加宽度
<C-w>|最大宽度
<C-w>=同样高宽
<C-w>h/ l转到左/右窗口
<C-w>j/ k转到上/下窗口

标签

:tabe [file]在新选项卡中编辑文件
:tabf [file]如果在新选项卡中存在则打开
:tabc关闭当前标签
:tabo关闭其他标签
:tabs列出所有标签
:tabr转到第一个选项卡
:tabl转到最后一个选项卡
:tabm 0移动到位置 0
:tabn前往下一个标签
:tabp前往上一个标签

正常模式

gt前往下一个标签
gT前往上一个表亲啊
2gt前往编号为 2的标签

Vim 搜索和替换

/foo向前搜索
/foo\c向前搜索(不区分大小写)
?foo向后搜索
/\v\d+使用正则表达式搜索
n下一个匹配的搜索模式
N上一场匹配
*向前搜索当前词
#向后搜索当前词

换行

:[range]s/{pattern}/{str}/[flags]
:s/old/new先更换
:s/old/new/g全部替换
:s/\vold/new/g全部替换为正则表达式
:s/old/new/gc全部替换(确认)
:s/old/new/i先忽略大小写替换
:2,6s/old/new/g在行之间替换2-6

#替换文件

:%s/{pattern}/{str}/[flags]
:%s/old/new先更换
:%s/old/new/g全部替换
:%s/old/new/gc全部替换(确认)
:%s/old/new/gi全部替换(忽略大小写)
:%s/\vold/new/g全部替换为正则表达式

范围

%整个文件
’<,’>当前选择
5线 5
5,10510
$最后一行
2,$2到最后
.当前线路
,3下一3
-3,前锋3线

全局命令

:[range]g/{pattern}/[command]

:g/foo/d删除包含的行 foo
:g!/foo/d删除不包含的行 foo
:g/^\s*$/d删除所有空行
:g/foo/t$复制包含foo到 EOF 的行
:g/foo/m$移动包含foo到 EOF 的行
:g/^/m0反转文件
:g/^/t.复制每一行

Inverse :g

:[range]v/{pattern}/[command]
:v/foo/d删除不包含foo
(也:g!/foo/d)的行

Flags

g替换所有出现
i忽略大小写
I不要忽略大小写
c确认每次替换

替换表达式(魔术)

&| \0替换为整个匹配
\1...\9替换为 0-9 组
\u大写下一个字母
\U大写以下字符
\l小写下一个字母
\L小写以下字符
\e结束\u, \U,\l\L
\E结束\u, \U,\l\L

例子

:s/a\|b/xxx\0xxx/g		         # Modifies "a b"      to "xxxaxxx xxxbxxx"
:s/test/\U& file/ # Modifies "test" to "TEST FILE"
:s/\(test\)/\U\1\e file/ # Modifies "test" to "TEST file"
:s/\v([abc])([efg])/\2\1/g # Modifies "af fa bg" to "fa fa gb"
:s/\v\w+/\u\0/g # Modifies "bla bla" to "Bla Bla"
:s/\v([ab])|([cd])/\1x/g # Modifies "a b c d" to "ax bx x x"
:%s/.*/\L&/ # Modifies "HTML" to "html"
:s/\v<(.)(\w*)/\u\1\L\2/g # Make every first letter of a word uppercase
:%s/^\(.*\)\n\1/\1/ # Remove duplicate lines
:%s/<\/\=\(\w\+\)\>/\U&/g # Convert HTML-Tags to uppercase
:g/^pattern/s/$/mytext # Find and append text to the end
:g/pattern/norm! @i # Run a macro on matching lines
/^\(.*\)\(\r\?\n\1\)\+$ # View the duplicates lines
/\v^(.*)(\r?\n\1)+$ # View the duplicates lines (very magic)
:v/./,/./-j # Compress blank lines into a blank line
:g/<p1>/,/<p2>/d # Delete inclusively from <p1> to <p2>

Vimdiff

用法

$ vimdiff file1 file2 [file3]
$ vim -d file1 file2 [file3]

编辑

:[range]diffget [bufspec]
:[range]diffput [bufspec]

do/ :diffget获得(get)差异
dp/ :diffput区分差异
:dif重新扫描差异
:diffo关闭差异模式
:1,$+1diffget获取所有差异
ZQ退出而不改变

请参阅:范围

折叠

zo/ zO打开
zc/ zC关闭
za/ zA切换
zv为这条线打开折叠
zM关闭所有
zR全部打开
zm折叠更多(foldlevel += 1)
zr减少折叠(foldlevel -= 1)
zx更新折叠

跳跃

]c下一个区别
[c以前的区别

其他

案件

vU大写字符
vu小写字符
~切换大小写字符
viwU大写单词
viwu小写单词
viw~切换大小写单词
VU/ gUU大写行
Vu/ guu小写行
V~/ g~~切换案例行
gggUG大写所有文本
ggguG小写所有文本
ggg~G切换大小写 所有文本

跳跃

<C-o>返回上一个
<C-i>直走
gf转到光标中的文件
ga显示十六进制、ASCII 值

其他命令行

:h帮助 打开帮助视图
:edit!重新加载当前文件
:2,8m0移动线2-80
:noh清除搜索亮点
:sort排序线
:ter打开终端窗口
:set paste启用插入粘贴子模式
:set nopaste禁用插入粘贴子模式
:cq出现错误退出
(中止 Git)
%最近/匹配 {[()]}
[(| [{| [<上一个(,{<
])| ]{| ]>下一个)}>
[m上一个方法开始
[M上一个方法结束

柜台

<C-a>增加数量
<C-x>减少数量

标签

:tag Classname跳转到 Classname 的第一个定义
<C-]>跳转到定义
g]查看所有定义
<C-t>返回上一个标签
<C-o> <C-i>后退前进
:tselect Classname查找 Classname 的定义
:tjump Classname查找类名的定义(自动选择第一个)

格式化

:ce 88列之间的中心线
:ri 44列处右对齐行
:le左对齐线

:help formatting

分数

`^插入模式下光标的最后位置
`.当前缓冲区的最后更改
`"最后退出的当前缓冲区
`0在上次编辑的文件中
''返回当前缓冲区中跳转的行
``返回当前缓冲区中跳转的位置
`[到先前更改或猛拉的文本的开头
`]结束先前更改或猛拉的文本
`<到最后一个视觉选择的开始
`>到最后一个视觉选择结束
ma将此光标位置标记为 a
`a跳转到光标位置 a
'a跳到带有位置的行的开头 a
d'a从当前行删除到标记行 a
d`a从当前位置删除到标记位置 a
c'a将文本从当前行更改为 a
y`a将文本从当前位置拉到 a
:marks列出所有当前标记
:delm a删除标记 a
:delm a-d删除标记a, b, c,d
:delm abc删除标记a, b,c

计算器

<C-r>=7*7显示结果
<C-r>=10/2显示结果

在 INSERT 模式下执行此操作

shell

:!<shell>解释 Shell 命令
:r!<shell>读入 shell 的输出
:r!date插入日期
:!!date用日期替换当前行

命令行

<C-r><C-w>将当前单词插入命令行
<C-r>"从“注册”粘贴
<C-x><C-f>在插入模式下自动完成路径

技巧

删除重复行

:sort | %!uniq -u

对文件中的行进行编号

:%!cat -n

将整个文档复制到剪贴板

:%w !pbcopy            # Mac OS X
:%w !xclip -i -sel c # GNU/Linux
:%w !xsel -i -b # GNU/Linux

另见