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
控制搜索顺序,一旦找到立即停止。
默认搜索顺序:
-
$HOME/.vim
: linux home 目录下的用户个性化设置 - `$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 Aug , compiled May ::) 包含补丁: - 修改者 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" 编译方式: -Wformat -Wformat-security -Werror=format-s ecurity -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE= 链接方式: gcc -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--as-needed -o vim -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L /usr/lib/python2./config -lpython2. -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions 请按 ENTER 或其它命令继续
vim plugin 原理的更多相关文章
-
MyBatis源码分析(2)—— Plugin原理
@(MyBatis)[Plugin] MyBatis源码分析--Plugin原理 Plugin原理 Plugin的实现采用了Java的动态代理,应用了责任链设计模式 InterceptorChain ...
-
Good Vim plugin for python [Vim python mode]
Here I got a very neat plugin for vim which is awesome indeed. It's from youtube years before. So le ...
-
十個必用的 Vim Plugin
◎ The NERD Tree 操作 Vim 時,通常都在 Terminal 底下作用,無法像一般的 GUI 應用程式可以以樹狀目錄來瀏覽檔案. The NERD Tree 是一將檔案目錄 ...
-
VIM从原理上认识^M问题
问题背景 VIM在打开文件的时候如果遇到两种换行符风格(dos与unix)共存的文件,通常会在行尾显示出烦人的^M.如果^M较少,比较容易定位到哪几行出了问题,但是如果^M较多,就很难搞.下面先给出解 ...
-
webpack的plugin原理
plugin是webpack生态的重要组成,它为用户提供了一种可以直接访问到webpack编译过程的方式.它可以访问到编译过程触发的所有关键事件. 1. 基本概念 1. 如何实现一个插件 1. plu ...
-
gvim work notes.. a few days' work on 64bit vim and plugin compilations
(a 600MB+ sized c/c++ compiler which is capable of hi-light and JB styled completion!! and of-course ...
-
vim深入研究
About VIM--Unix及类Unix系统文本编辑器 Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.VIM是纯粹的*软件. Vim普遍被推崇 ...
-
Ubuntu14 搭载vim环境查看源码
首先是下载完整的vim74,然后编译安装.遗憾的是当编译时,没有开启图形界面. 在安装新版本的Vim之前,你需要卸载原来安装的老版本Vim,依次在终端下执行下列命令: sudo apt-get rem ...
-
【转】手把手教你把Vim改装成一个IDE编程环境(图文)
手把手教你把Vim改装成一个IDE编程环境(图文) By: 吴垠 Date: 2007-09-07 Version: 0.5 Email: lazy.fox.wu#gmail.com Homepage ...
随机推荐
-
BCL中String.Join的实现
在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的 ...
-
ubuntu14.04下的NVIDIA Tesla K80显卡驱动的安装教程
搞深度学习如何能够不与浑身是“核”的显卡打交道呢? 人工智能的兴起除了数据量的大量提升,算法的不断改进,计算能力的逐步提高,还离不开软件基础设施的逐步完善.当下的主流的深度学习工具软件无论是Caffe ...
-
SQL笔记 - CTE递归实例:显示部门全称
昨天在整理JS的Function时,示例是一个递归函数.说起递归,想起前段时间在搞CTE,那个纠结呀,看似容易,可我总抓不住门道,什么递归条件,什么结束条件,一头雾水...今天一大早就爬起来,果然不负 ...
-
MySQL学习笔记之数据存储类型
说明:本文是作者对MySQL数据库数据存储类型的小小总结. Numeric Type (数字类型) 1.TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT主要根据存储字节长度不 ...
-
JQuery Kendo UI使用技巧总结
Kendo UI开发总结 By Gloomyfish on 2013-04-25 在Grid中支持分页刷新: scrollable: {virtual : true }, 在Gr ...
-
windows新的数据类型
1.简单重定义的 如LPCSTR只字符串,只是名字不同 2.句柄类型 H开头的句柄 3.结构体类型 如对话框 4.重新更名一方面为了32位->64位升级时带来的麻烦 typedef unsign ...
-
Maven之(三)Maven插件
Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,像编译是通过maven-compile-plugin实现的.测试是通过maven-surefire-p ...
-
隐藏17年的Office远程代码执行漏洞(CVE-2017-11882)
Preface 这几天关于Office的一个远程代码执行漏洞很流行,昨天也有朋友发了相关信息,于是想复现一下看看,复现过程也比较简单,主要是简单记录下. 利用脚本Github传送地址 ,后面的参考链接 ...
-
he
弄好这个网站---to thi tha think 好这个---, 很温馨 那时候我还在看. 前一段时候看yibenhaoshu,走出来的才是理性,所以现在才是理性的看待的. 回头再看看两年前的事情, ...
-
vue(三)-父子组件通信
原因 : Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据.必须使用特定的方法才能实现组件之间的数据传递. props 父组件给子组件传递数据 props:作用是父组件给 ...