vim plugin 原理

系统 2192 0

vim 个性化设置与功能扩展均通过 script 来实现,这种 script 又叫 plugin。plugin 是 vim 的核心与精髓。

最常用的配置文件 vimrc,也是一种 plugin。换句话说,所有的 plugin 都在配置 vim 的行为。

plugin 类型及其相互关系

常见的 plugin 类型:

  • vimrc
  • global
  • filetype
  • syntax
  • compiler

vimrc 是核心 plugin (类似 main 函数),所有的配置都可以在这一个文件中完成。 所有其他配置都直接或间接由该文件调用以生效。

与其他编程语言一样,为了提高源文件的可读性,增加代码的可重用性等, 衍生出了 global/filetype/syntax/compile 等 4 中主要的 plugin。

通过 runtime , source 等命令加载其他 plugin。

vim 搜索路径

vim 通过路径区分 plugin 类型。 由 runtimepath 控制搜索顺序,一旦找到立即停止。

默认搜索顺序:

  1. $HOME/.vim : linux home 目录下的用户个性化设置
  2. `$VIMRUNTIME: 系统自带的 plugin

建议将个性化配置全部放在 $HOME/.vim 中, 与 vim 自带的配置文件隔离,方便备份。 vim 中执行 :echo $variable 查看变量取值.

查看默认 plugin 搜索路径:

      :set runtimepath?
      
        

runtimepath
      
      =~/.vim,/var/lib/vim/addons,/usr/share/vim/vimfiles,/usr/share/vim/
      
        

vim73,
      
      /usr/share/vim/vimfiles/after,/var/lib/vim/addons/after,~/.vim/after
    

plugin 安装

拷贝到对应的 plugin 目录下即可。

更新帮助文档,在 vim 中运行 :helptags ~/vimfiles/doc

global plugin

global plugin 位于 plugin 目录下,对全局生效,所以默认自动加载。

filetype plugin

filetype plugin 只对特定类型的文件生效。

根据文件类型动态决定行为,通过事件监听(autocmd)实现。 基本原理如下:

        
          "
        
        
           required
        
        
          filetype plugin on


        
        
          "
        
        
           define behavior when filetype change to `tt`
        
        
          

"
        
        
           here, the behavior is set to execute echo 
        
        
          "
        
        hello
        
          "
        
        

autocmd FileType tt 
        
          echo
        
        
          "
        
        
          hello
        
        
          "
        
        
          "
        
        
           execute cmd below, output 
        
        
          "
        
        hello
        
          "
        
        
           at the bottom of vim window
        
        

:set filetype=tt
      

如果没有用 autocmd 显式声明 xxx 文件对应的行为, 则加载 ftplugin 目录下的 xxx.vim

      :set filetype=
      
        c


      
      
        "
      
      
        expt: load c.vim and change highlight in c syntax
      
      
        

"
      
      
        required: c.vim in ftplugin, it is in $VIMRUNTIME/ftplugin by default
      
    

注意:使用 ftplugin 时,需要开启 filetype filetype plugin

      
        :filetype plugin on  " 开启 filetype 和 filetype plugin

:filetype  " 查看状态,输出如下

filetype detection:ON  plugin:ON  indent:ON
      
    

一个更深入 filetype plugin 的例子

      autocmd BufNewFile,BufRead *.xml source ~/.vim/ftplugin/xml.vim
    

同样是事件监听机制,区别在于:

  • 监听的事件: 创建或打开 .xml文件(BufNewFile,BufRead)
  • 执行的行为: 加载 ftplugin/xml.vim

syntax plugin

原理与 ftplugin 类似,监听 syntax 事件,加载 syntax 目录下的插件。 触发 filetype 事件的同时,也会触发对应的 syntax 事件。

      
        syntax on

:set syntax
      
      =c
    

compile plugin

同样是事件监听,插件位于 compiler 目录。

        
          "
        
        
           add below to vimrc
        
        

autocmd BufNewFile,BufRead *
        
          .py compiler python`


        
        
          "
        
        
           open a file ending with .py and run
        
        

:
        
          make
        
        
          "
        
        
           expt: errors printed
          

更多的一些细节

与 vi 的兼容性。

vim 在 vi 的基础上进行了很多的功能扩展。 若要使用 vim 的特性,vim 必须运行于与 vi 不兼容的模式。

一般,把 set noncompaible 放在配置文件开始处即可。
ubuntu 12.04 默认的 vimrc 先加载 ubuntu.vim, 其中设置了该选项。

vim feature-list

vim 自身有很多 feature, plugin 都依赖于相应的 feature.

为了使 vimrc 通用,使用 plugin 前先用 has() 检测feature 是否存在。 如下:

      
        if
      
       has(
      
        "
      
      
        syntax
      
      
        "
      
      
        )

  syntax on

endif
      
    

:version 查看 feature-list

      
        :version

VIM 
      
      - Vi IMproved 
      
        7.3
      
       (
      
        2010
      
       Aug 
      
        15
      
      , compiled May  
      
        4
      
      
        2012
      
      
        04
      
      :
      
        25
      
      :
      
        35
      
      
        )

包含补丁: 
      
      
        1
      
      -
      
        429
      
      
        

修改者 pkg
      
      -vim-
      
        maintainers@lists.alioth.debian.org

编译者 buildd@

巨型版本 无图形界面。  可使用(
      
      +)与不可使用(-
      
        )的功能:


      
      +arabic +autocmd -balloon_eval -browse ++builtin_terms +byte_offset +cindent -clientserver -clipboard +cmdline_compl +
      
        cmdline_hist


      
      +cmdline_info +comments +conceal +cryptv +cscope +cursorbind +cursorshape +dialog_con +
      
        diff
      
       +digraphs -dnd -ebcdic +emacs_tags +eval +
      
        ex_extra

 
      
      +extra_search +farsi +file_in_path +find_in_path +
      
        float
      
       +folding -footer +fork() +gettext -hangul_input +iconv +insert_expand +
      
        jumplist

 
      
      +keymap +langmap +libcall +linebreak +lispindent +listcmds +localmap -lua +menu +mksession +modify_fname +mouse -mouseshape +
      
        mouse_dec

 
      
      +mouse_gpm -mouse_jsbterm +mouse_netterm -mouse_sysmouse +mouse_xterm +mouse_urxvt +multi_byte +multi_lang -mzscheme +
      
        netbeans_intg

 
      
      +path_extra -
      
        perl
      
       +persistent_undo +postscript +printer +profile +python -python3 +quickfix +reltime +rightleft -ruby +scrollbind +
      
        signs

 
      
      +smartindent -sniff +startuptime +statusline -sun_workshop +syntax +tag_binary +tag_old_static -tag_any_white -tcl +terminfo +
      
        termresponse

 
      
      +textobjects +title -toolbar +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo +vreplace +wildignore +wildmenu +
      
        windows

 
      
      +writebackup -X11 -xfontset -xim -xsmp -xterm_clipboard -
      
        xterm_save

  系统 vimrc 文件: 
      
      
        "
      
      
        VIM/vimrc
      
      
        "
      
      
        

  用户 vimrc 文件: 
      
      
        "
      
      
        HOME/.vimrc
      
      
        "
      
      
        

    用户 exrc 文件: 
      
      
        "
      
      
        HOME/.exrc
      
      
        "
      
      
        

       VIM 预设值: 
      
      
        "
      
      
        /usr/share/vim
      
      
        "
      
      
        

编译方式: 
      
      
        gcc
      
       -c -I. -Iproto -DHAVE_CONFIG_H -g -O2 -fstack-protector --param=ssp-buffer-size=
      
        4
      
       -Wformat -Wformat-security -Werror=format-
      
        s

ecurity 
      
      -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=
      
        1
      
      
        

链接方式: 
      
      
        gcc
      
         -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--as-needed -o vim  -lm -ltinfo -lnsl  -lselinux  -lacl -lattr -lgpm -ldl     -
      
        L


      
      /usr/lib/python2.
      
        7
      
      /config -lpython2.
      
        7
      
       -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-
      
        functions

请按 ENTER 或其它命令继续
      
    

vim plugin 原理


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论