Преглед на файлове

Add vim-endwise to submodules. tpope is awesome

Andrew Swistak преди 12 години
родител
ревизия
c84a6e6d05
променени са 3 файла, в които са добавени 203 реда и са изтрити 0 реда
  1. 4 0
      .gitmodules
  2. 52 0
      vim/bundle/vim-endwise/README.markdown
  3. 147 0
      vim/bundle/vim-endwise/plugin/endwise.vim

+ 4 - 0
.gitmodules

@@ -78,3 +78,7 @@
 	path = vim/bundle/vim-rails
 	url = https://github.com/tpope/vim-rails.git
   ignore = dirty
+[submodule "vim/bundle/vim-endwise"]
+	path = vim/bundle/vim-endwise
+	url = https://github.com/tpope/vim-endwise.git
+  ignore = dirty

+ 52 - 0
vim/bundle/vim-endwise/README.markdown

@@ -0,0 +1,52 @@
+endwise.vim
+===========
+
+This is a simple plugin that helps to end certain structures
+automatically.  In Ruby, this means adding `end` after `if`, `do`, `def`
+and several other keywords. In Vimscript, this amounts to appropriately
+adding `endfunction`, `endif`, etc.  There's also Bourne shell, VB
+(don't ask), C/C++ preprocessor, and Lua support.
+
+A primary guiding principle in designing this plugin was that an
+erroneous insertion is never acceptable.  The behavior is only triggered
+once pressing enter on the end of the line.  When this happens, endwise
+searches for a matching end structure and only adds one if none is
+found.
+
+While the goal was to make it customizable, this turned out to be a tall
+order.  Every language has vastly different requirements.  Nonetheless,
+for those bold enough to attempt it, you can follow the model of the
+autocmds in the plugin to set the three magic variables governing
+endwise's behavior.
+
+Installation
+------------
+
+If you don't have a preferred installation method, I recommend
+installing [pathogen.vim](https://github.com/tpope/vim-pathogen), and
+then simply copy and paste:
+
+    cd ~/.vim/bundle
+    git clone git://github.com/tpope/vim-endwise.git
+
+Contributing
+------------
+
+See the contribution guidelines for
+[pathogen.vim](https://github.com/tpope/vim-pathogen#readme).
+
+Self-Promotion
+--------------
+
+Like endwise.vim? Follow the repository on
+[GitHub](https://github.com/tpope/vim-endwise) and vote for it on
+[vim.org](http://www.vim.org/scripts/script.php?script_id=2386).  And if
+you're feeling especially charitable, follow [tpope](http://tpo.pe/) on
+[Twitter](http://twitter.com/tpope) and
+[GitHub](https://github.com/tpope).
+
+License
+-------
+
+Copyright (c) Tim Pope.  Distributed under the same terms as Vim itself.
+See `:help license`.

+ 147 - 0
vim/bundle/vim-endwise/plugin/endwise.vim

@@ -0,0 +1,147 @@
+" endwise.vim - EndWise
+" Author:       Tim Pope <http://tpo.pe/>
+" Version:      1.1
+" License:      Same as Vim itself.  See :help license
+" GetLatestVimScripts: 2386 1 :AutoInstall: endwise.vim
+
+if exists("g:loaded_endwise") || &cp
+  finish
+endif
+let g:loaded_endwise = 1
+
+augroup endwise " {{{1
+  autocmd!
+  autocmd FileType lua
+        \ let b:endwise_addition = '\=submatch(0)=="{" ? "}" : "end"' |
+        \ let b:endwise_words = 'function,do,then' |
+        \ let b:endwise_pattern = '^\s*\zs\%(function\|do\|then\)\>\%(.*[^.:@$]\<end\>\)\@!\|\<then\|do\ze\%(\s*|.*|\)\=\s*$' |
+        \ let b:endwise_syngroups = 'luaFunction,luaStatement,luaCond'
+  autocmd FileType elixir
+        \ let b:endwise_addition = '\=submatch(0)=="{" ? "}" : "end"' |
+        \ let b:endwise_words = 'case,cond,bc,lc,inlist,inbits,if,unless,try,receive,function,fn' |
+        \ let b:endwise_pattern = '^\(.*=\)\?\s*\zs\%(case\|cond\|bc\|lc\|inlist\|inbits\|if\|unless\|try\|receive\|function\|fn\)\>\%(.*[^.:@$]\<end\>\)\@!\|\<do\ze\%(\s*|.*|\)\=\s*$' |
+        \ let b:endwise_syngroups = 'elixirKeyword'
+  autocmd FileType ruby
+        \ let b:endwise_addition = '\=submatch(0)=="{" ? "}" : "end"' |
+        \ let b:endwise_words = 'module,class,def,if,unless,case,while,until,begin,do' |
+        \ let b:endwise_pattern = '^\(.*=\)\?\s*\zs\%(module\|class\|def\|if\|unless\|case\|while\|until\|for\|\|begin\)\>\%(.*[^.:@$]\<end\>\)\@!\|\<do\ze\%(\s*|.*|\)\=\s*$' |
+          \ let b:endwise_syngroups = 'rubyModule,rubyClass,rubyDefine,rubyControl,rubyConditional,rubyRepeat'
+  autocmd FileType sh,zsh
+        \ let b:endwise_addition = '\=submatch(0)=="if" ? "fi" : submatch(0)=="case" ? "esac" : "done"' |
+        \ let b:endwise_words = 'if,until,case,do' |
+        \ let b:endwise_pattern = '\%(^\s*\zs\%(if\|case\)\>\ze\|\zs\<do\ze$\|^\s*\zsdo\s*\ze$\)' |
+        \ let b:endwise_syngroups = 'shConditional,shLoop,shIf,shFor,shRepeat,shCaseEsac,zshConditional,zshRepeat,zshDelimiter'
+  autocmd FileType vb,vbnet,aspvbs
+        \ let b:endwise_addition = 'End &' |
+        \ let b:endwise_words = 'Function,Sub,Class,Module,Enum,Namespace' |
+        \ let b:endwise_pattern = '\%(\<End\>.*\)\@<!\<&\>' |
+        \ let b:endwise_syngroups = 'vbStatement,vbnetStorage,vbnetProcedure,vbnet.*Words,AspVBSStatement'
+  autocmd FileType vim
+        \ let b:endwise_addition = 'end&' |
+        \ let b:endwise_words = 'fu\%[nction],wh\%[ile],if,for,try' |
+        \ let b:endwise_syngroups = 'vimFuncKey,vimNotFunc,vimCommand'
+  autocmd FileType c,cpp,xdefaults
+        \ let b:endwise_addition = '#endif' |
+        \ let b:endwise_words = '#if,#ifdef,#ifndef' |
+        \ let b:endwise_pattern = '^\s*#\%(if\|ifdef\|ifndef\)\s\+.\+$' |
+        \ let b:endwise_syngroups = 'cPreCondit,cCppInWrapper,xdefaultsPreProc'
+  autocmd FileType matlab
+        \ let b:endwise_addition = '\=submatch(0)=="{" ? "}" : "end"' |
+        \ let b:endwise_words = 'function,if,for' |
+        \ let b:endwise_syngroups = 'matlabStatement,matlabFunction,matlabConditional,matlabRepeat'
+augroup END " }}}1
+
+" Maps {{{1
+
+if maparg("<Plug>DiscretionaryEnd") == ""
+  inoremap <silent> <SID>DiscretionaryEnd <C-R>=<SID>crend(0)<CR>
+  inoremap <silent> <SID>AlwaysEnd        <C-R>=<SID>crend(1)<CR>
+  imap    <script> <Plug>DiscretionaryEnd <SID>DiscretionaryEnd
+  imap    <script> <Plug>AlwaysEnd        <SID>AlwaysEnd
+endif
+
+if !exists('g:endwise_no_mappings')
+  if maparg('<CR>','i') =~# '<C-R>=.*crend(.)<CR>\|<\%(Plug\|SNR\|SID\)>.*End'
+    " Already mapped
+  elseif maparg('<CR>','i') =~ '<CR>'
+    exe "imap <script> <C-X><CR> ".maparg('<CR>','i')."<SID>AlwaysEnd"
+    exe "imap <script> <CR>      ".maparg('<CR>','i')."<SID>DiscretionaryEnd"
+  elseif maparg('<CR>','i') =~ '<Plug>\w\+CR'
+    exe "imap <C-X><CR> ".maparg('<CR>', 'i')."<Plug>AlwaysEnd"
+    exe "imap <CR> ".maparg('<CR>', 'i')."<Plug>DiscretionaryEnd"
+  else
+    imap <C-X><CR> <CR><Plug>AlwaysEnd
+    imap <CR>      <CR><Plug>DiscretionaryEnd
+  endif
+endif
+
+" }}}1
+
+" Code {{{1
+
+function! s:mysearchpair(beginpat,endpat,synpat)
+  let g:endwise_syntaxes = ""
+  let s:lastline = line('.')
+  call s:synname()
+  let line = searchpair(a:beginpat,'',a:endpat,'Wn','<SID>synname() !~# "^'.substitute(a:synpat,'\\','\\\\','g').'$"',line('.')+50)
+  return line
+endfunction
+
+function! s:crend(always)
+  let n = ""
+  if !exists("b:endwise_addition") || !exists("b:endwise_words") || !exists("b:endwise_syngroups")
+    return n
+  end
+  let synpat  = '\%('.substitute(b:endwise_syngroups,',','\\|','g').'\)'
+  let wordchoice = '\%('.substitute(b:endwise_words,',','\\|','g').'\)'
+  if exists("b:endwise_pattern")
+    let beginpat = substitute(b:endwise_pattern,'&',substitute(wordchoice,'\\','\\&','g'),'g')
+  else
+    let beginpat = '\<'.wordchoice.'\>'
+  endif
+  let lnum = line('.') - 1
+  let space = matchstr(getline(lnum),'^\s*')
+  let col  = match(getline(lnum),beginpat) + 1
+  let word  = matchstr(getline(lnum),beginpat)
+  let endword = substitute(word,'.*',b:endwise_addition,'')
+  let y = n.endword."\<C-O>O"
+  let endpat = '\w\@<!'.endword.'\w\@!'
+  if a:always
+    return y
+  elseif col <= 0 || synIDattr(synID(lnum,col,1),'name') !~ '^'.synpat.'$'
+    return n
+  elseif getline('.') !~ '^\s*#\=$'
+    return n
+  endif
+  let line = s:mysearchpair(beginpat,endpat,synpat)
+  " even is false if no end was found, or if the end found was less
+  " indented than the current line
+  let even = strlen(matchstr(getline(line),'^\s*')) >= strlen(space)
+  if line == 0
+    let even = 0
+  endif
+  if !even && line == line('.') + 1
+    return y
+  endif
+  if even
+    return n
+  endif
+  return y
+endfunction
+
+function! s:synname()
+  " Checking this helps to force things to stay in sync
+  while s:lastline < line('.')
+    let s = synIDattr(synID(s:lastline,indent(s:lastline)+1,1),'name')
+    let s:lastline = nextnonblank(s:lastline + 1)
+  endwhile
+
+  let s = synIDattr(synID(line('.'),col('.'),1),'name')
+  let g:endwise_syntaxes = g:endwise_syntaxes . line('.').','.col('.')."=".s."\n"
+  let s:lastline = line('.')
+  return s
+endfunction
+
+" }}}1
+
+" vim:set sw=2 sts=2: