命令备忘
命令 | 功能 |
---|---|
zc |
代码折叠 |
zo |
展开代码折叠 |
[数字 n]命令 |
将命令重复 n 遍 |
s |
替换(substitute),删除一个字符并进入插入模式 |
S |
替换一行, 即删除整行 并进入插入模式 |
r[字母] |
替换(replace)单个字母 |
R |
进入替换模式 |
ctrl-g |
显示文件信息与行数 |
[数字 n]G |
跳至 n 行 |
% |
跳转到匹配的括号 |
:![命令] |
执行外部命令 |
:w [URI] |
保存为 |
:wq! |
权限不足强制保存 |
v |
可视模式,可移动光标选中内容, 选中后可使用:w [file] 保存 |
:r [file] |
读取文件内容或命令输出粘贴至当前行 |
R |
替换模式,每输入一个字符都会删除一个已有的字符 |
y |
复制,可在可视模式下复制选中的, 也可在正常模式与动作一同使用 |
(命令模式)CTRL-D |
显示所有补全项 |
[TAB] |
补全 |
:edit [URI] |
编辑文件 |
. |
重复上步操作 |
J |
将下一行合并到本行, 即删除换行符 |
正常模式(Normal Mode)
这是进入 vim 后的默认模式, 在任何模式下按 Esc 也会退出到此模式
h
j
k
l
左下上右, ctrl-f
下页, ctrl-b
上页.
x
删除单字符
p
将上次删除的内容黏贴至后方(下一行/光标后)
r字母
替换(replace)单个字母
插入模式(Insert Mode)
i
插入到光标前面, I
插入到行首 (insert)
a
插入到光标后面, A
插入到行末 (append)
o
O
在当前行下方/上方打开一行
ctrl-f
ctrl-b
下翻/上翻一屏
u
ctrl-r
撤销/重做, U
撤销全部
命令模式(Command Mode )
又称底线命令模式, : 进入
:9,15 copy 16
将 9 到 15 行复制到第六行, copy 可以缩写为 co
:9,15 move 16
将 9 到 15 行移动到第六行, move 可以缩写为 m
:9,15 delete
将 9 到 15 行删除, delete 可以缩写为 d
:[range]g[lobal]/{pattern}/[cmd]
在 [range]
界定的匹配模式 {pattern}
的文本行上执行 Ex 命令 (缺省是 “:p”)
:[range]g[lobal]!/{pattern}/[cmd]
在 [range]
界定的不匹配模式 {pattern} 的文本行上执行 Ex 命令 (缺省是 “:p”)
:[range]v[global]/{pattern}/[cmd]
等同于 :g!
带动作的操作符
在正常模式下可以使用形如[操作符][次数][动作|文本对象]
的指令
此外可视模式也支持这种操作
操作符(operator)
操作符 如下
y
–复制
d
–删除
c
–替换 (删除并插入)
动作(motion)
动作会对移动经过的所有文本都进行操作, 例如ggdG
将会删除全部文本
动作如下
^
–软行首(不包含空白字符)
0
–硬行首
$
–行末
[命令对应按键]
–整行
w
(W
) –( 以空格分割的 )下个单词首字母
b
–当前单词开头
e
–当前单词结尾
1G
–第一行. 类似地, 10G
就是第十行
G
–最后一行
(
)
–上一句/下一句
小写的动作意味着单词间的分隔符包含标点
动作单独使用时为移动光标
文本对象(text object)
用 text objects 高效编辑
文本对象由它的类型和范围组成
如ciw
中, c 是动作, iw 是文本对象. 其中 i 是范围, w 是类型
文本对象的范围
a
英文单词 “a” 或者 around, 会包括标点/空白符
i
表示 inner 或 in
文本对象的类型
共八种: w
s
p
""
<>
[]
()
{}
以及相应的大写. 如同前面的笔记所写, 大写无视标点.
举例
di"
i 表示 in, 删除双引号中的内容
ca'
a 表示 around, 连同单引号一起更改
diw
iw 即 inner word. 删除光标下单词.
dap
删除一个段落, 包括空白符.
查找与跳转
ctrl-g
–查看当前行数与文件
gg
–跳到第一行
G
–跳到最后一行
[数字n]G
–跳到 n 行
/[关键词]
–向下搜索
?[关键词]
–向上搜索
n
–下个关键词
N
–上个关键词
:nohl
–取消高亮显示
ctrl-o
ctrl-i
–回到之前/ 较新 的位置 (针对跳转命令的上/下一步)
ctrl-f
ctrl-b
下翻/上翻一屏
替换命令
:s/old/new
–替换一个 old 为 new
:s/old/new/g
–替换一行中所有
:0,100s/old/new/g
–替换 0-100 行
:%s/old/new/g
— 在整个文件中替换
:%s/old/new/gc
— 在整个文件中替换并一一询问
s
替换(substitute),删除一个字符并进入插入模式
S
替换一行, 即删除整行 并进入插入模式
r字母
替换(replace)单个字母
R
进入替换模式
c动作
带动作的替换
vim 的剪切板
"{register}y
复制到特定剪切板中, "{register}p
黏贴
:reg
查看剪切板内容
+
为系统剪切板
多文件编辑
参考: Vim 多文件编辑:标签页 Vim 多文件编辑:窗口 Vim 多文件编辑:缓冲区 Vim 扫盲: buffer,window,tab
A buffer is the in-memory text of a file. A window is a viewport on a buffer. A tab page is a collection of windows.
包含关系为 buffer < window < tab
buffer 是内存中的文本文件, 一般我们操控 buffer
window 用来显示 buffer, 同一个 buffer 可以被多个 window 显示
tab 包含了一系列的 window, 更类似于 “layout”
标签
命令行下使用 vim -p file1 file2
多标签打开, p 即 page.
:tabe[dit]
标签打开 :tabf[ind]
标签查找
:tabc[lose] [i]
关闭标签 i, 默认是当前标签
:tabo[nly]
关闭除当前外的其他
:tabs
列出所有标签
:tabm {i}
移动当前标签到 i 处, i 从 0 计数. i 留空表示最后一个.
:tabp
:tabn
去前/后一个标签
:tabfirst
:tablast
去第一/最后一个标签
:tabnew filename
命令新建标签
:tabclose
关闭当前标签, :tabonly
关闭除当前外的其他
gt
gT
{i}gt
去前/后/第 i 个 tab
Ctrl-PageDown
Ctrl-PageUp
切换 tab
窗口
打开文件时使用 -o files
(或-O
) 参数, 水平/垂直分割窗口
-o5 file1 file2
预分配 5 个窗口, 其中 3 个闲置
:sp[lit]
:new
水平分屏
:sv[iew]
只读水平分屏
:vs[plit] {file}
垂直分屏
:clo[se]
关闭当前窗口
C-w-w
C-w-移动键
切换窗口
C-w-移动键大写
向某方向移动窗口
C-w-s
C-w-v
水平/垂直分割当前窗口
C-w-q
关闭当前窗口
C-w-n
打开一个空新窗口
C-w-o
关闭其它标签页
C-w-T
当前窗口移动到新标签页
调整窗口高度依然是C-w
打头, +
-
增加/减少高度, =
统一高度.
缓冲区
不带任何参数打开多个文件便可以把它们都放入缓冲区 vim a.txt b.txt
:e[dit] {file}
打开文件到缓冲区
:bd[elete]
移出缓冲区 (最好不要这样做)
:ls
:buffers
列出缓冲区
:bp[revious]
:bn[ext]
上/下一个缓冲区
:b {number, expression}
跳转到指定缓冲区
:sb 3
分屏并打开编号为3的Buffer
:vertical sb 3
同上,垂直分屏
:vertical rightbelow sfind file.txt
在右边打开file.txt
:sfind {file}
打开在Vim path中的任何文件
C-^
切换buffer
技巧
删除行尾空格
G$gelD
使用管道
cmd | vim -
将 “cmd” 命令的输出用 vim 编辑
注释
:10,20s/^/#/g
10 到 20 行添加#注释
:10,20s/^#//g
10 到 20 行删除#注释
或使用ctrl-v
进入块选择模式, shift-i
插入, 两次esc
退出
强制保存
w !sudo tee %
代码折叠
zc
代码折叠, zo
展开折叠
取消高亮:nohl
+
边界跳转
{
}
跳到上/下一段的开头
(
)
移到这个/下个句子的开头
[[
]]
跳往上/下一个函式
[{
]}
代码块(大括号)的边界的跳转
[(
])
括号的边界的跳转
Ctrl-o
和 Ctrl-i
回之前/之后的位置