Buffer-Local

这一章的内容结合了前面学到的知识.

Buffer-Local, 顾名思义, 基于 Buffer, 只针对当前 Buffer 有效.

前面遇到的 mappings, options , abbreviations, 当需要只对当前 Buffer 生效时, 命令分别是什么呢?

来逐个说明下.

  • mappings

    打开任意文件, 在命令行模式下, 输入:

    :nnoremap <buffer> <Leader>x dd

    normal 模式下, 按<Leader>x, 等同于dd, 删除当前行.

    此时, 另开一个文件, 执行同样的操作, 按<Leader>x , 没有变化.

    Buffer-Local mappings 跟通用的 mappings 不一样的地方, 就是多了一个<buffer>, 也很好记.

    需要稍稍注意的是, 当 buffer 与<Leader> 结合时, 建议使用 <LocalLeader> 来代替 <Leader>, 这样避免覆盖了他人的 <leader> mapping.

    上面的例子建议改成:

    :nnoremap <buffer> <LocalLeader>x dd

    再看个例子:

    :nnoremap <buffer> Q x
    :nnoremap Q dd

    normal 模式下, 按 Q, 发现执行的操作等同 x. 第二个 mapping 配置无效.

    Buffer-Local mappings 会覆盖对应的通用的 mappings 配置.这点同 set options 不大一样, 待会会提到.

  • set options

    基于 Buffer-Local 的设置, 用命令 setlocal.

    打开任意文件, 在命令行模式下, 输入:

    :set number
    :setlocal nonumber

    会发现行号已经消失.

    需要注意的是, 如果 setlocal option 后, 又 set 了同一个 option, 则 setlocal 所做的改变会被覆盖.

    比如:

    :setlocal nonumber
    :set number
    :setlocal number?

    此时输出的结果是 number.

  • abbreviations

    同 mappings, Buffer-Local abbreviations 也只需要在abbrev 后, 添加一个<buffer>, 看个例子:

    在当前打开的文件下, 命令行模式输入:

    :iabbrev <buffer> log logger.debug

    切换到 insert 模式, 输入log, 会替换成 logger.debug.

    此时, 更换另一个文件, 再次在 insert 模式下, 输入log, 发现没有变化.

    同 mappings 一样, Buffer-Local abbreviations 会覆盖通用的 abbreviations.

    刚刚设置的文件中, 命令行模式输入:

    :iabbrev log logger.info

    切换到 insert 模式, 输入log, 替换的仍然是 Buffer-local 设置的 logger.debug.

OK. Buffer-Local 基本缕完, 下一章来点不一样的.