├── .gitignore
├── src
├── vanilla.vim
├── package.vim
├── pathogen.vim
├── plug-all.vim
├── vundle.vim
├── plug.vim
├── neobundle-all.vim
├── dein-all.vim
├── dein.vim
└── neobundle.vim
├── result
├── result.png
├── result.dat
├── result.gnuplot
└── result.svg
├── README.md
├── run.sh
└── vimrc
/.gitignore:
--------------------------------------------------------------------------------
1 | *.log
2 | *.report
3 | plugins.vim
4 | .DS_Store
5 |
--------------------------------------------------------------------------------
/src/vanilla.vim:
--------------------------------------------------------------------------------
1 | set runtimepath^=$TEST_DIR
2 |
3 | filetype plugin indent on
4 | syntax enable
5 |
--------------------------------------------------------------------------------
/result/result.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/junegunn/vim-startuptime-benchmark/HEAD/result/result.png
--------------------------------------------------------------------------------
/src/package.vim:
--------------------------------------------------------------------------------
1 | set runtimepath^=$TEST_DIR
2 |
3 | set packpath+=$TEST_DIR
4 | filetype plugin indent on
5 | syntax enable
6 |
--------------------------------------------------------------------------------
/src/pathogen.vim:
--------------------------------------------------------------------------------
1 | set runtimepath^=$TEST_DIR
2 |
3 | call pathogen#infect()
4 | filetype plugin indent on
5 | syntax enable
6 |
--------------------------------------------------------------------------------
/result/result.dat:
--------------------------------------------------------------------------------
1 | "vanilla" 0 59
2 | "package" 1 145
3 | "pathogen" 2 146
4 | "vundle" 3 162
5 | "neobundle" 4 188 132
6 | "plug" 5 153 98
7 | "dein" 6 154 107
8 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | vim-startuptime-benchmark
2 | =========================
3 |
4 | A benchmark result of Vim startup time with different plugin managers.
5 |
6 | Result
7 | ------
8 |
9 | *Last update: Dec 6, 2016*
10 |
11 | - MacBook Pro (Retina 13-inch, Early 2015)
12 | - 2.9 GHz Intel Core i5
13 | - VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Dec 3 2016 21:46:33)
14 |
15 |
16 |
--------------------------------------------------------------------------------
/result/result.gnuplot:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env gnuplot
2 | reset
3 |
4 | set size square
5 |
6 | set term svg size 500,500 font "Monaco,11" solid
7 | set output "result.svg"
8 |
9 | set style data histogram
10 | set style histogram clustered
11 | set boxwidth 0.2 relative
12 | set style fill solid 0 border lt 0
13 |
14 | set yrange [0:*]
15 |
16 | plot 'result.dat' using ($2):3:xtic(1) title 'Startup time (ms)' with boxes fill solid 0.1 ls 2, \
17 | '' using ($2+0.2):4 title 'Startup time (lazy) (ms)' with boxes fill solid 0.3 ls 2
18 |
19 |
--------------------------------------------------------------------------------
/src/plug-all.vim:
--------------------------------------------------------------------------------
1 | set runtimepath^=$TEST_DIR
2 |
3 | call plug#begin('$TEST_DIR/bundle')
4 |
5 | " My plugins
6 | Plug 'junegunn/vim-easy-align'
7 | Plug 'junegunn/vim-github-dashboard'
8 | Plug 'junegunn/vim-emoji'
9 | Plug 'junegunn/vim-pseudocl'
10 | Plug 'junegunn/vim-slash'
11 | Plug 'junegunn/vim-fnr'
12 | Plug 'junegunn/vim-peekaboo'
13 | Plug 'junegunn/vim-journal'
14 | Plug 'junegunn/seoul256.vim'
15 | Plug 'junegunn/gv.vim'
16 | Plug 'junegunn/goyo.vim'
17 | Plug 'junegunn/limelight.vim'
18 | Plug 'junegunn/vader.vim'
19 | Plug 'junegunn/vim-ruby-x'
20 | Plug 'junegunn/fzf'
21 | Plug 'junegunn/fzf.vim'
22 | Plug 'junegunn/rainbow_parentheses.vim'
23 | Plug 'junegunn/vim-after-object'
24 | Plug 'junegunn/vim-xmark'
25 |
26 | " Colors
27 | Plug 'tomasr/molokai'
28 | Plug 'chriskempson/vim-tomorrow-theme'
29 |
30 | " Edit
31 | Plug 'tpope/vim-repeat'
32 | Plug 'tpope/vim-surround'
33 | Plug 'tpope/vim-endwise'
34 | Plug 'tpope/vim-commentary'
35 | Plug 'mbbill/undotree'
36 | Plug 'vim-scripts/ReplaceWithRegister'
37 | Plug 'AndrewRadev/splitjoin.vim'
38 | Plug 'rhysd/vim-grammarous'
39 | Plug 'junegunn/vim-online-thesaurus'
40 |
41 | " Tmux
42 | Plug 'tpope/vim-tbone'
43 |
44 | " Browsing
45 | Plug 'Yggdroot/indentLine'
46 | Plug 'scrooloose/nerdtree'
47 |
48 | Plug 'majutsushi/tagbar'
49 | Plug 'justinmk/vim-gtfo'
50 |
51 | " Git
52 | Plug 'tpope/vim-fugitive'
53 | Plug 'mhinz/vim-signify'
54 |
55 | " Lang
56 | Plug 'vim-ruby/vim-ruby'
57 | Plug 'kovisoft/paredit'
58 | Plug 'tpope/vim-fireplace'
59 | Plug 'guns/vim-clojure-static'
60 | Plug 'guns/vim-clojure-highlight'
61 | Plug 'guns/vim-slamhound'
62 | Plug 'fatih/vim-go'
63 | Plug 'groenewege/vim-less'
64 | Plug 'pangloss/vim-javascript'
65 | Plug 'mxw/vim-jsx'
66 | Plug 'kchmck/vim-coffee-script'
67 | Plug 'slim-template/vim-slim'
68 | Plug 'Glench/Vim-Jinja2-Syntax'
69 | Plug 'rust-lang/rust.vim'
70 | Plug 'tpope/vim-rails'
71 | Plug 'derekwyatt/vim-scala'
72 | Plug 'ensime/ensime-vim'
73 | Plug 'honza/dockerfile.vim'
74 | Plug 'solarnz/thrift.vim'
75 | Plug 'dag/vim-fish'
76 | Plug 'chrisbra/unicode.vim'
77 |
78 | " Lint
79 | Plug 'scrooloose/syntastic'
80 |
81 | call plug#end()
82 | " plug#end() does `filetype plugin indent on` and `syntax enable`
83 |
--------------------------------------------------------------------------------
/src/vundle.vim:
--------------------------------------------------------------------------------
1 | set runtimepath^=$TEST_DIR
2 |
3 | filetype off
4 |
5 | set rtp+=$TEST_DIR/Vundle.vim
6 | call vundle#begin()
7 | let vundle#bundle_dir = expand('$TEST_DIR/bundle')
8 |
9 | " My plugins
10 | Plugin 'junegunn/vim-easy-align'
11 | Plugin 'junegunn/vim-github-dashboard'
12 | Plugin 'junegunn/vim-emoji'
13 | Plugin 'junegunn/vim-pseudocl'
14 | Plugin 'junegunn/vim-slash'
15 | Plugin 'junegunn/vim-fnr'
16 | Plugin 'junegunn/vim-peekaboo'
17 | Plugin 'junegunn/vim-journal'
18 | Plugin 'junegunn/seoul256.vim'
19 | Plugin 'junegunn/gv.vim'
20 | Plugin 'junegunn/goyo.vim'
21 | Plugin 'junegunn/limelight.vim'
22 | Plugin 'junegunn/vader.vim'
23 | Plugin 'junegunn/vim-ruby-x'
24 | Plugin 'junegunn/fzf'
25 | Plugin 'junegunn/fzf.vim'
26 | Plugin 'junegunn/rainbow_parentheses.vim'
27 | Plugin 'junegunn/vim-after-object'
28 | Plugin 'junegunn/vim-xmark'
29 |
30 | " Colors
31 | Plugin 'tomasr/molokai'
32 | Plugin 'chriskempson/vim-tomorrow-theme'
33 |
34 | " Edit
35 | Plugin 'tpope/vim-repeat'
36 | Plugin 'tpope/vim-surround'
37 | Plugin 'tpope/vim-endwise'
38 | Plugin 'tpope/vim-commentary'
39 | Plugin 'mbbill/undotree'
40 | Plugin 'vim-scripts/ReplaceWithRegister'
41 | Plugin 'AndrewRadev/splitjoin.vim'
42 | Plugin 'rhysd/vim-grammarous'
43 | Plugin 'junegunn/vim-online-thesaurus'
44 |
45 | " Tmux
46 | Plugin 'tpope/vim-tbone'
47 |
48 | " Browsing
49 | Plugin 'Yggdroot/indentLine'
50 | Plugin 'scrooloose/nerdtree'
51 |
52 | Plugin 'majutsushi/tagbar'
53 | Plugin 'justinmk/vim-gtfo'
54 |
55 | " Git
56 | Plugin 'tpope/vim-fugitive'
57 | Plugin 'mhinz/vim-signify'
58 |
59 | " Lang
60 | Plugin 'vim-ruby/vim-ruby'
61 | Plugin 'kovisoft/paredit'
62 | Plugin 'tpope/vim-fireplace'
63 | Plugin 'guns/vim-clojure-static'
64 | Plugin 'guns/vim-clojure-highlight'
65 | Plugin 'guns/vim-slamhound'
66 | Plugin 'fatih/vim-go'
67 | Plugin 'groenewege/vim-less'
68 | Plugin 'pangloss/vim-javascript'
69 | Plugin 'mxw/vim-jsx'
70 | Plugin 'kchmck/vim-coffee-script'
71 | Plugin 'slim-template/vim-slim'
72 | Plugin 'Glench/Vim-Jinja2-Syntax'
73 | Plugin 'rust-lang/rust.vim'
74 | Plugin 'tpope/vim-rails'
75 | Plugin 'derekwyatt/vim-scala'
76 | Plugin 'ensime/ensime-vim'
77 | Plugin 'honza/dockerfile.vim'
78 | Plugin 'solarnz/thrift.vim'
79 | Plugin 'dag/vim-fish'
80 | Plugin 'chrisbra/unicode.vim'
81 |
82 | " Lint
83 | Plugin 'scrooloose/syntastic'
84 |
85 | call vundle#end()
86 | filetype plugin indent on
87 | syntax enable
88 |
--------------------------------------------------------------------------------
/src/plug.vim:
--------------------------------------------------------------------------------
1 | set runtimepath^=$TEST_DIR
2 |
3 | call plug#begin('$TEST_DIR/bundle')
4 |
5 | " My plugins
6 | Plug 'junegunn/vim-easy-align', { 'on': ['(EasyAlign)', 'EasyAlign'] }
7 | Plug 'junegunn/vim-github-dashboard', { 'on': ['GHDashboard', 'GHActivity'] }
8 | Plug 'junegunn/vim-emoji'
9 | Plug 'junegunn/vim-pseudocl'
10 | Plug 'junegunn/vim-slash'
11 | Plug 'junegunn/vim-fnr'
12 | Plug 'junegunn/vim-peekaboo'
13 | Plug 'junegunn/vim-journal'
14 | Plug 'junegunn/seoul256.vim'
15 | Plug 'junegunn/gv.vim'
16 | Plug 'junegunn/goyo.vim'
17 | Plug 'junegunn/limelight.vim'
18 | Plug 'junegunn/vader.vim', { 'on': 'Vader', 'for': 'vader' }
19 | Plug 'junegunn/vim-ruby-x', { 'on': 'RubyX' }
20 | Plug 'junegunn/fzf'
21 | Plug 'junegunn/fzf.vim'
22 | Plug 'junegunn/rainbow_parentheses.vim'
23 | Plug 'junegunn/vim-after-object'
24 | Plug 'junegunn/vim-xmark'
25 |
26 | " Colors
27 | Plug 'tomasr/molokai'
28 | Plug 'chriskempson/vim-tomorrow-theme'
29 |
30 | " Edit
31 | Plug 'tpope/vim-repeat'
32 | Plug 'tpope/vim-surround'
33 | Plug 'tpope/vim-endwise'
34 | Plug 'tpope/vim-commentary', { 'on': 'Commentary' }
35 | Plug 'mbbill/undotree', { 'on': 'UndotreeToggle' }
36 | Plug 'vim-scripts/ReplaceWithRegister'
37 | Plug 'AndrewRadev/splitjoin.vim'
38 | Plug 'rhysd/vim-grammarous'
39 | Plug 'junegunn/vim-online-thesaurus'
40 |
41 | " Tmux
42 | Plug 'tpope/vim-tbone'
43 |
44 | " Browsing
45 | Plug 'Yggdroot/indentLine', { 'on': 'IndentLinesEnable' }
46 | Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
47 |
48 | Plug 'majutsushi/tagbar', { 'on': 'TagbarToggle' }
49 | Plug 'justinmk/vim-gtfo'
50 |
51 | " Git
52 | Plug 'tpope/vim-fugitive'
53 | Plug 'mhinz/vim-signify'
54 |
55 | " Lang
56 | Plug 'vim-ruby/vim-ruby'
57 | Plug 'kovisoft/paredit', { 'for': 'clojure' }
58 | Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
59 | Plug 'guns/vim-clojure-static'
60 | Plug 'guns/vim-clojure-highlight'
61 | Plug 'guns/vim-slamhound'
62 | Plug 'fatih/vim-go'
63 | Plug 'groenewege/vim-less'
64 | Plug 'pangloss/vim-javascript'
65 | Plug 'mxw/vim-jsx'
66 | Plug 'kchmck/vim-coffee-script'
67 | Plug 'slim-template/vim-slim'
68 | Plug 'Glench/Vim-Jinja2-Syntax'
69 | Plug 'rust-lang/rust.vim'
70 | Plug 'tpope/vim-rails', { 'for': [] }
71 | Plug 'derekwyatt/vim-scala'
72 | Plug 'ensime/ensime-vim', { 'for': 'scala' }
73 | Plug 'honza/dockerfile.vim'
74 | Plug 'solarnz/thrift.vim'
75 | Plug 'dag/vim-fish'
76 | Plug 'chrisbra/unicode.vim', { 'for': 'journal' }
77 |
78 | " Lint
79 | Plug 'scrooloose/syntastic', { 'on': 'SyntasticCheck' }
80 |
81 | call plug#end()
82 | " plug#end() does `filetype plugin indent on` and `syntax enable`
83 |
--------------------------------------------------------------------------------
/run.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | cd $(dirname $BASH_SOURCE)
4 |
5 | export TEST_DIR=/tmp/vim-startuptime-benchmark
6 |
7 | mkdir -p $TEST_DIR/{autoload,bundle}
8 |
9 | if [[ "$1" = 'init' || ! -d "$TEST_DIR" ]]; then
10 | # Pathogen
11 | curl -LSso $TEST_DIR/autoload/pathogen.vim https://tpo.pe/pathogen.vim
12 |
13 | # vim-plug
14 | curl -fLo $TEST_DIR/autoload/plug.vim https://raw.github.com/junegunn/vim-plug/master/plug.vim
15 |
16 | # Vundle
17 | if [ ! -d $TEST_DIR/bundle/Vundle.vim ]; then
18 | git clone https://github.com/gmarik/Vundle.vim.git $TEST_DIR/Vundle.vim
19 | else
20 | (cd $TEST_DIR/Vundle.vim && git pull)
21 | fi
22 |
23 | # NeoBundle
24 | if [ ! -d $TEST_DIR/bundle/neobundle.vim ]; then
25 | git clone https://github.com/Shougo/neobundle.vim $TEST_DIR/neobundle.vim
26 | else
27 | (cd $TEST_DIR/neobundle.vim && git pull)
28 | fi
29 |
30 | # dein.vim
31 | if [ ! -d $TEST_DIR/dein.vim ]; then
32 | git clone https://github.com/Shougo/dein.vim.git $TEST_DIR/dein.vim
33 | else
34 | (cd $TEST_DIR/dein.vim && git pull)
35 | fi
36 |
37 | # Install plugins in bundle directory
38 | vim -Nu src/plug.vim +PlugInstall +qa
39 |
40 | # Dein installs plugins in different directory structure.
41 | # Manually install plugins with :call dein#install() and quit
42 | ln -sf src/dein.vim plugins.vim
43 | vim -Nu vimrc +'echo ":call dein#install()"'
44 |
45 | ln -sf src/dein-all.vim plugins.vim
46 | vim -Nu vimrc +'echo ":call dein#install()"'
47 |
48 | rm -rf $TEST_DIR/pack/foo
49 | mkdir -p $TEST_DIR/pack/foo
50 | ln -sf $TEST_DIR/bundle $TEST_DIR/pack/foo/start
51 | exit 0
52 | fi
53 |
54 | niter=100
55 |
56 | rm -f *.log startuptime.report
57 | touch startuptime.report
58 |
59 | measure() {
60 | local vpm=$1
61 | ln -sf src/$vpm.vim plugins.vim
62 | for n in $(seq 1 $niter); do
63 | echo -ne "\r$vpm #$n"
64 | vim -Nu vimrc --startuptime _.log +q
65 | tail -1 _.log >> $vpm.log
66 | done
67 | echo
68 | cat $vpm.log | awk '{ sum += $1 } END { printf " %d", sum / NR }' >> "$out"
69 | vim -Nu vimrc --startuptime startuptime.report +q
70 | }
71 |
72 | idx=0
73 | out=result/result.dat
74 | rm "$out"
75 | for vpm in vanilla package pathogen vundle neobundle plug dein; do
76 | echo -n "\"$vpm\" $idx" >> "$out"
77 | if [[ $vpm = neobundle ]] || [[ $vpm = plug ]] || [[ $vpm = dein ]]; then
78 | measure $vpm-all
79 | fi
80 | measure $vpm
81 | echo >> "$out"
82 | idx=$(( idx + 1 ))
83 | done
84 | rm -f *.log
85 |
86 | echo "Creating result/result.svg"
87 | set -eu
88 | cd result
89 | gnuplot result.gnuplot
90 | qlmanage -t -s 1000 -o . result.svg
91 | mv result.svg.png result.png
92 |
--------------------------------------------------------------------------------
/src/neobundle-all.vim:
--------------------------------------------------------------------------------
1 | set runtimepath^=$TEST_DIR
2 |
3 | if has('vim_starting')
4 | " Required:
5 | set runtimepath+=$TEST_DIR/neobundle.vim/
6 | endif
7 |
8 | " Required:
9 | call neobundle#begin(expand('$TEST_DIR/bundle'))
10 |
11 | " Let NeoBundle manage NeoBundle
12 | " Required:
13 | NeoBundleFetch 'Shougo/neobundle.vim'
14 |
15 | " My plugins
16 | NeoBundle 'junegunn/vim-easy-align'
17 | NeoBundle 'junegunn/vim-github-dashboard'
18 | NeoBundle 'junegunn/vim-emoji'
19 | NeoBundle 'junegunn/vim-pseudocl'
20 | NeoBundle 'junegunn/vim-slash'
21 | NeoBundle 'junegunn/vim-fnr'
22 | NeoBundle 'junegunn/vim-peekaboo'
23 | NeoBundle 'junegunn/vim-journal'
24 | NeoBundle 'junegunn/seoul256.vim'
25 | NeoBundle 'junegunn/gv.vim'
26 | NeoBundle 'junegunn/goyo.vim'
27 | NeoBundle 'junegunn/limelight.vim'
28 | NeoBundle 'junegunn/vader.vim'
29 | NeoBundle 'junegunn/vim-ruby-x'
30 | NeoBundle 'junegunn/fzf'
31 | NeoBundle 'junegunn/fzf.vim'
32 | NeoBundle 'junegunn/rainbow_parentheses.vim'
33 | NeoBundle 'junegunn/vim-after-object'
34 | NeoBundle 'junegunn/vim-xmark'
35 |
36 | " Colors
37 | NeoBundle 'tomasr/molokai'
38 | NeoBundle 'chriskempson/vim-tomorrow-theme'
39 |
40 | " Edit
41 | NeoBundle 'tpope/vim-repeat'
42 | NeoBundle 'tpope/vim-surround'
43 | NeoBundle 'tpope/vim-endwise'
44 | NeoBundle 'tpope/vim-commentary'
45 | NeoBundle 'mbbill/undotree'
46 | NeoBundle 'vim-scripts/ReplaceWithRegister'
47 | NeoBundle 'AndrewRadev/splitjoin.vim'
48 | NeoBundle 'rhysd/vim-grammarous'
49 | NeoBundle 'junegunn/vim-online-thesaurus'
50 |
51 | " Tmux
52 | NeoBundle 'tpope/vim-tbone'
53 |
54 | " Browsing
55 | NeoBundle 'Yggdroot/indentLine'
56 | NeoBundle 'scrooloose/nerdtree'
57 |
58 | NeoBundle 'majutsushi/tagbar'
59 | NeoBundle 'justinmk/vim-gtfo'
60 |
61 | " Git
62 | NeoBundle 'tpope/vim-fugitive'
63 | NeoBundle 'mhinz/vim-signify'
64 |
65 | " Lang
66 | NeoBundle 'vim-ruby/vim-ruby'
67 | NeoBundle 'kovisoft/paredit'
68 | NeoBundle 'tpope/vim-fireplace'
69 | NeoBundle 'guns/vim-clojure-static'
70 | NeoBundle 'guns/vim-clojure-highlight'
71 | NeoBundle 'guns/vim-slamhound'
72 | NeoBundle 'fatih/vim-go'
73 | NeoBundle 'groenewege/vim-less'
74 | NeoBundle 'pangloss/vim-javascript'
75 | NeoBundle 'mxw/vim-jsx'
76 | NeoBundle 'kchmck/vim-coffee-script'
77 | NeoBundle 'slim-template/vim-slim'
78 | NeoBundle 'Glench/Vim-Jinja2-Syntax'
79 | NeoBundle 'rust-lang/rust.vim'
80 | NeoBundle 'tpope/vim-rails'
81 | NeoBundle 'derekwyatt/vim-scala'
82 | NeoBundle 'ensime/ensime-vim'
83 | NeoBundle 'honza/dockerfile.vim'
84 | NeoBundle 'solarnz/thrift.vim'
85 | NeoBundle 'dag/vim-fish'
86 | NeoBundle 'chrisbra/unicode.vim'
87 |
88 | " Lint
89 | NeoBundle 'scrooloose/syntastic'
90 |
91 | call neobundle#end()
92 |
93 | " Required:
94 | filetype plugin indent on
95 | syntax enable
96 |
--------------------------------------------------------------------------------
/src/dein-all.vim:
--------------------------------------------------------------------------------
1 | set runtimepath^=$TEST_DIR
2 |
3 | set runtimepath+=$TEST_DIR/dein.vim
4 | call dein#begin($TEST_DIR.'/dein-all')
5 |
6 | " My plugins
7 | call dein#add('junegunn/vim-easy-align')
8 | call dein#add('junegunn/vim-github-dashboard')
9 | call dein#add('junegunn/vim-emoji')
10 | call dein#add('junegunn/vim-pseudocl')
11 | call dein#add('junegunn/vim-slash')
12 | call dein#add('junegunn/vim-fnr')
13 | call dein#add('junegunn/vim-peekaboo')
14 | call dein#add('junegunn/vim-journal')
15 | call dein#add('junegunn/seoul256.vim')
16 | call dein#add('junegunn/gv.vim')
17 | call dein#add('junegunn/goyo.vim')
18 | call dein#add('junegunn/limelight.vim')
19 | call dein#add('junegunn/vader.vim')
20 | call dein#add('junegunn/vim-ruby-x')
21 | call dein#add('junegunn/fzf', { 'merged': 0 })
22 | call dein#add('junegunn/fzf.vim', { 'merged': 0 })
23 | call dein#add('junegunn/rainbow_parentheses.vim')
24 | call dein#add('junegunn/vim-after-object')
25 | call dein#add('junegunn/vim-xmark')
26 |
27 | " Colors
28 | call dein#add('tomasr/molokai')
29 | call dein#add('chriskempson/vim-tomorrow-theme')
30 |
31 | " Edit
32 | call dein#add('tpope/vim-repeat')
33 | call dein#add('tpope/vim-surround')
34 | call dein#add('tpope/vim-endwise')
35 | call dein#add('tpope/vim-commentary')
36 | call dein#add('mbbill/undotree')
37 | call dein#add('vim-scripts/ReplaceWithRegister')
38 | call dein#add('AndrewRadev/splitjoin.vim')
39 | call dein#add('rhysd/vim-grammarous')
40 | call dein#add('junegunn/vim-online-thesaurus')
41 |
42 | " Tmux
43 | call dein#add('tpope/vim-tbone')
44 |
45 | " Browsing
46 | call dein#add('Yggdroot/indentLine')
47 | call dein#add('scrooloose/nerdtree')
48 |
49 | call dein#add('majutsushi/tagbar')
50 | call dein#add('justinmk/vim-gtfo')
51 |
52 | " Git
53 | call dein#add('tpope/vim-fugitive')
54 | call dein#add('mhinz/vim-signify')
55 |
56 | " Lang
57 | call dein#add('vim-ruby/vim-ruby')
58 | call dein#add('kovisoft/paredit')
59 | call dein#add('tpope/vim-fireplace')
60 | call dein#add('guns/vim-clojure-static')
61 | call dein#add('guns/vim-clojure-highlight')
62 | call dein#add('guns/vim-slamhound')
63 | call dein#add('fatih/vim-go')
64 | call dein#add('groenewege/vim-less')
65 | call dein#add('pangloss/vim-javascript')
66 | call dein#add('mxw/vim-jsx')
67 | call dein#add('kchmck/vim-coffee-script')
68 | call dein#add('slim-template/vim-slim')
69 | call dein#add('Glench/Vim-Jinja2-Syntax')
70 | call dein#add('rust-lang/rust.vim')
71 | call dein#add('tpope/vim-rails')
72 | call dein#add('derekwyatt/vim-scala')
73 | call dein#add('ensime/ensime-vim')
74 | call dein#add('honza/dockerfile.vim')
75 | call dein#add('solarnz/thrift.vim')
76 | call dein#add('dag/vim-fish')
77 | call dein#add('chrisbra/unicode.vim')
78 |
79 | " Lint
80 | call dein#add('scrooloose/syntastic')
81 |
82 | call dein#end()
83 |
84 | filetype plugin indent on
85 | syntax enable
86 |
--------------------------------------------------------------------------------
/src/dein.vim:
--------------------------------------------------------------------------------
1 | set runtimepath^=$TEST_DIR
2 |
3 | set runtimepath+=$TEST_DIR/dein.vim
4 | call dein#begin($TEST_DIR.'/dein')
5 |
6 | " My plugins
7 | call dein#add('junegunn/vim-easy-align', { 'on_map': '(EasyAlign)', 'on_cmd': 'EasyAlign' })
8 | call dein#add('junegunn/vim-github-dashboard', { 'on_cmd': ['GHDashboard', 'GHActivity'] })
9 | call dein#add('junegunn/vim-emoji')
10 | call dein#add('junegunn/vim-pseudocl')
11 | call dein#add('junegunn/vim-slash')
12 | call dein#add('junegunn/vim-fnr')
13 | call dein#add('junegunn/vim-peekaboo')
14 | call dein#add('junegunn/vim-journal')
15 | call dein#add('junegunn/seoul256.vim')
16 | call dein#add('junegunn/gv.vim')
17 | call dein#add('junegunn/goyo.vim')
18 | call dein#add('junegunn/limelight.vim')
19 | call dein#add('junegunn/vader.vim', { 'on_cmd': 'Vader', 'on_ft': 'vader' })
20 | call dein#add('junegunn/vim-ruby-x', { 'on_cmd': 'RubyX' })
21 | call dein#add('junegunn/fzf', { 'merged': 0 })
22 | call dein#add('junegunn/fzf.vim', { 'merged': 0 })
23 | call dein#add('junegunn/rainbow_parentheses.vim')
24 | call dein#add('junegunn/vim-after-object')
25 | call dein#add('junegunn/vim-xmark')
26 |
27 | " Colors
28 | call dein#add('tomasr/molokai')
29 | call dein#add('chriskempson/vim-tomorrow-theme')
30 |
31 | " Edit
32 | call dein#add('tpope/vim-repeat')
33 | call dein#add('tpope/vim-surround')
34 | call dein#add('tpope/vim-endwise')
35 | call dein#add('tpope/vim-commentary', { 'on_map': 'Commentary' })
36 | call dein#add('mbbill/undotree', { 'on_cmd': 'UndotreeToggle' })
37 | call dein#add('vim-scripts/ReplaceWithRegister')
38 | call dein#add('AndrewRadev/splitjoin.vim')
39 | call dein#add('rhysd/vim-grammarous')
40 | call dein#add('junegunn/vim-online-thesaurus')
41 |
42 | " Tmux
43 | call dein#add('tpope/vim-tbone')
44 |
45 | " Browsing
46 | call dein#add('Yggdroot/indentLine', { 'on_cmd': 'IndentLinesEnable' })
47 | call dein#add('scrooloose/nerdtree', { 'on_cmd': 'NERDTreeToggle' })
48 |
49 | call dein#add('majutsushi/tagbar', { 'on_cmd': 'TagbarToggle' })
50 | call dein#add('justinmk/vim-gtfo')
51 |
52 | " Git
53 | call dein#add('tpope/vim-fugitive')
54 | call dein#add('mhinz/vim-signify')
55 |
56 | " Lang
57 | call dein#add('vim-ruby/vim-ruby')
58 | call dein#add('kovisoft/paredit', { 'on_ft': 'clojure' })
59 | call dein#add('tpope/vim-fireplace', { 'on_ft': 'clojure' })
60 | call dein#add('guns/vim-clojure-static')
61 | call dein#add('guns/vim-clojure-highlight')
62 | call dein#add('guns/vim-slamhound')
63 | call dein#add('fatih/vim-go')
64 | call dein#add('groenewege/vim-less')
65 | call dein#add('pangloss/vim-javascript')
66 | call dein#add('mxw/vim-jsx')
67 | call dein#add('kchmck/vim-coffee-script')
68 | call dein#add('slim-template/vim-slim')
69 | call dein#add('Glench/Vim-Jinja2-Syntax')
70 | call dein#add('rust-lang/rust.vim')
71 | call dein#add('tpope/vim-rails', { 'on_ft': [] })
72 | call dein#add('derekwyatt/vim-scala')
73 | call dein#add('ensime/ensime-vim', { 'on_ft': 'scala' })
74 | call dein#add('honza/dockerfile.vim')
75 | call dein#add('solarnz/thrift.vim')
76 | call dein#add('dag/vim-fish')
77 | call dein#add('chrisbra/unicode.vim', { 'on_ft': 'journal' })
78 |
79 | " Lint
80 | call dein#add('scrooloose/syntastic', { 'on_cmd': 'SyntasticCheck' })
81 |
82 | call dein#end()
83 |
84 | filetype plugin indent on
85 | syntax enable
86 |
--------------------------------------------------------------------------------
/src/neobundle.vim:
--------------------------------------------------------------------------------
1 | set runtimepath^=$TEST_DIR
2 |
3 | if has('vim_starting')
4 | " Required:
5 | set runtimepath+=$TEST_DIR/neobundle.vim/
6 | endif
7 |
8 | " Required:
9 | call neobundle#begin(expand('$TEST_DIR/bundle'))
10 |
11 | " Let NeoBundle manage NeoBundle
12 | " Required:
13 | NeoBundleFetch 'Shougo/neobundle.vim'
14 |
15 | " My plugins
16 | NeoBundleLazy 'junegunn/vim-easy-align', { 'autoload': { 'commands': 'EasyAlign', 'mappings': '(EasyAlign)' } }
17 | NeoBundleLazy 'junegunn/vim-github-dashboard', { 'autoload': { 'commands': ['GHDashboard', 'GHActivity'] } }
18 | NeoBundle 'junegunn/vim-emoji'
19 | NeoBundle 'junegunn/vim-pseudocl'
20 | NeoBundle 'junegunn/vim-slash'
21 | NeoBundle 'junegunn/vim-fnr'
22 | NeoBundle 'junegunn/vim-peekaboo'
23 | NeoBundle 'junegunn/vim-journal'
24 | NeoBundle 'junegunn/seoul256.vim'
25 | NeoBundle 'junegunn/gv.vim'
26 | NeoBundle 'junegunn/goyo.vim'
27 | NeoBundle 'junegunn/limelight.vim'
28 | NeoBundleLazy 'junegunn/vader.vim', { 'autoload': { 'commands': 'Vader', 'filetypes': 'vader' } }
29 | NeoBundleLazy 'junegunn/vim-ruby-x', { 'autoload': { 'commands': 'RubyX' } }
30 | NeoBundle 'junegunn/fzf'
31 | NeoBundle 'junegunn/fzf.vim'
32 | NeoBundle 'junegunn/rainbow_parentheses.vim'
33 | NeoBundle 'junegunn/vim-after-object'
34 | NeoBundle 'junegunn/vim-xmark'
35 |
36 | " Colors
37 | NeoBundle 'tomasr/molokai'
38 | NeoBundle 'chriskempson/vim-tomorrow-theme'
39 |
40 | " Edit
41 | NeoBundle 'tpope/vim-repeat'
42 | NeoBundle 'tpope/vim-surround'
43 | NeoBundle 'tpope/vim-endwise'
44 | NeoBundleLazy 'tpope/vim-commentary', { 'autoload': { 'mappings': 'Commentary' } }
45 | NeoBundleLazy 'mbbill/undotree', { 'autoload': { 'commands': 'UndotreeToggle' } }
46 | NeoBundle 'vim-scripts/ReplaceWithRegister'
47 | NeoBundle 'AndrewRadev/splitjoin.vim'
48 | NeoBundle 'rhysd/vim-grammarous'
49 | NeoBundle 'junegunn/vim-online-thesaurus'
50 |
51 | " Tmux
52 | NeoBundle 'tpope/vim-tbone'
53 |
54 | " Browsing
55 | NeoBundleLazy 'Yggdroot/indentLine', { 'autoload': { 'commands': 'IndentLinesToggle' } }
56 | NeoBundleLazy 'scrooloose/nerdtree', { 'autoload': { 'commands': 'NERDTreeToggle' } }
57 |
58 | NeoBundleLazy 'majutsushi/tagbar', { 'autoload': { 'commands': 'TagbarToggle' } }
59 | NeoBundle 'justinmk/vim-gtfo'
60 |
61 | " Git
62 | NeoBundle 'tpope/vim-fugitive'
63 | NeoBundle 'mhinz/vim-signify'
64 |
65 | " Lang
66 | NeoBundle 'vim-ruby/vim-ruby'
67 | NeoBundleLazy 'kovisoft/paredit', { 'autoload': { 'filetypes': 'clojure' } }
68 | NeoBundleLazy 'tpope/vim-fireplace', { 'autoload': { 'filetypes': 'clojure' } }
69 | NeoBundle 'guns/vim-clojure-static'
70 | NeoBundle 'guns/vim-clojure-highlight'
71 | NeoBundle 'guns/vim-slamhound'
72 | NeoBundle 'fatih/vim-go'
73 | NeoBundle 'groenewege/vim-less'
74 | NeoBundle 'pangloss/vim-javascript'
75 | NeoBundle 'mxw/vim-jsx'
76 | NeoBundle 'kchmck/vim-coffee-script'
77 | NeoBundle 'slim-template/vim-slim'
78 | NeoBundle 'Glench/Vim-Jinja2-Syntax'
79 | NeoBundle 'rust-lang/rust.vim'
80 | NeoBundleLazy 'tpope/vim-rails', { 'autoload': { 'filetypes': [] } }
81 | NeoBundle 'derekwyatt/vim-scala'
82 | NeoBundleLazy 'ensime/ensime-vim', { 'autoload': { 'filetypes': 'scala' } }
83 | NeoBundle 'honza/dockerfile.vim'
84 | NeoBundle 'solarnz/thrift.vim'
85 | NeoBundle 'dag/vim-fish'
86 | NeoBundleLazy 'chrisbra/unicode.vim', { 'autoload': { 'filetypes': 'journal' } }
87 |
88 | " Lint
89 | NeoBundleLazy 'scrooloose/syntastic', { 'autoload': { 'commands': 'SyntasticCheck' } }
90 |
91 | call neobundle#end()
92 |
93 | " Required:
94 | filetype plugin indent on
95 | syntax enable
96 |
--------------------------------------------------------------------------------
/result/result.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
232 |
233 |
--------------------------------------------------------------------------------
/vimrc:
--------------------------------------------------------------------------------
1 | " vim: set foldmethod=marker foldlevel=0:
2 | " ============================================================================
3 | " .vimrc of Junegunn Choi {{{
4 | " ============================================================================
5 |
6 | let s:darwin = has('mac')
7 |
8 | " }}}
9 | " ============================================================================
10 | " Plugin manager {{{
11 | " ============================================================================
12 |
13 | execute 'source '.expand(':h').'/plugins.vim'
14 |
15 | " }}}
16 | " ============================================================================
17 | " BASIC SETTINGS {{{
18 | " ============================================================================
19 |
20 | let mapleader = ' '
21 | let maplocalleader = ' '
22 |
23 | augroup vimrc
24 | autocmd!
25 | augroup END
26 |
27 | set nu
28 | set autoindent
29 | set smartindent
30 | set lazyredraw
31 | set laststatus=2
32 | set showcmd
33 | set visualbell
34 | set backspace=indent,eol,start
35 | set timeoutlen=500
36 | set whichwrap=b,s
37 | set shortmess=aIT
38 | set hlsearch " CTRL-L / CTRL-R W
39 | set incsearch
40 | set hidden
41 | set ignorecase smartcase
42 | set wildmenu
43 | set wildmode=full
44 | set tabstop=2
45 | set shiftwidth=2
46 | set expandtab smarttab
47 | set scrolloff=5
48 | set encoding=utf-8
49 | set list
50 | set listchars=tab:\|\ ,
51 | set virtualedit=block
52 | set nojoinspaces
53 | set diffopt=filler,vertical
54 | set autoread
55 | set clipboard=unnamed
56 | set foldlevelstart=99
57 | set grepformat=%f:%l:%c:%m,%f:%l:%m
58 | set completeopt=menuone,preview
59 | set nocursorline
60 | set nrformats=hex
61 | silent! set cryptmethod=blowfish2
62 |
63 | set formatoptions+=1
64 | if has('patch-7.3.541')
65 | set formatoptions+=j
66 | endif
67 | if has('patch-7.4.338')
68 | let &showbreak = '↳ '
69 | set breakindent
70 | set breakindentopt=sbr
71 | endif
72 |
73 | if has('termguicolors')
74 | let &t_8f = "\[38;2;%lu;%lu;%lum"
75 | let &t_8b = "\[48;2;%lu;%lu;%lum"
76 | set termguicolors
77 | endif
78 |
79 | " %< Where to truncate
80 | " %n buffer number
81 | " %F Full path
82 | " %m Modified flag: [+], [-]
83 | " %r Readonly flag: [RO]
84 | " %y Type: [vim]
85 | " fugitive#statusline()
86 | " %= Separator
87 | " %-14.(...)
88 | " %l Line
89 | " %c Column
90 | " %V Virtual column
91 | " %P Percentage
92 | " %#HighlightGroup#
93 | set statusline=%<[%n]\ %F\ %m%r%y\ %{exists('g:loaded_fugitive')?fugitive#statusline():''}\ %=%-14.(%l,%c%V%)\ %P
94 | silent! if emoji#available()
95 | let s:ft_emoji = map({
96 | \ 'c': 'baby_chick',
97 | \ 'clojure': 'lollipop',
98 | \ 'coffee': 'coffee',
99 | \ 'cpp': 'chicken',
100 | \ 'css': 'art',
101 | \ 'eruby': 'ring',
102 | \ 'gitcommit': 'soon',
103 | \ 'haml': 'hammer',
104 | \ 'help': 'angel',
105 | \ 'html': 'herb',
106 | \ 'java': 'older_man',
107 | \ 'javascript': 'monkey',
108 | \ 'make': 'seedling',
109 | \ 'markdown': 'book',
110 | \ 'perl': 'camel',
111 | \ 'python': 'snake',
112 | \ 'ruby': 'gem',
113 | \ 'scala': 'barber',
114 | \ 'sh': 'shell',
115 | \ 'slim': 'dancer',
116 | \ 'text': 'books',
117 | \ 'vim': 'poop',
118 | \ 'vim-plug': 'electric_plug',
119 | \ 'yaml': 'yum',
120 | \ 'yaml.jinja': 'yum'
121 | \ }, 'emoji#for(v:val)')
122 |
123 | function! S_filetype()
124 | if empty(&filetype)
125 | return emoji#for('grey_question')
126 | else
127 | return get(s:ft_emoji, &filetype, '['.&filetype.']')
128 | endif
129 | endfunction
130 |
131 | function! S_modified()
132 | if &modified
133 | return emoji#for('kiss').' '
134 | elseif !&modifiable
135 | return emoji#for('construction').' '
136 | else
137 | return ''
138 | endif
139 | endfunction
140 |
141 | function! S_fugitive()
142 | if !exists('g:loaded_fugitive')
143 | return ''
144 | endif
145 | let head = fugitive#head()
146 | if empty(head)
147 | return ''
148 | else
149 | return head == 'master' ? emoji#for('crown') : emoji#for('dango').'='.head
150 | endif
151 | endfunction
152 |
153 | let s:braille = split('"⠉⠒⠤⣀', '\zs')
154 | function! Braille()
155 | let len = len(s:braille)
156 | let [cur, max] = [line('.'), line('$')]
157 | let pos = min([len * (cur - 1) / max([1, max - 1]), len - 1])
158 | return s:braille[pos]
159 | endfunction
160 |
161 | hi def link User1 TablineFill
162 | let s:cherry = emoji#for('cherry_blossom')
163 | function! MyStatusLine()
164 | let mod = '%{S_modified()}'
165 | let ro = "%{&readonly ? emoji#for('lock') . ' ' : ''}"
166 | let ft = '%{S_filetype()}'
167 | let fug = ' %{S_fugitive()}'
168 | let sep = ' %= '
169 | let pos = ' %l,%c%V '
170 | let pct = ' %P '
171 |
172 | return s:cherry.' [%n] %F %<'.mod.ro.ft.fug.sep.pos.'%{Braille()}%*'.pct.s:cherry
173 | endfunction
174 |
175 | " Note that the "%!" expression is evaluated in the context of the
176 | " current window and buffer, while %{} items are evaluated in the
177 | " context of the window that the statusline belongs to.
178 | set statusline=%!MyStatusLine()
179 | endif
180 |
181 | set pastetoggle=
182 | set modelines=2
183 | set synmaxcol=1000
184 |
185 | " For MacVim
186 | set noimd
187 | set imi=1
188 | set ims=-1
189 |
190 | " ctags
191 | set tags=./tags;/
192 |
193 | " Annoying temporary files
194 | set backupdir=/tmp//,.
195 | set directory=/tmp//,.
196 | if v:version >= 703
197 | set undodir=/tmp//,.
198 | endif
199 |
200 | " Shift-tab on GNU screen
201 | " http://superuser.com/questions/195794/gnu-screen-shift-tab-issue
202 | set t_kB=[Z
203 |
204 | " set complete=.,w,b,u,t
205 | set complete-=i
206 |
207 | " mouse
208 | silent! set ttymouse=xterm2
209 | set mouse=a
210 |
211 | " 80 chars/line
212 | set textwidth=0
213 | if exists('&colorcolumn')
214 | set colorcolumn=80
215 | endif
216 |
217 | " Keep the cursor on the same column
218 | set nostartofline
219 |
220 | " FOOBAR=~/
221 | set isfname-==
222 |
223 | if exists('&fixeol')
224 | set nofixeol
225 | endif
226 |
227 | if has('gui_running')
228 | set guifont=Menlo:h14 columns=80 lines=40
229 | silent! colo seoul256-light
230 | else
231 | silent! colo seoul256
232 | endif
233 |
234 | " }}}
235 | " ============================================================================
236 | " MAPPINGS {{{
237 | " ============================================================================
238 |
239 | " ----------------------------------------------------------------------------
240 | " Basic mappings
241 | " ----------------------------------------------------------------------------
242 |
243 | noremap
244 | noremap
245 |
246 | " Save
247 | inoremap :update
248 | nnoremap :update
249 | nnoremap s :update
250 | nnoremap w :update
251 |
252 | " Disable CTRL-A on tmux or on screen
253 | if $TERM =~ 'screen'
254 | nnoremap
255 | nnoremap
256 | endif
257 |
258 | " Quit
259 | inoremap :q
260 | nnoremap :q
261 | vnoremap
262 | nnoremap q :q
263 | nnoremap Q :qa!
264 |
265 | " Tag stack
266 | nnoremap g[ :pop
267 |
268 | " Jump list (to newer position)
269 | nnoremap
270 |
271 | " | NERD Tree
272 | nnoremap :NERDTreeToggle
273 |
274 | " | Tagbar
275 | if v:version >= 703
276 | inoremap :TagbarToggle
277 | nnoremap :TagbarToggle
278 | let g:tagbar_sort = 0
279 | endif
280 |
281 | " jk | Escaping!
282 | inoremap jk
283 | xnoremap jk
284 | cnoremap jk
285 |
286 | " Movement in insert mode
287 | inoremap h
288 | inoremap a
289 | inoremap j
290 | inoremap k
291 | inoremap
292 |
293 | " Make Y behave like other capitals
294 | nnoremap Y y$
295 |
296 | " qq to record, Q to replay (recursive map due to peekaboo)
297 | nmap Q @q
298 |
299 | " Zoom
300 | function! s:zoom()
301 | if winnr('$') > 1
302 | tab split
303 | elseif len(filter(map(range(tabpagenr('$')), 'tabpagebuflist(v:val + 1)'),
304 | \ 'index(v:val, '.bufnr('').') >= 0')) > 1
305 | tabclose
306 | endif
307 | endfunction
308 | nnoremap z :call zoom()
309 |
310 | " ----------------------------------------------------------------------------
311 | " nvim
312 | " ----------------------------------------------------------------------------
313 | if has('nvim')
314 | tnoremap a
315 | tnoremap b
316 | tnoremap d
317 | tnoremap f
318 | endif
319 |
320 | " ----------------------------------------------------------------------------
321 | " Quickfix
322 | " ----------------------------------------------------------------------------
323 | nnoremap ]q :cnextzz
324 | nnoremap [q :cprevzz
325 | nnoremap ]l :lnextzz
326 | nnoremap [l :lprevzz
327 |
328 | " ----------------------------------------------------------------------------
329 | " Buffers
330 | " ----------------------------------------------------------------------------
331 | nnoremap ]b :bnext
332 | nnoremap [b :bprev
333 |
334 | " ----------------------------------------------------------------------------
335 | " Tabs
336 | " ----------------------------------------------------------------------------
337 | nnoremap ]t :tabn
338 | nnoremap [t :tabp
339 |
340 | " ----------------------------------------------------------------------------
341 | " / | Circular windows navigation
342 | " ----------------------------------------------------------------------------
343 | nnoremap w
344 | nnoremap W
345 |
346 | " ----------------------------------------------------------------------------
347 | " / / | super-duper-tab
348 | " ----------------------------------------------------------------------------
349 | function! s:can_complete(func, prefix)
350 | if empty(a:func) || call(a:func, [1, '']) < 0
351 | return 0
352 | endif
353 | let result = call(a:func, [0, matchstr(a:prefix, '\k\+$')])
354 | return !empty(type(result) == type([]) ? result : result.words)
355 | endfunction
356 |
357 | function! s:super_duper_tab(k, o)
358 | if pumvisible()
359 | return a:k
360 | endif
361 |
362 | let line = getline('.')
363 | let col = col('.') - 2
364 | if line[col] !~ '\k\|[/~.]'
365 | return a:o
366 | endif
367 |
368 | let prefix = expand(matchstr(line[0:col], '\S*$'))
369 | if prefix =~ '^[~/.]'
370 | return "\\"
371 | endif
372 | if s:can_complete(&omnifunc, prefix)
373 | return "\\"
374 | endif
375 | if s:can_complete(&completefunc, prefix)
376 | return "\\"
377 | endif
378 | return a:k
379 | endfunction
380 |
381 | inoremap super_duper_tab("\", "\")
382 | inoremap super_duper_tab("\", "\")
383 |
384 | " ----------------------------------------------------------------------------
385 | " Markdown headings
386 | " ----------------------------------------------------------------------------
387 | nnoremap 1 m`yypVr=``
388 | nnoremap 2 m`yypVr-``
389 | nnoremap 3 m`^i### ``4l
390 | nnoremap 4 m`^i#### ``5l
391 | nnoremap 5 m`^i##### ``6l
392 |
393 | " ----------------------------------------------------------------------------
394 | " Moving lines
395 | " ----------------------------------------------------------------------------
396 | nnoremap :move-2
397 | nnoremap :move+
398 | nnoremap <<
399 | nnoremap >>
400 | xnoremap :move-2gv
401 | xnoremap :move'>+gv
402 | xnoremap >gv
404 | xnoremap < >gv
406 |
407 | " ----------------------------------------------------------------------------
408 | " Cscope mappings
409 | " ----------------------------------------------------------------------------
410 | function! s:add_cscope_db()
411 | " add any database in current directory
412 | let db = findfile('cscope.out', '.;')
413 | if !empty(db)
414 | silent cs reset
415 | silent! execute 'cs add' db
416 | " else add database pointed to by environment
417 | elseif !empty($CSCOPE_DB)
418 | silent cs reset
419 | silent! execute 'cs add' $CSCOPE_DB
420 | endif
421 | endfunction
422 |
423 | if has("cscope")
424 | set csprg=/usr/local/bin/cscope
425 | set csto=0
426 | set cst
427 | set nocsverb
428 | set csverb
429 | call s:add_cscope_db()
430 |
431 | " 's' symbol: find all references to the token under cursor
432 | " 'g' global: find global definition(s) of the token under cursor
433 | " 'c' calls: find all calls to the function name under cursor
434 | " 't' text: find all instances of the text under cursor
435 | " 'e' egrep: egrep search for the word under cursor
436 | " 'f' file: open the filename under cursor
437 | " 'i' includes: find files that include the filename under cursor
438 | " 'd' called: find functions that function under cursor calls
439 | nnoremap s :cs find s =expand("")
440 | nnoremap g :cs find g =expand("")
441 | nnoremap c :cs find c =expand("")
442 | nnoremap t :cs find t =expand("")
443 | xnoremap t y:cs find t "
444 | " nnoremap e :cs find e =expand("")
445 | nnoremap f :cs find f =expand("")
446 | " nnoremap i :cs find i ^=expand("")$
447 | nnoremap d :cs find d =expand("")
448 |
449 | " extends
450 | nnoremap e :cs find t extends =expand("")
451 | " implements
452 | nnoremap i :cs find t implements =expand("")
453 | " new
454 | nnoremap n :cs find t new =expand("")
455 | endif
456 |
457 | " ----------------------------------------------------------------------------
458 | " c Close quickfix/location window
459 | " ----------------------------------------------------------------------------
460 | nnoremap c :ccloselclose
461 |
462 | " ----------------------------------------------------------------------------
463 | " Readline-style key bindings in command-line (excerpt from rsi.vim)
464 | " ----------------------------------------------------------------------------
465 | cnoremap
466 | cnoremap
467 | cnoremap getcmdpos()>strlen(getcmdline())?"\C-D>":"\Del>"
468 | cnoremap getcmdpos()>strlen(getcmdline())?&cedit:"\Right>"
469 | cnoremap
470 | cnoremap
471 | silent! exe "set =\b"
472 | silent! exe "set =\f"
473 |
474 | " ----------------------------------------------------------------------------
475 | " #gi / #gpi | go to next/previous indentation level
476 | " ----------------------------------------------------------------------------
477 | function! s:go_indent(times, dir)
478 | for _ in range(a:times)
479 | let l = line('.')
480 | let x = line('$')
481 | let i = s:indent_len(getline(l))
482 | let e = empty(getline(l))
483 |
484 | while l >= 1 && l <= x
485 | let line = getline(l + a:dir)
486 | let l += a:dir
487 | if s:indent_len(line) != i || empty(line) != e
488 | break
489 | endif
490 | endwhile
491 | let l = min([max([1, l]), x])
492 | execute 'normal! '. l .'G^'
493 | endfor
494 | endfunction
495 | nnoremap gi :call go_indent(v:count1, 1)
496 | nnoremap gpi :call go_indent(v:count1, -1)
497 |
498 | " ----------------------------------------------------------------------------
499 | " bs | buf-search
500 | " ----------------------------------------------------------------------------
501 | nnoremap bs :cex []bufdo vimgrepadd @@g %cw
502 |
503 | " ----------------------------------------------------------------------------
504 | " #!! | Shebang
505 | " ----------------------------------------------------------------------------
506 | inoreabbrev #!! "#!/usr/bin/env" . (empty(&filetype) ? '' : ' '.&filetype)
507 |
508 | " ----------------------------------------------------------------------------
509 | " ij | Open in IntelliJ
510 | " ----------------------------------------------------------------------------
511 | if s:darwin
512 | nnoremap ij
513 | \ :call system('"/Applications/IntelliJ IDEA CE.app/Contents/MacOS/idea" '.expand('%:p'))
514 | endif
515 |
516 | " }}}
517 | " ============================================================================
518 | " FUNCTIONS & COMMANDS {{{
519 | " ============================================================================
520 |
521 | " ----------------------------------------------------------------------------
522 | " :CSBuild
523 | " ----------------------------------------------------------------------------
524 | function! s:build_cscope_db(...)
525 | let git_dir = system('git rev-parse --git-dir')
526 | let chdired = 0
527 | if !v:shell_error
528 | let chdired = 1
529 | execute 'cd' substitute(fnamemodify(git_dir, ':p:h'), ' ', '\\ ', 'g')
530 | endif
531 |
532 | let exts = empty(a:000) ?
533 | \ ['java', 'c', 'h', 'cc', 'hh', 'cpp', 'hpp'] : a:000
534 |
535 | let cmd = "find . " . join(map(exts, "\"-name '*.\" . v:val . \"'\""), ' -o ')
536 | let tmp = tempname()
537 | try
538 | echon 'Building cscope.files'
539 | call system(cmd.' | grep -v /test/ > '.tmp)
540 | echon ' - cscoped db'
541 | call system('cscope -b -q -i'.tmp)
542 | echon ' - complete!'
543 | call s:add_cscope_db()
544 | finally
545 | silent! call delete(tmp)
546 | if chdired
547 | cd -
548 | endif
549 | endtry
550 | endfunction
551 | command! CSBuild call s:build_cscope_db()
552 |
553 | " ----------------------------------------------------------------------------
554 | " :Chomp
555 | " ----------------------------------------------------------------------------
556 | command! Chomp %s/\s\+$// | normal! ``
557 |
558 | " ----------------------------------------------------------------------------
559 | " :Count
560 | " ----------------------------------------------------------------------------
561 | command! -nargs=1 Count execute printf('%%s/%s//gn', escape(, '/')) | normal! ``
562 |
563 | " ----------------------------------------------------------------------------
564 | " :CopyRTF
565 | " ----------------------------------------------------------------------------
566 | function! s:colors(...)
567 | return filter(map(filter(split(globpath(&rtp, 'colors/*.vim'), "\n"),
568 | \ 'v:val !~ "^/usr/"'),
569 | \ 'fnamemodify(v:val, ":t:r")'),
570 | \ '!a:0 || stridx(v:val, a:1) >= 0')
571 | endfunction
572 |
573 | function! s:copy_rtf(line1, line2, ...)
574 | let [ft, cs, nu] = [&filetype, g:colors_name, &l:nu]
575 | let lines = getline(1, '$')
576 |
577 | tab new
578 | setlocal buftype=nofile bufhidden=wipe nonumber
579 | let &filetype = ft
580 | call setline(1, lines)
581 |
582 | execute 'colo' get(a:000, 0, 'seoul256-light')
583 | hi Normal ctermbg=NONE guibg=NONE
584 |
585 | let lines = getline(a:line1, a:line2)
586 | let indent = repeat(' ', min(map(filter(copy(lines), '!empty(v:val)'), 'len(matchstr(v:val, "^ *"))')))
587 | call setline(a:line1, map(lines, 'substitute(v:val, indent, "", "")'))
588 |
589 | call tohtml#Convert2HTML(a:line1, a:line2)
590 | g/^\(pre\|body\) {/s/background-color: #[0-9]*; //
591 | silent %write !textutil -convert rtf -textsizemultiplier 1.3 -stdin -stdout | pbcopy
592 |
593 | bd!
594 | tabclose
595 |
596 | let &l:nu = nu
597 | execute 'colorscheme' cs
598 | endfunction
599 |
600 | if s:darwin
601 | command! -range=% -nargs=? -complete=customlist,s:colors CopyRTF call s:copy_rtf(, , )
602 | endif
603 |
604 | " ----------------------------------------------------------------------------
605 | " :Root | Change directory to the root of the Git repository
606 | " ----------------------------------------------------------------------------
607 | function! s:root()
608 | let root = systemlist('git rev-parse --show-toplevel')[0]
609 | if v:shell_error
610 | echo 'Not in git repo'
611 | else
612 | execute 'lcd' root
613 | echo 'Changed directory to: '.root
614 | endif
615 | endfunction
616 | command! Root call s:root()
617 |
618 | " ----------------------------------------------------------------------------
619 | " / | Run script
620 | " ----------------------------------------------------------------------------
621 | function! s:run_this_script(output)
622 | let head = getline(1)
623 | let pos = stridx(head, '#!')
624 | let file = expand('%:p')
625 | let ofile = tempname()
626 | let rdr = " 2>&1 | tee ".ofile
627 | let win = winnr()
628 | let prefix = a:output ? 'silent !' : '!'
629 | " Shebang found
630 | if pos != -1
631 | execute prefix.strpart(head, pos + 2).' '.file.rdr
632 | " Shebang not found but executable
633 | elseif executable(file)
634 | execute prefix.file.rdr
635 | elseif &filetype == 'ruby'
636 | execute prefix.'/usr/bin/env ruby '.file.rdr
637 | elseif &filetype == 'tex'
638 | execute prefix.'latex '.file. '; [ $? -eq 0 ] && xdvi '. expand('%:r').rdr
639 | elseif &filetype == 'dot'
640 | let svg = expand('%:r') . '.svg'
641 | let png = expand('%:r') . '.png'
642 | " librsvg >> imagemagick + ghostscript
643 | execute 'silent !dot -Tsvg '.file.' -o '.svg.' && '
644 | \ 'rsvg-convert -z 2 '.svg.' > '.png.' && open '.png.rdr
645 | else
646 | return
647 | end
648 | redraw!
649 | if !a:output | return | endif
650 |
651 | " Scratch buffer
652 | if exists('s:vim_exec_buf') && bufexists(s:vim_exec_buf)
653 | execute bufwinnr(s:vim_exec_buf).'wincmd w'
654 | %d
655 | else
656 | silent! bdelete [vim-exec-output]
657 | silent! vertical botright split new
658 | silent! file [vim-exec-output]
659 | setlocal buftype=nofile bufhidden=wipe noswapfile
660 | let s:vim_exec_buf = winnr()
661 | endif
662 | execute 'silent! read' ofile
663 | normal! gg"_dd
664 | execute win.'wincmd w'
665 | endfunction
666 | nnoremap :call run_this_script(0)
667 | nnoremap