codecamp

Vim 备忘单

inner / aroundinner / aroundVim 8.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! 强制退出所有文件
:w new.txt 写给 new.txt
:sav new.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 替换选择
y Yank 选择(复制)

重复

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

视觉模式

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

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

Vim 操作符

用法

d w
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单词
d5j 5向下删除
>4k 4向上缩进线

Vim 文本对象

用法

v         i / a p
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 拉取内段
ysp Yank 段落(包括换行符)

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,10 510
$ 最后一行
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 小写字符
~ 切换大小写字符
viw U 大写单词
viw u 小写单词
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 8 8之间的中心线
:ri 4 4处右对齐行
: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

另见


Vimscript 还剩下什么?
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

vi命令手册

Vimscript编程参考

Vim 其他内容

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }