Vim 知识整理

继上次 Ubuntu 知识整理后, 今天对 Vim 进行一下整理.

Vim 教程推荐

Venture Into Vim

作者的英文发音挺奇怪的, 不过我觉得还蛮好听的, 尤其是那些弹舌音.

关于 buffer 的快捷键

退出在 buffer 中的文件

:bd[num]

查看 buffer 中的文件

:ls

在 buffer 中切换

:bn[ext]
:bp[revious]
:bf[irst]
:b[num]
:b#

bp 与 b# 的区别是, bp 的上一个针对的是在 ls 命令中显示的顺序, 而 b# 代表的是切换到上一次访问文件. b[num] 切换到 ls 中显示的对应编号的文件.

假如你 ls 显示的内容是下面这样的:

1 #     "file_a"
2       "file_b"
3 %a    "file_c"

expandtab, shiftwidth, softtabstop, tabstop 的区别与含义

" 使用空格代替 tab
set expandtab
" normal 模式下使用 >>, << 和 Insert 模式下使用 <C-t>, <C-d> 进行缩进的长度
set shiftwidth=4
" Insert 模式下使用 Tab 键进行缩进的长度
set softtabstop=4
" Tab 的长度. 如果没有开启 expandtab 选项, vim 会对缩进的空格进行转换, 假如缩进长度为 n, 将转换成 n / tabstop 个 tab 加 n % tabstop 个空格
set tabstop=8

要更好的理解这之间的区别就是要搞清楚缩进的含义. 缩进就是插入空格, 至于空格是否会被转换成制表符, 就需要看 expandtab 选项是否开启, 而空格如何转换成制表符则是根据 tabstop 的值来确定.

Note: 使用 set list 来显示不可见字符, 比如, 制表符对应的字符就是 ^I.

Vim 中删除空行

# :[range]g[lobal]/{pattern}/[cmd]
:g/^$/d

具体的关于 global 的使用方法可以使用 :h global 来查看手册.

zR 与 zi 的区别

zR: 设置 foldlevel 的值为最高值.

zi: 对 foldenable 的值取反.

Vim 中每一个 fold 都有一个开关的属性. 每次 set foldlevel 都会根据 foldlevel 的值修改每个 fold 的开关情况. set foldenable 则只设置全局是否开启折叠,并不会修改每个 fold 的开关情况.

这样的话 zR, zi 的区别就很好理解了

递增/递减数字

Ctrl-a/x: 光标所在位置如果是数字的话则加/减 1.

Vim 中限制替换区域

假如你有一段代码是这样的.

foo(){
    // do something
}

bar() {
    // do something
}

如果你希望使用 :s 命令在所有前面没有空格的大括号之前加上空格, 那么就需要使用到 \zs, \ze 来对替换区域进行限制.

:%s/)\zs{/ {/g

好吧, 我必须得承认这个例子举的很烂, 你完全可以不使用 \zs 来完成这个任务.

:%s/){/) {/g