Vim学习笔记(一)
使用原厂配置
Vim -u NONE -N
-u NONE 让vim启动时不加载vimrc,插件也会被禁用
-N 不使用vi兼容模式
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 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 3 4 5
| :args *.* 当前目录加入参数列表 :args **/*.js 递归进入指定目录的子目录 :args **/*.*
:args `cat .chapters`
|
遍历参数列表文件
设置隐藏缓冲区
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打开文件
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与查找结合
通过查找移动
命令 |
光标动作 |
v |
进入可视模式 |
/字串 |
选中当前光标所在位置到查找到的字符光标之前的所有字符 |
用文本对象选择选区
vi} |
选中{}直接的内容 |
a” |
选中”之间的内容,包括” |
i> |
选中<>之间的内容 |
it |
选中XML标签之间的内容 |
ci” |
删除””之间的内容,并进入插入模式 |
文本对象
文本对象 |
选择范围 |
iw |
当前单词 |
aw |
当前单词及一个空格 |
iW |
当前字串 |
aW |
当前字串及一个空格 |
is |
当前句子 |
as |
当前句子及一个空格 |
ip |
当前段落 |
ap |
当前段落及一个空行 |
设置位置标记
1 2
| m{a-zA-Z} 标记当前位置 `{mark}
|
Vim自动标记位置
位置标记 |
跳转到 |
`` |
当前文件中上次跳转动作之前的位置 |
`. |
上次修改的地方 |
`^ |
上次插入的地方 |
`[ |
上次修改或复制的起始位置 |
`] |
上次修改或复制的结束位置 |
`< |
上次高亮选区的起始位置 |
`> |
上次高亮或选区的结束位置 |
匹配括号间跳转
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,, .代表当前文件所在目录 空字符代表工作目录
|
标记
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
|
给宏附加指令
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 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 2
| /lang/e lang为待查找的词 //e 重用上一次查找模式
|