├── .gitattributes ├── .gitignore ├── README.md ├── base.vimrc ├── bundle └── .gitkeep ├── init.vim ├── neo ├── base.vimrc └── neoterm.vimrc ├── rc ├── base.vimrc ├── bundle.vimrc ├── default.vimrc ├── head.vimrc ├── hotkeys │ ├── base.vimrc │ ├── ctrlp.vimrc │ ├── dict.vimrc │ └── rails.vimrc ├── tail.vimrc ├── themes.vimrc └── type.vimrc ├── require.vimrc ├── utils ├── base.vimrc ├── dict.vimrc ├── file.vimrc ├── json.vimrc ├── stack.vimrc ├── utils.vimrc └── xml.vimrc └── vimrc /.gitattributes: -------------------------------------------------------------------------------- 1 | *.vimrc linguist-language=VimL 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | bundle/* 3 | .netrwhist 4 | /test/* 5 | .back_up/* 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BlxVimrc 2 | 1. [简介](#简介) 3 | 2. [require.vimrc简介](#requirevimrc简介) 4 | 3. [安装](#安装) 5 | 4. [使用](#使用) 6 | 5. [require.vimrc使用](#requirevimrc使用) 7 | 6. [扩展](#扩展) 8 | 9 | ## 简介: 10 | BlxVimrc是本人自用的一套Vim编辑器配置。BlxVimrc建立在一套完善的模块系统require.vimrc之上。相比现在网上动辄上千行挤在一起的vimrc,BlxVimrc良好的模块化机制使得其更容易理解、维护以及扩展。并且,BlxVimrc也能良好的支持NeoVim。 11 | 12 | BlxVimrc的目的并不是将Vim配置成一个功能强大的IDE。BlxVimrc的默认功能非常有限,只有基础的编辑增强功能,并且也并不华丽。BlxVimrc的目的更多的是做好一个编辑器,而不是伪装成一个IDE。如果你需要很多IDE才有强大功能,如调试或者重构,那么建议你使用Vim来编辑,用IDE来调试重构,而不是企图把一个编辑器强行该造成IDE。 13 | 14 | ## require.vimrc简介: 15 | require.vimrc是使用纯粹的VimScript在VimScript语言层面上模拟了一套类似NodeJs中的模块系统。require.vimrc的使用和NodeJs类似,它的模块(Module)定义和Ruby有些相似,他的包(Packge)的结构和Python类似。具体的例子可以看第四节的[扩展](#扩展),那里将会告诉你如何使用require.vimrc 16 | 17 | require.vimrc中的模块是在VimScript运行中动态加载的,所以你可以选择在你想要的时候进行模块的加载。require.vimrc自带缓存,同样的一个包或者模块只会被加载运行一次。在require.vimrc系统中,模块或者包之间的相互依赖也能够良好的处理,不会像Python那样出现不能相互依赖的蛋疼问题。 18 | 19 | 虽然我个人觉得我的解决方案是挺好的,但是 NeoVim 的作者 tarruda 明确表示了我做的东西其实毫无卵用 ╮(╯▽╰)╭,以下是他对我这东西的评价: 20 | 21 | Very interesting, thanks for sharing. 22 | 23 | A module system like this is a good way to organize big programs/libraries written in a language that has no concept of modules like javascript(pre ES6). There are a few problems with doing this for vimscript though: 24 | 25 | * .The majority of vimscript code is already out there and incompatible with this pattern 26 | 27 | * .It lacks closures, so every "variable" is exported. 28 | 29 | * .It's not possible to convert existing code to use this pattern(unlike javascript, where one can convert an existing library that doesn't understand the module system by wrapping it into a closure) 30 | * .There's nothing to encourage developers to start writing vimscript this way. With node.js, the biggest motivator were it's package echosystem and the fact that no widespread server-side javascript platform existed. 31 | * .Mostly my personal opinion, but vimscript is a bad language for writing large programs despite having a module system, so I wouldn't recommend it for anything but basic vim/nvim scripting. 32 | 33 | 34 | ## 安装: 35 | ### 1.备份或者删除 ~/.vim, ~/.vimrc 等配置文件 36 | ```sh 37 | $ mv ~/.vim ~/.vimrc 38 | # or 39 | $ rm ~/.vim ~/.vimrc -rf 40 | ``` 41 | 42 | ### 2.直接clone到 ~/.vim 43 | ```sh 44 | $ git clone https://github.com/bramblex/BlxVimrc.git ~/.vim 45 | ``` 46 | 47 | ### 2.将 ~/.vim 的 vimrc 软链出来 48 | ```sh 49 | $ ln -s ~/.vim/vimrc ~/.vimrc 50 | ``` 51 | 52 | ### 3.安装vundle插件管理器 53 | ```sh 54 | $ git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim 55 | ``` 56 | 57 | ### 4.进入vim,安装插件 58 | ```VimL 59 | :BundleInstall 60 | ``` 61 | 62 | ### 5.等待插件安装完毕后重启vim 63 | 64 | ## 使用 65 | 使用主要就是快捷键的事情了。在 BlxVimrc/rc/hotkeys/ 目录下会有介绍。看看就能够明白的。 66 | 67 | ## require.vimrc使用 68 | ### 1.加载一个模块或者包 69 | 70 | ```VimL 71 | " 加载当前脚本下的模块或者包 72 | call Require('module') " 不在乎返回 73 | let module = Require('module') " 在乎返回 74 | ``` 75 | 76 | ### 2.定义一个模块 77 | ```VimL 78 | " hello_module.vimrc 79 | function Module.Define() 80 | self.text = 'Hello World!' 81 | function self.run() 82 | echo self.text 83 | endfunction 84 | endfunction 85 | ``` 86 | 87 | 加载执行上面那个模块 88 | ```VimL 89 | let hello_module = Require('hello_module') 90 | call hello_module.run() " => Hello World! 91 | ``` 92 | 93 | ### 3.定义一个包 94 | ```VimL 95 | " hello_package/base.vimrc 96 | function Module.Define() 97 | self.text = 'Hello World!' 98 | function self.run() 99 | echo self.text 100 | endfunction 101 | endfunction 102 | ``` 103 | 加载执行上面那个包 104 | ```VimL 105 | let hello_package = Require('hello_package') 106 | call hello_package.run() " => Hello World! 107 | ``` 108 | 109 | ## 扩展: 110 | 扩展才是BlxVimrc的重头戏。 111 | 112 | 我们看看我们的vimrc文件。这个文件是Vim配置文件的入口,各位Vimer肯定都知道的。我们的BlxVimrc/vimrc中总够只有一下三行代码。 113 | ```VimL 114 | let g:require_base_module = resolve(expand(':p')) 115 | exec 'source ' . resolve(fnamemodify(g:require_base_module, ':h'). '/require.vimrc') 116 | call Require('./') " 117 | ``` 118 | 119 | 接下来我们来看BlxVimrc的目录结构 120 | ``` 121 | BlxVimrc 122 | ├── README.md 123 | ├── base.vimrc 124 | ├── init.vim 125 | ├── neo 126 | │   └── base.vimrc 127 | ├── rc 128 | │   ├── base.vimrc 129 | │   ├── bundle.vimrc 130 | │   ├── head.vimrc 131 | │   ├── hotkeys 132 | │   │   ├── base.vimrc 133 | │   │   ├── conque.vimrc 134 | │   │   ├── ctrlp.vimrc 135 | │   │   ├── dict.vimrc 136 | │   │   └── rails.vimrc 137 | │   ├── tail.vimrc 138 | │   ├── themes.vimrc 139 | │   └── type.vimrc 140 | ├── require.vimrc 141 | ├── utils 142 | │   ├── base.vimrc 143 | │   ├── dict.vimrc 144 | │   ├── file.vimrc 145 | │   ├── json.vimrc 146 | │   ├── stack.vimrc 147 | │   ├── utils.vimrc 148 | │   └── xml.vimrc 149 | └── vimrc 150 | ``` 151 | 152 | BlxVimrc由vimrc作为入口,然后把当前目录当成一个包进行加载。然后每一个包都会加载各自的模块和包。 153 | 154 | neo包里面包含了一些对于NeoVim的配置,rc包里面包含了所有的基本配置。 155 | 156 | utils包比较特殊,里面包含了一些我自己实现的vimscript库。 157 | -------------------------------------------------------------------------------- /base.vimrc: -------------------------------------------------------------------------------- 1 | 2 | function Module.Define() 3 | let g:utils = Require('utils') 4 | 5 | call Require('rc') 6 | if has('nvim') 7 | call Require('neo') 8 | endif 9 | 10 | endfunction 11 | -------------------------------------------------------------------------------- /bundle/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bramblex/BlxVimrc/fb0689fec6c49e7dc53e5f7813cdd6cf574cfbf9/bundle/.gitkeep -------------------------------------------------------------------------------- /init.vim: -------------------------------------------------------------------------------- 1 | """""""""""""""""""""""""""""""""""""""" 2 | " BlxVimrc 3 | " 4 | " auth: brambles 5 | " email: qjnight@gmail.com 6 | " date: 2015-2-18 7 | 8 | let g:require_base_module = resolve(expand(':p')) 9 | exec 'source ' . resolve(fnamemodify(g:require_base_module, ':h'). '/require.vimrc') 10 | call Require('./') 11 | -------------------------------------------------------------------------------- /neo/base.vimrc: -------------------------------------------------------------------------------- 1 | 2 | "echo 'Hello Neo' 3 | set ttimeout 4 | set ttimeoutlen=0 5 | set updatetime=500 6 | set mouse-=a 7 | 8 | call Require('neoterm') 9 | 10 | -------------------------------------------------------------------------------- /neo/neoterm.vimrc: -------------------------------------------------------------------------------- 1 | 2 | "let $NVIM_TUI_ENABLE_TRUE_COLOR=1 3 | 4 | tnoremap h 5 | tnoremap j 6 | tnoremap k 7 | tnoremap l 8 | 9 | tnoremap :tabn 10 | tnoremap :tabp 11 | tnoremap d :q! 12 | 13 | noremap c :call g:OpenTerminal() 14 | function g:OpenTerminal() 15 | if winheight(0) > 40 16 | below new 17 | else 18 | tabnew 19 | endif 20 | exec "terminal " . $SHELL 21 | endfunction 22 | 23 | "au TermOpen * :echo 'aaa' 24 | "au TermClose * :echo 'aaa' 25 | -------------------------------------------------------------------------------- /rc/base.vimrc: -------------------------------------------------------------------------------- 1 | function Module.Define() 2 | 3 | call Require('default') 4 | 5 | call Require('head') 6 | 7 | call Require('bundle') 8 | call Require('hotkeys') 9 | call Require('themes') 10 | call Require('type') 11 | 12 | call Require('tail') 13 | 14 | endfunction 15 | -------------------------------------------------------------------------------- /rc/bundle.vimrc: -------------------------------------------------------------------------------- 1 | 2 | """""""""""""""""""""""""""""""""" 3 | " Vundle 插件管理器 4 | 5 | set nocompatible " be iMproved, required 6 | filetype off " required 7 | set rtp+=~/.vim/bundle/Vundle.vim 8 | call vundle#begin() 9 | 10 | " @TODO 不能動態加載插件簡直無情……如果不行的花電視見自己造一個 11 | 12 | " Vundle插件管理器 13 | Plugin 'gmarik/Vundle.vim' 14 | 15 | " BlxMolokai 16 | Plugin 'bramblex/molokai' 17 | 18 | " SuperTab 把补全键换成Tab 19 | Bundle "ervandew/supertab" 20 | let g:SuperTabDefaultCompletionType = '' 21 | 22 | " 自动补全单引号,双引号等 23 | Bundle 'Raimondi/delimitMate' 24 | 25 | Bundle 'tpope/vim-surround' 26 | " cs + a + b chang a -> b 27 | " ys + (text object) add 28 | " c/d/v + i + '/"/(/{/' 62 | 63 | " 关闭备份 64 | set nobackup 65 | set noswapfile 66 | 67 | "set clipboard+=unnamed " 共享剪贴板 68 | 69 | -------------------------------------------------------------------------------- /rc/hotkeys/base.vimrc: -------------------------------------------------------------------------------- 1 | 2 | """""""""""""""""""""""""""""""""""""""" 3 | " VIM快捷鍵設置 4 | 5 | " 回退以及追進光標位置 6 | 7 | " Leader鍵 8 | let mapleader='\' 9 | let g:mapleader = '\' 10 | 11 | " 基本操作 12 | nnoremap q :q 13 | nnoremap w :w 14 | cmap w!! w !sudo tee > /dev/null % 15 | 16 | " 切換buffer 17 | "nnoremap :MBEbn 18 | "nnoremap :MBEbp 19 | "nnoremap d :MBEbd 20 | "nnoremap d :MBEbw 21 | nnoremap :bn 22 | nnoremap :bp 23 | nnoremap d :bd 24 | 25 | " NERDTree快捷鍵 26 | "nnoremap e :NERDTreeToggle 27 | 28 | " 窗口操作 29 | nnoremap v v 30 | nnoremap s s 31 | 32 | nnoremap l 33 | nnoremap h 34 | nnoremap j 35 | nnoremap k 36 | 37 | " 去除搜索後留下的高亮 38 | nnoremap / :nohl 39 | 40 | " 粘貼模式 41 | set pastetoggle= 42 | 43 | " 寄存器優化 44 | 45 | " 利用寄存器 46 | noremap y "*y 47 | noremap p "*P 48 | 49 | 50 | 51 | " 自动注释 52 | vmap / \c 53 | nmap // \c 54 | imap / \c$a 55 | 56 | " 分屏幕同步滾動 57 | "let utils = Require('utils') 58 | "nnoremap b :call utils.ToggleScrollBinding() 59 | 60 | " 插入命令的輸出 61 | " 例如: 62 | " 1.輸入date則插入時間 63 | " 2.輸入cal則插入日曆 64 | " 3.輸入ls則插入當前目錄下的文件列表 65 | nnoremap r :silent read! 66 | 67 | " 文件管理器快捷鍵 68 | " % create a new file 69 | " d create a new directory 70 | " R rename the file/directory 71 | " D Delete the file/directory 72 | " nnoremap e :call g:ToggleExplore() 73 | "nnoremap e :NERDTreeToggle 74 | "let file = Require('file') 75 | "nnoremap % :call utils.file.ChooseAndEdit('') 76 | "nnoremap e :call utils.file.ChooseAndEdit(utils.file.Dirname('%')) 77 | 78 | " Git相關 79 | nnoremap g :!git 80 | nnoremap gc :!git add -A && git commit -a 81 | nnoremap gp :!git push 82 | nnoremap gs :!git status 83 | 84 | " 輸出模板 85 | "nnoremap t :call g:RenderTemplate() 86 | 87 | " 选择替换搜索 88 | nnoremap S :%s///g 89 | vnoremap S :s///g 90 | 91 | call Require('rails') 92 | call Require('dict') 93 | call Require('ctrlp') 94 | 95 | " End 96 | """""""""""""""""""""""""""""""""""""""" 97 | -------------------------------------------------------------------------------- /rc/hotkeys/ctrlp.vimrc: -------------------------------------------------------------------------------- 1 | 2 | let g:ctrlp_map = '' 3 | -------------------------------------------------------------------------------- /rc/hotkeys/dict.vimrc: -------------------------------------------------------------------------------- 1 | 2 | command! -nargs=1 Dict call utils.dict.Dict() 3 | nnoremap t :Dict 4 | 5 | vnoremap t :call utils.dict.DictSelectedWord() 6 | 7 | command! -nargs=1 Say call utils.dict.Say() 8 | vnoremap s :call utils.dict.SayBySelected() 9 | -------------------------------------------------------------------------------- /rc/hotkeys/rails.vimrc: -------------------------------------------------------------------------------- 1 | 2 | " Ruby on Rails 快捷键设定 3 | nnoremap r :!rails 4 | 5 | nnoremap rg :!rails generate 6 | nnoremap rgc :!rails generate controller 7 | nnoremap rgm :!rails generate model 8 | 9 | nnoremap rgd :!rails generate migration 10 | nnoremap rdm :!rake db:migrate 11 | 12 | nnoremap rt :!rspec 13 | nnoremap rt :exec '!rspec ' . utils.file.CurrentFile() 14 | 15 | imap = <%= %> 16 | imap % <% %> 17 | -------------------------------------------------------------------------------- /rc/tail.vimrc: -------------------------------------------------------------------------------- 1 | 2 | " 切换buffer的时候不会要求一定要保存 3 | set showcmd 4 | set bufhidden=hide 5 | -------------------------------------------------------------------------------- /rc/themes.vimrc: -------------------------------------------------------------------------------- 1 | 2 | """""""""""""""""""""""""""""""""""""""" 3 | " VIM外觀配置 4 | 5 | "let g:molokai_original = 1 6 | "let g:molokai_original_background = 1 7 | colorscheme molokai 8 | "colorscheme monokai 9 | set t_Co=256 10 | 11 | "文件编码,防止中文乱码 12 | set fileencodings=utf-8,gb2312,gb18030,gbk,ucs-bom,cp936,latin1 13 | set enc=utf8 14 | set fencs=utf8,gbk,gb2312,gb18030 15 | 16 | " airline 17 | set laststatus=2 18 | let g:airline_powerline_fonts = 1 19 | let g:airline_theme='bubblegum' 20 | let g:airline#extensions#tabline#enabled = 1 21 | let g:airline_mode_map = { 22 | \ '__' : '-', 23 | \ 'n' : 'N', 24 | \ 'i' : 'I', 25 | \ 'R' : 'R', 26 | \ 'c' : 'C', 27 | \ 'v' : 'V', 28 | \ 'V' : 'V', 29 | \ '' : 'V', 30 | \ 's' : 'S', 31 | \ 'S' : 'S', 32 | \ '' : 'S', 33 | \ } 34 | let g:airline#extensions#tabline#buffer_idx_mode = 1 35 | nmap 1 AirlineSelectTab1 36 | nmap 2 AirlineSelectTab2 37 | nmap 3 AirlineSelectTab3 38 | nmap 4 AirlineSelectTab4 39 | nmap 5 AirlineSelectTab5 40 | nmap 6 AirlineSelectTab6 41 | nmap 7 AirlineSelectTab7 42 | nmap 8 AirlineSelectTab8 43 | nmap 9 AirlineSelectTab9 44 | "set noshowmode 45 | "let g:airline_detect_whitespace=0 46 | " 47 | let g:ctrlp_by_filename = 1 48 | "let g:airline#extensions#tabline#left_sep = ' ' 49 | "let g:airline#extensions#tabline#left_alt_sep = '/' 50 | "let g:airline#extensions#tabline#right_sep = ' ' 51 | "let g:airline#extensions#tabline#right_alt_sep = '|' 52 | 53 | " 命令行(在状态行下)的高度,默认为1,这里是2 54 | "set statusline=%<%f\ %h%m%r%=%k[%{(&fenc==\"\")?&enc:&fenc}%{(&bomb?\",BOM\":\"\")}]\ %-14.(%l,%c%V%)\ %P 55 | 56 | " 行列的高亮顏色 57 | "hi CursorLine cterm=NONE ctermbg=black ctermfg=NONE guibg=black guifg=NONE 58 | "hi CursorColumn cterm=NONE ctermbg=black ctermfg=NONE guibg=black guifg=NONE 59 | 60 | " minibufexpl 的颜色设置 61 | " MBENormal 62 | " MBEChanged 63 | " MBEVisibleNormal 64 | " MBEVisibleChanged 65 | " MBEVisibleActiveNormal 66 | " MBEVisibleActiveChanged 67 | 68 | "let g:miniBufExplForceSyntaxEnable=1 69 | "let g:miniBufExplSplitBelow = 0 70 | "let g:miniBufExplForceSyntaxEnable = 0 71 | "let g:miniBufExplMapCTabSwitchBufs = 1 72 | "let g:miniBufExplMapWindowNavVim = 1 73 | "let g:miniBufExplMapWindowNavArrows = 1 74 | "let g:miniBufExplMaxSize = 0 75 | "let g:miniBufExplModSelTarget = 1 76 | "let g:miniBufExplTabWrap = 1 77 | "let g:miniBufExplUseSingleClick = 1 78 | "let g:miniBufExplCheckDupeBufs = 0 79 | "hi MBENormal guifg=darkgrey ctermfg=darkgrey 80 | "hi MBEVisibleNormal cterm=underline guifg=grey ctermfg=grey 81 | "hi MBEVisibleActiveNormal cterm=underline guifg=lightyellow ctermfg=lightyellow 82 | 83 | " 更改molokai蛋疼選中的顏色 84 | hi Visual cterm=inverse ctermbg=235 gui=inverse guibg=235 85 | "hi Visual ctermbg=lightgrey guibg=lightgrey 86 | 87 | "set background=dark 88 | 89 | " End 90 | """""""""""""""""""""""""""""""""""""""" 91 | -------------------------------------------------------------------------------- /rc/type.vimrc: -------------------------------------------------------------------------------- 1 | 2 | " Default 3 | "au BufEnter * :call utils.RefreshFileType(&filetype) 4 | au FileType * :call utils.utils.SetTabWidth(4) 5 | au FileType * :set bufhidden=hide 6 | 7 | " ruby on rails 8 | au FileType ruby,eruby,coffee,yaml :call utils.utils.SetTabWidth(2) 9 | 10 | " html or js 11 | au FileType javascript,html :call utils.utils.SetTabWidth(2) 12 | 13 | " netrw 14 | "au BufEnter * :call file.RangerInsteadNertw() 15 | -------------------------------------------------------------------------------- /require.vimrc: -------------------------------------------------------------------------------- 1 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 2 | " Require Module for VimScript 3 | " 4 | " Auth: Brambles 5 | " Email: qjnight@gmail.com 6 | " Respone: https://github.com/bramblex/BlxVimrc.git 7 | " Date: Wed Jun 17 2015 8 | " 9 | "=================== Configure ============================== 10 | let s:conf = {} 11 | let s:conf.module_subfix = '.vimrc' 12 | let s:conf.package_mainfile = 'base' . s:conf.module_subfix 13 | 14 | "=============== Path ===================================== 15 | let s:path = {} 16 | let s:path.separator = '/' 17 | 18 | function s:path.trip(str) 19 | return substitute(a:str, '^\s*\(.\{-}\)\s*$', '\1', '') 20 | endfunction 21 | 22 | function s:path.join(...) 23 | return simplify(join(a:000, self.separator)) 24 | endfunction 25 | 26 | function s:path.file_name(path) 27 | let path = self.trip(a:path) 28 | if path[-1] == self.separator 29 | let path = path[0: -2] 30 | endif 31 | return join(split(fnamemodify(path, ':t'), '.')[0: -2], '') 32 | endfunction 33 | 34 | function s:path.absolute(path) 35 | return resolve(a:path) 36 | endfunction 37 | 38 | function s:path.expand(base, path) 39 | endfunction 40 | 41 | "================= Module Context ========================== 42 | let s:context = {} 43 | let s:context.__content__ = [] 44 | 45 | function s:context.push(path) 46 | 47 | let c = {} 48 | let c.path = a:path 49 | let c.real_path = s:path.absolute(a:path) 50 | let c.dirname = fnamemodify(a:path, ':h') 51 | 52 | call add(self.__content__, c) 53 | let g:Module = self.__content__[-1] 54 | endfunction 55 | 56 | function s:context.pop() 57 | call remove(self.__content__, -1) 58 | let g:Module = self.__content__[-1] 59 | endfunction 60 | 61 | if !exists('g:require_base_module') 62 | let g:require_base_module = expand(':p') 63 | end 64 | call s:context.push(g:require_base_module) 65 | 66 | "================= Load & Excute & Stroe module ============ 67 | let s:Modules = {} 68 | function s:LoadModule(module_path, force) 69 | "=================== 70 | call s:context.push(a:module_path) 71 | 72 | if has_key(s:Modules, g:Module.real_path) && !a:force 73 | return s:Modules[g:Module.real_path] 74 | endif 75 | 76 | let s:Modules[g:Module.real_path] = {} 77 | let l:module = s:Modules[g:Module.real_path] 78 | 79 | exec 'source ' . a:module_path 80 | if has_key(g:Module, 'Define') 81 | 82 | if has('patch1584') 83 | let l:Define = function(g:Module.Define) 84 | let l:module.Define = l:Define 85 | call l:module.Define() 86 | else 87 | let l:Define = g:Module.Define 88 | let l:module.Define = l:Define 89 | call l:module.Define() 90 | if l:module.Define == l:Define 91 | call remove(l:module, 'Define') 92 | endif 93 | endif 94 | 95 | endif 96 | 97 | call s:context.pop() 98 | "=================== 99 | 100 | return l:module 101 | endfunction 102 | 103 | "================ Require Interface ======================== 104 | function Require(module_name) 105 | let module_path = s:path.absolute( 106 | \s:path.join(g:Module.dirname, s:path.trip(a:module_name))) 107 | 108 | if isdirectory(module_path) 109 | let package_mainfile = s:path.join(module_path, s:conf.package_mainfile) 110 | if filereadable(package_mainfile) 111 | return s:LoadModule(package_mainfile, 0) 112 | endif 113 | endif 114 | 115 | let module_file_path = module_path . s:conf.module_subfix 116 | if filereadable(module_file_path) 117 | return s:LoadModule(module_file_path, 0) 118 | endif 119 | 120 | echoerr 'BLXE002: Can not find module or package: ' . a:module_name 121 | \ . ' in ' . g:Module.path 122 | endfunction 123 | 124 | " Vim 125 | " vim: set filetype=vim 126 | " 127 | " Emacs 128 | " -*- mode: vim; -*- 129 | -------------------------------------------------------------------------------- /utils/base.vimrc: -------------------------------------------------------------------------------- 1 | function Module.Define() 2 | let self.utils = Require('utils') 3 | let self.file = Require('file') 4 | let self.json = Require('json') 5 | 6 | endfunction 7 | -------------------------------------------------------------------------------- /utils/dict.vimrc: -------------------------------------------------------------------------------- 1 | 2 | let s:utils = Require('utils') 3 | 4 | function! s:Dict(word) 5 | let dict_path = g:config.Get('dict_path') 6 | let result = system(printf('%s %s', dict_path, a:word)) 7 | " 使用quickfix窗口显示内容 8 | cexpr result 9 | caddexpr "\n" 10 | cwindow 11 | endfunction 12 | 13 | function! s:DictSelectedWord() 14 | let word = s:utils.GetSelectOnALine() 15 | call s:Dict(word) 16 | endfunction 17 | 18 | function! s:SayBySelected() 19 | let text = s:utils.GetSelectOnALine() 20 | call s:Say(text) 21 | endfunction 22 | 23 | function! s:Say(text) 24 | call system('say '.a:text.'&') 25 | endfunction 26 | 27 | call Exports('Dict',function('s:Dict')) 28 | \('DictSelectedWord',function('s:DictSelectedWord')) 29 | \('Say',function('s:Say')) 30 | \('SayBySelected',function('s:SayBySelected')) 31 | -------------------------------------------------------------------------------- /utils/file.vimrc: -------------------------------------------------------------------------------- 1 | function Module.Define() 2 | 3 | let self.ranger = 'ranger' 4 | 5 | function self.AbsolutePath(path) 6 | return fnamemodify(expand(a:path), ':p') 7 | endfunction 8 | 9 | function self.Dirname(path) 10 | return fnamemodify(expand(a:path), ':p:h') 11 | endfunction 12 | 13 | function self.CurrentFile() 14 | return self.AbsolutePath('%') 15 | endfunction 16 | 17 | if has('nvim') 18 | function self.ChooseAndEdit(dir_path) 19 | let tmp_file = tempname() 20 | let path = self.AbsolutePath(a:dir_path) 21 | 22 | let rangerCallback = { 23 | \'name': 'ranger', 24 | \'tmp_file': tmp_file } 25 | function! rangerCallback.on_exit(id, code) 26 | bdelete! 27 | if filereadable(self.tmp_file) 28 | exec 'edit '. system('cat '. self.tmp_file) 29 | silent call system('rm -rf ' . self.tmp_file) 30 | endif 31 | endfunction 32 | 33 | tabnew 34 | call termopen( join([self.ranger, path, '--choosefile=' . tmp_file], ' '), rangerCallback) 35 | startinsert 36 | endfunction 37 | else 38 | function self.ChooseFile(dir_path) 39 | let tmp_file = tempname() 40 | let path = self.AbsolutePath(a:dir_path) 41 | 42 | silent exec join(['!', self.ranger, path, '--choosefile=' . tmp_file], ' ') 43 | redraw! 44 | 45 | let result = 0 46 | if filereadable(tmp_file) 47 | silent let result = system('cat '. tmp_file) 48 | endif 49 | silent call system('rm -rf ' . tmp_file) 50 | return result 51 | endfunction 52 | 53 | function self.ChooseAndEdit(dir_path) 54 | let file = self.ChooseFile(a:dir_path) 55 | if filereadable(file) 56 | exec 'edit '. file 57 | endif 58 | endfunction 59 | end 60 | 61 | endfunction 62 | -------------------------------------------------------------------------------- /utils/json.vimrc: -------------------------------------------------------------------------------- 1 | " Json := Object 2 | " | List 3 | " | String 4 | " | Number 5 | " | Boolean 6 | " | Null 7 | " 8 | " Object := '{' KeyValueList '}' 9 | " KeyValueList := KeyValue | KeyValue ',' KeyValueList | ε 10 | " KeyValue := String ':' Json 11 | " 12 | " List := '[' ListBody ']' 13 | " ListBody := Json | Json ',' ListBody | ε 14 | " 15 | " String := /".*[^\\]?"/ 16 | " Number := /\d+|\d+\.\d+/ 17 | " Boolean := /true|false/ 18 | " Null := /null/ 19 | 20 | function Module.Define() 21 | " Interface 22 | function self.parse(json_string) 23 | let l:token_stream = s:lex(a:json_string) 24 | return s:parseJson(l:token_stream, 0)[0] 25 | endfunction 26 | 27 | function self.load(path) 28 | if filereadable(a:path) 29 | return self.parse(join(readfile(a:path), "\n")) 30 | else 31 | throw 'Read File Error' 32 | endif 33 | endfunction 34 | 35 | let s:dfa_states = [] 36 | for i in range(0, 26) 37 | call add(s:dfa_states, {'nu': i}) 38 | endfor 39 | 40 | let s:dfa_states[0][' '] = s:dfa_states[20] 41 | let s:dfa_states[0]["\t"] = s:dfa_states[20] 42 | let s:dfa_states[0]["\n"] = s:dfa_states[20] 43 | let s:dfa_states[0]["\r"] = s:dfa_states[20] 44 | let s:dfa_states[0]['"'] = s:dfa_states[1] 45 | let s:dfa_states[0]['0'] = s:dfa_states[4] 46 | let s:dfa_states[0]['1'] = s:dfa_states[4] 47 | let s:dfa_states[0]['2'] = s:dfa_states[4] 48 | let s:dfa_states[0]['3'] = s:dfa_states[4] 49 | let s:dfa_states[0]['4'] = s:dfa_states[4] 50 | let s:dfa_states[0]['5'] = s:dfa_states[4] 51 | let s:dfa_states[0]['6'] = s:dfa_states[4] 52 | let s:dfa_states[0]['7'] = s:dfa_states[4] 53 | let s:dfa_states[0]['8'] = s:dfa_states[4] 54 | let s:dfa_states[0]['9'] = s:dfa_states[4] 55 | let s:dfa_states[0]['t'] = s:dfa_states[7] 56 | let s:dfa_states[0]['f'] = s:dfa_states[11] 57 | let s:dfa_states[0]['n'] = s:dfa_states[16] 58 | let s:dfa_states[0]['['] = s:dfa_states[21] 59 | let s:dfa_states[0][']'] = s:dfa_states[22] 60 | let s:dfa_states[0]['{'] = s:dfa_states[23] 61 | let s:dfa_states[0]['}'] = s:dfa_states[24] 62 | let s:dfa_states[0][':'] = s:dfa_states[25] 63 | let s:dfa_states[0][','] = s:dfa_states[26] 64 | 65 | let s:dfa_states[1]['\'] = s:dfa_states[2] 66 | let s:dfa_states[1]['"'] = s:dfa_states[3] 67 | let s:dfa_states[1]['other'] = s:dfa_states[1] 68 | 69 | let s:dfa_states[2]['other'] = s:dfa_states[1] 70 | 71 | let s:dfa_states[3]['accpet'] = 1 72 | let s:dfa_states[3]['type'] = 'String' 73 | 74 | let s:dfa_states[4]['accpet'] = 1 75 | let s:dfa_states[4]['type'] = 'Number' 76 | let s:dfa_states[4]['0'] = s:dfa_states[4] 77 | let s:dfa_states[4]['1'] = s:dfa_states[4] 78 | let s:dfa_states[4]['2'] = s:dfa_states[4] 79 | let s:dfa_states[4]['3'] = s:dfa_states[4] 80 | let s:dfa_states[4]['4'] = s:dfa_states[4] 81 | let s:dfa_states[4]['5'] = s:dfa_states[4] 82 | let s:dfa_states[4]['6'] = s:dfa_states[4] 83 | let s:dfa_states[4]['7'] = s:dfa_states[4] 84 | let s:dfa_states[4]['8'] = s:dfa_states[4] 85 | let s:dfa_states[4]['9'] = s:dfa_states[4] 86 | let s:dfa_states[4]['.'] = s:dfa_states[5] 87 | 88 | let s:dfa_states[5]['0'] = s:dfa_states[6] 89 | let s:dfa_states[5]['1'] = s:dfa_states[6] 90 | let s:dfa_states[5]['2'] = s:dfa_states[6] 91 | let s:dfa_states[5]['3'] = s:dfa_states[6] 92 | let s:dfa_states[5]['4'] = s:dfa_states[6] 93 | let s:dfa_states[5]['5'] = s:dfa_states[6] 94 | let s:dfa_states[5]['6'] = s:dfa_states[6] 95 | let s:dfa_states[5]['7'] = s:dfa_states[6] 96 | let s:dfa_states[5]['8'] = s:dfa_states[6] 97 | let s:dfa_states[5]['9'] = s:dfa_states[6] 98 | 99 | let s:dfa_states[6]['accpet'] = 1 100 | let s:dfa_states[6]['type'] = 'Float' 101 | let s:dfa_states[6]['0'] = s:dfa_states[6] 102 | let s:dfa_states[6]['1'] = s:dfa_states[6] 103 | let s:dfa_states[6]['2'] = s:dfa_states[6] 104 | let s:dfa_states[6]['3'] = s:dfa_states[6] 105 | let s:dfa_states[6]['4'] = s:dfa_states[6] 106 | let s:dfa_states[6]['5'] = s:dfa_states[6] 107 | let s:dfa_states[6]['6'] = s:dfa_states[6] 108 | let s:dfa_states[6]['7'] = s:dfa_states[6] 109 | let s:dfa_states[6]['8'] = s:dfa_states[6] 110 | let s:dfa_states[6]['9'] = s:dfa_states[6] 111 | 112 | let s:dfa_states[7]['r'] = s:dfa_states[8] 113 | let s:dfa_states[8]['u'] = s:dfa_states[9] 114 | let s:dfa_states[9]['e'] = s:dfa_states[10] 115 | let s:dfa_states[10]['accpet'] = 1 116 | let s:dfa_states[10]['type'] = 'Boolean' 117 | 118 | let s:dfa_states[11]['a'] = s:dfa_states[12] 119 | let s:dfa_states[12]['l'] = s:dfa_states[13] 120 | let s:dfa_states[13]['s'] = s:dfa_states[14] 121 | let s:dfa_states[14]['e'] = s:dfa_states[15] 122 | let s:dfa_states[15]['accpet'] = 1 123 | let s:dfa_states[15]['type'] = 'Boolean' 124 | 125 | let s:dfa_states[16]['r'] = s:dfa_states[17] 126 | let s:dfa_states[17]['u'] = s:dfa_states[18] 127 | let s:dfa_states[18]['e'] = s:dfa_states[19] 128 | let s:dfa_states[19]['accpet'] = 1 129 | let s:dfa_states[19]['type'] = 'Null' 130 | 131 | let s:dfa_states[20][' '] = s:dfa_states[20] 132 | let s:dfa_states[20]["\t"] = s:dfa_states[20] 133 | let s:dfa_states[20]["\n"] = s:dfa_states[20] 134 | let s:dfa_states[20]["\r"] = s:dfa_states[20] 135 | let s:dfa_states[20]['accpet'] = 1 136 | let s:dfa_states[20]['type'] = 'Ignore' 137 | 138 | let s:dfa_states[21]['accpet'] = 1 139 | let s:dfa_states[21]['type'] = '[' 140 | 141 | let s:dfa_states[22]['accpet'] = 1 142 | let s:dfa_states[22]['type'] = ']' 143 | 144 | let s:dfa_states[23]['accpet'] = 1 145 | let s:dfa_states[23]['type'] = '{' 146 | 147 | let s:dfa_states[24]['accpet'] = 1 148 | let s:dfa_states[24]['type'] = '}' 149 | 150 | let s:dfa_states[25]['accpet'] = 1 151 | let s:dfa_states[25]['type'] = ':' 152 | 153 | let s:dfa_states[26]['accpet'] = 1 154 | let s:dfa_states[26]['type'] = ',' 155 | 156 | function s:lex(input) 157 | let l:index = 0 158 | let l:length = len(a:input) 159 | let l:current_state = s:dfa_states[0] 160 | 161 | let l:tmp_input = '' 162 | 163 | let l:result = [] 164 | while l:index < l:length 165 | let l:char = a:input[l:index] 166 | 167 | try 168 | try 169 | let l:current_state = l:current_state[l:char] 170 | catch /E716:/ 171 | let l:current_state = l:current_state['other'] 172 | endtry 173 | let l:tmp_input = l:tmp_input . l:char 174 | catch /E716:/ 175 | if has_key(l:current_state, 'accpet') 176 | if l:current_state['type'] != 'Ignore' 177 | call add(l:result, [l:current_state['type'], l:tmp_input]) 178 | endif 179 | let l:tmp_input = '' 180 | else 181 | throw 'LexicalAnalyze Error At ' . l:index 182 | endif 183 | 184 | let l:index = l:index - 1 185 | let l:current_state = s:dfa_states[0] 186 | endtry 187 | 188 | let l:index = l:index + 1 189 | endwhile 190 | 191 | if has_key(l:current_state, 'accpet') 192 | if l:current_state['type'] != 'Ignore' 193 | call add(l:result, [l:current_state['type'], l:tmp_input]) 194 | endif 195 | let l:tmp_input = '' 196 | else 197 | throw 'LexicalAnalyze Error At ' . l:index 198 | endif 199 | 200 | return l:result 201 | 202 | endfunction 203 | 204 | function s:parseJson(token_stream, i) 205 | let l:first = a:token_stream[a:i] 206 | let l:first_type = l:first[0] 207 | let l:first_content = l:first[1] 208 | if l:first_type == '{' 209 | return s:parseObject(a:token_stream, a:i) 210 | elseif l:first_type == '[' 211 | return s:parseList(a:token_stream, a:i) 212 | elseif l:first_type == 'String' 213 | return [eval(l:first_content), a:i+1] 214 | elseif l:first_type == 'Boolean' 215 | if l:first_content == 'true' 216 | return [1, a:i+1] 217 | elseif l:first_content == 'false' 218 | return [0, a:i+1] 219 | endif 220 | elseif l:first_type == 'Number' 221 | return [str2nr(first_content), a:i+1] 222 | elseif l:first_type == 'Float' 223 | return [str2float(first_content), a:i+1] 224 | elseif l:first_type == 'Null' 225 | return [0, a:i+1] 226 | else 227 | throw 'Parser Error' 228 | endif 229 | endfunction 230 | 231 | function s:parseObject(token_stream, i) 232 | let l:result = s:parseKeyValueList(a:token_stream, a:i+1) 233 | let l:key_value_list = result[0] 234 | if a:token_stream[l:result[1]][0] != '}' 235 | throw 'Parser Error' 236 | endif 237 | 238 | let l:object = {} 239 | for key_value in l:key_value_list 240 | let l:object[key_value[0]] = key_value[1] 241 | endfor 242 | return [l:object, l:result[1]+1] 243 | endfunction 244 | 245 | function s:parseKeyValueList(token_stream, i) 246 | if a:token_stream[a:i][0] == '}' 247 | return [[], a:i] 248 | endif 249 | let l:result = s:parseKeyValue(a:token_stream, a:i) 250 | if a:token_stream[l:result[1]][0] == ',' 251 | let l:key_value_list_result = s:parseKeyValueList(a:token_stream, l:result[1]+1) 252 | return [insert(l:key_value_list_result[0], l:result[0]), l:key_value_list_result[1]] 253 | else 254 | return [[l:result[0]], l:result[1]] 255 | endif 256 | endfunction 257 | 258 | function s:parseKeyValue(token_stream, i) 259 | let l:first = a:token_stream[a:i] 260 | let l:second = a:token_stream[a:i+1] 261 | if l:first[0] != 'String' || l:second[0] != ':' 262 | throw 'Parser Error' 263 | endif 264 | let l:key = s:parseJson(a:token_stream, a:i)[0] 265 | let l:value = s:parseJson(a:token_stream, a:i+2) 266 | return [[l:key, l:value[0]], l:value[1]] 267 | endfunction 268 | 269 | function s:parseList(token_stream, i) 270 | let l:result = s:parseListBody(a:token_stream, a:i+1) 271 | let l:items_list = result[0] 272 | if a:token_stream[l:result[1]][0] != ']' 273 | throw 'Parser Error' 274 | endif 275 | 276 | let l:list = [] 277 | for item in l:items_list 278 | call insert(l:list, item) 279 | endfor 280 | return [l:list, l:result[1]+1] 281 | endfunction 282 | 283 | function s:parseListBody(token_stream, i) 284 | if a:token_stream[a:i][0] == ']' 285 | return [[], a:i] 286 | endif 287 | let l:result = s:parseJson(a:token_stream, a:i) 288 | if a:token_stream[l:result[1]][0] == ',' 289 | let l:items_list_result = s:parseListBody(a:token_stream, l:result[1]+1) 290 | return [add(l:items_list_result[0], l:result[0]), l:items_list_result[1]] 291 | else 292 | return [[l:result[0]], l:result[1]] 293 | endif 294 | endfunction 295 | 296 | endfunction 297 | 298 | " Vim 299 | " vim: set filetype=vim 300 | " Emacs 301 | " -*- mode: vim; -*- 302 | -------------------------------------------------------------------------------- /utils/stack.vimrc: -------------------------------------------------------------------------------- 1 | 2 | function Module.Define() 3 | " Interface 4 | " 5 | function s:stack_push(item) 6 | call add(self.__stack__, item) 7 | endfunction 8 | 9 | function s:stack_pop() 10 | call remove(self.__stack__, -1) 11 | endfunction 12 | 13 | function s:stack_top() 14 | return self.__stack__[-1] 15 | endfunction 16 | 17 | function self.create() 18 | let l:object = {} 19 | let l:object['__stack__'] = [] 20 | let l:object['push'] = function('s:stack_push') 21 | let l:object['pop'] = function('s:stack_pop') 22 | let l:object['top'] = function('s:stack_top') 23 | 24 | return l:object 25 | endfunction 26 | 27 | function self.copy(stack) 28 | let l:object = self.create() 29 | let l:object['__stack__'] = copy(stack['__stack__']) 30 | return l:object 31 | endfunction 32 | 33 | endfunction 34 | 35 | " Vim 36 | " vim: set filetype=vim 37 | " Emacs 38 | " -*- mode: vim; -*- 39 | -------------------------------------------------------------------------------- /utils/utils.vimrc: -------------------------------------------------------------------------------- 1 | function Module.Define() 2 | 3 | function self.CmdExists(cmd) 4 | return !system('type aaa > /dev/null 2>&1; echo -n $?') 5 | endfunction 6 | 7 | function self.Test(opt, arg) 8 | return !system('test %s %s; echo -n $?') 9 | endfunction 10 | 11 | function self.Args(arguments_list, options) 12 | let models = items(options) 13 | endfunction 14 | 15 | function self.GetSelectOnALine() 16 | return getline("'<")[getpos("'<")[2]-1: getpos("'>")[2]-1] 17 | endfunction 18 | 19 | function self.SetTabWidth(n) 20 | let n = a:n 21 | let template = 22 | \" 23 | \set tabstop=%s\n 24 | \set shiftwidth=%s\n 25 | \set softtabstop=%s\n 26 | \" 27 | exec printf(template, n, n, n) 28 | endfunction 29 | 30 | function self.RefreshFileType(filetype) 31 | let n = a:filetype 32 | let template = "set filetype=%s\n" 33 | exec printf(template, n) 34 | endfunction 35 | 36 | function self.Random() 37 | return system('echo -n ${RANDOM}') 38 | endfunction 39 | 40 | endfunction 41 | -------------------------------------------------------------------------------- /utils/xml.vimrc: -------------------------------------------------------------------------------- 1 | 2 | function Module.Define() 3 | " Interface 4 | 5 | endfunction 6 | 7 | 8 | " Vim 9 | " vim: set filetype=vim 10 | " Emacs 11 | " -*- mode: vim; -*- 12 | -------------------------------------------------------------------------------- /vimrc: -------------------------------------------------------------------------------- 1 | """""""""""""""""""""""""""""""""""""""" 2 | " BlxVimrc 3 | " 4 | " auth: brambles 5 | " email: qjnight@gmail.com 6 | " date: 2015-2-18 7 | 8 | let g:require_base_module = resolve(expand(':p')) 9 | exec 'source ' . resolve(fnamemodify(g:require_base_module, ':h'). '/require.vimrc') 10 | call Require('./') 11 | 12 | --------------------------------------------------------------------------------