一些和Vim相关的备忘

命令备忘

命令 功能
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-oCtrl-i 回之前/之后的位置

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注