Vim plugins: Difference between revisions

From miki
Jump to navigation Jump to search
No edit summary
Line 148: Line 148:
== Installed plugins ==
== Installed plugins ==
Plugins I'm currently using.
Plugins I'm currently using.

=== ultisnips ===
=== A ===
[https://github.com/nacitar/a.vim '''a.vim''' : Alternate Files quickly (.c --> .h etc)] (forked version, the [http://www.vim.org/scripts/script.php?script_id=31 original version])

=== ack.vim ===

{| class=wikitable width=100%
{| class=wikitable width=100%
|-
|-
|width=72pt|
|width=72pt|
|width=72pt|[https://github.com/SirVer/ultisnips GitHub]
|width=72pt|[https://github.com/mileszs/ack.vim GitHub]
!width=15%|ultisnips
!width=15%|ack.vim
|Vim plugin for the Perl module / CLI script 'ack'
| UltiSnips - The ultimate snippet solution for Vim. Send pull requests to SirVer/ultisnips!
|-
|width=72pt|
|width=72pt|[https://github.com/honza/vim-snippets GitHub]
!width=15%|vim-snippets
| vim-snipmate default snippets (Previously snipmate-snippets)
|-
|-
|colspan=4|
|colspan=4|
{|
{|
|-
|-
| ||
|{{kb|^J}}
|Expand snippet / go to next placeholder
|-
|{{kb|^K}}
| Go to previous placeholder
|}
|}
|}
|}
I fell back to this plugin because [https://github.com/rking/ag.vim ag.vim] is stalled. But we can still use '''ag''' as search engine.


My settings [http://vim.wikia.com/wiki/Replace_a_builtin_command_using_cabbrev]:
Ultisnips is a snippet engine written in Python. Other snippet plugins:
* [http://www.vim.org/scripts/script.php?script_id=2540 '''snipMate'''], inspired from TextMate.
* https://github.com/garbas/vim-snipmate (garbas' fork), http://github.com/msanders/snipmate.vim (original, stalled)
* Another engine, also very powerful but different syntax (not compatible with vim-snippets): https://github.com/drmingdrmer/xptemplate

;Configuration
* We configure ultisnips to use {{kb|^J}} / {{kb|^K}} for expansion and next/previous, and leave {{kb|Tab}} key for completion with plugin SuperTab (which will trigger YouCompleteMe as well).
* Another option is to use {{kb|Tab}} for expansion (see [https://github.com/christoomey/dotfiles/blob/master/vim/rcplugins/youcompleteme-ultisnips-supertab these] [http://stackoverflow.com/questions/14896327/ultisnips-and-youcompleteme/22253548#22253548 posts] for instance).

<source lang=vim>
<source lang=vim>
if executable('ag')
" --- Ultisnips / vim-snippets-----------------------------------------------------------------{{{
" Use ag over grep - See ag man page for option '--vimgrep'
" Use C-j/C-k for snippet expansion and next/previous.
set grepprg=ag\ --vimgrep\ $*
" To use 'tab', see https://github.com/christoomey/dotfiles/blob/master/vim/rcplugins/youcompleteme-ultisnips-supertab
set grepformat=%f:%l:%c:%m
let g:UltiSnipsEditSplit = 'vertical'
let g:UltiSnipsExpandTrigger = '<C-j>'
let g:UltiSnipsJumpForwardTrigger = '<C-j>'
let g:UltiSnipsJumpBackwardTrigger = '<C-k>'
</source>


" bind K to grep word under cursor
;Snippets
nnoremap K :grep! "\b<C-R><C-W>\b"<CR>:cw<CR>
Snippets must be installed separately. Some snippets from [https://github.com/honza/vim-snippets vim-snippets]:
let g:ackprg = 'ag --vimgrep'

" Allow lowercase command 'ag' - see http://vim.wikia.com/wiki/Replace_a_builtin_command_using_cabbrev
#### C ####
cnoreabbrev ag <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'Ack' : 'ag')<CR>

endif
'''main''' main()
'''inc''' #include &lt;...&gt;
'''Inc''' #include "..."
'''Def''' #ifndef ... #define ... #endif
'''def''' #define
'''ifdef''' #ifdef ... #endif
'''#if''' #if ... #endif
'''once''' #ifndef HEADER_H .... # define HEADER_H ... #endif (Header Include-Guard)
'''if''' If (...) { ... }
'''el''' else { ... }
'''t''' ... ? ... : ... (tertiary conditional)
'''do''' do ... while ( ... )
'''wh''' while (...) { ... }
'''for''' for (... = 0; ...; ...) { ... }
'''forr''' for (... = ...; ...; ...) { ... }
'''fun''' ... function(...) { ... }
'''fund''' ... function(...;)
'''td''' typedef
'''st''' struct
'''tds''' typedef struct
'''tde''' typedef enum
'''pr''' printf
'''fpr''' fprintf
'''.''' [ ... ]
'''un''' unsigned

#### C++ ####

'''readfile''' snippet for reading file
'''map''' std::map<... , ...> map...
'''vector''' std::vector<...> v...
'''ns''' namespace ... { ... }
'''cl''' class { public: ... private: };

=== A ===
[https://github.com/nacitar/a.vim '''a.vim''' : Alternate Files quickly (.c --> .h etc)] (forked version, the [http://www.vim.org/scripts/script.php?script_id=31 original version])

=== AutoTag ===
[http://www.vim.org/scripts/script.php?script_id=1343 '''AutoTag''' : Updates entries in a tags file automatically when saving]

=== Surround ===
[http://www.vim.org/scripts/script.php?script_id=1697 '''surround.vim''' : Delete/change/add parentheses/quotes/XML-tags/much more with ease] ([https://github.com/tpope/vim-surround github])

=== Repeat ===
Install [http://www.vim.org/scripts/script.php?script_id=2136 '''repeat.vim''' : Use the repeat command (.) with supported plugins]

=== tComment ===
[http://www.vim.org/scripts/script.php?script_id=1173 '''tComment''' : An extensible & universal comment plugin that also handles embedded filetypes]

=== IndentTab ===
{| class=wikitable width=100%
|-
|width=72pt|[http://www.vim.org/scripts/script.php?script_id=4243 vim.org]
|width=72pt|[https://github.com/xeyownt/IndentTab.git GitHub]
!width=15%|IndentTab
|Use tabs for indent at the beginning, spaces for alignment in the rest of a line
|-
|}
This plugin works better than [http://www.vim.org/scripts/script.php?script_id=231 ''Smart-Tabs'' (ctab.vim)].

See also [http://vim.wikia.com/wiki/Indent_with_tabs%2C_align_with_spaces Indent with tabs & align with spaces].

;Configuration
We must make sure that it is loaded before plugin ''SuperTab'' (so that the latter can record IndentTab maps for {{kb|Tab}}).
<source lang=vim>
Plug 'xeyownt/IndentTab' | " Use tabs for indent at the beginning, spaces for alignment in the rest of a line
Plug 'ervandew/supertab' " Perform all your vim insert mode completions with Tab
</source>
</source>
<source lang=vim>
" --- IndentTab -------------------------------------------------------------------------------{{{
let g:IndentTab = 1 " Enable the plugin
let g:IndentTab_IsSuperTab = 1 " Enable integration with supertab
let g:IndentTab_scopes = 'indent' " Disable 'commentprefix' and 'string', which require ingo-library
" }}}
</source>

=== Cpp.vim ===
[http://www.derekwyatt.org/vim/working-with-vim-and-cpp/general-cpp-settings/ '''cpp.vim''': General C++ Settings (no indentation for namespace...)]
:'' (disabled highlight of leading tabs, line length overruns, unit test header test + nice <code>AlterColour</code> function that computes new colour...)''

=== CScope ===
'''[http://cscope.sourceforge.net/cscope_maps.vim CScope]''' (also mirrored on [https://github.com/simplyzhao/cscope_maps.vim GitHub])
* Cscope page is available on [http://cscope.sourceforge.net/ SourceForge].
* See the [http://cscope.sourceforge.net/cscope_vim_tutorial.html tutorial here]
* [http://vim.wikia.com/wiki/Cscope Cscope on Vim Wiki]
* One can also use [http://stackoverflow.com/questions/934233/cscope-or-ctags-why-choose-one-over-the-other cscope and ctags together]


=== Auto-Pairs ===
=== Auto-Pairs ===
Line 326: Line 227:
* http://stackoverflow.com/questions/883437/how-do-i-get-vim-to-automatically-put-ending-braces
* http://stackoverflow.com/questions/883437/how-do-i-get-vim-to-automatically-put-ending-braces


=== Vim BufStat ===
=== AutoTag ===
[http://www.vim.org/scripts/script.php?script_id=1343 '''AutoTag''' : Updates entries in a tags file automatically when saving]
[https://github.com/rson/vim-bufstat '''Vim BufStat''']
*[http://vim.1045645.n5.nabble.com/MiniBufExplorer-questions-closing-a-buffer-making-it-invisible-etc-td1181293.html MiniBufExplorer questions (closing a buffer, making it invisible, etc.)] (use '''d''' in minibufexpl, :set hidden to navigate to other buf even if current modified)
*[http://vim.1045645.n5.nabble.com/MiniBufExplorer-question-td1163160.html Can we remap :q to :bd only when 2 or more buffer opened]?
*An alternative is [http://www.vim.org/scripts/script.php?script_id=1664 '''buftabs''': Minimalistic buffer tabs saving screen space] (more at [http://stackoverflow.com/questions/4865132/an-alternative-to-minibufexplorer-vim StackOverflow - An alternative to minibufexplorer (vim)?])
*[http://stackoverflow.com/questions/1250943/minibufexplorer-and-nerd-tree-closing-buffers-unexpected-behavior StackOverflow - MiniBufExplorer and NERD_Tree closing buffers unexpected behavior]: See [http://vim.wikia.com/wiki/VimTip165 tip165 - bclose] + custom mapping below, :bd might just be good enough though...
<source lang="vim">
" GRB: use fancy buffer closing that doesn't close the split
cnoremap <expr> bd (getcmdtype() == ':' ? 'Bclose' : 'bd')
</source>


=== LustyExplorer ===
=== Cpp.vim ===
[http://www.derekwyatt.org/vim/working-with-vim-and-cpp/general-cpp-settings/ '''cpp.vim''': General C++ Settings (no indentation for namespace...)]
{| class=wikitable width=100%
:'' (disabled highlight of leading tabs, line length overruns, unit test header test + nice <code>AlterColour</code> function that computes new colour...)''
|-
|width=72pt|[http://www.vim.org/scripts/script.php?script_id=1890 vim.org]
|width=72pt|[https://github.com/vim-scripts/LustyExplorer GitHub]
!width=15%|LustyExplorer
|Dynamic filesystem and buffer explore
|-
|colspan=4|[https://github.com/sjbach/lusty More recent GitHub (merged with LustyJuggler)]
|}


=== FuzzyFinder ===
=== cpsm ===
[http://www.vim.org/scripts/script.php?script_id=1984 '''FuzzyFinder''' : buffer/file/command/tag/etc explorer with fuzzy matching]
* Alternative, [https://wincent.com/products/command-t Command-T] (inspired from TextMate)
* See also [http://linsong.github.com/2010/03/20/super-finder-in-vim.html Super-Finder in Vim] (using FuzzyFinder)
* After <code>:set path=/path/to/project/**</code>, one can do <code>:find filename.ext</code> (See [http://stackoverflow.com/questions/3241566/is-there-a-quick-way-with-macvim-nerdtree-plugin-to-find-a-file], more details at [http://vim.wikia.com/wiki/Find_files_in_subdirectories])
* To find a file in a sub-directory, use the fuzzy query <tt>**/filename</tt>

=== Vim-LaTeX ===
'''[http://vim-latex.sourceforge.net/ vim-latex]''' ([http://vim-latex.sourceforge.net/documentation/latex-suite.html documentation]
See page [[vim-latex]].

=== SparkUp ===
[https://github.com/rstacruz/sparkup '''Sparkup''' &mdash; A parser for a condensed HTML format]
Use {{kb|^e}} in edit mode to extend sparkup text, and {{kb|^n}} to go to next empty item. Some examples (more at [https://code.google.com/p/zen-coding/ Zen Coding]:
<pre>
div#page.section.main
div[title]
a[title="Hello world" rel]
td[colspan=2]
ul > li*5
li.item$$$*3
div#page>(div#header>ul#nav>li*4>a)+(div#page>(h1>span)+p*2)+div#footer
#content>.section
div#content>div.section
p>{Click }+a{here}+{ to continue}
</pre>

=== MatchIt ===
[http://www.vim.org/scripts/script.php?script_id=39 '''matchit.zip''' : extended % matching for HTML, LaTeX, and many other languages]

=== VimWiki ===
{| class=wikitable width=100%
{| class=wikitable width=100%
|-
|-
|width=72pt|
|width=72pt|[http://www.vim.org/scripts/script.php?script_id=2226 vim.org]
|width=72pt|[https://github.com/vimwiki/vimwiki GitHub]
|width=72pt|[https://github.com/nixprime/cpsm GitHub]
!width=15%|vimwiki
!width=15%|cpsm
|A CtrlP matcher, specialized for paths.
|Personal Wiki for Vim
|-
|-
|colspan=4|
|colspan=4|
{|
{|
|-
|-
|{{kb|S-CR}} || Continue list
|{{kb|C-p}}
|Ctrl-P file mode
|-
|-
|{{kb|C-o}}
|{{kb|gq}} || Quote text block with <code>{{{ ... }}}</code>
|Ctrl-P MRU mode
|}
|}
|}
|}
To install:
To quote a text block with <code>{{{ ... }}}</code> in visual mode, add to {{file|~/.vim/ftplugin/vimwiki_custom.vim}}:
<source lang=vim>
<source lang=bash>
sudo apt install libboost-all-dev cmake python-dev libicu-dev
" Quote a block of text with {{{ }}} in visual mode
cd ~/.vim/plugged/cpsm
:vmap gq DO {{{<CR><ESC>P
./install.sh
</source>
</source>


=== CScope ===
;Troubleshooting
'''[http://cscope.sourceforge.net/cscope_maps.vim CScope]''' (also mirrored on [https://github.com/simplyzhao/cscope_maps.vim GitHub])
* {{kb|Tab}} not working anymore on <code>dev</code> branch. This is because {{kb|tab}} is already mapped by plugin SuperTab, and Vimwiki refuses to remap.
* Cscope page is available on [http://cscope.sourceforge.net/ SourceForge].
<source lang="diff">
* See the [http://cscope.sourceforge.net/cscope_vim_tutorial.html tutorial here]
--- a/ftplugin/vimwiki.vim
* [http://vim.wikia.com/wiki/Cscope Cscope on Vim Wiki]
+++ b/ftplugin/vimwiki.vim
* One can also use [http://stackoverflow.com/questions/934233/cscope-or-ctags-why-choose-one-over-the-other cscope and ctags together]
@@ -532,13 +532,9 @@ endfunction
" insert mode table mappings
if str2nr(vimwiki#vars#get_global('key_mappings').table_mappings)
- if maparg('<Tab>', 'i') ==# ''
inoremap <expr><buffer> <Tab> vimwiki#tbl#kbd_tab()
- endif
- if maparg('<S-Tab>', 'i') ==# ''
inoremap <expr><buffer> <S-Tab> vimwiki#tbl#kbd_shift_tab()
endif
-endif
</source>

=== ack.vim ===

{| class=wikitable width=100%
|-
|width=72pt|
|width=72pt|[https://github.com/mileszs/ack.vim GitHub]
!width=15%|ack.vim
|Vim plugin for the Perl module / CLI script 'ack'
|-
|colspan=4|
{|
|-
| ||
|}
|}
I fell back to this plugin because [https://github.com/rking/ag.vim ag.vim] is stalled. But we can still use '''ag''' as search engine.

My settings [http://vim.wikia.com/wiki/Replace_a_builtin_command_using_cabbrev]:
<source lang=vim>
if executable('ag')
" Use ag over grep - See ag man page for option '--vimgrep'
set grepprg=ag\ --vimgrep\ $*
set grepformat=%f:%l:%c:%m

" bind K to grep word under cursor
nnoremap K :grep! "\b<C-R><C-W>\b"<CR>:cw<CR>
let g:ackprg = 'ag --vimgrep'
" Allow lowercase command 'ag' - see http://vim.wikia.com/wiki/Replace_a_builtin_command_using_cabbrev
cnoreabbrev ag <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'Ack' : 'ag')<CR>
endif
</source>


=== ctrlp.vim ===
=== ctrlp.vim ===
Line 503: Line 319:
</source>
</source>


=== Mcf-make-target ===
=== DoxygenToolkit.vim ===
[https://github.com/taketwo/mcf/blob/master/.vim/plugin/mcf-make-target.vim '''mcf-make-target''': Persistent make target in Vim]
This plugin lets Vim to store the last arguments passed to make, and use that argument when make is invoked without arguments. For ease, define the following macro:
<source lang=vim>
:nmap <F5> :wa<CR>:Make<CR>:cw<CR> # Note the capital M to Make
</source>
To build a custom target:
<source lang=vim>
:Make <targetname> # first invocation. Store targetname for future use
<F5> # next
</source>

=== Vim-gitgutter ===
{| class=wikitable width=100%
{| class=wikitable width=100%
|-
|-
|width=72pt|
|width=72pt|
|width=72pt|[https://github.com/airblade/vim-gitgutter GitHub]
|width=72pt|[https://github.com/vim-scripts/DoxygenToolkit.vim GitHub]
!width=15%|vim-gitgutter
!width=15%|DoxygenToolkit.vim
| Simplify Doxygen documentation in C, C++, Python
|A Vim plugin which shows a git diff in the gutter (sign column) and stages/undoes hunks
|-
|colspan=4|
{|
|-
|<code>:Dox</code>
|Fill doxygen for function declaration.
|}
|}
|}

My configuration
<source lang="vim">
" --- DoxygenToolkit --------------------------------------------------------------------------{{{
let g:DoxygenToolkit_briefTag_pre="@Synopsis "
let g:DoxygenToolkit_paramTag_pre="@Param "
let g:DoxygenToolkit_returnTag="@Returns "
let g:DoxygenToolkit_blockHeader="--------------------------------------------------------------------------"
let g:DoxygenToolkit_blockFooter="----------------------------------------------------------------------------"
let g:DoxygenToolkit_authorName="Michael Peeters"
" let g:DoxygenToolkit_licenseTag=""
</source>


=== Fugitive ===
=== Fugitive ===
Line 569: Line 392:
</source>
</source>


=== Vim-easymotion ===
=== fzf.vim ===
{| class=wikitable width=100%
{| class=wikitable width=100%
|-
|-
|width=72pt|
|width=72pt|[http://www.vim.org/scripts/script.php?script_id=3526 vim.org]
|width=72pt|[https://github.com/easymotion/vim-easymotion GitHub]
|width=72pt|[https://github.com/junegunn/fzf.vim GitHub]
!width=15%|vim-easymotion
!width=15%|fzf.vim
|fzf :heart: vim
|Vim motions on speed!
|-
|-
|colspan=4|
|colspan=4|
{|
{|
|-
|-
|{{kbkey|\\w}} {{kbkey|\\f}}
|{{kb|C-p}}
|Ctrl-P file mode
|Horizontal move
|-
|-
|{{kb|C-o}}
| {{kbkey|\\j}} {{kbkey|\\k}}
|Ctrl-P MRU mode
|Vertical move
|}
|}
|}
|}


;Neovim
;Example configuration
fzf.vim uses neovim terminal emulator. Use this mapping to have {{kb|esc}} key leave fzf, but go to normal mode in other terminals [https://github.com/junegunn/fzf/issues/576]:
<source lang=vim>
" <Leader>f{char} to move to {char}
map <Leader>f <Plug>(easymotion-bd-f)
nmap <Leader>f <Plug>(easymotion-overwin-f)


<source lang=vim>
" s{char}{char} to move to {char}{char}
tnoremap <expr> <esc> &filetype == 'fzf' ? "\<esc>" : "\<c-\>\<c-n>"
nmap s <Plug>(easymotion-overwin-f2)

" Move to line
map <Leader>L <Plug>(easymotion-bd-jk)
nmap <Leader>L <Plug>(easymotion-overwin-line)

" Move to word
map <Leader>w <Plug>(easymotion-bd-w)
nmap <Leader>w <Plug>(easymotion-overwin-w)
</source>
</source>


=== Vim-incsearch ===
=== IndentTab ===
{| class=wikitable width=100%
{| class=wikitable width=100%
|-
|-
|width=72pt|[http://www.vim.org/scripts/script.php?script_id=5038 vim.org]
|width=72pt|[http://www.vim.org/scripts/script.php?script_id=4243 vim.org]
|width=72pt|[https://github.com/haya14busa/incsearch.vim GitHub]
|width=72pt|[https://github.com/xeyownt/IndentTab.git GitHub]
!width=15%|incsearch.vim
!width=15%|IndentTab
|Use tabs for indent at the beginning, spaces for alignment in the rest of a line
|Improved incremental searching for Vim
|-
|-
|width=72pt|
|width=72pt|[https://github.com/haya14busa/incsearch-easymotion.vim GitHub]
!width=15%|incsearch-easymotion.vim
|''Integration between incsearch and easymotion''
|-
|colspan=4|
{|
|-
|{{kb|Tab}}
|Move cursor to next match
|-
| {{kb|S-Tab}}
|Move cursor to previous match
|}
|}
|}
This plugin works better than [http://www.vim.org/scripts/script.php?script_id=231 ''Smart-Tabs'' (ctab.vim)].


See also [http://vim.wikia.com/wiki/Indent_with_tabs%2C_align_with_spaces Indent with tabs & align with spaces].
See website for more features (including fuzzy search, etc.).


;Configuration
;Integration with easy-motion:
We must make sure that it is loaded before plugin ''SuperTab'' (so that the latter can record IndentTab maps for {{kb|Tab}}).
<source lang=vim>
<source lang=vim>
Plug 'xeyownt/IndentTab' | " Use tabs for indent at the beginning, spaces for alignment in the rest of a line
" You can use other keymappings like <C-l> instead of <CR> if you want to
Plug 'ervandew/supertab' " Perform all your vim insert mode completions with Tab
" use these mappings as default search and somtimes want to move cursor with
</source>
" EasyMotion.
<source lang=vim>
function! s:incsearch_config(...) abort
" --- IndentTab -------------------------------------------------------------------------------{{{
return incsearch#util#deepextend(deepcopy({
let g:IndentTab = 1 " Enable the plugin
\ 'modules': [incsearch#config#easymotion#module({'overwin': 1})],
let g:IndentTab_IsSuperTab = 1 " Enable integration with supertab
\ 'keymap': {
let g:IndentTab_scopes = 'indent' " Disable 'commentprefix' and 'string', which require ingo-library
\ "\<CR>": '<Over>(easymotion)'
" }}}
\ },
</source>
\ 'is_expr': 0
\ }), get(a:, 1, {}))
endfunction


=== MatchIt ===
noremap <silent><expr> / incsearch#go(<SID>incsearch_config())
[http://www.vim.org/scripts/script.php?script_id=39 '''matchit.zip''' : extended % matching for HTML, LaTeX, and many other languages]
noremap <silent><expr> ? incsearch#go(<SID>incsearch_config({'command': '?'}))

noremap <silent><expr> g/ incsearch#go(<SID>incsearch_config({'is_stay': 1}))
=== Mcf-make-target ===
[https://github.com/taketwo/mcf/blob/master/.vim/plugin/mcf-make-target.vim '''mcf-make-target''': Persistent make target in Vim]
This plugin lets Vim to store the last arguments passed to make, and use that argument when make is invoked without arguments. For ease, define the following macro:
<source lang=vim>
:nmap <F5> :wa<CR>:Make<CR>:cw<CR> # Note the capital M to Make
</source>
To build a custom target:
<source lang=vim>
:Make <targetname> # first invocation. Store targetname for future use
<F5> # next
</source>
</source>


=== Vim-easy-align ===
=== Repeat ===
Install [http://www.vim.org/scripts/script.php?script_id=2136 '''repeat.vim''' : Use the repeat command (.) with supported plugins]
{| class=wikitable width=100%

|-
=== SparkUp ===
|width=72pt|
[https://github.com/rstacruz/sparkup '''Sparkup''' &mdash; A parser for a condensed HTML format]
|width=72pt|[https://github.com/junegunn/vim-easy-align GitHub]
Use {{kb|^e}} in edit mode to extend sparkup text, and {{kb|^n}} to go to next empty item. Some examples (more at [https://code.google.com/p/zen-coding/ Zen Coding]:
!width=15%|vim-easy-align
<pre>
|A Vim alignment plugin
div#page.section.main
|-
div[title]
|colspan=4|
a[title="Hello world" rel]
{|
td[colspan=2]
|-
ul > li*5
|{{kbkey|1=gaip*=}}
li.item$$$*3
|Auto-align around all occurences of <code>=</code>
div#page>(div#header>ul#nav>li*4>a)+(div#page>(h1>span)+p*2)+div#footer
|-
#content>.section
|<code>:%EasyAlign /;;/</code>
div#content>div.section
|Align on <code>;;</code>. This allows using any delimiter.
p>{Click }+a{here}+{ to continue}
|}
</pre>
|}


=== Supertab ===
=== Supertab ===
Line 704: Line 512:
</source>
</source>


=== cpsm ===
=== Surround ===
[http://www.vim.org/scripts/script.php?script_id=1697 '''surround.vim''' : Delete/change/add parentheses/quotes/XML-tags/much more with ease] ([https://github.com/tpope/vim-surround github])

=== tComment ===
[http://www.vim.org/scripts/script.php?script_id=1173 '''tComment''' : An extensible & universal comment plugin that also handles embedded filetypes]

=== Ultisnips ===
{| class=wikitable width=100%
{| class=wikitable width=100%
|-
|-
|width=72pt|
|width=72pt|
|width=72pt|[https://github.com/nixprime/cpsm GitHub]
|width=72pt|[https://github.com/SirVer/ultisnips GitHub]
!width=15%|cpsm
!width=15%|ultisnips
| UltiSnips - The ultimate snippet solution for Vim. Send pull requests to SirVer/ultisnips!
|A CtrlP matcher, specialized for paths.
|-
|width=72pt|
|width=72pt|[https://github.com/honza/vim-snippets GitHub]
!width=15%|vim-snippets
| vim-snipmate default snippets (Previously snipmate-snippets)
|-
|-
|colspan=4|
|colspan=4|
{|
{|
|-
|-
|{{kb|C-p}}
|{{kb|^J}}
|Expand snippet / go to next placeholder
|Ctrl-P file mode
|-
|-
|{{kb|C-o}}
|{{kb|^K}}
| Go to previous placeholder
|Ctrl-P MRU mode
|}
|}
|}
|}

To install:
Ultisnips is a snippet engine written in Python. Other snippet plugins:
<source lang=bash>
* [http://www.vim.org/scripts/script.php?script_id=2540 '''snipMate'''], inspired from TextMate.
sudo apt install libboost-all-dev cmake python-dev libicu-dev
* https://github.com/garbas/vim-snipmate (garbas' fork), http://github.com/msanders/snipmate.vim (original, stalled)
cd ~/.vim/plugged/cpsm
* Another engine, also very powerful but different syntax (not compatible with vim-snippets): https://github.com/drmingdrmer/xptemplate
./install.sh

;Configuration
* We configure ultisnips to use {{kb|^J}} / {{kb|^K}} for expansion and next/previous, and leave {{kb|Tab}} key for completion with plugin SuperTab (which will trigger YouCompleteMe as well).
* Another option is to use {{kb|Tab}} for expansion (see [https://github.com/christoomey/dotfiles/blob/master/vim/rcplugins/youcompleteme-ultisnips-supertab these] [http://stackoverflow.com/questions/14896327/ultisnips-and-youcompleteme/22253548#22253548 posts] for instance).

<source lang=vim>
" --- Ultisnips / vim-snippets-----------------------------------------------------------------{{{
" Use C-j/C-k for snippet expansion and next/previous.
" To use 'tab', see https://github.com/christoomey/dotfiles/blob/master/vim/rcplugins/youcompleteme-ultisnips-supertab
let g:UltiSnipsEditSplit = 'vertical'
let g:UltiSnipsExpandTrigger = '<C-j>'
let g:UltiSnipsJumpForwardTrigger = '<C-j>'
let g:UltiSnipsJumpBackwardTrigger = '<C-k>'
</source>
</source>


;Snippets
=== fzf.vim ===
Snippets must be installed separately. Some snippets from [https://github.com/honza/vim-snippets vim-snippets]:

#### C ####

'''main''' main()
'''inc''' #include &lt;...&gt;
'''Inc''' #include "..."
'''Def''' #ifndef ... #define ... #endif
'''def''' #define
'''ifdef''' #ifdef ... #endif
'''#if''' #if ... #endif
'''once''' #ifndef HEADER_H .... # define HEADER_H ... #endif (Header Include-Guard)
'''if''' If (...) { ... }
'''el''' else { ... }
'''t''' ... ? ... : ... (tertiary conditional)
'''do''' do ... while ( ... )
'''wh''' while (...) { ... }
'''for''' for (... = 0; ...; ...) { ... }
'''forr''' for (... = ...; ...; ...) { ... }
'''fun''' ... function(...) { ... }
'''fund''' ... function(...;)
'''td''' typedef
'''st''' struct
'''tds''' typedef struct
'''tde''' typedef enum
'''pr''' printf
'''fpr''' fprintf
'''.''' [ ... ]
'''un''' unsigned

#### C++ ####

'''readfile''' snippet for reading file
'''map''' std::map<... , ...> map...
'''vector''' std::vector<...> v...
'''ns''' namespace ... { ... }
'''cl''' class { public: ... private: };

=== LustyExplorer ===
{| class=wikitable width=100%
{| class=wikitable width=100%
|-
|-
|width=72pt|[http://www.vim.org/scripts/script.php?script_id=1890 vim.org]
|width=72pt|
|width=72pt|[https://github.com/junegunn/fzf.vim GitHub]
|width=72pt|[https://github.com/vim-scripts/LustyExplorer GitHub]
!width=15%|fzf.vim
!width=15%|LustyExplorer
|Dynamic filesystem and buffer explore
|fzf :heart: vim
|-
|-
|colspan=4|[https://github.com/sjbach/lusty More recent GitHub (merged with LustyJuggler)]
|colspan=4|
{|
|-
|{{kb|C-p}}
|Ctrl-P file mode
|-
|{{kb|C-o}}
|Ctrl-P MRU mode
|}
|}
|}


=== FuzzyFinder ===
;Neovim
[http://www.vim.org/scripts/script.php?script_id=1984 '''FuzzyFinder''' : buffer/file/command/tag/etc explorer with fuzzy matching]
fzf.vim uses neovim terminal emulator. Use this mapping to have {{kb|esc}} key leave fzf, but go to normal mode in other terminals [https://github.com/junegunn/fzf/issues/576]:
* Alternative, [https://wincent.com/products/command-t Command-T] (inspired from TextMate)

* See also [http://linsong.github.com/2010/03/20/super-finder-in-vim.html Super-Finder in Vim] (using FuzzyFinder)
<source lang=vim>
* After <code>:set path=/path/to/project/**</code>, one can do <code>:find filename.ext</code> (See [http://stackoverflow.com/questions/3241566/is-there-a-quick-way-with-macvim-nerdtree-plugin-to-find-a-file], more details at [http://vim.wikia.com/wiki/Find_files_in_subdirectories])
tnoremap <expr> <esc> &filetype == 'fzf' ? "\<esc>" : "\<c-\>\<c-n>"
* To find a file in a sub-directory, use the fuzzy query <tt>**/filename</tt>
</source>


=== vim-airline ===
=== vim-airline ===
Line 800: Line 663:


let g:airline#extensions#bufferline#overwrite_variables = 0
let g:airline#extensions#bufferline#overwrite_variables = 0
</source>

=== Vim BufStat ===
[https://github.com/rson/vim-bufstat '''Vim BufStat''']
*[http://vim.1045645.n5.nabble.com/MiniBufExplorer-questions-closing-a-buffer-making-it-invisible-etc-td1181293.html MiniBufExplorer questions (closing a buffer, making it invisible, etc.)] (use '''d''' in minibufexpl, :set hidden to navigate to other buf even if current modified)
*[http://vim.1045645.n5.nabble.com/MiniBufExplorer-question-td1163160.html Can we remap :q to :bd only when 2 or more buffer opened]?
*An alternative is [http://www.vim.org/scripts/script.php?script_id=1664 '''buftabs''': Minimalistic buffer tabs saving screen space] (more at [http://stackoverflow.com/questions/4865132/an-alternative-to-minibufexplorer-vim StackOverflow - An alternative to minibufexplorer (vim)?])
*[http://stackoverflow.com/questions/1250943/minibufexplorer-and-nerd-tree-closing-buffers-unexpected-behavior StackOverflow - MiniBufExplorer and NERD_Tree closing buffers unexpected behavior]: See [http://vim.wikia.com/wiki/VimTip165 tip165 - bclose] + custom mapping below, :bd might just be good enough though...
<source lang="vim">
" GRB: use fancy buffer closing that doesn't close the split
cnoremap <expr> bd (getcmdtype() == ':' ? 'Bclose' : 'bd')
</source>

=== Vim-easy-align ===
{| class=wikitable width=100%
|-
|width=72pt|
|width=72pt|[https://github.com/junegunn/vim-easy-align GitHub]
!width=15%|vim-easy-align
|A Vim alignment plugin
|-
|colspan=4|
{|
|-
|{{kbkey|1=gaip*=}}
|Auto-align around all occurences of <code>=</code>
|-
|<code>:%EasyAlign /;;/</code>
|Align on <code>;;</code>. This allows using any delimiter.
|}
|}

=== Vim-easymotion ===
{| class=wikitable width=100%
|-
|width=72pt|[http://www.vim.org/scripts/script.php?script_id=3526 vim.org]
|width=72pt|[https://github.com/easymotion/vim-easymotion GitHub]
!width=15%|vim-easymotion
|Vim motions on speed!
|-
|colspan=4|
{|
|-
|{{kbkey|\\w}} {{kbkey|\\f}}
|Horizontal move
|-
| {{kbkey|\\j}} {{kbkey|\\k}}
|Vertical move
|}
|}

;Example configuration
<source lang=vim>
" <Leader>f{char} to move to {char}
map <Leader>f <Plug>(easymotion-bd-f)
nmap <Leader>f <Plug>(easymotion-overwin-f)

" s{char}{char} to move to {char}{char}
nmap s <Plug>(easymotion-overwin-f2)

" Move to line
map <Leader>L <Plug>(easymotion-bd-jk)
nmap <Leader>L <Plug>(easymotion-overwin-line)

" Move to word
map <Leader>w <Plug>(easymotion-bd-w)
nmap <Leader>w <Plug>(easymotion-overwin-w)
</source>

=== Vim-gitgutter ===
{| class=wikitable width=100%
|-
|width=72pt|
|width=72pt|[https://github.com/airblade/vim-gitgutter GitHub]
!width=15%|vim-gitgutter
|A Vim plugin which shows a git diff in the gutter (sign column) and stages/undoes hunks
|}

=== Vim-incsearch ===
{| class=wikitable width=100%
|-
|width=72pt|[http://www.vim.org/scripts/script.php?script_id=5038 vim.org]
|width=72pt|[https://github.com/haya14busa/incsearch.vim GitHub]
!width=15%|incsearch.vim
|Improved incremental searching for Vim
|-
|width=72pt|
|width=72pt|[https://github.com/haya14busa/incsearch-easymotion.vim GitHub]
!width=15%|incsearch-easymotion.vim
|''Integration between incsearch and easymotion''
|-
|colspan=4|
{|
|-
|{{kb|Tab}}
|Move cursor to next match
|-
| {{kb|S-Tab}}
|Move cursor to previous match
|}
|}

See website for more features (including fuzzy search, etc.).

;Integration with easy-motion:
<source lang=vim>
" You can use other keymappings like <C-l> instead of <CR> if you want to
" use these mappings as default search and somtimes want to move cursor with
" EasyMotion.
function! s:incsearch_config(...) abort
return incsearch#util#deepextend(deepcopy({
\ 'modules': [incsearch#config#easymotion#module({'overwin': 1})],
\ 'keymap': {
\ "\<CR>": '<Over>(easymotion)'
\ },
\ 'is_expr': 0
\ }), get(a:, 1, {}))
endfunction

noremap <silent><expr> / incsearch#go(<SID>incsearch_config())
noremap <silent><expr> ? incsearch#go(<SID>incsearch_config({'command': '?'}))
noremap <silent><expr> g/ incsearch#go(<SID>incsearch_config({'is_stay': 1}))
</source>

=== Vim-LaTeX ===
'''[http://vim-latex.sourceforge.net/ vim-latex]''' ([http://vim-latex.sourceforge.net/documentation/latex-suite.html documentation]
See page [[vim-latex]].

=== vim-mundo ===
{| class=wikitable width=100%
|-
|width=72pt|
|width=72pt|[https://github.com/simnalamburt/vim-mundo.git GitHub]
!width=15%|vim-mundo
| Vim undo tree visualizer https://simnalamburt.github.io/vim-mundo
|-
|colspan=4|
{|
|-
|{{kb|F12}}
|Open mundo
|}
|}
vim-mundo is a fork of plugin ''gundo'' (originally written by Steve Losh) that is up-to-date and works on neovim.

<source lang=vim>
" --- Vim-mundo -------------------------------------------------------------------------------{{{
let g:mundo_verbose_graph = 0 " Create shorter graph
let g:mundo_inline_undo = 1 " Show a small one line diff at each node
set undofile " Enable persistent undo so that undo history persists across vim sessions
set undodir=~/.vim/undo
nnoremap <F12> :MundoToggle<CR>
" }}}
</source>

=== VimWiki ===
{| class=wikitable width=100%
|-
|width=72pt|[http://www.vim.org/scripts/script.php?script_id=2226 vim.org]
|width=72pt|[https://github.com/vimwiki/vimwiki GitHub]
!width=15%|vimwiki
|Personal Wiki for Vim
|-
|colspan=4|
{|
|-
|{{kb|S-CR}} || Continue list
|-
|{{kb|gq}} || Quote text block with <code>{{{ ... }}}</code>
|}
|}
To quote a text block with <code>{{{ ... }}}</code> in visual mode, add to {{file|~/.vim/ftplugin/vimwiki_custom.vim}}:
<source lang=vim>
" Quote a block of text with {{{ }}} in visual mode
:vmap gq DO {{{<CR><ESC>P
</source>

;Troubleshooting
* {{kb|Tab}} not working anymore on <code>dev</code> branch. This is because {{kb|tab}} is already mapped by plugin SuperTab, and Vimwiki refuses to remap.
<source lang="diff">
--- a/ftplugin/vimwiki.vim
+++ b/ftplugin/vimwiki.vim
@@ -532,13 +532,9 @@ endfunction
" insert mode table mappings
if str2nr(vimwiki#vars#get_global('key_mappings').table_mappings)
- if maparg('<Tab>', 'i') ==# ''
inoremap <expr><buffer> <Tab> vimwiki#tbl#kbd_tab()
- endif
- if maparg('<S-Tab>', 'i') ==# ''
inoremap <expr><buffer> <S-Tab> vimwiki#tbl#kbd_shift_tab()
endif
-endif
</source>
</source>


Line 891: Line 947:
;Configuration - offline install
;Configuration - offline install
* When installing on a computer without internet access, transfer the file {{file|clang+llvm-5.0.0-linux-x86_64-ubuntu14.04.tar.xz}} from {{file|~/.vim/plugged/YouCompleteMe/third_party/ycmd/clang_archives/}} manually.
* When installing on a computer without internet access, transfer the file {{file|clang+llvm-5.0.0-linux-x86_64-ubuntu14.04.tar.xz}} from {{file|~/.vim/plugged/YouCompleteMe/third_party/ycmd/clang_archives/}} manually.

=== vim-mundo ===
{| class=wikitable width=100%
|-
|width=72pt|
|width=72pt|[https://github.com/simnalamburt/vim-mundo.git GitHub]
!width=15%|vim-mundo
| Vim undo tree visualizer https://simnalamburt.github.io/vim-mundo
|-
|colspan=4|
{|
|-
|{{kb|F12}}
|Open mundo
|}
|}
vim-mundo is a fork of plugin ''gundo'' (originally written by Steve Losh) that is up-to-date and works on neovim.

<source lang=vim>
" --- Vim-mundo -------------------------------------------------------------------------------{{{
let g:mundo_verbose_graph = 0 " Create shorter graph
let g:mundo_inline_undo = 1 " Show a small one line diff at each node
set undofile " Enable persistent undo so that undo history persists across vim sessions
set undodir=~/.vim/undo
nnoremap <F12> :MundoToggle<CR>
" }}}
</source>

=== DoxygenToolkit.vim ===
{| class=wikitable width=100%
|-
|width=72pt|
|width=72pt|[https://github.com/vim-scripts/DoxygenToolkit.vim GitHub]
!width=15%|DoxygenToolkit.vim
| Simplify Doxygen documentation in C, C++, Python
|-
|colspan=4|
{|
|-
|<code>:Dox</code>
|Fill doxygen for function declaration.
|}
|}

My configuration
<source lang="vim">
" --- DoxygenToolkit --------------------------------------------------------------------------{{{
let g:DoxygenToolkit_briefTag_pre="@Synopsis "
let g:DoxygenToolkit_paramTag_pre="@Param "
let g:DoxygenToolkit_returnTag="@Returns "
let g:DoxygenToolkit_blockHeader="--------------------------------------------------------------------------"
let g:DoxygenToolkit_blockFooter="----------------------------------------------------------------------------"
let g:DoxygenToolkit_authorName="Michael Peeters"
" let g:DoxygenToolkit_licenseTag=""
</source>


== Plugins to try ==
== Plugins to try ==
Line 1,070: Line 1,071:
== Uninstalled plugins ==
== Uninstalled plugins ==
Plugins I'm no longer using.
Plugins I'm no longer using.

=== EasyTags ===
=== Align ===
[http://www.vim.org/scripts/script.php?script_id=3114 '''easytags.vim''' : Automated tag file generation and syntax highlighting of tags in Vim]
{| class=wikitable width=100%
* Replaced by '''AutoTag''' &mdash; syntax highlighting of tags is limited to ''c'' files; moreover ''AutoTag'' has a clever way to look for the <tt>tags</tt> file in project hierarchy.
|-
|width=72pt|[http://vim.sourceforge.net/scripts/script.php?script_id=294 vim.org]
|width=72pt|[https://github.com/vim-scripts/Align GitHub]
!width=15%|Align
|Help folks to align text, eqns, declarations, tables, etc
|-
|colspan=4|see [http://www.drchip.org/astronaut/vim/align.html#Examples examples].
|}

Let's give '''vim-easy-align''' a try instead.


=== AutoClose ===
=== AutoClose ===
Line 1,083: Line 1,094:
|}
|}
Don't like it much because inserting the closing pair will jump out of nested pair, which is annoying when one try to simply insert a closing brace (but a solution is to use the Surround plugin to surround some selected text with braces).
Don't like it much because inserting the closing pair will jump out of nested pair, which is annoying when one try to simply insert a closing brace (but a solution is to use the Surround plugin to surround some selected text with braces).

=== Calendar ===
[https://github.com/itchyny/calendar.vim '''calendar.vim''' - A calendar application for Vim]
* <code>:Calendar</code> to launch. {{kbkey|<}} and {{kbkey|>}} to cycle through views, {{kbkey|E}} and {{kbkey|T}} to view Event list or Task list.
* <code>:Calendar 2001 1 1</code> to focus a specific date.
My settings in {{file|.vimrc}}:
<source lang=vim>
" ----- Vim-Calendar ---------------------------------------------------------
let g:calendar_week_number=1
let g:calendar_first_day='monday'
</source>


=== ClosePairs ===
=== ClosePairs ===
Line 1,122: Line 1,144:
+
+
function! s:escapepair(right)
function! s:escapepair(right)
</source>}}

=== Conque Shell ===
{| class=wikitable width=100%
|-
|width=72pt|[http://www.vim.org/scripts/script.php?script_id=2771 vim.org]
|width=72pt|[https://github.com/wkentaro/conque.vim/blob/master/plugin/conque_term.vim GitHub]
!width=15%|Conque Shell
|Run interactive commands inside a Vim buffer.
|}
I'm using mostly ''NeoVim'' now, and neovim native command <code>:term</code> offers a much better alternative.

=== DiffChanges ===
[http://www.vim.org/scripts/script.php?script_id=2158 '''diffchanges.vim''' : Show changes made to current buffer since the last save]
* Never used. Functionality quite limited (only compared with last save). And if file is stored in Git, plugin '''fugitive''' is a much better alternative.

=== EasyTags ===
[http://www.vim.org/scripts/script.php?script_id=3114 '''easytags.vim''' : Automated tag file generation and syntax highlighting of tags in Vim]
* Replaced by '''AutoTag''' &mdash; syntax highlighting of tags is limited to ''c'' files; moreover ''AutoTag'' has a clever way to look for the <tt>tags</tt> file in project hierarchy.

=== Git-file ===
[http://www.vim.org/scripts/script.php?script_id=2185 '''git:file.vim : open any version of a file in git]
For instance, to open file <tt>filename.c</tt> at commit ''HEAD~4'':
<source lang=bash>
vim HEAD~4:./filename.c
</source>
* Never used. Similar functionality available in plugin '''fugitive'''.

=== Hexman ===
{| class=wikitable width=100%
|-
|width=72pt|[http://www.vim.org/scripts/script.php?script_id=666 vim.org]
|width=72pt|[https://github.com/vim-scripts/hexman.vim GitHub]
!width=15%|Hexman
|Simpler Hex viewing and editing
|}

Uninstalled because it contains the sign of the devil... Well, no, in fact because I don't use it much and standard mappings interfere with '''vim-gitgutter'''.

=== LaTeX Text Formatter ===
[http://www.vim.org/scripts/script.php?script_id=2187 '''Latex Text Formatter''' : This scripts makes it easier to format latex text]
* Does not work well (line too short, line merge too aggressive)

=== LustyJuggler ===
{| class=wikitable width=100%
|-
|width=72pt|[http://www.vim.org/scripts/script.php?script_id=2050 vim.org]
|width=72pt|[https://github.com/vim-scripts/LustyJuggler GitHub]
!width=15%|LustyJuggler
|Switch very quickly among your active buffers
|-
|colspan=4|[https://github.com/sjbach/lusty More recent GitHub (merged with LustyExplorer]
|}

Removed because I don't use it. ''LustyExplorer'', ''NERDTree'' and ''FuzzyFinder'' are much better alternatives.

=== MiniBufExpl ===
[http://www.vim.org/scripts/script.php?script_id=159 '''minibufexpl.vim''' : Elegant buffer explorer - takes very little screen space]
* 1st attempt: No real tab support. Seems to interfere with trinity plugin. Interesting key bindings inside though. To reassess...
* 2nd attempt: Don't care about tabs, the idea is to fully replace tabs with buffers since most plugins interface better with buffers. Disabled
trinity plugin.
* '''Closing a buffer''': Use '''d''' in minibufexpl window to close a buffer, or <tt>:bd[elete]</tt> seems to work most of the time.
* Uninstalled because found better alternative (bufstat)
:* Someone is working on improving [http://fholgado.com/minibufexpl minibufexpl (v6.4)]

=== MRU ===
[http://www.vim.org/scripts/script.php?script_id=521 '''mru.vim''' : Plugin to manage Most Recently Used (MRU) files]
* Never used. And same functionality is available in '''Ctrl-P''' plugin anyway.
{{hiddenSourceFile|~/.vim/plugin/|mru.vim.diff|content=<source lang="diff" class="mru.vim.diff">
--- mru-old.vim 2010-06-29 00:45:59.000000000 +0200
+++ mru.vim 2010-07-22 14:14:19.000000000 +0200
@@ -657,7 +657,12 @@
let wcmd = '+buffer' . bufnum
endif
- exe 'silent! botright ' . g:MRU_Window_Height . 'split ' . wcmd
+ " MIP PATCH BEGIN - :botright conflicts with TagList + QuickFix windows
+ " if I have TagList + QuickFix window opened, calling :MRU multiple times makes the QuickFix window to grow
+ " endlessly
+ " exe 'silent! botright ' . g:MRU_Window_Height . 'split ' . wcmd
+ exe 'silent! ' . g:MRU_Window_Height . 'split ' . wcmd
+ " MIP PATCH END
endif
endif

</source>}}
</source>}}


Line 1,223: Line 1,330:
" win_ctrl == newtab - Open in new tab
" win_ctrl == newtab - Open in new tab
</source>}}
</source>}}

=== MiniBufExpl ===
[http://www.vim.org/scripts/script.php?script_id=159 '''minibufexpl.vim''' : Elegant buffer explorer - takes very little screen space]
* 1st attempt: No real tab support. Seems to interfere with trinity plugin. Interesting key bindings inside though. To reassess...
* 2nd attempt: Don't care about tabs, the idea is to fully replace tabs with buffers since most plugins interface better with buffers. Disabled
trinity plugin.
* '''Closing a buffer''': Use '''d''' in minibufexpl window to close a buffer, or <tt>:bd[elete]</tt> seems to work most of the time.
* Uninstalled because found better alternative (bufstat)
:* Someone is working on improving [http://fholgado.com/minibufexpl minibufexpl (v6.4)]

=== LustyJuggler ===
{| class=wikitable width=100%
|-
|width=72pt|[http://www.vim.org/scripts/script.php?script_id=2050 vim.org]
|width=72pt|[https://github.com/vim-scripts/LustyJuggler GitHub]
!width=15%|LustyJuggler
|Switch very quickly among your active buffers
|-
|colspan=4|[https://github.com/sjbach/lusty More recent GitHub (merged with LustyExplorer]
|}

Removed because I don't use it. ''LustyExplorer'', ''NERDTree'' and ''FuzzyFinder'' are much better alternatives.

=== LaTeX Text Formatter ===
[http://www.vim.org/scripts/script.php?script_id=2187 '''Latex Text Formatter''' : This scripts makes it easier to format latex text]
* Does not work well (line too short, line merge too aggressive)

=== Calendar ===
[https://github.com/itchyny/calendar.vim '''calendar.vim''' - A calendar application for Vim]
* <code>:Calendar</code> to launch. {{kbkey|<}} and {{kbkey|>}} to cycle through views, {{kbkey|E}} and {{kbkey|T}} to view Event list or Task list.
* <code>:Calendar 2001 1 1</code> to focus a specific date.
My settings in {{file|.vimrc}}:
<source lang=vim>
" ----- Vim-Calendar ---------------------------------------------------------
let g:calendar_week_number=1
let g:calendar_first_day='monday'
</source>

=== DiffChanges ===
[http://www.vim.org/scripts/script.php?script_id=2158 '''diffchanges.vim''' : Show changes made to current buffer since the last save]
* Never used. Functionality quite limited (only compared with last save). And if file is stored in Git, plugin '''fugitive''' is a much better alternative.

=== MRU ===
[http://www.vim.org/scripts/script.php?script_id=521 '''mru.vim''' : Plugin to manage Most Recently Used (MRU) files]
* Never used. And same functionality is available in '''Ctrl-P''' plugin anyway.
{{hiddenSourceFile|~/.vim/plugin/|mru.vim.diff|content=<source lang="diff" class="mru.vim.diff">
--- mru-old.vim 2010-06-29 00:45:59.000000000 +0200
+++ mru.vim 2010-07-22 14:14:19.000000000 +0200
@@ -657,7 +657,12 @@
let wcmd = '+buffer' . bufnum
endif
- exe 'silent! botright ' . g:MRU_Window_Height . 'split ' . wcmd
+ " MIP PATCH BEGIN - :botright conflicts with TagList + QuickFix windows
+ " if I have TagList + QuickFix window opened, calling :MRU multiple times makes the QuickFix window to grow
+ " endlessly
+ " exe 'silent! botright ' . g:MRU_Window_Height . 'split ' . wcmd
+ exe 'silent! ' . g:MRU_Window_Height . 'split ' . wcmd
+ " MIP PATCH END
endif
endif

</source>}}

=== Git-file ===
[http://www.vim.org/scripts/script.php?script_id=2185 '''git:file.vim : open any version of a file in git]
For instance, to open file <tt>filename.c</tt> at commit ''HEAD~4'':
<source lang=bash>
vim HEAD~4:./filename.c
</source>
* Never used. Similar functionality available in plugin '''fugitive'''.

=== Align ===
{| class=wikitable width=100%
|-
|width=72pt|[http://vim.sourceforge.net/scripts/script.php?script_id=294 vim.org]
|width=72pt|[https://github.com/vim-scripts/Align GitHub]
!width=15%|Align
|Help folks to align text, eqns, declarations, tables, etc
|-
|colspan=4|see [http://www.drchip.org/astronaut/vim/align.html#Examples examples].
|}

Let's give '''vim-easy-align''' a try instead.

=== Hexman ===
{| class=wikitable width=100%
|-
|width=72pt|[http://www.vim.org/scripts/script.php?script_id=666 vim.org]
|width=72pt|[https://github.com/vim-scripts/hexman.vim GitHub]
!width=15%|Hexman
|Simpler Hex viewing and editing
|}

Uninstalled because it contains the sign of the devil... Well, no, in fact because I don't use it much and standard mappings interfere with '''vim-gitgutter'''.

=== Conque Shell ===
{| class=wikitable width=100%
|-
|width=72pt|[http://www.vim.org/scripts/script.php?script_id=2771 vim.org]
|width=72pt|[https://github.com/wkentaro/conque.vim/blob/master/plugin/conque_term.vim GitHub]
!width=15%|Conque Shell
|Run interactive commands inside a Vim buffer.
|}
I'm using mostly ''NeoVim'' now, and neovim native command <code>:term</code> offers a much better alternative.

Revision as of 20:02, 7 May 2019

This page is about Vim plugins.

Overview

Find a plugin

Most plugins are found on vim.org or GitHub:

A mirror of all plugins originally found on http://www.vim.org/scripts/ ;
  • GitHub.

Install a plugin

The best is to use a plugin manager (see below). Otherwise,

  • Unzip the plugin in ~/.vim directory (or plugin, autoload...)
  • Generate the help tags with:
helptags ~/.vim/tags

Getting help

Most plugins come with local help files. Do :help local-additions to get a list of help files for locally installed plugins.

Plugin Managers

Here I list various plugin managers. My current favorite is vim-plug.

apt-vim

Fully-automated, Cross-platform Plugin Manager for Vim.

Pathogen

Plugin manager from Tim Pope.

VIM (vim-addon-manager)

VAM manage and install vim plugins (including their dependencies) in a sane way.

vim-plug

Plugin manager from junegunn, author of fzf, vim-easy-align.

Install
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
Update plugins on offline computer

To update plugins on a computer that has no internet access, the simplest solution is to clone all repositories in a folder accessible by the offline computer, and use the git URL rewriting feature to point to this folder instead.

Use the following script to sync the folder, vim-plug-mirror.sh:

#! /bin/bash

die()
{
    CODE=$1
    shift
    >&2 echo "ERROR -- $@"
    exit $CODE
}

usage()
{
    echo "Usage: $(basename $0) <mirror_dir>"
    die 1 "$*"
}

DIR=${1%%/}
echo $DIR

[ -n "$DIR" -a -d "$(dirname "$DIR")" ] || usage "Missing <mirror_dir>"

if ! [ -d "$DIR" ]; then
    echo "Creating $DIR"
    mkdir "$DIR" || die 1 "Cannot create '$DIR'"
fi

PLUGINS_DIR=$(find ~/.vim/plugged -name .git|sed -r 's_/\.git__')

for plugin_dir in $PLUGINS_DIR; do
    echo "Processing '$plugin_dir'"
    URL=$(git -C "$plugin_dir" remote get-url origin)
    plugin=$(echo $URL|sed -r 's_https://github.com/__; s_github\.com:__; s_\.git__')
    PLUGINDIR=$DIR/${plugin}.git
    PARENTDIR=$(dirname $PLUGINDIR)
    if [ -d "$PLUGINDIR" ]; then
        false && echo git -C "$PLUGINDIR" fetch --all
    else
        mkdir -p "$PARENTDIR" || die 1 "Cannot create '$PARENTDIR'"
        git clone --mirror $URL "$PLUGINDIR"
    fi
done

To use the script, simply give a folder path:

vim-plug-mirror.sh /smb/some/path

Then, on the offline machine:

sudo git config --system url./smb/some/path/.insteadOf https://github.com/


Interaction with $HOME version control

If we store our HOME files (dot-files) in git, we can't store the plugins anymore because they are fetched and stored locally as squashed git submodules. We can circumvent this by managing these plugins as git submodules.

First create .gitmodules:

[submodule "ack.vim"]
    path = .vim/plugged/ack.vim
    url = ./.vim/plugged/ack.vim
[submodule "auto-pairs"]
    path = .vim/plugged/auto-pairs
    url = ./.vim/plugged/auto-pairs
[submodule "a.vim"]
    path = .vim/plugged/a.vim
    url = ./.vim/plugged/a.vim

Then create the bare repositories:

git clone --bare /home/peetersm home.git
cd home.git/
mkdir -p .vim/plugged
cd .vim/plugged
for g in ~/.vim/plugged/*; do git clone --bare $g; done

Then, to clone the HOME repository:

git clone --recursive .../home.git

Finally we must update the tags file in vim. Start vim and run PlugInstall!. Ignore the error messages.


Troubleshooting
  • Using short path may fail if plugin name has an extension. For instance:
" The following FAILS because of trailing .vim
Plug 'ctrlpvim/ctrlp.vim'
" Use the following instead.
Plug 'https://github.com/ctrlpvim/ctrlp.vim.git'
  • Conditional plugin activation.
See the FAQ.

Installed plugins

Plugins I'm currently using.

A

a.vim : Alternate Files quickly (.c --> .h etc) (forked version, the original version)

ack.vim

GitHub ack.vim Vim plugin for the Perl module / CLI script 'ack'

I fell back to this plugin because ag.vim is stalled. But we can still use ag as search engine.

My settings [1]:

if executable('ag')
  " Use ag over grep - See ag man page for option '--vimgrep'
  set grepprg=ag\ --vimgrep\ $*
  set grepformat=%f:%l:%c:%m

  " bind K to grep word under cursor
  nnoremap K :grep! "\b<C-R><C-W>\b"<CR>:cw<CR>
  let g:ackprg = 'ag --vimgrep'
  " Allow lowercase command 'ag' - see http://vim.wikia.com/wiki/Replace_a_builtin_command_using_cabbrev
  cnoreabbrev ag <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'Ack' : 'ag')<CR>
endif

Auto-Pairs

vim.org GitHub auto-pairs Vim plugin, insert or delete brackets, parens, quotes in pair
M-e )wrapme)
M-n Jump to next closed pair

Tested on NeoVim: undoable and dot-repeatable (.) (and should be the same on vim 7.4.849+).

Works better than ClosePairs and similar.

More auto-close plugins or similar:

Tested on NeoVim: undo broken but dot-repeatable (.).
Tested on NeoVim: undoable and dot-repeatable (.) (and should be the same on vim 7.4.849+).
breaks undo / dot-repeat (tested on neovim). Nice support of triple apostrophe.
Requires Python.
Tested on NeoVim: undo broken but dot-repeatable (.).

More on auto-close plugins:

More on the issue of dot-repeat (with list of plugins):

AutoTag

AutoTag : Updates entries in a tags file automatically when saving

Cpp.vim

cpp.vim: General C++ Settings (no indentation for namespace...)

(disabled highlight of leading tabs, line length overruns, unit test header test + nice AlterColour function that computes new colour...)

cpsm

GitHub cpsm A CtrlP matcher, specialized for paths.
C-p Ctrl-P file mode
C-o Ctrl-P MRU mode

To install:

sudo apt install libboost-all-dev cmake python-dev libicu-dev
cd ~/.vim/plugged/cpsm
./install.sh

CScope

CScope (also mirrored on GitHub)

ctrlp.vim

vim.org GitHub ctrlp.vim Active fork of kien/ctrlp.vim—Fuzzy file, buffer, mru, tag, etc finder. home
^p Invoke CtrlP ^j ^k Navigate list ^z ^o Mark/unmark, open
F5 Refresh cache ^t Open new tab :diffthis Compare marked files
^f ^b Cycle between modes ^v ^x Open new split
^d Switch filename/full ^n ^p Next/prev hist
^r Switch regexp mode ^y Create new file

Currently works best using ag (this and [7]) as file scanner and cpsm as match engine.

My settings:

" Set root directory
let g:ctrlp_working_path_mode = 'rwa'

" Enable filename search (instead of full path) - Ctrl-D to switch
let g:ctrlp_by_filename = 1
"
"  Use AG for look-up. See https://robots.thoughtbot.com/faster-grepping-in-vim
if executable('ag')
  " Use ag in CtrlP for listing files. Lightning fast and DOESN'T respect .gitignore
  let g:ctrlp_user_command = 'ag %s -U -l --nocolor -g ""'

  " ag is fast enough that CtrlP doesn't need to cache - BUT we are on a slow filesystem
  " let g:ctrlp_use_caching = 0
endif

DoxygenToolkit.vim

GitHub DoxygenToolkit.vim Simplify Doxygen documentation in C, C++, Python
:Dox Fill doxygen for function declaration.

My configuration

" --- DoxygenToolkit --------------------------------------------------------------------------{{{
let g:DoxygenToolkit_briefTag_pre="@Synopsis  "
let g:DoxygenToolkit_paramTag_pre="@Param "
let g:DoxygenToolkit_returnTag="@Returns   "
let g:DoxygenToolkit_blockHeader="--------------------------------------------------------------------------"
let g:DoxygenToolkit_blockFooter="----------------------------------------------------------------------------"
let g:DoxygenToolkit_authorName="Michael Peeters"
" let g:DoxygenToolkit_licenseTag=""

Fugitive

vim.org GitHub fugitive.vim A Git wrapper so awesome, it should be illegal

Add to .vimrc:

set diffopt+=vertical                       " Favor vertical split for vimdiff
Some commands
" Gdiff
:Gdiff                                      " View differences with index
:Gdiff HEAD                                 " View differences with HEAD
:Gdiff -                                    " View differences with HEAD
:Gdiff ^                                    " View differences with previous commit
:Gdiff ~3                                   " View differences with 3 commits ago

" Glog
:Glog                                       " Load previous file revision in quickfix. :cn / :cp for next/previous
:Glog -- %                                  " Load commits (i.e. diff) impacting current file.
:Glog -Sfindme --                           " Pickaxe string 'findme'

" Gedit
:Gedit                                      " Edit back current file
Typical workflow
  • View history of changes on a file
:Glog                                       " Load previous file revision in quickfix
:cn                                         " next revision (or open quickfix window and <CR> to select)
:cp                                         " previous revision (or open quickfix window and <CR> to select)
:Gdiff                                      " View diff with version in work tree
:q                                          " Quit diff, and return to selected revision
:Gdiff ^                                    " View diff with previous version
:q
:Gedit                                      " Edit back original file

fzf.vim

GitHub fzf.vim fzf :heart: vim
C-p Ctrl-P file mode
C-o Ctrl-P MRU mode
Neovim

fzf.vim uses neovim terminal emulator. Use this mapping to have esc key leave fzf, but go to normal mode in other terminals [8]:

tnoremap <expr> <esc> &filetype == 'fzf' ? "\<esc>" : "\<c-\>\<c-n>"

IndentTab

vim.org GitHub IndentTab Use tabs for indent at the beginning, spaces for alignment in the rest of a line

This plugin works better than Smart-Tabs (ctab.vim).

See also Indent with tabs & align with spaces.

Configuration

We must make sure that it is loaded before plugin SuperTab (so that the latter can record IndentTab maps for Tab).

Plug 'xeyownt/IndentTab' |                            " Use tabs for indent at the beginning, spaces for alignment in the rest of a line
    Plug 'ervandew/supertab'                          " Perform all your vim insert mode completions with Tab
" --- IndentTab -------------------------------------------------------------------------------{{{
let g:IndentTab = 1                                 " Enable the plugin
let g:IndentTab_IsSuperTab = 1                      " Enable integration with supertab
let g:IndentTab_scopes = 'indent'                   " Disable 'commentprefix' and 'string', which require ingo-library
" }}}

MatchIt

matchit.zip : extended % matching for HTML, LaTeX, and many other languages

Mcf-make-target

mcf-make-target: Persistent make target in Vim This plugin lets Vim to store the last arguments passed to make, and use that argument when make is invoked without arguments. For ease, define the following macro:

:nmap <F5> :wa<CR>:Make<CR>:cw<CR>             # Note the capital M to Make

To build a custom target:

:Make <targetname>           # first invocation. Store targetname for future use
<F5>                         # next

Repeat

Install repeat.vim : Use the repeat command (.) with supported plugins

SparkUp

Sparkup — A parser for a condensed HTML format Use ^e in edit mode to extend sparkup text, and ^n to go to next empty item. Some examples (more at Zen Coding:

div#page.section.main
div[title] 
a[title="Hello world" rel] 
td[colspan=2]
ul > li*5
li.item$$$*3
div#page>(div#header>ul#nav>li*4>a)+(div#page>(h1>span)+p*2)+div#footer
#content>.section
div#content>div.section
p>{Click }+a{here}+{ to continue}

Supertab

vim.org GitHub Supertab Perform all your vim insert mode completions with Tab
Tab Complete, insert
Plug 'ervandew/supertab'                          " Perform all your vim insert mode completions with Tab
" --- SuperTab---------------------------------------------------------------------------------{{{
let g:SuperTabDefaultCompletionType    = '<C-n>'
let g:SuperTabCrMapping = 0
" }}}
Issues
  • Tab does not work in vimwiki files
This is because Tab is mapped by vimwiki plugin to jump to next table cell. The best work-around is to use C-n / C-p to trigger YCM completion. Alternative we can disable table mapping [9]
let g:vimwiki_table_mappings = 0

Surround

surround.vim : Delete/change/add parentheses/quotes/XML-tags/much more with ease (github)

tComment

tComment : An extensible & universal comment plugin that also handles embedded filetypes

Ultisnips

GitHub ultisnips UltiSnips - The ultimate snippet solution for Vim. Send pull requests to SirVer/ultisnips!
GitHub vim-snippets vim-snipmate default snippets (Previously snipmate-snippets)
^J Expand snippet / go to next placeholder
^K Go to previous placeholder

Ultisnips is a snippet engine written in Python. Other snippet plugins:

Configuration
  • We configure ultisnips to use ^J / ^K for expansion and next/previous, and leave Tab key for completion with plugin SuperTab (which will trigger YouCompleteMe as well).
  • Another option is to use Tab for expansion (see these posts for instance).
" --- Ultisnips / vim-snippets-----------------------------------------------------------------{{{
" Use C-j/C-k for snippet expansion and next/previous.
" To use 'tab', see https://github.com/christoomey/dotfiles/blob/master/vim/rcplugins/youcompleteme-ultisnips-supertab
let g:UltiSnipsEditSplit = 'vertical'
let g:UltiSnipsExpandTrigger = '<C-j>'
let g:UltiSnipsJumpForwardTrigger = '<C-j>'
let g:UltiSnipsJumpBackwardTrigger = '<C-k>'
Snippets

Snippets must be installed separately. Some snippets from vim-snippets:

#### C ####
main  main()
inc   #include <...>
Inc   #include "..."
Def   #ifndef ... #define ... #endif
def   #define
ifdef #ifdef ... #endif
#if   #if ... #endif
once  #ifndef HEADER_H .... # define HEADER_H ... #endif (Header Include-Guard)
if    If (...) { ... } 
el    else { ... } 
t     ... ? ... : ... (tertiary conditional)
do    do ... while ( ... )
wh    while (...) { ... }
for   for (... = 0; ...; ...) { ... }
forr  for (... = ...; ...; ...) { ... }
fun   ... function(...) { ... }
fund  ... function(...;)
td    typedef
st    struct
tds   typedef struct
tde   typedef enum
pr    printf
fpr   fprintf
.     [ ... ]
un    unsigned
#### C++ ####
readfile  snippet for reading file
map       std::map<... , ...> map...
vector    std::vector<...> v...
ns        namespace ... { ... }
cl        class { public: ... private: };

LustyExplorer

vim.org GitHub LustyExplorer Dynamic filesystem and buffer explore
More recent GitHub (merged with LustyJuggler)

FuzzyFinder

FuzzyFinder : buffer/file/command/tag/etc explorer with fuzzy matching

  • Alternative, Command-T (inspired from TextMate)
  • See also Super-Finder in Vim (using FuzzyFinder)
  • After :set path=/path/to/project/**, one can do :find filename.ext (See [10], more details at [11])
  • To find a file in a sub-directory, use the fuzzy query **/filename

vim-airline

GitHub vim-airline lean & mean status/tabline for vim that's light as air
GitHub vim-airline-themes A collection of themes for vim-airline

vim-airline-themes is optional, and here not needed since I use gruvbox for the theme.

" ----- Vim-airline ----------------------------------------------------------
let g:airline_theme= 'gruvbox'
let g:airline_section_c = '%F'
let g:airline_section_y = ''
let g:airline_section_error = ''
let g:airline_section_warning = ''
let g:airline_section_x = ''

vim-bufferline

GitHub vim-bufferline Super simple vim plugin to show the list of buffers in the command bar

Beware that airline interferes with bufferline settings. My settings below.

" ----- Vim-bufferline -------------------------------------------------------

let g:bufferline_rotate = 1                " scrolling with fixed current buffer position
let g:bufferline_show_bufnr = 0            " Do not display buffer numbers
let g:bufferline_active_buffer_left = '['  " Separator used on the left side of current buffer
let g:bufferline_active_buffer_right = ']' " Separator used on the right side of current buffer

let g:airline#extensions#bufferline#overwrite_variables = 0

Vim BufStat

Vim BufStat

" GRB: use fancy buffer closing that doesn't close the split
cnoremap <expr> bd (getcmdtype() == ':' ? 'Bclose' : 'bd')

Vim-easy-align

GitHub vim-easy-align A Vim alignment plugin
gaip*= Auto-align around all occurences of =
:%EasyAlign /;;/ Align on ;;. This allows using any delimiter.

Vim-easymotion

vim.org GitHub vim-easymotion Vim motions on speed!
\\w \\f Horizontal move
\\j \\k Vertical move
Example configuration
" <Leader>f{char} to move to {char}
map  <Leader>f <Plug>(easymotion-bd-f)
nmap <Leader>f <Plug>(easymotion-overwin-f)

" s{char}{char} to move to {char}{char}
nmap s <Plug>(easymotion-overwin-f2)

" Move to line
map <Leader>L <Plug>(easymotion-bd-jk)
nmap <Leader>L <Plug>(easymotion-overwin-line)

" Move to word
map  <Leader>w <Plug>(easymotion-bd-w)
nmap <Leader>w <Plug>(easymotion-overwin-w)

Vim-gitgutter

GitHub vim-gitgutter A Vim plugin which shows a git diff in the gutter (sign column) and stages/undoes hunks

Vim-incsearch

vim.org GitHub incsearch.vim Improved incremental searching for Vim
GitHub incsearch-easymotion.vim Integration between incsearch and easymotion
Tab Move cursor to next match
S-Tab Move cursor to previous match

See website for more features (including fuzzy search, etc.).

Integration with easy-motion
" You can use other keymappings like <C-l> instead of <CR> if you want to
" use these mappings as default search and somtimes want to move cursor with
" EasyMotion.
function! s:incsearch_config(...) abort
  return incsearch#util#deepextend(deepcopy({
  \   'modules': [incsearch#config#easymotion#module({'overwin': 1})],
  \   'keymap': {
  \     "\<CR>": '<Over>(easymotion)'
  \   },
  \   'is_expr': 0
  \ }), get(a:, 1, {}))
endfunction

noremap <silent><expr> /  incsearch#go(<SID>incsearch_config())
noremap <silent><expr> ?  incsearch#go(<SID>incsearch_config({'command': '?'}))
noremap <silent><expr> g/ incsearch#go(<SID>incsearch_config({'is_stay': 1}))

Vim-LaTeX

vim-latex (documentation See page vim-latex.

vim-mundo

GitHub vim-mundo Vim undo tree visualizer https://simnalamburt.github.io/vim-mundo
F12 Open mundo

vim-mundo is a fork of plugin gundo (originally written by Steve Losh) that is up-to-date and works on neovim.

" --- Vim-mundo -------------------------------------------------------------------------------{{{
let g:mundo_verbose_graph = 0               " Create shorter graph
let g:mundo_inline_undo = 1                 " Show a small one line diff at each node
set undofile                                " Enable persistent undo so that undo history persists across vim sessions
set undodir=~/.vim/undo
nnoremap <F12> :MundoToggle<CR>
" }}}

VimWiki

vim.org GitHub vimwiki Personal Wiki for Vim
S-CR Continue list
gq Quote text block with {{{ ... }}}

To quote a text block with {{{ ... }}} in visual mode, add to ~/.vim/ftplugin/vimwiki_custom.vim:

" Quote a block of text with {{{ }}} in visual mode
:vmap gq DO {{{<CR><ESC>P
Troubleshooting
  • Tab not working anymore on dev branch. This is because tab is already mapped by plugin SuperTab, and Vimwiki refuses to remap.
--- a/ftplugin/vimwiki.vim
+++ b/ftplugin/vimwiki.vim
@@ -532,13 +532,9 @@ endfunction
 
 " insert mode table mappings
 if str2nr(vimwiki#vars#get_global('key_mappings').table_mappings)
-  if maparg('<Tab>', 'i') ==# ''
   inoremap <expr><buffer> <Tab> vimwiki#tbl#kbd_tab()
-  endif
-  if maparg('<S-Tab>', 'i') ==# ''
   inoremap <expr><buffer> <S-Tab> vimwiki#tbl#kbd_shift_tab()
 endif
-endif

YouCompleteMe

GitHub YouCompleteMe A code-completion engine for Vim http://valloric.github.io/YouCompleteMe/
  • Fast fuzzy auto-completion engine (suggest as you type).
  • Semantic completion using clang.
  • Instant diagnostics (errors and warnings reporting).
^n Next completion (also Tab using SuperTab plugin)
^p Previous completion (also S-Tab using SuperTab plugin)
Installation
cd .vim/plugged/YouCompleteMe
./install.py
Configuration (without semantic completion)
  • We don't configure YCM to use Tab for completion but the usual vim's map ^n and ^p.
  • Instead, we install SuperTab plugin, which will also trigger YCM completion with Tab and S-Tab (thanks Christoomey).
Plug 'Valloric/YouCompleteMe', { 'do': './install.py' } " A code-completion engine for Vim

" ...

" --- YouCompleteMe----------------------------------------------------------------------------{{{
let g:ycm_autoclose_preview_window_after_completion = 1 " Auto-close preview window on completion

let g:ycm_dont_warn_on_startup = 0
let g:ycm_complete_in_comments = 1
let g:ycm_complete_in_strings = 1
let g:ycm_collect_identifiers_from_comments_and_strings = 1

let g:ycm_filetype_blacklist = {}

let g:ycm_key_list_select_completion   = ['<C-n>', '<Down>']
let g:ycm_key_list_previous_completion = ['<C-p>', '<Up>']
" Bug workaround - avoid spurious scrolling on completion when typing '.'
let g:ycm_filetype_specific_completion_to_disable = {
      \ 'cpp': 1,
      \ 'gitcommit': 1
      \}
" }}}
Configuration (semantic completion)

Add the default compilation flags file .vim/.ycm_extra_conf.py (see manual for more details [12]):

def FlagsForFile( filename, **kwargs ):
  return {
    'flags': [ '-x', 'c++', '-std=c++14', '-Wall', '-Wextra', '-Werror' ],
  }

Then in .vimrc:

-Plug 'Valloric/YouCompleteMe', { 'do': './install.py' } " A code-completion engine for Vim
+Plug 'Valloric/YouCompleteMe', { 'do': './install.py  --clang-completer' } " A code-completion engine for Vim
-let g:ycm_filetype_specific_completion_to_disable = {
-      \ 'cpp': 1,
-      \ 'gitcommit': 1
-      \}
+let g:ycm_global_ycm_extra_conf = "~/.vim/.ycm_extra_conf.py"
Project-specific configuration

YCM can use project-specific compilation flags to report warnings / errors that are relevant to your project. YCM can either use a compilation database (such as BEAR, cmake, ninja...), or use manually defined flags. For the latter, just define a file .ycm_extra_conf.py in the root of your project:

def FlagsForFile( filename, **kwargs ):
  return {
    'flags': [ '-x', 'c++', '-std=c++14', '-Wall', '-Wextra', '-Werror', '-Isource', '-Iinclude', -'DTHIS_AND_THAT' ],
  }


Configuration - offline install
  • When installing on a computer without internet access, transfer the file clang+llvm-5.0.0-linux-x86_64-ubuntu14.04.tar.xz from ~/.vim/plugged/YouCompleteMe/third_party/ycmd/clang_archives/ manually.

Plugins to try

Plugins I need to try or install some day.

Plugins from Tim Pope:

However tComment seems more complete, and works fine for me.
vim.org GitHub vim-rsi TRY_MY rsi.vim: Readline style insertion
vim.org GitHub vim-abolish abolish.vim: easily search for, substitute, and abbreviate multiple variants of a word
vim.org GitHub vim-obsession obsession.vim: continuously updated session files


Some videos that illustrates those plugins:

vim.org GitHub unimpaired.vim Pairs of handy bracket mappings
For interaction with plugin fugitive, and quickfix mappings [q, ]q, [Q, and ]Q.
vim.org GitHub ifdef-highlighting #ifdef highlighting in c/c++/idl
GitHub VimFold4C Vim folding ftplugin for C & C++ (and similar langages)

Interesting plugin, but does not handle well nested #ifdef it seems.

GitHub GoldenView.Vim Always have a nice view for vim split windows! http://zhaocai.github.io/GoldenView.Vim/
Doxygen support

Uninstalled plugins

Plugins I'm no longer using.

Align

vim.org GitHub Align Help folks to align text, eqns, declarations, tables, etc
see examples.

Let's give vim-easy-align a try instead.

AutoClose

vim.org GitHub AutoClose Inserts matching bracket, paren, brace or quote

Don't like it much because inserting the closing pair will jump out of nested pair, which is annoying when one try to simply insert a closing brace (but a solution is to use the Surround plugin to surround some selected text with braces).

Calendar

calendar.vim - A calendar application for Vim

  • :Calendar to launch. < and > to cycle through views, E and T to view Event list or Task list.
  • :Calendar 2001 1 1 to focus a specific date.

My settings in .vimrc:

" ----- Vim-Calendar ---------------------------------------------------------
let g:calendar_week_number=1
let g:calendar_first_day='monday'

ClosePairs

vim.org GitHub ClosePairs Auto closes pairs of characters

simpler than AutoClose, and can also delete pair of braces at once with <BS>. However breaks undo and not dot-repeatable.

Below is a patch to push down the closing brace when typing { twice (inspired from AutoClose plugin).

Conque Shell

vim.org GitHub Conque Shell Run interactive commands inside a Vim buffer.

I'm using mostly NeoVim now, and neovim native command :term offers a much better alternative.

DiffChanges

diffchanges.vim : Show changes made to current buffer since the last save

  • Never used. Functionality quite limited (only compared with last save). And if file is stored in Git, plugin fugitive is a much better alternative.

EasyTags

easytags.vim : Automated tag file generation and syntax highlighting of tags in Vim

  • Replaced by AutoTag — syntax highlighting of tags is limited to c files; moreover AutoTag has a clever way to look for the tags file in project hierarchy.

Git-file

git:file.vim : open any version of a file in git For instance, to open file filename.c at commit HEAD~4:

vim HEAD~4:./filename.c
  • Never used. Similar functionality available in plugin fugitive.

Hexman

vim.org GitHub Hexman Simpler Hex viewing and editing

Uninstalled because it contains the sign of the devil... Well, no, in fact because I don't use it much and standard mappings interfere with vim-gitgutter.

LaTeX Text Formatter

Latex Text Formatter : This scripts makes it easier to format latex text

  • Does not work well (line too short, line merge too aggressive)

LustyJuggler

vim.org GitHub LustyJuggler Switch very quickly among your active buffers
More recent GitHub (merged with LustyExplorer

Removed because I don't use it. LustyExplorer, NERDTree and FuzzyFinder are much better alternatives.

MiniBufExpl

minibufexpl.vim : Elegant buffer explorer - takes very little screen space

  • 1st attempt: No real tab support. Seems to interfere with trinity plugin. Interesting key bindings inside though. To reassess...
  • 2nd attempt: Don't care about tabs, the idea is to fully replace tabs with buffers since most plugins interface better with buffers. Disabled

trinity plugin.

  • Closing a buffer: Use d in minibufexpl window to close a buffer, or :bd[elete] seems to work most of the time.
  • Uninstalled because found better alternative (bufstat)

MRU

mru.vim : Plugin to manage Most Recently Used (MRU) files

  • Never used. And same functionality is available in Ctrl-P plugin anyway.

Trinity.vim

trinity.vim : Build the trinity of srcexpl, taglist, NERD_tree to be a good IDE