0%

vim学习笔记

Vim学习笔记(一)

使用原厂配置

Vim -u NONE -N

-u NONE 让vim启动时不加载vimrc,插件也会被禁用

-N 不使用vi兼容模式

1
<C-g>显示当前文件名及状态
1
2
3
4
5
>  增加缩进层级
>G 增加从光标开始处到文档末尾的缩进层级
:set hls 查找高亮

r 替换

设置自动缩进和换行

1
2
3
4
5
6
7
8
:set shiftwidth=4 softtabstop=4 expandtab
shiftwidth 换行时自动缩进列数
softtabstop 一个制表符插入几个空格
expandtab 选项把插入的 tab 字符替换成特定数目的空格

tabstop 选项只修改 tab 字符的显示宽度


普通模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
set nrformats= 默认所有数字都为十进制数
<C-a> 对数字加 10<C-a> 对数字加10
<C-x> 对数字减 10<C-x> 对数字减10

gg光标回到文件开头
=G 自动缩进从光标位置到文件结尾的所有内容


cw 删除一个单词并进入插入模式

^ 光标移到行首
$ 光标移到行尾
b 光标移到当前单词开头处

操作符 + 动作命令 = 操作
(指明操作类型) (具体的操作行为)


gu 转小写
gul 光标处字符转小写
guaw 光标处单词转小写
guap 光标处段落转换为小写

g~ 取反

gU 转大写

gUU 作用于当前行


c 修改
cl 修改一个字符
caw 修改一个单词
cap 修改一个段落

d 删除操作
dl 字符
daw 单词
dap 一个段落
db 删除从光标起始位置到单词开头的内容

y 复制
yl 复制一个字符
yaw 复制一个单词
yap 复制一个段落
yt; 从当前光标复制到出现第一个分号前的字符

f{char} 跳转到某个字符
; 继续匹配下一个
,继续匹配上一个


R 进入替换模式
gR虚拟替换 把制表符当作一组空格处理

替换单个字符
r{char}
gr{char}

> 增加缩进
< 减小缩进

= 自动缩进

!使用外部程序过滤{motion}所跨越的行


操作符待决模式

1
2
3
dw
输入d进入该模式(只有操作符才能激活待决模式)
输入w退出该模式

命名空间

大多数时候第一个按键知识第二个按键的前缀,这些命令不会激活操作符待决模式。可以把它们看成命名空间

插入模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<C-h> 删除前一个字符
<C-w> 删除前一个单词
<C-u> 删除至行首
上述三个命令也适用于bash shell

<C-r><C-p>{register} 按原义插入寄存器的文本

表达式寄存器:
<C-r>= 将表达式的结果插入文本中

<C-v>{code} 插入某个字符的编码值,编码包含三个值
<C-v>u{1234} 4位16进制数

<C-k>{char1}{char2} 插入以二合字母{char1}{char2}表示的字符

使用ga命令显示当前光标处字符的编码,分别以十进制和十六进制表示
:h digraph-table 查看二合字母表






插入-普通模式

是普通模式的一个特例,让我们执行一次普通模式的命令后又返回插入模式

1
2
3
<C-o>zz 在插入位置重绘屏幕


可视模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<C-g>在可视模式和选择模式切换
在选择模式输入任意字符,此字符会替换所选字符
在可视模式下,可以用c键来修改所选内容

v 面向字符
V 面向行
<C-v> 面向列块
gv 重选上次选区
o切换高亮选区的活动端
b键向左移动
e键向右移动

vit 选择标签的内容


如果有可能,最好用操作符命令,而不是可视命令


在可视模式中,i和a键沿用一个不同的约定,它们被当作一个文本对象

命令行模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/ 调出查找命令
<C-r>= 访问表达式寄存器

:edit 读文件
:write 写文件
:tabnew 创建新标签页
:split 水平分割窗口
:vsplit 垂直分割窗口


操作参数列表
:prev
:next

缓冲区列表
:bprev
:bnext

p 打印当前行
%p 打印整个文件

%代表当前文件的所有行

/<html>/,/<\/html>/p


t等价于copy
:6t. 第6行复制到当前行下方
:t6 把当前行复制到第6行下方

t. 等价于yyp
yyp会使用默认寄存器


'<,'>m$ 等价于dGp

@: 重复上一次的Ex命令

[range] normal. 在range范围执行普通模式下的.命令

%normal A; 在文件的所有行执行普通模式的A ;

<C-o> 回到跳转列表的上条记录


//设置使用bash 的命令补全
set wildmode=longest,list

:shell
exit 退出shell

:%s//counter/g
把匹配项替换为counter g指代所有匹配项都替换



history.vim
cnoremap <C-p> <Up>
cnoremap <C-n> <Down>


<C-z> 关起vim

jobs 查看挂起的作业

fg 用来唤醒挂起的作业

把缓冲区内容作为标准输入或输出
:read !{cmd} 把cmd输出写入当前缓冲区
:write !{cmd} 把缓冲区内容作为cmd的标准输入

:write! sh把缓冲区的内容写入一个名为sh的文件



Vim学习笔记(二)

1
2
3
4
5
:ls

% 哪个缓冲区在当前窗口可见

# 轮换文件 <C-^> 轮换文件

缓冲区

缓冲区

1
2
3
4
:w 把缓冲区内容写入磁盘
:edit! 回滚所做修改
:qall! 关闭所有窗口,放弃所有修改
:wall! 把所有改变写入磁盘

缓冲区移动

1
2
3
4
5
6
7
8
9
10
:bnext 下一个  简写 bn
:bprev 上一个 bp

:bfirst 第一个 bf
:blast 最后一个 bl

:b 数字编号

:bufdo ex命令 在所有缓冲期上执行EX命令

缓冲区删除

1
2
:1,3bd
:bd 1 2 3

参数列表

1
2
3
4
5
:args *.*  当前目录加入参数列表
:args **/*.js 递归进入指定目录的子目录
:args **/*.*

:args `cat .chapters`

遍历参数列表文件

1
2
:next
:preve

设置隐藏缓冲区

1
2
:set hidden
运行 argdo 和 bufdo 前,启用hidden设置

窗口

1
2
3
4
5
设置当前窗口的本地工作目录 
:lcn {path}

当包含子窗口时
:windo lcd {path} 为所有窗口设置本地工作目录

子窗口开启

1
2
3
<C-w>s  水平切分此窗口  等价于 :splist {file} 并在窗口中载入file
<C-w>v 垂直切分此窗口 等价于 :vsplit {file} 并在窗口中载入file
生成的子窗口和原窗口显示相同的缓冲区

窗口移动

1
2
3
4
5
<C-w>w  在窗口间循环移动
<C-w>h 切换到左边窗口
<C-w>j 切换到下边窗口
<C-w>k 切换到上边窗口
<C-w>l 切换到右边窗口

窗口关闭

1
2
<close>  关闭活动窗口
:only 只保留活动窗口

窗口大小及排列

1
2
3
4
5
<C-w>=  使所有窗口等宽,等高
<C-w>_ 最大化活动窗口的高度
<C-w>| 最大化活动窗口的宽度
[n]<C-w>_ 把活动窗口的高度设为n行
[n]<C-w>| 把活动窗口的宽度设为n列

标齐页

打开/关闭标签页

1
2
3
4
:tabe[dit] {filename} 新建标签页,并在其中打开filename
<C-w>T 把当前窗口移到一个新标签页
:tabc[close] 关闭当前标签页及其中所有窗口
:tabo[nly] 只保留活动标签页,关闭所有其它标签页

标签页跳转

1
2
3
{n}gt 跳转到标签页n    等价ex命令    :tabn[ext] {n}
gt 跳转到下一个标签页 等价ex命令 :tabn[ext]
gT 跳转到上一个标签页 等价ex命令 :tabp[revious]

标签页重排

1
2
3
:tabmove [n] 
n为0,当前标签页移到开头

用edit打开文件

1
2
:edit %:h <table> %代表活动区缓冲区的文件路径
cnoremap<expr> %% getcmdtype()==':'?expand('%:h').'/':'%%'

find打开文件

1
:set path+=app/**

netrw文件管理系统

vim . 打开当前所在目录

1
2
3
4
5
:e 目录地址 缺省为当前目录
:E 显示活动缓冲区所在目录

:Se 水平切分窗口
:Ve 垂直切分窗口

将文件保存到不存在的目录

1
:!mkdir -p %:h -p蚕食使mkdir创建任何不存在的中间目录  %:h 相对于缓冲区的路径

以root用户写入文件

1
2
3
:w !sodu tee % > /dev/nulll 
tee以root权限运行
%在vim命令行模式中指当前文件的完整路径

Vim学习笔记(三)

关标移动

命令 光标动作
gj 向下移动一个屏幕行
gk 向上移动一个屏幕行
0 移动到实际行行首
g0 移动到屏幕行行首
$ 移动到实际行行尾
g$ 移动到屏幕行行尾
^ 移动到实际行的第一个非空白字符
g^ 移动到屏幕行的第一个非空白字符

基于单词移动

命令 光标动作
w 正向移动到下一个单词的开头
W 正向移动到下一个字串开头
b 反向移动到当前单词/上一个单词开头
e 正向移动到当前单词/下一个单词结尾
ge 反向移动到上一个单词的结尾

字符查找

命令 光标动作
f字符 查找字符
F字符 反向查找字符
t字符 移动到下一个字符之处前一个字符上
T字符 移动到上一个字符之处后一个字符上
; 重复上次的字符查找命令
, 上一个匹配位置

d与查找结合

1
dt, 删除从当前字符开始到第一个,处

通过查找移动

命令 光标动作
v 进入可视模式
/字串 选中当前光标所在位置到查找到的字符光标之前的所有字符

用文本对象选择选区

vi} 选中{}直接的内容
a” 选中”之间的内容,包括”
i> 选中<>之间的内容
it 选中XML标签之间的内容
ci” 删除””之间的内容,并进入插入模式

文本对象

文本对象 选择范围
iw 当前单词
aw 当前单词及一个空格
iW 当前字串
aW 当前字串及一个空格
is 当前句子
as 当前句子及一个空格
ip 当前段落
ap 当前段落及一个空行

设置位置标记

1
2
m{a-zA-Z}  标记当前位置
`{mark}

Vim自动标记位置

位置标记 跳转到
`` 当前文件中上次跳转动作之前的位置
`. 上次修改的地方
`^ 上次插入的地方
`[ 上次修改或复制的起始位置
`] 上次修改或复制的结束位置
`< 上次高亮选区的起始位置
`> 上次高亮或选区的结束位置

匹配括号间跳转

1
% 在匹配括号间跳转

surround.vim

1
2
3
4
mkdir -p ~/.vim/pack/tpope/start
cd ~/.vim/pack/tpope/start
git clone https://tpope.io/vim/surround.git
vim -u NONE -c "helptags surround/doc" -c q
按键 结果
S” 将选中文字添加”
cs]} 将匹配的括号[] 替换为 {}

跳转动作

<c-o> <c-i>

命令 用途
[count]G 跳转到指定行号
/pattern<CR>/?pattern<CR>/n/N 跳转到下一个/上一个模式出现处
% 跳转到匹配的括号所在处
(/) 跳转到上一句/下一句开头
{/} 跳转到上一段/下一段开头
H/M/L 跳转到屏幕最上方/正中间/最下方
gf 跳转到关标下的文件名
<C-]> 跳转到关标下关键字的定义之处
`{mark}/‘{mark} 跳转到位置标记

遍历改变的列表

命令 跳转位置
g; 下一个跳转位置
g, 上一个跳转位置
gi 等价于 `^ 跳转到上次插入的位置

跳转到文件中的指定文件名

1
2
3
4
5
6
7
8
9
10
set suffixesadd+=.rb
gf 跳转到指定路径
<C-o> 返回

查看当前工作目录
:set path?
path=.,/usr/include,,
.代表当前文件所在目录
空字符代表工作目录

标记

1
m{A-Z}  `{A-Z}  在文件间跳转

mkdir mydir

cd mydir

vim f1

yy

9p

rm f1

find . -name “f1” -exec rm {} ;

Vim学习笔记(四)

寄存器

无名寄存器

对文本进行d与y操作,默认会把操作内容存到到无名寄存器

用p粘贴文本时,默认粘贴无名寄存器的内容

{a-z} 对应26个寄存器

使用时,例如

“ayiw 复制关标所在处的单词到寄存器a

“ap 将a中的内容粘贴至光标之前

黑洞寄存器

“_ 彻底删除

“+ 系统剪切板

“* 主剪切板

“0无名寄存器

其它寄存器

寄存器 内容
“% 当前文件名
“# 轮换文件名
“. 上次插入的文本
“: 上次执行的Ex命令
“/ 上次查找的模式

q+{a-z} 开始录制

q 结束录制

@{a-z} 执行宏

3@a 执行三次宏

Normal @a 在所有文件列表上执行宏a

设置变量,并给变量赋值

1
2
:let i=1
:let i+=1 递增i,并把i赋给新i

给宏附加指令

1
2
3
q+{A-Z} 开始录制

q 结束录制

Vim学习笔记(五) 模式

1
2
3
4
5
\c 忽略大小写查找
\C 强制区分大小写

ignorecase 不区分大小写
smartcase 当匹配小写字母时,不区分大小写,当匹配大写字母时区分大小写

若用正则表达式查找,用\v模式开工

1
2
3
4
5
6
7
8
body   { color: #3c3c3c; }
a { color: #0000EE; }
strong { color: #000; }

/\v#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})
使用\x代替字符集[0-9a-fA-F]
/\v#(\x{6}|\x{3})

按原义查找文本 \V

1
/\Va.k.a

匹配重复单词

1
2
3
4
/\v<(\w+)\_s+\1>

\w匹配单词类字符,包括字母,数字以及符号“_”
\W匹配除单词类字符以外的其它字符

界定单词边界

1
2
3
4
5
6
7
8
9
10
/\v<the>  这时只会匹配the,而不会匹配them their

使用圆括号,但不匹配其内容
/\v(W|w)angjun 可以匹配wangjun,也可以匹配Wangjun


将指定的名字的姓和名跌倒顺序
/\v(%(W|w)ang) (jun) 任何用圆括号内部的匹配文本都会被保存到一个临时仓库 有多个括号 依次用\1 \2 \3存储
\0永远会引用整个匹配
:%s//\2,\1/g

界定匹配的边界

\zs 开始

\ze 结尾

转义问题字符

1
2
3
4
5
6
7
8
9
http://vimdoc.net/search?q=/\\
当要查找上述地址时,/和\都属于特殊字符,需要进行转移

当正向查找时:/http:\/\/vimdoc.net\/search?q=\/\\\\
当反向查找时:?http://vimdoc.net/search?q=/\\

库函数实现自动转义
正向查找时 escape(@u,'/\') 他会为每个/\加上反斜杠前缀
反向查找,escape(@u,'?\') ?会当作查找域的结束符

查找高亮

1
2
3
4
5
6
7
set hlsearch
关闭高亮
set nohlsearch

设置快捷键短暂关闭高亮
nnoremap <silent> <C-l> : <C-u> nohlsearch<CR><Cl> 对应快捷键<C-u><C-l>

执行查找前预览第一处匹配

1
2
3
4
5
set incsearch

在按回车键时如果按esc键则回到原位

<C-r><C-w> 粘贴刚刚匹配的单词

匹配当前模式的匹配个数

1
:%s///gn

将光标移到查找匹配的结尾

1
2
/lang/e lang为待查找的词
//e 重用上一次查找模式