diff --git a/vim/bundle/.vundle/script-names.vim-scripts.org.json b/vim/bundle/.vundle/script-names.vim-scripts.org.json new file mode 100644 index 0000000..c5a91ce --- /dev/null +++ b/vim/bundle/.vundle/script-names.vim-scripts.org.json @@ -0,0 +1 @@ +["test.vim","test.zip","test_syntax.vim","ToggleCommentify.vim","DoxyGen-Syntax","keepcase.vim","ifdef-highlighting","vimbuddy.vim","buffoptions.vim","fortune.vim","drawing.vim","ctags.vim","closetag.vim","htmlcmd.vim","ccase.vim","compiler.tar.gz","ls.vim","calendar.vim","dl.vim","jcommenter.vim","info.vim","hunspchk.zip","EnhCommentify.vim","LoadHeaderFile.vim","mailbrowser.vim","vimmailr.zip","format.vim","vimxmms.tar.gz","sourceSafe.zip","python.vim","a.vim","vimrc.tcl","oravim.txt","javabean.vim","jbean.vim","vimvccmd.zip","dbhelper.tgz","matchit.zip","DrawIt","rcs-menu.vim","bufexplorer.zip","sccs-menu.vim","completeWord.py","Mail_Sig.set","Mail_mutt_alias.set","Mail_Re.set","Triggers.vim","Mail_cc.set","lh-brackets","cscope_macros.vim","calendar.vim","colorize.vim","ConvertBase.vim","TagsMenu.zip","perl.vim","oberon.vim","cvsmenu.vim","dtags","delphi.vim","Embperl_Syntax.zip","whatdomain.vim","emacs.vim","po.vim","CD.vim","_vim_wok_visualcpp01.zip","nqc.vim","vfp.vim","project.tar.gz","pt.vim.gz","dctl.vim.gz","foo.vim","word_complete.vim","aux2tags.vim","javaimp.vim","uri-ref","incfiles.vim","functags.vim","wordlist.vim","files2menu.pm","translate.vim","AppendComment.vim","let-modeline.vim","gdbvim.tar.gz","Mkcolorscheme.vim","brief.vim","plkeyb.vim","vimtips.zip","savevers.vim","vcscommand.vim","nsis.vim","borland.vim","tex.vim","express.vim","winmanager","methods.vim","sqlplus.vim","spec.vim","mail.tgz","TagsBase.zip","nlist.vim","DirDiff.vim","regview.vim","BlockHL","desert.vim","colorscheme_template.vim","SelectBuf","bufNwinUtils.vim","lightWeightArray.vim","golden.vim","torte.vim","borland.vim","idutils","MultiPrompt.vim","blue.vim","csharp.vim","cs.vim","Shell.vim","vim.vim","Decho","asu1dark.vim","Astronaut","sum.vim","quickhigh.tgz","selbuff.vim","ctx-1.15.vim","runscript.vim","random_vim_tip.tar.gz","PushPop.vim","usr2latex.pl","spellcheck.vim","PopupBuffer.vim","TableTab.vim","djgpp.vim","vim-spell.tar.gz","ada.vim","ada.vim","which.vim","VirMark.vim","oracle.vim","sql.vim","words_tools.vim","chcmdmod.vim","increment.vim","CmdlineCompl.vim","SearchCompl.vim","perl_io.vim","darkslategray.vim","undoins.vim","cisco-syntax.tar.gz","ShowMarks","EasyHtml.vim","ctags.vim","ant_menu.vim","increment.vim","autoload_cscope.vim","foldutil.vim","minibufexpl.vim","gtkvim.tgz","FavMenu.vim","auctex.vim","ruby-macros.vim","html-macros.vim","vimsh.tar.gz","libList.vim","perforce.vim","idevim.tgz","email.vim","mcant.vim","multvals.vim","TeTrIs.vim","boxdraw","tf.vim","CreateMenuPath.vim","Lineup--A-simple-text-aligner","Justify","A-better-tcl-indent","ViMail","remcmd.vim","prt_mgr.zip","SuperTab","treeexplorer","vtreeexplorer","bk-menu.vim","glib.vim","win-manager-Improved","ruby-menu.vim","renumber.vim","navajo.vim","wcd.vim","RExplorer","fortune.vim","MRU","Engspchk","vcal.vim","genutils","template-file-loader","charset.vim","ComplMenu.vim","bcbuf.vim","quickfonts.vim","DSP-Make","vimconfig","morse.vim","LaTeX-Help","MRU-Menu","ctx","Perldoc.vim","fine_blue.vim","sokoban.vim","linuxmag.vim","c.vim","lh-vim-lib","tagmenu.vim","xmms-play-and-enqueue","cmvc.vim","tex.vim","bccalc.vim","mkview.vim","VIlisp.vim","mu-template","xl_tiv.vim","night.vim","einstimer.vim","closeb","Brown","Expand-Template","search-in-runtime","Brace-Complete-for-CCpp","Smart-Tabs","spell.vim","print_bw.zip","std_c.zip","Naught-n-crosses","SourceSafe-Integration","Michaels-Standard-Settings","Hex-Output","Visual-Mapping-Maker","perforce","xul.vim","cream-capitalization","mu-marks","imaps.vim","JavaRun","Buffer-Menus","cream-ascii","vimRubyX","update_vim","bnf.vim","lid.vim","UserMenu.vim","midnight.vim","tmpl.vim","ihtml.vim","pascii","XSLT-syntax","htmlmap","lastchange.vim","manxome-foes-colorscheme","vimdoc","doc.vim","csc.vim","aspnet.vim","brief.vim","java.vim","Nsis-color","byteme.vim","scite-colors","Cool-colors","navajo-night","multi.vim","taglist.vim","User-Defined-Type-Highlighter","camo.vim","adrian.vim","PrintWithLNum","sybase.vim","Projmgr","netdict","ExecPerl","candy.vim","txt2pdf.vim","unilatex.vim","potts.vim","sessmgr","outlineMode.vim","aqua","serverlist.vim","ruby-matchit","autodate.vim","xian.vim","utl.vim","Align","bluegreen","showbrace","latextags","vimfortune","TabIndent","Vimacs","xmledit","AnsiEsc.vim","ftpluginruby.vim","pyimp.vim","sql_iabbr.vim","gnome-doc.vim","xemacs-colorscheme","fog-colorscheme","CSV-delimited-field-jumper","cream-sort","grep.vim","ipsec_conf.vim","EDIFACT-position-in-a-segment","tomatosoup.vim","xchat-log-syntax","broadcast.vim","vera.vim","f.vim","highlightline.vim","hungarian_to_english","Buffer-Search","srecord.vim","reformat.vim","multivim","JavaImp.vim","PHPcollection","JHTML-syntax-file","Nightshimmer","cfengine-syntax-file","code2html","prt_hdr","cream-progressbar","QuickAscii","bw.vim","lh-cpp","vtags","vtags_def","ASP-maps","tforge.vim","pf.vim","sand","fstab-syntax","MqlMenu.vim","lcscheck.vim","php.vim","textlink.vim","White-Dust","ruby.vim","Highlight-UnMatched-Brackets","localColorSchemes.vim","multipleRanges.vim","getVar.vim","variableSort.vim","vimrc_nopik","dbext.vim","openroad.vim","java_apidoc.vim","ABAP.vim","rcsdiff.vim","snippet.vim","opsplorer","cream-showinvisibles","bash-support.vim","ldraw.vim","DirDo.vim","oceandeep","atomcoder-vim","Expmod","timstamp.vim","Red-Black","ftpluginruby.vim","indentruby.vim","Denim","mof.vim","vim-game-of-life","ia64.vim","d.vim","PreviewTag.vim","ShowLine.vim","ShowBlockName.vim","SyntaxAttr.vim","DarkOcean.vim","ibmedit.vim","python_match.vim","rnc.vim","LbdbQuery.vim","scratch-utility","plp.vim","LaTeX-functions","ocean.vim","spectre.vim","bugfixes-to-vim-indent-for-verilog","gri.vim","scilab.vim","ShowFunc.vim","maxima.vim","ironman.vim","sean.vim","regRedir.vim","colormenu.vim","eruby.vim","getmail.vim","colour_flip.pl","blackdust.vim","CVSAnnotate.vim","beanshell.vim","svn.vim","muf.vim","tex.vim","cvopsefsa.vim","ActionScript","plsql.vim","Zenburn","Kent-Vim-Extensions","plsql.vim","Registryedit-win32","syslog-syntax-file","MySQL-script-runner","elinks.vim","eukleides.vim","jcl.vim","midnight2.vim","smlisp.vim","lustre","lustre-syntax","VimFootnotes","biogoo.vim","Get-Win32-Short-Name","Get-UNC-Path-Win32","pythonhelper","javaGetSet.vim","copycppdectoimp.vim","cppgetset.vim","titlecase.vim","stata.vim","localvimrc","lilac.vim","spacehi.vim","deldiff.vim","Syntax-for-the-BETA-programming-language","JavaDecompiler.vim","exim.vim","java_checkstyle.vim","gmt.vim","xhtml.vim","EasyAccents","draw.vim","HTML.zip","sql.vim","php_abb","xgen.vim","noweb.vim","PCP-header","vim-templates","rrd.vim","TTCoach","nw.vim","rainbow.zip","VB-Line-Number","vimspell","perl_h2xs","emodeline","VEC","fnaqevan","HTML-Photo-Board","cream-vimabbrev","mup.vim","BlockComment.vim","SearchComplete","LaTeX-Suite-aka-Vim-LaTeX","Transparent","python.vim","aj.vim","MultipleSearch","toothpik.vim","cscomment.vim","cuecat.vim","tagexplorer.vim","ddldbl.vim","markjump.vim","SAPDB_Pascal.vim","Posting","cream-keytest","ManPageView","java_getset.vim","debug.vim","SQLUtilities","Cpp-code-template-generator","ri-browser","sql.vim","poser.vim","waimea.vim","sql.vim","SpellChecker","foldlist","OO-code-completion","transvim.vim","Macromedia-Director-Lingo-Syntax","oz.vim","python_box.vim","greputil.vim","mercury.vim","ZoomWin","mailsig","Varrays","casejump.vim","Printer-Dialog","Indent-Finder","mrswin.vim","python_fold","sr.vim","TVO--The-Vim-Outliner","csv-color","CVS-conflict-highlight","PHPDoc-Script-PDocS","mru.vim","tar.vim","VimITunes.vim","Visual-Studio-.NET-compiler-file","cscope-menu","pdbvim","cppcomplete","mh","blockquote.vim","Mixed-sourceassembly-syntax-objdump","elvis-c-highlighting","colorer-color-scheme","ntservices","PHP-dictionary","tiger.vim","tiger.vim","tab-syntax","cream-email-munge","FavEx","apdl.vim","velocity.vim","russian-menu-translation","nuweb.vim","flyaccent.vim","ebnf.vim","IDLATL-Helper","as.vim","Mines","coffee.vim","adp.vim","mruex","HiCurLine","perl-support.vim","BOG","spreadsheet.vim","BufClose.vim","MPD-syntax-highlighting","help.vim","rd.vim","rcsvers.vim","ASPRecolor.vim","HTML--insert","ctrlax.vim","desc.vim","ntprocesses","caramel.vim","GTK","autolisp-help","wintersday.vim","darkdot","TEXT--fill-char","gnu-c","psp.vim","dawn","allfold","fgl.vim","autonumbering-in-vim","cg.vim","matlab.vim","comment.vim","pyljpost.vim","todolist.vim","northsky","fgl.c","JavaBrowser","seashell","BlackSea","PapayaWhip","ChocolateLiquor","guifontpp.vim","TaQua","HelpClose","colorpalette.vim","python-tools","execmap","cmake.vim","cmake.vim","vimwc.sh","vimbadword.sh","oceanblack.vim","php.vim-html-enhanced","cream-numberlines","asmMIPS","valgrind.vim","toc.vim","Qt.vim","ctags.vim","dante.vim","cpp.vim","gisdk","CRefVim","ruler.vim","Asciitable.vim","Adaryn.vim","BreakPts","brookstream","Russian-menu-for-gvimwin32","Conflict2Diff","tagsubmenu","m4pic.vim","nightwish.vim","Color-Sampler-Pack","ShowPairs","MarkShift","SeeTab","putty","resolv.conf-syntax","cf.vim","make-element","Reindent","otf.vim","sparc.vim","getdp","COMMENT.vim","WC.vim","gmsh.vim","SYN2HTML","tcsoft.vim","GetLatestVimScripts","WML-Wireless-Markup-Language-syntax","Color-Scheme-Test","greyblue.vim","colorize","DOS-Commands","fte.vim","chordpro.vim","vectorscript.vim","uniq.vim","stol.vim","ldap_schema.vim","ldif.vim","proc.vim","esperanto","epperl.vim","headers.vim","sip.vim","gpg.vim","gnupg","xml_cbks","VimDebug","scratch.vim","FeralToggleCommentify.vim","hexman.vim","Dotnet-Dictionaries","random.vim","matrix.vim","VisIncr","autumn.vim","listmaps.vim","Maxlen.vim","MakeDoxygenComment","VS-like-Class-Completion","GenerateMatlabFunctionComment","pgn.vim","genindent.vim","fluxbox.vim","ferallastchange.vim","blockhl2.vim","cschemerotate.vim","ftplugin-for-Calendar","Comment-Tools","incbufswitch.vim","feralalign.vim","VimTweak","calibre.vim","cleanphp","actionscript.vim","POD-Folder","VimSpeak","ample.vim","quancept.vim","po.vim","timecolor.vim","timecolor.vim","Visual-Cpp","NEdit","OIL.vim","cg.vim","parrot.vim","xmmsctrl.vim","isi2bib","sketch.vim","gdl.vim","msp.vim","brainfuck-syntax","sfl.vim","browser-like-scrolling-for-readonly-file","nuvola.vim","SideBar.vim","MSIL-Assembly","cygwin.vim","mupad.vim","trash.vim","wiki.vim","tagMenu","local_vimrc.vim","Hanoi-Tower","sudo.vim","co.vim","xmidas.vim","folddigest.vim","quicksession.vim","sql.vim","pam.vim","kickstart.vim","mdl.vim","gor.vim","yaml.vim","sbutils","movewin.vim","SwapHeader","svn.vim","dhcpd.vim","curcmdmode","cmdalias.vim","Intellisense-for-Vim","HelpExtractor","pic.vim","aiseered.vim","winhelp","opengl.vim","ttcn-syntax","ttcn-indent","VDLGBX.DLL","python_encoding.vim","showpairs-mutated","dusk","LogCVSCommit","peaksea","lpc.vim","hlcontext.vim","dont-click","gvim-with-tabs","VHDL-indent","ttcn-dict","mis.vim","table.vim","Source-Control","ocamlhelp.vim","umber-green","vgrep","lebrief.vim","vimcdoc","whereis.vim","highlight_cursor.vim","ntp.vim","php_console.vim","sessions.vim","pyfold","oasis.vim","gdm.vim","fluka.vim","vartabs.vim","delek.vim","qt2vimsyntax","tokens.vim","set_utf8.vim","python.vim","Relaxed-Green","simpleandfriendly.vim","ttcn-ftplugin","promela.vim","xterm16.vim","bmichaelsen","preview.vim","Walk.vim","FindMakefile","MixCase.vim","javaDoc.vim","gramadoir.vim","XQuery-syntax","expand.vim","zrf.vim","truegrid.vim","dks-il2-tex.vim","vimcommander","Smart-Diffsplit","robinhood.vim","darkblue2.vim","billw.vim","mail.vim","white.vim","HHCS_D","enumratingptn","HHCS","ephtml","rgbasm.vim","Mouse-Toggle","BlockWork","avrasm.vim","yum.vim","asmM68k.vim","find_in_files","mp.vim","Intellisense","VimNotes","gq","TT2-syntax","xmaslights.vim","smartmake","httpclog","RTF-1.6-Spec-in-Vim-Help-Format","systemc_syntax.tar.gz","selected-resizer","PureBasic-Syntax-file","macro.vim","python.vim","text.py","yo-speller","increment.vim","nasl.vim","ptl.vim","pyab","mars.vim","howto-ftplugin","SrchRplcHiGrp.vim","latex-mik.vim","Pydiction","Posting","Gothic","File-local-variables","less.vim","FX-HLSL","NSIS-2.0--Syntax","table_format.vim","LocateOpen","Destructive-Paste","inform.vim","VikiDeplate","cscope-quickfix","BlackBeauty","visual_studio.vim","unmswin.vim","Israelli-hebrew-shifted","phoneticvisual-hebrew-keyboard-mapphone","Redundant-phoneticvisual-Hebrew-keyboar","changesqlcase.vim","changeColorScheme.vim","allout.vim","Syntax-context-abbreviations","srec.vim","emacsmode","bufman.vim","automation.vim","GVColors","Posting","RegExpRef","passwd","buttercream.vim","fluxkeys.vim","ods.vim","AutoAlign","FormatBlock","FormatComment.vim","docbkhelper","armasm","EvalSelection.vim","edo_sea","pylint.vim","winpos.vim","gtags.vim","Viewing-Procmail-Log","Toggle","perl_synwrite.vim","ViewOutput","CharTab","nesC","Tower-of-Hanoi","sharp-Plugin-Added","ratfor.vim","fvl.vim","yiheb-il.vim","sql.vim","Editable-User-Interface-EUI-eui_vim","html_umlaute","nvi.vim","unicodeswitch.vim","pydoc.vim","nedit2","adam.vim","po.vim","sieve.vim","AsNeeded","Nibble","fdcc.vim","CSS-2.1-Specification","sqlldr.vim","tex_autoclose.vim","bufmenu2","svncommand.vim","timestamp.vim","html_portuquese","AutoFold.vim","russian-phonetic_utf-8.vim","colorsel.vim","XpMenu","timelog.vim","virata.vim","VimIRC.vim","TogFullscreen.vim","database-client","ftpsync","svg.vim","Karma-Decompiler","autosession.vim","newheader.vim","sccs.vim","screen.vim","edifact.vim","pqmagic.vim","ProjectBrowse","n3.vim","groovy.vim","StyleChecker--perl","2tex.vim","Scons-compiler-plugin","qf.vim","af.vim","aspnet.vim","psql.vim","multiselect","xml2latex","ToggleComment","php-doc","YAPosting","blugrine","latex_pt","replace","DumpStr.vim","RemoteSaveAll.vim","FTP-Completion","nexus.vim","uptime.vim","asmx86","php.vim-for-php5","autoit.vim","pic18fxxx","IncrediBuild.vim","folds.vim","chela_light","rest.vim","indentpython.vim","Siebel-VB-Script-SVB","Tibet","Maxscript","svn-diff.vim","idf.vim","ssa.vim","GtkFileChooser","Simple-templates","onsgmls.vim","mappinggroup.vim","metacosm.vim","ASPJScript","DoxygenToolkit.vim","VHT","pdftotext","rpl","rpl","rpl","aspvbs.vim","FiletypeRegisters","nant-compiler-script","tbf-vimfiles","Window-Sizes","menu_pt_br.vimfix","TransferChinese.vim","gtk-vim-syntax","2htmlj","glsl.vim","SearchInBuffers.vim","Docbook-XSL-compiler-file","Phrases","Olive","Lynx-Offline-Documentation-Browser","srec.vim","srec.vim","lingo.vim","buflist","lingodirector.vim","PLI-Tools","clipbrd","check-mutt-attachments.vim","corewars.vim","redcode.vim","potwiki.vim","updt.vim","revolutions.vim","feralstub.vim","Phoenity-discontinued","aftersyntax.vim","IndentHL","xmlwf.vim","Visual-Mark","errsign","log.vim","msvc2003","scalefont","uc.vim","commenter","OOP.vim","cream-iso639.vim","cream-iso3166-1","HTMLxC.vim","vimgrep.vim","array.vim","vimtabs.vim","CodeReviewer.vim","cube.vim","uc.vim","uc.vim","sf.vim","monday","ST20-compiler-plugin","R.vim","octave.vim","delete.py","groff-keymap","The-Mail-Suite-tms","browser.vim","InteractHL.vim","curBuf.vim","vsutil.vim","DavesVimPack","Menu-Autohide","pygtk_color","Vive.vim","actionscript.vim","greputils","HC12-syntax-highlighting","asp.vim","click.vim","cecutil","mingw.vim","abap.vim","vimsh","dsPIC30f","BufOnly.vim","ConfirmQuit.vim","fasm-compiler","python_calltips","netrw.vim","cscope_win","lindo.vim","VUT","replvim.sh","xmms.vim","HiColors","MS-Word-from-VIM","multiwin.vim","multiAPIsyntax","earth.vim","Black-Angus","tpp.vim","cfengine.vim","sas.vim","InsertTry.vim","VimRegEx.vim","blitzbasic.vim","Archive","cream-statusline-prototype","TabLaTeX","buffer-perlpython.pl","txt2tags-menu","hamster.vim","hamster.vim","clearsilver","hamster.vim","VB.NET-Syntax","VB.NET-Indent","ACScope","ptu","java_src_link.vim","AutumnLeaf","WhatsMissing.vim","bulgarian.vim","edifile.vim","rcs.vim","pydoc.vim","TWiki-Syntax","pmd.vim","BodySnatcher","MapleSyrup","ooosetup.vim","reverse.vim","mod_tcsoft.vim","PHP-correct-Indenting","anttestreport","lingo.vim","lpl.vim","UpdateModDate.vim","vimUnit","lxTrace","vim2ansi","synmark.vim","vim_faq.vim","jhlight.vim","javascript.vim","css.vim","scratch.vim","Japanese-Keymapping","vcbc.vim","scilab.tar.gz","scilab.tar.gz","tree","FileTree","Cisco-ACL-syntax-highlighting-rules","header.vim","inkpot","jhdark","C-fold","ccimpl.vim","bufkill.vim","perl-test-manage.vim","GetFDCText.vim","cygwin_utils.vim","globalreplace.vim","remote-PHP-debugger","xbl.vim","JavaKit","ledger.vim","ledger.vim","txt2tags","unhtml","pagemaker6","tSkeleton","foldcol.vim","jexplorer","html_danish","EditJava","tolerable.vim","Wiked","substitute.vim","sharp-Indent","GoboLinux-ColorScheme","Abc-Menu","DetectIndent","templates.vim","tComment","Rhythmbox-Control-Plugin","sharp-Syntax","oceanlight","OAL-Syntax","PVCS-access","context_complete.vim","fileaccess","avr.vim","tesei.vim","MultipleSearch2.vim","uniface.vim","turbo.vim","rotate.vim","cream-replacemulti","cleanswap","matrix.vim","hcc.vim","wc.vim","AutoUpload","expander.vim","vfp8.vim","vis","omlet.vim","ocaml.annot.pl","nodiff.vim","increment_new.vim","namazu.vim","c.vim","bsh.vim","WhereFrom","oo","Java-Syntax-and-Folding","ProvideX-Syntax","DNA-Tools","vimCU","cvsvimdiff","latexmenu","XML-Indent","AddIfndefGuard","Vim-JDE","cvsdiff.vim","Super-Shell-Indent","cool.vim","Perldoc-from-VIM","The-NERD-Commenter","darkblack.vim","OpenGLSL","monkeyd-configuration-syntax","OCaml-instructions-signature---parser","plist.vim","my-_vimrc-for-Windows-2000XP7-users","DotOutlineTree","Vim-klip-for-Serence-Klipfolio-Windows","explorer-reader.vim","recent.vim","crontab.freebsd.vim","Rainbow-Parenthesis","mom.vim","DoTagStuff","gentypes.py","YankRing.vim","mathml.vim","xhtml.vim","MS-SQL-Server-Syntax","Mark","autoit.vim","Guardian","octave.vim","Markdown-syntax","desert256.vim","Embedded-Vim-Preprocessor","cvsmenu.vim-updated","Omap.vim","swig","cccs.vim","vc_diff","Teradata-syntax","timekeeper","trt.vim","greens","VIMEN","pike.vim","aspvbs.vim","wood.vim","custom","sienna","tmda_filter.vim","cstol.vim","tex_umlaute","Quick-access-file-Menu","IComplete","Emacs-outline-mode","teol.vim","acsb","drcstubs","drc_indent","rubikscube.vim","php_check_syntax.vim","Mathematica-Syntax-File","Mathematica-Indent-File","SpotlightOpen","autoscroll","vsearch.vim","quantum.vim","ToggleOptions.vim","crontab.vim","tagselect","TinyBufferExplorer","TortoiseSVN.vim","nasl.vim","sadic.tgz","tabs.vim","otherfile.vim","otherfile.vim","LogiPat","luarefvim","keywords.vim","Pida","nightshade.vim","form.vim","rsl.vim","Color-Scheme-Explorer","Project-Browser-or-File-explorer-for-vim","Shortcut-functions-for-KeepCase-script-","maximize.dll","recycle.dll-and-recycle.vim","php_funcinfo.vim","T7ko","cguess","php_template","another-dark-scheme","java_fold","DataStage-Universe-Basic","vimplate","vimplate","bwftmenu.vim","asmM6502.vim","udvm.vim","bwHomeEndAdv.vim","bwUtility.vim","snippetsEmu","perlprove.vim","Dynamic-Keyword-Highlighting","CSVTK","ps2vsm","advantage","The-Stars-Color-Scheme","bufferlist.vim","Impact","Windows-PowerShell-Syntax-Plugin","xslt","verilogams.vim","XHTML-1.0-strict-help-file","sudoku","tidy","Pleasant-colorscheme","VST","A-soft-mellow-color-scheme","Professional-colorscheme-for-Vim","pluginfonts.vim","TabBar","Autoproject","last_change","last_change","AutoTag","switchtags.vim","dmd","VIM-Email-Client","cxxcomplete","The-Vim-Gardener","Colortest","Mud","Mud","Modelines-Bundle","syntaxada.vim","Night-Vision-Colorscheme","PDV--phpDocumentor-for-Vim","eraseSubword","larlet.vim","Cthulhian","SmartCase","HP-41-syntax-file","HP-41-file-type-plugin","Last-Modified","cloudy","xslhelper.vim","adobe.vim","Peppers","syntaxconkyrc.vim","bookmarks.vim","Zopedav","CVSconflict","TextMarker","ldap.vim","asmh8300","TailMinusF","QFixToggle","fpc.vim","Chars2HTML","cfengine-log-file-highlighting","syntaxuil.vim","cHeaderFinder","syntaxudev.vim","charon","SessionMgr","UniCycle","interfaces","gdbvim","build.vim","jay-syntax","d.vim","GreedyBackspace.vim","BuildWin","py_jump.vim","motus.vim","fish.vim","Processing-Syntax","range-search.vim","xml.vim","tagSetting.vim","javap.vim","desertedocean.vim","Zen-Color-Scheme","DarkZen-Color-Scheme","gnupg-symmetric.vim","desertedocean.vim","understated","impactG","DesertedOceanBurnt","Local-configuration","OMNeTpp-NED-syntax-file","Workspace-Manager","bwTemplate","vim_colors","brsccs.vim","bibFindIndex","Auto-debug-your-vim","shorewall.vim","carvedwood","avs.vim","jadl.vim","openvpn","softblue","bufmap.vim","corn","dtdmenu","iptables","CarvedWoodCool","darkerdesert","selection_eval.vim","cfname","checksyntax","textutil.vim","haml.zip","Dev-Cpp-Scheme","HiMtchBrkt","Compiler-Plugin-for-msbuild-csc","XML-Folding","compilerpython.vim","winmanager","xsl-fo","XML-Completion","telstar.vim","colors","AllBuffersToOneWindow.vim","MoveLine","Altair-OptiStruct-Syntax","Low-Contrast-Color-Schemes","vera.vim","VHDL-indent-93-syntax","svn_commit","cecscope","baycomb","VCard-syntax","copypath.vim","CycleColor","Grape-Color","moin.vim","glark.vim","syntaxm4.vim","dtd2vim","docbook44","moria","Ant","netrw.vim","far","bayQua","promela","lbnf.vim","watermark","Sift","vim7-install.sh","yellow","maude.vim","Modeliner","Surveyor","muttrc.vim","CmdlineCompl.vim","cvops-aut.vim","kid.vim","marklar.vim","spectro.vim","StickyCursor","fasm.vim","django.vim","ScrollColors","PluginKiller","jr.vim","JavaScript-syntax","pyte","Sudoku-Solver","Efficient-python-folding","derefined","initng","Align.vim","all-colors-pack","rfc2html","delins.vim","slr.vim","Vimball","Search-unFold","jbase.vim","jbase.vim","LargeFile","TabLineSet.vim","XHTML-1.0-Strict-vim7-xml-data-file","autohi","manuscript.vim","screenpaste.vim","VimVS6","SwitchExt","VhdlNav","smcl.vim","changelog","ClassTree","icalendar.vim","OmniCppComplete","maven2.vim","WinWalker.vim","cmaxx","magic.vim","vbnet.vim","javaimports.vim","habiLight","comments.vim","FlexWiki-syntax-highlighting","timing.vim","backburnerEdit_Visual_Block.vim","txt.vim","amarok.vim","vimproject","TagsParser","remind","pluginbackup.vim","colorsmartin_krischik.vim","Highlighter.vim","mousefunc-option-patch","GetChar-event-patch","pythoncomplete","Tabline-wrapping-patch","foxpro.vim","abolish.vim","perl_search_lib","compilergnat.vim","ftpluginada.vim","bluez","jVim","Simple-Color-Scheme","ScreenShot","autoproto.vim","autoloadadacomplete.vim","CD_Plus","xul.vim","Toggle-Window-Size","icansee.vim","KDE-GVIM-vimopen","Neverness-colour-scheme","Rainbow-Parenthsis-Bundle","patchreview.vim","forth.vim","ftdetectada.vim","gtd","rails.vim","abnf","montz.vim","redstring.vim","php.vim","SQLComplete.vim","systemverilog.vim","settlemyer.vim","findstr.vim","crt.vim","css.vim","tcl.vim","cr-bs-del-space-tab.vim","FlagIt","lookupfile","vim-addon-background-cmd","tobase","Erlang-plugin-package","actionscript.vim","verilog_systemverilog.vim","myghty.vim","ShowFunc","skk.vim","unimpaired.vim","octave.vim","crestore.vim","comment.vim","showhide.vim","warsow.vim","blacklight","color_toon","yanktmp.vim","highlight.vim","pop11.vim","Smooth-Scroll","developer","tcl.vim","colornames","gsl.vim","HelpWords","color_peruse","Chrome-syntax-script","Ada-Bundle","IncRoman.vim","Access-SQL-Syntax-file","vj","phps","Satori-Color-Scheme","SWIG-syntax","tdl.vim","afterimage.vim","cshelper","vimtips_with_comments","scvim","phpx","TIMEIT","phpfolding.vim","pastie.vim","x12-syntax","liquid.vim","doriath.vim","findfuncname.vim","XChat-IRC-Log","gnuchangelog","sh.vim","svncommand-tng","matlab_run.vim","candycode.vim","JDL-syntax-file","myfold.vim","SourceCodeObedience","MultiTabs","cpp.vim","AfterColors.vim","zzsplash","SuperTab-continued.","switch_headers.vim","tikiwiki.vim","str2numchar.vim","addexecmod.vim","ASL","scrollfix","asmx86_64","freya","highlight_current_line.vim","proe.vim","git.zip","cobol.zip","quilt","doxygenerator","The-NERD-tree","dw_colors","mint","redocommand","rubycomplete.vim","asm8051.vim","buftabs","tavi.vim","Alternate-workspace","campfire","blink","doorhinge.vim","darktango.vim","blueprint.vim","pdf.vim","Drupal-5.0-function-dictionary","toggle_words.vim","twilight","Tab-Name","tidy-compiler-script","Vexorian-color-scheme","ekvoli","IndexedSearch","Darcs","DNA-sequence-highlighter","plaintex.vim","Tango-colour-scheme","jdox","MakeInBuilddir","mail_indenter","IndentConsistencyCop","IndentConsistencyCopAutoCmds","tailtab.vim","desertEx","SnippetsMgr","StateExp","VPars","surround.vim","C_Epita","vimGTD","vimksh","Remove-Trailing-Spaces","edc-support","vdb.vim","vdb-duplicated","redcode.vim","Marks-Browser","php_getset.vim","FencView.vim","scons.vim","SWIFT-ATE-Syntax","Business-Objects-Syntax","Test.Base-syntax","darker-robin","Tail-Bundle","tcl_snit.vim","tcl_sqlite.vim","tcl.vim","tabula.vim","WLS-Mode","gvimext.dll--support-tabs-under-VIM-7","renamer.vim","cf.vim","vimpager","pyljvim","capslock.vim","ruby_imaps","Templeet","sal-syntax","exUtility","tAssert","perlcritic-compiler-script","rdark","aedit","vbugle","echofunc.vim","applescript.vim","gnuplot.vim","RunVim.applescript","Info.plist","filetype.vim","R-MacOSX","Utility","vst_with_syn","nightflight.vim","amifmt.vim","compilerflex.vim","javascript.vim","toggle_word.vim","GotoFileArg.vim","kib_darktango.vim","tGpg","kib_plastic","surrparen","TTrCodeAssistor","sparql.vim","BinarySearchMove","lbdbq","kate.vim","conlangs","lojban","surrogat","aspnetcs","lua-support","code_complete","tcl_itcl.vim","tcl_togl.vim","recent.vim","SnipSnap","lispcomplete.vim","etk-vim-syntax","woc","DAMOS-tools","Haml","Menu_SQL_Templates.vim","tcl_critcl.vim","Vimgrep-Replace","cvsdiff","Wombat","tcmdbar.vim","scala.vim","mlint.vim","polycl.vim","cscope-wrapper","apachestyle","javacomplete","hexsearch.vim","wikipedia.vim","Bexec","Audacious-Control","tagscan","erm.vim","fcsh-tools","vibrantink","autoloadTemplate.vim","SETL2","svnvimdiff","smarty.vim","polycfg.vim","IndentHL","c16gui","eclipse.vim","compview","brief2","SearchFold","MultiEnc.vim","calmar256-lightdark.vim","Vimplate-Enhanced","guicolorscheme.vim","Infobasic-Set-Syntax-FTDetect-FTPlugi","Random-Tip-Displayer","gotofile","greplace.vim","sqlvim.sh","Windows-PowerShell-Indent-File","Windows-PowerShell-File-Type-Plugin","buffers_search_and_replace","Yankcode","vimbuddy.vim","NAnt-completion","NAnt-syntax","incfilesearch.vim","NetSend.vim","Hints-for-C-Library-Functions","Hints-for-C-Library-Functions","smp","writebackup","writebackupVersionControl","html-improved-indentation","VimSpy","asciidoc.vim","des3.vim","st.vim","RDF-Namespace-complete","bufpos","BlitzBasic-syntax-and-indentation","tEchoPair","IndentAnything","Javascript-Indentation","nicotine.vim","screenplay","jman.vim","OceanBlack256","haproxy","gitdiff.vim","NesC-Syntax-Highlighting","arpalert","AutoClose","carrot.vim","SearchSyntaxError","clarity.vim","Twitter","Xdebugxs-dictionary-of-functions","textmate16.vim","Jinja","native.vim","mako.vim","eZVim","Directory-specific-settings","errormarker.vim","kpl.vim","tlib","tmru","tselectfiles","tselectbuffer","doctest-syntax","simplefold","genshi.vim","django.vim","fruity.vim","summerfruit.vim","projtags.vim","psql.vim","verilog_emacsauto.vim","securemodelines","voodu.vim","vimoutliner-colorscheme-fix","AutoComplPop","ck.vim","svndiff","Increment-and-Decrement-number","felix.vim","python_import.vim","scmCloseParens","nginx.vim","AnyPrinter","DiffGoFile","automated-rafb.net-uploader-plugin","LustyExplorer","vividchalk.vim","CimpTabulate.vim","vmake","Vim-Setup-system","gmcs.vim","ragtag.vim","synic.vim","vcsnursery","FindFile","ael.vim","freefem.vim","skill_comment.vim","REPL","ReloadScript","camelcasemotion","tmboxbrowser","snipper","creole.vim","QuickBuf","SuperPre","in.vim","perlhelp.vim","tbibtools","vdm.vim","mySqlGenQueryMenu.vim","Scheme-Mode","clibs.vim","cvsps-syntax","javalog.vim","ChocolatePapaya","vpp.vim","omniperl","context-complier-plugin","bbs.vim","syntaxalgol68.vim","Rename","DBGp-client","maxscript.vim","svndiff.vim","visSum.vim","html_french","git-commit","rectcut","OOP-javascript-indentation","Syntax-for-XUL","todo.vim","autofmt","drools.vim","fx.vim","stingray","JSON.vim","QuickFixFilterUtil","outline","Dictionary","VimExplorer","gvim-pdfsync","systemverilog.vim","Vimpress","yavdb","doxygen-support.vim","smart_cr","yasnippets","SmartX","CharSort","cimpl","Tabmerge","Simple256","vimscript-coding-aids","tie.vim","lodgeit.vim","Ruby-Snippets","gvim-extensions-for-TALpTAL","indenthaskell.vim","Highlight-and-Mark-Lines","deb.vim","trivial256","Parameter-Helpers","JET_toggle","pyconsole_vim.vim","lettuce.vim","rcscript","rcscript","Easy-alignment-to-column","Sass","vimremote.sh","halfmove","vimff","GtagsClient","FuzzyFinder","runtests.vim","mosalisp.vim","khaki.vim","two2tango","gitvimdiff","kwiki.vim","Shell-History","triangle.vim","NightVision","confluencewiki.vim","railscasts","bruce.vim","undo_tags","iast.vim","sas.vim","blinking_cursor","lookup.vim","python_ifold","gobgen","ColorSchemeMenuMaker","karma.vim","progressbar-widget","greplist.vim","buffer-status-menu.vim","AutoClose","sessionman.vim","dbext4rdb","openssl.vim","DrillCtg","ttoc","cheat.vim","no_quarter","tregisters","ttags","3DGlasses.vim","Gettext-PO-file-compiler","headerguard.vim","Tailf","erlang-indent-file","brew.vim","camlanot.vim","motion.vim","taskpaper.vim","MarkLines","4NT-Bundle","vimblog.vim","makeprgs","swap-parameters","trag","colorful256.vim","F6_Comment-old","F6_Comment","hookcursormoved","narrow_region","QuickComment","tcalc","AutoScrollMode","of.vim","VimPdb","myvim.vim","mips.vim","Flash-Live-Support-Agent-and-Chatroom","nosql.vim","BlockDiff","vimpp","LustyJuggler","enscript-highlight","idlang.vim","asmc54xx","TranslateIt","ttagecho","soso.vim","PropBank-Semantic-Role-Annotations","matchparenpp","winwkspaceexplorer","Warm-grey","haskell.vim","coq-syntax","xemacs-mouse-drag-copy","checksum.vim","executevimscript","newlisp","yate","ttagcomplete","bbcode","yet-another-svn-script","switch-files","rcg_gui","rcg_term","indenthtml.vim","setsyntax","phtml.vim","industrial","Coq-indent","autoresize.vim","mysqlquery","comments.vim","javascript.vim","gen_vimoptrc.vim","TI-Basic-Syntax","code-snippet","refactor","WuYe","Acpp","view_diff","verilog.vim","reloaded.vim","complval.vim","Puppet-Syntax-Highlighting","Smartput","Tab-Menu","narrow","fakeclip","xml_autons","textobj-user","textobj-datetime","EnvEdit.vim","kwbdi.vim","R.vim","oberon2","hiveminder.vim","scratch","csv-reader","BBCode","chords","robocom","autohotkey-ahk","pspad-colors-scheme","Torquescript-syntax-highlighting","Processing","Io-programming-language-syntax","GCov-plugin","gcov.vim","webpreview","speeddating.vim","HeaderCVS","bg.py","basic-colors","Twitter","SDL-library-syntax-for-C","accurev","Wikidoc-syntax-highlighting","symfony.vim","Noweb","XmlPretty","Socialtext-wiki-syntax-highlighting","byter","tintin.vim","tabpage_sort.vim","syntax-highlighting-for-tintinttpp","repeat.vim","Css-Pretty","PBwiki-syntax-highlighting","sgf.vim","xoria256.vim","undobranche_viewer.vim","showmarks","unibasic.vim","nice-vim","GOBject-Builder-gob2","prmths","VimTrac","quiltdiff","ncss.vim","css_color.vim","sessions.vim","snippets.vim","RecentFiles","marvim","greenvision","leo256","altfile","diffchanges.vim","timestamp","VFT--VIM-Form-Toolkit","DataStage-Server-and-Parallel","sharp-Syntax","GNU-R","renamec.vim","ukrainian-enhanced.vim","patran.vim","dakota.vim","Doxygen-via-Doxygen","jammy.vim","osx_like","PERLDOC2","head.vim","repmo.vim","Railscasts-Theme-GUIand256color","cwiki","rdhelp.txt","cqml.vim","Source-Explorer-srcexpl.vim","ColorSchemeEditor","reliable","vimlatex","smoothPageScroll.vim","file-line","git-file.vim","pig.vim","Latex-Text-Formatter","earendel","Luinnar","dtrace-syntax-file","MountainDew.vim","Syntax-for-Fasta","fpdf.vim","number-marks","Unicode-Macro-Table","antlr3.vim","beauty256","rastafari.vim","gauref.vim","northland.vim","SCMDiff","Boost-Build-v2-BBv2-syntax","vimgen","TwitVim","CoremoSearch","runzip","Relativize","Txtfmt-The-Vim-Highlighter","pyrex.vim","Shobogenzo","seoul","Obvious-Mode","VimTAP","Switch","darkspectrum","qfn","groovy.vim","debugger.py","Limp","bensday","Allegro-4.2-syntax-file","CmdlineComplete","tinymode.vim","STL-improved","sort-python-imports","vimwiki","browser.vim","autopreview","pacific.vim","beachcomber.vim","WriteRoom-for-Vim","h80","nc.vim","rtorrent-syntax-file","previewtag","WarzoneResourceFileSyntax","useful-optistruct-functions","StringComplete","darkrobot.vim","256-jungle","vcsbzr.vim","openser.vim","RemoveDups.VIM","less.bat","upf.vim","darkroom","FFeedVim","xml_taginsert","pac.vim","common_vimrc","journal.vim","publish.vim","railstab.vim","musicbox.vim","buffergrep","dark-ruby","bpel.vim","Git-Branch-Info","Named-Buffers","Contrasty","nagios-syntax","occur.vim","xtemplate","EZComment","vera.vim","silent.vim","colorful","apachelogs.vim","vim-rpcpaste","pygdb","AutoInclude","nightflight2.vim","gladecompletion.vim","flydiff","textobj-fold","textobj-jabraces","DevEiate-theme","jptemplate","cmdlinehelp","blackboard.vim","pink","brook.vim","huerotation.vim","cup.vim","vmv","Specky","fgl.vim","ctags.exe","loremipsum","smartchr","skeleton","linglang","Resolve","SwapIt","Glob-Edit","sipngrep","sipngrep-helper","codepad","fortran.vim","perl-mauke.vim","Gembase-dml-plugins","foldsearch","spring.vim","vimdb.vim","Textile-for-VIM","Text-Especially-LaTeX-Formatter","Clever-Tabs","portablemsys","GoogleSearchVIM","Indent-Highlight","softlight.vim","sofu.vim","QuickName","thegoodluck","auto_wc.vim","zoom.vim","zshr.vim","TextFormat","LaTeX-error-filter","batch.vim","catn.vim","nopaste.vim","Tumblr","log.vim","chlordane.vim","pathogen.vim","session.vim","backup.vim","metarw","metarw-git","ku","bundle","simple-pairs","molokai","postmail.vim","dictview.vim","ku-bundle","ku-metarw","Vimchant","bufmru.vim","trinity.vim","Chimp","indentgenie.vim","rootwater.vim","RltvNmbr.vim","stlrefvim","FastGrep","textobj-lastpat","Superior-Haskell-Interaction-Mode-SHIM","Nekthuth","tags-for-std-cpp-STL-streams-...","clue","louver.vim","diff_navigator","simplewhite.vim","vimxmms2","autoincludex.vim","ScopeVerilog","vcsc.py","darkbone.vim","CCTree","vimmp","Duplicated","sqloracle.vim","automatic-for-Verilog","ClosePairs","dokuwiki.vim","if_v8","vim-addon-sql","htmlspecialchars","mlint.vim","win9xblueback.vim","Verilog-constructs-plugin","RemoveIfdef","Note-Maker","winter.vim","buf2html.vim","sqlite_c","endwise.vim","cern_root.vim","conomode.vim","pdc.vim","CSApprox","MPC-syntax","Django-Projects","QuickTemplate","darkeclipse.vim","Fly-Between-Projects","Cutting-and-pasting-txt-file-in-middle","Fly-Between-Projects","hfile","cheat","sqlplsql","Russian-PLansliterated","advice","stackreg","Pit-Configuration","Robotbattle-Scripting-Language","Lissard-syntax","MatlabFilesEdition","Refactor-Color-Scheme","sql_iabbr-2","ku-args","Yow","lastchange","Miranda-syntax-highlighting","Tango2","textobj-diff","jQuery","Merb-and-Datamapper","Format-Helper","quickrun","gadgetxml.vim","PySmell","Wordnet.vim","Gist.vim","Transmit-FTP","arpeggio","nour.vim","code_complete-new-update","LineCommenter","autocorrect.vim","literal_tango.vim","commentToggle","corporation","W3AF-script-syntax-file","Side-C","Php-Doc","fuzzyjump.vim","shymenu","EasyGrep","Php-Doc","TagManager-BETA","pyflakes.vim","VimLocalHistory","Python-Documentation","Download-Vim-Scripts-as-Cron-Task","UpdateDNSSerial","narrow","Pago","PylonsCommand","sqlserver.vim","msdn_help.vim","nightsky","miko","eyapp","google","outputz","mtys-vimrc","unibox","enzyme.vim","AutoTmpl","AutoTmpl","Python-Syntax-Folding","kellys","session_dialog.vim","wombat256.vim","cdargs","submode","sandbox","translit","smartword","paintbox","Csound-compiler-plugin","python_open_module","Gentooish","ini-syntax-definition","cbackup.vim","Persistent-Abbreviations","ActionScript-3-Omnicomplete","grsecurity.vim","maroloccio","pygtk_syntax","Quagmire","Gorilla","textobj-indent","python_check_syntax.vim","proc.vim","fortran_codecomplete.vim","Rack.Builder-syntax","maroloccio2","eclm_wombat.vim","maroloccio3","ViBlip","pty.vim","Fruidle","Pimp","Changed","shellinsidevim.vim","blood","toggle_unit_tests","VimClojure","fly.vim","lightcolors","vanzan_color","tetragrammaton","VimIM","0scan","DBGp-Remote-Debugger-Interface","Spiderhawk","proton","RunView","guepardo.vim","charged-256.vim","ctxabbr","widower.vim","lilydjwg_green","norwaytoday","WOIM.vim","Dpaste.com-Plugin","reorder-tabs","searchfold.vim","wokmarks.vim","Jifty-syntax","Scratch","Thousand-separator","Perl-MooseX.Declare-Syntax","jpythonfold.vim","Thesaurus","IndentCommentPrefix","po.vim","slimv.vim","nxc.vim","muttaliasescomplete.vim","d.vim","cca.vim","Lucius","earthburn","ashen.vim","css-color-preview","snipMate","Mastermind-board-game","StarRange","SearchCols.vim","EditSimilar","Buffer-grep","repy.vim","xsltassistant.vim","php.vim","BusyBee","wps.vim","Vicle","jam.vim","irssilog.vim","CommentAnyWay","jellybeans.vim","myprojects","gitignore","Match-Bracket-for-Objective-C","gams.vim","numbertotext","NumberToEnglish","ansi_blows.vim","bufMenuToo","simple_comments.vim","runVimTests","utf8-math","Vim-Rspec","Blazer","LogMgr","vimdecdef","apidock.vim","ack.vim","Darkdevel","codeburn","std-includes","WinMove","summerfruit256.vim","lint.vim","Session-manager","spec.vim","Fdgrep","blogit.vim","popup_it","quickfixsigns","lilydjwg_dark","upAndDown","PDV-revised","glimpse","vylight","FSwitch","HTML-AutoCloseTag","Zmrok","LBufWin","tmarks","Skittles-Dark","gvimfullscreen_win32","lighttpd-syntax","reorder.vim","todolist.vim","Symfony","wargreycolorscheme","paster.vim","Haskell-Cuteness","svk","nextfile","vimuiex","TaskList.vim","send.vim","PA_translator","textobj-entire","xptemplate","Rubytest.vim","vimstall","sdticket","vimtemplate","graywh","SpamAssassin-syntax","ctk.vim","textobj-function","neocomplcache","up2picasaweb","ku-quickfix","TODO-List","ProtoDef","Cabal.vim","Vimya","exVim","Vim-R-plugin","explorer","compilerjsl.vim","dosbatch-indent","nimrod.vim","csindent.vim","SearchPosition","smartmatcheol.vim","google.vim","ScmFrontEnd-former-name--MinSCM","blogger","jlj.vim","tango-morning.vim","haskell.vim","PLI-Auto-Complete","python_coverage.vim","Erlang_detectVariable","bandit.vim","TagHighlight","Templates-for-Files-and-Function-Groups","darkburn","PBASIC-syntax","darkZ","fitnesse.vim","bblean.vim","cuteErrorMarker","Arduino-syntax-file","squirrel.vim","Simple-R-Omni-Completion","VOoM","Changing-color-script","g15vim","clips.vim","plumbing.vim","ywvim","mako.vim","HtmlHelper","Mark","setget","shell_it","fastlane","TuttiColori-Colorscheme","tango-desert.vim","Hoogle","smarttill","cocoa.vim","altercmd","supercat.vim","nature.vim","GoogleReader.vim","textobj-verticalbar","cursoroverdictionary","Colorzone","colorsupport.vim","FastLadder.vim","herald.vim","zOS-Enterprise-Compiler-PLI","cuteTodoList","iabassist","dual.vim","kalt.vim","kaltex.vim","fbc.vim","operator-user","ats-lang-vim","MediaWiki-folding-and-syntax-highlight","EnhancedJumps","elise.vim","elisex.vim","Dictionary-file-for-Luxology-Modo-Python","argtextobj.vim","PKGBUILD","editsrec","regreplop.vim","ReplaceWithRegister","mrpink","tiddlywiki","PA_ruby_ri","EnumToCase","commentop.vim","SudoEdit.vim","vimrc","Screen-vim---gnu-screentmux","sign-diff","nextCS","Tag-Signature-Balloons","UltiSnips","textobj-syntax","mutt-aliases","mutt-canned","Proj","arc.vim","AutoFenc.vim","cssvar","math","Rename2","translit_converter","Syntax-Highlighting-for-db2diag.log","jsbeautify","tkl.vim","jslint.vim","donbass.vim","sherlock.vim","Notes","Buffer-Reminder-Remake","PreviewDialog","Logcat-syntax-highlighter","Syntastic","bib_autocomp.vim","v2.vim","bclear","vimper","blue.vim","ruby.vim","greek_polytonic.vim","git-cheat","falcon.vim","nuweb-multi-language","d8g_01","d8g_02","d8g_03","d8g_04","vimdiff-vcs","falcon.vim","banned.vim","delimitMate.vim","evening_2","color-chooser.vim","forneus","Mustang2","Quich-Filter","Tortoise","qtmplsel.vim","falcon.vim","falcon.vim","dull","Better-Javascript-Indentation","Join.vim","emv","vimscript","pipe.vim","JumpInCode","Conque-Shell","Crazy-Home-Key","grex","whitebox.vim","logpad.vim","vilight.vim","tir_black","gui2term.py","moss","python-tag-import","Django-helper-utils","operator-replace","DumbBuf","template-init.vim","wwwsearch","cpan.vim","Melt-Vim","InsertList","rargs.vim","cmdline-increment.vim","popup_it","perdirvimrc--Autoload-vimrc-files-per-di","hybridevel","phpErrorMarker","Functionator","CheckAttach.vim","SoftTabStops","Pasto","tango.vim","Windows-PowerShell-indent-enhanced","NERD_tree-Project","JavaScript-syntax-add-E4X-support","php_localvarcheck.vim","chocolate.vim","assistant","md5.vim","Nmap-syntax-highlight","haxe_plugin","fontsize.vim","InsertChar","hlasm.vim","term.vim","MailApp","PyMol-syntax","hornet.vim","Execute-selection-in-Python-and-append","testname","Asneeded-2","smarty-syntax","DBGp-client","sqlplus.vim","unicode.vim","baan.vim","libperl.vim","filter","multisearch.vim","RTM.vim","Cobalt-Colour-scheme","roo.vim","csv.vim","mimicpak","xmms2ctrl","buf_it","template.vim","phpcodesniffer.vim","wikinotes","powershellCall","HiVim","QuickFixHighlight","noused","coldgreen.vim","vorg","FlipLR","simple-comment","ywchaos","haskellFold","pod-helper.vim","Script-Walker","color-codes-SQL-keywords-from-Oracle-11g","FindInNERDTree","Speedware","perlomni.vim","go.vim","go.vim","github-theme","vimmpc","exjumplist","textobj-fatpack","grey2","prettyprint.vim","JumpInCode-new-update","GNU-as-syntax","NSIS-syntax-highlighting","colqer","gemcolors","Go-Syntax","fortran_line_length","Ruby-Single-Test","OmniTags","FindMate","signature_block.vim","record-repeat.vim","php.vim","signal_dec_VHDL","HTML-menu-for-GVIM","spinner.vim","RDoc","XPstatusline","rc.vim","mib_translator","Markdown","growlnotify.vim","JavaAspect","gsession.vim","cgc.vim","manuscript","CodeOverview","bluechia.vim","slurper.vim","create_start_fold_marker.vim","doubleTap","filetype-completion.vim","vikitasks","PyPit","open-terminal-filemanager","Chrysoprase","circos.vim","TxtBrowser","gitolite.vim","ShowFunc.vim","AuthorInfo","Cfengine-3-ftplugin","Cfengine-version-3-syntax","vim-addon-manager","Vim-Condensed-Quick-Reference","hlint","Enhanced-Ex","Flex-Development-Support","restart.vim","selfdot","syntaxGemfile.vim","spidermonkey.vim","pep8","startup_profile","extended-help","tplugin","SpitVspit","Preamble","Mercury-compiler-support","FirstEffectiveLine.vim","vimomni","std.vim","tocterm","apt-complete.vim","SnippetComplete","Dictionary-List-Replacements","Vimrc-Version-Numbering","mark_tools","rfc-syntax","fontzoom.vim","histwin.vim","vim-addon-fcsh","vim-addon-actions","superSnipMate","bzr-commit","hexHighlight.vim","Multi-Replace","strawimodo","vim-addon-mw-utils","actionscript3id.vim","RubySinatra","ccvext.vim","visualstar.vim","AutomaticLaTeXPlugin","AGTD","bvemu.vim","GoogleSuggest-Complete","The-Max-Impact-Experiment","cflow-output-colorful","SaneCL","c-standard-functions-highlight","Wavefronts-obj","hypergit.vim","hex.vim","csp.vim","load_template","emoticon.vim","emoticon.vim","bisect","groovyindent","liftweb.vim","line-number-yank","neutron.vim","SyntaxMotion.vim","Doxia-APT","daemon_saver.vim","ikiwiki-nav","ucf.vim","ISBN-10-to-EAN-13-converter","sha1.vim","hmac.vim","cucumber.zip","mrkn256.vim","fugitive.vim","blowfish.vim","underwater","trogdor","Parameter-Text-Objects","php-doc-upgrade","ZenCoding.vim","jumphl.vim","qmake--syntax.vim","R-syntax-highlighting","BUGS-language","AddCppClass","loadtags","OpenCL-C-syntax-highlighting","pummode","stickykey","rcom","SaveSigns","ywtxt","Rackup","colorselector","TranslateEnToCn","utlx_interwiki.vim","BackgroundColor.vim","django-template-textobjects","html-advanced-text-objects","candyman.vim","tag_in_new_tab","indentpython","vxfold.vim","simplecommenter","CSSMinister","Twee-Integration-for-Vim","httplog","treemenu.vim","delete-surround-html","tumblr.vim","vspec","tcommand","ColorX","alex.vim","happy.vim","Cppcheck-compiler","vim-addon-completion","spin.vim","EasyOpts","Find-files","Bookmarking","tslime.vim","vimake","Command-T","PickAColor.vim","grsecurity","rename.vim","tex-turkce","motpat.vim","orange","Mahewincs","Vim-Title-Formatter","syntaxhaskell.vim","tesla","XTermEsc","vim-indent-object","noweb.vim","vimgdb","cmd.vim","RST-Tables","css3","clevercss.vim","compilerpython.vim","cmakeref","operator-camelize","scalacommenter.vim","vicom","acomment","smartmove.vim","vimform","changesPlugin","Maynard","Otter.vim","ciscoasa.vim","translit3","vimsizer","tex_mini.vim","lastpos.vim","Manuals","VxLib","256-grayvim","mdark.vim","aftersyntaxc.vim","mayansmoke","repeater.vim","ref.vim","recover.vim","Slidedown-Syntax","ShowMultiBase","reimin","self.vim","kiss.vim","Trac-Wikimarkup","NrrwRgn","ego.vim","Delphi-7-2010","CodeFactory","JavaScript-Indent","tagmaster","qiushibaike","dc.vim","tf2.vim","glyph.vim","OutlookVim","GetFile","vimtl","RTL","Sessions","autocomp.vim","TortoiseTyping","syntax-codecsconf","cvsdiff.vim","yaifa.vim","Silence","PNote","mflrename","nevfn","Tumble","vplinst","tony_light","pyref.vim","legiblelight","truebasic.vim","writebackupToAdjacentDir","GUI-Box","LaTeX-Box","mdx.vim","leglight2","RemoveFile.vim","formatvim","easytags.vim","SingleCompile","CFWheels-Dictionary","fu","skk.vim","tcbuild.vim","grails-vim","django_templates.vim","PySuite","shell.vim","vim-addon-sbt","PIV","xpcomplete","gams","Search-in-Addressbook","teraterm","CountJump","darkBlue","underwater-mod","open-browser.vim","rvm.vim","Vim-Script-Updater","beluga-syntax","tac-syntax","datascript.vim","phd","obsidian","ez_scroll","vim-snipplr","vim-haxe","hgrev","zetavim","quickrun.vim","wmgraphviz","reload.vim","Smooth-Center","session.vim","pytestator","sablecc.vim","CSS-one-line--multi-line-folding","vorax","slang_syntax","ikiwiki-syntax","opencl.vim","gitview","ekini-dark-colorscheme","pep8","pyflakes","tabops","endline","pythondo","obviously-insert","toggle_mouse","regbuf.vim","mojo.vim","luainspect.vim","pw","phpcomplete.vim","SyntaxComplete","vimgcwsyntax","JsLint-Helper","Haskell-Highlight-Enhanced","typeredeemer","BusierBee","Shapley-Values","help_movement","diff_movement","fortunes_movement","mail_movement","CSS3-Highlights","vimpluginloader","jsonvim","vimstuff","vimargumentchec","vimcompcrtr","vimoop","yamlvim","DokuVimKi","jade.vim","v4daemon","ovim","Starting-.vimrc","gedim","current-func-info.vim","undofile.vim","vim-addon-ocaml","Haskell-Conceal","trailing-whitespace","rdark-terminal","mantip","htip","python_showpydoc.vim","tangoshady","bundler","cHiTags","Quotes","Smart-Parentheses","operator-reverse","python_showpydoc","rslTools","presets","View-Ports","Replay.vim","qnamebuf","processing-snipmate","ProjectTag","Better-CSS-Syntax-for-Vim","indexer.tar.gz","285colors-with-az-menu","LanguageTool","VIM-Color-Picker","Flex-4","lodestone","Simple-Javascript-Indenter","porter-stem","stem-search","TeX-PDF","PyInteractive","HTML5-Syntax-File","VimgrepBuffer","ToggleLineNumberMode","showcolor.vim","html5.vim","blockinsert","LimitWindowSize","minibufexplorerpp","tdvim_FoldDigest","bufsurf","Open-associated-programs","aspnetide.vim","Timer-routine","Heliotrope","CaptureClipboard","Shades-of-Amber","Zephyr-Color-Scheme","Jasmine-snippets-for-snipMate","swap","RubyProxy","L9","makesd.vim","ora-workbench","sequence","phaver","Say-Time","pyunit","clang","Son-of-Obisidian","Selenitic","diff-fold.vim","Bird-Syntax","Vimtodo","cSyntaxAfter","Code.Blocks-Dark","omnetpp","command-list","open_file_from_clip_board","CommandWithMutableRange","RangeMacro","tchaba","kirikiri.vim","Liquid-Carbon","actionscript.vim","ProjectCTags","Python-2.x-Standard-Library-Reference","Python-3.x-Standard-Library-Reference","ProjectParse","Tabbi","run_python_tests","eregex.vim","OMNeTpp4.x-NED-Syntax-file","Quotes","looks","Lite-Tab-Page","Show-mandictperldocpydocphpdoc-use-K","newsprint.vim","pf_earth.vim","RevealExtends","openurl.vim","southernlights","numbered.vim","grass.vim","toggle_option","idp.vim","sjump.vim","vim_faq","Sorcerer","up.vim","TrimBlank","clang-complete","smartbd","Gundo","altera_sta.vim","altera.vim","vim-addon-async","vim-refact","vydark","gdb4vim","savemap.vim","operator-html-escape","Mizore","maxivim","vim-addon-json-encoding","tohtml_wincp","vim-addon-signs","unite-colorscheme","unite-font","vim-addon-xdebug","VimCoder.jar","FTPDEV","lilypink","js-mask","vim-fileutils","stakeholders","PyScratch","Blueshift","VimCalc","unite-locate","lua_omni","verilog_systemverilog_fix","mheg","void","VIP","Smart-Home-Key","tracwiki","newspaper.vim","rdist-syntax","zenesque.vim","auto","VimOrganizer","stackoverflow.vim","preview","inccomplete","screen_line_jumper","chance-of-storm","unite-gem","devbox-dark-256","lastchange.vim","qthelp","auto_mkdir","jbosslog","wesnothcfg.vim","UnconditionalPaste","unite-yarm","NERD_Tree-and-ack","tabpagecolorscheme","Figlet.vim","Peasy","Indent-Guides","janitor.vim","southwest-fog","Ceasy","txt.vim","Shebang","vimblogger_ft","List-File","softbluev2","eteSkeleton","hdl_plugin","blockle.vim","ColorSelect","notes.vim","FanVim","Vimblr","vcslogdiff","JumpNextLongLine","vimorator","emacsmodeline.vim","textobj-rubyblock","StatusLineHighlight","shadow.vim","csc.vim","JumpToLastOccurrence","perfect.vim","polytonic.utf-8.spl","opencl.vim","iim.vim","line-based_jump_memory.vim","hdl_plugin","localrc.vim","BOOKMARKS--Mark-and-Highlight-Full-Lines","chapa","unite.vim","neverland.vim--All-colorschemes-suck","fokus","phpunit","vim-creole","Search-Google","mophiaSmoke","mophiaDark","Google-translator","auto-kk","update_perl_line_directives","headerGatesAdd.vim","JellyX","HJKL","nclipper.vim","syntax_check_embedded_perl.vim","xterm-color-table.vim","zazen","bocau","supp.vim","w3cvalidator","toner.vim","QCL-syntax-hilighting","kkruby.vim","hdl_plugin","Mind_syntax","Comment-Squawk","neco-ghc","pytest.vim","Enhanced-Javascript-syntax","LispXp","Nazca","obsidian2.vim","vim-addon-sml","pep8","AsyncCommand","lazysnipmate","Biorhythm","IniParser","codepath.vim","twilight256.vim","PreciseJump","cscope_plus.vim","Cobaltish","neco-look","XFST-syntax-file","Royal-Colorschemes","pbcopy.vim","golded.vim","Getafe","ParseJSON","activity-log","File-Case-Enforcer","Microchip-Linker-Script-syntax-file","RST-Tables-works-with-non-english-langu","lexctwolc-Syntax-Highlighter","mxl.vim","fecompressor.vim","Flog","Headlights","Chess-files-.pgn-extension","vim-paint","vundle","funprototypes.vim","SVF-syntax","indentpython.vim","Compile","dragon","Tabular","Tagbar","vimake-vim-programmers-ide","align","windows-sif-syntax","csc.snippets","tidydiff","latte","thermometer","Clean","Neopro","Vim-Blog","bitly.vim","bad-apple","robokai","makebg","asp.net","Atom","vim-remote","IPC-syntax-highlight","PyREPL.vim","phrase.vim","virtualenv.vim","reporoot.vim","rebar","urilib","visualctrlg","textmanip.vim","compilerg95.vim","Risto-Color-Scheme","underlinetag","paper","compilergfortran.vim","compilerifort.vim","Scala-argument-formatter","FindEverything","vim_etx","emacs-like-macro-recorder","To-Upper-case-case-changer","vim-erlang-skeleteons","taglist-plus","PasteBin.vim","compilerpcc.vim","scrnpipe.vim","TeX-9","extradite.vim","VimRepress","text-object-left-and-right","Scala-Java-Edit","vim-stylus","vim-activator","VimOutliner","avr8bit.vim","iconv","accentuate.vim","Solarized","Gravity","SAS-Syntax","gem.vim","vim-scala","Rename","EasyMotion","boost.vim","ciscoacl.vim","Distinguished","mush.vim","cmdline-completion","UltraBlog","GetFilePlus","strange","vim-task","Tab-Manager","XPath-Search","plantuml-syntax","rvmprompt.vim","Save-Current-Font","fatrat.vim","Sesiones.vim","opener.vim","cascading.vim","Google-Translate","molly.vim","jianfan","Dagon","plexer","vim-online","gsearch","Message-Formatter","sudoku_game","emacscommandline","fso","openscad.vim","editqf","visual-increment","gtrans.vim","PairTools","Table-Helper","DayTimeColorer","Amethyst","hier","Javascript-OmniCompletion-with-YUI-and-j","m2sh.vim","colorizer","Tabs-only-for-indentation","modelica","terse","dogmatic.vim","ro-when-swapfound","quit-another-window","gitv","Enter-Indent","jshint.vim","pacmanlog.vim","lastmod.vim","ignore-me","vim-textobj-quoted","simplenote.vim","Comceal","checklist.vim","typofree.vim","Redhawk-Vim-Plugin","vim-soy","Find-XML-Tags","cake.vim","vim-coffee-script","browserprint","jovial.vim","pdub","ucompleteme","ethna-switch","Fanfou.vim","colorv.vim","Advancer-Abbreviation","Auto-Pairs","octave.vim","cmdline-insertdatetime","reorder-columns","calm","nicer-vim-regexps","listtag","Diablo3","vim_django","nautilus-py-vim","IDLE","operator-star","XQuery-indentomnicompleteftplugin","browsereload-mac.vim","splitjoin.vim","vimshell-ssh","ShowMarks7","warez-colorscheme","Quicksilver.vim","wikilink","Buffergator","Buffersaurus","ri-viewer","beautiful-pastebin","chef.vim","indsas","lua.vim","AutoSaveSetting","resizewin","cpp_gnuchlog.vim","tangolight","IDSearch","frawor","git_patch_tags.vim","snipmate-snippets","widl.vim","WinFastFind","ReplaceFile","gUnit-syntax","Handlebars","svnst.vim","The-Old-Ones","Atomic-Save","vim-orgmode","Vimper-IDE","vimgtd","gnupg.vim","Filesearch","VimLite","AutoCpp","simpleRGB","cakephp.vim","googleclosurevim","vim-task-org","brep","vrackets","xorium.vim","transpose-words","Powershell-FTDetect","LycosaExplorer","ldap_schema.vim","Lookup","Intelligent-Tags","lemon.vim","SnipMgr","repeat-motion","skyWeb","Toxic","sgmlendtag","rake.vim","orangeocean256","cdevframework","textgenshi.vim","aldmeris","univresal-blue-scheme","cab.vim","copy-as-rtf","baobaozhu","rfc5424","saturn.vim","tablistlite.vim","functionlist.vim","hints_opengl.vim","wikiatovimhelp","ctags_cache","werks.vim","RegImap","Calm-Breeze","Rst-edit-block-in-tab","Ambient-Color-Scheme","golden-ratio","annotatedmarks","quickhl.vim","FixCSS.vim","enablelvimrc.vim","commentary.vim","prefixer.vim","cssbaseline.vim","html_emogrifier.vim","Premailer.vim","tryit.vim","fthook.vim","sql.vim","zim-syntax","Transcription-Name-Helper","Rcode","obvious-resize","lemon256","swapcol.vim","vim-ipython","EasyPeasy","chinachess.vim","tabpage.vim","tabasco","light2011","numlist.vim","fuzzee.vim","SnippetySnip","melt-syntax","diffwindow_movement","noweboutline.vim","Threesome","quickfixstatus.vim","SimpylFold","indent-motion","mcabberlog.vim","easychair","right_align","galaxy.vim","vim-pandoc","putcmd.vim","vim-rpsl","olga_key","statusline.vim","bad-whitespace","ctrlp.vim","sexy-railscasts","TagmaTips","blue_sky","gccsingle.vim","kiwi.vim","mediawiki","Vimerl","MarkdownFootnotes","linediff.vim","watchdog.vim","syntaxdosini.vim","pylint-mode","NagelfarVim","TclShell","google_prettify.vim","Vimpy","vim-pad","baancomplete","racket.vim","scribble.vim","racket-auto-keywords.vim","Ambient-Theme","White","vim-dokuwiki","slide-show","Speech","vim-google-scribe","fcitx.vim","TagmaTasks","vimroom.vim","MapFinder","mappingmanager","ahkcomplete","Python-mode-klen","tagfinder.vim","rainbow_parentheses.vim","Lyrics","abbott.vim","wiki.vim","todotxt.vim","RST-Tables-CJK","utags","mango.vim","indentfolds","Twilight-for-python","Python-Syntax","vim-json-bundle","VIM-Metaprogramming","statline","SonicTemplate.vim","vim-mnml","Tagma-Buffer-Manager","desert-warm-256","html-source-explorer","codepaper","php-doc","Cpp11-Syntax-Support","node.js","Cleanroom","anwolib","fontforge_script.vim","prop.vim","vim-symbols-strings","vim-diff","openrel.vim","apg.vim","TFS","ipi","RSTO","project.vim","tex_AutoKeymap","log.vim","mirodark","vim-kickstart","MatchTag","Lisper.vim","Dart","vim-ocaml-conceal","csslint.vim","nu42dark-color-scheme","Colour-theme-neon-pk","simple_bookmarks.vim","modeleasy-vim-plugin","aurum","inline_edit.vim","better-snipmate-snippet","LastBuf.vim","SchemeXp","TVO--The-Vim-Outliner-with-asciidoc-supp","yankstack","vim-octopress","ChickenMetaXp","ChickenSetupXp","nscripter.vim","weibo.vim","vim-python-virtualenv","vim-django-support","nose.vim","nodeunit.vim","SpellCheck","lrc.vim","cue.vim","visualrepeat","git-time-lapse","boolpat.vim","Mark-Ring","Festoon","dokuwiki","unite-scriptenames","ide","tocdown","Word-Fuzzy-Completion","rmvim","Xoria256m","shelp","Lawrencium","grads.vim","epegzz.vim","Eddie.vim","behat.zip","phidgets.vim","gtags-multiwindow-browsing","lightdiff","vm.vim","SmartusLine","vimprj","turbux.vim","html-xml-tag-matcher","git-diff","ft_improved","nerdtree-ack","ambicmd.vim","fountain.vim","Powerline","EasyDigraph.vim","autosess","DfrankUtil","ruscmd","textobj-line","Independence","qtpy.vim","switch-buffer-quickly","simple-dark","gf-user","gf-diff","viewdoc","Limbo-syntax","rhinestones","buffet.vim","pwdstatus.vim","gtk-mode","indentjava.vim","coffee-check.vim-B","coffee-check.vim","compot","xsnippet","nsl.vim","vombato-colorscheme","ocamlMultiAnnot","mozpp.vim","mozjs.vim","e2.lua","gmlua.vim","vim-punto-switcher","toggle_comment","CapsulaPigmentorum.vim","CompleteHelper","CamelCaseComplete","vim-addon-haskell","tagport","cd-hook","pfldap.vim","WhiteWash","TagmaLast","Gummybears","taskmanagementvim","flymaker","ditaa","lout.vim","vim-flake8","phpcs.vim","badwolf","jbi.vim","Vim-Support","murphi.vim","argumentative.vim","editorconfig-vim","thinkpad.vim","Coverity-compiler-plugin","vim-wmfs","Trailer-Trash","ipyqtmacvim.vim","writebackupAutomator","CodeCommenter","sandbox_hg","pdv-standalone","Yii-API-manual-for-Vim","fountainwiki.vim","hop-language-syntax-highlight","Skittles-Berry","django.vim","pyunit.vim","EasyColour","tmpclip.vim","Improved-paragraph-motion","tortex","Add-to-Word-Search","fwk-notes","calendar.vim","mystatusinfo.vim","workflowish","tabman.vim","flashdevelop.vim","hammer.vim","Colorizer--Brabandt","less-syntax","DynamicSigns","ShowTrailingWhitespace","DeleteTrailingWhitespace","JumpToTrailingWhitespace","source.vim","mediawiki.vim","regexroute.vim","css3-syntax-plus","diff-toggle","showmarks2","Finder-for-vim","vim-human-dates","vim-addon-commenting","cudajinja.vim","vim-pomodoro","phpqa","TaskMotions","ConflictMotions","Sauce","gitvimrc.vim","instant-markdown.vim","vroom","portmon","spacebox.vim","paredit.vim","Ayumi","Clam","vim_movement","vbs_movement","dosbatch_movement","TextTransform","HyperList","python-imports.vim","youdao.dict","XDebug-DBGp-client-for-PHP","Vim-Gromacs","vimux","Vimpy--Stoner","readnovel","Vitality","close-duplicate-tabs","StripWhiteSpaces","vim-jsbeautify","clean_imports","WebAPI.vim","flipwords.vim","restore_view.vim","SpaceBetween","autolink","vim-addon-rdebug","DBGp-X-client","Splice","vim-htmldjango_omnicomplete","vim-addon-ruby-debug-ide","a-new-txt2tags-syntax","vim-cpp-auto-include","rstatusline","muxmate","vim4rally","SAS-Indent","modx","ucpp-vim-syntax","bestfriend.vim","vim-dasm","evervim","Fortune-vimtips","VDBI.vim","Ideone.vim","neocomplcache-snippets_complete","RbREPL.vim","AmbiCompletion","london.vim","jsruntime.vim","maven-plugin","vim-mou","Transpose","PHPUnit-QF","TimeTap","jsoncodecs.vim","jsflakes.vim","jsflakes","DBGPavim","nosyntaxwords","mathematic.vim","vtimer.vim","_jsbeautify","license-loader","cmdpathup","matchindent.vim","automatic-for-Verilog--guo","lingodirector.vim--Pawlik","Ubloh-Color-Scheme","html_FileCompletion","PyChimp","sonoma.vim","highlights-for-radiologist","Xdebug","burnttoast256","vmark.vim--Visual-Bookmarking","gprof.vim","jshint.vim--Stelmach","sourcebeautify.vim","HgCi","EscapeBchars","cscope.vim","php-cs-fixer","cst","OnSyntaxChange","python_fold_compact","EditPlus"] \ No newline at end of file diff --git a/vim/bundle/Conque-Shell/README b/vim/bundle/Conque-Shell/README new file mode 100644 index 0000000..8c19830 --- /dev/null +++ b/vim/bundle/Conque-Shell/README @@ -0,0 +1,32 @@ +This is a mirror of http://www.vim.org/scripts/script.php?script_id=2771 + +Conque is a Vim plugin which allows you to run interactive programs, such as bash on linux or powershell.exe on Windows, inside a Vim buffer. In other words it is a terminal emulator which uses a Vim buffer to display the program output. + +== WEBSITE == + +For more information http://code.google.com/p/conque/ + +== SCREENSHOTS == + +http://Conque.googlecode.com/svn/wiki/screenshot/unix.jpg +http://Conque.googlecode.com/svn/wiki/screenshot/windows.jpg + +== USAGE == + +Type :ConqueTerm to run your command in vim, for example: + +:ConqueTerm bash +:ConqueTerm mysql -h localhost -u joe -p sock_collection +:ConqueTerm Powershell.exe +:ConqueTerm C:\Python27\python.exe + +To open ConqueTerm in a new horizontal or vertical buffer use: + +:ConqueTermSplit +:ConqueTermVSplit +:ConqueTermTab + +All text typed in insert mode will be sent to your shell. Use the key to send a visual selection from any buffer to the shell. + +For more help type :help ConqueTerm + diff --git a/vim/bundle/Conque-Shell/autoload/conque_term.vim b/vim/bundle/Conque-Shell/autoload/conque_term.vim new file mode 100644 index 0000000..856b97b --- /dev/null +++ b/vim/bundle/Conque-Shell/autoload/conque_term.vim @@ -0,0 +1,1504 @@ +" FILE: autoload/conque_term.vim {{{ +" AUTHOR: Nico Raffo +" WEBSITE: http://conque.googlecode.com +" MODIFIED: 2011-08-12 +" VERSION: 2.2, for Vim 7.0 +" LICENSE: +" Conque - Vim terminal/console emulator +" Copyright (C) 2009-__YEAR__ Nico Raffo +" +" MIT License +" +" Permission is hereby granted, free of charge, to any person obtaining a copy +" of this software and associated documentation files (the "Software"), to deal +" in the Software without restriction, including without limitation the rights +" to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +" copies of the Software, and to permit persons to whom the Software is +" furnished to do so, subject to the following conditions: +" +" The above copyright notice and this permission notice shall be included in +" all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +" OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +" THE SOFTWARE. +" }}} + +" ********************************************************************************************************** +" **** GLOBAL INITIALIZATION ******************************************************************************* +" ********************************************************************************************************** + +" {{{ + +" load plugin file if it hasn't already been loaded (e.g. conque_term#foo() is used in .vimrc) +if !exists('g:ConqueTerm_Loaded') + runtime! plugin/conque_term.vim +endif + +" path to conque install directories +let s:scriptdir = expand(":h") . '/' +let s:scriptdirpy = expand(":h") . '/conque_term/' + +" global list of terminal instances +let s:term_obj = {'idx': 1, 'var': '', 'is_buffer': 1, 'active': 1, 'buffer_name': '', 'command': ''} +let g:ConqueTerm_Terminals = {} + +" global lists of registered functions +let s:hooks = { 'after_startup': [], 'buffer_enter': [], 'buffer_leave': [], 'after_keymap': [] } + +" required for session support +if g:ConqueTerm_SessionSupport == 1 + set sessionoptions+=globals + try + sil! let s:saved_terminals = eval(g:ConqueTerm_TerminalsString) + catch + let s:saved_terminals = {} + endtry +endif + +" more session support +let g:ConqueTerm_TerminalsString = '' + +" init terminal counter +let g:ConqueTerm_Idx = 0 + +" we clobber this value later +let s:save_updatetime = &updatetime + +" have we called the init() function yet? +let s:initialized = 0 + + +" }}} + +" ********************************************************************************************************** +" **** SYSTEM DETECTION ************************************************************************************ +" ********************************************************************************************************** + +" {{{ + +" Display various error messages +function! conque_term#fail(feature) " {{{ + + " create a new buffer + new + setlocal buftype=nofile + setlocal nonumber + setlocal foldcolumn=0 + setlocal wrap + setlocal noswapfile + + " missing vim features + if a:feature == 'python' + + call append('$', 'Conque ERROR: Python interface cannot be loaded') + call append('$', '') + + if !executable("python") + call append('$', 'Your version of Vim appears to be installed without the Python interface. In ') + call append('$', 'addition, you may need to install Python.') + else + call append('$', 'Your version of Vim appears to be installed without the Python interface.') + endif + + call append('$', '') + + if has('unix') == 1 + call append('$', "You are using a Unix-like operating system. Most, if not all, of the popular ") + call append('$', "Linux package managers have Python-enabled Vim available. For example ") + call append('$', "vim-gnome or vim-gtk on Ubuntu will get you everything you need.") + call append('$', "") + call append('$', "If you are compiling Vim from source, make sure you use the --enable-pythoninterp ") + call append('$', "configure option. You will also need to install Python and the Python headers.") + call append('$', "") + call append('$', "If you are using OS X, MacVim will give you Python support by default.") + else + call append('$', "You appear to be using Windows. The official Vim 7.3 installer available at ") + call append('$', "http://www.vim.org comes with the required Python interfaces. You will also ") + call append('$', "need to install Python 2.7 and/or Python 3.1, both available at http://www.python.org") + endif + + elseif a:feature == 'python_exe' + + call append('$', "Conque ERROR: Can't find Python executable") + call append('$', "") + call append('$', "Conque needs to know the full path to python.exe on Windows systems. By default, ") + call append('$', "Conque will check your system path as well as the most common installation path ") + call append('$', "C:\\PythonXX\\python.exe. To fix this error either:") + call append('$', "") + call append('$', "Set the g:ConqueTerm_PyExe option in your .vimrc. E.g.") + call append('$', " let g:ConqueTerm_PyExe = 'C:\Program Files\Python27\python.exe'") + call append('$', "") + call append('$', "Add the directory where you installed python to your system path. This isn't a bad ") + call append('$', "idea in general.") + + elseif a:feature == 'ctypes' + + call append('$', 'Conque ERROR: Python cannot load the ctypes module') + call append('$', "") + call append('$', "Conque requires the 'ctypes' python module. This has been a standard module since Python 2.5.") + call append('$', "") + call append('$', "The recommended fix is to make sure you're using the latest official GVim version 7.3, ") + call append('$', "and have at least one of the two compatible versions of Python installed, ") + call append('$', "2.7 or 3.1. You can download the GVim 7.3 installer from http://www.vim.org. You ") + call append('$', "can download the Python 2.7 or 3.1 installer from http://www.python.org") + + endif + +endfunction " }}} + +" Go through various system checks before attempting to launch conque +function! conque_term#dependency_check() " {{{ + + " don't recheck the second time 'round + if s:initialized == 1 + return 1 + endif + + " choose a python version + let s:py = '' + if g:ConqueTerm_PyVersion == 3 + let pytest = 'python3' + else + let pytest = 'python' + let g:ConqueTerm_PyVersion = 2 + endif + + " first test the requested version + if has(pytest) + if pytest == 'python3' + let s:py = 'py3' + else + let s:py = 'py' + endif + + " otherwise use the other version + else + let py_alternate = 5 - g:ConqueTerm_PyVersion + if py_alternate == 3 + let pytest = 'python3' + else + let pytest = 'python' + endif + if has(pytest) + echohl WarningMsg | echomsg "Python " . g:ConqueTerm_PyVersion . " interface is not installed, using Python " . py_alternate . " instead" | echohl None + let g:ConqueTerm_PyVersion = py_alternate + if pytest == 'python3' + let s:py = 'py3' + else + let s:py = 'py' + endif + endif + endif + + " test if we actually found a python version + if s:py == '' + call conque_term#fail('python') + return 0 + endif + + " quick and dirty platform declaration + if has('unix') == 1 + let s:platform = 'unix' + sil exe s:py . " CONQUE_PLATFORM = 'unix'" + else + let s:platform = 'windows' + sil exe s:py . " CONQUE_PLATFORM = 'windows'" + endif + + " if we're using Windows, make sure ctypes is available + if s:platform == 'windows' + try + sil exe s:py . " import ctypes" + catch + call conque_term#fail('ctypes') + return 0 + endtry + endif + + " if we're using Windows, make sure we can finde python executable + if s:platform == 'windows' && conque_term#find_python_exe() == '' + call conque_term#fail('python_exe') + return 0 + endif + + " check for global cursorhold/cursormove events + let o = '' + silent redir => o + silent autocmd CursorHoldI,CursorMovedI + redir END + for line in split(o, "\n") + if line =~ '^ ' || line =~ '^--' || line =~ 'matchparen' + continue + endif + if g:ConqueTerm_StartMessages + echohl WarningMsg | echomsg "Warning: Global CursorHoldI and CursorMovedI autocommands may cause ConqueTerm to run slowly." | echohl None + endif + endfor + + " check for compatible mode + if &compatible == 1 + echohl WarningMsg | echomsg "Warning: Conque may not function normally in 'compatible' mode." | echohl None + endif + + " check for fast mode + if g:ConqueTerm_FastMode + sil exe s:py . " CONQUE_FAST_MODE = True" + else + sil exe s:py . " CONQUE_FAST_MODE = False" + endif + + " if we're all good, load python files + call conque_term#load_python() + + return 1 + +endfunction " }}} + +" }}} + +" ********************************************************************************************************** +" **** STARTUP MESSAGES ************************************************************************************ +" ********************************************************************************************************** + +" {{{ +"if g:ConqueTerm_StartMessages +" let msg_file = s:scriptdirpy . 'version.vim' +" let msg_show = 1 +" let msg_ct = 1 +" +" " we can write to conque_term directory +" if filewritable(s:scriptdirpy) == 2 +" +" if filewritable(msg_file) +" +" " read current message file +" try +" silent execute "source " . msg_file +" if exists('g:ConqueTerm_MsgCt') && exists('g:ConqueTerm_MsgVer') +" if g:ConqueTerm_MsgVer == g:ConqueTerm_Version && g:ConqueTerm_MsgCt > 2 +" let msg_show = 0 +" else +" let msg_ct = g:ConqueTerm_MsgCt + 1 +" endif +" endif +" catch +" endtry +" endif +" +" " update message file +" if msg_show +" let file_contents = ['let g:ConqueTerm_MsgCt = ' . msg_ct, 'let g:ConqueTerm_MsgVer = ' . g:ConqueTerm_Version] +" call writefile(file_contents, msg_file) +" endif +" endif +" +" " save our final decision +" let g:ConqueTerm_StartMessages = msg_show +"endif +" }}} + +" ********************************************************************************************************** +" **** WINDOWS VK CODES ************************************************************************************ +" ********************************************************************************************************** + +" Windows Virtual Key Codes {{{ +let s:windows_vk = { +\ 'VK_ADD' : 107, +\ 'VK_APPS' : 93, +\ 'VK_ATTN' : 246, +\ 'VK_BACK' : 8, +\ 'VK_BROWSER_BACK' : 166, +\ 'VK_BROWSER_FORWARD' : 167, +\ 'VK_CANCEL' : 3, +\ 'VK_CAPITAL' : 20, +\ 'VK_CLEAR' : 12, +\ 'VK_CONTROL' : 17, +\ 'VK_CONVERT' : 28, +\ 'VK_CRSEL' : 247, +\ 'VK_DECIMAL' : 110, +\ 'VK_DELETE' : 46, +\ 'VK_DIVIDE' : 111, +\ 'VK_DOWN' : 40, +\ 'VK_DOWN_CTL' : '40;1024', +\ 'VK_END' : 35, +\ 'VK_EREOF' : 249, +\ 'VK_ESCAPE' : 27, +\ 'VK_EXECUTE' : 43, +\ 'VK_EXSEL' : 248, +\ 'VK_F1' : 112, +\ 'VK_F10' : 121, +\ 'VK_F11' : 122, +\ 'VK_F12' : 123, +\ 'VK_F13' : 124, +\ 'VK_F14' : 125, +\ 'VK_F15' : 126, +\ 'VK_F16' : 127, +\ 'VK_F17' : 128, +\ 'VK_F18' : 129, +\ 'VK_F19' : 130, +\ 'VK_F2' : 113, +\ 'VK_F20' : 131, +\ 'VK_F21' : 132, +\ 'VK_F22' : 133, +\ 'VK_F23' : 134, +\ 'VK_F24' : 135, +\ 'VK_F3' : 114, +\ 'VK_F4' : 115, +\ 'VK_F5' : 116, +\ 'VK_F6' : 117, +\ 'VK_F7' : 118, +\ 'VK_F8' : 119, +\ 'VK_F9' : 120, +\ 'VK_FINAL' : 24, +\ 'VK_HANGEUL' : 21, +\ 'VK_HANGUL' : 21, +\ 'VK_HANJA' : 25, +\ 'VK_HELP' : 47, +\ 'VK_HOME' : 36, +\ 'VK_INSERT' : 45, +\ 'VK_JUNJA' : 23, +\ 'VK_KANA' : 21, +\ 'VK_KANJI' : 25, +\ 'VK_LBUTTON' : 1, +\ 'VK_LCONTROL' : 162, +\ 'VK_LEFT' : 37, +\ 'VK_LEFT_CTL' : '37;1024', +\ 'VK_LMENU' : 164, +\ 'VK_LSHIFT' : 160, +\ 'VK_LWIN' : 91, +\ 'VK_MBUTTON' : 4, +\ 'VK_MEDIA_NEXT_TRACK' : 176, +\ 'VK_MEDIA_PLAY_PAUSE' : 179, +\ 'VK_MEDIA_PREV_TRACK' : 177, +\ 'VK_MENU' : 18, +\ 'VK_MODECHANGE' : 31, +\ 'VK_MULTIPLY' : 106, +\ 'VK_NEXT' : 34, +\ 'VK_NONAME' : 252, +\ 'VK_NONCONVERT' : 29, +\ 'VK_NUMLOCK' : 144, +\ 'VK_NUMPAD0' : 96, +\ 'VK_NUMPAD1' : 97, +\ 'VK_NUMPAD2' : 98, +\ 'VK_NUMPAD3' : 99, +\ 'VK_NUMPAD4' : 100, +\ 'VK_NUMPAD5' : 101, +\ 'VK_NUMPAD6' : 102, +\ 'VK_NUMPAD7' : 103, +\ 'VK_NUMPAD8' : 104, +\ 'VK_NUMPAD9' : 105, +\ 'VK_OEM_CLEAR' : 254, +\ 'VK_PA1' : 253, +\ 'VK_PAUSE' : 19, +\ 'VK_PLAY' : 250, +\ 'VK_PRINT' : 42, +\ 'VK_PRIOR' : 33, +\ 'VK_PROCESSKEY' : 229, +\ 'VK_RBUTTON' : 2, +\ 'VK_RCONTROL' : 163, +\ 'VK_RETURN' : 13, +\ 'VK_RIGHT' : 39, +\ 'VK_RIGHT_CTL' : '39;1024', +\ 'VK_RMENU' : 165, +\ 'VK_RSHIFT' : 161, +\ 'VK_RWIN' : 92, +\ 'VK_SCROLL' : 145, +\ 'VK_SELECT' : 41, +\ 'VK_SEPARATOR' : 108, +\ 'VK_SHIFT' : 16, +\ 'VK_SNAPSHOT' : 44, +\ 'VK_SPACE' : 32, +\ 'VK_SUBTRACT' : 109, +\ 'VK_TAB' : 9, +\ 'VK_UP' : 38, +\ 'VK_UP_CTL' : '38;1024', +\ 'VK_VOLUME_DOWN' : 174, +\ 'VK_VOLUME_MUTE' : 173, +\ 'VK_VOLUME_UP' : 175, +\ 'VK_XBUTTON1' : 5, +\ 'VK_XBUTTON2' : 6, +\ 'VK_ZOOM' : 251 +\ } +" }}} + +" ********************************************************************************************************** +" **** ACTUAL CONQUE FUNCTIONS! *************************************************************************** +" ********************************************************************************************************** + +" {{{ + +" launch conque +function! conque_term#open(...) "{{{ + let command = get(a:000, 0, '') + let vim_startup_commands = get(a:000, 1, []) + let return_to_current = get(a:000, 2, 0) + let is_buffer = get(a:000, 3, 1) + + " dependency check + if !conque_term#dependency_check() + return 0 + endif + + " switch to buffer if needed + if is_buffer && return_to_current + let save_sb = &switchbuf + sil set switchbuf=usetab + let current_buffer = bufname("%") + endif + + " bare minimum validation + if s:py == '' + echohl WarningMsg | echomsg "Conque requires the Python interface to be installed. See :help ConqueTerm for more information." | echohl None + return 0 + endif + if empty(command) + echohl WarningMsg | echomsg "Invalid usage: no program path given. Use :ConqueTerm YOUR PROGRAM, e.g. :ConqueTerm ipython" | echohl None + return 0 + else + let cmd_args = split(command, '[^\\]\@<=\s') + let cmd_args[0] = substitute(cmd_args[0], '\\ ', ' ', 'g') + if !executable(cmd_args[0]) + echohl WarningMsg | echomsg "Not an executable: " . cmd_args[0] | echohl None + return 0 + endif + endif + + " initialize global identifiers + let g:ConqueTerm_Idx += 1 + let g:ConqueTerm_Var = 'ConqueTerm_' . g:ConqueTerm_Idx + let g:ConqueTerm_BufName = substitute(command, ' ', '\\ ', 'g') . "\\ -\\ " . g:ConqueTerm_Idx + + " initialize global mappings if needed + call conque_term#init() + + " set Vim buffer window options + if is_buffer + call conque_term#set_buffer_settings(command, vim_startup_commands) + + let b:ConqueTerm_Idx = g:ConqueTerm_Idx + let b:ConqueTerm_Var = g:ConqueTerm_Var + endif + + " save terminal instance + let t_obj = conque_term#create_terminal_object(g:ConqueTerm_Idx, is_buffer, g:ConqueTerm_BufName, command) + let g:ConqueTerm_Terminals[g:ConqueTerm_Idx] = t_obj + + " required for session support + let g:ConqueTerm_TerminalsString = string(g:ConqueTerm_Terminals) + + " open command + try + let options = {} + let options["TERM"] = g:ConqueTerm_TERM + let options["CODE_PAGE"] = g:ConqueTerm_CodePage + let options["color"] = g:ConqueTerm_Color + let options["offset"] = 0 " g:ConqueTerm_StartMessages * 10 + + if s:platform == 'unix' + execute s:py . ' ' . g:ConqueTerm_Var . ' = Conque()' + execute s:py . ' ' . g:ConqueTerm_Var . ".open()" + else + " find python.exe and communicator + let py_exe = conque_term#find_python_exe() + let py_vim = s:scriptdirpy . 'conque_sole_communicator.py' + execute s:py . ' ' . g:ConqueTerm_Var . ' = ConqueSole()' + execute s:py . ' ' . g:ConqueTerm_Var . ".open()" + + if g:ConqueTerm_ColorMode == 'conceal' + call conque_term#init_conceal_color() + endif + endif + catch + echohl WarningMsg | echomsg "An error occurred: " . command | echohl None + return 0 + endtry + + " set key mappings and auto commands + if is_buffer + call conque_term#set_mappings('start') + endif + + " call user defined functions + call conque_term#call_hooks('after_startup', t_obj) + + " switch to buffer if needed + if is_buffer && return_to_current + sil exe ":sb " . current_buffer + sil exe ":set switchbuf=" . save_sb + elseif is_buffer + startinsert! + endif + + return t_obj + +endfunction "}}} + +" open(), but no buffer +function! conque_term#subprocess(command) " {{{ + + let t_obj = conque_term#open(a:command, [], 0, 0) + if !exists('b:ConqueTerm_Var') + call conque_term#on_blur() + sil exe s:py . ' ' . g:ConqueTerm_Var . '.idle()' + endif + return t_obj + +endfunction " }}} + +" set buffer options +function! conque_term#set_buffer_settings(command, vim_startup_commands) "{{{ + + " optional hooks to execute, e.g. 'split' + for h in a:vim_startup_commands + sil exe h + endfor + sil exe 'edit ++enc=utf-8 ' . g:ConqueTerm_BufName + + " buffer settings + setlocal fileencoding=utf-8 " file encoding, even tho there's no file + setlocal nopaste " conque won't work in paste mode + setlocal buftype=nofile " this buffer is not a file, you can't save it + setlocal nonumber " hide line numbers + if v:version >= 703 + setlocal norelativenumber " hide relative line numbers (VIM >= 7.3) + endif + setlocal foldcolumn=0 " reasonable left margin + setlocal nowrap " default to no wrap (esp with MySQL) + setlocal noswapfile " don't bother creating a .swp file + setlocal scrolloff=0 " don't use buffer lines. it makes the 'clear' command not work as expected + setlocal sidescrolloff=0 " don't use buffer lines. it makes the 'clear' command not work as expected + setlocal sidescroll=1 " don't use buffer lines. it makes the 'clear' command not work as expected + setlocal foldmethod=manual " don't fold on {{{}}} and stuff + setlocal bufhidden=hide " when buffer is no longer displayed, don't wipe it out + setlocal noreadonly " this is not actually a readonly buffer + if v:version >= 703 + setlocal conceallevel=3 + setlocal concealcursor=nic + endif + if g:ConqueTerm_ReadUnfocused + set cpoptions+=I " Don't remove autoindent when moving cursor up and down + endif + setfiletype conque_term " useful + sil exe "setlocal syntax=" . g:ConqueTerm_Syntax + + " temporary global settings go in here + call conque_term#on_focus(1) + +endfunction " }}} + +" send normal character key press to terminal +function! conque_term#key_press() "{{{ + sil exe s:py . ' ' . b:ConqueTerm_Var . ".write_buffered_ord(" . char2nr(v:char) . ")" + sil let v:char = '' +endfunction " }}} + +" set key mappings and auto commands +function! conque_term#set_mappings(action) "{{{ + + " set action {{{ + if a:action == 'toggle' + if exists('b:conque_on') && b:conque_on == 1 + let l:action = 'stop' + echohl WarningMsg | echomsg "Terminal is paused" | echohl None + else + let l:action = 'start' + echohl WarningMsg | echomsg "Terminal is resumed" | echohl None + endif + else + let l:action = a:action + endif + + " if mappings are being removed, add 'un' + let map_modifier = 'nore' + if l:action == 'stop' + let map_modifier = 'un' + endif + " }}} + + " auto commands {{{ + if l:action == 'stop' + sil exe 'autocmd! ' . b:ConqueTerm_Var + + else + sil exe 'augroup ' . b:ConqueTerm_Var + + " handle unexpected closing of shell, passes HUP to parent and all child processes + sil exe 'autocmd ' . b:ConqueTerm_Var . ' BufUnload ' . s:py . ' ' . b:ConqueTerm_Var . '.close()' + + " check for resized/scrolled buffer when entering buffer + sil exe 'autocmd ' . b:ConqueTerm_Var . ' BufEnter ' . s:py . ' ' . b:ConqueTerm_Var . '.update_window_size()' + sil exe 'autocmd ' . b:ConqueTerm_Var . ' VimResized ' . s:py . ' ' . b:ConqueTerm_Var . '.update_window_size()' + + " set/reset updatetime on entering/exiting buffer + sil exe 'autocmd ' . b:ConqueTerm_Var . ' BufEnter call conque_term#on_focus()' + sil exe 'autocmd ' . b:ConqueTerm_Var . ' BufLeave call conque_term#on_blur()' + + " reposition cursor when going into insert mode + sil exe 'autocmd ' . b:ConqueTerm_Var . ' InsertEnter ' . s:py . ' ' . b:ConqueTerm_Var . '.insert_enter()' + + " poll for more output + sil exe 'autocmd ' . b:ConqueTerm_Var . ' CursorHoldI ' . s:py . ' ' . b:ConqueTerm_Var . '.auto_read()' + endif + " }}} + + " map ASCII 1-31 {{{ + for c in range(1, 31) + " + if c == 27 || c == 3 + continue + endif + if l:action == 'start' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_ord(' . c . ')' + else + sil exe 'i' . map_modifier . 'map ' + endif + endfor + " bonus mapping: send in normal mode to terminal as well for panic interrupts + if l:action == 'start' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_ord(3)' + sil exe 'n' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_ord(3)' + else + sil exe 'i' . map_modifier . 'map ' + sil exe 'n' . map_modifier . 'map ' + endif + + " leave insert mode + if !exists('g:ConqueTerm_EscKey') || g:ConqueTerm_EscKey == '' + " use to send to terminal + if l:action == 'start' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_ord(27)' + else + sil exe 'i' . map_modifier . 'map ' + endif + else + " use to send to terminal + if l:action == 'start' + sil exe 'i' . map_modifier . 'map ' . g:ConqueTerm_EscKey . ' ' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_ord(27)' + else + sil exe 'i' . map_modifier . 'map ' . g:ConqueTerm_EscKey + sil exe 'i' . map_modifier . 'map ' + endif + endif + + " Map in insert mode + if exists('g:ConqueTerm_CWInsert') && g:ConqueTerm_CWInsert == 1 + inoremap + endif + " }}} + + " map 33 and beyond {{{ + if exists('##InsertCharPre') && g:ConqueTerm_InsertCharPre == 1 + if l:action == 'start' + autocmd InsertCharPre call conque_term#key_press() + else + autocmd! InsertCharPre + endif + else + for i in range(33, 127) + " + if i == 124 + if l:action == 'start' + sil exe "i" . map_modifier . "map :" . s:py . ' ' . b:ConqueTerm_Var . ".write_ord(124)" + else + sil exe "i" . map_modifier . "map " + endif + continue + endif + if l:action == 'start' + sil exe "i" . map_modifier . "map " . nr2char(i) . " :" . s:py . ' ' . b:ConqueTerm_Var . ".write_ord(" . i . ")" + else + sil exe "i" . map_modifier . "map " . nr2char(i) + endif + endfor + endif + " }}} + + " Special keys {{{ + if l:action == 'start' + if s:platform == 'unix' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x08"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u(" "))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x08"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u(" "))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1b[A"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1b[B"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1b[C"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1b[D"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1bOH"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1bOF"))' + else + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x08"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u(" "))' + + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x08"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u(" "))' + + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_UP . ')' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_DOWN . ')' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_RIGHT . ')' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_LEFT . ')' + + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk("' . s:windows_vk.VK_UP_CTL . '")' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk("' . s:windows_vk.VK_DOWN_CTL . '")' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk("' . s:windows_vk.VK_RIGHT_CTL . '")' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk("' . s:windows_vk.VK_LEFT_CTL . '")' + + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_DELETE . ')' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_HOME . ')' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_END . ')' + endif + else + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + endif + " }}} + + " keys {{{ + if g:ConqueTerm_SendFunctionKeys + if l:action == 'start' + if s:platform == 'unix' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1b[11~"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1b[12~"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("1b[13~"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1b[14~"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1b[15~"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1b[17~"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1b[18~"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1b[19~"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1b[20~"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1b[21~"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1b[23~"))' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write(u("\x1b[24~"))' + else + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_F1 . ')' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_F2 . ')' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_F3 . ')' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_F4 . ')' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_F5 . ')' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_F6 . ')' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_F7 . ')' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_F8 . ')' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_F9 . ')' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_F10 . ')' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_F11 . ')' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_vk(' . s:windows_vk.VK_F12 . ')' + endif + else + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + endif + endif + " }}} + + " various global mappings {{{ + " don't overwrite existing mappings + if l:action == 'start' + if maparg(g:ConqueTerm_SendVisKey, 'v') == '' + sil exe 'v' . map_modifier . 'map ' . g:ConqueTerm_SendVisKey . ' :call conque_term#send_selected(visualmode())' + endif + if maparg(g:ConqueTerm_SendFileKey, 'n') == '' + sil exe 'n' . map_modifier . 'map ' . g:ConqueTerm_SendFileKey . ' :call conque_term#send_file()' + endif + endif + " }}} + + " remap paste keys {{{ + if l:action == 'start' + sil exe 'n' . map_modifier . 'map p :' . s:py . ' ' . b:ConqueTerm_Var . '.write_expr("@@")a' + sil exe 'n' . map_modifier . 'map P :' . s:py . ' ' . b:ConqueTerm_Var . '.write_expr("@@")a' + sil exe 'n' . map_modifier . 'map ]p :' . s:py . ' ' . b:ConqueTerm_Var . '.write_expr("@@")a' + sil exe 'n' . map_modifier . 'map [p :' . s:py . ' ' . b:ConqueTerm_Var . '.write_expr("@@")a' + else + sil exe 'n' . map_modifier . 'map p' + sil exe 'n' . map_modifier . 'map P' + sil exe 'n' . map_modifier . 'map ]p' + sil exe 'n' . map_modifier . 'map [p' + endif + if has('gui_running') == 1 + if l:action == 'start' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_expr("@+")a' + sil exe 'i' . map_modifier . 'map :' . s:py . ' ' . b:ConqueTerm_Var . '.write_expr("@+")a' + else + sil exe 'i' . map_modifier . 'map ' + sil exe 'i' . map_modifier . 'map ' + endif + endif + " }}} + + " disable other normal mode keys which insert text {{{ + if l:action == 'start' + sil exe 'n' . map_modifier . 'map r :echo "Replace mode disabled in shell."' + sil exe 'n' . map_modifier . 'map R :echo "Replace mode disabled in shell."' + sil exe 'n' . map_modifier . 'map c :echo "Change mode disabled in shell."' + sil exe 'n' . map_modifier . 'map C :echo "Change mode disabled in shell."' + sil exe 'n' . map_modifier . 'map s :echo "Change mode disabled in shell."' + sil exe 'n' . map_modifier . 'map S :echo "Change mode disabled in shell."' + else + sil exe 'n' . map_modifier . 'map r' + sil exe 'n' . map_modifier . 'map R' + sil exe 'n' . map_modifier . 'map c' + sil exe 'n' . map_modifier . 'map C' + sil exe 'n' . map_modifier . 'map s' + sil exe 'n' . map_modifier . 'map S' + endif + " }}} + + " set conque as on or off {{{ + if l:action == 'start' + let b:conque_on = 1 + else + let b:conque_on = 0 + endif + " }}} + + " map command to toggle terminal key mappings {{{ + if a:action == 'start' + sil exe 'nnoremap ' . g:ConqueTerm_ToggleKey . ' :call conque_term#set_mappings("toggle")' + endif + " }}} + + " call user defined functions + if l:action == 'start' + call conque_term#call_hooks('after_keymap', conque_term#get_instance()) + endif + +endfunction " }}} + +" Initialize global mappings. Should only be called once per Vim session +function! conque_term#init() " {{{ + + if s:initialized == 1 + return + endif + + augroup ConqueTerm + + " abort any remaining running terminals when Vim exits + autocmd ConqueTerm VimLeave * call conque_term#close_all() + + " read more output when this isn't the current buffer + if g:ConqueTerm_ReadUnfocused == 1 + autocmd ConqueTerm CursorHold * call conque_term#read_all(0) + endif + + let s:initialized = 1 + +endfunction " }}} + +" read from all known conque buffers +function! conque_term#read_all(insert_mode) "{{{ + + for i in range(1, g:ConqueTerm_Idx) + try + if !g:ConqueTerm_Terminals[i].active + continue + endif + + let output = g:ConqueTerm_Terminals[i].read(1) + + if !g:ConqueTerm_Terminals[i].is_buffer && exists('*g:ConqueTerm_Terminals[i].callback') + call g:ConqueTerm_Terminals[i].callback(output) + endif + catch + " probably a deleted buffer + endtry + endfor + + " restart updatetime + if a:insert_mode + "call feedkeys("\f\e", "n") + let p = getpos('.') + if p[1] == 1 + sil exe 'call feedkeys("\\", "n")' + else + sil exe 'call feedkeys("\\", "n")' + endif + call setpos('.', p) + else + call feedkeys("f\e", "n") + endif + +endfunction "}}} + +" close all subprocesses +function! conque_term#close_all() "{{{ + + for i in range(1, g:ConqueTerm_Idx) + try + call g:ConqueTerm_Terminals[i].close() + catch + " probably a deleted buffer + endtry + endfor + +endfunction "}}} + +" gets called when user enters conque buffer. +" Useful for making temp changes to global config +function! conque_term#on_focus(...) " {{{ + + let startup = get(a:000, 0, 0) + + " Disable NeoComplCache. It has global hooks on CursorHold and CursorMoved :-/ + let s:NeoComplCache_WasEnabled = exists(':NeoComplCacheLock') + if s:NeoComplCache_WasEnabled == 2 + NeoComplCacheLock + endif + + if g:ConqueTerm_ReadUnfocused == 1 + autocmd! ConqueTerm CursorHoldI * + autocmd! ConqueTerm CursorHold * + endif + + " set poll interval to 50ms + set updatetime=50 + + " resume subprocess fast polling + if startup == 0 && exists('b:ConqueTerm_Var') + sil exe s:py . ' ' . g:ConqueTerm_Var . '.resume()' + endif + + " call user defined functions + if startup == 0 + call conque_term#call_hooks('buffer_enter', conque_term#get_instance()) + endif + + " if configured, go into insert mode + if g:ConqueTerm_InsertOnEnter == 1 + startinsert! + endif + +endfunction " }}} + +" gets called when user exits conque buffer. +" Useful for resetting changes to global config +function! conque_term#on_blur() " {{{ + " re-enable NeoComplCache if needed + if exists('s:NeoComplCache_WasEnabled') && exists(':NeoComplCacheUnlock') && s:NeoComplCache_WasEnabled == 2 + NeoComplCacheUnlock + endif + + " turn off subprocess fast polling + if exists('b:ConqueTerm_Var') + sil exe s:py . ' ' . b:ConqueTerm_Var . '.idle()' + endif + + " reset poll interval + if g:ConqueTerm_ReadUnfocused == 1 + set updatetime=1000 + autocmd ConqueTerm CursorHoldI * call conque_term#read_all(1) + autocmd ConqueTerm CursorHold * call conque_term#read_all(0) + elseif exists('s:save_updatetime') + exe 'set updatetime=' . s:save_updatetime + else + set updatetime=2000 + endif + + " call user defined functions + call conque_term#call_hooks('buffer_leave', conque_term#get_instance()) + +endfunction " }}} + +" bell event (^G) +function! conque_term#bell() " {{{ + echohl WarningMsg | echomsg "BELL!" | echohl None +endfunction " }}} + +" register function to be called at conque events +function! conque_term#register_function(event, function_name) " {{{ + + if !has_key(s:hooks, a:event) + echomsg 'No such event: ' . a:event + return + endif + + if !exists('*' . a:function_name) + echomsg 'No such function: ' . a:function_name) + return + endif + + " register the function + call add(s:hooks[a:event], function(a:function_name)) + +endfunction " }}} + +" call hooks for an event +function! conque_term#call_hooks(event, t_obj) " {{{ + + for Fu in s:hooks[a:event] + call Fu(a:t_obj) + endfor + +endfunction " }}} + +" }}} + +" ********************************************************************************************************** +" **** Windows only functions ****************************************************************************** +" ********************************************************************************************************** + +" {{{ + +" find python.exe in windows +function! conque_term#find_python_exe() " {{{ + + " first check configuration for custom value + if g:ConqueTerm_PyExe != '' && executable(g:ConqueTerm_PyExe) + return g:ConqueTerm_PyExe + endif + + let sys_paths = split($PATH, ';') + + " get exact python version + sil exe ':' . s:py . ' import sys, vim' + sil exe ':' . s:py . ' vim.command("let g:ConqueTerm_PyVersion = " + str(sys.version_info[0]) + str(sys.version_info[1]))' + + " ... and add to path list + call add(sys_paths, 'C:\Python' . g:ConqueTerm_PyVersion) + call reverse(sys_paths) + + " check if python.exe is in paths + for path in sys_paths + let cand = path . '\' . 'python.exe' + if executable(cand) + return cand + endif + endfor + + echohl WarningMsg | echomsg "Unable to find python.exe, see :help ConqueTerm_PythonExe for more information" | echohl None + + return '' + +endfunction " }}} + +" initialize concealed colors +function! conque_term#init_conceal_color() " {{{ + + highlight link ConqueCCBG Normal + + " foreground colors, low intensity + syn region ConqueCCF000 matchgroup=ConqueConceal start="\esf000;" end="\eef000;" concealends contains=ConqueCCBG + syn region ConqueCCF00c matchgroup=ConqueConceal start="\esf00c;" end="\eef00c;" concealends contains=ConqueCCBG + syn region ConqueCCF0c0 matchgroup=ConqueConceal start="\esf0c0;" end="\eef0c0;" concealends contains=ConqueCCBG + syn region ConqueCCF0cc matchgroup=ConqueConceal start="\esf0cc;" end="\eef0cc;" concealends contains=ConqueCCBG + syn region ConqueCCFc00 matchgroup=ConqueConceal start="\esfc00;" end="\eefc00;" concealends contains=ConqueCCBG + syn region ConqueCCFc0c matchgroup=ConqueConceal start="\esfc0c;" end="\eefc0c;" concealends contains=ConqueCCBG + syn region ConqueCCFcc0 matchgroup=ConqueConceal start="\esfcc0;" end="\eefcc0;" concealends contains=ConqueCCBG + syn region ConqueCCFccc matchgroup=ConqueConceal start="\esfccc;" end="\eefccc;" concealends contains=ConqueCCBG + + " foreground colors, high intensity + syn region ConqueCCF000 matchgroup=ConqueConceal start="\esf000;" end="\eef000;" concealends contains=ConqueCCBG + syn region ConqueCCF00f matchgroup=ConqueConceal start="\esf00f;" end="\eef00f;" concealends contains=ConqueCCBG + syn region ConqueCCF0f0 matchgroup=ConqueConceal start="\esf0f0;" end="\eef0f0;" concealends contains=ConqueCCBG + syn region ConqueCCF0ff matchgroup=ConqueConceal start="\esf0ff;" end="\eef0ff;" concealends contains=ConqueCCBG + syn region ConqueCCFf00 matchgroup=ConqueConceal start="\esff00;" end="\eeff00;" concealends contains=ConqueCCBG + syn region ConqueCCFf0f matchgroup=ConqueConceal start="\esff0f;" end="\eeff0f;" concealends contains=ConqueCCBG + syn region ConqueCCFff0 matchgroup=ConqueConceal start="\esfff0;" end="\eefff0;" concealends contains=ConqueCCBG + syn region ConqueCCFfff matchgroup=ConqueConceal start="\esffff;" end="\eeffff;" concealends contains=ConqueCCBG + + " background colors, low intensity + syn region ConqueCCB000 matchgroup=ConqueCCBG start="\esb000;" end="\eeb000;" concealends + syn region ConqueCCB00c matchgroup=ConqueCCBG start="\esb00c;" end="\eeb00c;" concealends + syn region ConqueCCB0c0 matchgroup=ConqueCCBG start="\esb0c0;" end="\eeb0c0;" concealends + syn region ConqueCCB0cc matchgroup=ConqueCCBG start="\esb0cc;" end="\eeb0cc;" concealends + syn region ConqueCCBc00 matchgroup=ConqueCCBG start="\esbc00;" end="\eebc00;" concealends + syn region ConqueCCBc0c matchgroup=ConqueCCBG start="\esbc0c;" end="\eebc0c;" concealends + syn region ConqueCCBcc0 matchgroup=ConqueCCBG start="\esbcc0;" end="\eebcc0;" concealends + syn region ConqueCCBccc matchgroup=ConqueCCBG start="\esbccc;" end="\eebccc;" concealends + + " background colors, high intensity + syn region ConqueCCB000 matchgroup=ConqueCCBG start="\esb000;" end="\eeb000;" concealends + syn region ConqueCCB00f matchgroup=ConqueCCBG start="\esb00f;" end="\eeb00f;" concealends + syn region ConqueCCB0f0 matchgroup=ConqueCCBG start="\esb0f0;" end="\eeb0f0;" concealends + syn region ConqueCCB0ff matchgroup=ConqueCCBG start="\esb0ff;" end="\eeb0ff;" concealends + syn region ConqueCCBf00 matchgroup=ConqueCCBG start="\esbf00;" end="\eebf00;" concealends + syn region ConqueCCBf0f matchgroup=ConqueCCBG start="\esbf0f;" end="\eebf0f;" concealends + syn region ConqueCCBff0 matchgroup=ConqueCCBG start="\esbff0;" end="\eebff0;" concealends + syn region ConqueCCBfff matchgroup=ConqueCCBG start="\esbfff;" end="\eebfff;" concealends + + + """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + + "highlight link ConqueCCConceal Error + + " foreground colors, low intensity + highlight ConqueCCF000 guifg=#000000 + highlight ConqueCCF00c guifg=#0000cc + highlight ConqueCCF0c0 guifg=#00cc00 + highlight ConqueCCF0cc guifg=#00cccc + highlight ConqueCCFc00 guifg=#cc0000 + highlight ConqueCCFc0c guifg=#cc00cc + highlight ConqueCCFcc0 guifg=#cccc00 + highlight ConqueCCFccc guifg=#cccccc + + " foreground colors, high intensity + highlight ConqueCCF000 guifg=#000000 + highlight ConqueCCF00f guifg=#0000ff + highlight ConqueCCF0f0 guifg=#00ff00 + highlight ConqueCCF0ff guifg=#00ffff + highlight ConqueCCFf00 guifg=#ff0000 + highlight ConqueCCFf0f guifg=#ff00ff + highlight ConqueCCFff0 guifg=#ffff00 + highlight ConqueCCFfff guifg=#ffffff + + " background colors, low intensity + highlight ConqueCCB000 guibg=#000000 + highlight ConqueCCB00c guibg=#0000cc + highlight ConqueCCB0c0 guibg=#00cc00 + highlight ConqueCCB0cc guibg=#00cccc + highlight ConqueCCBc00 guibg=#cc0000 + highlight ConqueCCBc0c guibg=#cc00cc + highlight ConqueCCBcc0 guibg=#cccc00 + highlight ConqueCCBccc guibg=#cccccc + + " background colors, high intensity + highlight ConqueCCB000 guibg=#000000 + highlight ConqueCCB00f guibg=#0000ff + highlight ConqueCCB0f0 guibg=#00ff00 + highlight ConqueCCB0ff guibg=#00ffff + highlight ConqueCCBf00 guibg=#ff0000 + highlight ConqueCCBf0f guibg=#ff00ff + highlight ConqueCCBff0 guibg=#ffff00 + highlight ConqueCCBfff guibg=#ffffff + + " background colors, low intensity + highlight link ConqueCCB000 ConqueCCBG + highlight link ConqueCCB00c ConqueCCBG + highlight link ConqueCCB0c0 ConqueCCBG + highlight link ConqueCCB0cc ConqueCCBG + highlight link ConqueCCBc00 ConqueCCBG + highlight link ConqueCCBc0c ConqueCCBG + highlight link ConqueCCBcc0 ConqueCCBG + highlight link ConqueCCBccc ConqueCCBG + + " background colors, high intensity + highlight link ConqueCCB000 ConqueCCBG + highlight link ConqueCCB00f ConqueCCBG + highlight link ConqueCCB0f0 ConqueCCBG + highlight link ConqueCCB0ff ConqueCCBG + highlight link ConqueCCBf00 ConqueCCBG + highlight link ConqueCCBf0f ConqueCCBG + highlight link ConqueCCBff0 ConqueCCBG + highlight link ConqueCCBfff ConqueCCBG + +endfunction " }}} + +" }}} + +" ********************************************************************************************************** +" **** Add-on features ************************************************************************************* +" ********************************************************************************************************** + +" {{{ + +" send selected text from another buffer +function! conque_term#send_selected(type) "{{{ + + " get most recent/relevant terminal + let term = conque_term#get_instance() + + " shove visual text into @@ register + let reg_save = @@ + sil exe "normal! `<" . a:type . "`>y" + let @@ = substitute(@@, '^[\r\n]*', '', '') + let @@ = substitute(@@, '[\r\n]*$', '', '') + + " go to terminal buffer + call term.focus() + + " execute yanked text + call term.write(@@) + + " reset original values + let @@ = reg_save + + " scroll buffer left + startinsert! + normal! 0zH + +endfunction "}}} + +function! conque_term#send_file() "{{{ + + let file_lines = readfile(expand('%:p')) + if type(file_lines) == 3 && len(file_lines) > 0 + let term = conque_term#get_instance() + call term.focus() + + for line in file_lines + call term.writeln(line) + endfor + else + echomsg 'Could not read file: ' . expand('%:p') + endif + +endfunction "}}} + + +function! conque_term#exec_file() "{{{ + + let current_file = expand('%:p') + if !executable(current_file) + echomsg "Could not run " . current_file . ". Not an executable." + return + endif + exe ':ConqueTermSplit ' . current_file + +endfunction "}}} + + +" called on SessionLoadPost event +function! conque_term#resume_session() " {{{ + if g:ConqueTerm_SessionSupport == 1 + + " make sure terminals exist + if !exists('s:saved_terminals') || type(s:saved_terminals) != 4 + return + endif + + " rebuild terminals + for idx in keys(s:saved_terminals) + + " don't recreate inactive terminals + if s:saved_terminals[idx].active == 0 + continue + endif + + " check we're in the right buffer + let bufname = substitute(s:saved_terminals[idx].buffer_name, '\', '', 'g') + if bufname != bufname("%") + continue + endif + + " reopen command + call conque_term#open(s:saved_terminals[idx].command) + + return + endfor + + endif +endfunction " }}} + +" }}} + +" ********************************************************************************************************** +" **** "API" functions ************************************************************************************* +" ********************************************************************************************************** + +" See doc/conque_term.txt for full documentation {{{ + +" Write to a conque terminal buffer +function! s:term_obj.write(...) dict " {{{ + + let text = get(a:000, 0, '') + let jump_to_buffer = get(a:000, 1, 0) + + " if we're not in terminal buffer, pass flag to not position the cursor + sil exe s:py . ' ' . self.var . '.write_expr("text", False, False)' + + " move cursor to conque buffer + if jump_to_buffer + call self.focus() + endif + +endfunction " }}} + +" same as write() but adds a newline +function! s:term_obj.writeln(...) dict " {{{ + + let text = get(a:000, 0, '') + let jump_to_buffer = get(a:000, 1, 0) + + call self.write(text . "\r", jump_to_buffer) + +endfunction " }}} + +" move cursor to terminal buffer +function! s:term_obj.focus() dict " {{{ + + let save_sb = &switchbuf + sil set switchbuf=usetab + exe 'sb ' . self.buffer_name + sil exe ":set switchbuf=" . save_sb + startinsert! + +endfunction " }}} + +" read from terminal buffer and return string +function! s:term_obj.read(...) dict " {{{ + + let read_time = get(a:000, 0, 1) + let update_buffer = get(a:000, 1, self.is_buffer) + + if update_buffer + let up_py = 'True' + else + let up_py = 'False' + endif + + " figure out if we're in the buffer we're updating + if exists('b:ConqueTerm_Var') && b:ConqueTerm_Var == self.var + let in_buffer = 1 + else + let in_buffer = 0 + endif + + let output = '' + + " read! + sil exec s:py . " conque_tmp = " . self.var . ".read(timeout = " . read_time . ", set_cursor = False, return_output = True, update_buffer = " . up_py . ")" + + " ftw! + try + let pycode = "\nif conque_tmp:\n conque_tmp = re.sub('\\\\\\\\', '\\\\\\\\\\\\\\\\', conque_tmp)\n conque_tmp = re.sub('\"', '\\\\\\\\\"', conque_tmp)\n vim.command('let output = \"' + conque_tmp + '\"')\n" + sil exec s:py . pycode + catch + " d'oh + endtry + + return output + +endfunction " }}} + +" set output callback +function! s:term_obj.set_callback(callback_func) dict " {{{ + + let g:ConqueTerm_Terminals[self.idx].callback = function(a:callback_func) + +endfunction " }}} + +" close subprocess with ABORT signal +function! s:term_obj.close() dict " {{{ + + " kill process + try + sil exe s:py . ' ' . self.var . '.abort()' + catch + " probably already dead + endtry + + " delete buffer if option is set + if self.is_buffer + call conque_term#set_mappings('stop') + if exists('g:ConqueTerm_CloseOnEnd') && g:ConqueTerm_CloseOnEnd + sil exe 'bwipeout! ' . self.buffer_name + stopinsert! + endif + endif + + " mark ourselves as inactive + let self.active = 0 + + " rebuild session options + let g:ConqueTerm_TerminalsString = string(g:ConqueTerm_Terminals) + +endfunction " }}} + +" create a new terminal object +function! conque_term#create_terminal_object(...) " {{{ + + " find conque buffer to update + let buf_num = get(a:000, 0, 0) + if buf_num > 0 + let pvar = 'ConqueTerm_' . buf_num + elseif exists('b:ConqueTerm_Var') + let pvar = b:ConqueTerm_Var + let buf_num = b:ConqueTerm_Idx + else + let pvar = g:ConqueTerm_Var + let buf_num = g:ConqueTerm_Idx + endif + + " is ther a buffer? + let is_buffer = get(a:000, 1, 1) + + " the buffer name + let bname = get(a:000, 2, '') + + " the command + let command = get(a:000, 3, '') + + " parse out the program name (not perfect) + let arg_split = split(command, '[^\\]\@<=\s') + let arg_split[0] = substitute(arg_split[0], '\\ ', ' ', 'g') + let slash_split = split(arg_split[0], '[/\\]') + let prg_name = substitute(slash_split[-1], '\(.*\)\..*', '\1', '') + + let l:t_obj = copy(s:term_obj) + let l:t_obj.is_buffer = is_buffer + let l:t_obj.idx = buf_num + let l:t_obj.buffer_name = bname + let l:t_obj.var = pvar + let l:t_obj.command = command + let l:t_obj.program_name = prg_name + + return l:t_obj + +endfunction " }}} + +" get an existing terminal instance +function! conque_term#get_instance(...) " {{{ + + " find conque buffer to update + let buf_num = get(a:000, 0, 0) + + if exists('g:ConqueTerm_Terminals[buf_num]') + + elseif exists('b:ConqueTerm_Var') + let buf_num = b:ConqueTerm_Idx + else + let buf_num = g:ConqueTerm_Idx + endif + + return g:ConqueTerm_Terminals[buf_num] + +endfunction " }}} + +" }}} + +" ********************************************************************************************************** +" **** PYTHON ********************************************************************************************** +" ********************************************************************************************************** + +function! conque_term#load_python() " {{{ + + exec s:py . "file " . s:scriptdirpy . "conque_globals.py" + exec s:py . "file " . s:scriptdirpy . "conque.py" + if s:platform == 'windows' + exec s:py . "file " . s:scriptdirpy . "conque_win32_util.py" + exec s:py . "file " . s:scriptdirpy . "conque_sole_shared_memory.py" + exec s:py . "file " . s:scriptdirpy . "conque_sole.py" + exec s:py . "file " . s:scriptdirpy . "conque_sole_wrapper.py" + else + exec s:py . "file " . s:scriptdirpy . "conque_screen.py" + exec s:py . "file " . s:scriptdirpy . "conque_subprocess.py" + endif + +endfunction " }}} + +" vim:foldmethod=marker diff --git a/vim/bundle/Conque-Shell/doc/conque_term.txt b/vim/bundle/Conque-Shell/doc/conque_term.txt new file mode 100644 index 0000000..64deb83 --- /dev/null +++ b/vim/bundle/Conque-Shell/doc/conque_term.txt @@ -0,0 +1,646 @@ +*ConqueTerm* Plugin to run a shell inside a Vim buffer + +The ConqueTerm plugin will turn a Vim buffer into a terminal emulator, allowing +you to run and interact with a shell or shell application inside the buffer. + + 1. Installation |conque-term-setup| + 1.1 Requirements for Unix |conque-term-requirements| + 1.2 Requirements for Windows |conque-term-windows| + 1.3 Installation |conque-term-installation| + 2. Usage |conque-term-usage| + 2.1 General Usage |conque-term-gen-usage| + 2.2 Special keys |conque-term-special-keys| + 2.2.1 Send text to Conque |conque-term-send| + 2.2.2 Toggle terminal input mode |conque-term-input-mode| + 2.2.3 Sending the key press |conque-term-esc| + 3. Configuration |conque-term-options| + 3.1 General |conque-config-general| + 3.1.1 Python version |ConqueTerm_PyVersion| + 3.1.2 Fast mode |ConqueTerm_FastMode| + 3.1.3 Color support |ConqueTerm_Color| + 3.1.4 Session Support |ConqueTerm_SessionSupport| + 3.1.5 Keep updating terminal buffer |ConqueTerm_ReadUnfocused| + 3.1.6 Insert mode when entering buffer |ConqueTerm_InsertOnEnter| + 3.1.7 Close buffer when program exits |ConqueTerm_CloseOnEnd| + 3.1.8 Hide start messages |ConqueTerm_StartMessages| + 3.1.9 Regex for highlighting your prompt |ConqueTerm_PromptRegex| + 3.1.10 Syntax type |ConqueTerm_Syntax| + 3.2 Keyboard |conque-config-keyboard| + 3.2.1 The key |ConqueTerm_EscKey| + 3.2.2 Toggle terminal input mode |ConqueTerm_ToggleKey| + 3.2.3 Enable in insert mode |ConqueTerm_CWInsert| + 3.2.4 Execute current file in Conque |ConqueTerm_ExecFileKey| + 3.2.5 Send current file contents to Conque|ConqueTerm_SendFileKey| + 3.2.6 Send selected text to Conque |ConqueTerm_SendVisKey| + 3.2.7 Function Keys |ConqueTerm_SendFunctionKeys| + 3.3 Unix |conque-config-unix| + 3.3.1 Choose your terminal type |ConqueTerm_TERM| + 3.4 Windows |conque-config-windows| + 3.4.1 Python executable |ConqueTerm_PyExe| + 3.4.2 Windows character code page |ConqueTerm_CodePage| + 3.4.3 Terminal color method |ConqueTerm_ColorMode| + 4. VimScript API |conque-term-api| + 4.1 conque_term#open() |conque-term-open| + 4.2 conque_term#subprocess() |conque-term-subprocess| + 4.3 conque_term#get_instance() |conque-term-get-instance| + 4.4 CONQUE_OBJECT.write() |conque-term-write| + 4.5 CONQUE_OBJECT.writeln() |conque-term-writeln| + 4.6 CONQUE_OBJECT.read() |conque-term-read| + 4.7 CONQUE_OBJECT.set_callback() |conque-term-set-callback| + 4.8 CONQUE_OBJECT.close() |conque-term-close| + 4.9 Registering functions |conque-term-events| + 5. Misc |conque-term-misc| + 5.1 Known bugs |conque-term-bugs| + 5.2 Contribute |conque-term-contribute| + 5.3 Feedback |conque-term-feedback| + +============================================================================== + +1. Installation *conque-term-setup* + +Conque is designed for both Unix and Windows operating systems, however the +requirements are slightly different. Please check section below corresponding +to your installed OS. + +1.1 Requirements for Unix *conque-term-requirements* + + * [G]Vim 7.0+ with +python and/or +python3 + * Python 2.3+ and/or 3.x + * Unix-like OS: Linux, OS X, Solaris, Cygwin, etc + +The most common stumbling block is getting a version of Vim which has the +python interface enabled. Most all software package managers will have a copy +of Vim with Python support, so that is often the easiest way to get it. If +you're compiling Vim from source, be sure to use the --enable-pythoninterp +option, or --enable-python3interp for Python 3. On OS X the best option is +MacVim, which installs with Python support by default. + +1.2 Requirements for Windows *conque-term-windows* + + * [G]Vim 7.3 with +python and/or +python3 + * Python 2.7 and/or 3.1 + * Modern Windows OS (XP or later) + +Conque only officially supports the latest GVim 7.3 Windows installer +available at www.vim.org. If you are currently using Vim 7.2 or earlier you +will need to upgrade to 7.3 for Windows support. The Windows installer already +has the +python/+python3 interface built in. + +The official 7.3 release of Vim for Windows only works with Python versions +2.7 and/or 3.1. You can download and install Python from their website +http://www.python.org/download + +If you are compiling Vim + Python from source on Windows, the requirements +become only Vim 7.3+ and Python 2.7+. + + +1.3 Installation *conque-term-installation* + +Download the latest vimball from http://conque.googlecode.com + +Open the .vba file with Vim and run the following commands: +> + :so % + :q +< +That's it! The :ConqueTerm command will be available the next time you start +Vim. You can delete the .vba file when you've verified Conque was successfully +installed. + +============================================================================== + +2. Usage *conque-term-usage* + +2.1 General Usage *conque-term-gen-usage* + +Type :ConqueTerm to launch an application in the current buffer. Eg: +> + :ConqueTerm bash + :ConqueTerm mysql -h localhost -u joe_lunchbox Menu + :ConqueTerm Powershell.exe +< +Use :ConqueTermSplit or :ConqueTermVSplit to open Conque in a new horizontal +or vertical buffer. Use :ConqueTermTab to open Conque in a new tab. + +In insert mode you can interact with the shell as you would expect in a +normal terminal. All key presses will be sent to the terminal, including +control characters. See |conque-term-special-keys| for more information, +particularly regarding the key. + +In normal mode you can use Vim commands to browse your terminal output and +scroll back through the history. Most all Vim functionality will work, such +as searching, yanking or highlighting text. + + +2.2 Special keys *conque-term-special-keys* + +There are several keys which can be configured to have special behavior with +Conque. + +2.2.1 Send text to Conque *conque-term-send* + +Conque gives you three different commands to send text from a different +buffer, probably a source code file, to the Conque terminal buffer. All three +are configurable to use your choice of key combinations. + +To send a visually selected range of text to an existing terminal buffer, +press the key. + +To send the entire contents of the file you are editing to an existing +terminal buffer, press the key. + +Finally, to execute the current file in a new terminal buffer press the +key. This will split the screen with a new Conque buffer. The file you are +editing must be executable for this command to work. + +See |conque-term-options| for information about configuring these commands. + +2.2.2 Toggle terminal input mode *conque-term-input-mode* + +If you want to use insert mode to edit the terminal screen, press . You +will now be able to edit the terminal output freely without your cursor +jumping the the active prompt line. This may be useful if you want to reformat +terminal output for readability. + +While the terminal is paused new output will not be displayed on the screen +until you press again to resume. + +You can configure Conque to use a different key with the |ConqueTerm_ToggleKey| +option. + +2.2.3 Sending the key press *conque-term-esc* + +By default if you press the key in a Conque buffer you will leave insert +mode. But what if you want the character to be sent to your terminal? +There are two options. By default, pressing twice will send one +character to the terminal and you will remain in insert mode, while pressing +it once will leave insert mode. + +Alternatively you can use the |ConqueTerm_EscKey| option to choose a +different key for leaving insert mode. If a custom key is set, then all +key presses will be sent to the terminal. + +2.3 Registering functions *conque-term-register* + +Conque allows you to write your own VimScript functions which will be called +at certain events. See the API section |conque-term-events| for more. + +============================================================================== + +3. Options *conque-term-options* + +You can set the following options in your .vimrc (default values shown) + +3.1 General *conque-config-general* + +3.1.1 Python version *ConqueTerm_PyVersion* + +Conque will work with either Python 2.x or 3.x, assuming the interfaces have +been installed. By default it will try to use Python 2 first, then will try +Python 3. If you want Conque to use Python 3, set this variable to 3. + +Note: even if you set this to 3, if you don't have the python3 interface +Conque will fall back to using Python 2. +> + let g:ConqueTerm_PyVersion = 2 +< +3.1.2 Fast Mode *ConqueTerm_FastMode* + +Disable features which could make Conque run slowly. This includes most +terminal colors and some unicode support. Set this to 1 to enable fast mode. +> + let g:ConqueTerm_FastMode = 0 +< +3.1.3 Color support *ConqueTerm_Color* + +Terminal colors have the potential to slow down terminal screen rendering, +depending on how many colors are used and how fast the computer is. This +option allows you to choose how much color support will be enabled. + +If set to 0, terminal colors will be disabled. This will allow the terminal to +render most quickly. Syntax highlighting will still work. For example +highlighting quoted strings or MySQL output. + +If set to 1, terminal colors will be enabled, but only for the most recent 200 +lines of terminal output. Older output will be periodically stripped of color +highlighting to keep the display responsive. + +If set to 2, terminal colors will always be enabled. If your programs don't +use color output very frequently this is a good choice. + +Note: Color support is automatically disabled in "fast mode". +> + let g:ConqueTerm_Color = 1 +< +3.1.4 Session Support *ConqueTerm_SessionSupport* + +Vim's :mksession command allows you to save your current buffer configuration +to a file, which can be loaded at a later time after you've closed Vim. + +By default, Conque buffers are not restored. This is mostly for safety +reasons; you may not want Vim to automatically re-run a destructive command. + +However, if you're not working with missile launch code, and want Vim to +restart your Conque buffers when you load a session file, set this variable +to 1. Note your original subprocess and shell output will not be restored, but +the same command will be started in your buffer. +> + let g:ConqueTerm_SessionSupport = 0 +< +3.1.5 Keep updating terminal buffer *ConqueTerm_ReadUnfocused* + +If set to 1 then your Conque buffers will continue to update after you've +switched to another buffer. + +Note: Conque buffers may continue to update, but they will not scroll down as +new lines are added beyond the bottom of the visible buffer area. This is a +limitation of the Vim scripting language for which I haven't found a +workaround. +> + let g:ConqueTerm_ReadUnfocused = 1 +< +3.1.6 Insert mode when entering buffer *ConqueTerm_InsertOnEnter* + +If set to 1 then you will automatically go into insert mode when you enter the +buffer. This diverges from normal Vim behavior. If 0 you will still be in +normal mode. +> + let g:ConqueTerm_InsertOnEnter = 0 +< +3.1.7 Close buffer when program exits *ConqueTerm_CloseOnEnd* + +If you want your terminal buffer to be closed and permanently deleted when the +program running inside of it exits, set this option to 1. Otherwise the buffer +will become a simple text buffer after the program exits, and you can edit the +program output in insert mode. +> + let g:ConqueTerm_CloseOnEnd = 0 +< +3.1.8 Show start messages *ConqueTerm_StartMessages* + +Display warning messages when starting up ConqueTerm if your system is +configured incorrectly. +> + let g:ConqueTerm_StartMessages = 1 +< +3.1.9 Regex for highlighting your prompt *ConqueTerm_PromptRegex* + +Use this regular expression for sytax highlighting your terminal prompt. Your +terminal will generally run faster if you use Vim highlighting instead of +terminal colors for your prompt. You can also use it to do more advanced +syntax highlighting for the prompt line. +> + let g:ConqueTerm_PromptRegex = '^\w\+@[0-9A-Za-z_.-]\+:[0-9A-Za-z_./\~,:-]\+\$' +< +3.1.10 Choose Vim syntax type *ConqueTerm_Syntax* + +Set the buffer syntax. The default 'conque' has highlighting for MySQL, but +not much else. +> + let g:ConqueTerm_Syntax = 'conque' +< +3.2 Keyboard *conque-config-keyboard* + +3.2.1 The key *ConqueTerm_EscKey* + +If a custom key is set, then all key presses will be sent to the +terminal and you must use this custom key to leave insert mode. If left to the +default value of '' then you must press it twice to send the escape +character to the terminal, while pressing it once will leave insert mode. + +Note: You cannot use a key which is internally coded with the escape +character. This includes the keys and often the and keys. +Picking a control key, such as will be your best bet. +> + let g:ConqueTerm_EscKey = '' +< +3.2.2 Toggle terminal input mode *ConqueTerm_ToggleKey* + +Press this key to pause terminal input and output display. You will then be +able to edit the terminal screen as if it were a normal text buffer. Press +this key again to resume terminal mode. +> + let g:ConqueTerm_ToggleKey = '' +< +3.2.3 Enable in insert mode *ConqueTerm_CWInsert* + +If set to 1 then you can leave the Conque buffer using the commands +while you're still in insert mode. If set to 0 then the character will +be sent to the terminal. If both this option and ConqueTerm_InsertOnEnter are +set you can go in and out of the terminal buffer while never leaving insert +mode. +> + let g:ConqueTerm_CWInsert = 0 +< +3.2.4 Execute current file in Conque *ConqueTerm_ExecFileKey* + +Press this key to execute the file you're currently editing in a Conque +buffer. Is equivelent to running the command :ConqueTermSplit YOUR_FILE. Your +file must be executable for this command to work correctly. +> + let g:ConqueTerm_ExecFileKey = '' +< +3.2.5 Send current file contents to Conque *ConqueTerm_SendFileKey* + +Press this key to send your entire file contents to the most recently opened +Conque buffer as keyboard input. +> + let g:ConqueTerm_SendFileKey = '' +< +3.2.6 Send selected text to Conque *ConqueTerm_SendVisKey* + +Use this key to send the currently selected text to the most recently created +Conque buffer. +> + let g:ConqueTerm_SendVisKey = '' +< +3.2.7 Function Keys *ConqueTerm_SendFunctionKeys* + +By default, function keys (the F1-F12 row at the top of your keyboard) are not +passed to the terminal. Set this option to 1 to send these key events. + +Note: Unless you configured |ConqueTerm_SendVisKey| and |ConqueTerm_ToggleKey| +to use different keys, and will not be sent to the terminal even if +you set this option to 1. +> + let g:ConqueTerm_SendFunctionKeys = 0 +< +3.3 Unix *conque-config-unix* + +3.3.1 Choose your terminal type, Unix ONLY *ConqueTerm_TERM* + +Use this option to tell Conque what type of terminal it should identify itself +as. Conque officially uses the more limited VT100 terminal type for +developement and testing, although it supports some more advanced features +such as colors and title strings. + +You can change this setting to a more advanced type, namely 'xterm', but your +results may vary depending on which programs you're running. +> + let g:ConqueTerm_TERM = 'vt100' +< +3.4 Windows *conque-config-windows* + +3.4.1 Python executable, Windows ONLY *ConqueTerm_PyExe* + +The Windows version of Conque needs to know the path to the python.exe +executable for the version of Python Conque is using. If you installed Python +in the default location, or added the Python directory to your system path, +Conque should be able to find python.exe without you changing this variable. + +For example, you might set this to 'C:\Program Files\Python27\python.exe' +> + let g:ConqueTerm_PyExe = '' +< +3.4.2 Windows character code page *ConqueTerm_CodePage* + +Set the "code page" Windows will use for your console. Leave this value set to +zero to use the environment code page. + +Note: Displaying unicode characters on Conque for Windows needs work. +> + let g:ConqueTerm_CodePage = 0 +< +3.4.3 Terminal color method, Windows ONLY *ConqueTerm_ColorMode* + +Vim syntax highlighting by coordinate (e.g. the 3-7th characters on the 42nd +line) can be very slow. If you set this variable to 'conceal', you can use +the new conceal feature to render terminal colors. Requires Vim 7.3 and only +works on the Windows version of Conque. This will make colors render faster, +however it will also add hidden characters to the screen, which may be +annoying if you're copying and pasting terminal output out of the Conque +buffer. Set this to an empty string '' to disable concealed highlighting. +> + let g:ConqueTerm_ColorMode = 'conceal' +< +============================================================================== + +4. VimScript API (Beta) *conque-term-api* + +The Conque scripting API allows you to create and interact with Conque +terminals with the VimScript language. This API is still in beta stage. + +4.1 conque_term#open({command}, [buf_opts], [remain]) *conque-term-open* + +The open() function will create a new terminal buffer and start your command. + +The {command} must be an executable, either an absolute path or relative to +your system path. + +You can pass in a list of vim commands [buf_opts] which will be executed after +the new buffer is created but before the command is started. These are +typically commands to alter the size, position or configuration of the buffer +window. + +Note: If you don't pass in a command such as 'split', the terminal will open +in the current buffer. + +If you don't want the new terminal buffer to become the new active buffer, set + [remain] to 1. Only works if you create a split screen using [options]. + +Returns a Conque terminal object. + +Examples: +> + let my_terminal = conque_term#open('/bin/bash') + let my_terminal = conque_term#open('ipython', ['split', 'resize 20'], 1) +< +4.2 conque_term#subprocess({command}) *conque-term-subprocess* + +Starts a new subprocess with your {command}, but no terminal buffer is ever +created. This may be useful if you need asynchronous interaction with a +subprocess, but want to handle the output on your own. + +Returns a Conque terminal object. + +Example: +> + let my_subprocess = conque_term#subprocess('tail -f /var/log/foo.log') +< +4.3 conque_term#get_instance( [terminal_number] ) *conque-term-get-instance* + +Use the get_instance() function to retrieve an existing terminal object. The +terminal could have been created either with the user command :ConqueTerm or +with an API call to conque_term#open() or subprocess(). + +Use the optional [terminal_number] to retrieve a specific terminal instance. +Otherwise if the current buffer is a Conque terminal, it will be returned, +else the most recently created terminal. The terminal number is what you see +at the end of a terminal buffer name, e.g. "bash - 2". + +Returns a Conque terminal object. + +Example: +> + nnoremap :call conque_term#get_instance().writeln('clear') +< +4.4 CONQUE_OBJECT.write({text}) *conque-term-write* + +Once you have a terminal object from open(), subprocess() or get_instance() +you can send text input to it with the write() method. + +No return value. + +Examples: +> + call my_terminal.write("whoami\n") + call my_terminal.write("\") +< +4.5 CONQUE_OBJECT.writeln({text}) *conque-term-writeln* + +The same as write() except adds a \n character to the end if your input. + +Examples: +> + call my_subprocess.writeln('make') +< +4.6 CONQUE_OBJECT.read( [timeout], [update_buffer] ) *conque-term-read* + +Read new output from a Conque terminal subprocess. New output will be returned +as a string, and the terminal buffer will also be updated by default. + +If you are reading immediately after calling the write() method, you may want +to wait [timeout] milliseconds for output to be ready. + +If you want to prevent the output from being displayed in the terminal buffer, +set [update_buffer] to 0. This option has no effect if the terminal was +created with the subprocess() function, since there never is a buffer to +update. + +Returns output string. + +Note: The terminal buffer will not automatically scroll down if the new output +extends beyond the bottom of the visible buffer. Vim doesn't allow "unfocused" +buffers to be scrolled at the current version, although hopefully this will +change. + +Examples: +> + call my_terminal.writeln('whoami') + let output = my_terminal.read(500) + call my_terminal.writeln('ls -lha') + let output = my_terminal.read(1000, 1) +< +4.7 CONQUE_OBJECT.set_callback( {funcname} ) *conque-term-set-callback* + +Register a callback function for this subprocess instance. This function will +automatically be called whenever new output is available. Only practical with +subprocess() objects. + +Conque checkes for new subprocess output once a second when Vim is idle. If +new output is found your function will be called. + +Pass in the callback function name {funcname} as a string. + +No return value. + +Note: this method requires the g:ConqueTerm_ReadUnfocused option to be set. + +Note: this method is experimental, results may vary. + +Example: +> + let sp = conque_term#subprocess('tail -f /home/joe/log/error_log') + + function! MyErrorAlert(output) + echo a:output + endfunction + + call sp.set_callback('MyErrorAlert') +< +4.8 CONQUE_OBJECT.close() *conque-term-close* + +Kill your terminal subprocess. Sends the ABORT signal. You probably want to +close your subprocess in a more graceful manner with the write() method, but +this can be used when needed. Does not close the terminal buffer, if it +exists. + +This method will be called on all existing Conque subprocesses when Vim exits. + +Example: +> + let term = conque_term#open('ping google.com', ['belowright split']) + call term.read(5000) + call term.close() +< +4.9 Registering functions *conque-term-events* + +Conque provides the option to register callback functions which will be +executed at several different events. The currently available events are: + + after_startup After your application has loaded into the buffer. + buffer_enter When you switch to a Conque buffer. + buffer_leave When you leave a Conque buffer. + +You may use the function conque_term#register_function(event, function_name) +to add additional hooks at a particular event. The second argument should be +the name of a callback function which has one parameter, the current +terminal object (see|conque-term-api|for more about terminal objects). + +For example: +> + function MyConqueStartup(term) + + " set buffer syntax using the name of the program currently running + let syntax_associations = { 'ipython': 'python', 'irb': 'ruby' } + + if has_key(syntax_associations, a:term.program_name) + execute 'setlocal syntax=' . syntax_associations[a:term.program_name] + else + execute 'setlocal syntax=' . a:term.program_name + endif + + " shrink window height to 10 rows + resize 10 + + " silly example of terminal api usage + if a:term.program_name == 'bash' + call a:term.writeln('svn up ~/projects/*') + endif + + endfunction + + call conque_term#register_function('after_startup', 'MyConqueStartup') +< + +============================================================================== + +5. Misc *conque-term-misc* + + +5.1 Known bugs *conque-term-bugs* + +The following are known limitations: + + - Font/color highlighting is imperfect and slow. If you don't care about + color in your shell, set g:ConqueTerm_Color = 0 in your .vimrc + - Conque only supports the extended ASCII character set for input, not utf-8. + - VT100 escape sequence support is not complete. + - Alt/Meta key support in Vim isn't great in general, and conque is no + exception. Pressing x or instead of works in + most cases. + + +5.2 Contribute *conque-term-contribute* + +The two contributions most in need are improvements to Vim itself. I currently +use hacks to capture key press input from the user, and to poll the terminal +for more output. The Vim todo.txt document lists proposed improvements to give +users this behavior without hacks. Having a key press event should allow +Conque to work with multi- byte input. If you are a Vim developer, please +consider prioritizing these two items: + + - todo.txt (Autocommands, line ~3137) + 8 Add an event like CursorHold that is triggered repeatedly, not just + once after typing something. + + +5.3 Feedback *conque-term-feedback* + +Bugs, suggestions and patches are all welcome. + +For more information visit http://conque.googlecode.com + +Check out the latest from svn at http://conque.googlecode.com/svn/trunk/ + + vim:tw=78:ts=8:ft=help:norl: diff --git a/vim/bundle/Conque-Shell/doc/tags b/vim/bundle/Conque-Shell/doc/tags new file mode 100644 index 0000000..63160fd --- /dev/null +++ b/vim/bundle/Conque-Shell/doc/tags @@ -0,0 +1,52 @@ +ConqueTerm conque_term.txt /*ConqueTerm* +ConqueTerm_CWInsert conque_term.txt /*ConqueTerm_CWInsert* +ConqueTerm_CloseOnEnd conque_term.txt /*ConqueTerm_CloseOnEnd* +ConqueTerm_CodePage conque_term.txt /*ConqueTerm_CodePage* +ConqueTerm_Color conque_term.txt /*ConqueTerm_Color* +ConqueTerm_ColorMode conque_term.txt /*ConqueTerm_ColorMode* +ConqueTerm_EscKey conque_term.txt /*ConqueTerm_EscKey* +ConqueTerm_ExecFileKey conque_term.txt /*ConqueTerm_ExecFileKey* +ConqueTerm_FastMode conque_term.txt /*ConqueTerm_FastMode* +ConqueTerm_InsertOnEnter conque_term.txt /*ConqueTerm_InsertOnEnter* +ConqueTerm_PromptRegex conque_term.txt /*ConqueTerm_PromptRegex* +ConqueTerm_PyExe conque_term.txt /*ConqueTerm_PyExe* +ConqueTerm_PyVersion conque_term.txt /*ConqueTerm_PyVersion* +ConqueTerm_ReadUnfocused conque_term.txt /*ConqueTerm_ReadUnfocused* +ConqueTerm_SendFileKey conque_term.txt /*ConqueTerm_SendFileKey* +ConqueTerm_SendFunctionKeys conque_term.txt /*ConqueTerm_SendFunctionKeys* +ConqueTerm_SendVisKey conque_term.txt /*ConqueTerm_SendVisKey* +ConqueTerm_SessionSupport conque_term.txt /*ConqueTerm_SessionSupport* +ConqueTerm_StartMessages conque_term.txt /*ConqueTerm_StartMessages* +ConqueTerm_Syntax conque_term.txt /*ConqueTerm_Syntax* +ConqueTerm_TERM conque_term.txt /*ConqueTerm_TERM* +ConqueTerm_ToggleKey conque_term.txt /*ConqueTerm_ToggleKey* +conque-config-general conque_term.txt /*conque-config-general* +conque-config-keyboard conque_term.txt /*conque-config-keyboard* +conque-config-unix conque_term.txt /*conque-config-unix* +conque-config-windows conque_term.txt /*conque-config-windows* +conque-term-api conque_term.txt /*conque-term-api* +conque-term-bugs conque_term.txt /*conque-term-bugs* +conque-term-close conque_term.txt /*conque-term-close* +conque-term-contribute conque_term.txt /*conque-term-contribute* +conque-term-esc conque_term.txt /*conque-term-esc* +conque-term-events conque_term.txt /*conque-term-events* +conque-term-feedback conque_term.txt /*conque-term-feedback* +conque-term-gen-usage conque_term.txt /*conque-term-gen-usage* +conque-term-get-instance conque_term.txt /*conque-term-get-instance* +conque-term-input-mode conque_term.txt /*conque-term-input-mode* +conque-term-installation conque_term.txt /*conque-term-installation* +conque-term-misc conque_term.txt /*conque-term-misc* +conque-term-open conque_term.txt /*conque-term-open* +conque-term-options conque_term.txt /*conque-term-options* +conque-term-read conque_term.txt /*conque-term-read* +conque-term-register conque_term.txt /*conque-term-register* +conque-term-requirements conque_term.txt /*conque-term-requirements* +conque-term-send conque_term.txt /*conque-term-send* +conque-term-set-callback conque_term.txt /*conque-term-set-callback* +conque-term-setup conque_term.txt /*conque-term-setup* +conque-term-special-keys conque_term.txt /*conque-term-special-keys* +conque-term-subprocess conque_term.txt /*conque-term-subprocess* +conque-term-usage conque_term.txt /*conque-term-usage* +conque-term-windows conque_term.txt /*conque-term-windows* +conque-term-write conque_term.txt /*conque-term-write* +conque-term-writeln conque_term.txt /*conque-term-writeln* diff --git a/vim/plugin/conque_term.vim b/vim/bundle/Conque-Shell/plugin/conque_term.vim similarity index 100% rename from vim/plugin/conque_term.vim rename to vim/bundle/Conque-Shell/plugin/conque_term.vim diff --git a/vim/bundle/Conque-Shell/syntax/conque_term.vim b/vim/bundle/Conque-Shell/syntax/conque_term.vim new file mode 100644 index 0000000..7bb194c --- /dev/null +++ b/vim/bundle/Conque-Shell/syntax/conque_term.vim @@ -0,0 +1,113 @@ +" FILE: syntax/conque_term.vim {{{ +" AUTHOR: Nico Raffo +" WEBSITE: http://conque.googlecode.com +" MODIFIED: 2011-08-12 +" VERSION: 2.2, for Vim 7.0 +" LICENSE: +" Conque - Vim terminal/console emulator +" Copyright (C) 2009-__YEAR__ Nico Raffo +" +" MIT License +" +" Permission is hereby granted, free of charge, to any person obtaining a copy +" of this software and associated documentation files (the "Software"), to deal +" in the Software without restriction, including without limitation the rights +" to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +" copies of the Software, and to permit persons to whom the Software is +" furnished to do so, subject to the following conditions: +" +" The above copyright notice and this permission notice shall be included in +" all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +" OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +" THE SOFTWARE. +" }}} + + +" ******************************************************************************************************************* +" MySQL ************************************************************************************************************* +" ******************************************************************************************************************* + +" TODO Move these to syntax which is only executed for mysql +"syn match MySQLTableBodyG "^\s*\w\+:\(.\+\)\=$" contains=MySQLTableHeadG,MySQLNullG,MySQLBool,MySQLNumberG,MySQLStorageClass oneline skipwhite skipnl +"syn match MySQLTableHeadG "^\s*\w\+:" contains=MySQLTableColon skipwhite contained +"syn match MySQLTableColon ":" contained + +syn match MySQLTableHead "^ *|.*| *$" nextgroup=MySQLTableDivide contains=MySQLTableBar oneline skipwhite skipnl +syn match MySQLTableBody "^ *|.*| *$" nextgroup=MySQLTableBody,MySQLTableEnd contains=MySQLTableBar,MySQLNull,MySQLBool,MySQLNumber,MySQLStorageClass oneline skipwhite skipnl +syn match MySQLTableEnd "^ *+[+=-]\++ *$" oneline +syn match MySQLTableDivide "^ *+[+=-]\++ *$" nextgroup=MySQLTableBody oneline skipwhite skipnl +syn match MySQLTableStart "^ *+[+=-]\++ *$" nextgroup=MySQLTableHead oneline skipwhite skipnl +syn match MySQLNull " NULL " contained contains=MySQLTableBar +syn match MySQLStorageClass " PRI " contained +syn match MySQLStorageClass " MUL " contained +syn match MySQLStorageClass " UNI " contained +syn match MySQLStorageClass " CURRENT_TIMESTAMP " contained +syn match MySQLStorageClass " auto_increment " contained +syn match MySQLTableBar "|" contained +syn match MySQLNumber "|\? *\d\+\(\.\d\+\)\? *|" contained contains=MySQLTableBar +syn match MySQLQueryStat "^\d\+ rows\? in set.*" oneline +syn match MySQLPromptLine "^.\?mysql> .*$" contains=MySQLKeyword,MySQLPrompt,MySQLString oneline +syn match MySQLPromptLine "^ -> .*$" contains=MySQLKeyword,MySQLPrompt,MySQLString oneline +syn match MySQLPrompt "^.\?mysql>" contained oneline +syn match MySQLPrompt "^ ->" contained oneline +syn case ignore +syn keyword MySQLKeyword select count max sum avg date show table tables status like as from left right outer inner join contained +syn keyword MySQLKeyword where group by having limit offset order desc asc show contained and interval is null on +syn case match +syn region MySQLString start=+'+ end=+'+ skip=+\\'+ contained oneline +syn region MySQLString start=+"+ end=+"+ skip=+\\"+ contained oneline +syn region MySQLString start=+`+ end=+`+ skip=+\\`+ contained oneline + + +hi def link MySQLPrompt Identifier +hi def link MySQLTableHead Title +hi def link MySQLTableBody Normal +hi def link MySQLBool Boolean +hi def link MySQLStorageClass StorageClass +hi def link MySQLNumber Number +hi def link MySQLKeyword Keyword +hi def link MySQLString String + +" terms which have no reasonable default highlight group to link to +hi MySQLTableHead term=bold cterm=bold gui=bold +if &background == 'dark' + hi MySQLTableEnd term=NONE cterm=NONE gui=NONE ctermfg=238 guifg=#444444 + hi MySQLTableDivide term=NONE cterm=NONE gui=NONE ctermfg=238 guifg=#444444 + hi MySQLTableStart term=NONE cterm=NONE gui=NONE ctermfg=238 guifg=#444444 + hi MySQLTableBar term=NONE cterm=NONE gui=NONE ctermfg=238 guifg=#444444 + hi MySQLNull term=NONE cterm=NONE gui=NONE ctermfg=238 guifg=#444444 + hi MySQLQueryStat term=NONE cterm=NONE gui=NONE ctermfg=238 guifg=#444444 +elseif &background == 'light' + hi MySQLTableEnd term=NONE cterm=NONE gui=NONE ctermfg=247 guifg=#9e9e9e + hi MySQLTableDivide term=NONE cterm=NONE gui=NONE ctermfg=247 guifg=#9e9e9e + hi MySQLTableStart term=NONE cterm=NONE gui=NONE ctermfg=247 guifg=#9e9e9e + hi MySQLTableBar term=NONE cterm=NONE gui=NONE ctermfg=247 guifg=#9e9e9e + hi MySQLNull term=NONE cterm=NONE gui=NONE ctermfg=247 guifg=#9e9e9e + hi MySQLQueryStat term=NONE cterm=NONE gui=NONE ctermfg=247 guifg=#9e9e9e +endif + + +" ******************************************************************************************************************* +" Bash ************************************************************************************************************** +" ******************************************************************************************************************* + +" Typical Prompt +if g:ConqueTerm_PromptRegex != '' + silent execute "syn match ConquePromptLine '" . g:ConqueTerm_PromptRegex . ".*$' contains=ConquePrompt,ConqueString oneline" + silent execute "syn match ConquePrompt '" . g:ConqueTerm_PromptRegex . "' contained oneline" + hi def link ConquePrompt Identifier +endif + +" Strings +syn region ConqueString start=+'+ end=+'+ skip=+\\'+ contained oneline +syn region ConqueString start=+"+ end=+"+ skip=+\\"+ contained oneline +syn region ConqueString start=+`+ end=+`+ skip=+\\`+ contained oneline +hi def link ConqueString String + +" vim: foldmethod=marker diff --git a/vim/bundle/TextFormat/README b/vim/bundle/TextFormat/README new file mode 100644 index 0000000..57ec4e7 --- /dev/null +++ b/vim/bundle/TextFormat/README @@ -0,0 +1,17 @@ +This is a mirror of http://www.vim.org/scripts/script.php?script_id=2324 + +This plugin provides commands and key mappings to quickly align and format text. Text can be easily reformatted and aligned to either left or right margin or justified to both margins or centered. The text formatting commands provided by this plugin are a bit more automatic and more intelligent than those integrated to Vim. Together they make more powerful command set for formatting text. + +Manual is included, just type + + :help textformat.txt + +Default keymappings: + + \al Left-align and reformat + \ar Right-align + \aj Left-right justify and reformat + \ac Center lines + +The prefix key is actually key. It's backlash by default but it is configurable. + diff --git a/vim/bundle/TextFormat/autoload/textformat.vim b/vim/bundle/TextFormat/autoload/textformat.vim new file mode 100644 index 0000000..2e85e04 --- /dev/null +++ b/vim/bundle/TextFormat/autoload/textformat.vim @@ -0,0 +1,610 @@ +" Text formatter plugin for Vim text editor +" +" Version: 2.1 +" Last Change: 2008-09-13 +" Maintainer: Teemu Likonen +" License: This file is placed in the public domain. +" GetLatestVimScripts: 2324 1 :AutoInstall: TextFormat + +"{{{1 The beginning stuff +if &compatible + finish +endif +let s:save_cpo = &cpo +set cpo&vim + +" Constant variables(s) {{{1 +let s:default_width = 80 + +function! s:Align_Range_Left(...) range "{{{1 + " The optional parameter is the left indent. If it is not given we + " detect the indent used in the buffer. + if a:0 && a:1 >= 0 + " The parameter was given so we just use that as the left + " indent. + let l:leading_ws = s:Retab_Indent(a:1) + for l:line in range(a:firstline,a:lastline) + let l:line_string = getline(l:line) + let l:line_replace = s:Align_String_Left(l:line_string) + if &formatoptions =~ 'w' && l:line_string =~ '\m\s$' + " Preserve trailing whitespace because fo=~w + let l:line_replace .= ' ' + endif + if l:line_replace =~ '\m^\s*$' + call setline(l:line,'') + else + call setline(l:line,l:leading_ws.l:line_replace) + endif + endfor + else + " The parameter was not given so we detect each paragraph's + " indent. + let l:line = a:firstline + while l:line <= a:lastline + let l:line_string = getline(l:line) + if l:line_string =~ '\m^\s*$' + " The line is empty or contains only + " whitespaces so print empty line and + " continue. + call setline(l:line,'') + let l:line += 1 + continue + endif + + " Paragraph (or the whole line range) begins here so + " get the indent of the first line and print the line. + let l:leading_ws = s:Retab_Indent(indent(l:line)) + let l:line_replace = s:Align_String_Left(l:line_string) + if &formatoptions =~ 'w' && l:line_string =~ '\m\s$' + let l:line_replace .= ' ' + endif + call setline(l:line,l:leading_ws.l:line_replace) + let l:line += 1 + + " If fo=~w, does the paragraph end here? If yes, + " continue to next round and find a new first line. + if &formatoptions =~ 'w' && l:line_string =~ '\m\S$' + continue + endif + + " If fo=~2 get the indent of the second line + if &formatoptions =~ '2' + let l:leading_ws = s:Retab_Indent(indent(l:line)) + endif + + " This loop will go through all the lines in the + " paragraph (or till the a:lastline) - starting from + " the second line. + while l:line <= a:lastline && getline(l:line) !~ '\m^\s*$' + let l:line_string = getline(l:line) + let l:line_replace = s:Align_String_Left(l:line_string) + if &formatoptions =~ 'w' + if l:line_string =~ '\m\s$' + call setline(l:line,l:leading_ws.l:line_replace.' ') + let l:line += 1 + continue + else + call setline(l:line,l:leading_ws.l:line_replace) + let l:line += 1 + " fo=~w and paragraph ends + " here so we break the loop. + " The next line is new first + " line. + break + endif + else + call setline(l:line,l:leading_ws.l:line_replace) + let l:line += 1 + endif + endwhile + endwhile + endif +endfunction + +function! s:Align_Range_Right(width) "{{{1 + let l:line_replace = s:Align_String_Right(getline('.'),a:width) + if &formatoptions =~ 'w' && getline('.') =~ '\m\s$' + let l:line_replace .= ' ' + endif + if l:line_replace =~ '\m^\s*$' + " If line would be full of spaces just print empty line. + call setline(line('.'),'') + else + " Retab leading whitespaces + let l:leading_ws = s:Retab_Indent(strlen(substitute(l:line_replace,'\v^( *).*$','\1',''))) + " Get the rest of the line + let l:line_replace = substitute(l:line_replace,'^ *','','') + call setline(line('.'),l:leading_ws.l:line_replace) + endif +endfunction + +function! s:Align_Range_Justify(width, ...) range "{{{1 + " If the optional second argument is given (and is non-zero) each + " paragraph's last line and range's last line is left-aligned. + if a:0 && a:1 + let l:paragraph = 1 + else + let l:paragraph = 0 + endif + let l:line = a:firstline + while l:line <= a:lastline + let l:line_string = getline(l:line) + if l:line_string =~ '\m^\s*$' + " The line is empty or contains only + " whitespaces so print empty line and + " continue. + call setline(l:line,'') + let l:line += 1 + continue + endif + + " Paragraph (or the whole line range) begins here so + " get the indent of the first line and print the line. + let l:indent = indent(l:line) + let l:width = a:width - l:indent + let l:leading_ws = s:Retab_Indent(l:indent) + + if l:paragraph && (l:line == a:lastline || getline(l:line+1) =~ '\m^\s*$' || (&formatoptions =~ 'w' && l:line_string =~ '\m\S$')) + let l:line_replace = s:Align_String_Left(l:line_string) + else + let l:line_replace = s:Align_String_Justify(l:line_string,l:width) + endif + if &formatoptions =~ 'w' && l:line_string =~ '\m\s$' + let l:line_replace .= ' ' + endif + call setline(l:line,l:leading_ws.l:line_replace) + let l:line += 1 + + " If fo=~w, does the paragraph end here? If yes, + " continue to next round and find a new first line. + if &formatoptions =~ 'w' && l:line_string =~ '\m\S$' + continue + endif + + " If fo=~2 get the indent of the second line + if &formatoptions =~ '2' + let l:indent = indent(l:line) + let l:width = a:width - l:indent + let l:leading_ws = s:Retab_Indent(l:indent) + endif + + " This loop will go through all the lines in the + " paragraph (or till the a:lastline) - starting from + " paragraph's second line. + while l:line <= a:lastline && getline(l:line) !~ '\m^\s*$' + let l:line_string = getline(l:line) + if l:paragraph && (l:line == a:lastline || getline(l:line+1) =~ '\m^\s*$' || (&formatoptions =~ 'w' && l:line_string =~ '\m\S$')) + let l:line_replace = s:Align_String_Left(l:line_string) + else + let l:line_replace = s:Align_String_Justify(l:line_string,l:width) + endif + if &formatoptions =~ 'w' + if l:line_string =~ '\m\s$' + call setline(l:line,l:leading_ws.l:line_replace.' ') + let l:line += 1 + continue + else + call setline(l:line,l:leading_ws.l:line_replace) + let l:line += 1 + " fo=~w and paragraph ends + " here so we break the loop. + " The next line is new first + " line. + break + endif + else + call setline(l:line,l:leading_ws.l:line_replace) + let l:line += 1 + endif + endwhile + endwhile +endfunction + +function! s:Align_Range_Center(width) "{{{1 + let l:line_replace = s:Truncate_Spaces(getline('.')) + let l:line_replace = s:Add_Double_Spacing(l:line_replace) + if &formatoptions =~ 'w' && getline('.') =~ '\m\s$' + let l:line_replace .= ' ' + endif + call setline(line('.'),l:line_replace) + execute '.center '.a:width +endfunction + +function! s:Align_String_Left(string) "{{{1 + let l:string_replace = s:Truncate_Spaces(a:string) + let l:string_replace = s:Add_Double_Spacing(l:string_replace) + return l:string_replace +endfunction + +function! s:Align_String_Right(string, width) "{{{1 + let l:string_replace = s:Truncate_Spaces(a:string) + let l:string_replace = s:Add_Double_Spacing(l:string_replace) + let l:string_width = s:String_Width(l:string_replace) + let l:more_spaces = a:width-l:string_width + return repeat(' ',l:more_spaces).l:string_replace +endfunction + +function! s:Align_String_Justify(string, width) "{{{1 + let l:string = s:Truncate_Spaces(a:string) + " If the parameter string is empty we can just return a line full of + " spaces. No need to go further. + if l:string =~ '\m^ *$' + return repeat(' ',a:width) + endif + if s:String_Width(s:Add_Double_Spacing(l:string)) >= a:width + " The original string is longer than width so we can just + " return the string. No need to go further. + return s:Add_Double_Spacing(l:string) + endif + let l:string_width = s:String_Width(l:string) + + " This many extra spaces we need. + let l:more_spaces = a:width-l:string_width + " Convert the string to a list of words. + let l:word_list = split(l:string) + " This is the amount of spaces available in the original string (word + " count minus one). + let l:string_spaces = len(l:word_list)-1 + " If there are no spaces there is only one word. We can just return + " the string with padded spaces. No need to go further. + if l:string_spaces == 0 + return l:string.repeat(' ',l:more_spaces) + endif + " Ok, there are more than one word in the string so we get to do some + " real work... + + " Make a list of which each item represent a space available in the + " string. The value means how many spaces there are. At the moment set + " every list item to one: [1, 1, 1, 1, ...] + let l:space_list = [] + for l:item in range(l:string_spaces) + let l:space_list += [1] + endfor + + " Repeat while there are no more need to add any spaces. + while l:more_spaces > 0 + if l:more_spaces >= l:string_spaces + " More extra spaces are needed than there are spaces + " available in the string so we add one more space + " after every word (add 1 to items of space list). + for l:i in range(l:string_spaces) + let l:space_list[l:i] += 1 + endfor + let l:more_spaces -= l:string_spaces + " And then another round... and a check if more spaces + " are needed. + else " l:more_spaces < l:string_spaces + " This list tells where .?! characters are. + let l:space_sentence_full = [] + " This list tells where ,:; characters are. + let l:space_sentence_semi = [] + " And this is for the rest of spaces. + let l:space_other = [] + " Now, find those things: + for l:i in range(l:string_spaces) + if l:word_list[l:i] =~ '\m\S[.?!]$' + let l:space_sentence_full += [l:i] + elseif l:word_list[l:i] =~ '\m\S[,:;]$' + let l:space_sentence_semi += [l:i] + else + let l:space_other += [l:i] + endif + endfor + + " First distribute spaces after .?! + if l:more_spaces >= len(l:space_sentence_full) + " If we need more extra spaces than there are + " .?! spaces, just add one after every item. + for l:i in l:space_sentence_full + let l:space_list[l:i] += 1 + endfor + let l:more_spaces -= len(l:space_sentence_full) + if l:more_spaces == 0 | break | endif + else + " Distribute the rest of spaces evenly and + " break the loop. All the spaces have been + " added. + for l:i in s:Distributed_Selection(l:space_sentence_full,l:more_spaces) + let l:space_list[l:i] +=1 + endfor + break + endif + + " Then distribute spaces after ,:; + if l:more_spaces >= len(l:space_sentence_semi) + " If we need more extra spaces than there are + " ,:; spaces available, just add one after + " every item. + for l:i in l:space_sentence_semi + let l:space_list[l:i] += 1 + endfor + let l:more_spaces -= len(l:space_sentence_semi) + if l:more_spaces == 0 | break | endif + else + " Distribute the rest of spaces evenly and + " break the loop. All the spaces have been + " added. + for l:i in s:Distributed_Selection(l:space_sentence_semi,l:more_spaces) + let l:space_list[l:i] +=1 + endfor + break + endif + + " Finally distribute spaces to other available + " positions and exit the loop. + for l:i in s:Distributed_Selection(l:space_other,l:more_spaces) + let l:space_list[l:i] +=1 + endfor + break + endif + endwhile + + " Now we now where all the extra spaces will go. We have to construct + " the string again. + let l:string = '' + for l:item in range(l:string_spaces) + let l:string .= l:word_list[l:item].repeat(' ',l:space_list[l:item]) + endfor + " Add the last word to the end and return the string. + return l:string.l:word_list[-1] +endfunction + +function! s:Truncate_Spaces(string) "{{{1 + let l:string = substitute(a:string,'\v\s+',' ','g') + let l:string = substitute(l:string,'\m^\s*','','') + let l:string = substitute(l:string,'\m\s*$','','') + return l:string +endfunction + +function! s:String_Width(string) "{{{1 + " This counts the string width in characters. Combining diacritical + " marks do not count so the base character with all the combined + " diacritics is just one character (which is good for our purposes). + " Double-wide characters will not get double width so unfortunately + " they don't work in our algorithm. + return strlen(substitute(a:string,'\m.','x','g')) +endfunction + +function! s:Add_Double_Spacing(string) "{{{1 + if &joinspaces + return substitute(a:string,'\m\S[.?!] ','& ','g') + else + return a:string + endif +endfunction + +function! s:Distributed_Selection(list, pick) "{{{1 + " 'list' is a list-type variable [ item1, item2, ... ] + " 'pick' is a number how many of the list's items we want to choose + " + " This function returns a list which has 'pick' number of items from + " the original list. Items are chosen in distributed manner. For + " example, if 'pick' is 1 then the algorithm chooses an item near the + " center of the 'list'. If 'pick' is 2 then the first one is about 1/3 + " from the beginning and the another one about 2/3 from the beginning. + + " l:pick_list is a list of 0's and 1's and its length will be the + " same as original list's. Number 1 means that this list item will be + " picked and 0 means that the item will be dropped. Finally + " l:pick_list could look like this: [0, 1, 0, 1, 0] + " (i.e., two items evenly picked from a list of five items) + let l:pick_list = [] + + " First pick items evenly from the beginning of the list. This also + " actually constructs the list. + let l:div1 = len(a:list) / a:pick + let l:mod1 = len(a:list) % a:pick + for l:i in range(len(a:list)-l:mod1) + if !eval(l:i%l:div1) + let l:pick_list += [1] + else + let l:pick_list += [0] + endif + endfor + + if l:mod1 > 0 + " The division wasn't even so we get the remaining items and + " distribute them evenly again to the list. + let l:div2 = len(l:pick_list) / l:mod1 + let l:mod2 = len(l:pick_list) % l:mod1 + for l:i in range(len(l:pick_list)-l:mod2) + if !eval(l:i%l:div2) + call insert(l:pick_list,0,l:i) + endif + endfor + endif + + " There may be very different number of zeros in the beginning and the + " end of the list. We count them. + let l:zeros_begin = 0 + for l:i in l:pick_list + if l:i == 0 + let l:zeros_begin += 1 + else + break + endif + endfor + let l:zeros_end = 0 + for l:i in reverse(copy(l:pick_list)) + if l:i == 0 + let l:zeros_end += 1 + else + break + endif + endfor + + " Then we remove them. + if l:zeros_end + " Remove "0" items from the end. We need to remove them first + " from the end because list items' index number will change + " when items are removed from the beginning. Then it would be + " more difficult to remove trailing zeros. + call remove(l:pick_list,len(l:pick_list)-l:zeros_end,-1) + endif + if l:zeros_begin + " Remove zero items from the beginning. + call remove(l:pick_list,0,l:zeros_begin-1) + endif + let l:zeros_both = l:zeros_begin + l:zeros_end + + " Put even amount of zeros to beginning and end + for l:i in range(l:zeros_both/2) + call insert(l:pick_list,0,0) + endfor + for l:i in range((l:zeros_both/2)+(l:zeros_both%2)) + call add(l:pick_list,0) + endfor + + " Finally construct and return a new list which has only the items we + " have chosen. + let l:new_list = [] + for l:i in range(len(l:pick_list)) + if l:pick_list[l:i] == 1 + let l:new_list += [a:list[l:i]] + endif + endfor + return l:new_list +endfunction + +function! s:Retab_Indent(column) "{{{1 + " column = the left indent column starting from 0 Function returns + " a string of whitespaces, a mixture of tabs and spaces depending on + " the 'expandtab' and 'tabstop' options. + if &expandtab + " Only spaces + return repeat(' ',a:column) + else + " Tabs and spaces + let l:tabs = a:column / &tabstop + let l:spaces = a:column % &tabstop + return repeat("\",l:tabs).repeat(' ',l:spaces) + endif +endfunction + +function! s:Reformat_Range(...) range "{{{1 + if a:0 == 2 + let l:first = a:1 + let l:last = a:2 + else + let l:first = a:firstline + let l:last = a:lastline + endif + let l:autoindent = &autoindent + setlocal autoindent + execute l:first + normal! 0 + execute 'normal! V'.l:last.'G$gw' + let &l:autoindent = l:autoindent + " The formatting may change the last line of the range so we return + " it. + return line("'>") +endfunction + +function! textformat#Visual_Align_Left() range "{{{1 + execute a:firstline.','.a:lastline.'call s:Align_Range_Left()' + call s:Reformat_Range(a:firstline,a:lastline) +endfunction + +function! textformat#Visual_Align_Right() range "{{{1 + let l:width = &textwidth + if l:width == 0 | let l:width = s:default_width | endif + + execute a:firstline.','.a:lastline.'call s:Align_Range_Right('.l:width.')' + normal! '>$ +endfunction + +function! textformat#Visual_Align_Justify() range "{{{1 + let l:width = &textwidth + if l:width == 0 | let l:width = s:default_width | endif + + execute a:firstline.','.a:lastline.'call s:Align_Range_Left()' + + let l:last = s:Reformat_Range(a:firstline,a:lastline) + let l:pos = getpos('.') + execute a:firstline.','.l:last.'call s:Align_Range_Justify('.l:width.',1)' + call setpos('.',l:pos) +endfunction + +function! textformat#Visual_Align_Center() range "{{{1 + let l:width = &textwidth + if l:width == 0 | let l:width = s:default_width | endif + + execute a:firstline.','.a:lastline.'call s:Align_Range_Center('.l:width.')' + normal! '>$ +endfunction + +function! textformat#Quick_Align_Left() "{{{1 + let l:autoindent = &autoindent + setlocal autoindent + let l:pos = getpos('.') + silent normal! vip:call s:Align_Range_Left() + call setpos('.',l:pos) + silent normal! gwip + let &l:autoindent = l:autoindent +endfunction + +function! textformat#Quick_Align_Right() "{{{1 + let l:width = &textwidth + if l:width == 0 | let l:width = s:default_width | endif + let l:pos = getpos('.') + silent normal! vip:call s:Align_Range_Right(l:width) + call setpos('.',l:pos) +endfunction + +function! textformat#Quick_Align_Justify() "{{{1 + let l:width = &textwidth + if l:width == 0 | let l:width = s:default_width | endif + let l:autoindent = &autoindent + setlocal autoindent + let l:pos = getpos('.') + silent normal! vip:call s:Align_Range_Left() + call setpos('.',l:pos) + silent normal! gwip + let l:pos = getpos('.') + silent normal! vip:call s:Align_Range_Justify(l:width,1) + call setpos('.',l:pos) + let &l:autoindent = l:autoindent +endfunction + +function! textformat#Quick_Align_Center() "{{{1 + let l:width = &textwidth + if l:width == 0 | let l:width = s:default_width | endif + let l:pos = getpos('.') + silent normal! vip:call s:Align_Range_Center(l:width) + call setpos('.',l:pos) +endfunction + +function! textformat#Align_Command(align, ...) range "{{{1 + " For left align the optional parameter a:1 is [indent]. For others + " it's [width]. + let l:pos = getpos('.') + if a:align ==? 'left' + if a:0 && a:1 >= 0 + execute a:firstline.','.a:lastline.'call s:Align_Range_Left('.a:1.')' + else + execute a:firstline.','.a:lastline.'call s:Align_Range_Left()' + endif + else + if a:0 && a:1 > 0 + let l:width = a:1 + elseif &textwidth + let l:width = &textwidth + else + let l:width = s:default_width + endif + + if a:align ==? 'right' + execute a:firstline.','.a:lastline.'call s:Align_Range_Right('.l:width.')' + elseif a:align ==? 'justify' + execute a:firstline.','.a:lastline.'call s:Align_Range_Justify('.l:width.')' + elseif a:align ==? 'center' + execute a:firstline.','.a:lastline.'call s:Align_Range_Center('.l:width.')' + endif + endif + call setpos('.',l:pos) +endfunction + +"{{{1 The ending stuff +let &cpo = s:save_cpo + +" vim600: fdm=marker diff --git a/vim/bundle/TextFormat/doc/tags b/vim/bundle/TextFormat/doc/tags new file mode 100644 index 0000000..6f20f1a --- /dev/null +++ b/vim/bundle/TextFormat/doc/tags @@ -0,0 +1,10 @@ +:AlignCenter textformat.txt /*:AlignCenter* +:AlignJustify textformat.txt /*:AlignJustify* +:AlignLeft textformat.txt /*:AlignLeft* +:AlignRight textformat.txt /*:AlignRight* +textformat-commands textformat.txt /*textformat-commands* +textformat-config textformat.txt /*textformat-config* +textformat-history textformat.txt /*textformat-history* +textformat-keymap textformat.txt /*textformat-keymap* +textformat-start textformat.txt /*textformat-start* +textformat.txt textformat.txt /*textformat.txt* diff --git a/vim/bundle/TextFormat/doc/textformat.txt b/vim/bundle/TextFormat/doc/textformat.txt new file mode 100644 index 0000000..0f25724 --- /dev/null +++ b/vim/bundle/TextFormat/doc/textformat.txt @@ -0,0 +1,301 @@ +*textformat.txt* Vim Text Formatter (version 2.1) 2008-09-13 + + +Description This plugin provides commands and key mappings to quickly + align and format text. Text can be easily reformatted and + aligned to either left or right margin or justified to both + margins or centered. The text formatting commands provided by + this plugin are a bit more automatic and more intelligent than + those integrated to Vim. Together they make more powerful + command set for formatting text. + +Author Teemu Likonen + + + + +Contents + + 1. Quick start |textformat-start| + 2. Commands |textformat-commands| + 3. Default key mappings |textformat-keymap| + 4. Configuration |textformat-config| + 5. Version history |textformat-history| + +============================================================================== +1. Quick start *textformat-start* + +The impatient are always with us so below is a short info on (probably) the +most important tools provided by this plugin. See the following sections of +this manual for more detailed instructions. + +al Left-align and reformat +ar Right-align +aj Left-right justify and reformat +ac Center lines + +In normal mode the commands operate on current paragraph; in visual mode they +operate on the selected lines. By default, is the backslash key, so +the mappings are actually \al, \ar, \aj and \ac, by default. If you have +changed the g:mapleader variable in your .vimrc file may be something +else. + +============================================================================== +2. Commands *textformat-commands* + +Let's start with the basic components of this plugin. These are the ex +commands. You probably don't need these very often but they can be handy if +you want to have text formatting and aligning as a part of a macro or function +or something. The "daily tools" are explained later. + +:[range]AlignLeft [indent] *:AlignLeft* + Align to left all the lines in [range] (default is + current line) and truncate all extra whitespace + characters. That is, if there are more than one space + between words they are reduced to just one. If + 'joinspaces' is set then two spaces are added after + every sentence ending with character ".", "?" or "!". + + If optional numeric argument [indent] is given then + that is used as the left margin. If [indent] is not + given the indent of the first line in the [range] (and + the first line of each paragraph within the [range]) + is used to define indent for the rest of the lines in + the paragraph. There is one exception: if + 'formatoptions' contains "2" then the second line + defines the indent for the rest of the lines in the + paragraph. + + Note: This is very similar to |:left| command except + that this also truncates whitespaces and that without + [indent] each paragraph's indent is detected and used. + + Note: There is a possible unexpected behaviour: If + command is run without [range] (i.e., it's just the + current line) and [indent] is not given then this + command just "aligns" to the current indent position + and truncates whitespaces. You might see nothing + happening if there weren't any extra whitespaces. Use + [indent] (or |:left| command) to align to desired + column. + +:[range]AlignRight [width] *:AlignRight* + Align to right all the lines in [range] (default is + current line) and truncate all extra whitespace + characters (honor 'joinspaces', as in :AlignLeft). + [width] is used as the right margin. If [width] is not + given the value of 'textwidth' option is used instead. + If 'textwidth' is zero then the value of 80 is used. + + Note: This is very similar to |:right| command except + that this also truncates whitespaces. + +:[range]AlignJustify [width] *:AlignJustify* + Left-right justify lines in [range] (default is + current line). This means adjusting spaces between + words so that the lines fit. If 'joinspaces' is set + then at least two spaces are printed after every + sentence ending with a ".", "?" or "!". The first line + in [range] (and the first line in each paragraph + within the [range]) defines the indent for the rest of + the lines in the paragraph, except if 'formatoptions' + contains "2" then it's the second line. + + Numeric argument [width] is used as the right margin. + If [width] is not given the value of 'textwidth' is + used instead. If 'textwidth' is zero then the value of + 80 is used. + + Also see the Discussion below. + +:[range]AlignCenter [width] *:AlignCenter* + Center lines in [range] (default is current line) + between the first column and [width]. All extra + whitespace characters are truncated (but honor + 'joinspaces', just like in :AlignLeft). If [width] is + not given the value of 'textwidth' option is used + instead. If 'textwidth' is zero the value of 80 is + used. + + Note: This is very similar to |:center| except that + this also truncates whitespaces. + + +Discussion ~ + +All the previous ex commands are rather "stupid" and operate on single lines +only. They do not wrap lines nor do other kind of formatting. If [width] (or +'textwidth') is too narrow for the line then some characters will go beyond +the right margin. This is similar to Vim's own |:left|, |:right| and |:center| +commands. More sophisticated formatting tools are provided as key mappings +(see below). + +Usually when paragraphs are justified the last line of each paragraph is +aligned to left. However, :AlignJustify command does not do this. The purpose +of this command is to do exactly what was asked for: left-right justify +a range of lines. More sophisticated justify tools is aj which +reformats the paragraph (like |gw|), justifies lines and aligns each +paragraph's last line to left. + +All the commands truncate extra whitespaces which makes them work well +together. This is particularly because the left-right justify needs to add +extra spaces to make lines fill the text area. If you later want to reformat +such previously justified paragraph and align it to left, for example, it's +convenient that the tool automatically handles this and removes extra spaces. +If you want to align text without truncating whitespaces use Vim's own align +commands: |:left|, |:right| and |:center|. + +============================================================================== +3. Default key mappings *textformat-keymap* + +By default this plugin provides a couple of key mappings for convenient text +formatting. If the mappings have already been defined by user (or are taken by +other plugins) then some of the following mappings may not be automatically +available. See the next section of this manual for information on how to +change the default mappings. + +There are key mappings available for normal mode and visual mode. As usual, + is the backslash key by default but it can be changed with +g:mapleader variable. Consult the Vim manual for more information on . + + +Normal mode (current paragraph) ~ + +al Left-align the current "inner paragraph" (see |ip|) + and reformat it according to 'textwidth'. + +ar Right-align the current "inner paragraph" (see |ip|) + to margin at 'textwidth'. This does not reformat the + paragraph because with right-aligned text user usually + wants to decide exactly what goes to what line. + +aj Left-right justify the current "inner paragraph" (see + |ip|). Technically each line's whitespaces are first + truncated, then the text is reformatted according to + 'textwidth' and finally lines are justified. The last + line (of each text paragraph) is aligned to left. + +ac Center lines of current "inner paragraph" (see |ip|) + between the first column and 'textwidth'. This does + not reformat the paragraph because with centered text + user usually wants to decide exactly what goes to what + line. + + +Visual mode (range of lines) ~ + +{Visual}al Left-align and reformat {Visual} lines so that they + fill 'textwidth'. + +{Visual}ar Right-align {Visual} lines. + +{Visual}aj Left-right justify {Visual} lines. First truncate all + extra whitespace characters, then reformat lines so + that they fill 'textwidth' and finally left-right + justify. The last line of each paragraph as well as + the last line in {Visual} range is aligned to left. + +{Visual}ac Center {Visual} lines. + + +Both normal mode and visual mode commands truncate extra whitespace +characters. If 'joinspaces' is set then an extra space is added after every +sentence ending with a ".", "?" or "!". The first line in each paragraph +inside the range defines the indent for the rest of the lines in the +paragraph, except if 'formatoptions' contains "2" then it's the second line. + + +Paragraph definitions ~ + +The normal mode commands operate on the concept of "inner paragraph" (see +|ip|). The effect is almost the same as selecting current paragraph with Vim's +"vip" command and then executing the equivalent visual mode command. Such +inner paragraph may contain several text paragraphs if 'formatoptions' +contains "w". Each of them is reformatted separately with al and +aj commands. + +New paragraph always begins after a blank line. If 'formatoptions' contains +"w" then new paragraph also begins after a line which ends with +a non-whitespace character. That is, with "w" in 'formatoptions' every line +which ends with a non-whitespace also ends a paragraph. In left-right justify +(aj) such line is aligned to left. You need to ensure that there is +a trailing whitespace in every consecutive line which belongs to same +paragraph (the whitespace is preserved after formatting). If 'formatoptions' +does not contain "w" then all consecutive non-blank lines belong to same +paragraph. + +============================================================================== +4. Configuration *textformat-config* + +The key mappings can be configured freely by user. This plugin uses the +default ones only if they are free and not used for other purposes. Here's an +example of lines you could put to your .vimrc file: +> + nmap Quick_Align_Paragraph_Left + nmap Quick_Align_Paragraph_Right + nmap Quick_Align_Paragraph_Justify + nmap Quick_Align_Paragraph_Center + + vmap Align_Range_Left + vmap Align_Range_Right + vmap Align_Range_Justify + vmap Align_Range_Center + +That is, |:nmap| command defines mappings for normal mode and |:vmap| for +visual mode. Function keys from to are used in this example. The +rest of the line is a code word for Vim and this plugin. They must be written +exactly as shown in the example. I think the code words are pretty much +self-descriptive. + +Don't use |:nnoremap| and |:vnoremap| commands here; they don't work because +the right-hand side (...) must be remappable. See Vim's manual for more +information about the key map commands. + +Most part of this plugin is loaded into memory when the text-formatting +commands or key maps are used for the first time. Only the very minimum is +automatically loaded when Vim is started. If you want to completely avoid +loading this plugin put the following line to your .vimrc file: +> + let g:loaded_textformat = 1 + +Happy formatting! + +============================================================================== +5. Version history *textformat-history* + + v2.1 2008-09-13 + + - Minor internal cleanup. + + v2.0 2008-08-10 + + - \al and \aj now reformat text also in visual mode. + - \al and \aj honor "w" in 'formatoptions' and detect paragraph + boundaries accordingly. + - :AlignLeft, :AlignJustify, \al and \aj recognize several + paragraphs within the range and detect indent for each + paragraph separately. + - Add logic to load the plugin script only once. + + v1.1 2008-08-04 + + - Keep cursor position more accurately when formatting + a paragraph with \al and \aj. + - When 'joinspaces' is set insert two spaces after .?! + punctuation with left-right justify. This is now similar to + other commands. + + v1.0 2008-08-03 + + - All the commands now follow user's 'expandtab' setting and + print leading whitespaces accordingly. Now this works just + like :left, :right and :center commands. + - The left-aligned last line in justified paragraph did not + honor 'joinspaces'. Fixed. + + v0.9 2008-08-01 + + - Initial upload to http://www.vim.org . + +============================================================================== +vim: ft=help tw=78 ts=8 et norl fo+=2aw diff --git a/vim/plugin/textformat.vim b/vim/bundle/TextFormat/plugin/textformat.vim similarity index 100% rename from vim/plugin/textformat.vim rename to vim/bundle/TextFormat/plugin/textformat.vim diff --git a/vim/bundle/The-NERD-Commenter/README b/vim/bundle/The-NERD-Commenter/README new file mode 100644 index 0000000..56aed3e --- /dev/null +++ b/vim/bundle/The-NERD-Commenter/README @@ -0,0 +1,89 @@ +This is a mirror of http://www.vim.org/scripts/script.php?script_id=1218 + +Grab the latest dev version from github: https://github.com/scrooloose/nerdcommenter. + +The following key mappings are provided by default (there is also a menu +provided that contains menu items corresponding to all the below mappings): + +Most of the following mappings are for normal/visual mode only. The +|NERDComInsertComment| mapping is for insert mode only. + +,cc |NERDComComment| +Comments out the current line or text selected in visual mode. + +,cn |NERDComNestedComment| +Same as |NERDComComment| but forces nesting. + +,c |NERDComToggleComment| +Toggles the comment state of the selected line(s). If the topmost selected +line is commented, all selected lines are uncommented and vice versa. + +,cm |NERDComMinimalComment| +Comments the given lines using only one set of multipart delimiters if +possible. + +,ci |NERDComInvertComment| +Toggles the comment state of the selected line(s) individually. Each selected +line that is commented is uncommented and vice versa. + +,cs |NERDComSexyComment| +Comments out the selected lines ``sexily'' + +,cy |NERDComYankComment| +Same as |NERDComComment| except that the commented line(s) are yanked +before commenting. + +,c$ |NERDComEOLComment| +Comments the current line from the cursor to the end of line. + +,cA |NERDComAppendComment| +Adds comment delimiters to the end of line and goes into insert mode between +them. + +,cI |NERDComPrependComment| +Adds comment delimiters to the start of line and goes into insert mode between +them. + +|NERDComInsertComment| +Adds comment delimiters at the current cursor position and inserts between. +Disabled by default. + +,ca |NERDComAltDelim| +Switches to the alternative set of delimiters. + +,cl OR ,cr OR ,cb |NERDComAlignedComment| +Same as |NERDComComment| except that the delimiters are aligned down the +left side (,cl), the right side (,cr) or both sides +(,cb). + +,cu |NERDComUncommentLine| +Uncomments the selected line(s). + +Filetypes that can be commented by this plugin: +abaqus abc acedb ada ahdl amiga aml ampl ant apache apachestyle asm68k asm asn +aspvbs atlas autohotkey autoit automake ave awk basic b bc bdf bib bindzone bst +btm caos catalog c cfg cg ch changelog cl clean clipper cmake conf config +context cpp crontab cs csc csp css cterm cupl csv cvs dcl debchangelog +debcontrol debsources def diff django docbk dns dosbatch dosini dot dracula dsl +dtd dtml dylan ecd eiffel elf elmfilt erlang eruby eterm expect exports +fetchmail fgl focexec form fortran foxpro fstab fvwm fx gdb gdmo geek +gentoo-package-keywords' gentoo-package-mask' gentoo-package-use' gnuplot gtkrc +haskell hb h help hercules hog html htmldjango htmlos ia64 icon idlang idl +indent inform inittab ishd iss ist jam java javascript jess jgraph jproperties +jproperties jsp kconfig kix kscript lace lex lftp lifelines lilo lisp lite +lotos lout lprolog lscript lss lua lynx m4 mail make maple masm master matlab +mel mf mib mma model moduala. modula2 modula3 monk mush muttrc named nasm +nastran natural ncf netdict netrw nqc nroff nsis ocaml occam omlet omnimark +openroad opl ora otl ox pascal passwd pcap pccts perl pfmain php phtml pic pike +pilrc pine plaintex plm plsql po postscr pov povini ppd ppwiz procmail progress +prolog psf ptcap python python qf radiance ratpoison r rc readline rebol +registry remind rexx robots rpl rtf ruby sa samba sas sather scheme scilab +screen scsh sdl sed selectbuf sgml sgmldecl sgmllnx sicad simula sinda skill +slang sl slrnrc sm smarty smil smith sml snnsnet snnspat snnsres snobol4 spec +specman spice sql sqlforms sqlj sqr squid st stp strace svn systemverilog tads +taglist tags tak tasm tcl terminfo tex text plaintex texinfo texmf tf tidy tli +trasys tsalt tsscl tssgm uc uil vb verilog verilog_systemverilog vgrindefs vhdl +vim viminfo virata vo_base vrml vsejcl webmacro wget winbatch wml [^w]*sh +wvdial xdefaults xf86conf xhtml xkb xmath xml xmodmap xpm2 xpm xslt yacc yaml +z8a + diff --git a/vim/bundle/The-NERD-Commenter/doc/NERD_commenter.txt b/vim/bundle/The-NERD-Commenter/doc/NERD_commenter.txt new file mode 100644 index 0000000..5309f61 --- /dev/null +++ b/vim/bundle/The-NERD-Commenter/doc/NERD_commenter.txt @@ -0,0 +1,988 @@ +*NERD_commenter.txt* Plugin for commenting code + + + NERD COMMENTER REFERENCE MANUAL~ + + + + + +============================================================================== +CONTENTS *NERDCommenterContents* + + 1.Intro...................................|NERDCommenter| + 2.Installation............................|NERDComInstallation| + 3.Functionality provided..................|NERDComFunctionality| + 3.1 Functionality Summary.............|NERDComFunctionalitySummary| + 3.2 Functionality Details.............|NERDComFunctionalityDetails| + 3.2.1 Comment map.................|NERDComComment| + 3.2.2 Nested comment map..........|NERDComNestedComment| + 3.2.3 Toggle comment map..........|NERDComToggleComment| + 3.2.4 Minimal comment map.........|NERDComMinimalComment| + 3.2.5 Invert comment map..........|NERDComInvertComment| + 3.2.6 Sexy comment map............|NERDComSexyComment| + 3.2.7 Yank comment map............|NERDComYankComment| + 3.2.8 Comment to EOL map..........|NERDComEOLComment| + 3.2.9 Append com to line map......|NERDComAppendComment| + 3.2.10 Insert comment map.........|NERDComInsertComment| + 3.2.11 Use alternate delims map...|NERDComAltDelim| + 3.2.12 Comment aligned maps.......|NERDComAlignedComment| + 3.2.13 Uncomment line map.........|NERDComUncommentLine| + 3.4 Sexy Comments.....................|NERDComSexyComments| + 3.5 The NERDComment function..........|NERDComNERDComment| + 4.Options.................................|NERDComOptions| + 4.1 Options summary...................|NERDComOptionsSummary| + 4.2 Options details...................|NERDComOptionsDetails| + 4.3 Default delimiter Options.........|NERDComDefaultDelims| + 5. Customising key mappings...............|NERDComMappings| + 6. Issues with the script.................|NERDComIssues| + 6.1 Delimiter detection heuristics....|NERDComHeuristics| + 6.2 Nesting issues....................|NERDComNesting| + 7.About.. ............................|NERDComAbout| + 8.Changelog...............................|NERDComChangelog| + 9.Credits.................................|NERDComCredits| + 10.License................................|NERDComLicense| + +============================================================================== +1. Intro *NERDCommenter* + +The NERD commenter provides many different commenting operations and styles +which are invoked via key mappings and a menu. These operations are available +for most filetypes. + +There are also options that allow to tweak the commenting engine to your +taste. + +============================================================================== +2. Installation *NERDComInstallation* + +The NERD Commenter requires Vim 7 or higher. + +Extract the plugin files in your ~/.vim (*nix) or ~/vimfiles (Windows). You +should have 2 files: > + plugin/NERD_commenter.vim + doc/NERD_commenter.txt +< +Next, to finish installing the help file run: > + :helptags ~/.vim/doc +< +See |add-local-help| for more details. + +Make sure that you have filetype plugins enabled, as the script makes use of +|'commentstring'| where possible (which is usually set in a filetype plugin). +See |filetype-plugin-on| for details, but basically, stick this in your vimrc > + filetype plugin on +< + +============================================================================== +3. Functionality provided *NERDComFunctionality* + +------------------------------------------------------------------------------ +3.1 Functionality summary *NERDComFunctionalitySummary* + +The following key mappings are provided by default (there is also a menu +with items corresponding to all the mappings below): + +[count]cc |NERDComComment| +Comment out the current line or text selected in visual mode. + + +[count]cn |NERDComNestedComment| +Same as cc but forces nesting. + + +[count]c |NERDComToggleComment| +Toggles the comment state of the selected line(s). If the topmost selected +line is commented, all selected lines are uncommented and vice versa. + + +[count]cm |NERDComMinimalComment| +Comments the given lines using only one set of multipart delimiters. + + +[count]ci |NERDComInvertComment| +Toggles the comment state of the selected line(s) individually. + + +[count]cs |NERDComSexyComment| +Comments out the selected lines ``sexily'' + + +[count]cy |NERDComYankComment| +Same as cc except that the commented line(s) are yanked first. + + +c$ |NERDComEOLComment| +Comments the current line from the cursor to the end of line. + + +cA |NERDComAppendComment| +Adds comment delimiters to the end of line and goes into insert mode between +them. + + +|NERDComInsertComment| +Adds comment delimiters at the current cursor position and inserts between. +Disabled by default. + + +ca |NERDComAltDelim| +Switches to the alternative set of delimiters. + + +[count]cl +[count]cb |NERDComAlignedComment| +Same as |NERDComComment| except that the delimiters are aligned down the +left side (cl) or both sides (cb). + + +[count]cu |NERDComUncommentLine| +Uncomments the selected line(s). + +------------------------------------------------------------------------------ +3.2 Functionality details *NERDComFunctionalityDetails* + +------------------------------------------------------------------------------ +3.2.1 Comment map *NERDComComment* + +Default mapping: [count]cc +Mapped to: NERDCommenterComment +Applicable modes: normal visual visual-line visual-block. + + +Comments out the current line. If multiple lines are selected in visual-line +mode, they are all commented out. If some text is selected in visual or +visual-block mode then the script will try to comment out the exact text that +is selected using multi-part delimiters if they are available. + +If a [count] is given in normal mode, the mapping works as though that many +lines were selected in visual-line mode. + +------------------------------------------------------------------------------ +3.2.2 Nested comment map *NERDComNestedComment* + +Default mapping: [count]cn +Mapped to: NERDCommenterNest +Applicable modes: normal visual visual-line visual-block. + +Performs nested commenting. Works the same as cc except that if a line +is already commented then it will be commented again. + +If |'NERDUsePlaceHolders'| is set then the previous comment delimiters will +be replaced by place-holder delimiters if needed. Otherwise the nested +comment will only be added if the current commenting delimiters have no right +delimiter (to avoid syntax errors) + +If a [count] is given in normal mode, the mapping works as though that many +lines were selected in visual-line mode. + +Related options: +|'NERDDefaultNesting'| + +------------------------------------------------------------------------------ +3.2.3 Toggle comment map *NERDComToggleComment* + +Default mapping: [count]c +Mapped to: NERDCommenterToggle +Applicable modes: normal visual-line. + +Toggles commenting of the lines selected. The behaviour of this mapping +depends on whether the first line selected is commented or not. If so, all +selected lines are uncommented and vice versa. + +With this mapping, a line is only considered to be commented if it starts with +a left delimiter. + +If a [count] is given in normal mode, the mapping works as though that many +lines were selected in visual-line mode. + +------------------------------------------------------------------------------ +3.2.4 Minimal comment map *NERDComMinimalComment* + +Default mapping: [count]cm +Mapped to: NERDCommenterMinimal +Applicable modes: normal visual-line. + +Comments the selected lines using one set of multipart delimiters if possible. + +For example: if you are programming in c and you select 5 lines and press +cm then a '/*' will be placed at the start of the top line and a '*/' +will be placed at the end of the last line. + +Sets of multipart comment delimiters that are between the top and bottom +selected lines are replaced with place holders (see |'NERDLPlace'|) if +|'NERDUsePlaceHolders'| is set for the current filetype. If it is not, then +the comment will be aborted if place holders are required to prevent illegal +syntax. + +If a [count] is given in normal mode, the mapping works as though that many +lines were selected in visual-line mode. + +------------------------------------------------------------------------------ +3.2.5 Invert comment map *NERDComInvertComment* + +Default mapping: ci +Mapped to: NERDCommenterInvert +Applicable modes: normal visual-line. + +Inverts the commented state of each selected line. If the a selected line is +commented then it is uncommented and vice versa. Each line is examined and +commented/uncommented individually. + +With this mapping, a line is only considered to be commented if it starts with +a left delimiter. + +If a [count] is given in normal mode, the mapping works as though that many +lines were selected in visual-line mode. + +------------------------------------------------------------------------------ +3.2.6 Sexy comment map *NERDComSexyComment* + +Default mapping: [count]cs +Mapped to: NERDCommenterSexy +Applicable modes: normal, visual-line. + +Comments the selected line(s) ``sexily''... see |NERDComSexyComments| for +a description of what sexy comments are. Can only be done on filetypes for +which there is at least one set of multipart comment delimiters specified. + +Sexy comments cannot be nested and lines inside a sexy comment cannot be +commented again. + +If a [count] is given in normal mode, the mapping works as though that many +lines were selected in visual-line mode. + +Related options: +|'NERDCompactSexyComs'| + +------------------------------------------------------------------------------ +3.2.7 Yank comment map *NERDComYankComment* + +Default mapping: [count]cy +Mapped to: NERDCommenterYank +Applicable modes: normal visual visual-line visual-block. + +Same as cc except that it yanks the line(s) that are commented first. + +------------------------------------------------------------------------------ +3.2.8 Comment to EOL map *NERDComEOLComment* + +Default mapping: c$ +Mapped to: NERDCommenterToEOL +Applicable modes: normal. + +Comments the current line from the current cursor position up to the end of +the line. + +------------------------------------------------------------------------------ +3.2.9 Append com to line map *NERDComAppendComment* + +Default mapping: cA +Mapped to: NERDCommenterAppend +Applicable modes: normal. + +Appends comment delimiters to the end of the current line and goes +to insert mode between the new delimiters. + +------------------------------------------------------------------------------ +3.2.10 Insert comment map *NERDComInsertComment* + +Default mapping: disabled by default. +Map it to: NERDCommenterInInsert +Applicable modes: insert. + +Adds comment delimiters at the current cursor position and inserts +between them. + +NOTE: prior to version 2.1.17 this was mapped to ctrl-c. To restore this +mapping add > + let NERDComInsertMap='' +< +to your vimrc. + +------------------------------------------------------------------------------ +3.2.11 Use alternate delims map *NERDComAltDelim* + +Default mapping: ca +Mapped to: NERDCommenterAltDelims +Applicable modes: normal. + +Changes to the alternative commenting style if one is available. For example, +if the user is editing a c++ file using // comments and they hit ca +then they will be switched over to /**/ comments. + +See also |NERDComDefaultDelims| + +------------------------------------------------------------------------------ +3.2.12 Comment aligned maps *NERDComAlignedComment* + +Default mappings: [count]cl [count]cb +Mapped to: NERDCommenterAlignLeft + NERDCommenterAlignBoth +Applicable modes: normal visual-line. + +Same as cc except that the comment delimiters are aligned on the left +side or both sides respectively. These comments are always nested if the +line(s) are already commented. + +If a [count] is given in normal mode, the mapping works as though that many +lines were selected in visual-line mode. + +------------------------------------------------------------------------------ +3.2.13 Uncomment line map *NERDComUncommentLine* + +Default mapping: [count]cu +Mapped to: NERDCommenterUncomment +Applicable modes: normal visual visual-line visual-block. + +Uncomments the current line. If multiple lines are selected in +visual mode then they are all uncommented. + +When uncommenting, if the line contains multiple sets of delimiters then the +``outtermost'' pair of delimiters will be removed. + +The script uses a set of heurisics to distinguish ``real'' delimiters from +``fake'' ones when uncommenting. See |NERDComIssues| for details. + +If a [count] is given in normal mode, the mapping works as though that many +lines were selected in visual-line mode. + +Related options: +|'NERDRemoveAltComs'| +|'NERDRemoveExtraSpaces'| + +------------------------------------------------------------------------------ +3.3 Sexy Comments *NERDComSexyComments* +These are comments that use one set of multipart comment delimiters as well as +one other marker symbol. For example: > + /* + * This is a c style sexy comment + * So there! + */ + + /* This is a c style sexy comment + * So there! + * But this one is ``compact'' style */ +< +Here the multipart delimiters are /* and */ and the marker is *. + +------------------------------------------------------------------------------ +3.4 The NERDComment function *NERDComNERDComment* + +All of the NERD commenter mappings and menu items invoke a single function +which delegates the commenting work to other functions. This function is +public and has the prototype: > + function! NERDComment(isVisual, type) +< +The arguments to this function are simple: + - isVisual: if you wish to do any kind of visual comment then set this to + 1 and the function will use the '< and '> marks to find the comment + boundries. If set to 0 then the function will operate on the current + line. + - type: is used to specify what type of commenting operation is to be + performed, and it can be one of the following: "sexy", "invert", + "minimal", "toggle", "alignLeft", "alignBoth", "norm", "nested", + "toEOL", "append", "insert", "uncomment", "yank" + +For example, if you typed > + :call NERDComment(1, 'sexy') +< +then the script would do a sexy comment on the last visual selection. + + +============================================================================== +4. Options *NERDComOptions* + +------------------------------------------------------------------------------ +4.1 Options summary *NERDComOptionsSummary* + +|'loaded_nerd_comments'| Turns off the script. +|'NERDAllowAnyVisualDelims'| Allows multipart alternative delims to + be used when commenting in + visual/visual-block mode. +|'NERDBlockComIgnoreEmpty'| Forces right delims to be placed when + doing visual-block comments. +|'NERDCommentWholeLinesInVMode'| Changes behaviour of visual comments. +|'NERDCreateDefaultMappings'| Turn the default mappings on/off. +|'NERDDefaultNesting'| Tells the script to use nested comments + by default. +|'NERDMenuMode'| Specifies how the NERD commenter menu + will appear (if at all). +|'NERDLPlace'| Specifies what to use as the left + delimiter placeholder when nesting + comments. +|'NERDUsePlaceHolders'| Specifies which filetypes may use + placeholders when nesting comments. +|'NERDRemoveAltComs'| Tells the script whether to remove + alternative comment delimiters when + uncommenting. +|'NERDRemoveExtraSpaces'| Tells the script to always remove the + extra spaces when uncommenting + (regardless of whether NERDSpaceDelims + is set) +|'NERDRPlace'| Specifies what to use as the right + delimiter placeholder when nesting + comments. +|'NERDSpaceDelims'| Specifies whether to add extra spaces + around delimiters when commenting, and + whether to remove them when + uncommenting. +|'NERDCompactSexyComs'| Specifies whether to use the compact + style sexy comments. + +------------------------------------------------------------------------------ +4.3 Options details *NERDComOptionsDetails* + +To enable any of the below options you should put the given line in your +~/.vimrc + + *'loaded_nerd_comments'* +If this script is driving you insane you can turn it off by setting this +option > + let loaded_nerd_comments=1 +< +------------------------------------------------------------------------------ + *'NERDAllowAnyVisualDelims'* +Values: 0 or 1. +Default: 1. + +If set to 1 then, when doing a visual or visual-block comment (but not a +visual-line comment), the script will choose the right delimiters to use for +the comment. This means either using the current delimiters if they are +multipart or using the alternative delimiters if THEY are multipart. For +example if we are editing the following java code: > + float foo = 1221; + float bar = 324; + System.out.println(foo * bar); +< +If we are using // comments and select the "foo" and "bar" in visual-block +mode, as shown left below (where '|'s are used to represent the visual-block +boundary), and comment it then the script will use the alternative delims as +shown on the right: > + + float |foo| = 1221; float /*foo*/ = 1221; + float |bar| = 324; float /*bar*/ = 324; + System.out.println(foo * bar); System.out.println(foo * bar); +< +------------------------------------------------------------------------------ + *'NERDBlockComIgnoreEmpty'* +Values: 0 or 1. +Default: 1. + +This option affects visual-block mode commenting. If this option is turned +on, lines that begin outside the right boundary of the selection block will be +ignored. + +For example, if you are commenting this chunk of c code in visual-block mode +(where the '|'s are used to represent the visual-block boundary) > + #include + #include + #include + |int| main(){ + | | printf("SUCK THIS\n"); + | | while(1){ + | | fork(); + | | } + |} | +< +If NERDBlockComIgnoreEmpty=0 then this code will become: > + #include + #include + #include + /*int*/ main(){ + /* */ printf("SUCK THIS\n"); + /* */ while(1){ + /* */ fork(); + /* */ } + /*} */ +< +Otherwise, the code block would become: > + #include + #include + #include + /*int*/ main(){ + printf("SUCK THIS\n"); + while(1){ + fork(); + } + /*} */ +< +------------------------------------------------------------------------------ + *'NERDCommentWholeLinesInVMode'* +Values: 0, 1 or 2. +Default: 0. + +By default the script tries to comment out exactly what is selected in visual +mode (v). For example if you select and comment the following c code (using | +to represent the visual boundary): > + in|t foo = 3; + int bar =| 9; + int baz = foo + bar; +< +This will result in: > + in/*t foo = 3;*/ + /*int bar =*/ 9; + int baz = foo + bar; +< +But some people prefer it if the whole lines are commented like: > + /*int foo = 3;*/ + /*int bar = 9;*/ + int baz = foo + bar; +< +If you prefer the second option then stick this line in your vimrc: > + let NERDCommentWholeLinesInVMode=1 +< + +If the filetype you are editing only has no multipart delimiters (for example +a shell script) and you hadnt set this option then the above would become > + in#t foo = 3; + #int bar = 9; +< +(where # is the comment delimiter) as this is the closest the script can +come to commenting out exactly what was selected. If you prefer for whole +lines to be commented out when there is no multipart delimiters but the EXACT +text that was selected to be commented out if there IS multipart delimiters +then stick the following line in your vimrc: > + let NERDCommentWholeLinesInVMode=2 +< + +Note that this option does not affect the behaviour of commenting in +|visual-block| mode. + +------------------------------------------------------------------------------ + *'NERDCreateDefaultMappings'* +Values: 0 or 1. +Default: 1. + +If set to 0, none of the default mappings will be created. + +See also |NERDComMappings|. + +------------------------------------------------------------------------------ + *'NERDRemoveAltComs'* +Values: 0 or 1. +Default: 1. + +When uncommenting a line (for a filetype with an alternative commenting style) +this option tells the script whether to look for, and remove, comment +delimiters of the alternative style. + +For example, if you are editing a c++ file using // style comments and you go +cu on this line: > + /* This is a c++ comment baby! */ +< +It will not be uncommented if the NERDRemoveAltComs is set to 0. + +------------------------------------------------------------------------------ + *'NERDRemoveExtraSpaces'* +Values: 0 or 1. +Default: 1. + +By default, the NERD commenter will remove spaces around comment delimiters if +either: +1. |'NERDSpaceDelims'| is set to 1. +2. NERDRemoveExtraSpaces is set to 1. + +This means that if we have the following lines in a c code file: > + /* int foo = 5; */ + /* int bar = 10; */ + int baz = foo + bar +< +If either of the above conditions hold then if these lines are uncommented +they will become: > + int foo = 5; + int bar = 10; + int baz = foo + bar +< +Otherwise they would become: > + int foo = 5; + int bar = 10; + int baz = foo + bar +< +If you want the spaces to be removed only if |'NERDSpaceDelims'| is set then +set NERDRemoveExtraSpaces to 0. + +------------------------------------------------------------------------------ + *'NERDLPlace'* + *'NERDRPlace'* +Values: arbitrary string. +Default: + NERDLPlace: "[>" + NERDRPlace: "<]" + +These options are used to control the strings used as place-holder delimiters. +Place holder delimiters are used when performing nested commenting when the +filetype supports commenting styles with both left and right delimiters. +To set these options use lines like: > + let NERDLPlace="FOO" + let NERDRPlace="BAR" +< +Following the above example, if we have line of c code: > + /* int horse */ +< +and we comment it with cn it will be changed to: > + /*FOO int horse BAR*/ +< +When we uncomment this line it will go back to what it was. + +------------------------------------------------------------------------------ + *'NERDMenuMode'* +Values: 0, 1, 2, 3. +Default: 3 + +This option can take 4 values: + "0": Turns the menu off. + "1": Turns the 'comment' menu on with no menu shortcut. + "2": Turns the 'comment 'menu on with -c as the shortcut. + "3": Turns the 'Plugin -> comment' menu on with -c as the shortcut. + +------------------------------------------------------------------------------ + *'NERDUsePlaceHolders'* +Values: 0 or 1. +Default 1. + +This option is used to specify whether place-holder delimiters should be used +when creating a nested comment. + +------------------------------------------------------------------------------ + *'NERDSpaceDelims'* +Values: 0 or 1. +Default 0. + +Some people prefer a space after the left delimiter and before the right +delimiter like this: > + /* int foo=2; */ +< +as opposed to this: > + /*int foo=2;*/ +< +If you want spaces to be added then set NERDSpaceDelims to 1 in your vimrc. + +See also |'NERDRemoveExtraSpaces'|. + +------------------------------------------------------------------------------ + *'NERDCompactSexyComs'* +Values: 0 or 1. +Default 0. + +Some people may want their sexy comments to be like this: > + /* Hi There! + * This is a sexy comment + * in c */ +< +As opposed to like this: > + /* + * Hi There! + * This is a sexy comment + * in c + */ +< +If this option is set to 1 then the top style will be used. + +------------------------------------------------------------------------------ + *'NERDDefaultNesting'* +Values: 0 or 1. +Default 1. + +When this option is set to 1, comments are nested automatically. That is, if +you hit cc on a line that is already commented it will be commented +again. + +------------------------------------------------------------------------------ +3.3 Default delimiter customisation *NERDComDefaultDelims* + +If you want the NERD commenter to use the alternative delimiters for a +specific filetype by default then put a line of this form into your vimrc: > + let NERD__alt_style=1 +< +Example: java uses // style comments by default, but you want it to default to +/* */ style comments instead. You would put this line in your vimrc: > + let NERD_java_alt_style=1 +< + +See |NERDComAltDelim| for switching commenting styles at runtime. + +============================================================================== +5. Key mapping customisation *NERDComMappings* + +To change a mapping just map another key combo to the internal mapping. +For example, to remap the |NERDComComment| mapping to ",omg" you would put +this line in your vimrc: > + map ,omg NERDCommenterComment +< +This will stop the corresponding default mappings from being created. + +See the help for the mapping in question to see which mapping to +map to. + +See also |'NERDCreateDefaultMappings'|. + +============================================================================== +6. Issues with the script *NERDComIssues* + + +------------------------------------------------------------------------------ +6.1 Delimiter detection heuristics *NERDComHeuristics* + +Heuristics are used to distinguish the real comment delimiters + +Because we have comment mappings that place delimiters in the middle of lines, +removing comment delimiters is a bit tricky. This is because if comment +delimiters appear in a line doesnt mean they really ARE delimiters. For +example, Java uses // comments but the line > + System.out.println("//"); +< +clearly contains no real comment delimiters. + +To distinguish between ``real'' comment delimiters and ``fake'' ones we use a +set of heuristics. For example, one such heuristic states that any comment +delimiter that has an odd number of non-escaped " characters both preceding +and following it on the line is not a comment because it is probably part of a +string. These heuristics, while usually pretty accurate, will not work for all +cases. + +------------------------------------------------------------------------------ +6.2 Nesting issues *NERDComNesting* + +If we have some line of code like this: > + /*int foo */ = /*5 + 9;*/ +< +This will not be uncommented legally. The NERD commenter will remove the +"outter most" delimiters so the line will become: > + int foo */ = /*5 + 9; +< +which almost certainly will not be what you want. Nested sets of comments will +uncomment fine though. Eg: > + /*int/* foo =*/ 5 + 9;*/ +< +will become: > + int/* foo =*/ 5 + 9; +< +(Note that in the above examples I have deliberately not used place holders +for simplicity) + +============================================================================== +7. About *NERDComAbout* + +The author of the NERD commenter is Martyzillatron --- the half robot, half +dinosaur bastard son of Megatron and Godzilla. He enjoys destroying +metropolises and eating tourist busses. + +Drop him a line at martin_grenfell at msn.com. He would love to hear from you. +its a lonely life being the worlds premier terror machine. How would you feel +if your face looked like a toaster and a t-rex put together? :( + +The latest stable versions can be found at + http://www.vim.org/scripts/script.php?script_id=1218 + +The latest dev versions are on github + http://github.com/scrooloose/nerdcommenter + +============================================================================== +8. Changelog *NERDComChangelog* + +2.3.0 + - remove all filetypes which have a &commentstring in the standard vim + runtime for vim > 7.0 unless the script stores an alternate set of + delimiters + - make the script complain if the user doesnt have filetype plugins enabled + - use instead of comma to start the default mappings + - fix a couple of bugs with sexy comments - thanks to Tim Smart + - lots of refactoring + +2.2.2 + - remove the NERDShutup option and the message is suppresses, this makes + the plugin silently rely on &commentstring for unknown filetypes. + - add support for dhcpd, limits, ntp, resolv, rgb, sysctl, udevconf and + udevrules. Thanks to Thilo Six. + - match filetypes case insensitively + - add support for mp (metapost), thanks to Andrey Skvortsov. + - add support for htmlcheetah, thanks to Simon Hengel. + - add support for javacc, thanks to Matt Tolton. + - make <%# %> the default delims for eruby, thanks to tpope. + - add support for javascript.jquery, thanks to Ivan Devat. + - add support for cucumber and pdf. Fix sass and railslog delims, + thanks to tpope + +2.2.1 + - add support for newlisp and clojure, thanks to Matthew Lee Hinman. + - fix automake comments, thanks to Elias Pipping + - make haml comments default to -# with / as the alternative delimiter, + thanks to tpope + - add support for actionscript and processing thanks to Edwin Benavides + - add support for ps1 (powershell), thanks to Jason Mills + - add support for hostsaccess, thanks to Thomas Rowe + - add support for CVScommit + - add support for asciidoc, git and gitrebase. Thanks to Simon Ruderich. + - use # for gitcommit comments, thanks to Simon Ruderich. + - add support for mako and genshi, thanks to Keitheis. + - add support for conkyrc, thanks to David + - add support for SVNannotate, thanks to Miguel Jaque Barbero. + - add support for sieve, thanks to Stefan Walk + - add support for objj, thanks to Adam Thorsen. + +2.2.0 + - rewrote the mappings system to be more "standard". + - removed all the mapping options. Now, mappings to mappings are + used + - see :help NERDComMappings, and :help NERDCreateDefaultMappings for + more info + - remove "prepend comments" and "right aligned comments". + - add support for applescript, calbire, man, SVNcommit, potwiki, txt2tags and SVNinfo. + Thanks to nicothakis, timberke, sgronblo, mntnoe, Bernhard Grotz, John + O'Shea, François and Giacomo Mariani respectively. + - bugfix for haskell delimiters. Thanks to mntnoe. +2.1.18 + - add support for llvm. Thanks to nicothakis. + - add support for xquery. Thanks to Phillip Kovalev. +2.1.17 + - fixed haskell delimiters (hackily). Thanks to Elias Pipping. + - add support for mailcap. Thanks to Pascal Brueckner. + - add support for stata. Thanks to Jerónimo Carballo. + - applied a patch from ewfalor to fix an error in the help file with the + NERDMapleader doc + - disable the insert mode ctrl-c mapping by default, see :help + NERDComInsertComment if you wish to restore it + +============================================================================== +9. Credits *NERDComCredits* + +Thanks to the follow people for suggestions and patches: + +Nick Brettell +Matthew Hawkins +Mathieu Clabaut +Greg Searle +Nguyen +Litchi +Jorge Scandaliaris +Shufeng Zheng +Martin Stubenschrott +Markus Erlmann +Brent Rice +Richard Willis +Igor Prischepoff +Harry +David Bourgeois +Eike Von Seggern +Torsten Blix +Alexander Bosecke +Stefano Zacchiroli +Norick Chen +Joseph Barker +Gary Church +Tim Carey-Smith +Markus Klinik +Anders +Seth Mason +James Hales +Heptite +Cheng Fang +Yongwei Wu +David Miani +Jeremy Hinegardner +Marco +Ingo Karkat +Zhang Shuhan +tpope +Ben Schmidt +David Fishburn +Erik Falor +JaGoTerr +Elias Pipping +mntnoe +Mark S. + + +Thanks to the following people for sending me new filetypes to support: + +The hackers The filetypes~ +Sam R verilog +Jonathan Derque context, plaintext and mail +Vigil fetchmail +Michael Brunner kconfig +Antono Vasiljev netdict +Melissa Reid omlet +Ilia N Ternovich quickfix +John O'Shea RTF, SVNcommitlog and vcscommit, SVNCommit +Anders occam +Mark Woodward csv +fREW gentoo-package-mask, + gentoo-package-keywords, + gentoo-package-use, and vo_base +Alexey verilog_systemverilog, systemverilog +Lizendir fstab +Michael Böhler autoit, autohotkey and docbk +Aaron Small cmake +Ramiro htmldjango and django +Stefano Zacchiroli debcontrol, debchangelog, mkd +Alex Tarkovsky ebuild and eclass +Jorge Rodrigues gams +Rainer Müller Objective C +Jason Mills Groovy, ps1 +Normandie Azucena vera +Florian Apolloner ldif +David Fishburn lookupfile +Niels Aan de Brugh rst +Don Hatlestad ahk +Christophe Benz Desktop and xsd +Eyolf Østrem lilypond, bbx and lytex +Ingo Karkat dosbatch +Nicolas Weber markdown, objcpp +tinoucas gentoo-conf-d +Greg Weber D, haml +Bruce Sherrod velocity +timberke cobol, calibre +Aaron Schaefer factor +Mr X asterisk, mplayerconf +Kuchma Michael plsql +Brett Warneke spectre +Pipp lhaskell +Renald Buter scala +Vladimir Lomov asymptote +Marco mrxvtrc, aap +nicothakis SVNAnnotate, CVSAnnotate, SVKAnnotate, + SVNdiff, gitAnnotate, gitdiff, dtrace + llvm, applescript +Chen Xing Wikipedia +Jacobo Diaz dakota, patran +Li Jin gentoo-env-d, gentoo-init-d, + gentoo-make-conf, grub, modconf, sudoers +SpookeyPeanut rib +Greg Jandl pyrex/cython +Christophe Benz services, gitcommit +A Pontus vimperator +Stromnov slice, bzr +Martin Kustermann pamconf +Indriði Einarsson mason +Chris map +Krzysztof A. Adamski group +Pascal Brueckner mailcap +Jerónimo Carballo stata +Phillip Kovalev xquery +Bernhard Grotz potwiki +sgronblo man +François txt2tags +Giacomo Mariani SVNinfo +Matthew Lee Hinman newlisp, clojure +Elias Pipping automake +Edwin Benavides actionscript, processing +Thomas Rowe hostsaccess +Simon Ruderich asciidoc, git, gitcommit, gitrebase +Keitheis mako, genshi +David conkyrc +Miguel Jaque Barbero SVNannotate +Stefan Walk sieve +Adam Thorsen objj +Thilo Six dhcpd, limits, ntp, resolv, rgb, sysctl, + udevconf, udevrules +Andrey Skvortsov mp +Simon Hengel htmlcheetah +Matt Tolton javacc +Ivan Devat javascript.jquery +tpope cucumber,pdf +============================================================================== +10. License *NERDComLicense* + +The NERD commenter is released under the wtfpl. +See http://sam.zoy.org/wtfpl/COPYING. diff --git a/vim/bundle/The-NERD-Commenter/doc/tags b/vim/bundle/The-NERD-Commenter/doc/tags new file mode 100644 index 0000000..749e1ed --- /dev/null +++ b/vim/bundle/The-NERD-Commenter/doc/tags @@ -0,0 +1,48 @@ +'NERDAllowAnyVisualDelims' NERD_commenter.txt /*'NERDAllowAnyVisualDelims'* +'NERDBlockComIgnoreEmpty' NERD_commenter.txt /*'NERDBlockComIgnoreEmpty'* +'NERDCommentWholeLinesInVMode' NERD_commenter.txt /*'NERDCommentWholeLinesInVMode'* +'NERDCompactSexyComs' NERD_commenter.txt /*'NERDCompactSexyComs'* +'NERDCreateDefaultMappings' NERD_commenter.txt /*'NERDCreateDefaultMappings'* +'NERDDefaultNesting' NERD_commenter.txt /*'NERDDefaultNesting'* +'NERDLPlace' NERD_commenter.txt /*'NERDLPlace'* +'NERDMenuMode' NERD_commenter.txt /*'NERDMenuMode'* +'NERDRPlace' NERD_commenter.txt /*'NERDRPlace'* +'NERDRemoveAltComs' NERD_commenter.txt /*'NERDRemoveAltComs'* +'NERDRemoveExtraSpaces' NERD_commenter.txt /*'NERDRemoveExtraSpaces'* +'NERDSpaceDelims' NERD_commenter.txt /*'NERDSpaceDelims'* +'NERDUsePlaceHolders' NERD_commenter.txt /*'NERDUsePlaceHolders'* +'loaded_nerd_comments' NERD_commenter.txt /*'loaded_nerd_comments'* +NERDComAbout NERD_commenter.txt /*NERDComAbout* +NERDComAlignedComment NERD_commenter.txt /*NERDComAlignedComment* +NERDComAltDelim NERD_commenter.txt /*NERDComAltDelim* +NERDComAppendComment NERD_commenter.txt /*NERDComAppendComment* +NERDComChangelog NERD_commenter.txt /*NERDComChangelog* +NERDComComment NERD_commenter.txt /*NERDComComment* +NERDComCredits NERD_commenter.txt /*NERDComCredits* +NERDComDefaultDelims NERD_commenter.txt /*NERDComDefaultDelims* +NERDComEOLComment NERD_commenter.txt /*NERDComEOLComment* +NERDComFunctionality NERD_commenter.txt /*NERDComFunctionality* +NERDComFunctionalityDetails NERD_commenter.txt /*NERDComFunctionalityDetails* +NERDComFunctionalitySummary NERD_commenter.txt /*NERDComFunctionalitySummary* +NERDComHeuristics NERD_commenter.txt /*NERDComHeuristics* +NERDComInsertComment NERD_commenter.txt /*NERDComInsertComment* +NERDComInstallation NERD_commenter.txt /*NERDComInstallation* +NERDComInvertComment NERD_commenter.txt /*NERDComInvertComment* +NERDComIssues NERD_commenter.txt /*NERDComIssues* +NERDComLicense NERD_commenter.txt /*NERDComLicense* +NERDComMappings NERD_commenter.txt /*NERDComMappings* +NERDComMinimalComment NERD_commenter.txt /*NERDComMinimalComment* +NERDComNERDComment NERD_commenter.txt /*NERDComNERDComment* +NERDComNestedComment NERD_commenter.txt /*NERDComNestedComment* +NERDComNesting NERD_commenter.txt /*NERDComNesting* +NERDComOptions NERD_commenter.txt /*NERDComOptions* +NERDComOptionsDetails NERD_commenter.txt /*NERDComOptionsDetails* +NERDComOptionsSummary NERD_commenter.txt /*NERDComOptionsSummary* +NERDComSexyComment NERD_commenter.txt /*NERDComSexyComment* +NERDComSexyComments NERD_commenter.txt /*NERDComSexyComments* +NERDComToggleComment NERD_commenter.txt /*NERDComToggleComment* +NERDComUncommentLine NERD_commenter.txt /*NERDComUncommentLine* +NERDComYankComment NERD_commenter.txt /*NERDComYankComment* +NERDCommenter NERD_commenter.txt /*NERDCommenter* +NERDCommenterContents NERD_commenter.txt /*NERDCommenterContents* +NERD_commenter.txt NERD_commenter.txt /*NERD_commenter.txt* diff --git a/vim/plugin/NERD_commenter.vim b/vim/bundle/The-NERD-Commenter/plugin/NERD_commenter.vim similarity index 100% rename from vim/plugin/NERD_commenter.vim rename to vim/bundle/The-NERD-Commenter/plugin/NERD_commenter.vim diff --git a/vim/bundle/The-NERD-Tree/README b/vim/bundle/The-NERD-Tree/README new file mode 100644 index 0000000..47fd00a --- /dev/null +++ b/vim/bundle/The-NERD-Tree/README @@ -0,0 +1,54 @@ +This is a mirror of http://www.vim.org/scripts/script.php?script_id=1658 + +Grab the latest dev version from github: https://github.com/scrooloose/nerdtree. + +What is this "NERD tree"?? + +Check out this demo http://www.flickr.com/photos/30496122@N07/2862367534/sizes/o/ + +The NERD tree allows you to explore your filesystem and to open files and +directories. It presents the filesystem to you in the form of a tree which you +manipulate with the keyboard and/or mouse. It also allows you to perform +simple filesystem operations. + +The following features and functionality are provided by the NERD tree: + * Files and directories are displayed in a hierarchical tree structure + * Different highlighting is provided for the following types of nodes: + * files + * directories + * sym-links + * windows .lnk files + * read-only files + * executable files + * Many (customisable) mappings are provided to manipulate the tree: + * Mappings to open/close/explore directory nodes + * Mappings to open files in new/existing windows/tabs + * Mappings to change the current root of the tree + * Mappings to navigate around the tree + * ... + * Directories and files can be bookmarked. + * Most NERD tree navigation can also be done with the mouse + * Filtering of tree content (can be toggled at runtime) + * custom file filters to prevent e.g. vim backup files being displayed + * optional displaying of hidden files (. files) + * files can be "turned off" so that only directories are displayed + * A textual filesystem menu is provided which allows you to + create/delete/move file and directory nodes as well as copy (for + supported OSs) + * The position and size of the NERD tree window can be customised + * The order in which the nodes in the tree are listed can be customised. + * A model of your filesystem is created/maintained as you explore it. This + has several advantages: + * All filesystem information is cached and is only re-read on demand + * If you revisit a part of the tree that you left earlier in your + session, the directory nodes will be opened/closed as you left them + * The script remembers the cursor position and window position in the NERD + tree so you can toggle it off (or just close the tree window) and then + reopen it (with NERDTreeToggle) the NERD tree window will appear exactly + as you left it + * You can have a separate NERD tree for each tab, share trees across tabs, + or a mix of both. + * By default the script overrides the default file browser (netw), so if + you :edit a directory a (slighly modified) NERD tree will appear in the + current window + diff --git a/vim/bundle/The-NERD-Tree/doc/NERD_tree.txt b/vim/bundle/The-NERD-Tree/doc/NERD_tree.txt new file mode 100644 index 0000000..174229d --- /dev/null +++ b/vim/bundle/The-NERD-Tree/doc/NERD_tree.txt @@ -0,0 +1,1291 @@ +*NERD_tree.txt* A tree explorer plugin that owns your momma! + + + + omg its ... ~ + + ________ ________ _ ____________ ____ __________ ____________~ + /_ __/ / / / ____/ / | / / ____/ __ \/ __ \ /_ __/ __ \/ ____/ ____/~ + / / / /_/ / __/ / |/ / __/ / /_/ / / / / / / / /_/ / __/ / __/ ~ + / / / __ / /___ / /| / /___/ _, _/ /_/ / / / / _, _/ /___/ /___ ~ + /_/ /_/ /_/_____/ /_/ |_/_____/_/ |_/_____/ /_/ /_/ |_/_____/_____/ ~ + + + Reference Manual~ + + + + +============================================================================== +CONTENTS *NERDTree-contents* + + 1.Intro...................................|NERDTree| + 2.Functionality provided..................|NERDTreeFunctionality| + 2.1.Global commands...................|NERDTreeGlobalCommands| + 2.2.Bookmarks.........................|NERDTreeBookmarks| + 2.2.1.The bookmark table..........|NERDTreeBookmarkTable| + 2.2.2.Bookmark commands...........|NERDTreeBookmarkCommands| + 2.2.3.Invalid bookmarks...........|NERDTreeInvalidBookmarks| + 2.3.NERD tree mappings................|NERDTreeMappings| + 2.4.The NERD tree menu................|NERDTreeMenu| + 3.Options.................................|NERDTreeOptions| + 3.1.Option summary....................|NERDTreeOptionSummary| + 3.2.Option details....................|NERDTreeOptionDetails| + 4.The NERD tree API.......................|NERDTreeAPI| + 4.1.Key map API.......................|NERDTreeKeymapAPI| + 4.2.Menu API..........................|NERDTreeMenuAPI| + 5.About...................................|NERDTreeAbout| + 6.Changelog...............................|NERDTreeChangelog| + 7.Credits.................................|NERDTreeCredits| + 8.License.................................|NERDTreeLicense| + +============================================================================== +1. Intro *NERDTree* + +What is this "NERD tree"?? + +The NERD tree allows you to explore your filesystem and to open files and +directories. It presents the filesystem to you in the form of a tree which you +manipulate with the keyboard and/or mouse. It also allows you to perform +simple filesystem operations. + +The following features and functionality are provided by the NERD tree: + * Files and directories are displayed in a hierarchical tree structure + * Different highlighting is provided for the following types of nodes: + * files + * directories + * sym-links + * windows .lnk files + * read-only files + * executable files + * Many (customisable) mappings are provided to manipulate the tree: + * Mappings to open/close/explore directory nodes + * Mappings to open files in new/existing windows/tabs + * Mappings to change the current root of the tree + * Mappings to navigate around the tree + * ... + * Directories and files can be bookmarked. + * Most NERD tree navigation can also be done with the mouse + * Filtering of tree content (can be toggled at runtime) + * custom file filters to prevent e.g. vim backup files being displayed + * optional displaying of hidden files (. files) + * files can be "turned off" so that only directories are displayed + * The position and size of the NERD tree window can be customised + * The order in which the nodes in the tree are listed can be customised. + * A model of your filesystem is created/maintained as you explore it. This + has several advantages: + * All filesystem information is cached and is only re-read on demand + * If you revisit a part of the tree that you left earlier in your + session, the directory nodes will be opened/closed as you left them + * The script remembers the cursor position and window position in the NERD + tree so you can toggle it off (or just close the tree window) and then + reopen it (with NERDTreeToggle) the NERD tree window will appear exactly + as you left it + * You can have a separate NERD tree for each tab, share trees across tabs, + or a mix of both. + * By default the script overrides the default file browser (netw), so if + you :edit a directory a (slighly modified) NERD tree will appear in the + current window + * A programmable menu system is provided (simulates right clicking on a + node) + * one default menu plugin is provided to perform basic filesytem + operations (create/delete/move/copy files/directories) + * There's an API for adding your own keymappings + + +============================================================================== +2. Functionality provided *NERDTreeFunctionality* + +------------------------------------------------------------------------------ +2.1. Global Commands *NERDTreeGlobalCommands* + +:NERDTree [ | ] *:NERDTree* + Opens a fresh NERD tree. The root of the tree depends on the argument + given. There are 3 cases: If no argument is given, the current directory + will be used. If a directory is given, that will be used. If a bookmark + name is given, the corresponding directory will be used. For example: > + :NERDTree /home/marty/vim7/src + :NERDTree foo (foo is the name of a bookmark) +< +:NERDTreeFromBookmark *:NERDTreeFromBookmark* + Opens a fresh NERD tree with the root initialized to the dir for + . This only reason to use this command over :NERDTree is for + the completion (which is for bookmarks rather than directories). + +:NERDTreeToggle [ | ] *:NERDTreeToggle* + If a NERD tree already exists for this tab, it is reopened and rendered + again. If no NERD tree exists for this tab then this command acts the + same as the |:NERDTree| command. + +:NERDTreeMirror *:NERDTreeMirror* + Shares an existing NERD tree, from another tab, in the current tab. + Changes made to one tree are reflected in both as they are actually the + same buffer. + + If only one other NERD tree exists, that tree is automatically mirrored. If + more than one exists, the script will ask which tree to mirror. + +:NERDTreeClose *:NERDTreeClose* + Close the NERD tree in this tab. + +:NERDTreeFind *:NERDTreeFind* + Find the current file in the tree. + + If not tree exists and the current file is under vim's CWD, then init a + tree at the CWD and reveal the file. Otherwise init a tree in the current + file's directory. + + In any case, the current file is revealed and the cursor is placed on it. + +------------------------------------------------------------------------------ +2.2. Bookmarks *NERDTreeBookmarks* + +Bookmarks in the NERD tree are a way to tag files or directories of interest. +For example, you could use bookmarks to tag all of your project directories. + +------------------------------------------------------------------------------ +2.2.1. The Bookmark Table *NERDTreeBookmarkTable* + +If the bookmark table is active (see |NERDTree-B| and +|'NERDTreeShowBookmarks'|), it will be rendered above the tree. You can double +click bookmarks or use the |NERDTree-o| mapping to activate them. See also, +|NERDTree-t| and |NERDTree-T| + +------------------------------------------------------------------------------ +2.2.2. Bookmark commands *NERDTreeBookmarkCommands* + +Note that the following commands are only available in the NERD tree buffer. + +:Bookmark + Bookmark the current node as . If there is already a + bookmark, it is overwritten. must not contain spaces. + If is not provided, it defaults to the file or directory name. + For directories, a trailing slash is present. + +:BookmarkToRoot + Make the directory corresponding to the new root. If a treenode + corresponding to is already cached somewhere in the tree then + the current tree will be used, otherwise a fresh tree will be opened. + Note that if points to a file then its parent will be used + instead. + +:RevealBookmark + If the node is cached under the current root then it will be revealed + (i.e. directory nodes above it will be opened) and the cursor will be + placed on it. + +:OpenBookmark + must point to a file. The file is opened as though |NERDTree-o| + was applied. If the node is cached under the current root then it will be + revealed and the cursor will be placed on it. + +:ClearBookmarks [] + Remove all the given bookmarks. If no bookmarks are given then remove all + bookmarks on the current node. + +:ClearAllBookmarks + Remove all bookmarks. + +:ReadBookmarks + Re-read the bookmarks in the |'NERDTreeBookmarksFile'|. + +See also |:NERDTree| and |:NERDTreeFromBookmark|. + +------------------------------------------------------------------------------ +2.2.3. Invalid Bookmarks *NERDTreeInvalidBookmarks* + +If invalid bookmarks are detected, the script will issue an error message and +the invalid bookmarks will become unavailable for use. + +These bookmarks will still be stored in the bookmarks file (see +|'NERDTreeBookmarksFile'|), down the bottom. There will always be a blank line +after the valid bookmarks but before the invalid ones. + +Each line in the bookmarks file represents one bookmark. The proper format is: + + +After you have corrected any invalid bookmarks, either restart vim, or go +:ReadBookmarks from the NERD tree window. + +------------------------------------------------------------------------------ +2.3. NERD tree Mappings *NERDTreeMappings* + +Default Description~ help-tag~ +Key~ + +o.......Open files, directories and bookmarks....................|NERDTree-o| +go......Open selected file, but leave cursor in the NERDTree.....|NERDTree-go| +t.......Open selected node/bookmark in a new tab.................|NERDTree-t| +T.......Same as 't' but keep the focus on the current tab........|NERDTree-T| +i.......Open selected file in a split window.....................|NERDTree-i| +gi......Same as i, but leave the cursor on the NERDTree..........|NERDTree-gi| +s.......Open selected file in a new vsplit.......................|NERDTree-s| +gs......Same as s, but leave the cursor on the NERDTree..........|NERDTree-gs| +O.......Recursively open the selected directory..................|NERDTree-O| +x.......Close the current nodes parent...........................|NERDTree-x| +X.......Recursively close all children of the current node.......|NERDTree-X| +e.......Edit the current dif.....................................|NERDTree-e| + +...............same as |NERDTree-o|. +double-click.......same as the |NERDTree-o| map. +middle-click.......same as |NERDTree-i| for files, same as + |NERDTree-e| for dirs. + +D.......Delete the current bookmark .............................|NERDTree-D| + +P.......Jump to the root node....................................|NERDTree-P| +p.......Jump to current nodes parent.............................|NERDTree-p| +K.......Jump up inside directories at the current tree depth.....|NERDTree-K| +J.......Jump down inside directories at the current tree depth...|NERDTree-J| +...Jump down to the next sibling of the current directory...|NERDTree-C-J| +...Jump up to the previous sibling of the current directory.|NERDTree-C-K| + +C.......Change the tree root to the selected dir.................|NERDTree-C| +u.......Move the tree root up one directory......................|NERDTree-u| +U.......Same as 'u' except the old root node is left open........|NERDTree-U| +r.......Recursively refresh the current directory................|NERDTree-r| +R.......Recursively refresh the current root.....................|NERDTree-R| +m.......Display the NERD tree menu...............................|NERDTree-m| +cd......Change the CWD to the dir of the selected node...........|NERDTree-cd| + +I.......Toggle whether hidden files displayed....................|NERDTree-I| +f.......Toggle whether the file filters are used.................|NERDTree-f| +F.......Toggle whether files are displayed.......................|NERDTree-F| +B.......Toggle whether the bookmark table is displayed...........|NERDTree-B| + +q.......Close the NERDTree window................................|NERDTree-q| +A.......Zoom (maximize/minimize) the NERDTree window.............|NERDTree-A| +?.......Toggle the display of the quick help.....................|NERDTree-?| + +------------------------------------------------------------------------------ + *NERDTree-o* +Default key: o +Map option: NERDTreeMapActivateNode +Applies to: files and directories. + +If a file node is selected, it is opened in the previous window. + +If a directory is selected it is opened or closed depending on its current +state. + +If a bookmark that links to a directory is selected then that directory +becomes the new root. + +If a bookmark that links to a file is selected then that file is opened in the +previous window. + +------------------------------------------------------------------------------ + *NERDTree-go* +Default key: go +Map option: None +Applies to: files. + +If a file node is selected, it is opened in the previous window, but the +cursor does not move. + +The key combo for this mapping is always "g" + NERDTreeMapActivateNode (see +|NERDTree-o|). + +------------------------------------------------------------------------------ + *NERDTree-t* +Default key: t +Map option: NERDTreeMapOpenInTab +Applies to: files and directories. + +Opens the selected file in a new tab. If a directory is selected, a fresh +NERD Tree for that directory is opened in a new tab. + +If a bookmark which points to a directory is selected, open a NERD tree for +that directory in a new tab. If the bookmark points to a file, open that file +in a new tab. + +------------------------------------------------------------------------------ + *NERDTree-T* +Default key: T +Map option: NERDTreeMapOpenInTabSilent +Applies to: files and directories. + +The same as |NERDTree-t| except that the focus is kept in the current tab. + +------------------------------------------------------------------------------ + *NERDTree-i* +Default key: i +Map option: NERDTreeMapOpenSplit +Applies to: files. + +Opens the selected file in a new split window and puts the cursor in the new +window. + +------------------------------------------------------------------------------ + *NERDTree-gi* +Default key: gi +Map option: None +Applies to: files. + +The same as |NERDTree-i| except that the cursor is not moved. + +The key combo for this mapping is always "g" + NERDTreeMapOpenSplit (see +|NERDTree-i|). + +------------------------------------------------------------------------------ + *NERDTree-s* +Default key: s +Map option: NERDTreeMapOpenVSplit +Applies to: files. + +Opens the selected file in a new vertically split window and puts the cursor in +the new window. + +------------------------------------------------------------------------------ + *NERDTree-gs* +Default key: gs +Map option: None +Applies to: files. + +The same as |NERDTree-s| except that the cursor is not moved. + +The key combo for this mapping is always "g" + NERDTreeMapOpenVSplit (see +|NERDTree-s|). + +------------------------------------------------------------------------------ + *NERDTree-O* +Default key: O +Map option: NERDTreeMapOpenRecursively +Applies to: directories. + +Recursively opens the selelected directory. + +All files and directories are cached, but if a directory would not be +displayed due to file filters (see |'NERDTreeIgnore'| |NERDTree-f|) or the +hidden file filter (see |'NERDTreeShowHidden'|) then its contents are not +cached. This is handy, especially if you have .svn directories. + +------------------------------------------------------------------------------ + *NERDTree-x* +Default key: x +Map option: NERDTreeMapCloseDir +Applies to: files and directories. + +Closes the parent of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-X* +Default key: X +Map option: NERDTreeMapCloseChildren +Applies to: directories. + +Recursively closes all children of the selected directory. + +Tip: To quickly "reset" the tree, use |NERDTree-P| with this mapping. + +------------------------------------------------------------------------------ + *NERDTree-e* +Default key: e +Map option: NERDTreeMapOpenExpl +Applies to: files and directories. + +|:edit|s the selected directory, or the selected file's directory. This could +result in a NERD tree or a netrw being opened, depending on +|'NERDTreeHijackNetrw'|. + +------------------------------------------------------------------------------ + *NERDTree-D* +Default key: D +Map option: NERDTreeMapDeleteBookmark +Applies to: lines in the bookmarks table + +Deletes the currently selected bookmark. + +------------------------------------------------------------------------------ + *NERDTree-P* +Default key: P +Map option: NERDTreeMapJumpRoot +Applies to: no restrictions. + +Jump to the tree root. + +------------------------------------------------------------------------------ + *NERDTree-p* +Default key: p +Map option: NERDTreeMapJumpParent +Applies to: files and directories. + +Jump to the parent node of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-K* +Default key: K +Map option: NERDTreeMapJumpFirstChild +Applies to: files and directories. + +Jump to the first child of the current nodes parent. + +If the cursor is already on the first node then do the following: + * loop back thru the siblings of the current nodes parent until we find an + open dir with children + * go to the first child of that node + +------------------------------------------------------------------------------ + *NERDTree-J* +Default key: J +Map option: NERDTreeMapJumpLastChild +Applies to: files and directories. + +Jump to the last child of the current nodes parent. + +If the cursor is already on the last node then do the following: + * loop forward thru the siblings of the current nodes parent until we find + an open dir with children + * go to the last child of that node + +------------------------------------------------------------------------------ + *NERDTree-C-J* +Default key: +Map option: NERDTreeMapJumpNextSibling +Applies to: files and directories. + +Jump to the next sibling of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-C-K* +Default key: +Map option: NERDTreeMapJumpPrevSibling +Applies to: files and directories. + +Jump to the previous sibling of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-C* +Default key: C +Map option: NERDTreeMapChdir +Applies to: directories. + +Make the selected directory node the new tree root. If a file is selected, its +parent is used. + +------------------------------------------------------------------------------ + *NERDTree-u* +Default key: u +Map option: NERDTreeMapUpdir +Applies to: no restrictions. + +Move the tree root up a dir (like doing a "cd .."). + +------------------------------------------------------------------------------ + *NERDTree-U* +Default key: U +Map option: NERDTreeMapUpdirKeepOpen +Applies to: no restrictions. + +Like |NERDTree-u| except that the old tree root is kept open. + +------------------------------------------------------------------------------ + *NERDTree-r* +Default key: r +Map option: NERDTreeMapRefresh +Applies to: files and directories. + +If a dir is selected, recursively refresh that dir, i.e. scan the filesystem +for changes and represent them in the tree. + +If a file node is selected then the above is done on it's parent. + +------------------------------------------------------------------------------ + *NERDTree-R* +Default key: R +Map option: NERDTreeMapRefreshRoot +Applies to: no restrictions. + +Recursively refresh the tree root. + +------------------------------------------------------------------------------ + *NERDTree-m* +Default key: m +Map option: NERDTreeMapMenu +Applies to: files and directories. + +Display the NERD tree menu. See |NERDTreeMenu| for details. + +------------------------------------------------------------------------------ + *NERDTree-cd* +Default key: cd +Map option: NERDTreeMapChdir +Applies to: files and directories. + +Change vims current working directory to that of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-I* +Default key: I +Map option: NERDTreeMapToggleHidden +Applies to: no restrictions. + +Toggles whether hidden files (i.e. "dot files") are displayed. + +------------------------------------------------------------------------------ + *NERDTree-f* +Default key: f +Map option: NERDTreeMapToggleFilters +Applies to: no restrictions. + +Toggles whether file filters are used. See |'NERDTreeIgnore'| for details. + +------------------------------------------------------------------------------ + *NERDTree-F* +Default key: F +Map option: NERDTreeMapToggleFiles +Applies to: no restrictions. + +Toggles whether file nodes are displayed. + +------------------------------------------------------------------------------ + *NERDTree-B* +Default key: B +Map option: NERDTreeMapToggleBookmarks +Applies to: no restrictions. + +Toggles whether the bookmarks table is displayed. + +------------------------------------------------------------------------------ + *NERDTree-q* +Default key: q +Map option: NERDTreeMapQuit +Applies to: no restrictions. + +Closes the NERDtree window. + +------------------------------------------------------------------------------ + *NERDTree-A* +Default key: A +Map option: NERDTreeMapToggleZoom +Applies to: no restrictions. + +Maximize (zoom) and minimize the NERDtree window. + +------------------------------------------------------------------------------ + *NERDTree-?* +Default key: ? +Map option: NERDTreeMapHelp +Applies to: no restrictions. + +Toggles whether the quickhelp is displayed. + +------------------------------------------------------------------------------ +2.3. The NERD tree menu *NERDTreeMenu* + +The NERD tree has a menu that can be programmed via the an API (see +|NERDTreeMenuAPI|). The idea is to simulate the "right click" menus that most +file explorers have. + +The script comes with two default menu plugins: exec_menuitem.vim and +fs_menu.vim. fs_menu.vim adds some basic filesystem operations to the menu for +creating/deleting/moving/copying files and dirs. exec_menuitem.vim provides a +menu item to execute executable files. + +Related tags: |NERDTree-m| |NERDTreeApi| + +============================================================================== +3. Customisation *NERDTreeOptions* + + +------------------------------------------------------------------------------ +3.1. Customisation summary *NERDTreeOptionSummary* + +The script provides the following options that can customise the behaviour the +NERD tree. These options should be set in your vimrc. + +|'loaded_nerd_tree'| Turns off the script. + +|'NERDChristmasTree'| Tells the NERD tree to make itself colourful + and pretty. + +|'NERDTreeAutoCenter'| Controls whether the NERD tree window centers + when the cursor moves within a specified + distance to the top/bottom of the window. +|'NERDTreeAutoCenterThreshold'| Controls the sensitivity of autocentering. + +|'NERDTreeCaseSensitiveSort'| Tells the NERD tree whether to be case + sensitive or not when sorting nodes. + +|'NERDTreeChDirMode'| Tells the NERD tree if/when it should change + vim's current working directory. + +|'NERDTreeHighlightCursorline'| Tell the NERD tree whether to highlight the + current cursor line. + +|'NERDTreeHijackNetrw'| Tell the NERD tree whether to replace the netrw + autocommands for exploring local directories. + +|'NERDTreeIgnore'| Tells the NERD tree which files to ignore. + +|'NERDTreeBookmarksFile'| Where the bookmarks are stored. + +|'NERDTreeMouseMode'| Tells the NERD tree how to handle mouse + clicks. + +|'NERDTreeQuitOnOpen'| Closes the tree window after opening a file. + +|'NERDTreeShowBookmarks'| Tells the NERD tree whether to display the + bookmarks table on startup. + +|'NERDTreeShowFiles'| Tells the NERD tree whether to display files + in the tree on startup. + +|'NERDTreeShowHidden'| Tells the NERD tree whether to display hidden + files on startup. + +|'NERDTreeShowLineNumbers'| Tells the NERD tree whether to display line + numbers in the tree window. + +|'NERDTreeSortOrder'| Tell the NERD tree how to sort the nodes in + the tree. + +|'NERDTreeStatusline'| Set a statusline for NERD tree windows. + +|'NERDTreeWinPos'| Tells the script where to put the NERD tree + window. + +|'NERDTreeWinSize'| Sets the window size when the NERD tree is + opened. + +|'NERDTreeMinimalUI'| Disables display of the 'Bookmarks' label and + 'Press ? for help' text. + +|'NERDTreeDirArrows'| Tells the NERD tree to use arrows instead of + + ~ chars when displaying directories. + +------------------------------------------------------------------------------ +3.2. Customisation details *NERDTreeOptionDetails* + +To enable any of the below options you should put the given line in your +~/.vimrc + + *'loaded_nerd_tree'* +If this plugin is making you feel homicidal, it may be a good idea to turn it +off with this line in your vimrc: > + let loaded_nerd_tree=1 +< +------------------------------------------------------------------------------ + *'NERDChristmasTree'* +Values: 0 or 1. +Default: 1. + +If this option is set to 1 then some extra syntax highlighting elements are +added to the nerd tree to make it more colourful. + +Set it to 0 for a more vanilla looking tree. + +------------------------------------------------------------------------------ + *'NERDTreeAutoCenter'* +Values: 0 or 1. +Default: 1 + +If set to 1, the NERD tree window will center around the cursor if it moves to +within |'NERDTreeAutoCenterThreshold'| lines of the top/bottom of the window. + +This is ONLY done in response to tree navigation mappings, +i.e. |NERDTree-J| |NERDTree-K| |NERDTree-C-J| |NERDTree-C-K| |NERDTree-p| +|NERDTree-P| + +The centering is done with a |zz| operation. + +------------------------------------------------------------------------------ + *'NERDTreeAutoCenterThreshold'* +Values: Any natural number. +Default: 3 + +This option controls the "sensitivity" of the NERD tree auto centering. See +|'NERDTreeAutoCenter'| for details. + +------------------------------------------------------------------------------ + *'NERDTreeCaseSensitiveSort'* +Values: 0 or 1. +Default: 0. + +By default the NERD tree does not sort nodes case sensitively, i.e. nodes +could appear like this: > + bar.c + Baz.c + blarg.c + boner.c + Foo.c +< +But, if you set this option to 1 then the case of the nodes will be taken into +account. The above nodes would then be sorted like this: > + Baz.c + Foo.c + bar.c + blarg.c + boner.c +< +------------------------------------------------------------------------------ + *'NERDTreeChDirMode'* + +Values: 0, 1 or 2. +Default: 0. + +Use this option to tell the script when (if at all) to change the current +working directory (CWD) for vim. + +If it is set to 0 then the CWD is never changed by the NERD tree. + +If set to 1 then the CWD is changed when the NERD tree is first loaded to the +directory it is initialized in. For example, if you start the NERD tree with > + :NERDTree /home/marty/foobar +< +then the CWD will be changed to /home/marty/foobar and will not be changed +again unless you init another NERD tree with a similar command. + +If the option is set to 2 then it behaves the same as if set to 1 except that +the CWD is changed whenever the tree root is changed. For example, if the CWD +is /home/marty/foobar and you make the node for /home/marty/foobar/baz the new +root then the CWD will become /home/marty/foobar/baz. + +------------------------------------------------------------------------------ + *'NERDTreeHighlightCursorline'* +Values: 0 or 1. +Default: 1. + +If set to 1, the current cursor line in the NERD tree buffer will be +highlighted. This is done using the |'cursorline'| option. + +------------------------------------------------------------------------------ + *'NERDTreeHijackNetrw'* +Values: 0 or 1. +Default: 1. + +If set to 1, doing a > + :edit +< +will open up a "secondary" NERD tree instead of a netrw in the target window. + +Secondary NERD trees behaves slighly different from a regular trees in the +following respects: + 1. 'o' will open the selected file in the same window as the tree, + replacing it. + 2. you can have as many secondary tree as you want in the same tab. + +------------------------------------------------------------------------------ + *'NERDTreeIgnore'* +Values: a list of regular expressions. +Default: ['\~$']. + +This option is used to specify which files the NERD tree should ignore. It +must be a list of regular expressions. When the NERD tree is rendered, any +files/dirs that match any of the regex's in 'NERDTreeIgnore' wont be +displayed. + +For example if you put the following line in your vimrc: > + let NERDTreeIgnore=['\.vim$', '\~$'] +< +then all files ending in .vim or ~ will be ignored. + +Note: to tell the NERD tree not to ignore any files you must use the following +line: > + let NERDTreeIgnore=[] +< + +The file filters can be turned on and off dynamically with the |NERDTree-f| +mapping. + +------------------------------------------------------------------------------ + *'NERDTreeBookmarksFile'* +Values: a path +Default: $HOME/.NERDTreeBookmarks + +This is where bookmarks are saved. See |NERDTreeBookmarkCommands|. + +------------------------------------------------------------------------------ + *'NERDTreeMouseMode'* +Values: 1, 2 or 3. +Default: 1. + +If set to 1 then a double click on a node is required to open it. +If set to 2 then a single click will open directory nodes, while a double +click will still be required for file nodes. +If set to 3 then a single click will open any node. + +Note: a double click anywhere on a line that a tree node is on will +activate it, but all single-click activations must be done on name of the node +itself. For example, if you have the following node: > + | | |-application.rb +< +then (to single click activate it) you must click somewhere in +'application.rb'. + +------------------------------------------------------------------------------ + *'NERDTreeQuitOnOpen'* + +Values: 0 or 1. +Default: 0 + +If set to 1, the NERD tree window will close after opening a file with the +|NERDTree-o|, |NERDTree-i|, |NERDTree-t| and |NERDTree-T| mappings. + +------------------------------------------------------------------------------ + *'NERDTreeShowBookmarks'* +Values: 0 or 1. +Default: 0. + +If this option is set to 1 then the bookmarks table will be displayed. + +This option can be toggled dynamically, per tree, with the |NERDTree-B| +mapping. + +------------------------------------------------------------------------------ + *'NERDTreeShowFiles'* +Values: 0 or 1. +Default: 1. + +If this option is set to 1 then files are displayed in the NERD tree. If it is +set to 0 then only directories are displayed. + +This option can be toggled dynamically, per tree, with the |NERDTree-F| +mapping and is useful for drastically shrinking the tree when you are +navigating to a different part of the tree. + +------------------------------------------------------------------------------ + *'NERDTreeShowHidden'* +Values: 0 or 1. +Default: 0. + +This option tells vim whether to display hidden files by default. This option +can be dynamically toggled, per tree, with the |NERDTree-I| mapping. Use one +of the follow lines to set this option: > + let NERDTreeShowHidden=0 + let NERDTreeShowHidden=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeShowLineNumbers'* +Values: 0 or 1. +Default: 0. + +This option tells vim whether to display line numbers for the NERD tree +window. Use one of the follow lines to set this option: > + let NERDTreeShowLineNumbers=0 + let NERDTreeShowLineNumbers=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeSortOrder'* +Values: a list of regular expressions. +Default: ['\/$', '*', '\.swp$', '\.bak$', '\~$'] + +This option is set to a list of regular expressions which are used to +specify the order of nodes under their parent. + +For example, if the option is set to: > + ['\.vim$', '\.c$', '\.h$', '*', 'foobar'] +< +then all .vim files will be placed at the top, followed by all .c files then +all .h files. All files containing the string 'foobar' will be placed at the +end. The star is a special flag: it tells the script that every node that +doesnt match any of the other regexps should be placed here. + +If no star is present in 'NERDTreeSortOrder' then one is automatically +appended to the array. + +The regex '\/$' should be used to match directory nodes. + +After this sorting is done, the files in each group are sorted alphabetically. + +Other examples: > + (1) ['*', '\/$'] + (2) [] + (3) ['\/$', '\.rb$', '\.php$', '*', '\.swp$', '\.bak$', '\~$'] +< +1. Directories will appear last, everything else will appear above. +2. Everything will simply appear in alphabetical order. +3. Dirs will appear first, then ruby and php. Swap files, bak files and vim + backup files will appear last with everything else preceding them. + +------------------------------------------------------------------------------ + *'NERDTreeStatusline'* +Values: Any valid statusline setting. +Default: %{b:NERDTreeRoot.path.strForOS(0)} + +Tells the script what to use as the |'statusline'| setting for NERD tree +windows. + +Note that the statusline is set using |:let-&| not |:set| so escaping spaces +isn't necessary. + +Setting this option to -1 will will deactivate it so that your global +statusline setting is used instead. + +------------------------------------------------------------------------------ + *'NERDTreeWinPos'* +Values: "left" or "right" +Default: "left". + +This option is used to determine where NERD tree window is placed on the +screen. + +This option makes it possible to use two different explorer plugins +simultaneously. For example, you could have the taglist plugin on the left of +the window and the NERD tree on the right. + +------------------------------------------------------------------------------ + *'NERDTreeWinSize'* +Values: a positive integer. +Default: 31. + +This option is used to change the size of the NERD tree when it is loaded. + +------------------------------------------------------------------------------ + *'NERDTreeMinimalUI'* +Values: 0 or 1 +Default: 0 + +This options disables the 'Bookmarks' label 'Press ? for help' text. Use one +of the following lines to set this option: > + let NERDTreeMinimalUI=0 + let NERDTreeMinimalUI=1 +< + +------------------------------------------------------------------------------ + *'NERDTreeDirArrows'* +Values: 0 or 1 +Default: 0. + +This option is used to change the default look of directory nodes displayed in +the tree. When set to 0 it shows old-school bars (|), + and ~ chars. If set to +1 it shows right and down arrows. Use one of the follow lines to set this +option: > + let NERDTreeDirArrows=0 + let NERDTreeDirArrows=1 +< + +============================================================================== +4. The NERD tree API *NERDTreeAPI* + +The NERD tree script allows you to add custom key mappings and menu items via +a set of API calls. Any scripts that use this API should be placed in +~/.vim/nerdtree_plugin/ (*nix) or ~/vimfiles/nerdtree_plugin (windows). + +The script exposes some prototype objects that can be used to manipulate the +tree and/or get information from it: > + g:NERDTreePath + g:NERDTreeDirNode + g:NERDTreeFileNode + g:NERDTreeBookmark +< +See the code/comments in NERD_tree.vim to find how to use these objects. The +following code conventions are used: + * class members start with a capital letter + * instance members start with a lower case letter + * private members start with an underscore + +See this blog post for more details: + http://got-ravings.blogspot.com/2008/09/vim-pr0n-prototype-based-objects.html + +------------------------------------------------------------------------------ +4.1. Key map API *NERDTreeKeymapAPI* + +NERDTreeAddKeyMap({options}) *NERDTreeAddKeyMap()* + Adds a new keymapping for all NERD tree buffers. + {options} must be a dictionary, and must contain the following keys: + "key" - the trigger key for the new mapping + "callback" - the function the new mapping will be bound to + "quickhelpText" - the text that will appear in the quickhelp (see + |NERDTree-?|) + + Example: > + call NERDTreeAddKeyMap({ + \ 'key': 'b', + \ 'callback': 'NERDTreeEchoCurrentNode', + \ 'quickhelpText': 'echo full path of current node' }) + + function! NERDTreeEchoCurrentNode() + let n = g:NERDTreeFileNode.GetSelected() + if n != {} + echomsg 'Current node: ' . n.path.str() + endif + endfunction +< + This code should sit in a file like ~/.vim/nerdtree_plugin/mymapping.vim. + It adds a (rather useless) mapping on 'b' which echos the full path to the + current node. + +------------------------------------------------------------------------------ +4.2. Menu API *NERDTreeMenuAPI* + +NERDTreeAddSubmenu({options}) *NERDTreeAddSubmenu()* + Creates and returns a new submenu. + + {options} must be a dictionary and must contain the following keys: + "text" - the text of the submenu that the user will see + "shortcut" - a shortcut key for the submenu (need not be unique) + + The following keys are optional: + "isActiveCallback" - a function that will be called to determine whether + this submenu item will be displayed or not. The callback function must return + 0 or 1. + "parent" - the parent submenu of the new submenu (returned from a previous + invocation of NERDTreeAddSubmenu()). If this key is left out then the new + submenu will sit under the top level menu. + + See below for an example. + +NERDTreeAddMenuItem({options}) *NERDTreeAddMenuItem()* + Adds a new menu item to the NERD tree menu (see |NERDTreeMenu|). + + {options} must be a dictionary and must contain the + following keys: + "text" - the text of the menu item which the user will see + "shortcut" - a shortcut key for the menu item (need not be unique) + "callback" - the function that will be called when the user activates the + menu item. + + The following keys are optional: + "isActiveCallback" - a function that will be called to determine whether + this menu item will be displayed or not. The callback function must return + 0 or 1. + "parent" - if the menu item belongs under a submenu then this key must be + specified. This value for this key will be the object that + was returned when the submenu was created with |NERDTreeAddSubmenu()|. + + See below for an example. + +NERDTreeAddMenuSeparator([{options}]) *NERDTreeAddMenuSeparator()* + Adds a menu separator (a row of dashes). + + {options} is an optional dictionary that may contain the following keys: + "isActiveCallback" - see description in |NERDTreeAddMenuItem()|. + +Below is an example of the menu API in action. > + call NERDTreeAddMenuSeparator() + + call NERDTreeAddMenuItem({ + \ 'text': 'a (t)op level menu item', + \ 'shortcut': 't', + \ 'callback': 'SomeFunction' }) + + let submenu = NERDTreeAddSubmenu({ + \ 'text': 'a (s)ub menu', + \ 'shortcut': 's' }) + + call NERDTreeAddMenuItem({ + \ 'text': '(n)ested item 1', + \ 'shortcut': 'n', + \ 'callback': 'SomeFunction', + \ 'parent': submenu }) + + call NERDTreeAddMenuItem({ + \ 'text': '(n)ested item 2', + \ 'shortcut': 'n', + \ 'callback': 'SomeFunction', + \ 'parent': submenu }) +< +This will create the following menu: > + -------------------- + a (t)op level menu item + a (s)ub menu +< +Where selecting "a (s)ub menu" will lead to a second menu: > + (n)ested item 1 + (n)ested item 2 +< +When any of the 3 concrete menu items are selected the function "SomeFunction" +will be called. + +------------------------------------------------------------------------------ +NERDTreeRender() *NERDTreeRender()* + Re-renders the NERD tree buffer. Useful if you change the state of the + tree and you want to it to be reflected in the UI. + +============================================================================== +5. About *NERDTreeAbout* + +The author of the NERD tree is a terrible terrible monster called Martyzilla +who gobbles up small children with milk and sugar for breakfast. + +He can be reached at martin.grenfell at gmail dot com. He would love to hear +from you, so feel free to send him suggestions and/or comments about this +plugin. Don't be shy --- the worst he can do is slaughter you and stuff you in +the fridge for later ;) + +The latest stable versions can be found at + http://www.vim.org/scripts/script.php?script_id=1658 + +The latest dev versions are on github + http://github.com/scrooloose/nerdtree + + +============================================================================== +6. Changelog *NERDTreeChangelog* + +4.2.0 + - Add NERDTreeDirArrows option to make the UI use pretty arrow chars + instead of the old +~| chars to define the tree structure (sickill) + - shift the syntax highlighting out into its own syntax file (gnap) + - add some mac specific options to the filesystem menu - for macvim + only (andersonfreitas) + - Add NERDTreeMinimalUI option to remove some non functional parts of the + nerdtree ui (camthompson) + - tweak the behaviour of :NERDTreeFind - see :help :NERDTreeFind for the + new behaviour (benjamingeiger) + - if no name is given to :Bookmark, make it default to the name of the + target file/dir (minyoung) + - use 'file' completion when doing copying, create, and move + operations (EvanDotPro) + - lots of misc bug fixes (paddyoloughlin, sdewald, camthompson, Vitaly + Bogdanov, AndrewRadev, mathias, scottstvnsn, kml, wycats, me RAWR!) + +4.1.0 + features: + - NERDTreeFind to reveal the node for the current buffer in the tree, + see |NERDTreeFind|. This effectively merges the FindInNERDTree plugin (by + Doug McInnes) into the script. + - make NERDTreeQuitOnOpen apply to the t/T keymaps too. Thanks to Stefan + Ritter and Rémi Prévost. + - truncate the root node if wider than the tree window. Thanks to Victor + Gonzalez. + + bugfixes: + - really fix window state restoring + - fix some win32 path escaping issues. Thanks to Stephan Baumeister, Ricky, + jfilip1024, and Chris Chambers + +4.0.0 + - add a new programmable menu system (see :help NERDTreeMenu). + - add new APIs to add menus/menu-items to the menu system as well as + custom key mappings to the NERD tree buffer (see :help NERDTreeAPI). + - removed the old API functions + - added a mapping to maximize/restore the size of nerd tree window, thanks + to Guillaume Duranceau for the patch. See :help NERDTree-A for details. + + - fix a bug where secondary nerd trees (netrw hijacked trees) and + NERDTreeQuitOnOpen didnt play nicely, thanks to Curtis Harvey. + - fix a bug where the script ignored directories whose name ended in a dot, + thanks to Aggelos Orfanakos for the patch. + - fix a bug when using the x mapping on the tree root, thanks to Bryan + Venteicher for the patch. + - fix a bug where the cursor position/window size of the nerd tree buffer + wasnt being stored on closing the window, thanks to Richard Hart. + - fix a bug where NERDTreeMirror would mirror the wrong tree + +3.1.1 + - fix a bug where a non-listed no-name buffer was getting created every + time the tree windows was created, thanks to Derek Wyatt and owen1 + - make behave the same as the 'o' mapping + - some helptag fixes in the doc, thanks strull + - fix a bug when using :set nohidden and opening a file where the previous + buf was modified. Thanks iElectric + - other minor fixes + +3.1.0 + New features: + - add mappings to open files in a vsplit, see :help NERDTree-s and :help + NERDTree-gs + - make the statusline for the nerd tree window default to something + hopefully more useful. See :help 'NERDTreeStatusline' + Bugfixes: + - make the hijack netrw functionality work when vim is started with "vim + " (thanks to Alf Mikula for the patch). + - fix a bug where the CWD wasnt being changed for some operations even when + NERDTreeChDirMode==2 (thanks to Lucas S. Buchala) + - add -bar to all the nerd tree :commands so they can chain with other + :commands (thanks to tpope) + - fix bugs when ignorecase was set (thanks to nach) + - fix a bug with the relative path code (thanks to nach) + - fix a bug where doing a :cd would cause :NERDTreeToggle to fail (thanks nach) + + +3.0.1 + Bugfixes: + - fix bugs with :NERDTreeToggle and :NERDTreeMirror when 'hidden + was not set + - fix a bug where :NERDTree would fail if was relative and + didnt start with a ./ or ../ Thanks to James Kanze. + - make the q mapping work with secondary (:e style) trees, + thanks to jamessan + - fix a bunch of small bugs with secondary trees + + More insane refactoring. + +3.0.0 + - hijack netrw so that doing an :edit will put a NERD tree in + the window rather than a netrw browser. See :help 'NERDTreeHijackNetrw' + - allow sharing of trees across tabs, see :help :NERDTreeMirror + - remove "top" and "bottom" as valid settings for NERDTreeWinPos + - change the '' mapping to 'i' + - change the 'H' mapping to 'I' + - lots of refactoring + +============================================================================== +7. Credits *NERDTreeCredits* + +Thanks to the following people for testing, bug reports, ideas etc. Without +you I probably would have got bored of the hacking the NERD tree and +just downloaded pr0n instead. + + Tim Carey-Smith (halorgium) + Vigil + Nick Brettell + Thomas Scott Urban + Terrance Cohen + Yegappan Lakshmanan + Jason Mills + Michael Geddes (frogonwheels) + Yu Jun + Michael Madsen + AOYAMA Shotaro + Zhang Weiwu + Niels Aan de Brugh + Olivier Yiptong + Zhang Shuhan + Cory Echols + Piotr Czachur + Yuan Jiang + Matan Nassau + Maxim Kim + Charlton Wang + Matt Wozniski (godlygeek) + knekk + Sean Chou + Ryan Penn + Simon Peter Nicholls + Michael Foobar + Tomasz Chomiuk + Denis Pokataev + Tim Pope (tpope) + James Kanze + James Vega (jamessan) + Frederic Chanal (nach) + Alf Mikula + Lucas S. Buchala + Curtis Harvey + Guillaume Duranceau + Richard Hart (hates) + Doug McInnes + Stefan Ritter + Rémi Prévost + Victor Gonzalez + Stephan Baumeister + Ricky + jfilip1024 + Chris Chambers + Vitaly Bogdanov + Patrick O'Loughlin (paddyoloughlin) + Cam Thompson (camthompson) + Marcin Kulik (sickill) + Steve DeWald (sdewald) + Ivan Necas (iNecas) + George Ang (gnap) + Evan Coury (EvanDotPro) + Andrew Radev (AndrewRadev) + Matt Gauger (mathias) + Scott Stevenson (scottstvnsn) + Anderson Freitas (andersonfreitas) + Kamil K. Lemański (kml) + Yehuda Katz (wycats) + Min-Young Wu (minyoung) + Benjamin Geiger (benjamingeiger) + +============================================================================== +8. License *NERDTreeLicense* + +The NERD tree is released under the wtfpl. +See http://sam.zoy.org/wtfpl/COPYING. diff --git a/vim/bundle/The-NERD-Tree/doc/tags b/vim/bundle/The-NERD-Tree/doc/tags new file mode 100644 index 0000000..05801fc --- /dev/null +++ b/vim/bundle/The-NERD-Tree/doc/tags @@ -0,0 +1,87 @@ +'NERDChristmasTree' NERD_tree.txt /*'NERDChristmasTree'* +'NERDTreeAutoCenter' NERD_tree.txt /*'NERDTreeAutoCenter'* +'NERDTreeAutoCenterThreshold' NERD_tree.txt /*'NERDTreeAutoCenterThreshold'* +'NERDTreeBookmarksFile' NERD_tree.txt /*'NERDTreeBookmarksFile'* +'NERDTreeCaseSensitiveSort' NERD_tree.txt /*'NERDTreeCaseSensitiveSort'* +'NERDTreeChDirMode' NERD_tree.txt /*'NERDTreeChDirMode'* +'NERDTreeDirArrows' NERD_tree.txt /*'NERDTreeDirArrows'* +'NERDTreeHighlightCursorline' NERD_tree.txt /*'NERDTreeHighlightCursorline'* +'NERDTreeHijackNetrw' NERD_tree.txt /*'NERDTreeHijackNetrw'* +'NERDTreeIgnore' NERD_tree.txt /*'NERDTreeIgnore'* +'NERDTreeMinimalUI' NERD_tree.txt /*'NERDTreeMinimalUI'* +'NERDTreeMouseMode' NERD_tree.txt /*'NERDTreeMouseMode'* +'NERDTreeQuitOnOpen' NERD_tree.txt /*'NERDTreeQuitOnOpen'* +'NERDTreeShowBookmarks' NERD_tree.txt /*'NERDTreeShowBookmarks'* +'NERDTreeShowFiles' NERD_tree.txt /*'NERDTreeShowFiles'* +'NERDTreeShowHidden' NERD_tree.txt /*'NERDTreeShowHidden'* +'NERDTreeShowLineNumbers' NERD_tree.txt /*'NERDTreeShowLineNumbers'* +'NERDTreeSortOrder' NERD_tree.txt /*'NERDTreeSortOrder'* +'NERDTreeStatusline' NERD_tree.txt /*'NERDTreeStatusline'* +'NERDTreeWinPos' NERD_tree.txt /*'NERDTreeWinPos'* +'NERDTreeWinSize' NERD_tree.txt /*'NERDTreeWinSize'* +'loaded_nerd_tree' NERD_tree.txt /*'loaded_nerd_tree'* +:NERDTree NERD_tree.txt /*:NERDTree* +:NERDTreeClose NERD_tree.txt /*:NERDTreeClose* +:NERDTreeFind NERD_tree.txt /*:NERDTreeFind* +:NERDTreeFromBookmark NERD_tree.txt /*:NERDTreeFromBookmark* +:NERDTreeMirror NERD_tree.txt /*:NERDTreeMirror* +:NERDTreeToggle NERD_tree.txt /*:NERDTreeToggle* +NERDTree NERD_tree.txt /*NERDTree* +NERDTree-? NERD_tree.txt /*NERDTree-?* +NERDTree-A NERD_tree.txt /*NERDTree-A* +NERDTree-B NERD_tree.txt /*NERDTree-B* +NERDTree-C NERD_tree.txt /*NERDTree-C* +NERDTree-C-J NERD_tree.txt /*NERDTree-C-J* +NERDTree-C-K NERD_tree.txt /*NERDTree-C-K* +NERDTree-D NERD_tree.txt /*NERDTree-D* +NERDTree-F NERD_tree.txt /*NERDTree-F* +NERDTree-I NERD_tree.txt /*NERDTree-I* +NERDTree-J NERD_tree.txt /*NERDTree-J* +NERDTree-K NERD_tree.txt /*NERDTree-K* +NERDTree-O NERD_tree.txt /*NERDTree-O* +NERDTree-P NERD_tree.txt /*NERDTree-P* +NERDTree-R NERD_tree.txt /*NERDTree-R* +NERDTree-T NERD_tree.txt /*NERDTree-T* +NERDTree-U NERD_tree.txt /*NERDTree-U* +NERDTree-X NERD_tree.txt /*NERDTree-X* +NERDTree-cd NERD_tree.txt /*NERDTree-cd* +NERDTree-contents NERD_tree.txt /*NERDTree-contents* +NERDTree-e NERD_tree.txt /*NERDTree-e* +NERDTree-f NERD_tree.txt /*NERDTree-f* +NERDTree-gi NERD_tree.txt /*NERDTree-gi* +NERDTree-go NERD_tree.txt /*NERDTree-go* +NERDTree-gs NERD_tree.txt /*NERDTree-gs* +NERDTree-i NERD_tree.txt /*NERDTree-i* +NERDTree-m NERD_tree.txt /*NERDTree-m* +NERDTree-o NERD_tree.txt /*NERDTree-o* +NERDTree-p NERD_tree.txt /*NERDTree-p* +NERDTree-q NERD_tree.txt /*NERDTree-q* +NERDTree-r NERD_tree.txt /*NERDTree-r* +NERDTree-s NERD_tree.txt /*NERDTree-s* +NERDTree-t NERD_tree.txt /*NERDTree-t* +NERDTree-u NERD_tree.txt /*NERDTree-u* +NERDTree-x NERD_tree.txt /*NERDTree-x* +NERDTreeAPI NERD_tree.txt /*NERDTreeAPI* +NERDTreeAbout NERD_tree.txt /*NERDTreeAbout* +NERDTreeAddKeyMap() NERD_tree.txt /*NERDTreeAddKeyMap()* +NERDTreeAddMenuItem() NERD_tree.txt /*NERDTreeAddMenuItem()* +NERDTreeAddMenuSeparator() NERD_tree.txt /*NERDTreeAddMenuSeparator()* +NERDTreeAddSubmenu() NERD_tree.txt /*NERDTreeAddSubmenu()* +NERDTreeBookmarkCommands NERD_tree.txt /*NERDTreeBookmarkCommands* +NERDTreeBookmarkTable NERD_tree.txt /*NERDTreeBookmarkTable* +NERDTreeBookmarks NERD_tree.txt /*NERDTreeBookmarks* +NERDTreeChangelog NERD_tree.txt /*NERDTreeChangelog* +NERDTreeCredits NERD_tree.txt /*NERDTreeCredits* +NERDTreeFunctionality NERD_tree.txt /*NERDTreeFunctionality* +NERDTreeGlobalCommands NERD_tree.txt /*NERDTreeGlobalCommands* +NERDTreeInvalidBookmarks NERD_tree.txt /*NERDTreeInvalidBookmarks* +NERDTreeKeymapAPI NERD_tree.txt /*NERDTreeKeymapAPI* +NERDTreeLicense NERD_tree.txt /*NERDTreeLicense* +NERDTreeMappings NERD_tree.txt /*NERDTreeMappings* +NERDTreeMenu NERD_tree.txt /*NERDTreeMenu* +NERDTreeMenuAPI NERD_tree.txt /*NERDTreeMenuAPI* +NERDTreeOptionDetails NERD_tree.txt /*NERDTreeOptionDetails* +NERDTreeOptionSummary NERD_tree.txt /*NERDTreeOptionSummary* +NERDTreeOptions NERD_tree.txt /*NERDTreeOptions* +NERDTreeRender() NERD_tree.txt /*NERDTreeRender()* +NERD_tree.txt NERD_tree.txt /*NERD_tree.txt* diff --git a/vim/bundle/The-NERD-Tree/nerdtree_plugin/exec_menuitem.vim b/vim/bundle/The-NERD-Tree/nerdtree_plugin/exec_menuitem.vim new file mode 100644 index 0000000..e7a7c53 --- /dev/null +++ b/vim/bundle/The-NERD-Tree/nerdtree_plugin/exec_menuitem.vim @@ -0,0 +1,41 @@ +" ============================================================================ +" File: exec_menuitem.vim +" Description: plugin for NERD Tree that provides an execute file menu item +" Maintainer: Martin Grenfell +" Last Change: 22 July, 2009 +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +" ============================================================================ +if exists("g:loaded_nerdtree_exec_menuitem") + finish +endif +let g:loaded_nerdtree_exec_menuitem = 1 + +call NERDTreeAddMenuItem({ + \ 'text': '(!)Execute file', + \ 'shortcut': '!', + \ 'callback': 'NERDTreeExecFile', + \ 'isActiveCallback': 'NERDTreeExecFileActive' }) + +function! NERDTreeExecFileActive() + let node = g:NERDTreeFileNode.GetSelected() + return !node.path.isDirectory && node.path.isExecutable +endfunction + +function! NERDTreeExecFile() + let treenode = g:NERDTreeFileNode.GetSelected() + echo "==========================================================\n" + echo "Complete the command to execute (add arguments etc):\n" + let cmd = treenode.path.str({'escape': 1}) + let cmd = input(':!', cmd . ' ') + + if cmd != '' + exec ':!' . cmd + else + echo "Aborted" + endif +endfunction diff --git a/vim/bundle/The-NERD-Tree/nerdtree_plugin/fs_menu.vim b/vim/bundle/The-NERD-Tree/nerdtree_plugin/fs_menu.vim new file mode 100644 index 0000000..0e2f728 --- /dev/null +++ b/vim/bundle/The-NERD-Tree/nerdtree_plugin/fs_menu.vim @@ -0,0 +1,224 @@ +" ============================================================================ +" File: fs_menu.vim +" Description: plugin for the NERD Tree that provides a file system menu +" Maintainer: Martin Grenfell +" Last Change: 17 July, 2009 +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +" ============================================================================ +if exists("g:loaded_nerdtree_fs_menu") + finish +endif +let g:loaded_nerdtree_fs_menu = 1 + +call NERDTreeAddMenuItem({'text': '(a)dd a childnode', 'shortcut': 'a', 'callback': 'NERDTreeAddNode'}) +call NERDTreeAddMenuItem({'text': '(m)ove the current node', 'shortcut': 'm', 'callback': 'NERDTreeMoveNode'}) +call NERDTreeAddMenuItem({'text': '(d)elete the current node', 'shortcut': 'd', 'callback': 'NERDTreeDeleteNode'}) + +if has("gui_mac") || has("gui_macvim") + call NERDTreeAddMenuItem({'text': '(r)eveal in Finder the current node', 'shortcut': 'r', 'callback': 'NERDTreeRevealInFinder'}) + call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFile'}) + call NERDTreeAddMenuItem({'text': '(q)uicklook the current node', 'shortcut': 'q', 'callback': 'NERDTreeQuickLook'}) +endif + +if g:NERDTreePath.CopyingSupported() + call NERDTreeAddMenuItem({'text': '(c)copy the current node', 'shortcut': 'c', 'callback': 'NERDTreeCopyNode'}) +endif + +"FUNCTION: s:echo(msg){{{1 +function! s:echo(msg) + redraw + echomsg "NERDTree: " . a:msg +endfunction + +"FUNCTION: s:echoWarning(msg){{{1 +function! s:echoWarning(msg) + echohl warningmsg + call s:echo(a:msg) + echohl normal +endfunction + +"FUNCTION: s:promptToDelBuffer(bufnum, msg){{{1 +"prints out the given msg and, if the user responds by pushing 'y' then the +"buffer with the given bufnum is deleted +" +"Args: +"bufnum: the buffer that may be deleted +"msg: a message that will be echoed to the user asking them if they wish to +" del the buffer +function! s:promptToDelBuffer(bufnum, msg) + echo a:msg + if nr2char(getchar()) ==# 'y' + exec "silent bdelete! " . a:bufnum + endif +endfunction + +"FUNCTION: NERDTreeAddNode(){{{1 +function! NERDTreeAddNode() + let curDirNode = g:NERDTreeDirNode.GetSelected() + + let newNodeName = input("Add a childnode\n". + \ "==========================================================\n". + \ "Enter the dir/file name to be created. Dirs end with a '/'\n" . + \ "", curDirNode.path.str() . g:NERDTreePath.Slash(), "file") + + if newNodeName ==# '' + call s:echo("Node Creation Aborted.") + return + endif + + try + let newPath = g:NERDTreePath.Create(newNodeName) + let parentNode = b:NERDTreeRoot.findNode(newPath.getParent()) + + let newTreeNode = g:NERDTreeFileNode.New(newPath) + if parentNode.isOpen || !empty(parentNode.children) + call parentNode.addChild(newTreeNode, 1) + call NERDTreeRender() + call newTreeNode.putCursorHere(1, 0) + endif + catch /^NERDTree/ + call s:echoWarning("Node Not Created.") + endtry +endfunction + +"FUNCTION: NERDTreeMoveNode(){{{1 +function! NERDTreeMoveNode() + let curNode = g:NERDTreeFileNode.GetSelected() + let newNodePath = input("Rename the current node\n" . + \ "==========================================================\n" . + \ "Enter the new path for the node: \n" . + \ "", curNode.path.str(), "file") + + if newNodePath ==# '' + call s:echo("Node Renaming Aborted.") + return + endif + + try + let bufnum = bufnr(curNode.path.str()) + + call curNode.rename(newNodePath) + call NERDTreeRender() + + "if the node is open in a buffer, ask the user if they want to + "close that buffer + if bufnum != -1 + let prompt = "\nNode renamed.\n\nThe old file is open in buffer ". bufnum . (bufwinnr(bufnum) ==# -1 ? " (hidden)" : "") .". Delete this buffer? (yN)" + call s:promptToDelBuffer(bufnum, prompt) + endif + + call curNode.putCursorHere(1, 0) + + redraw + catch /^NERDTree/ + call s:echoWarning("Node Not Renamed.") + endtry +endfunction + +" FUNCTION: NERDTreeDeleteNode() {{{1 +function! NERDTreeDeleteNode() + let currentNode = g:NERDTreeFileNode.GetSelected() + let confirmed = 0 + + if currentNode.path.isDirectory + let choice =input("Delete the current node\n" . + \ "==========================================================\n" . + \ "STOP! To delete this entire directory, type 'yes'\n" . + \ "" . currentNode.path.str() . ": ") + let confirmed = choice ==# 'yes' + else + echo "Delete the current node\n" . + \ "==========================================================\n". + \ "Are you sure you wish to delete the node:\n" . + \ "" . currentNode.path.str() . " (yN):" + let choice = nr2char(getchar()) + let confirmed = choice ==# 'y' + endif + + + if confirmed + try + call currentNode.delete() + call NERDTreeRender() + + "if the node is open in a buffer, ask the user if they want to + "close that buffer + let bufnum = bufnr(currentNode.path.str()) + if buflisted(bufnum) + let prompt = "\nNode deleted.\n\nThe file is open in buffer ". bufnum . (bufwinnr(bufnum) ==# -1 ? " (hidden)" : "") .". Delete this buffer? (yN)" + call s:promptToDelBuffer(bufnum, prompt) + endif + + redraw + catch /^NERDTree/ + call s:echoWarning("Could not remove node") + endtry + else + call s:echo("delete aborted") + endif + +endfunction + +" FUNCTION: NERDTreeCopyNode() {{{1 +function! NERDTreeCopyNode() + let currentNode = g:NERDTreeFileNode.GetSelected() + let newNodePath = input("Copy the current node\n" . + \ "==========================================================\n" . + \ "Enter the new path to copy the node to: \n" . + \ "", currentNode.path.str(), "file") + + if newNodePath != "" + "strip trailing slash + let newNodePath = substitute(newNodePath, '\/$', '', '') + + let confirmed = 1 + if currentNode.path.copyingWillOverwrite(newNodePath) + call s:echo("Warning: copying may overwrite files! Continue? (yN)") + let choice = nr2char(getchar()) + let confirmed = choice ==# 'y' + endif + + if confirmed + try + let newNode = currentNode.copy(newNodePath) + if !empty(newNode) + call NERDTreeRender() + call newNode.putCursorHere(0, 0) + endif + catch /^NERDTree/ + call s:echoWarning("Could not copy node") + endtry + endif + else + call s:echo("Copy aborted.") + endif + redraw +endfunction + +function! NERDTreeQuickLook() + let treenode = g:NERDTreeFileNode.GetSelected() + if treenode != {} + call system("qlmanage -p 2>/dev/null '" . treenode.path.str() . "'") + endif +endfunction + +function! NERDTreeRevealInFinder() + let treenode = g:NERDTreeFileNode.GetSelected() + if treenode != {} + let x = system("open -R '" . treenode.path.str() . "'") + endif +endfunction + +function! NERDTreeExecuteFile() + let treenode = g:NERDTreeFileNode.GetSelected() + if treenode != {} + let x = system("open '" . treenode.path.str() . "'") + endif +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/vim/plugin/NERD_tree.vim b/vim/bundle/The-NERD-Tree/plugin/NERD_tree.vim similarity index 100% rename from vim/plugin/NERD_tree.vim rename to vim/bundle/The-NERD-Tree/plugin/NERD_tree.vim diff --git a/vim/bundle/The-NERD-Tree/syntax/nerdtree.vim b/vim/bundle/The-NERD-Tree/syntax/nerdtree.vim new file mode 100644 index 0000000..636d2af --- /dev/null +++ b/vim/bundle/The-NERD-Tree/syntax/nerdtree.vim @@ -0,0 +1,88 @@ +let s:tree_up_dir_line = '.. (up a dir)' +"NERDTreeFlags are syntax items that should be invisible, but give clues as to +"how things should be highlighted +syn match NERDTreeFlag #\~# +syn match NERDTreeFlag #\[RO\]# + +"highlighting for the .. (up dir) line at the top of the tree +execute "syn match NERDTreeUp #\\V". s:tree_up_dir_line ."#" + +"highlighting for the ~/+ symbols for the directory nodes +syn match NERDTreeClosable #\~\<# +syn match NERDTreeClosable #\~\.# +syn match NERDTreeOpenable #+\<# +syn match NERDTreeOpenable #+\.#he=e-1 + +"highlighting for the tree structural parts +syn match NERDTreePart #|# +syn match NERDTreePart #`# +syn match NERDTreePartFile #[|`]-#hs=s+1 contains=NERDTreePart + +"quickhelp syntax elements +syn match NERDTreeHelpKey #" \{1,2\}[^ ]*:#hs=s+2,he=e-1 +syn match NERDTreeHelpKey #" \{1,2\}[^ ]*,#hs=s+2,he=e-1 +syn match NERDTreeHelpTitle #" .*\~#hs=s+2,he=e-1 contains=NERDTreeFlag +syn match NERDTreeToggleOn #".*(on)#hs=e-2,he=e-1 contains=NERDTreeHelpKey +syn match NERDTreeToggleOff #".*(off)#hs=e-3,he=e-1 contains=NERDTreeHelpKey +syn match NERDTreeHelpCommand #" :.\{-}\>#hs=s+3 +syn match NERDTreeHelp #^".*# contains=NERDTreeHelpKey,NERDTreeHelpTitle,NERDTreeFlag,NERDTreeToggleOff,NERDTreeToggleOn,NERDTreeHelpCommand + +"highlighting for readonly files +syn match NERDTreeRO #.*\[RO\]#hs=s+2 contains=NERDTreeFlag,NERDTreeBookmark,NERDTreePart,NERDTreePartFile + +"highlighting for sym links +syn match NERDTreeLink #[^-| `].* -> # contains=NERDTreeBookmark,NERDTreeOpenable,NERDTreeClosable,NERDTreeDirSlash + +"highlighing for directory nodes and file nodes +syn match NERDTreeDirSlash #/# +syn match NERDTreeDir #[^-| `].*/# contains=NERDTreeLink,NERDTreeDirSlash,NERDTreeOpenable,NERDTreeClosable +syn match NERDTreeExecFile #[|` ].*\*\($\| \)# contains=NERDTreeLink,NERDTreePart,NERDTreeRO,NERDTreePartFile,NERDTreeBookmark +syn match NERDTreeFile #|-.*# contains=NERDTreeLink,NERDTreePart,NERDTreeRO,NERDTreePartFile,NERDTreeBookmark,NERDTreeExecFile +syn match NERDTreeFile #`-.*# contains=NERDTreeLink,NERDTreePart,NERDTreeRO,NERDTreePartFile,NERDTreeBookmark,NERDTreeExecFile +syn match NERDTreeCWD #^[# +syn match NERDTreeBookmarksHeader #^>-\+Bookmarks-\+$# contains=NERDTreeBookmarksLeader +syn match NERDTreeBookmarkName #^>.\{-} #he=e-1 contains=NERDTreeBookmarksLeader +syn match NERDTreeBookmark #^>.*$# contains=NERDTreeBookmarksLeader,NERDTreeBookmarkName,NERDTreeBookmarksHeader + +if exists("g:NERDChristmasTree") && g:NERDChristmasTree + hi def link NERDTreePart Special + hi def link NERDTreePartFile Type + hi def link NERDTreeFile Normal + hi def link NERDTreeExecFile Title + hi def link NERDTreeDirSlash Identifier + hi def link NERDTreeClosable Type +else + hi def link NERDTreePart Normal + hi def link NERDTreePartFile Normal + hi def link NERDTreeFile Normal + hi def link NERDTreeClosable Title +endif + +hi def link NERDTreeBookmarksHeader statement +hi def link NERDTreeBookmarksLeader ignore +hi def link NERDTreeBookmarkName Identifier +hi def link NERDTreeBookmark normal + +hi def link NERDTreeHelp String +hi def link NERDTreeHelpKey Identifier +hi def link NERDTreeHelpCommand Identifier +hi def link NERDTreeHelpTitle Macro +hi def link NERDTreeToggleOn Question +hi def link NERDTreeToggleOff WarningMsg + +hi def link NERDTreeDir Directory +hi def link NERDTreeUp Directory +hi def link NERDTreeCWD Statement +hi def link NERDTreeLink Macro +hi def link NERDTreeOpenable Title +hi def link NERDTreeFlag ignore +hi def link NERDTreeRO WarningMsg +hi def link NERDTreeBookmark Statement + +hi def link NERDTreeCurrentNode Search diff --git a/vim/bundle/Vundle.vim/.gitignore b/vim/bundle/Vundle.vim/.gitignore new file mode 100644 index 0000000..f276604 --- /dev/null +++ b/vim/bundle/Vundle.vim/.gitignore @@ -0,0 +1,2 @@ +doc/tags +.netrwhist diff --git a/vim/bundle/Vundle.vim/CONTRIBUTING.md b/vim/bundle/Vundle.vim/CONTRIBUTING.md new file mode 100644 index 0000000..2162ffc --- /dev/null +++ b/vim/bundle/Vundle.vim/CONTRIBUTING.md @@ -0,0 +1,111 @@ +Pull Requests +============= + +1. Please squash your commits to minimize the log pollution. This is more of a convenience for the maintainer who pulls. If you are unfamiliar, see [here](http://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/). + +2. Clearly describe what you aim to fix or add to Vundle. + +3. Try to minimize code changes and use existing style/functions. + +Issues +====== + +## Check For Answers + +Before submitting an issue, be sure to check the following places for answers. + +1. Vundle docs at [`:h vundle`](https://github.com/gmarik/Vundle.vim/blob/master/doc/vundle.txt). + +2. The [FAQ](https://github.com/gmarik/Vundle.vim/search). + +3. [Search](https://github.com/gmarik/Vundle.vim/search) the repository for related issues. + +## Try To Eliminate Your Vimrc + +In order to make sure it isn't just `.vimrc` replace your own config file with the [minimal vimrc](https://github.com/gmarik/Vundle.vim/blob/master/test/minirc.vim). Clear out bundles and then try to reproduce. + +If the problem stops, likely there is an issue in your user configuration. You can incrementally add back your user changes to the minimal file testing the bug each time. This will allow you to slowly bisect the issue. You may want to test one plugin at a time. + +If you can still reproduce the problem, try to find the smallest `.vimrc` config file that creates the problem to include later. + +## Guidelines + +To better respond to issues please follow these general guidelines when explaining the problem. + +1. Clearly describe what the error is, if relevant attach output/screenshots. + +2. Describe how developers can reproduce the bug, the steps should be from starting Vim. + +3. Include your OS, version and architecture. For example, Windows 7 64, Kubuntu 13.04 32, etc... + +4. If relevant to reproducing the bug, include the smallest subset of your `.vimrc` that causes the issue. Put this in code tags. + +5. At the end of your issue, please put the output of `vim --version` in code tags. + +## Example Post + +I am using Vim on Kubuntu 13.04 64 bit and I get the following error... (add further explanation here) + +To reproduce the bug, use the vimrc file below and run `:BundleInstall`... (continue with steps) + +Vimrc: +``` +set nocompatible +syntax on +filetype off +set rtp+=~/.vim/bundle/Vundle.vim/ +call vundle#rc() +Bundle 'gmarik/Vundle.vim' +Bundle 'relevant/plugin' +filetype plugin indent on + +.... more user configs here... +``` + +Vim Version: +``` +VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Aug 15 2013 10:58:39) +Included patches: 1-5 +Modified by pkg-vim-maintainers@lists.alioth.debian.org +Compiled by buildd@ +Huge version with GTK2 GUI. Features included (+) or not (-): ++arabic +file_in_path +mouse_sgr +tag_binary ++autocmd +find_in_path -mouse_sysmouse +tag_old_static ++balloon_eval +float +mouse_urxvt -tag_any_white ++browse +folding +mouse_xterm +tcl +++builtin_terms -footer +multi_byte +terminfo ++byte_offset +fork() +multi_lang +termresponse ++cindent +gettext -mzscheme +textobjects ++clientserver -hangul_input +netbeans_intg +title ++clipboard +iconv +path_extra +toolbar ++cmdline_compl +insert_expand +perl +user_commands ++cmdline_hist +jumplist +persistent_undo +vertsplit ++cmdline_info +keymap +postscript +virtualedit ++comments +langmap +printer +visual ++conceal +libcall +profile +visualextra ++cryptv +linebreak +python +viminfo ++cscope +lispindent -python3 +vreplace ++cursorbind +listcmds +quickfix +wildignore ++cursorshape +localmap +reltime +wildmenu ++dialog_con_gui +lua +rightleft +windows ++diff +menu +ruby +writebackup ++digraphs +mksession +scrollbind +X11 ++dnd +modify_fname +signs -xfontset +-ebcdic +mouse +smartindent +xim ++emacs_tags +mouseshape -sniff +xsmp_interact ++eval +mouse_dec +startuptime +xterm_clipboard ++ex_extra +mouse_gpm +statusline -xterm_save ++extra_search -mouse_jsbterm -sun_workshop ++farsi +mouse_netterm +syntax + system vimrc file: "$VIM/vimrc" + user vimrc file: "$HOME/.vimrc" + 2nd user vimrc file: "~/.vim/vimrc" + user exrc file: "$HOME/.exrc" + system gvimrc file: "$VIM/gvimrc" + user gvimrc file: "$HOME/.gvimrc" +2nd user gvimrc file: "~/.vim/gvimrc" + system menu file: "$VIMRUNTIME/menu.vim" + fall-back for $VIM: "/usr/share/vim" +Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/harfbuzz -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -I/usr/include/tcl8.5 -D_REENTRANT=1 -D_THREAD_SAFE=1 -D_LARGEFILE64_SOURCE=1 +Linking: gcc -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--as-needed -o vim -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0 -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L/usr/lib -llua5.1 -Wl,-E -fstack-protector -L/usr/local/lib -L/usr/lib/perl/5.14/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python2.7/config-x86_64-linux-gnu -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions -L/usr/lib/x86_64-linux-gnu -ltcl8.5 -ldl -lpthread -lieee -lm -lruby-1.9.1 -lpthread -lrt -ldl -lcrypt -lm -L/usr/lib +``` diff --git a/vim/bundle/Vundle.vim/LICENSE-MIT.txt b/vim/bundle/Vundle.vim/LICENSE-MIT.txt new file mode 100644 index 0000000..003904d --- /dev/null +++ b/vim/bundle/Vundle.vim/LICENSE-MIT.txt @@ -0,0 +1,7 @@ +Copyright (C) 2010 http://github.com/gmarik + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vim/bundle/Vundle.vim/README.md b/vim/bundle/Vundle.vim/README.md new file mode 100644 index 0000000..13d4eb6 --- /dev/null +++ b/vim/bundle/Vundle.vim/README.md @@ -0,0 +1,158 @@ +## [Help Maintain Vundle](https://github.com/gmarik/Vundle.vim/issues/383) + +## About + +[Vundle] is short for _Vim bundle_ and is a [Vim] plugin manager. + +[Vundle] allows you to... + +* keep track of and [configure] your plugins right in the `.vimrc` +* [install] configured plugins (a.k.a. scripts/bundle) +* [update] configured plugins +* [search] by name all available [Vim scripts] +* [clean] unused plugins up +* run the above actions in a *single keypress* with [interactive mode] + +[Vundle] automatically... + +* manages the [runtime path] of your installed scripts +* regenerates [help tags] after installing and updating + +[Vundle] is undergoing an [interface change], please stay up to date to get latest changes. + +[![Gitter-chat](https://badges.gitter.im/gmarik/Vundle.vim.png)](https://gitter.im/gmarik/Vundle.vim) for discussion and support. + +![Vundle-installer](http://i.imgur.com/Rueh7Cc.png) + +## Quick Start + +1. Introduction: + + Installation requires [Git] and triggers [`git clone`] for each configured repository to `~/.vim/bundle/` by default. + Curl is required for search. + + If you are using Windows, go directly to [Windows setup]. If you run into any issues, please consult the [FAQ]. + See [Tips] for some advanced configurations. + +2. Set up [Vundle]: + + `$ git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim` + +3. Configure Plugins: + + Put this at the top of your `.vimrc` to use Vundle. Remove plugins you don't need, they are for illustration purposes. + + ```vim + set nocompatible " be iMproved, required + filetype off " required + + " set the runtime path to include Vundle and initialize + set rtp+=~/.vim/bundle/Vundle.vim + call vundle#begin() + " alternatively, pass a path where Vundle should install plugins + "call vundle#begin('~/some/path/here') + + " let Vundle manage Vundle, required + Plugin 'gmarik/Vundle.vim' + + " The following are examples of different formats supported. + " Keep Plugin commands between vundle#begin/end. + " plugin on GitHub repo + Plugin 'tpope/vim-fugitive' + " plugin from http://vim-scripts.org/vim/scripts.html + Plugin 'L9' + " Git plugin not hosted on GitHub + Plugin 'git://git.wincent.com/command-t.git' + " git repos on your local machine (i.e. when working on your own plugin) + Plugin 'file:///home/gmarik/path/to/plugin' + " The sparkup vim script is in a subdirectory of this repo called vim. + " Pass the path to set the runtimepath properly. + Plugin 'rstacruz/sparkup', {'rtp': 'vim/'} + " Avoid a name conflict with L9 + Plugin 'user/L9', {'name': 'newL9'} + + " All of your Plugins must be added before the following line + call vundle#end() " required + filetype plugin indent on " required + " To ignore plugin indent changes, instead use: + "filetype plugin on + " + " Brief help + " :PluginList - lists configured plugins + " :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate + " :PluginSearch foo - searches for foo; append `!` to refresh local cache + " :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal + " + " see :h vundle for more details or wiki for FAQ + " Put your non-Plugin stuff after this line + ``` + +4. Install Plugins: + + Launch `vim` and run `:PluginInstall` + + To install from command line: `vim +PluginInstall +qall` + +## Docs + +See the [`:h vundle`](https://github.com/gmarik/Vundle.vim/blob/master/doc/vundle.txt) Vimdoc for more details. + +## Changelog + +See the [changelog](https://github.com/gmarik/Vundle.vim/blob/master/changelog.md). + +## People Using Vundle + +see [Examples](https://github.com/gmarik/Vundle.vim/wiki/Examples) + +## Contributors + +see [Vundle contributors](https://github.com/gmarik/Vundle.vim/graphs/contributors) + +*Thank you!* + +## Inspiration & Ideas + +* [pathogen.vim](http://github.com/tpope/vim-pathogen/) +* [Bundler](https://github.com/bundler/bundler) +* [Scott Bronson](http://github.com/bronson) + +## Also + +* Vundle was developed and tested with [Vim] 7.3 on OS X, Linux and Windows +* Vundle tries to be as [KISS](http://en.wikipedia.org/wiki/KISS_principle) as possible + +## TODO: +[Vundle] is a work in progress, so any ideas and patches are appreciated. + +* ✓ activate newly added bundles on `.vimrc` reload or after `:PluginInstall` +* ✓ use preview window for search results +* ✓ Vim documentation +* ✓ put Vundle in `bundles/` too (will fix Vundle help) +* ✓ tests +* ✓ improve error handling +* allow specifying revision/version? +* handle dependencies +* show description in search results +* search by description as well +* make it rock! + +[Vundle]:http://github.com/gmarik/Vundle.vim +[Windows setup]:https://github.com/gmarik/Vundle.vim/wiki/Vundle-for-Windows +[FAQ]:https://github.com/gmarik/Vundle.vim/wiki +[Tips]:https://github.com/gmarik/Vundle.vim/wiki/Tips-and-Tricks +[Vim]:http://www.vim.org +[Git]:http://git-scm.com +[`git clone`]:http://gitref.org/creating/#clone + +[Vim scripts]:http://vim-scripts.org/vim/scripts.html +[help tags]:http://vimdoc.sourceforge.net/htmldoc/helphelp.html#:helptags +[runtime path]:http://vimdoc.sourceforge.net/htmldoc/options.html#%27runtimepath%27 + +[configure]:https://github.com/gmarik/Vundle.vim/blob/v0.10.2/doc/vundle.txt#L126-L233 +[install]:https://github.com/gmarik/Vundle.vim/blob/v0.10.2/doc/vundle.txt#L234-L254 +[update]:https://github.com/gmarik/Vundle.vim/blob/v0.10.2/doc/vundle.txt#L255-L265 +[search]:https://github.com/gmarik/Vundle.vim/blob/v0.10.2/doc/vundle.txt#L266-L295 +[clean]:https://github.com/gmarik/Vundle.vim/blob/v0.10.2/doc/vundle.txt#L303-L318 +[interactive mode]:https://github.com/gmarik/Vundle.vim/blob/v0.10.2/doc/vundle.txt#L319-L360 +[interface change]:https://github.com/gmarik/Vundle.vim/blob/v0.10.2/doc/vundle.txt#L372-L396 diff --git a/vim/bundle/Vundle.vim/autoload/vundle.vim b/vim/bundle/Vundle.vim/autoload/vundle.vim new file mode 100644 index 0000000..2939048 --- /dev/null +++ b/vim/bundle/Vundle.vim/autoload/vundle.vim @@ -0,0 +1,83 @@ +" Vundle is a shortcut for Vim Bundle and Is a simple plugin manager for Vim +" Author: gmarik +" HomePage: http://github.com/gmarik/Vundle.vim +" Readme: http://github.com/gmarik/Vundle.vim/blob/master/README.md +" Version: 0.10.2 + +" Plugin Commands +com! -nargs=+ -bar Plugin +\ call vundle#config#bundle() + +com! -nargs=? -bang -complete=custom,vundle#scripts#complete PluginInstall +\ call vundle#installer#new('!' == '', ) + +com! -nargs=? -bang -complete=custom,vundle#scripts#complete PluginSearch +\ call vundle#scripts#all('!' == '', ) + +com! -nargs=0 -bang PluginList +\ call vundle#installer#list('!' == '') + +com! -nargs=? -bang PluginClean +\ call vundle#installer#clean('!' == '') + +com! -nargs=0 PluginDocs +\ call vundle#installer#helptags(g:bundles) + +" Aliases +com! PluginUpdate PluginInstall! + +" Vundle Aliases +com! -nargs=? -bang -complete=custom,vundle#scripts#complete VundleInstall PluginInstall +com! -nargs=? -bang -complete=custom,vundle#scripts#complete VundleSearch PluginSearch +com! -nargs=? -bang VundleClean PluginClean +com! -nargs=0 VundleDocs PluginDocs +com! VundleUpdate PluginInstall! + +" Deprecated Commands +com! -nargs=+ Bundle call vundle#config#bundle() +com! -nargs=? -bang -complete=custom,vundle#scripts#complete BundleInstall PluginInstall +com! -nargs=? -bang -complete=custom,vundle#scripts#complete BundleSearch PluginSearch +com! -nargs=0 -bang BundleList PluginList +com! -nargs=? -bang BundleClean PluginClean +com! -nargs=0 BundleDocs PluginDocs +com! BundleUpdate PluginInstall! + +" Set up the signs used in the installer window. (See :help signs) +if (has('signs')) + sign define Vu_error text=! texthl=Error + sign define Vu_active text=> texthl=Comment + sign define Vu_todate text=. texthl=Comment + sign define Vu_new text=+ texthl=Comment + sign define Vu_updated text=* texthl=Comment + sign define Vu_deleted text=- texthl=Comment + sign define Vu_helptags text=* texthl=Comment + sign define Vu_pinned text== texthl=Comment +endif + +" Set up Vundle. This function has to be called from the users vimrc file. +" This will force Vim to source this file as a side effect which wil define +" the :Plugin command. After calling this function the user can use the +" :Plugin command in the vimrc. It is not possible to do this automatically +" because when loading the vimrc file no plugins where loaded yet. +func! vundle#rc(...) abort + let g:bundle_dir = len(a:000) > 0 ? expand(a:1, 1) : expand('$HOME/.vim/bundle', 1) + let g:updated_bundles = [] + let g:vundle_log = [] + let g:vundle_changelog = ['Updated Plugins:'] + call vundle#config#init() +endf + +" Alternative to vundle#rc, offers speed up by modifying rtp only when end() +" called later. +func! vundle#begin(...) abort + let g:vundle_lazy_load = 1 + call call('vundle#rc', a:000) +endf + +" Finishes putting plugins on the rtp. +func! vundle#end(...) abort + unlet g:vundle_lazy_load + call vundle#config#activate_bundles() +endf + +" vim: set expandtab sts=2 ts=2 sw=2 tw=78 norl: diff --git a/vim/bundle/Vundle.vim/autoload/vundle/config.vim b/vim/bundle/Vundle.vim/autoload/vundle/config.vim new file mode 100644 index 0000000..5ecb30b --- /dev/null +++ b/vim/bundle/Vundle.vim/autoload/vundle/config.vim @@ -0,0 +1,278 @@ +" --------------------------------------------------------------------------- +" Add a plugin to the runtimepath. +" +" arg -- a string specifying the plugin +" ... -- a dictionary of options for the plugin +" return -- the return value from vundle#config#init_bundle() +" --------------------------------------------------------------------------- +func! vundle#config#bundle(arg, ...) + let bundle = vundle#config#init_bundle(a:arg, a:000) + if !s:check_bundle_name(bundle) + return + endif + if exists('g:vundle_lazy_load') && g:vundle_lazy_load + call add(g:bundles, bundle) + else + call s:rtp_rm_a() + call add(g:bundles, bundle) + call s:rtp_add_a() + call s:rtp_add_defaults() + endif + return bundle +endf + + +" --------------------------------------------------------------------------- +" When lazy bundle load is used (begin/end functions), add all configured +" bundles to runtimepath and reorder appropriately. +" --------------------------------------------------------------------------- +func! vundle#config#activate_bundles() + call s:rtp_add_a() + call s:rtp_add_defaults() +endf + + +" --------------------------------------------------------------------------- +" Initialize Vundle. +" +" Start a new bundles list and make sure the runtimepath does not contain +" directories from a previous call. In theory, this should only be called +" once. +" --------------------------------------------------------------------------- +func! vundle#config#init() + if !exists('g:bundles') | let g:bundles = [] | endif + call s:rtp_rm_a() + let g:bundles = [] + let g:bundle_names = {} +endf + + +" --------------------------------------------------------------------------- +" Add a list of bundles to the runtimepath and source them. +" +" bundles -- a list of bundle objects +" --------------------------------------------------------------------------- +func! vundle#config#require(bundles) abort + for b in a:bundles + call s:rtp_add(b.rtpath) + call s:rtp_add(g:bundle_dir) + " TODO: it has to be relative rtpath, not bundle.name + exec 'runtime! '.b.name.'/plugin/*.vim' + exec 'runtime! '.b.name.'/after/*.vim' + call s:rtp_rm(g:bundle_dir) + endfor + call s:rtp_add_defaults() +endf + + +" --------------------------------------------------------------------------- +" Create a bundle object from a bundle specification. +" +" name -- the bundle specification as a string +" opts -- the options dictionary from then bundle definition +" return -- an initialized bundle object +" --------------------------------------------------------------------------- +func! vundle#config#init_bundle(name, opts) + if a:name != substitute(a:name, '^\s*\(.\{-}\)\s*$', '\1', '') + echo "Spurious leading and/or trailing whitespace found in plugin spec '" . a:name . "'" + endif + let opts = extend(s:parse_options(a:opts), s:parse_name(substitute(a:name,"['".'"]\+','','g')), 'keep') + let b = extend(opts, copy(s:bundle)) + let b.rtpath = s:rtpath(opts) + return b +endf + + +" --------------------------------------------------------------------------- +" Check if the current bundle name has already been used in this running +" instance and show an error to that effect. +" +" bundle -- a bundle object whose name is to be checked +" return -- 0 if the bundle's name has been seen before, 1 otherwise +" --------------------------------------------------------------------------- +funct! s:check_bundle_name(bundle) + if has_key(g:bundle_names, a:bundle.name) + echoerr 'Vundle error: Name collision for Plugin ' . a:bundle.name_spec . + \ '. Plugin ' . g:bundle_names[a:bundle.name] . + \ ' previously used the name "' . a:bundle.name . '"' . + \ '. Skipping Plugin ' . a:bundle.name_spec . '.' + return 0 + endif + let g:bundle_names[a:bundle.name] = a:bundle.name_spec + return 1 +endf + + +" --------------------------------------------------------------------------- +" Parse the options which can be supplied with the bundle specification. +" Corresponding documentation: vundle-plugins-configure +" +" opts -- a dictionary with the user supplied options for the bundle +" return -- a dictionary with the user supplied options for the bundle, this +" will be merged with a s:bundle object into one dictionary. +" --------------------------------------------------------------------------- +func! s:parse_options(opts) + " TODO: improve this + if len(a:opts) != 1 | return {} | endif + + if type(a:opts[0]) == type({}) + return a:opts[0] + else + return {'rev': a:opts[0]} + endif +endf + + +" --------------------------------------------------------------------------- +" Parse the plugin specification. Corresponding documentation: +" vundle-plugins-uris +" +" arg -- the string supplied to identify the plugin +" return -- a dictionary with the folder name (key 'name') and the uri (key +" 'uri') for cloning the plugin and the original argument (key +" 'name_spec') +" --------------------------------------------------------------------------- +func! s:parse_name(arg) + let arg = a:arg + let git_proto = exists('g:vundle_default_git_proto') ? g:vundle_default_git_proto : 'https' + + if arg =~? '^\s*\(gh\|github\):\S\+' + \ || arg =~? '^[a-z0-9][a-z0-9-]*/[^/]\+$' + let uri = git_proto.'://github.com/'.split(arg, ':')[-1] + if uri !~? '\.git$' + let uri .= '.git' + endif + let name = substitute(split(uri,'\/')[-1], '\.git\s*$','','i') + elseif arg =~? '^\s*\(git@\|git://\)\S\+' + \ || arg =~? '\(file\|https\?\)://' + \ || arg =~? '\.git\s*$' + let uri = arg + let name = split( substitute(uri,'/\?\.git\s*$','','i') ,'\/')[-1] + else + let name = arg + let uri = git_proto.'://github.com/vim-scripts/'.name.'.git' + endif + return {'name': name, 'uri': uri, 'name_spec': arg } +endf + + +" --------------------------------------------------------------------------- +" Modify the runtimepath, after all bundles have been added, so that the +" directories that were in the default runtimepath appear first in the list +" (with their 'after' directories last). +" --------------------------------------------------------------------------- +func! s:rtp_add_defaults() + let current = &rtp + set rtp&vim + let default = &rtp + let &rtp = current + let default_rtp_items = split(default, ',') + if !empty(default_rtp_items) + let first_item = fnameescape(default_rtp_items[0]) + exec 'set rtp-=' . first_item + exec 'set rtp^=' . first_item + endif +endf + + +" --------------------------------------------------------------------------- +" Remove all paths for the plugins which are managed by Vundle from the +" runtimepath. +" --------------------------------------------------------------------------- +func! s:rtp_rm_a() + let paths = map(copy(g:bundles), 'v:val.rtpath') + let prepends = join(paths, ',') + let appends = join(paths, '/after,').'/after' + exec 'set rtp-='.fnameescape(prepends) + exec 'set rtp-='.fnameescape(appends) +endf + + +" --------------------------------------------------------------------------- +" Add all paths for the plugins which are managed by Vundle to the +" runtimepath. +" --------------------------------------------------------------------------- +func! s:rtp_add_a() + let paths = map(copy(g:bundles), 'v:val.rtpath') + let prepends = join(paths, ',') + let appends = join(paths, '/after,').'/after' + exec 'set rtp^='.fnameescape(prepends) + exec 'set rtp+='.fnameescape(appends) +endf + + +" --------------------------------------------------------------------------- +" Remove a directory and the corresponding 'after' directory from runtimepath. +" +" dir -- the directory name to be removed as a string. The corresponding +" 'after' directory will also be removed. +" --------------------------------------------------------------------------- +func! s:rtp_rm(dir) abort + exec 'set rtp-='.fnameescape(expand(a:dir, 1)) + exec 'set rtp-='.fnameescape(expand(a:dir.'/after', 1)) +endf + + +" --------------------------------------------------------------------------- +" Add a directory and the corresponding 'after' directory to runtimepath. +" +" dir -- the directory name to be added as a string. The corresponding +" 'after' directory will also be added. +" --------------------------------------------------------------------------- +func! s:rtp_add(dir) abort + exec 'set rtp^='.fnameescape(expand(a:dir, 1)) + exec 'set rtp+='.fnameescape(expand(a:dir.'/after', 1)) +endf + + +" --------------------------------------------------------------------------- +" Expand and simplify a path. +" +" path -- the path to expand as a string +" return -- the expanded and simplified path +" --------------------------------------------------------------------------- +func! s:expand_path(path) abort + return simplify(expand(a:path, 1)) +endf + + +" --------------------------------------------------------------------------- +" Find the actual path inside a bundle directory to be added to the +" runtimepath. It might be provided by the user with the 'rtp' option. +" Corresponding documentation: vundle-plugins-configure +" +" opts -- a bundle dict +" return -- expanded path to the corresponding plugin directory +" --------------------------------------------------------------------------- +func! s:rtpath(opts) + return has_key(a:opts, 'rtp') ? s:expand_path(a:opts.path().'/'.a:opts.rtp) : a:opts.path() +endf + + +" --------------------------------------------------------------------------- +" a bundle 'object' +" --------------------------------------------------------------------------- +let s:bundle = {} + + +" --------------------------------------------------------------------------- +" Return the absolute path to the directory inside the bundle directory +" (prefix) where thr bundle will be cloned. +" +" return -- the target location to clone this bundle to +" --------------------------------------------------------------------------- +func! s:bundle.path() + return s:expand_path(g:bundle_dir.'/'.self.name) +endf + + +" --------------------------------------------------------------------------- +" Determine if the bundle has the pinned attribute set in the config +" +" return -- 1 if the bundle is pinned, 0 otherwise +" --------------------------------------------------------------------------- +func! s:bundle.is_pinned() + return get(self, 'pinned') +endf + +" vim: set expandtab sts=2 ts=2 sw=2 tw=78 norl: diff --git a/vim/bundle/Vundle.vim/autoload/vundle/installer.vim b/vim/bundle/Vundle.vim/autoload/vundle/installer.vim new file mode 100644 index 0000000..614b64b --- /dev/null +++ b/vim/bundle/Vundle.vim/autoload/vundle/installer.vim @@ -0,0 +1,534 @@ +" --------------------------------------------------------------------------- +" Try to clone all new bundles given (or all bundles in g:bundles by default) +" to g:bundle_dir. If a:bang is 1 it will also update all plugins (git pull). +" +" bang -- 1 or 0 +" ... -- any number of bundle specifications (separate arguments) +" --------------------------------------------------------------------------- +func! vundle#installer#new(bang, ...) abort + let bundles = (a:1 == '') ? + \ g:bundles : + \ map(copy(a:000), 'vundle#config#bundle(v:val, {})') + + let names = vundle#scripts#bundle_names(map(copy(bundles), 'v:val.name_spec')) + call vundle#scripts#view('Installer',['" Installing plugins to '.expand(g:bundle_dir, 1)], names + ['Helptags']) + + " This calls 'add' as a normal mode command. This is a buffer local mapping + " defined in vundle#scripts#view(). The mapping will call a buffer local + " command InstallPlugin which in turn will call vundle#installer#run() with + " vundle#installer#install(). + call s:process(a:bang, (a:bang ? 'add!' : 'add')) + + call vundle#config#require(bundles) +endf + + +" --------------------------------------------------------------------------- +" Iterate over all lines in a Vundle window and execute the given command for +" every line. Used by the installation and cleaning functions. +" +" bang -- not used (FIXME) +" cmd -- the (normal mode) command to execute for every line as a string +" --------------------------------------------------------------------------- +func! s:process(bang, cmd) + let msg = '' + + redraw + sleep 1m + + let lines = (getline('.','$')[0:-2]) + + for line in lines + redraw + + exec ':norm '.a:cmd + + if 'error' == g:vundle_last_status + let msg = 'With errors; press l to view log' + endif + + if 'updated' == g:vundle_last_status && empty(msg) + let msg = 'Plugins updated; press u to view changelog' + endif + + " goto next one + exec ':+1' + + setl nomodified + endfor + + redraw + echo 'Done! '.msg +endf + + +" --------------------------------------------------------------------------- +" Call another function in the different Vundle windows. +" +" func_name -- the function to call +" name -- the bundle name to call func_name for (string) +" ... -- the argument to be used when calling func_name (only the first +" optional argument will be used) +" return -- the status returned by the call to func_name +" --------------------------------------------------------------------------- +func! vundle#installer#run(func_name, name, ...) abort + let n = a:name + + echo 'Processing '.n + call s:sign('active') + + sleep 1m + + let status = call(a:func_name, a:1) + + call s:sign(status) + + redraw + + if 'new' == status + echo n.' installed' + elseif 'updated' == status + echo n.' updated' + elseif 'todate' == status + echo n.' already installed' + elseif 'deleted' == status + echo n.' deleted' + elseif 'helptags' == status + echo n.' regenerated' + elseif 'pinned' == status + echo n.' pinned' + elseif 'error' == status + echohl Error + echo 'Error processing '.n + echohl None + sleep 1 + else + throw 'whoops, unknown status:'.status + endif + + let g:vundle_last_status = status + + return status +endf + + +" --------------------------------------------------------------------------- +" Put a sign on the current line, indicating the status of the installation +" step. +" +" status -- string describing the status +" --------------------------------------------------------------------------- +func! s:sign(status) + if (!has('signs')) + return + endif + + exe ":sign place ".line('.')." line=".line('.')." name=Vu_". a:status ." buffer=" . bufnr("%") +endf + + +" --------------------------------------------------------------------------- +" Install a plugin, then add it to the runtimepath and source it. +" +" bang -- 1 or 0, passed directly to vundle#installer#install() +" name -- the name of a bundle (string) +" return -- the return value from vundle#installer#install() +" --------------------------------------------------------------------------- +func! vundle#installer#install_and_require(bang, name) abort + let result = vundle#installer#install(a:bang, a:name) + let b = vundle#config#bundle(a:name, {}) + call vundle#installer#helptags([b]) + call vundle#config#require([b]) + return result +endf + + +" --------------------------------------------------------------------------- +" Install or update a bundle given by its name. +" +" bang -- 1 or 0, passed directly to s:sync() +" name -- the name of a bundle (string) +" return -- the return value from s:sync() +" --------------------------------------------------------------------------- +func! vundle#installer#install(bang, name) abort + if !isdirectory(g:bundle_dir) | call mkdir(g:bundle_dir, 'p') | endif + + let n = substitute(a:name,"['".'"]\+','','g') + let matched = filter(copy(g:bundles), 'v:val.name_spec == n') + + if len(matched) > 0 + let b = matched[0] + else + let b = vundle#config#init_bundle(a:name, {}) + endif + + return s:sync(a:bang, b) +endf + + +" --------------------------------------------------------------------------- +" Call :helptags for all bundles in g:bundles. +" +" return -- 'error' if an error occurred, else return 'helptags' +" --------------------------------------------------------------------------- +func! vundle#installer#docs() abort + let error_count = vundle#installer#helptags(g:bundles) + if error_count > 0 + return 'error' + endif + return 'helptags' +endf + + +" --------------------------------------------------------------------------- +" Call :helptags for a list of bundles. +" +" bundles -- a list of bundle dictionaries for which :helptags should be +" called. +" return -- the number of directories where :helptags failed +" --------------------------------------------------------------------------- +func! vundle#installer#helptags(bundles) abort + let bundle_dirs = map(copy(a:bundles),'v:val.rtpath') + let help_dirs = filter(bundle_dirs, 's:has_doc(v:val)') + + call s:log('') + call s:log('Helptags:') + + let statuses = map(copy(help_dirs), 's:helptags(v:val)') + let errors = filter(statuses, 'v:val == 0') + + call s:log('Helptags: '.len(help_dirs).' plugins processed') + + return len(errors) +endf + + +" --------------------------------------------------------------------------- +" List all installed plugins. +" Corresponding documentation: vundle-plugins-list +" +" bang -- not used +" --------------------------------------------------------------------------- +func! vundle#installer#list(bang) abort + let bundles = vundle#scripts#bundle_names(map(copy(g:bundles), 'v:val.name_spec')) + call vundle#scripts#view('list', ['" My Plugins'], bundles) + redraw + echo len(g:bundles).' plugins configured' +endf + + +" --------------------------------------------------------------------------- +" List and remove all directories in the bundle directory which are not +" activated (added to the bundle list). +" +" bang -- 0 if the user should be asked to confirm every deletion, 1 if they +" should be removed unconditionally +" --------------------------------------------------------------------------- +func! vundle#installer#clean(bang) abort + let bundle_dirs = map(copy(g:bundles), 'v:val.path()') + let all_dirs = (v:version > 702 || (v:version == 702 && has("patch51"))) + \ ? split(globpath(g:bundle_dir, '*', 1), "\n") + \ : split(globpath(g:bundle_dir, '*'), "\n") + let x_dirs = filter(all_dirs, '0 > index(bundle_dirs, v:val)') + + if empty(x_dirs) + let headers = ['" All clean!'] + let names = [] + else + let headers = ['" Removing Plugins:'] + let names = vundle#scripts#bundle_names(map(copy(x_dirs), 'fnamemodify(v:val, ":t")')) + end + + call vundle#scripts#view('clean', headers, names) + redraw + + if (a:bang || empty(names)) + call s:process(a:bang, 'D') + else + call inputsave() + let response = input('Continue? [Y/n]: ') + call inputrestore() + if (response =~? 'y' || response == '') + call s:process(a:bang, 'D') + endif + endif +endf + + +" --------------------------------------------------------------------------- +" Delete to directory for a plugin. +" +" bang -- not used +" dir_name -- the bundle directory to be deleted (as a string) +" return -- 'error' if an error occurred, 'deleted' if the plugin folder was +" successfully deleted +" --------------------------------------------------------------------------- +func! vundle#installer#delete(bang, dir_name) abort + + let cmd = ((has('win32') || has('win64')) && empty(matchstr(&shell, 'sh'))) ? + \ 'rmdir /S /Q' : + \ 'rm -rf' + + let bundle = vundle#config#init_bundle(a:dir_name, {}) + let cmd .= ' '.vundle#installer#shellesc(bundle.path()) + + let out = s:system(cmd) + + call s:log('') + call s:log('Plugin '.a:dir_name) + call s:log(cmd, '$ ') + call s:log(out, '> ') + + if 0 != v:shell_error + return 'error' + else + return 'deleted' + endif +endf + + +" --------------------------------------------------------------------------- +" Check if a bundled plugin has any documentation. +" +" rtp -- a path (string) where the plugin is installed +" return -- 1 if some documentation was found, 0 otherwise +" --------------------------------------------------------------------------- +func! s:has_doc(rtp) abort + return isdirectory(a:rtp.'/doc') + \ && (!filereadable(a:rtp.'/doc/tags') || filewritable(a:rtp.'/doc/tags')) + \ && (v:version > 702 || (v:version == 702 && has("patch51"))) + \ ? !(empty(glob(a:rtp.'/doc/*.txt', 1)) && empty(glob(a:rtp.'/doc/*.??x', 1))) + \ : !(empty(glob(a:rtp.'/doc/*.txt')) && empty(glob(a:rtp.'/doc/*.??x'))) +endf + + +" --------------------------------------------------------------------------- +" Update the helptags for a plugin. +" +" rtp -- the path to the plugin's root directory (string) +" return -- 1 if :helptags succeeded, 0 otherwise +" --------------------------------------------------------------------------- +func! s:helptags(rtp) abort + " it is important to keep trailing slash here + let doc_path = resolve(a:rtp . '/doc/') + call s:log(':helptags '.doc_path) + try + execute 'helptags ' . doc_path + catch + call s:log("> Error running :helptags ".doc_path) + return 0 + endtry + return 1 +endf + + +" --------------------------------------------------------------------------- +" Get the URL for the remote called 'origin' on the repository that +" corresponds to a given bundle. +" +" bundle -- a bundle object to check the repository for +" return -- the URL for the origin remote (string) +" --------------------------------------------------------------------------- +func! s:get_current_origin_url(bundle) abort + let cmd = 'cd '.vundle#installer#shellesc(a:bundle.path()).' && git config --get remote.origin.url' + let cmd = vundle#installer#shellesc_cd(cmd) + let out = s:strip(s:system(cmd)) + return out +endf + + +" --------------------------------------------------------------------------- +" Get a short sha of the HEAD of the repository for a given bundle +" +" bundle -- a bundle object +" return -- A 15 character log sha for the current HEAD +" --------------------------------------------------------------------------- +func! s:get_current_sha(bundle) + let cmd = 'cd '.vundle#installer#shellesc(a:bundle.path()).' && git rev-parse HEAD' + let cmd = vundle#installer#shellesc_cd(cmd) + let out = s:system(cmd)[0:15] + return out +endf + + +" --------------------------------------------------------------------------- +" Create the appropriate sync command to run according to the current state of +" the local repository (clone, pull, reset, etc). +" +" In the case of a pull (update), also return the current sha, so that we can +" later check that there has been an upgrade. +" +" bang -- 0 if only new plugins should be installed, 1 if existing plugins +" should be updated +" bundle -- a bundle object to create the sync command for +" return -- A list containing the command to run and the sha for the current +" HEAD +" --------------------------------------------------------------------------- +func! s:make_sync_command(bang, bundle) abort + let git_dir = expand(a:bundle.path().'/.git/', 1) + if isdirectory(git_dir) || filereadable(expand(a:bundle.path().'/.git', 1)) + + let current_origin_url = s:get_current_origin_url(a:bundle) + if current_origin_url != a:bundle.uri + call s:log('Plugin URI change detected for Plugin ' . a:bundle.name) + call s:log('> Plugin ' . a:bundle.name . ' old URI: ' . current_origin_url) + call s:log('> Plugin ' . a:bundle.name . ' new URI: ' . a:bundle.uri) + " Directory names match but the origin remotes are not the same + let cmd_parts = [ + \ 'cd '.vundle#installer#shellesc(a:bundle.path()) , + \ 'git remote set-url origin ' . vundle#installer#shellesc(a:bundle.uri), + \ 'git fetch', + \ 'git reset --hard origin/HEAD', + \ 'git submodule update --init --recursive', + \ ] + let cmd = join(cmd_parts, ' && ') + let cmd = vundle#installer#shellesc_cd(cmd) + let initial_sha = '' + return [cmd, initial_sha] + endif + + if !(a:bang) + " The repo exists, and no !, so leave as it is. + return ['', ''] + endif + + let cmd_parts = [ + \ 'cd '.vundle#installer#shellesc(a:bundle.path()), + \ 'git pull', + \ 'git submodule update --init --recursive', + \ ] + let cmd = join(cmd_parts, ' && ') + let cmd = vundle#installer#shellesc_cd(cmd) + + let initial_sha = s:get_current_sha(a:bundle) + else + let cmd = 'git clone --recursive '.vundle#installer#shellesc(a:bundle.uri).' '.vundle#installer#shellesc(a:bundle.path()) + let initial_sha = '' + endif + return [cmd, initial_sha] +endf + + +" --------------------------------------------------------------------------- +" Install or update a given bundle object with git. +" +" bang -- 0 if only new plugins should be installed, 1 if existing plugins +" should be updated +" bundle -- a bundle object (dictionary) +" return -- a string indicating the status of the bundle installation: +" - todate : Nothing was updated or the repository was up to date +" - new : The plugin was newly installed +" - updated : Some changes where pulled via git +" - error : An error occurred in the shell command +" - pinned : The bundle is marked as pinned +" --------------------------------------------------------------------------- +func! s:sync(bang, bundle) abort + " Do not sync if this bundle is pinned + if a:bundle.is_pinned() + return 'pinned' + endif + + let [ cmd, initial_sha ] = s:make_sync_command(a:bang, a:bundle) + if empty(cmd) + return 'todate' + endif + + let out = s:system(cmd) + call s:log('') + call s:log('Plugin '.a:bundle.name_spec) + call s:log(cmd, '$ ') + call s:log(out, '> ') + + if 0 != v:shell_error + return 'error' + end + + if empty(initial_sha) + return 'new' + endif + + let updated_sha = s:get_current_sha(a:bundle) + + if initial_sha == updated_sha + return 'todate' + endif + + call add(g:updated_bundles, [initial_sha, updated_sha, a:bundle]) + return 'updated' +endf + + +" --------------------------------------------------------------------------- +" Escape special characters in a string to be able to use it as a shell +" command with system(). +" +" cmd -- the string holding the shell command +" return -- a string with the relevant characters escaped +" --------------------------------------------------------------------------- +func! vundle#installer#shellesc(cmd) abort + if ((has('win32') || has('win64')) && empty(matchstr(&shell, 'sh'))) + return '"' . substitute(a:cmd, '"', '\\"', 'g') . '"' + endif + return shellescape(a:cmd) +endf + + +" --------------------------------------------------------------------------- +" Fix a cd shell command to be used on Windows. +" +" cmd -- the command to be fixed (string) +" return -- the fixed command (string) +" --------------------------------------------------------------------------- +func! vundle#installer#shellesc_cd(cmd) abort + if ((has('win32') || has('win64')) && empty(matchstr(&shell, 'sh'))) + let cmd = substitute(a:cmd, '^cd ','cd /d ','') " add /d switch to change drives + return cmd + else + return a:cmd + endif +endf + + +" --------------------------------------------------------------------------- +" Make a system call. This can be used to change the way system calls +" are made during developing, without searching the whole code base for +" actual system() calls. +" +" cmd -- the command passed to system() (string) +" return -- the return value from system() +" --------------------------------------------------------------------------- +func! s:system(cmd) abort + return system(a:cmd) +endf + + +" --------------------------------------------------------------------------- +" Add a log message to Vundle's internal logging variable. +" +" str -- the log message (string) +" prefix -- optional prefix for multi-line entries (string) +" return -- a:str +" --------------------------------------------------------------------------- +func! s:log(str, ...) abort + let prefix = a:0 > 0 ? a:1 : '' + let fmt = '%Y-%m-%d %H:%M:%S' + let lines = split(a:str, '\n', 1) + let time = strftime(fmt) + for line in lines + call add(g:vundle_log, '['. time .'] '. prefix . line) + endfor + return a:str +endf + + +" --------------------------------------------------------------------------- +" Remove leading and trailing whitespace from a string +" +" str -- The string to rid of trailing and leading spaces +" return -- A string stripped of side spaces +" --------------------------------------------------------------------------- +func! s:strip(str) + return substitute(a:str, '\%^\_s*\(.\{-}\)\_s*\%$', '\1', '') +endf + +" vim: set expandtab sts=2 ts=2 sw=2 tw=78 norl: diff --git a/vim/bundle/Vundle.vim/autoload/vundle/scripts.vim b/vim/bundle/Vundle.vim/autoload/vundle/scripts.vim new file mode 100644 index 0000000..d7409a1 --- /dev/null +++ b/vim/bundle/Vundle.vim/autoload/vundle/scripts.vim @@ -0,0 +1,257 @@ +" --------------------------------------------------------------------------- +" Search the database from vim-script.org for a matching plugin. If no +" argument is given, list all plugins. This function is used by the :Plugins +" and :PluginSearch commands. +" +" bang -- if 1 refresh the script name cache, if 0 don't +" ... -- a plugin name to search for +" --------------------------------------------------------------------------- +func! vundle#scripts#all(bang, ...) + let b:match = '' + let info = ['"Keymap: i - Install plugin; c - Cleanup; s - Search; R - Reload list'] + let matches = s:load_scripts(a:bang) + if !empty(a:1) + let matches = filter(matches, 'v:val =~? "'.escape(a:1,'"').'"') + let info += ['"Search results for: '.a:1] + " TODO: highlight matches + let b:match = a:1 + endif + call vundle#scripts#view('search',info, vundle#scripts#bundle_names(reverse(matches))) + redraw + echo len(matches).' plugins found' +endf + + +" --------------------------------------------------------------------------- +" Repeat the search for bundles. +" --------------------------------------------------------------------------- +func! vundle#scripts#reload() abort + silent exec ':PluginSearch! '.(exists('b:match') ? b:match : '') + redraw +endf + + +" --------------------------------------------------------------------------- +" Complete names for bundles in the command line. +" +" a, c, d -- see :h command-completion-custom +" return -- all valid plugin names from vim-scripts.org as completion +" candidates, see also :h command-completion-custom +" --------------------------------------------------------------------------- +func! vundle#scripts#complete(a,c,d) + return join(s:load_scripts(0),"\n") +endf + + +" --------------------------------------------------------------------------- +" View the logfile after an update or installation. +" --------------------------------------------------------------------------- +func! s:view_log() + if !exists('g:vundle_log_file') + let g:vundle_log_file = tempname() + endif + + call writefile(g:vundle_log, g:vundle_log_file) + execute 'silent pedit ' . g:vundle_log_file + + wincmd P | wincmd H +endf + + +" --------------------------------------------------------------------------- +" Parse the output from git log after an update to create a change log for the +" user. +" --------------------------------------------------------------------------- +func! s:create_changelog() abort + for bundle_data in g:updated_bundles + let initial_sha = bundle_data[0] + let updated_sha = bundle_data[1] + let bundle = bundle_data[2] + + let cmd = 'cd '.vundle#installer#shellesc(bundle.path()). + \ ' && git log --pretty=format:"%s %an, %ar" --graph '. + \ initial_sha.'..'.updated_sha + + let cmd = vundle#installer#shellesc_cd(cmd) + + let updates = system(cmd) + + call add(g:vundle_changelog, '') + call add(g:vundle_changelog, 'Updated Plugin: '.bundle.name) + + if bundle.uri =~ "https://github.com" + call add(g:vundle_changelog, 'Compare at: '.bundle.uri[0:-5].'/compare/'.initial_sha.'...'.updated_sha) + endif + + for update in split(updates, '\n') + let update = substitute(update, '\s\+$', '', '') + call add(g:vundle_changelog, ' '.update) + endfor + endfor +endf + + +" --------------------------------------------------------------------------- +" View the change log after an update or installation. +" --------------------------------------------------------------------------- +func! s:view_changelog() + call s:create_changelog() + + if !exists('g:vundle_changelog_file') + let g:vundle_changelog_file = tempname() + endif + + call writefile(g:vundle_changelog, g:vundle_changelog_file) + execute 'silent pedit ' . g:vundle_changelog_file + + wincmd P | wincmd H +endf + + +" --------------------------------------------------------------------------- +" Create a list of 'Plugin ...' lines from a list of bundle names. +" +" names -- a list of names (strings) of plugins +" return -- a list of 'Plugin ...' lines suitable to be written to a buffer +" --------------------------------------------------------------------------- +func! vundle#scripts#bundle_names(names) + return map(copy(a:names), ' printf("Plugin ' ."'%s'".'", v:val) ') +endf + + +" --------------------------------------------------------------------------- +" Open a buffer to display information to the user. Several special commands +" are defined in the new buffer. +" +" title -- a title for the new buffer +" headers -- a list of header lines to be displayed at the top of the buffer +" results -- the main information to be displayed in the buffer (list of +" strings) +" --------------------------------------------------------------------------- +func! vundle#scripts#view(title, headers, results) + if exists('g:vundle_view') && bufloaded(g:vundle_view) + exec g:vundle_view.'bd!' + endif + + exec 'silent pedit [Vundle] '.a:title + + wincmd P | wincmd H + + let g:vundle_view = bufnr('%') + " + " make buffer modifiable + " to append without errors + set modifiable + + call append(0, a:headers + a:results) + + setl buftype=nofile + setl noswapfile + + setl cursorline + setl nonu ro noma + if (exists('&relativenumber')) | setl norelativenumber | endif + + setl ft=vundle + setl syntax=vim + syn keyword vimCommand Plugin + syn keyword vimCommand Bundle + syn keyword vimCommand Helptags + + com! -buffer -bang -nargs=1 DeletePlugin + \ call vundle#installer#run('vundle#installer#delete', split(,',')[0], ['!' == '', ]) + + com! -buffer -bang -nargs=? InstallAndRequirePlugin + \ call vundle#installer#run('vundle#installer#install_and_require', split(,',')[0], ['!' == '', ]) + + com! -buffer -bang -nargs=? InstallPlugin + \ call vundle#installer#run('vundle#installer#install', split(,',')[0], ['!' == '', ]) + + com! -buffer -bang -nargs=0 InstallHelptags + \ call vundle#installer#run('vundle#installer#docs', 'helptags', []) + + com! -buffer -nargs=0 VundleLog call s:view_log() + + com! -buffer -nargs=0 VundleChangelog call s:view_changelog() + + nnoremap q :silent bd! + nnoremap D :exec 'Delete'.getline('.') + + nnoremap add :exec 'Install'.getline('.') + nnoremap add! :exec 'Install'.substitute(getline('.'), '^Plugin ', 'Plugin! ', '') + + nnoremap i :exec 'InstallAndRequire'.getline('.') + nnoremap I :exec 'InstallAndRequire'.substitute(getline('.'), '^Plugin ', 'Plugin! ', '') + + nnoremap l :VundleLog + nnoremap u :VundleChangelog + nnoremap h :h vundle + nnoremap ? :norm h + + nnoremap c :PluginClean + nnoremap C :PluginClean! + + nnoremap s :PluginSearch + nnoremap R :call vundle#scripts#reload() + + " goto first line after headers + exec ':'.(len(a:headers) + 1) +endf + + +" --------------------------------------------------------------------------- +" Load the plugin database from vim-scripts.org . +" +" to -- the filename (string) to save the database to +" return -- 0 on success, 1 if an error occurred +" --------------------------------------------------------------------------- +func! s:fetch_scripts(to) + let scripts_dir = fnamemodify(expand(a:to, 1), ":h") + if !isdirectory(scripts_dir) + call mkdir(scripts_dir, "p") + endif + + let l:vim_scripts_json = 'http://vim-scripts.org/api/scripts.json' + if executable("curl") + let cmd = 'curl --fail -s -o '.vundle#installer#shellesc(a:to).' '.l:vim_scripts_json + elseif executable("wget") + let temp = vundle#installer#shellesc(tempname()) + let cmd = 'wget -q -O '.temp.' '.l:vim_scripts_json. ' && mv -f '.temp.' '.vundle#installer#shellesc(a:to) + if (has('win32') || has('win64')) + let cmd = substitute(cmd, 'mv -f ', 'move /Y ', '') " change force flag + let cmd = vundle#installer#shellesc(cmd) + end + else + echoerr 'Error curl or wget is not available!' + return 1 + endif + + call system(cmd) + + if (0 != v:shell_error) + echoerr 'Error fetching scripts!' + return v:shell_error + endif + return 0 +endf + + +" --------------------------------------------------------------------------- +" Load the plugin database and return a list of all plugins. +" +" bang -- if 1 download the redatabase, else only download if it is not +" readable on disk (i.e. does not exist) +" return -- a list of strings, these are the names (valid bundle +" specifications) of all plugins from vim-scripts.org +" --------------------------------------------------------------------------- +func! s:load_scripts(bang) + let f = expand(g:bundle_dir.'/.vundle/script-names.vim-scripts.org.json', 1) + if a:bang || !filereadable(f) + if 0 != s:fetch_scripts(f) + return [] + end + endif + return eval(readfile(f, 'b')[0]) +endf + +" vim: set expandtab sts=2 ts=2 sw=2 tw=78 norl: diff --git a/vim/bundle/Vundle.vim/changelog.md b/vim/bundle/Vundle.vim/changelog.md new file mode 100644 index 0000000..b620840 --- /dev/null +++ b/vim/bundle/Vundle.vim/changelog.md @@ -0,0 +1,22 @@ +Change Log +========== +F = Feature, B = Bug Fix, D = Doc Change + +### Version 0.10.2 + +- B: #430 Put user script directories before system directories in rtp +- B: #455 Rename functions that start with `g:` + lowercase letter (Vim patch 7.4.264) + +### Version 0.10.1 +- B: #451 Escape spaces when handling rtp directories + +### Version 0.10 +- F: #415 Support plugin pinning (for non-git repos & preventing updates) +- F: #440 Detect plugin name collisions +- F: #418 Deferred rtp manipulation (speeds up start) +- B: #418 Leave default rtp directories (i.e. ~/.vim) where they should be +- B: #429 Fix newline character in log +- B: #440 Detect changed remotes & update repos +- D: #435 Image update in README.md +- D: #419 Add function documentation +- D: #436 Rename vundle to Vundle.vim, add modelines, quickstart update diff --git a/vim/bundle/Vundle.vim/doc/tags b/vim/bundle/Vundle.vim/doc/tags new file mode 100644 index 0000000..7c2e4b9 --- /dev/null +++ b/vim/bundle/Vundle.vim/doc/tags @@ -0,0 +1,38 @@ +:Bundle vundle.txt /*:Bundle* +:BundleClean! vundle.txt /*:BundleClean!* +:BundleInstall! vundle.txt /*:BundleInstall!* +:BundleList vundle.txt /*:BundleList* +:BundleSearch vundle.txt /*:BundleSearch* +:BundleUpdate vundle.txt /*:BundleUpdate* +:Plugin vundle.txt /*:Plugin* +:PluginClean vundle.txt /*:PluginClean* +:PluginClean! vundle.txt /*:PluginClean!* +:PluginInstall vundle.txt /*:PluginInstall* +:PluginInstall! vundle.txt /*:PluginInstall!* +:PluginList vundle.txt /*:PluginList* +:PluginSearch vundle.txt /*:PluginSearch* +:PluginSearch! vundle.txt /*:PluginSearch!* +:PluginUpdate vundle.txt /*:PluginUpdate* +:VundleClean! vundle.txt /*:VundleClean!* +:VundleInstall! vundle.txt /*:VundleInstall!* +:VundleList vundle.txt /*:VundleList* +:VundleSearch vundle.txt /*:VundleSearch* +:VundleUpdate vundle.txt /*:VundleUpdate* +vundle vundle.txt /*vundle* +vundle-about vundle.txt /*vundle-about* +vundle-faq vundle.txt /*vundle-faq* +vundle-interactive vundle.txt /*vundle-interactive* +vundle-interface-change vundle.txt /*vundle-interface-change* +vundle-keymappings vundle.txt /*vundle-keymappings* +vundle-options vundle.txt /*vundle-options* +vundle-plugins vundle.txt /*vundle-plugins* +vundle-plugins-cleanup vundle.txt /*vundle-plugins-cleanup* +vundle-plugins-configure vundle.txt /*vundle-plugins-configure* +vundle-plugins-install vundle.txt /*vundle-plugins-install* +vundle-plugins-list vundle.txt /*vundle-plugins-list* +vundle-plugins-search vundle.txt /*vundle-plugins-search* +vundle-plugins-update vundle.txt /*vundle-plugins-update* +vundle-plugins-uris vundle.txt /*vundle-plugins-uris* +vundle-quickstart vundle.txt /*vundle-quickstart* +vundle-windows vundle.txt /*vundle-windows* +vundle.txt vundle.txt /*vundle.txt* diff --git a/vim/bundle/Vundle.vim/doc/vundle.txt b/vim/bundle/Vundle.vim/doc/vundle.txt new file mode 100644 index 0000000..198584b --- /dev/null +++ b/vim/bundle/Vundle.vim/doc/vundle.txt @@ -0,0 +1,397 @@ +*vundle.txt* Vundle, a plug-in manager for Vim. *vundle* + + VUNDLE MANUAL + +1. About Vundle |vundle-about| +2. Quick Start |vundle-quickstart| +3. Plugins |vundle-plugins| + 3.1. Configuring Plugins |vundle-plugins-configure| + 3.2. Supported URIs |vundle-plugins-uris| + 3.3. Installing Plugins |vundle-plugins-install| + 3.4. Updating Plugins |vundle-plugins-update| + 3.5. Searching Plugins |vundle-plugins-search| + 3.6. Listing Plugins |vundle-plugins-list| + 3.7. Cleaning Up |vundle-plugins-cleanup| +4. Interactive Mode |vundle-interactive| +5. Key Mappings |vundle-keymappings| +6. Options |vundle-options| +7. Plugin Interface Change |vundle-interface-change| + +============================================================================= +1. ABOUT VUNDLE ~ + *vundle-about* + +Vundle is short for Vim bundle and is a Vim plugin manager. + +Vundle allows you to... + + - keep track of and configure your scripts right in the `.vimrc` + - install configured scripts (a.k.a. bundle) + - update configured scripts + - search by name all available Vim scripts + - clean unused scripts up + - run the above actions in a single keypress with interactive mode + +Vundle automatically... + + - manages the runtime path of your installed scripts + - regenerates help tags after installing and updating + +Vundle's search uses http://vim-scripts.org to provide a list of all +available Vim scripts. + +Vundle is undergoing an interface change, see |vundle-interface-change| for +more information. + +============================================================================= +2. QUICK START ~ + *vundle-quickstart* + +1. Introduction: + + Installation requires `Git` and triggers git clone for each configured + repository to `~/.vim/bundle/` by default. Curl is required for search. + + *vundle-windows* + If you are using Windows, see instructions on the Wiki + https://github.com/gmarik/Vundle.vim/wiki/Vundle-for-Windows. + + *vundle-faq* + If you run into any issues, please consult the FAQ at + https://github.com/gmarik/Vundle.vim/wiki + +2. Setup Vundle: +> + git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim +< +3. Configure bundles: + + Put this at the top of your `.vimrc` to use Vundle. Remove bundles you + don't need, they are for illustration purposes. +> + set nocompatible " be iMproved, required + filetype off " required + + " set the runtime path to include Vundle and initialize + set rtp+=~/.vim/bundle/Vundle.vim + call vundle#begin() + " alternatively, pass a path where Vundle should install plugins + "call vundle#begin('~/some/path/here') + + " let Vundle manage Vundle, required + Plugin 'gmarik/Vundle.vim' + + " The following are examples of different formats supported. + " Keep Plugin commands between vundle#begin/end. + " plugin on GitHub repo + Plugin 'tpope/vim-fugitive' + " plugin from http://vim-scripts.org/vim/scripts.html + Plugin 'L9' + " Git plugin not hosted on GitHub + Plugin 'git://git.wincent.com/command-t.git' + " git repos on your local machine (i.e. when working on your own plugin) + Plugin 'file:///home/gmarik/path/to/plugin' + " The sparkup vim script is in a subdirectory of this repo called vim. + " Pass the path to set the runtimepath properly. + Plugin 'rstacruz/sparkup', {'rtp': 'vim/'} + " Avoid a name conflict with L9 + Plugin 'user/L9', {'name': 'newL9'} + + " All of your Plugins must be added before the following line + call vundle#end() " required + filetype plugin indent on " required + " To ignore plugin indent changes, instead use: + "filetype plugin on + " + " Brief help + " :PluginList - list configured plugins + " :PluginInstall(!) - install (update) plugins + " :PluginSearch(!) foo - search (or refresh cache first) for foo + " :PluginClean(!) - confirm (or auto-approve) removal of unused plugins + " + " see :h vundle for more details or wiki for FAQ + " Put your non-Plugin stuff after this line + +4. Install configured bundles: + + Launch vim and run +> + :PluginInstall +< + To install from command line: +> + vim +PluginInstall +qall + +============================================================================= +3. PLUGINS ~ + *vundle-plugins* + +3.1 CONFIGURING PLUGINS ~ + *vundle-plugins-configure* *:Plugin* + +Vundle tracks what plugins you want configured by the `Plugin` commands in your +`.vimrc`. Each `Plugin` command tells Vundle to activate the script on startup +adding it to your |runtimepath|. Commenting out or removing the line will +disable the `Plugin`. + +Each `Plugin` command takes a URI pointing to the script. No comments should +follow on the same line as the command. Example: +> + Plugin 'git_URI' + +The `Plugin` command can optionally take a second argument after the URI. It +has to be a dictionary, separated from the URI by a comma. Each key-value pair +in the dictionary is a configuration option. + +The following per-script configuration options are available. + +The 'rtp' option +---------------- + +Specifies a directory inside the repository (relative path from the root of +the repository) where the vim plugin resides. It determines the path that will +be added to the |runtimepath|. + +For example: +> + Plugin 'git_URI', {'rtp': 'some/subdir/'} + +This can be used with git repositories that put the vim plugin inside a +subdirectory. + +The 'name' option +----------------- + +The name of the directory that will hold the local clone of the configured +script. + +For example: +> + Plugin 'git_URI', {'name': 'newPluginName'} + +This can be used to prevent name collisions between plugins that Vundle would +otherwise try to clone into the same directory. It also provides an additional +level of customisation. + +The 'pinned' option +------------------- + +A flag that, when set to a value of 1, tells Vundle not to perform any git +operations on the plugin, while still adding the existing plugin under the +`bundles` directories to the |runtimepath|. + +For example: +> + Plugin 'mylocalplugin', {'pinned': 1} + +This allows the users to include, with Vundle, plugins tracked with version +control systems other than git, but the user is responsible for cloning and +keeping up to date. It also allows the users to stay in the current version of +a plugin that might have previously been updated by Vundle. + +Please note that the URI will be treated the same as for any other plugins, so +only the last part of it will be added to the |runtimepath|. The user is +advised to use this flag only with single word URIs to avoid confusion. + +3.2 SUPPORTED URIS ~ + *vundle-plugins-uris* + +`Vundle` integrates very well with both GitHub and vim-scripts.org +(http://vim-scripts.org/vim/scripts.html) allowing short URIs. It also allows +the use of any URI `git` recognizes. In all of the following cases (except +local) the 'https' protocol is used, see Vundle's options to override this. + +More information on `git`'s protocols can be found at: +http://git-scm.com/book/ch4-1.html + +GitHub +------ +GitHub is used when a user/repo is passed to `Plugin`. +> + Plugin 'gmarik/Vundle.vim' => https://github.com/gmarik/Vundle.vim + +Vim Scripts +----------- +Any single word without a slash '/' is assumed to be from Vim Scripts. +> + Plugin 'ctrlp.vim' => https://github.com/vim-scripts/ctrlp.vim + +Other Git URIs +-------------- +No modification is performed on valid URIs that point outside the above +URLs. +> + Plugin 'git://git.wincent.com/command-t.git' + +Local Plugins +------------- +The git protocol supports local installation using the 'file://' protocol. +This is handy when developing plugins locally. Follow the protocol with an +absolute path to the script directory. +> + Plugin 'file:///path/from/root/to/plugin' + +3.3 INSTALLING PLUGINS ~ + *vundle-plugins-install* *:PluginInstall* +> + :PluginInstall + +Will install all plugins configured in your `.vimrc`. Newly installed +plugins will be automatically enabled. Some plugins may require extra steps +such as compilation or external programs, refer to their documentation. + +PluginInstall allows installation of plugins by name: +> + :PluginInstall unite.vim + +Installs and activates unite.vim. You can use Tab to auto-complete known +script names. Note that the installation just described isn't permanent. To +finish, you must put `Plugin 'unite.vim'` at the appropriate place in your +`.vimrc` to tell Vundle to load the plugin at startup. + +After installing plugins press 'l' (lowercase 'L') to see the log of commands +if any errors occurred. + +3.4 UPDATING PLUGINS ~ + *vundle-plugins-update* *:PluginUpdate* *:PluginInstall!* +> + :PluginInstall! " NOTE: bang(!) +or > + :PluginUpdate + +Installs or updates the configured plugins. Press 'u' after updates complete +to see the change log of all updated bundles. Press 'l' (lowercase 'L') to +see the log of commands if any errors occurred. + +3.5 SEARCHING PLUGINS ~ + *vundle-plugins-search* *:PluginSearch* +> + :PluginSearch + +Search requires that `curl` be available on the system. The command searches +Vim Scripts (http://vim-scripts.org/vim/scripts.html) for matching +plugins. Results display in a new split window. For example: +> + PluginSearch foo + +displays: +> + "Search results for: foo + Plugin 'MarkdownFootnotes' + Plugin 'VimFootnotes' + Plugin 'foo.vim' +< + *:PluginSearch!* +Alternatively, you can refresh the script list before searching by adding a +bang to the command. +> + :PluginSearch! foo + +If the command is run without argument: +> + :PluginSearch! + +it will display all known plugins in the new split. + +3.6 LISTING BUNDLES ~ + *vundle-plugins-list* *:PluginList* +> + :PluginList + +Displays a list of installed bundles. + +3.7 CLEANING UP ~ + *vundle-plugins-cleanup* *:PluginClean* +> + :PluginClean + +Requests confirmation for the removal of all plugins no longered configured +in your `.vimrc` but present in your bundle installation directory +(default: `.vim/bundle/`). + + *:PluginClean!* +> + :PluginClean! + +Automatically confirm removal of unused bundles. + +============================================================================= +4. INTERACTIVE MODE ~ + *vundle-interactive* + +Vundle provides a simple interactive mode to help you explore new plugins +easily. Interactive mode is available after any command that lists `Plugins` +such as PluginSearch, PluginList or Plugins. For instance: +> + :PluginSearch! unite + +Searches for plugins matching 'unite' and yields a split window with: +> + "Keymap: i - Install bundle; c - Cleanup; s - Search; R - Reload list + "Search results for: unite + Plugin 'unite-scriptenames' + Plugin 'unite.vim' + Plugin 'unite-yarm' + Plugin 'unite-gem' + Plugin 'unite-locate' + Plugin 'unite-font' + Plugin 'unite-colorscheme' + +To install a bundle, move your cursor to the Plugin of interest and then +select a command. To install 'unite.vim' put your cursor on the line and +then push `i`. For a more complete list see |vundle-keymappings|. After +unite.vim is installed the `:Unite file` command should be available. + +Note: Interactive installation doesn't update your `.vimrc`. + +============================================================================= +5. KEY MAPPINGS ~ + *vundle-keymappings* + +KEY | DESCRIPTION +----|-------------------------- > + i | run :PluginInstall with name taken from line cursor is positioned on + I | same as i, but runs :PluginInstall! to update bundle + D | delete selected bundle (be careful not to remove local modifications) + c | run :PluginClean + s | run :PluginSearch + R | fetch fresh script list from server + +============================================================================= +6. OPTIONS ~ + *vundle-options* +> + let g:vundle_default_git_proto = 'git' +< + This option makes Vundle use `git` instead of `https` when building + absolute URIs. For example: +> + Plugin 'sjl/gundo.vim' -> git@github.com:sjl/gundo.git + +============================================================================= +7. VUNDLE INTERFACE CHANGE ~ + *vundle-interface-change* *:Bundle* *:BundleInstall!* + *:BundleUpdate* *:BundleSearch* *:BundleList* *:BundleClean!* + *:VundleInstall!* *:VundleUpdate* *:VundleSearch* + *:VundleList* *:VundleClean!* + + In order to bring in new changes, Vundle is adopting a new interface. + Going forward we will support primarily the Plugin namespace, additionally + for convenience we will also alias some commands to the Vundle namespace. + The following table summarizes the interface changes. + + Deprecated Names | New Names + ----------------------------- + Bundle | Plugin + BundleInstall(!) | PluginInstall(!), VundleInstall(!) + BundleUpdate | PluginUpdate, VundleUpdate + BundleSearch(!) | PluginSearch(!), VundleSearch(!) + BundleClean | PluginClean(!), VundleClean(!) + BundleList | PluginList + + Note: The Bundle commands will be deprecated. You may continue using them, + but they may not get all future updates. For instance, we have enabled + comments on Plugin lines but not Bundle, since it requires a change in + command declaration. + +" vim: set expandtab sts=2 ts=2 sw=2 tw=78 ft=help norl: diff --git a/vim/bundle/Vundle.vim/test/files/test.erl b/vim/bundle/Vundle.vim/test/files/test.erl new file mode 100644 index 0000000..1672953 --- /dev/null +++ b/vim/bundle/Vundle.vim/test/files/test.erl @@ -0,0 +1,20 @@ +-module(mmc_logmon_sup). +-behaviour(supervisor). +-export([init/1]). + +init(_) -> + {ok, { + {one_for_one, 5, 1}, + [ + {listener, + {aaa, start_link, []}, + permanent, 100, worker, + [aaa] + }, + {server, + {bbb, start_link, []}, + permanent, 100, worker, + [bbb] + } + ] + }}. diff --git a/vim/bundle/Vundle.vim/test/minirc.vim b/vim/bundle/Vundle.vim/test/minirc.vim new file mode 100644 index 0000000..3c24395 --- /dev/null +++ b/vim/bundle/Vundle.vim/test/minirc.vim @@ -0,0 +1,8 @@ +set nocompatible +syntax on +filetype off +set rtp+=~/.vim/bundle/Vundle.vim/ +call vundle#rc() +Bundle 'gmarik/Vundle.vim' +filetype plugin indent on + diff --git a/vim/bundle/Vundle.vim/test/vimrc b/vim/bundle/Vundle.vim/test/vimrc new file mode 100644 index 0000000..d8455a7 --- /dev/null +++ b/vim/bundle/Vundle.vim/test/vimrc @@ -0,0 +1,81 @@ +" vim -u test/vimrc +set nocompatible + +set nowrap + +let bundle_dir = '/tmp/vundle-test/bundles/' +" let src = 'http://github.com/gmarik/vundle.git' + +" Vundle Options +" let g:vundle_default_git_proto = 'git' + +silent execute '!mkdir -p '.bundle_dir +silent execute '!ln -f -s ~/.vim/bundle/Vundle.vim '.bundle_dir + +filetype off +syntax on + +runtime macros/matchit.vim + +" This test should be executed in "test" directory +exec 'set rtp^='.bundle_dir.'Vundle.vim/' + +call vundle#rc(bundle_dir) + + +Plugin 'molokai' " vim-scripts name + +" github username with dashes +Bundle 'vim-scripts/ragtag.vim' + +" original repo +Bundle 'altercation/vim-colors-solarized' +" with extension +Bundle 'nelstrom/vim-mac-classic-theme.git' +" +" invalid uri +"Bundle 'nonexistinguser/yupppierepo.git' + +" full uri +Bundle 'https://github.com/vim-scripts/vim-game-of-life' +" full uri +Bundle 'git@github.com:gmarik/ingretu.git' +" short uri +Bundle 'gh:gmarik/snipmate.vim.git' +Bundle 'github:mattn/gist-vim.git' + +" local uri stuff +Bundle '~/Dropbox/.gitrepos/utilz.vim.git' +" Bundle 'file://Dropbox/.gitrepos/utilz.vim.git' + +" with options +Bundle 'rstacruz/sparkup.git', {'rtp': 'vim/'} +Bundle 'matchit.zip', {'name': 'matchit'} + +" Camel case +Bundle 'vim-scripts/RubySinatra' + +" syntax issue #203 +Bundle 'jimenezrick/vimerl' + +" Static bundle: Same name as a valid vim-scripts bundle +Bundle 'latte', {'pinned' : 1} +if !isdirectory(expand(bundle_dir) . '/latte') + call mkdir(expand(bundle_dir) . '/latte', 'p') +endif + + +filetype plugin indent on " Automatically detect file types. + +set wildignore+=doc " should not break helptags +set wildignore+=.git " should not break clone +set wildignore+=.git/* " should not break clone +set wildignore+=*/.git/* +" TODO: helptags fails with this +" set wildignore+=doc/* " should not break clone +" set wildignore+=*/doc/* + +au VimEnter * BundleInstall + +" e test/files/erlang.erl +" vim: set expandtab sts=2 ts=2 sw=2 tw=78: diff --git a/vim/bundle/jsbeautify/README b/vim/bundle/jsbeautify/README new file mode 100644 index 0000000..a244d26 --- /dev/null +++ b/vim/bundle/jsbeautify/README @@ -0,0 +1,13 @@ +This is a mirror of http://www.vim.org/scripts/script.php?script_id=2727 + +a plugin to format your javascript souce code + +A js version can be found at: +http://jsbeautifier.org/ + +I just translated it into vimscript, it works at a low performance:) + +usage: + ff +or + bind the g:Jsbeautify() function to any short key you like diff --git a/vim/bundle/jsbeautify/plugin/jsbeautify.vim b/vim/bundle/jsbeautify/plugin/jsbeautify.vim new file mode 100644 index 0000000..2512aa1 --- /dev/null +++ b/vim/bundle/jsbeautify/plugin/jsbeautify.vim @@ -0,0 +1,623 @@ +if &cp || exists("loaded_jsbeautify") + finish +endif +let loaded_jsbeautify = 3 + + + +function! s:trim_output() + while len(s:output) > 0 && (s:output[len(s:output)-1] == " " || s:output[len(s:output)-1] == s:indent_string) + call remove(s:output, -1) + endwhile +endfunction + +function! s:print_newline(ignore_repeated) + let s:if_line_flag = 0 + call s:trim_output() + if len(s:output)==0 + return + endif + if s:output[len(s:output)-1] != "\n" || !a:ignore_repeated + call add(s:output, "\n") + endif + let index = 0 + while index < s:indent_level + call add(s:output, s:indent_string) + let index += 1 + endwhile +endfunction + +function! s:print_space() + let last_output = " " + if len(s:output) > 0 + let last_output = s:output[len(s:output) - 1] + endif + if last_output != " " && last_output != "\n" && last_output != s:indent_string + call add(s:output, " ") + endif +endfunction + +function! s:print_token() + call add(s:output, s:token_text) +endfunctio + +function! s:indent() + let s:indent_level += 1 +endfunction + +function! s:unindent() + if s:indent_level + let s:indent_level -= 1 + endif +endfunction + +function! s:remove_indent() + if len(s:output)>0 && s:output[len(s:output) -1] == s:indent_string + call remove(s:output, -1) + endif +endfunction + +function! s:set_mode(mode) + call add(s:modes, s:current_mode) + let s:current_mode = a:mode +endfunction + +function! s:restore_mode() + if s:current_mode == "DO_BLOCK" + let s:do_block_just_closed = 1 + else + let s:do_block_just_closed = 0 + endif + let s:current_mode = remove(s:modes, -1) +endfunction + +function! s:in_array(what, arr) + return index(a:arr, a:what) != -1 +endfunction + +function! s:get_next_token() + let n_newlines = 0 + + if s:parser_pos >= len(s:input) + return ["", "TK_EOF"] + endif + + let c = s:input[s:parser_pos] + let s:parser_pos += 1 + + while s:in_array(c, s:whitespace) + if s:parser_pos >= len(s:input) + return ["", "TK_EOF"] + endif + + if c == "\n" + let n_newlines += 1 + endif + + let c = s:input[s:parser_pos] + let s:parser_pos += 1 + endwhile + + let wanted_newline = 0 + + if s:opt_preserve_newlines + if n_newlines > 1 + for i in [0, 1] + call s:print_newline(i==0) + endfor + endif + let wanted_newline = n_newlines == 1 + endif + + if s:in_array(c, s:wordchar) + if s:parser_pos < len(s:input) + while s:in_array(s:input[s:parser_pos], s:wordchar) + let c .= s:input[s:parser_pos] + let s:parser_pos += 1 + if s:parser_pos == len(s:input) + break + endif + endwhile + endif + + "if s:parser_pos != len(s:input) && c =~ /^[0-9]+[Ee]$/ && (s:input[s:parser_pos] == "-" || s:input[s:parser_pos] == "+") + "let sign = s:input[s:parser_pos] + "let s:parser_pos += 1 + + "let t = get_next_token(s:parser_pos) + "let c .= sign . t[0] + "return [c, "TK_WORD"] + " endif + + if c == "in" + return [c, "TK_OPERATOR"] + endif + if wanted_newline && s:last_type != "TK_OPERATOR" && !s:if_line_flag + call s:print_newline(1) + endif + return [c, "TK_WORD"] + endif + if c == "(" || c == "[" + return [c, "TK_START_EXPR"] + endif + + if c == ")" || c == "]" + return [c, "TK_END_EXPR"] + endif + + if c == "{" + return [c, "TK_START_BLOCK"] + endif + + if c == "}" + return [c, "TK_END_BLOCK"] + endif + + if c == ";" + return [c, "TK_SEMICOLON"] + endif + + if c == "/" + let comment = "" + if s:input[s:parser_pos] == "*" + let s:parser_pos += 1 + if s:parser_pos < len(s:input) + while !(s:input[s:parser_pos] == "*" && s:parser_pos + 1 < len(s:input) && s:input[s:parser_pos + 1] == "/" && s:parser_pos < len(s:input)) + let comment .= s:input[s:parser_pos] + let s:parser_pos += 1 + if s:parser_pos >= len(s:input) + break + endif + endwhile + endif + let s:parser_pos += 2 + return ['/*' . comment . '*/', 'TK_BLOCK_COMMENT'] + endif + + " peek for comment // ... + if s:input[s:parser_pos] == "/" + let comment = c + while s:input[s:parser_pos] != "\r" && s:input[s:parser_pos] != "\n" + let comment .= s:input[s:parser_pos] + let s:parser_pos += 1 + if s:parser_pos >= len(s:input) + break + endif + endwhile + let s:parser_pos += 1 + if wanted_newline + call s:print_newline(1) + endif + return [comment, "TK_COMMENT"] + endif + endif + + if c == "'" || c =='"' || (c == "/" && ((s:last_type == "TK_WORD" && s:last_text == "return") || (s:last_type == "TK_START_EXPR" || s:last_type == "TK_START_BLOCK" || s:last_type == "TK_END_BLOCK" || s:last_type == "TK_OPERATOR" || s:last_type == "TK_EOF" || s:last_type == "TK_SEMICOLON"))) + let sep = c + let esc = 0 + let resulting_string = c + + if s:parser_pos < len(s:input) + while esc || s:input[s:parser_pos] != sep + let resulting_string .= s:input[s:parser_pos] + if !esc + let esc = s:input[s:parser_pos] == "\\" + else + let esc = 0 + endif + let s:parser_pos += 1 + if s:parser_pos >= len(s:input) + return [resulting_string, "TK_STRING"] + endif + endwhile + endif + + let s:parser_pos += 1 + + let resulting_string .= sep + + if sep == "/" + + while s:parser_pos < len(s:input) && s:in_array(s:input[s:parser_pos], s:wordchar) + let resulting_string .= s:input[s:parser_pos] + let s:parser_pos += 1 + endwhile + endif + return [resulting_string, "TK_STRING"] + endif + + if c == "#" + let sharp = "#" + if s:parser_pos < len(s:input) && s:in_array(s:input[s:parser_pos], s:digits) + let c = s:input[s:parser_pos] + let sharp .= c + let s:parser_pos += 1 + + while s:parser_pos < len(s:input) && c != "#" && c !="=" + let c = s:input[s:parser_pos] + let sharp .= c + let s:parser_pos += 1 + endwhile + + if c == "#" + return [sharp, "TK_WORD"] + else + return [sharp, "TK_OPERATOR"] + endif + endif + endif + + if c == "<" && s:input[s:parser_pos-1 : s:parser_pos+3] == "" + let s:parser_pos += 2 + if wanted_newline + call s:print_newline(1) + endif + return ["-->", "TK_COMMENT"] + endif + + if s:in_array(c, s:punct) + while s:parser_pos < len(s:input) && s:in_array(c . s:input[s:parser_pos], s:punct) + let c .= s:input[s:parser_pos] + let s:parser_pos += 1 + if s:parser_pos >= len(s:input) + break + endif + endwhile + + return [c, "TK_OPERATOR"] + endif + + return [c, "TK_UNKNOWN"] + endif + + + +endfunction + +function! s:is_js() + return expand("%:e") == "js" +endfunction + +"function! g:Jsbeautify(js_source_text, options) +function! g:Jsbeautify() + if !s:is_js() + echo "Not a JS file." + return + endif + + "let a:options = {} + let s:opt_indent_size = 1 + let s:opt_indent_char = "\t" + let s:opt_preserve_newlines = 1 + let s:opt_indent_level = 0 + + let s:if_line_flag = 0 + "-------------------------------- + + let s:indent_string = "" + while s:opt_indent_size > 0 + let s:indent_string .= s:opt_indent_char + let s:opt_indent_size -= 1 + endwhile + + let s:indent_level = s:opt_indent_level + + let lines = getline(1, "$") + let s:input = join(lines, "\n") + "let s:input = a:js_source_text + + let s:last_word = "" "last 'TK_WORD' passed + let s:last_type = "TK_START_EXPR" "last token type + let s:last_text = "" "last token text + let s:output = [] + + let s:do_block_just_closed = 0 + let s:var_line = 0 + let s:var_line_tainted = 0 + + let s:whitespace = ["\n", "\r", "\t", " "] + let s:wordchar = split("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$", '\zs') + let s:digits = split("0123456789", '\zs') + + " diff --git a/vim/bundle/vim-template/templates/=template=*.xsl b/vim/bundle/vim-template/templates/=template=*.xsl new file mode 100644 index 0000000..80eec18 --- /dev/null +++ b/vim/bundle/vim-template/templates/=template=*.xsl @@ -0,0 +1,12 @@ + + + + + %HERE% + + diff --git a/vim/bundle/vim-template/templates/=template=*.zcml b/vim/bundle/vim-template/templates/=template=*.zcml new file mode 100644 index 0000000..29f34b8 --- /dev/null +++ b/vim/bundle/vim-template/templates/=template=*.zcml @@ -0,0 +1,8 @@ + + + %HERE% + + diff --git a/vim/bundle/vim-template/templates/=template=*GNUmakefile b/vim/bundle/vim-template/templates/=template=*GNUmakefile new file mode 120000 index 0000000..fd167eb --- /dev/null +++ b/vim/bundle/vim-template/templates/=template=*GNUmakefile @@ -0,0 +1 @@ +=template=*Makefile \ No newline at end of file diff --git a/vim/bundle/vim-template/templates/=template=*Makefile b/vim/bundle/vim-template/templates/=template=*Makefile new file mode 100644 index 0000000..31e767c --- /dev/null +++ b/vim/bundle/vim-template/templates/=template=*Makefile @@ -0,0 +1,11 @@ +# +# %FFILE% +# %USER%, %FDATE% +# + +all: + %HERE%@echo "%FFILE% needs your attention" + + +# vim:ft=make +# \ No newline at end of file diff --git a/vim/colors/Tomorrow-Night-Eighties.vim b/vim/colors/Tomorrow-Night-Eighties.vim new file mode 100644 index 0000000..6199cba --- /dev/null +++ b/vim/colors/Tomorrow-Night-Eighties.vim @@ -0,0 +1,472 @@ +" Tomorrow Night Eighties - Full Colour and 256 Colour +" http://chriskempson.com +" +" Hex colour conversion functions borrowed from the theme "Desert256"" + +" Default GUI Colours +let s:foreground = "cccccc" +let s:background = "2d2d2d" +let s:selection = "515151" +let s:line = "393939" +let s:comment = "999999" +let s:red = "f2777a" +let s:orange = "f99157" +let s:yellow = "ffcc66" +let s:green = "99cc99" +let s:aqua = "66cccc" +let s:blue = "6699cc" +let s:purple = "cc99cc" +let s:window = "4d5057" + +hi clear +syntax reset + +let g:colors_name = "Tomorrow-Night-Eighties" + +if has("gui_running") || &t_Co == 88 || &t_Co == 256 + " Returns an approximate grey index for the given grey level + fun grey_number(x) + if &t_Co == 88 + if a:x < 23 + return 0 + elseif a:x < 69 + return 1 + elseif a:x < 103 + return 2 + elseif a:x < 127 + return 3 + elseif a:x < 150 + return 4 + elseif a:x < 173 + return 5 + elseif a:x < 196 + return 6 + elseif a:x < 219 + return 7 + elseif a:x < 243 + return 8 + else + return 9 + endif + else + if a:x < 14 + return 0 + else + let l:n = (a:x - 8) / 10 + let l:m = (a:x - 8) % 10 + if l:m < 5 + return l:n + else + return l:n + 1 + endif + endif + endif + endfun + + " Returns the actual grey level represented by the grey index + fun grey_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 46 + elseif a:n == 2 + return 92 + elseif a:n == 3 + return 115 + elseif a:n == 4 + return 139 + elseif a:n == 5 + return 162 + elseif a:n == 6 + return 185 + elseif a:n == 7 + return 208 + elseif a:n == 8 + return 231 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 8 + (a:n * 10) + endif + endif + endfun + + " Returns the palette index for the given grey index + fun grey_colour(n) + if &t_Co == 88 + if a:n == 0 + return 16 + elseif a:n == 9 + return 79 + else + return 79 + a:n + endif + else + if a:n == 0 + return 16 + elseif a:n == 25 + return 231 + else + return 231 + a:n + endif + endif + endfun + + " Returns an approximate colour index for the given colour level + fun rgb_number(x) + if &t_Co == 88 + if a:x < 69 + return 0 + elseif a:x < 172 + return 1 + elseif a:x < 230 + return 2 + else + return 3 + endif + else + if a:x < 75 + return 0 + else + let l:n = (a:x - 55) / 40 + let l:m = (a:x - 55) % 40 + if l:m < 20 + return l:n + else + return l:n + 1 + endif + endif + endif + endfun + + " Returns the actual colour level for the given colour index + fun rgb_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 139 + elseif a:n == 2 + return 205 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 55 + (a:n * 40) + endif + endif + endfun + + " Returns the palette index for the given R/G/B colour indices + fun rgb_colour(x, y, z) + if &t_Co == 88 + return 16 + (a:x * 16) + (a:y * 4) + a:z + else + return 16 + (a:x * 36) + (a:y * 6) + a:z + endif + endfun + + " Returns the palette index to approximate the given R/G/B colour levels + fun colour(r, g, b) + " Get the closest grey + let l:gx = grey_number(a:r) + let l:gy = grey_number(a:g) + let l:gz = grey_number(a:b) + + " Get the closest colour + let l:x = rgb_number(a:r) + let l:y = rgb_number(a:g) + let l:z = rgb_number(a:b) + + if l:gx == l:gy && l:gy == l:gz + " There are two possibilities + let l:dgr = grey_level(l:gx) - a:r + let l:dgg = grey_level(l:gy) - a:g + let l:dgb = grey_level(l:gz) - a:b + let l:dgrey = (l:dgr * l:dgr) + (l:dgg * l:dgg) + (l:dgb * l:dgb) + let l:dr = rgb_level(l:gx) - a:r + let l:dg = rgb_level(l:gy) - a:g + let l:db = rgb_level(l:gz) - a:b + let l:drgb = (l:dr * l:dr) + (l:dg * l:dg) + (l:db * l:db) + if l:dgrey < l:drgb + " Use the grey + return grey_colour(l:gx) + else + " Use the colour + return rgb_colour(l:x, l:y, l:z) + endif + else + " Only one possibility + return rgb_colour(l:x, l:y, l:z) + endif + endfun + + " Returns the palette index to approximate the 'rrggbb' hex string + fun rgb(rgb) + let l:r = ("0x" . strpart(a:rgb, 0, 2)) + 0 + let l:g = ("0x" . strpart(a:rgb, 2, 2)) + 0 + let l:b = ("0x" . strpart(a:rgb, 4, 2)) + 0 + + return colour(l:r, l:g, l:b) + endfun + + " Sets the highlighting for the given group + fun X(group, fg, bg, attr) + if a:fg != "" + exec "hi " . a:group . " guifg=#" . a:fg . " ctermfg=" . rgb(a:fg) + endif + if a:bg != "" + exec "hi " . a:group . " guibg=#" . a:bg . " ctermbg=" . rgb(a:bg) + endif + if a:attr != "" + exec "hi " . a:group . " gui=" . a:attr . " cterm=" . a:attr + endif + endfun + + " Vim Highlighting + call X("Normal", s:foreground, s:background, "") + call X("LineNr", s:selection, "", "") + call X("NonText", s:selection, "", "") + call X("SpecialKey", s:selection, "", "") + call X("Search", s:background, s:yellow, "") + call X("TabLine", s:window, s:foreground, "reverse") + call X("TabLineFill", s:window, s:foreground, "reverse") + call X("StatusLine", s:window, s:yellow, "reverse") + call X("StatusLineNC", s:window, s:foreground, "reverse") + call X("VertSplit", s:window, s:window, "none") + call X("Visual", "", s:selection, "") + call X("Directory", s:blue, "", "") + call X("ModeMsg", s:green, "", "") + call X("MoreMsg", s:green, "", "") + call X("Question", s:green, "", "") + call X("WarningMsg", s:red, "", "") + call X("MatchParen", "", s:selection, "") + call X("Folded", s:comment, s:background, "") + call X("FoldColumn", "", s:background, "") + if version >= 700 + call X("CursorLine", "", s:line, "none") + call X("CursorColumn", "", s:line, "none") + call X("PMenu", s:foreground, s:selection, "none") + call X("PMenuSel", s:foreground, s:selection, "reverse") + call X("SignColumn", "", s:background, "none") + end + if version >= 703 + call X("ColorColumn", "", s:line, "none") + end + + " Standard Highlighting + call X("Comment", s:comment, "", "") + call X("Todo", s:comment, s:background, "") + call X("Title", s:comment, "", "") + call X("Identifier", s:red, "", "none") + call X("Statement", s:foreground, "", "") + call X("Conditional", s:foreground, "", "") + call X("Repeat", s:foreground, "", "") + call X("Structure", s:purple, "", "") + call X("Function", s:blue, "", "") + call X("Constant", s:orange, "", "") + call X("Keyword", s:orange, "", "") + call X("String", s:green, "", "") + call X("Special", s:foreground, "", "") + call X("PreProc", s:purple, "", "") + call X("Operator", s:aqua, "", "none") + call X("Type", s:blue, "", "none") + call X("Define", s:purple, "", "none") + call X("Include", s:blue, "", "") + "call X("Ignore", "666666", "", "") + + " Vim Highlighting + call X("vimCommand", s:red, "", "none") + + " C Highlighting + call X("cType", s:yellow, "", "") + call X("cStorageClass", s:purple, "", "") + call X("cConditional", s:purple, "", "") + call X("cRepeat", s:purple, "", "") + + " PHP Highlighting + call X("phpVarSelector", s:red, "", "") + call X("phpKeyword", s:purple, "", "") + call X("phpRepeat", s:purple, "", "") + call X("phpConditional", s:purple, "", "") + call X("phpStatement", s:purple, "", "") + call X("phpMemberSelector", s:foreground, "", "") + + " Ruby Highlighting + call X("rubySymbol", s:green, "", "") + call X("rubyConstant", s:yellow, "", "") + call X("rubyAccess", s:yellow, "", "") + call X("rubyAttribute", s:blue, "", "") + call X("rubyInclude", s:blue, "", "") + call X("rubyLocalVariableOrMethod", s:orange, "", "") + call X("rubyCurlyBlock", s:orange, "", "") + call X("rubyStringDelimiter", s:green, "", "") + call X("rubyInterpolationDelimiter", s:orange, "", "") + call X("rubyConditional", s:purple, "", "") + call X("rubyRepeat", s:purple, "", "") + call X("rubyControl", s:purple, "", "") + call X("rubyException", s:purple, "", "") + + " Python Highlighting + call X("pythonInclude", s:purple, "", "") + call X("pythonStatement", s:purple, "", "") + call X("pythonConditional", s:purple, "", "") + call X("pythonRepeat", s:purple, "", "") + call X("pythonException", s:purple, "", "") + call X("pythonFunction", s:blue, "", "") + call X("pythonPreCondit", s:purple, "", "") + call X("pythonRepeat", s:aqua, "", "") + call X("pythonExClass", s:orange, "", "") + + " JavaScript Highlighting + call X("javaScriptBraces", s:foreground, "", "") + call X("javaScriptFunction", s:purple, "", "") + call X("javaScriptConditional", s:purple, "", "") + call X("javaScriptRepeat", s:purple, "", "") + call X("javaScriptNumber", s:orange, "", "") + call X("javaScriptMember", s:orange, "", "") + call X("javascriptNull", s:orange, "", "") + call X("javascriptGlobal", s:blue, "", "") + call X("javascriptStatement", s:red, "", "") + + " CoffeeScript Highlighting + call X("coffeeRepeat", s:purple, "", "") + call X("coffeeConditional", s:purple, "", "") + call X("coffeeKeyword", s:purple, "", "") + call X("coffeeObject", s:yellow, "", "") + + " HTML Highlighting + call X("htmlTag", s:red, "", "") + call X("htmlTagName", s:red, "", "") + call X("htmlArg", s:red, "", "") + call X("htmlScriptTag", s:red, "", "") + + " Diff Highlighting + call X("diffAdd", "", "4c4e39", "") + call X("diffDelete", s:background, s:red, "") + call X("diffChange", "", "2B5B77", "") + call X("diffText", s:line, s:blue, "") + + " ShowMarks Highlighting + call X("ShowMarksHLl", s:orange, s:background, "none") + call X("ShowMarksHLo", s:purple, s:background, "none") + call X("ShowMarksHLu", s:yellow, s:background, "none") + call X("ShowMarksHLm", s:aqua, s:background, "none") + + " Lua Highlighting + call X("luaStatement", s:purple, "", "") + call X("luaRepeat", s:purple, "", "") + call X("luaCondStart", s:purple, "", "") + call X("luaCondElseif", s:purple, "", "") + call X("luaCond", s:purple, "", "") + call X("luaCondEnd", s:purple, "", "") + + " Cucumber Highlighting + call X("cucumberGiven", s:blue, "", "") + call X("cucumberGivenAnd", s:blue, "", "") + + " Go Highlighting + call X("goDirective", s:purple, "", "") + call X("goDeclaration", s:purple, "", "") + call X("goStatement", s:purple, "", "") + call X("goConditional", s:purple, "", "") + call X("goConstants", s:orange, "", "") + call X("goTodo", s:yellow, "", "") + call X("goDeclType", s:blue, "", "") + call X("goBuiltins", s:purple, "", "") + + " Clojure "highlighting + call X("clojureConstant", s:orange, "", "") + call X("clojureBoolean", s:orange, "", "") + call X("clojureCharacter", s:orange, "", "") + call X("clojureKeyword", s:green, "", "") + call X("clojureNumber", s:orange, "", "") + call X("clojureString", s:green, "", "") + call X("clojureRegexp", s:green, "", "") + call X("clojureParen", s:aqua, "", "") + call X("clojureVariable", s:yellow, "", "") + call X("clojureCond", s:blue, "", "") + call X("clojureDefine", s:purple, "", "") + call X("clojureException", s:red, "", "") + call X("clojureFunc", s:blue, "", "") + call X("clojureMacro", s:blue, "", "") + call X("clojureRepeat", s:blue, "", "") + call X("clojureSpecial", s:purple, "", "") + call X("clojureQuote", s:blue, "", "") + call X("clojureUnquote", s:blue, "", "") + call X("clojureMeta", s:blue, "", "") + call X("clojureDeref", s:blue, "", "") + call X("clojureAnonArg", s:blue, "", "") + call X("clojureRepeat", s:blue, "", "") + call X("clojureDispatch", s:blue, "", "") + + " Scala "highlighting + call X("scalaKeyword", s:purple, "", "") + call X("scalaKeywordModifier", s:purple, "", "") + call X("scalaOperator", s:blue, "", "") + call X("scalaPackage", s:red, "", "") + call X("scalaFqn", s:foreground, "", "") + call X("scalaFqnSet", s:foreground, "", "") + call X("scalaImport", s:purple, "", "") + call X("scalaBoolean", s:orange, "", "") + call X("scalaDef", s:purple, "", "") + call X("scalaVal", s:purple, "", "") + call X("scalaVar", s:aqua, "", "") + call X("scalaClass", s:purple, "", "") + call X("scalaObject", s:purple, "", "") + call X("scalaTrait", s:purple, "", "") + call X("scalaDefName", s:blue, "", "") + call X("scalaValName", s:foreground, "", "") + call X("scalaVarName", s:foreground, "", "") + call X("scalaClassName", s:foreground, "", "") + call X("scalaType", s:yellow, "", "") + call X("scalaTypeSpecializer", s:yellow, "", "") + call X("scalaAnnotation", s:orange, "", "") + call X("scalaNumber", s:orange, "", "") + call X("scalaDefSpecializer", s:yellow, "", "") + call X("scalaClassSpecializer", s:yellow, "", "") + call X("scalaBackTick", s:green, "", "") + call X("scalaRoot", s:foreground, "", "") + call X("scalaMethodCall", s:blue, "", "") + call X("scalaCaseType", s:yellow, "", "") + call X("scalaLineComment", s:comment, "", "") + call X("scalaComment", s:comment, "", "") + call X("scalaDocComment", s:comment, "", "") + call X("scalaDocTags", s:comment, "", "") + call X("scalaEmptyString", s:green, "", "") + call X("scalaMultiLineString", s:green, "", "") + call X("scalaUnicode", s:orange, "", "") + call X("scalaString", s:green, "", "") + call X("scalaStringEscape", s:green, "", "") + call X("scalaSymbol", s:orange, "", "") + call X("scalaChar", s:orange, "", "") + call X("scalaXml", s:green, "", "") + call X("scalaConstructorSpecializer", s:yellow, "", "") + call X("scalaBackTick", s:blue, "", "") + + " Git + call X("diffAdded", s:green, "", "") + call X("diffRemoved", s:red, "", "") + call X("gitcommitSummary", "", "", "bold") + + " Delete Functions + delf X + delf rgb + delf colour + delf rgb_colour + delf rgb_level + delf rgb_number + delf grey_colour + delf grey_level + delf grey_number +endif + +set background=dark diff --git a/vim/oldStyle/disabled_plugins/NERD_commenter.vim b/vim/oldStyle/disabled_plugins/NERD_commenter.vim new file mode 100644 index 0000000..ef88dd4 --- /dev/null +++ b/vim/oldStyle/disabled_plugins/NERD_commenter.vim @@ -0,0 +1,2790 @@ +" ============================================================================ +" File: NERD_commenter.vim +" Description: vim global plugin that provides easy code commenting +" Maintainer: Martin Grenfell +" Version: 2.3.0 +" Last Change: 08th December, 2010 +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +" ============================================================================ + +" Section: script init stuff {{{1 +if exists("loaded_nerd_comments") + finish +endif +if v:version < 700 + echoerr "NERDCommenter: this plugin requires vim >= 7. DOWNLOAD IT! You'll thank me later!" + finish +endif +let loaded_nerd_comments = 1 + +" Function: s:InitVariable() function {{{2 +" This function is used to initialise a given variable to a given value. The +" variable is only initialised if it does not exist prior +" +" Args: +" -var: the name of the var to be initialised +" -value: the value to initialise var to +" +" Returns: +" 1 if the var is set, 0 otherwise +function s:InitVariable(var, value) + if !exists(a:var) + exec 'let ' . a:var . ' = ' . "'" . a:value . "'" + return 1 + endif + return 0 +endfunction + +" Section: space string init{{{2 +" When putting spaces after the left delim and before the right we use +" s:spaceStr for the space char. This way we can make it add anything after +" the left and before the right by modifying this variable +let s:spaceStr = ' ' +let s:lenSpaceStr = strlen(s:spaceStr) + +" Section: variable init calls {{{2 +call s:InitVariable("g:NERDAllowAnyVisualDelims", 1) +call s:InitVariable("g:NERDBlockComIgnoreEmpty", 0) +call s:InitVariable("g:NERDCommentWholeLinesInVMode", 0) +call s:InitVariable("g:NERDCompactSexyComs", 0) +call s:InitVariable("g:NERDCreateDefaultMappings", 1) +call s:InitVariable("g:NERDDefaultNesting", 1) +call s:InitVariable("g:NERDMenuMode", 3) +call s:InitVariable("g:NERDLPlace", "[>") +call s:InitVariable("g:NERDUsePlaceHolders", 1) +call s:InitVariable("g:NERDRemoveAltComs", 1) +call s:InitVariable("g:NERDRemoveExtraSpaces", 1) +call s:InitVariable("g:NERDRPlace", "<]") +call s:InitVariable("g:NERDSpaceDelims", 0) +call s:InitVariable("g:NERDDelimiterRequests", 1) + +let s:NERDFileNameEscape="[]#*$%'\" ?`!&();<>\\" +"vf ;;dA:hcs"'A {j^f(lyi(k$p0f{a A }0f{a 'left':jdd^ + +let s:delimiterMap = { + \ 'aap': { 'left': '#' }, + \ 'abc': { 'left': '%' }, + \ 'acedb': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'actionscript': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'ada': { 'left': '--', 'leftAlt': '-- ' }, + \ 'ahdl': { 'left': '--' }, + \ 'ahk': { 'left': ';', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'amiga': { 'left': ';' }, + \ 'aml': { 'left': '/*' }, + \ 'ampl': { 'left': '#' }, + \ 'apache': { 'left': '#' }, + \ 'apachestyle': { 'left': '#' }, + \ 'asciidoc': { 'left': '//' }, + \ 'applescript': { 'left': '--', 'leftAlt': '(*', 'rightAlt': '*)' }, + \ 'asm68k': { 'left': ';' }, + \ 'asm': { 'left': ';', 'leftAlt': '#' }, + \ 'asn': { 'left': '--' }, + \ 'aspvbs': { 'left': '''' }, + \ 'asterisk': { 'left': ';' }, + \ 'asy': { 'left': '//' }, + \ 'atlas': { 'left': 'C', 'right': '$' }, + \ 'autohotkey': { 'left': ';' }, + \ 'autoit': { 'left': ';' }, + \ 'ave': { 'left': "'" }, + \ 'awk': { 'left': '#' }, + \ 'basic': { 'left': "'", 'leftAlt': 'REM ' }, + \ 'bbx': { 'left': '%' }, + \ 'bc': { 'left': '#' }, + \ 'bib': { 'left': '%' }, + \ 'bindzone': { 'left': ';' }, + \ 'bst': { 'left': '%' }, + \ 'btm': { 'left': '::' }, + \ 'caos': { 'left': '*' }, + \ 'calibre': { 'left': '//' }, + \ 'catalog': { 'left': '--', 'right': '--' }, + \ 'c': { 'left': '/*','right': '*/', 'leftAlt': '//' }, + \ 'cfg': { 'left': '#' }, + \ 'cg': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'ch': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'cl': { 'left': '#' }, + \ 'clean': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'clipper': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'clojure': { 'left': ';' }, + \ 'cmake': { 'left': '#' }, + \ 'conkyrc': { 'left': '#' }, + \ 'cpp': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'crontab': { 'left': '#' }, + \ 'cs': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'csp': { 'left': '--' }, + \ 'cterm': { 'left': '*' }, + \ 'cucumber': { 'left': '#' }, + \ 'cvs': { 'left': 'CVS:' }, + \ 'd': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'dcl': { 'left': '$!' }, + \ 'dakota': { 'left': '#' }, + \ 'debcontrol': { 'left': '#' }, + \ 'debsources': { 'left': '#' }, + \ 'def': { 'left': ';' }, + \ 'desktop': { 'left': '#' }, + \ 'dhcpd': { 'left': '#' }, + \ 'diff': { 'left': '#' }, + \ 'django': { 'left': '', 'leftAlt': '{#', 'rightAlt': '#}' }, + \ 'docbk': { 'left': '' }, + \ 'dns': { 'left': ';' }, + \ 'dosbatch': { 'left': 'REM ', 'leftAlt': '::' }, + \ 'dosini': { 'left': ';' }, + \ 'dot': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'dracula': { 'left': ';' }, + \ 'dsl': { 'left': ';' }, + \ 'dtml': { 'left': '', 'right': '' }, + \ 'dylan': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'ebuild': { 'left': '#' }, + \ 'ecd': { 'left': '#' }, + \ 'eclass': { 'left': '#' }, + \ 'eiffel': { 'left': '--' }, + \ 'elf': { 'left': "'" }, + \ 'elmfilt': { 'left': '#' }, + \ 'erlang': { 'left': '%' }, + \ 'eruby': { 'left': '<%#', 'right': '%>', 'leftAlt': '' }, + \ 'expect': { 'left': '#' }, + \ 'exports': { 'left': '#' }, + \ 'factor': { 'left': '! ', 'leftAlt': '!# ' }, + \ 'fgl': { 'left': '#' }, + \ 'focexec': { 'left': '-*' }, + \ 'form': { 'left': '*' }, + \ 'foxpro': { 'left': '*' }, + \ 'fstab': { 'left': '#' }, + \ 'fvwm': { 'left': '#' }, + \ 'fx': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'gams': { 'left': '*' }, + \ 'gdb': { 'left': '#' }, + \ 'gdmo': { 'left': '--' }, + \ 'geek': { 'left': 'GEEK_COMMENT:' }, + \ 'genshi': { 'left': '', 'leftAlt': '{#', 'rightAlt': '#}' }, + \ 'gentoo-conf-d': { 'left': '#' }, + \ 'gentoo-env-d': { 'left': '#' }, + \ 'gentoo-init-d': { 'left': '#' }, + \ 'gentoo-make-conf': { 'left': '#' }, + \ 'gentoo-package-keywords': { 'left': '#' }, + \ 'gentoo-package-mask': { 'left': '#' }, + \ 'gentoo-package-use': { 'left': '#' }, + \ 'gitcommit': { 'left': '#' }, + \ 'gitconfig': { 'left': ';' }, + \ 'gitrebase': { 'left': '#' }, + \ 'gnuplot': { 'left': '#' }, + \ 'groovy': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'gsp': { 'left': '<%--', 'right': '--%>' }, + \ 'gtkrc': { 'left': '#' }, + \ 'haskell': { 'left': '{-','right': '-}', 'leftAlt': '--' }, + \ 'hb': { 'left': '#' }, + \ 'h': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'haml': { 'left': '-#', 'leftAlt': '/' }, + \ 'hercules': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'hog': { 'left': '#' }, + \ 'hostsaccess': { 'left': '#' }, + \ 'htmlcheetah': { 'left': '##' }, + \ 'htmldjango': { 'left': '', 'leftAlt': '{#', 'rightAlt': '#}' }, + \ 'htmlos': { 'left': '#', 'right': '/#' }, + \ 'ia64': { 'left': '#' }, + \ 'icon': { 'left': '#' }, + \ 'idlang': { 'left': ';' }, + \ 'idl': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'inform': { 'left': '!' }, + \ 'inittab': { 'left': '#' }, + \ 'ishd': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'iss': { 'left': ';' }, + \ 'ist': { 'left': '%' }, + \ 'java': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'javacc': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'javascript': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'javascript.jquery': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'jess': { 'left': ';' }, + \ 'jgraph': { 'left': '(*', 'right': '*)' }, + \ 'jproperties': { 'left': '#' }, + \ 'jsp': { 'left': '<%--', 'right': '--%>' }, + \ 'kix': { 'left': ';' }, + \ 'kscript': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'lace': { 'left': '--' }, + \ 'ldif': { 'left': '#' }, + \ 'lilo': { 'left': '#' }, + \ 'lilypond': { 'left': '%' }, + \ 'liquid': { 'left': '{%', 'right': '%}' }, + \ 'lisp': { 'left': ';', 'leftAlt': '#|', 'rightAlt': '|#' }, + \ 'llvm': { 'left': ';' }, + \ 'lotos': { 'left': '(*', 'right': '*)' }, + \ 'lout': { 'left': '#' }, + \ 'lprolog': { 'left': '%' }, + \ 'lscript': { 'left': "'" }, + \ 'lss': { 'left': '#' }, + \ 'lua': { 'left': '--', 'leftAlt': '--[[', 'rightAlt': ']]' }, + \ 'lynx': { 'left': '#' }, + \ 'lytex': { 'left': '%' }, + \ 'mail': { 'left': '> ' }, + \ 'mako': { 'left': '##' }, + \ 'man': { 'left': '."' }, + \ 'map': { 'left': '%' }, + \ 'maple': { 'left': '#' }, + \ 'markdown': { 'left': '' }, + \ 'masm': { 'left': ';' }, + \ 'mason': { 'left': '<% #', 'right': '%>' }, + \ 'master': { 'left': '$' }, + \ 'matlab': { 'left': '%' }, + \ 'mel': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'mib': { 'left': '--' }, + \ 'mkd': { 'left': '>' }, + \ 'mma': { 'left': '(*', 'right': '*)' }, + \ 'model': { 'left': '$', 'right': '$' }, + \ 'moduala.': { 'left': '(*', 'right': '*)' }, + \ 'modula2': { 'left': '(*', 'right': '*)' }, + \ 'modula3': { 'left': '(*', 'right': '*)' }, + \ 'monk': { 'left': ';' }, + \ 'mush': { 'left': '#' }, + \ 'named': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'nasm': { 'left': ';' }, + \ 'nastran': { 'left': '$' }, + \ 'natural': { 'left': '/*' }, + \ 'ncf': { 'left': ';' }, + \ 'newlisp': { 'left': ';' }, + \ 'nroff': { 'left': '\"' }, + \ 'nsis': { 'left': '#' }, + \ 'ntp': { 'left': '#' }, + \ 'objc': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'objcpp': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'objj': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'ocaml': { 'left': '(*', 'right': '*)' }, + \ 'occam': { 'left': '--' }, + \ 'omlet': { 'left': '(*', 'right': '*)' }, + \ 'omnimark': { 'left': ';' }, + \ 'openroad': { 'left': '//' }, + \ 'opl': { 'left': "REM" }, + \ 'ora': { 'left': '#' }, + \ 'ox': { 'left': '//' }, + \ 'pascal': { 'left': '{','right': '}', 'leftAlt': '(*', 'rightAlt': '*)' }, + \ 'patran': { 'left': '$', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'pcap': { 'left': '#' }, + \ 'pccts': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'pdf': { 'left': '%' }, + \ 'pfmain': { 'left': '//' }, + \ 'php': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'pic': { 'left': ';' }, + \ 'pike': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'pilrc': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'pine': { 'left': '#' }, + \ 'plm': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'plsql': { 'left': '--', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'po': { 'left': '#' }, + \ 'postscr': { 'left': '%' }, + \ 'pov': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'povini': { 'left': ';' }, + \ 'ppd': { 'left': '%' }, + \ 'ppwiz': { 'left': ';;' }, + \ 'processing': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'prolog': { 'left': '%', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'ps1': { 'left': '#' }, + \ 'psf': { 'left': '#' }, + \ 'ptcap': { 'left': '#' }, + \ 'python': { 'left': '#' }, + \ 'radiance': { 'left': '#' }, + \ 'ratpoison': { 'left': '#' }, + \ 'r': { 'left': '#' }, + \ 'rc': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'rebol': { 'left': ';' }, + \ 'registry': { 'left': ';' }, + \ 'remind': { 'left': '#' }, + \ 'resolv': { 'left': '#' }, + \ 'rgb': { 'left': '!' }, + \ 'rib': { 'left': '#' }, + \ 'robots': { 'left': '#' }, + \ 'sa': { 'left': '--' }, + \ 'samba': { 'left': ';', 'leftAlt': '#' }, + \ 'sass': { 'left': '//', 'leftAlt': '/*' }, + \ 'sather': { 'left': '--' }, + \ 'scala': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'scilab': { 'left': '//' }, + \ 'scsh': { 'left': ';' }, + \ 'sed': { 'left': '#' }, + \ 'sgmldecl': { 'left': '--', 'right': '--' }, + \ 'sgmllnx': { 'left': '' }, + \ 'sicad': { 'left': '*' }, + \ 'simula': { 'left': '%', 'leftAlt': '--' }, + \ 'sinda': { 'left': '$' }, + \ 'skill': { 'left': ';' }, + \ 'slang': { 'left': '%' }, + \ 'slice': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'slrnrc': { 'left': '%' }, + \ 'sm': { 'left': '#' }, + \ 'smarty': { 'left': '{*', 'right': '*}' }, + \ 'smil': { 'left': '' }, + \ 'smith': { 'left': ';' }, + \ 'sml': { 'left': '(*', 'right': '*)' }, + \ 'snnsnet': { 'left': '#' }, + \ 'snnspat': { 'left': '#' }, + \ 'snnsres': { 'left': '#' }, + \ 'snobol4': { 'left': '*' }, + \ 'spec': { 'left': '#' }, + \ 'specman': { 'left': '//' }, + \ 'spectre': { 'left': '//', 'leftAlt': '*' }, + \ 'spice': { 'left': '$' }, + \ 'sql': { 'left': '--' }, + \ 'sqlforms': { 'left': '--' }, + \ 'sqlj': { 'left': '--' }, + \ 'sqr': { 'left': '!' }, + \ 'squid': { 'left': '#' }, + \ 'st': { 'left': '"' }, + \ 'stp': { 'left': '--' }, + \ 'systemverilog': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'tads': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'tags': { 'left': ';' }, + \ 'tak': { 'left': '$' }, + \ 'tasm': { 'left': ';' }, + \ 'tcl': { 'left': '#' }, + \ 'texinfo': { 'left': "@c " }, + \ 'texmf': { 'left': '%' }, + \ 'tf': { 'left': ';' }, + \ 'tidy': { 'left': '#' }, + \ 'tli': { 'left': '#' }, + \ 'tmux': { 'left': '#' }, + \ 'trasys': { 'left': "$" }, + \ 'tsalt': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'tsscl': { 'left': '#' }, + \ 'tssgm': { 'left': "comment = '", 'right': "'" }, + \ 'txt2tags': { 'left': '%' }, + \ 'uc': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'uil': { 'left': '!' }, + \ 'vb': { 'left': "'" }, + \ 'velocity': { 'left': "##", 'right': "", 'leftAlt': '#*', 'rightAlt': '*#' }, + \ 'vera': { 'left': '/*','right': '*/', 'leftAlt': '//' }, + \ 'verilog': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'verilog_systemverilog': { 'left': '//', 'leftAlt': '/*', 'rightAlt': '*/' }, + \ 'vgrindefs': { 'left': '#' }, + \ 'vhdl': { 'left': '--' }, + \ 'vimperator': { 'left': '"' }, + \ 'virata': { 'left': '%' }, + \ 'vrml': { 'left': '#' }, + \ 'vsejcl': { 'left': '/*' }, + \ 'webmacro': { 'left': '##' }, + \ 'wget': { 'left': '#' }, + \ 'Wikipedia': { 'left': '' }, + \ 'winbatch': { 'left': ';' }, + \ 'wml': { 'left': '#' }, + \ 'wvdial': { 'left': ';' }, + \ 'xdefaults': { 'left': '!' }, + \ 'xkb': { 'left': '//' }, + \ 'xmath': { 'left': '#' }, + \ 'xpm2': { 'left': '!' }, + \ 'xquery': { 'left': '(:', 'right': ':)' }, + \ 'z8a': { 'left': ';' } + \ } + +" Section: Comment mapping functions, autocommands and commands {{{1 +" ============================================================================ +" Section: Comment enabler autocommands {{{2 +" ============================================================================ + +augroup commentEnablers + + "if the user enters a buffer or reads a buffer then we gotta set up + "the comment delimiters for that new filetype + autocmd BufEnter,BufRead * :call s:SetUpForNewFiletype(&filetype, 0) + + "if the filetype of a buffer changes, force the script to reset the + "delims for the buffer + autocmd Filetype * :call s:SetUpForNewFiletype(&filetype, 1) +augroup END + + +" Function: s:SetUpForNewFiletype(filetype) function {{{2 +" This function is responsible for setting up buffer scoped variables for the +" given filetype. +" +" Args: +" -filetype: the filetype to set delimiters for +" -forceReset: 1 if the delimiters should be reset if they have already be +" set for this buffer. +" +function s:SetUpForNewFiletype(filetype, forceReset) + let b:NERDSexyComMarker = '' + + if has_key(s:delimiterMap, a:filetype) + let b:NERDCommenterDelims = s:delimiterMap[a:filetype] + for i in ['left', 'leftAlt', 'right', 'rightAlt'] + if !has_key(b:NERDCommenterDelims, i) + let b:NERDCommenterDelims[i] = '' + endif + endfor + else + let b:NERDCommenterDelims = s:CreateDelimMapFromCms() + endif + +endfunction + +function s:CreateDelimMapFromCms() + return { + \ 'left': substitute(&commentstring, '\([^ \t]*\)\s*%s.*', '\1', ''), + \ 'right': substitute(&commentstring, '.*%s\s*\(.*\)', '\1', 'g'), + \ 'leftAlt': '', + \ 'rightAlt': '' } +endfunction + +" Function: s:SwitchToAlternativeDelimiters(printMsgs) function {{{2 +" This function is used to swap the delimiters that are being used to the +" alternative delimiters for that filetype. For example, if a c++ file is +" being edited and // comments are being used, after this function is called +" /**/ comments will be used. +" +" Args: +" -printMsgs: if this is 1 then a message is echoed to the user telling them +" if this function changed the delimiters or not +function s:SwitchToAlternativeDelimiters(printMsgs) + "if both of the alternative delimiters are empty then there is no + "alternative comment style so bail out + if b:NERDCommenterDelims['leftAlt'] == '' && b:NERDCommenterDelims['rightAlt'] == '' + if a:printMsgs + call s:NerdEcho("Cannot use alternative delimiters, none are specified", 0) + endif + return 0 + endif + + "save the current delimiters + let tempLeft = s:Left() + let tempRight = s:Right() + + "swap current delimiters for alternative + let b:NERDCommenterDelims['left'] = b:NERDCommenterDelims['leftAlt'] + let b:NERDCommenterDelims['right'] = b:NERDCommenterDelims['rightAlt'] + + "set the previously current delimiters to be the new alternative ones + let b:NERDCommenterDelims['leftAlt'] = tempLeft + let b:NERDCommenterDelims['rightAlt'] = tempRight + + "tell the user what comment delimiters they are now using + if a:printMsgs + call s:NerdEcho("Now using " . s:Left() . " " . s:Right() . " to delimit comments", 1) + endif + + return 1 +endfunction + +" Section: Comment delimiter add/removal functions {{{1 +" ============================================================================ +" Function: s:AppendCommentToLine(){{{2 +" This function appends comment delimiters at the EOL and places the cursor in +" position to start typing the comment +function s:AppendCommentToLine() + let left = s:Left({'space': 1}) + let right = s:Right({'space': 1}) + + " get the len of the right delim + let lenRight = strlen(right) + + let isLineEmpty = strlen(getline(".")) == 0 + let insOrApp = (isLineEmpty==1 ? 'i' : 'A') + + "stick the delimiters down at the end of the line. We have to format the + "comment with spaces as appropriate + execute ":normal! " . insOrApp . (isLineEmpty ? '' : ' ') . left . right . " " + + " if there is a right delimiter then we gotta move the cursor left + " by the len of the right delimiter so we insert between the delimiters + if lenRight > 0 + let leftMoveAmount = lenRight + execute ":normal! " . leftMoveAmount . "h" + endif + startinsert +endfunction + +" Function: s:CommentBlock(top, bottom, lSide, rSide, forceNested ) {{{2 +" This function is used to comment out a region of code. This region is +" specified as a bounding box by arguments to the function. +" +" Args: +" -top: the line number for the top line of code in the region +" -bottom: the line number for the bottom line of code in the region +" -lSide: the column number for the left most column in the region +" -rSide: the column number for the right most column in the region +" -forceNested: a flag indicating whether comments should be nested +function s:CommentBlock(top, bottom, lSide, rSide, forceNested ) + " we need to create local copies of these arguments so we can modify them + let top = a:top + let bottom = a:bottom + let lSide = a:lSide + let rSide = a:rSide + + "if the top or bottom line starts with tabs we have to adjust the left and + "right boundaries so that they are set as though the tabs were spaces + let topline = getline(top) + let bottomline = getline(bottom) + if s:HasLeadingTabs(topline, bottomline) + + "find out how many tabs are in the top line and adjust the left + "boundary accordingly + let numTabs = s:NumberOfLeadingTabs(topline) + if lSide < numTabs + let lSide = &ts * lSide + else + let lSide = (lSide - numTabs) + (&ts * numTabs) + endif + + "find out how many tabs are in the bottom line and adjust the right + "boundary accordingly + let numTabs = s:NumberOfLeadingTabs(bottomline) + let rSide = (rSide - numTabs) + (&ts * numTabs) + endif + + "we must check that bottom IS actually below top, if it is not then we + "swap top and bottom. Similarly for left and right. + if bottom < top + let temp = top + let top = bottom + let bottom = top + endif + if rSide < lSide + let temp = lSide + let lSide = rSide + let rSide = temp + endif + + "if the current delimiters arent multipart then we will switch to the + "alternative delims (if THEY are) as the comment will be better and more + "accurate with multipart delims + let switchedDelims = 0 + if !s:Multipart() && g:NERDAllowAnyVisualDelims && s:AltMultipart() + let switchedDelims = 1 + call s:SwitchToAlternativeDelimiters(0) + endif + + "start the commenting from the top and keep commenting till we reach the + "bottom + let currentLine=top + while currentLine <= bottom + + "check if we are allowed to comment this line + if s:CanCommentLine(a:forceNested, currentLine) + + "convert the leading tabs into spaces + let theLine = getline(currentLine) + let lineHasLeadTabs = s:HasLeadingTabs(theLine) + if lineHasLeadTabs + let theLine = s:ConvertLeadingTabsToSpaces(theLine) + endif + + "dont comment lines that begin after the right boundary of the + "block unless the user has specified to do so + if theLine !~ '^ \{' . rSide . '\}' || !g:NERDBlockComIgnoreEmpty + + "attempt to place the cursor in on the left of the boundary box, + "then check if we were successful, if not then we cant comment this + "line + call setline(currentLine, theLine) + if s:CanPlaceCursor(currentLine, lSide) + + let leftSpaced = s:Left({'space': 1}) + let rightSpaced = s:Right({'space': 1}) + + "stick the left delimiter down + let theLine = strpart(theLine, 0, lSide-1) . leftSpaced . strpart(theLine, lSide-1) + + if s:Multipart() + "stick the right delimiter down + let theLine = strpart(theLine, 0, rSide+strlen(leftSpaced)) . rightSpaced . strpart(theLine, rSide+strlen(leftSpaced)) + + let firstLeftDelim = s:FindDelimiterIndex(s:Left(), theLine) + let lastRightDelim = s:LastIndexOfDelim(s:Right(), theLine) + + if firstLeftDelim != -1 && lastRightDelim != -1 + let searchStr = strpart(theLine, 0, lastRightDelim) + let searchStr = strpart(searchStr, firstLeftDelim+strlen(s:Left())) + + "replace the outter most delims in searchStr with + "place-holders + let theLineWithPlaceHolders = s:ReplaceDelims(s:Left(), s:Right(), g:NERDLPlace, g:NERDRPlace, searchStr) + + "add the right delimiter onto the line + let theLine = strpart(theLine, 0, firstLeftDelim+strlen(s:Left())) . theLineWithPlaceHolders . strpart(theLine, lastRightDelim) + endif + endif + endif + endif + + "restore tabs if needed + if lineHasLeadTabs + let theLine = s:ConvertLeadingSpacesToTabs(theLine) + endif + + call setline(currentLine, theLine) + endif + + let currentLine = currentLine + 1 + endwhile + + "if we switched delims then we gotta go back to what they were before + if switchedDelims == 1 + call s:SwitchToAlternativeDelimiters(0) + endif +endfunction + +" Function: s:CommentLines(forceNested, alignLeft, alignRight, firstLine, lastLine) {{{2 +" This function comments a range of lines. +" +" Args: +" -forceNested: a flag indicating whether the called is requesting the comment +" to be nested if need be +" -align: should be "left" or "both" or "none" +" -firstLine/lastLine: the top and bottom lines to comment +function s:CommentLines(forceNested, align, firstLine, lastLine) + " we need to get the left and right indexes of the leftmost char in the + " block of of lines and the right most char so that we can do alignment of + " the delimiters if the user has specified + let leftAlignIndx = s:LeftMostIndx(a:forceNested, 0, a:firstLine, a:lastLine) + let rightAlignIndx = s:RightMostIndx(a:forceNested, 0, a:firstLine, a:lastLine) + + " gotta add the length of the left delimiter onto the rightAlignIndx cos + " we'll be adding a left delim to the line + let rightAlignIndx = rightAlignIndx + strlen(s:Left({'space': 1})) + + " now we actually comment the lines. Do it line by line + let currentLine = a:firstLine + while currentLine <= a:lastLine + + " get the next line, check commentability and convert spaces to tabs + let theLine = getline(currentLine) + let lineHasLeadingTabs = s:HasLeadingTabs(theLine) + let theLine = s:ConvertLeadingTabsToSpaces(theLine) + if s:CanCommentLine(a:forceNested, currentLine) + "if the user has specified forceNesting then we check to see if we + "need to switch delimiters for place-holders + if a:forceNested && g:NERDUsePlaceHolders + let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) + endif + + " find out if the line is commented using normal delims and/or + " alternate ones + let isCommented = s:IsCommented(s:Left(), s:Right(), theLine) || s:IsCommented(s:Left({'alt': 1}), s:Right({'alt': 1}), theLine) + + " check if we can comment this line + if !isCommented || g:NERDUsePlaceHolders || s:Multipart() + if a:align == "left" || a:align == "both" + let theLine = s:AddLeftDelimAligned(s:Left({'space': 1}), theLine, leftAlignIndx) + else + let theLine = s:AddLeftDelim(s:Left({'space': 1}), theLine) + endif + if a:align == "both" + let theLine = s:AddRightDelimAligned(s:Right({'space': 1}), theLine, rightAlignIndx) + else + let theLine = s:AddRightDelim(s:Right({'space': 1}), theLine) + endif + endif + endif + + " restore leading tabs if appropriate + if lineHasLeadingTabs + let theLine = s:ConvertLeadingSpacesToTabs(theLine) + endif + + " we are done with this line + call setline(currentLine, theLine) + let currentLine = currentLine + 1 + endwhile + +endfunction + +" Function: s:CommentLinesMinimal(firstLine, lastLine) {{{2 +" This function comments a range of lines in a minimal style. I +" +" Args: +" -firstLine/lastLine: the top and bottom lines to comment +function s:CommentLinesMinimal(firstLine, lastLine) + "check that minimal comments can be done on this filetype + if !s:HasMultipartDelims() + throw 'NERDCommenter.Delimiters exception: Minimal comments can only be used for filetypes that have multipart delimiters' + endif + + "if we need to use place holders for the comment, make sure they are + "enabled for this filetype + if !g:NERDUsePlaceHolders && s:DoesBlockHaveMultipartDelim(a:firstLine, a:lastLine) + throw 'NERDCommenter.Settings exception: Place holders are required but disabled.' + endif + + "get the left and right delims to smack on + let left = s:GetSexyComLeft(g:NERDSpaceDelims,0) + let right = s:GetSexyComRight(g:NERDSpaceDelims,0) + + "make sure all multipart delims on the lines are replaced with + "placeholders to prevent illegal syntax + let currentLine = a:firstLine + while(currentLine <= a:lastLine) + let theLine = getline(currentLine) + let theLine = s:ReplaceDelims(left, right, g:NERDLPlace, g:NERDRPlace, theLine) + call setline(currentLine, theLine) + let currentLine = currentLine + 1 + endwhile + + "add the delim to the top line + let theLine = getline(a:firstLine) + let lineHasLeadingTabs = s:HasLeadingTabs(theLine) + let theLine = s:ConvertLeadingTabsToSpaces(theLine) + let theLine = s:AddLeftDelim(left, theLine) + if lineHasLeadingTabs + let theLine = s:ConvertLeadingSpacesToTabs(theLine) + endif + call setline(a:firstLine, theLine) + + "add the delim to the bottom line + let theLine = getline(a:lastLine) + let lineHasLeadingTabs = s:HasLeadingTabs(theLine) + let theLine = s:ConvertLeadingTabsToSpaces(theLine) + let theLine = s:AddRightDelim(right, theLine) + if lineHasLeadingTabs + let theLine = s:ConvertLeadingSpacesToTabs(theLine) + endif + call setline(a:lastLine, theLine) +endfunction + +" Function: s:CommentLinesSexy(topline, bottomline) function {{{2 +" This function is used to comment lines in the 'Sexy' style. eg in c: +" /* +" * This is a sexy comment +" */ +" Args: +" -topline: the line num of the top line in the sexy comment +" -bottomline: the line num of the bottom line in the sexy comment +function s:CommentLinesSexy(topline, bottomline) + let left = s:GetSexyComLeft(0, 0) + let right = s:GetSexyComRight(0, 0) + + "check if we can do a sexy comment with the available delimiters + if left == -1 || right == -1 + throw 'NERDCommenter.Delimiters exception: cannot perform sexy comments with available delimiters.' + endif + + "make sure the lines arent already commented sexually + if !s:CanSexyCommentLines(a:topline, a:bottomline) + throw 'NERDCommenter.Nesting exception: cannot nest sexy comments' + endif + + + let sexyComMarker = s:GetSexyComMarker(0,0) + let sexyComMarkerSpaced = s:GetSexyComMarker(1,0) + + + " we jam the comment as far to the right as possible + let leftAlignIndx = s:LeftMostIndx(1, 1, a:topline, a:bottomline) + + "check if we should use the compact style i.e that the left/right + "delimiters should appear on the first and last lines of the code and not + "on separate lines above/below the first/last lines of code + if g:NERDCompactSexyComs + let spaceString = (g:NERDSpaceDelims ? s:spaceStr : '') + + "comment the top line + let theLine = getline(a:topline) + let lineHasTabs = s:HasLeadingTabs(theLine) + if lineHasTabs + let theLine = s:ConvertLeadingTabsToSpaces(theLine) + endif + let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) + let theLine = s:AddLeftDelimAligned(left . spaceString, theLine, leftAlignIndx) + if lineHasTabs + let theLine = s:ConvertLeadingSpacesToTabs(theLine) + endif + call setline(a:topline, theLine) + + "comment the bottom line + if a:bottomline != a:topline + let theLine = getline(a:bottomline) + let lineHasTabs = s:HasLeadingTabs(theLine) + if lineHasTabs + let theLine = s:ConvertLeadingTabsToSpaces(theLine) + endif + let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) + endif + let theLine = s:AddRightDelim(spaceString . right, theLine) + if lineHasTabs + let theLine = s:ConvertLeadingSpacesToTabs(theLine) + endif + call setline(a:bottomline, theLine) + else + + " add the left delimiter one line above the lines that are to be commented + call cursor(a:topline, 1) + execute 'normal! O' + let theLine = repeat(' ', leftAlignIndx) . left + + " Make sure tabs are respected + if !&expandtab + let theLine = s:ConvertLeadingSpacesToTabs(theLine) + endif + call setline(a:topline, theLine) + + " add the right delimiter after bottom line (we have to add 1 cos we moved + " the lines down when we added the left delim + call cursor(a:bottomline+1, 1) + execute 'normal! o' + let theLine = repeat(' ', leftAlignIndx) . repeat(' ', strlen(left)-strlen(sexyComMarker)) . right + + " Make sure tabs are respected + if !&expandtab + let theLine = s:ConvertLeadingSpacesToTabs(theLine) + endif + call setline(a:bottomline+2, theLine) + + endif + + " go thru each line adding the sexyComMarker marker to the start of each + " line in the appropriate place to align them with the comment delims + let currentLine = a:topline+1 + while currentLine <= a:bottomline + !g:NERDCompactSexyComs + " get the line and convert the tabs to spaces + let theLine = getline(currentLine) + let lineHasTabs = s:HasLeadingTabs(theLine) + if lineHasTabs + let theLine = s:ConvertLeadingTabsToSpaces(theLine) + endif + + let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) + + " add the sexyComMarker + let theLine = repeat(' ', leftAlignIndx) . repeat(' ', strlen(left)-strlen(sexyComMarker)) . sexyComMarkerSpaced . strpart(theLine, leftAlignIndx) + + if lineHasTabs + let theLine = s:ConvertLeadingSpacesToTabs(theLine) + endif + + + " set the line and move onto the next one + call setline(currentLine, theLine) + let currentLine = currentLine + 1 + endwhile + +endfunction + +" Function: s:CommentLinesToggle(forceNested, firstLine, lastLine) {{{2 +" Applies "toggle" commenting to the given range of lines +" +" Args: +" -forceNested: a flag indicating whether the called is requesting the comment +" to be nested if need be +" -firstLine/lastLine: the top and bottom lines to comment +function s:CommentLinesToggle(forceNested, firstLine, lastLine) + let currentLine = a:firstLine + while currentLine <= a:lastLine + + " get the next line, check commentability and convert spaces to tabs + let theLine = getline(currentLine) + let lineHasLeadingTabs = s:HasLeadingTabs(theLine) + let theLine = s:ConvertLeadingTabsToSpaces(theLine) + if s:CanToggleCommentLine(a:forceNested, currentLine) + + "if the user has specified forceNesting then we check to see if we + "need to switch delimiters for place-holders + if g:NERDUsePlaceHolders + let theLine = s:SwapOutterMultiPartDelimsForPlaceHolders(theLine) + endif + + let theLine = s:AddLeftDelim(s:Left({'space': 1}), theLine) + let theLine = s:AddRightDelim(s:Right({'space': 1}), theLine) + endif + + " restore leading tabs if appropriate + if lineHasLeadingTabs + let theLine = s:ConvertLeadingSpacesToTabs(theLine) + endif + + " we are done with this line + call setline(currentLine, theLine) + let currentLine = currentLine + 1 + endwhile + +endfunction + +" Function: s:CommentRegion(topline, topCol, bottomLine, bottomCol) function {{{2 +" This function comments chunks of text selected in visual mode. +" It will comment exactly the text that they have selected. +" Args: +" -topLine: the line num of the top line in the sexy comment +" -topCol: top left col for this comment +" -bottomline: the line num of the bottom line in the sexy comment +" -bottomCol: the bottom right col for this comment +" -forceNested: whether the caller wants comments to be nested if the +" line(s) are already commented +function s:CommentRegion(topLine, topCol, bottomLine, bottomCol, forceNested) + + "switch delims (if we can) if the current set isnt multipart + let switchedDelims = 0 + if !s:Multipart() && s:AltMultipart() && !g:NERDAllowAnyVisualDelims + let switchedDelims = 1 + call s:SwitchToAlternativeDelimiters(0) + endif + + "if there is only one line in the comment then just do it + if a:topLine == a:bottomLine + call s:CommentBlock(a:topLine, a:bottomLine, a:topCol, a:bottomCol, a:forceNested) + + "there are multiple lines in the comment + else + "comment the top line + call s:CommentBlock(a:topLine, a:topLine, a:topCol, strlen(getline(a:topLine)), a:forceNested) + + "comment out all the lines in the middle of the comment + let topOfRange = a:topLine+1 + let bottomOfRange = a:bottomLine-1 + if topOfRange <= bottomOfRange + call s:CommentLines(a:forceNested, "none", topOfRange, bottomOfRange) + endif + + "comment the bottom line + let bottom = getline(a:bottomLine) + let numLeadingSpacesTabs = strlen(substitute(bottom, '^\([ \t]*\).*$', '\1', '')) + call s:CommentBlock(a:bottomLine, a:bottomLine, numLeadingSpacesTabs+1, a:bottomCol, a:forceNested) + + endif + + "stick the cursor back on the char it was on before the comment + call cursor(a:topLine, a:topCol + strlen(s:Left()) + g:NERDSpaceDelims) + + "if we switched delims then we gotta go back to what they were before + if switchedDelims == 1 + call s:SwitchToAlternativeDelimiters(0) + endif + +endfunction + +" Function: s:InvertComment(firstLine, lastLine) function {{{2 +" Inverts the comments on the lines between and including the given line +" numbers i.e all commented lines are uncommented and vice versa +" Args: +" -firstLine: the top of the range of lines to be inverted +" -lastLine: the bottom of the range of lines to be inverted +function s:InvertComment(firstLine, lastLine) + + " go thru all lines in the given range + let currentLine = a:firstLine + while currentLine <= a:lastLine + let theLine = getline(currentLine) + + let sexyComBounds = s:FindBoundingLinesOfSexyCom(currentLine) + + " if the line is commented normally, uncomment it + if s:IsCommentedFromStartOfLine(s:Left(), theLine) || s:IsCommentedFromStartOfLine(s:Left({'alt': 1}), theLine) + call s:UncommentLines(currentLine, currentLine) + let currentLine = currentLine + 1 + + " check if the line is commented sexually + elseif !empty(sexyComBounds) + let numLinesBeforeSexyComRemoved = s:NumLinesInBuf() + call s:UncommentLinesSexy(sexyComBounds[0], sexyComBounds[1]) + + "move to the line after last line of the sexy comment + let numLinesAfterSexyComRemoved = s:NumLinesInBuf() + let currentLine = sexyComBounds[1] - (numLinesBeforeSexyComRemoved - numLinesAfterSexyComRemoved) + 1 + + " the line isnt commented + else + call s:CommentLinesToggle(1, currentLine, currentLine) + let currentLine = currentLine + 1 + endif + + endwhile +endfunction + +" Function: NERDComment(isVisual, type) function {{{2 +" This function is a Wrapper for the main commenting functions +" +" Args: +" -isVisual: a flag indicating whether the comment is requested in visual +" mode or not +" -type: the type of commenting requested. Can be 'sexy', 'invert', +" 'minimal', 'toggle', 'alignLeft', 'alignBoth', 'norm', +" 'nested', 'toEOL', 'append', 'insert', 'uncomment', 'yank' +function! NERDComment(isVisual, type) range + " we want case sensitivity when commenting + let oldIgnoreCase = &ignorecase + set noignorecase + + if !exists("g:did_load_ftplugin") || g:did_load_ftplugin != 1 + call s:NerdEcho("filetype plugins should be enabled. See :help NERDComInstallation and :help :filetype-plugin-on", 0) + endif + + if a:isVisual + let firstLine = line("'<") + let lastLine = line("'>") + let firstCol = col("'<") + let lastCol = col("'>") - (&selection == 'exclusive' ? 1 : 0) + else + let firstLine = a:firstline + let lastLine = a:lastline + endif + + let countWasGiven = (a:isVisual == 0 && firstLine != lastLine) + + let forceNested = (a:type == 'nested' || g:NERDDefaultNesting) + + if a:type == 'norm' || a:type == 'nested' + if a:isVisual && visualmode() == "" + call s:CommentBlock(firstLine, lastLine, firstCol, lastCol, forceNested) + elseif a:isVisual && visualmode() == "v" && (g:NERDCommentWholeLinesInVMode==0 || (g:NERDCommentWholeLinesInVMode==2 && s:HasMultipartDelims())) + call s:CommentRegion(firstLine, firstCol, lastLine, lastCol, forceNested) + else + call s:CommentLines(forceNested, "none", firstLine, lastLine) + endif + + elseif a:type == 'alignLeft' || a:type == 'alignBoth' + let align = "none" + if a:type == "alignLeft" + let align = "left" + elseif a:type == "alignBoth" + let align = "both" + endif + call s:CommentLines(forceNested, align, firstLine, lastLine) + + elseif a:type == 'invert' + call s:InvertComment(firstLine, lastLine) + + elseif a:type == 'sexy' + try + call s:CommentLinesSexy(firstLine, lastLine) + catch /NERDCommenter.Delimiters/ + call s:CommentLines(forceNested, "none", firstLine, lastLine) + catch /NERDCommenter.Nesting/ + call s:NerdEcho("Sexy comment aborted. Nested sexy cannot be nested", 0) + endtry + + elseif a:type == 'toggle' + let theLine = getline(firstLine) + + if s:IsInSexyComment(firstLine) || s:IsCommentedFromStartOfLine(s:Left(), theLine) || s:IsCommentedFromStartOfLine(s:Left({'alt': 1}), theLine) + call s:UncommentLines(firstLine, lastLine) + else + call s:CommentLinesToggle(forceNested, firstLine, lastLine) + endif + + elseif a:type == 'minimal' + try + call s:CommentLinesMinimal(firstLine, lastLine) + catch /NERDCommenter.Delimiters/ + call s:NerdEcho("Minimal comments can only be used for filetypes that have multipart delimiters.", 0) + catch /NERDCommenter.Settings/ + call s:NerdEcho("Place holders are required but disabled.", 0) + endtry + + elseif a:type == 'toEOL' + call s:SaveScreenState() + call s:CommentBlock(firstLine, firstLine, col("."), col("$")-1, 1) + call s:RestoreScreenState() + + elseif a:type == 'append' + call s:AppendCommentToLine() + + elseif a:type == 'insert' + call s:PlaceDelimitersAndInsBetween() + + elseif a:type == 'uncomment' + call s:UncommentLines(firstLine, lastLine) + + elseif a:type == 'yank' + if a:isVisual + normal! gvy + elseif countWasGiven + execute firstLine .','. lastLine .'yank' + else + normal! yy + endif + execute firstLine .','. lastLine .'call NERDComment('. a:isVisual .', "norm")' + endif + + let &ignorecase = oldIgnoreCase +endfunction + +" Function: s:PlaceDelimitersAndInsBetween() function {{{2 +" This is function is called to place comment delimiters down and place the +" cursor between them +function s:PlaceDelimitersAndInsBetween() + " get the left and right delimiters without any escape chars in them + let left = s:Left({'space': 1}) + let right = s:Right({'space': 1}) + + let theLine = getline(".") + let lineHasLeadTabs = s:HasLeadingTabs(theLine) || (theLine =~ '^ *$' && !&expandtab) + + "convert tabs to spaces and adjust the cursors column to take this into + "account + let untabbedCol = s:UntabbedCol(theLine, col(".")) + call setline(line("."), s:ConvertLeadingTabsToSpaces(theLine)) + call cursor(line("."), untabbedCol) + + " get the len of the right delim + let lenRight = strlen(right) + + let isDelimOnEOL = col(".") >= strlen(getline(".")) + + " if the cursor is in the first col then we gotta insert rather than + " append the comment delimiters here + let insOrApp = (col(".")==1 ? 'i' : 'a') + + " place the delimiters down. We do it differently depending on whether + " there is a left AND right delimiter + if lenRight > 0 + execute ":normal! " . insOrApp . left . right + execute ":normal! " . lenRight . "h" + else + execute ":normal! " . insOrApp . left + + " if we are tacking the delim on the EOL then we gotta add a space + " after it cos when we go out of insert mode the cursor will move back + " one and the user wont be in position to type the comment. + if isDelimOnEOL + execute 'normal! a ' + endif + endif + normal! l + + "if needed convert spaces back to tabs and adjust the cursors col + "accordingly + if lineHasLeadTabs + let tabbedCol = s:TabbedCol(getline("."), col(".")) + call setline(line("."), s:ConvertLeadingSpacesToTabs(getline("."))) + call cursor(line("."), tabbedCol) + endif + + startinsert +endfunction + +" Function: s:RemoveDelimiters(left, right, line) {{{2 +" this function is called to remove the first left comment delimiter and the +" last right delimiter of the given line. +" +" The args left and right must be strings. If there is no right delimiter (as +" is the case for e.g vim file comments) them the arg right should be "" +" +" Args: +" -left: the left comment delimiter +" -right: the right comment delimiter +" -line: the line to remove the delimiters from +function s:RemoveDelimiters(left, right, line) + + let l:left = a:left + let l:right = a:right + let lenLeft = strlen(left) + let lenRight = strlen(right) + + let delimsSpaced = (g:NERDSpaceDelims || g:NERDRemoveExtraSpaces) + + let line = a:line + + "look for the left delimiter, if we find it, remove it. + let leftIndx = s:FindDelimiterIndex(a:left, line) + if leftIndx != -1 + let line = strpart(line, 0, leftIndx) . strpart(line, leftIndx+lenLeft) + + "if the user has specified that there is a space after the left delim + "then check for the space and remove it if it is there + if delimsSpaced && strpart(line, leftIndx, s:lenSpaceStr) == s:spaceStr + let line = strpart(line, 0, leftIndx) . strpart(line, leftIndx+s:lenSpaceStr) + endif + endif + + "look for the right delimiter, if we find it, remove it + let rightIndx = s:FindDelimiterIndex(a:right, line) + if rightIndx != -1 + let line = strpart(line, 0, rightIndx) . strpart(line, rightIndx+lenRight) + + "if the user has specified that there is a space before the right delim + "then check for the space and remove it if it is there + if delimsSpaced && strpart(line, rightIndx-s:lenSpaceStr, s:lenSpaceStr) == s:spaceStr && s:Multipart() + let line = strpart(line, 0, rightIndx-s:lenSpaceStr) . strpart(line, rightIndx) + endif + endif + + return line +endfunction + +" Function: s:UncommentLines(topLine, bottomLine) {{{2 +" This function uncomments the given lines +" +" Args: +" topLine: the top line of the visual selection to uncomment +" bottomLine: the bottom line of the visual selection to uncomment +function s:UncommentLines(topLine, bottomLine) + "make local copies of a:firstline and a:lastline and, if need be, swap + "them around if the top line is below the bottom + let l:firstline = a:topLine + let l:lastline = a:bottomLine + if firstline > lastline + let firstline = lastline + let lastline = a:topLine + endif + + "go thru each line uncommenting each line removing sexy comments + let currentLine = firstline + while currentLine <= lastline + + "check the current line to see if it is part of a sexy comment + let sexyComBounds = s:FindBoundingLinesOfSexyCom(currentLine) + if !empty(sexyComBounds) + + "we need to store the num lines in the buf before the comment is + "removed so we know how many lines were removed when the sexy com + "was removed + let numLinesBeforeSexyComRemoved = s:NumLinesInBuf() + + call s:UncommentLinesSexy(sexyComBounds[0], sexyComBounds[1]) + + "move to the line after last line of the sexy comment + let numLinesAfterSexyComRemoved = s:NumLinesInBuf() + let numLinesRemoved = numLinesBeforeSexyComRemoved - numLinesAfterSexyComRemoved + let currentLine = sexyComBounds[1] - numLinesRemoved + 1 + let lastline = lastline - numLinesRemoved + + "no sexy com was detected so uncomment the line as normal + else + call s:UncommentLinesNormal(currentLine, currentLine) + let currentLine = currentLine + 1 + endif + endwhile + +endfunction + +" Function: s:UncommentLinesSexy(topline, bottomline) {{{2 +" This function removes all the comment characters associated with the sexy +" comment spanning the given lines +" Args: +" -topline/bottomline: the top/bottom lines of the sexy comment +function s:UncommentLinesSexy(topline, bottomline) + let left = s:GetSexyComLeft(0,1) + let right = s:GetSexyComRight(0,1) + + + "check if it is even possible for sexy comments to exist with the + "available delimiters + if left == -1 || right == -1 + throw 'NERDCommenter.Delimiters exception: cannot uncomment sexy comments with available delimiters.' + endif + + let leftUnEsc = s:GetSexyComLeft(0,0) + let rightUnEsc = s:GetSexyComRight(0,0) + + let sexyComMarker = s:GetSexyComMarker(0, 1) + let sexyComMarkerUnEsc = s:GetSexyComMarker(0, 0) + + "the markerOffset is how far right we need to move the sexyComMarker to + "line it up with the end of the left delim + let markerOffset = strlen(leftUnEsc)-strlen(sexyComMarkerUnEsc) + + " go thru the intermediate lines of the sexy comment and remove the + " sexy comment markers (eg the '*'s on the start of line in a c sexy + " comment) + let currentLine = a:topline+1 + while currentLine < a:bottomline + let theLine = getline(currentLine) + + " remove the sexy comment marker from the line. We also remove the + " space after it if there is one and if appropriate options are set + let sexyComMarkerIndx = stridx(theLine, sexyComMarkerUnEsc) + if strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims + let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)+s:lenSpaceStr) + else + let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)) + endif + + let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) + + let theLine = s:ConvertLeadingWhiteSpace(theLine) + + " move onto the next line + call setline(currentLine, theLine) + let currentLine = currentLine + 1 + endwhile + + " gotta make a copy of a:bottomline cos we modify the position of the + " last line it if we remove the topline + let bottomline = a:bottomline + + " get the first line so we can remove the left delim from it + let theLine = getline(a:topline) + + " if the first line contains only the left delim then just delete it + if theLine =~ '^[ \t]*' . left . '[ \t]*$' && !g:NERDCompactSexyComs + call cursor(a:topline, 1) + normal! dd + let bottomline = bottomline - 1 + + " topline contains more than just the left delim + else + + " remove the delim. If there is a space after it + " then remove this too if appropriate + let delimIndx = stridx(theLine, leftUnEsc) + if strpart(theLine, delimIndx+strlen(leftUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims + let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(leftUnEsc)+s:lenSpaceStr) + else + let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(leftUnEsc)) + endif + let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) + call setline(a:topline, theLine) + endif + + " get the last line so we can remove the right delim + let theLine = getline(bottomline) + + " if the bottomline contains only the right delim then just delete it + if theLine =~ '^[ \t]*' . right . '[ \t]*$' + call cursor(bottomline, 1) + normal! dd + + " the last line contains more than the right delim + else + " remove the right delim. If there is a space after it and + " if the appropriate options are set then remove this too. + let delimIndx = s:LastIndexOfDelim(rightUnEsc, theLine) + if strpart(theLine, delimIndx+strlen(leftUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims + let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(rightUnEsc)+s:lenSpaceStr) + else + let theLine = strpart(theLine, 0, delimIndx) . strpart(theLine, delimIndx+strlen(rightUnEsc)) + endif + + " if the last line also starts with a sexy comment marker then we + " remove this as well + if theLine =~ '^[ \t]*' . sexyComMarker + + " remove the sexyComMarker. If there is a space after it then + " remove that too + let sexyComMarkerIndx = stridx(theLine, sexyComMarkerUnEsc) + if strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc), s:lenSpaceStr) == s:spaceStr && g:NERDSpaceDelims + let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset ) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)+s:lenSpaceStr) + else + let theLine = strpart(theLine, 0, sexyComMarkerIndx - markerOffset ) . strpart(theLine, sexyComMarkerIndx+strlen(sexyComMarkerUnEsc)) + endif + endif + + let theLine = s:SwapOutterPlaceHoldersForMultiPartDelims(theLine) + call setline(bottomline, theLine) + endif +endfunction + +" Function: s:UncommentLineNormal(line) {{{2 +" uncomments the given line and returns the result +" Args: +" -line: the line to uncomment +function s:UncommentLineNormal(line) + let line = a:line + + "get the comment status on the line so we know how it is commented + let lineCommentStatus = s:IsCommentedOuttermost(s:Left(), s:Right(), s:Left({'alt': 1}), s:Right({'alt': 1}), line) + + "it is commented with s:Left() and s:Right() so remove these delims + if lineCommentStatus == 1 + let line = s:RemoveDelimiters(s:Left(), s:Right(), line) + + "it is commented with s:Left({'alt': 1}) and s:Right({'alt': 1}) so remove these delims + elseif lineCommentStatus == 2 && g:NERDRemoveAltComs + let line = s:RemoveDelimiters(s:Left({'alt': 1}), s:Right({'alt': 1}), line) + + "it is not properly commented with any delims so we check if it has + "any random left or right delims on it and remove the outtermost ones + else + "get the positions of all delim types on the line + let indxLeft = s:FindDelimiterIndex(s:Left(), line) + let indxLeftAlt = s:FindDelimiterIndex(s:Left({'alt': 1}), line) + let indxRight = s:FindDelimiterIndex(s:Right(), line) + let indxRightAlt = s:FindDelimiterIndex(s:Right({'alt': 1}), line) + + "remove the outter most left comment delim + if indxLeft != -1 && (indxLeft < indxLeftAlt || indxLeftAlt == -1) + let line = s:RemoveDelimiters(s:Left(), '', line) + elseif indxLeftAlt != -1 + let line = s:RemoveDelimiters(s:Left({'alt': 1}), '', line) + endif + + "remove the outter most right comment delim + if indxRight != -1 && (indxRight < indxRightAlt || indxRightAlt == -1) + let line = s:RemoveDelimiters('', s:Right(), line) + elseif indxRightAlt != -1 + let line = s:RemoveDelimiters('', s:Right({'alt': 1}), line) + endif + endif + + + let indxLeft = s:FindDelimiterIndex(s:Left(), line) + let indxLeftAlt = s:FindDelimiterIndex(s:Left({'alt': 1}), line) + let indxLeftPlace = s:FindDelimiterIndex(g:NERDLPlace, line) + + let indxRightPlace = s:FindDelimiterIndex(g:NERDRPlace, line) + let indxRightAlt = s:FindDelimiterIndex(s:Right({'alt': 1}), line) + let indxRightPlace = s:FindDelimiterIndex(g:NERDRPlace, line) + + let right = s:Right() + let left = s:Left() + if !s:Multipart() + let right = s:Right({'alt': 1}) + let left = s:Left({'alt': 1}) + endif + + + "if there are place-holders on the line then we check to see if they are + "the outtermost delimiters on the line. If so then we replace them with + "real delimiters + if indxLeftPlace != -1 + if (indxLeftPlace < indxLeft || indxLeft==-1) && (indxLeftPlace < indxLeftAlt || indxLeftAlt==-1) + let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, line) + endif + elseif indxRightPlace != -1 + if (indxRightPlace < indxLeft || indxLeft==-1) && (indxLeftPlace < indxLeftAlt || indxLeftAlt==-1) + let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, line) + endif + + endif + + let line = s:ConvertLeadingWhiteSpace(line) + + return line +endfunction + +" Function: s:UncommentLinesNormal(topline, bottomline) {{{2 +" This function is called to uncomment lines that arent a sexy comment +" Args: +" -topline/bottomline: the top/bottom line numbers of the comment +function s:UncommentLinesNormal(topline, bottomline) + let currentLine = a:topline + while currentLine <= a:bottomline + let line = getline(currentLine) + call setline(currentLine, s:UncommentLineNormal(line)) + let currentLine = currentLine + 1 + endwhile +endfunction + + +" Section: Other helper functions {{{1 +" ============================================================================ + +" Function: s:AddLeftDelim(delim, theLine) {{{2 +" Args: +function s:AddLeftDelim(delim, theLine) + return substitute(a:theLine, '^\([ \t]*\)', '\1' . a:delim, '') +endfunction + +" Function: s:AddLeftDelimAligned(delim, theLine) {{{2 +" Args: +function s:AddLeftDelimAligned(delim, theLine, alignIndx) + + "if the line is not long enough then bung some extra spaces on the front + "so we can align the delim properly + let theLine = a:theLine + if strlen(theLine) < a:alignIndx + let theLine = repeat(' ', a:alignIndx - strlen(theLine)) + endif + + return strpart(theLine, 0, a:alignIndx) . a:delim . strpart(theLine, a:alignIndx) +endfunction + +" Function: s:AddRightDelim(delim, theLine) {{{2 +" Args: +function s:AddRightDelim(delim, theLine) + if a:delim == '' + return a:theLine + else + return substitute(a:theLine, '$', a:delim, '') + endif +endfunction + +" Function: s:AddRightDelimAligned(delim, theLine, alignIndx) {{{2 +" Args: +function s:AddRightDelimAligned(delim, theLine, alignIndx) + if a:delim == "" + return a:theLine + else + + " when we align the right delim we are just adding spaces + " so we get a string containing the needed spaces (it + " could be empty) + let extraSpaces = '' + let extraSpaces = repeat(' ', a:alignIndx-strlen(a:theLine)) + + " add the right delim + return substitute(a:theLine, '$', extraSpaces . a:delim, '') + endif +endfunction + +" Function: s:AltMultipart() {{{2 +" returns 1 if the alternative delims are multipart +function s:AltMultipart() + return b:NERDCommenterDelims['rightAlt'] != '' +endfunction + +" Function: s:CanCommentLine(forceNested, line) {{{2 +"This function is used to determine whether the given line can be commented. +"It returns 1 if it can be and 0 otherwise +" +" Args: +" -forceNested: a flag indicating whether the caller wants comments to be nested +" if the current line is already commented +" -lineNum: the line num of the line to check for commentability +function s:CanCommentLine(forceNested, lineNum) + let theLine = getline(a:lineNum) + + " make sure we don't comment lines that are just spaces or tabs or empty. + if theLine =~ "^[ \t]*$" + return 0 + endif + + "if the line is part of a sexy comment then just flag it... + if s:IsInSexyComment(a:lineNum) + return 0 + endif + + let isCommented = s:IsCommentedNormOrSexy(a:lineNum) + + "if the line isnt commented return true + if !isCommented + return 1 + endif + + "if the line is commented but nesting is allowed then return true + if a:forceNested && (!s:Multipart() || g:NERDUsePlaceHolders) + return 1 + endif + + return 0 +endfunction + +" Function: s:CanPlaceCursor(line, col) {{{2 +" returns 1 if the cursor can be placed exactly in the given position +function s:CanPlaceCursor(line, col) + let c = col(".") + let l = line(".") + call cursor(a:line, a:col) + let success = (line(".") == a:line && col(".") == a:col) + call cursor(l,c) + return success +endfunction + +" Function: s:CanSexyCommentLines(topline, bottomline) {{{2 +" Return: 1 if the given lines can be commented sexually, 0 otherwise +function s:CanSexyCommentLines(topline, bottomline) + " see if the selected regions have any sexy comments + let currentLine = a:topline + while(currentLine <= a:bottomline) + if s:IsInSexyComment(currentLine) + return 0 + endif + let currentLine = currentLine + 1 + endwhile + return 1 +endfunction +" Function: s:CanToggleCommentLine(forceNested, line) {{{2 +"This function is used to determine whether the given line can be toggle commented. +"It returns 1 if it can be and 0 otherwise +" +" Args: +" -lineNum: the line num of the line to check for commentability +function s:CanToggleCommentLine(forceNested, lineNum) + let theLine = getline(a:lineNum) + if (s:IsCommentedFromStartOfLine(s:Left(), theLine) || s:IsCommentedFromStartOfLine(s:Left({'alt': 1}), theLine)) && !a:forceNested + return 0 + endif + + " make sure we don't comment lines that are just spaces or tabs or empty. + if theLine =~ "^[ \t]*$" + return 0 + endif + + "if the line is part of a sexy comment then just flag it... + if s:IsInSexyComment(a:lineNum) + return 0 + endif + + return 1 +endfunction + +" Function: s:ConvertLeadingSpacesToTabs(line) {{{2 +" This function takes a line and converts all leading tabs on that line into +" spaces +" +" Args: +" -line: the line whose leading tabs will be converted +function s:ConvertLeadingSpacesToTabs(line) + let toReturn = a:line + while toReturn =~ '^\t*' . s:TabSpace() . '\(.*\)$' + let toReturn = substitute(toReturn, '^\(\t*\)' . s:TabSpace() . '\(.*\)$' , '\1\t\2' , "") + endwhile + + return toReturn +endfunction + + +" Function: s:ConvertLeadingTabsToSpaces(line) {{{2 +" This function takes a line and converts all leading spaces on that line into +" tabs +" +" Args: +" -line: the line whose leading spaces will be converted +function s:ConvertLeadingTabsToSpaces(line) + let toReturn = a:line + while toReturn =~ '^\( *\)\t' + let toReturn = substitute(toReturn, '^\( *\)\t', '\1' . s:TabSpace() , "") + endwhile + + return toReturn +endfunction + +" Function: s:ConvertLeadingWhiteSpace(line) {{{2 +" Converts the leading white space to tabs/spaces depending on &ts +" +" Args: +" -line: the line to convert +function s:ConvertLeadingWhiteSpace(line) + let toReturn = a:line + while toReturn =~ '^ *\t' + let toReturn = substitute(toReturn, '^ *\zs\t\ze', s:TabSpace(), "g") + endwhile + + if !&expandtab + let toReturn = s:ConvertLeadingSpacesToTabs(toReturn) + endif + + return toReturn +endfunction + + +" Function: s:CountNonESCedOccurances(str, searchstr, escChar) {{{2 +" This function counts the number of substrings contained in another string. +" These substrings are only counted if they are not escaped with escChar +" Args: +" -str: the string to look for searchstr in +" -searchstr: the substring to search for in str +" -escChar: the escape character which, when preceding an instance of +" searchstr, will cause it not to be counted +function s:CountNonESCedOccurances(str, searchstr, escChar) + "get the index of the first occurrence of searchstr + let indx = stridx(a:str, a:searchstr) + + "if there is an instance of searchstr in str process it + if indx != -1 + "get the remainder of str after this instance of searchstr is removed + let lensearchstr = strlen(a:searchstr) + let strLeft = strpart(a:str, indx+lensearchstr) + + "if this instance of searchstr is not escaped, add one to the count + "and recurse. If it is escaped, just recurse + if !s:IsEscaped(a:str, indx, a:escChar) + return 1 + s:CountNonESCedOccurances(strLeft, a:searchstr, a:escChar) + else + return s:CountNonESCedOccurances(strLeft, a:searchstr, a:escChar) + endif + endif +endfunction +" Function: s:DoesBlockHaveDelim(delim, top, bottom) {{{2 +" Returns 1 if the given block of lines has a delimiter (a:delim) in it +" Args: +" -delim: the comment delimiter to check the block for +" -top: the top line number of the block +" -bottom: the bottom line number of the block +function s:DoesBlockHaveDelim(delim, top, bottom) + let currentLine = a:top + while currentLine < a:bottom + let theline = getline(currentLine) + if s:FindDelimiterIndex(a:delim, theline) != -1 + return 1 + endif + let currentLine = currentLine + 1 + endwhile + return 0 +endfunction + +" Function: s:DoesBlockHaveMultipartDelim(top, bottom) {{{2 +" Returns 1 if the given block has a >= 1 multipart delimiter in it +" Args: +" -top: the top line number of the block +" -bottom: the bottom line number of the block +function s:DoesBlockHaveMultipartDelim(top, bottom) + if s:HasMultipartDelims() + if s:Multipart() + return s:DoesBlockHaveDelim(s:Left(), a:top, a:bottom) || s:DoesBlockHaveDelim(s:Right(), a:top, a:bottom) + else + return s:DoesBlockHaveDelim(s:Left({'alt': 1}), a:top, a:bottom) || s:DoesBlockHaveDelim(s:Right({'alt': 1}), a:top, a:bottom) + endif + endif + return 0 +endfunction + + +" Function: s:Esc(str) {{{2 +" Escapes all the tricky chars in the given string +function s:Esc(str) + let charsToEsc = '*/\."&$+' + return escape(a:str, charsToEsc) +endfunction + +" Function: s:FindDelimiterIndex(delimiter, line) {{{2 +" This function is used to get the string index of the input comment delimiter +" on the input line. If no valid comment delimiter is found in the line then +" -1 is returned +" Args: +" -delimiter: the delimiter we are looking to find the index of +" -line: the line we are looking for delimiter on +function s:FindDelimiterIndex(delimiter, line) + + "make sure the delimiter isnt empty otherwise we go into an infinite loop. + if a:delimiter == "" + return -1 + endif + + + let l:delimiter = a:delimiter + let lenDel = strlen(l:delimiter) + + "get the index of the first occurrence of the delimiter + let delIndx = stridx(a:line, l:delimiter) + + "keep looping thru the line till we either find a real comment delimiter + "or run off the EOL + while delIndx != -1 + + "if we are not off the EOL get the str before the possible delimiter + "in question and check if it really is a delimiter. If it is, return + "its position + if delIndx != -1 + if s:IsDelimValid(l:delimiter, delIndx, a:line) + return delIndx + endif + endif + + "we have not yet found a real comment delimiter so move past the + "current one we are lookin at + let restOfLine = strpart(a:line, delIndx + lenDel) + let distToNextDelim = stridx(restOfLine , l:delimiter) + + "if distToNextDelim is -1 then there is no more potential delimiters + "on the line so set delIndx to -1. Otherwise, move along the line by + "distToNextDelim + if distToNextDelim == -1 + let delIndx = -1 + else + let delIndx = delIndx + lenDel + distToNextDelim + endif + endwhile + + "there is no comment delimiter on this line + return -1 +endfunction + +" Function: s:FindBoundingLinesOfSexyCom(lineNum) {{{2 +" This function takes in a line number and tests whether this line number is +" the top/bottom/middle line of a sexy comment. If it is then the top/bottom +" lines of the sexy comment are returned +" Args: +" -lineNum: the line number that is to be tested whether it is the +" top/bottom/middle line of a sexy com +" Returns: +" A string that has the top/bottom lines of the sexy comment encoded in it. +" The format is 'topline,bottomline'. If a:lineNum turns out not to be the +" top/bottom/middle of a sexy comment then -1 is returned +function s:FindBoundingLinesOfSexyCom(lineNum) + + "find which delimiters to look for as the start/end delims of the comment + let left = '' + let right = '' + if s:Multipart() + let left = s:Left({'esc': 1}) + let right = s:Right({'esc': 1}) + elseif s:AltMultipart() + let left = s:Left({'alt': 1, 'esc': 1}) + let right = s:Right({'alt': 1, 'esc': 1}) + else + return [] + endif + + let sexyComMarker = s:GetSexyComMarker(0, 1) + + "initialise the top/bottom line numbers of the sexy comment to -1 + let top = -1 + let bottom = -1 + + let currentLine = a:lineNum + while top == -1 || bottom == -1 + let theLine = getline(currentLine) + + "check if the current line is the top of the sexy comment + if currentLine <= a:lineNum && theLine =~ '^[ \t]*' . left && theLine !~ '.*' . right && currentLine < s:NumLinesInBuf() + let top = currentLine + let currentLine = a:lineNum + + "check if the current line is the bottom of the sexy comment + elseif theLine =~ '^[ \t]*' . right && theLine !~ '.*' . left && currentLine > 1 + let bottom = currentLine + + "the right delimiter is on the same line as the last sexyComMarker + elseif theLine =~ '^[ \t]*' . sexyComMarker . '.*' . right + let bottom = currentLine + + "we have not found the top or bottom line so we assume currentLine is an + "intermediate line and look to prove otherwise + else + + "if the line doesnt start with a sexyComMarker then it is not a sexy + "comment + if theLine !~ '^[ \t]*' . sexyComMarker + return [] + endif + + endif + + "if top is -1 then we havent found the top yet so keep looking up + if top == -1 + let currentLine = currentLine - 1 + "if we have found the top line then go down looking for the bottom + else + let currentLine = currentLine + 1 + endif + + endwhile + + return [top, bottom] +endfunction + + +" Function: s:GetSexyComMarker() {{{2 +" Returns the sexy comment marker for the current filetype. +" +" C style sexy comments are assumed if possible. If not then the sexy comment +" marker is the last char of the delimiter pair that has both left and right +" delims and has the longest left delim +" +" Args: +" -space: specifies whether the marker is to have a space string after it +" (the space string will only be added if NERDSpaceDelims is set) +" -esc: specifies whether the tricky chars in the marker are to be ESCed +function s:GetSexyComMarker(space, esc) + let sexyComMarker = b:NERDSexyComMarker + + "if there is no hardcoded marker then we find one + if sexyComMarker == '' + + "if the filetype has c style comments then use standard c sexy + "comments + if s:HasCStyleComments() + let sexyComMarker = '*' + else + "find a comment marker by getting the longest available left delim + "(that has a corresponding right delim) and taking the last char + let lenLeft = strlen(s:Left()) + let lenLeftAlt = strlen(s:Left({'alt': 1})) + let left = '' + let right = '' + if s:Multipart() && lenLeft >= lenLeftAlt + let left = s:Left() + elseif s:AltMultipart() + let left = s:Left({'alt': 1}) + else + return -1 + endif + + "get the last char of left + let sexyComMarker = strpart(left, strlen(left)-1) + endif + endif + + if a:space && g:NERDSpaceDelims + let sexyComMarker = sexyComMarker . s:spaceStr + endif + + if a:esc + let sexyComMarker = s:Esc(sexyComMarker) + endif + + return sexyComMarker +endfunction + +" Function: s:GetSexyComLeft(space, esc) {{{2 +" Returns the left delimiter for sexy comments for this filetype or -1 if +" there is none. C style sexy comments are used if possible +" Args: +" -space: specifies if the delim has a space string on the end +" (the space string will only be added if NERDSpaceDelims is set) +" -esc: specifies whether the tricky chars in the string are ESCed +function s:GetSexyComLeft(space, esc) + let lenLeft = strlen(s:Left()) + let lenLeftAlt = strlen(s:Left({'alt': 1})) + let left = '' + + "assume c style sexy comments if possible + if s:HasCStyleComments() + let left = '/*' + else + "grab the longest left delim that has a right + if s:Multipart() && lenLeft >= lenLeftAlt + let left = s:Left() + elseif s:AltMultipart() + let left = s:Left({'alt': 1}) + else + return -1 + endif + endif + + if a:space && g:NERDSpaceDelims + let left = left . s:spaceStr + endif + + if a:esc + let left = s:Esc(left) + endif + + return left +endfunction + +" Function: s:GetSexyComRight(space, esc) {{{2 +" Returns the right delimiter for sexy comments for this filetype or -1 if +" there is none. C style sexy comments are used if possible. +" Args: +" -space: specifies if the delim has a space string on the start +" (the space string will only be added if NERDSpaceDelims +" is specified for the current filetype) +" -esc: specifies whether the tricky chars in the string are ESCed +function s:GetSexyComRight(space, esc) + let lenLeft = strlen(s:Left()) + let lenLeftAlt = strlen(s:Left({'alt': 1})) + let right = '' + + "assume c style sexy comments if possible + if s:HasCStyleComments() + let right = '*/' + else + "grab the right delim that pairs with the longest left delim + if s:Multipart() && lenLeft >= lenLeftAlt + let right = s:Right() + elseif s:AltMultipart() + let right = s:Right({'alt': 1}) + else + return -1 + endif + endif + + if a:space && g:NERDSpaceDelims + let right = s:spaceStr . right + endif + + if a:esc + let right = s:Esc(right) + endif + + return right +endfunction + +" Function: s:HasMultipartDelims() {{{2 +" Returns 1 iff the current filetype has at least one set of multipart delims +function s:HasMultipartDelims() + return s:Multipart() || s:AltMultipart() +endfunction + +" Function: s:HasLeadingTabs(...) {{{2 +" Returns 1 if any of the given strings have leading tabs +function s:HasLeadingTabs(...) + for s in a:000 + if s =~ '^\t.*' + return 1 + end + endfor + return 0 +endfunction +" Function: s:HasCStyleComments() {{{2 +" Returns 1 iff the current filetype has c style comment delimiters +function s:HasCStyleComments() + return (s:Left() == '/*' && s:Right() == '*/') || (s:Left({'alt': 1}) == '/*' && s:Right({'alt': 1}) == '*/') +endfunction + +" Function: s:IsCommentedNormOrSexy(lineNum) {{{2 +"This function is used to determine whether the given line is commented with +"either set of delimiters or if it is part of a sexy comment +" +" Args: +" -lineNum: the line number of the line to check +function s:IsCommentedNormOrSexy(lineNum) + let theLine = getline(a:lineNum) + + "if the line is commented normally return 1 + if s:IsCommented(s:Left(), s:Right(), theLine) || s:IsCommented(s:Left({'alt': 1}), s:Right({'alt': 1}), theLine) + return 1 + endif + + "if the line is part of a sexy comment return 1 + if s:IsInSexyComment(a:lineNum) + return 1 + endif + return 0 +endfunction + +" Function: s:IsCommented(left, right, line) {{{2 +"This function is used to determine whether the given line is commented with +"the given delimiters +" +" Args: +" -line: the line that to check if commented +" -left/right: the left and right delimiters to check for +function s:IsCommented(left, right, line) + "if the line isnt commented return true + if s:FindDelimiterIndex(a:left, a:line) != -1 && (s:FindDelimiterIndex(a:right, a:line) != -1 || !s:Multipart()) + return 1 + endif + return 0 +endfunction + +" Function: s:IsCommentedFromStartOfLine(left, line) {{{2 +"This function is used to determine whether the given line is commented with +"the given delimiters at the start of the line i.e the left delimiter is the +"first thing on the line (apart from spaces\tabs) +" +" Args: +" -line: the line that to check if commented +" -left: the left delimiter to check for +function s:IsCommentedFromStartOfLine(left, line) + let theLine = s:ConvertLeadingTabsToSpaces(a:line) + let numSpaces = strlen(substitute(theLine, '^\( *\).*$', '\1', '')) + let delimIndx = s:FindDelimiterIndex(a:left, theLine) + return delimIndx == numSpaces +endfunction + +" Function: s:IsCommentedOuttermost(left, right, leftAlt, rightAlt, line) {{{2 +" Finds the type of the outtermost delims on the line +" +" Args: +" -line: the line that to check if the outtermost comments on it are +" left/right +" -left/right: the left and right delimiters to check for +" -leftAlt/rightAlt: the left and right alternative delimiters to check for +" +" Returns: +" 0 if the line is not commented with either set of delims +" 1 if the line is commented with the left/right delim set +" 2 if the line is commented with the leftAlt/rightAlt delim set +function s:IsCommentedOuttermost(left, right, leftAlt, rightAlt, line) + "get the first positions of the left delims and the last positions of the + "right delims + let indxLeft = s:FindDelimiterIndex(a:left, a:line) + let indxLeftAlt = s:FindDelimiterIndex(a:leftAlt, a:line) + let indxRight = s:LastIndexOfDelim(a:right, a:line) + let indxRightAlt = s:LastIndexOfDelim(a:rightAlt, a:line) + + "check if the line has a left delim before a leftAlt delim + if (indxLeft <= indxLeftAlt || indxLeftAlt == -1) && indxLeft != -1 + "check if the line has a right delim after any rightAlt delim + if (indxRight > indxRightAlt && indxRight > indxLeft) || !s:Multipart() + return 1 + endif + + "check if the line has a leftAlt delim before a left delim + elseif (indxLeftAlt <= indxLeft || indxLeft == -1) && indxLeftAlt != -1 + "check if the line has a rightAlt delim after any right delim + if (indxRightAlt > indxRight && indxRightAlt > indxLeftAlt) || !s:AltMultipart() + return 2 + endif + else + return 0 + endif + + return 0 + +endfunction + + +" Function: s:IsDelimValid(delimiter, delIndx, line) {{{2 +" This function is responsible for determining whether a given instance of a +" comment delimiter is a real delimiter or not. For example, in java the +" // string is a comment delimiter but in the line: +" System.out.println("//"); +" it does not count as a comment delimiter. This function is responsible for +" distinguishing between such cases. It does so by applying a set of +" heuristics that are not fool proof but should work most of the time. +" +" Args: +" -delimiter: the delimiter we are validating +" -delIndx: the position of delimiter in line +" -line: the line that delimiter occurs in +" +" Returns: +" 0 if the given delimiter is not a real delimiter (as far as we can tell) , +" 1 otherwise +function s:IsDelimValid(delimiter, delIndx, line) + "get the delimiter without the escchars + let l:delimiter = a:delimiter + + "get the strings before and after the delimiter + let preComStr = strpart(a:line, 0, a:delIndx) + let postComStr = strpart(a:line, a:delIndx+strlen(delimiter)) + + "to check if the delimiter is real, make sure it isnt preceded by + "an odd number of quotes and followed by the same (which would indicate + "that it is part of a string and therefore is not a comment) + if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, '"', "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, '"', "\\")) + return 0 + endif + if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, "'", "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, "'", "\\")) + return 0 + endif + if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, "`", "\\")) && !s:IsNumEven(s:CountNonESCedOccurances(postComStr, "`", "\\")) + return 0 + endif + + + "if the comment delimiter is escaped, assume it isnt a real delimiter + if s:IsEscaped(a:line, a:delIndx, "\\") + return 0 + endif + + "vim comments are so fuckin stupid!! Why the hell do they have comment + "delimiters that are used elsewhere in the syntax?!?! We need to check + "some conditions especially for vim + if &filetype == "vim" + if !s:IsNumEven(s:CountNonESCedOccurances(preComStr, '"', "\\")) + return 0 + endif + + "if the delimiter is on the very first char of the line or is the + "first non-tab/space char on the line then it is a valid comment delimiter + if a:delIndx == 0 || a:line =~ "^[ \t]\\{" . a:delIndx . "\\}\".*$" + return 1 + endif + + let numLeftParen =s:CountNonESCedOccurances(preComStr, "(", "\\") + let numRightParen =s:CountNonESCedOccurances(preComStr, ")", "\\") + + "if the quote is inside brackets then assume it isnt a comment + if numLeftParen > numRightParen + return 0 + endif + + "if the line has an even num of unescaped "'s then we can assume that + "any given " is not a comment delimiter + if s:IsNumEven(s:CountNonESCedOccurances(a:line, "\"", "\\")) + return 0 + endif + endif + + return 1 + +endfunction + +" Function: s:IsNumEven(num) {{{2 +" A small function the returns 1 if the input number is even and 0 otherwise +" Args: +" -num: the number to check +function s:IsNumEven(num) + return (a:num % 2) == 0 +endfunction + +" Function: s:IsEscaped(str, indx, escChar) {{{2 +" This function takes a string, an index into that string and an esc char and +" returns 1 if the char at the index is escaped (i.e if it is preceded by an +" odd number of esc chars) +" Args: +" -str: the string to check +" -indx: the index into str that we want to check +" -escChar: the escape char the char at indx may be ESCed with +function s:IsEscaped(str, indx, escChar) + "initialise numEscChars to 0 and look at the char before indx + let numEscChars = 0 + let curIndx = a:indx-1 + + "keep going back thru str until we either reach the start of the str or + "run out of esc chars + while curIndx >= 0 && strpart(a:str, curIndx, 1) == a:escChar + + "we have found another esc char so add one to the count and move left + "one char + let numEscChars = numEscChars + 1 + let curIndx = curIndx - 1 + + endwhile + + "if there is an odd num of esc chars directly before the char at indx then + "the char at indx is escaped + return !s:IsNumEven(numEscChars) +endfunction + +" Function: s:IsInSexyComment(line) {{{2 +" returns 1 if the given line number is part of a sexy comment +function s:IsInSexyComment(line) + return !empty(s:FindBoundingLinesOfSexyCom(a:line)) +endfunction + +" Function: s:IsSexyComment(topline, bottomline) {{{2 +" This function takes in 2 line numbers and returns 1 if the lines between and +" including the given line numbers are a sexy comment. It returns 0 otherwise. +" Args: +" -topline: the line that the possible sexy comment starts on +" -bottomline: the line that the possible sexy comment stops on +function s:IsSexyComment(topline, bottomline) + + "get the delim set that would be used for a sexy comment + let left = '' + let right = '' + if s:Multipart() + let left = s:Left() + let right = s:Right() + elseif s:AltMultipart() + let left = s:Left({'alt': 1}) + let right = s:Right({'alt': 1}) + else + return 0 + endif + + "swap the top and bottom line numbers around if need be + let topline = a:topline + let bottomline = a:bottomline + if bottomline < topline + topline = bottomline + bottomline = a:topline + endif + + "if there is < 2 lines in the comment it cannot be sexy + if (bottomline - topline) <= 0 + return 0 + endif + + "if the top line doesnt begin with a left delim then the comment isnt sexy + if getline(a:topline) !~ '^[ \t]*' . left + return 0 + endif + + "if there is a right delim on the top line then this isnt a sexy comment + if s:FindDelimiterIndex(right, getline(a:topline)) != -1 + return 0 + endif + + "if there is a left delim on the bottom line then this isnt a sexy comment + if s:FindDelimiterIndex(left, getline(a:bottomline)) != -1 + return 0 + endif + + "if the bottom line doesnt begin with a right delim then the comment isnt + "sexy + if getline(a:bottomline) !~ '^.*' . right . '$' + return 0 + endif + + let sexyComMarker = s:GetSexyComMarker(0, 1) + + "check each of the intermediate lines to make sure they start with a + "sexyComMarker + let currentLine = a:topline+1 + while currentLine < a:bottomline + let theLine = getline(currentLine) + + if theLine !~ '^[ \t]*' . sexyComMarker + return 0 + endif + + "if there is a right delim in an intermediate line then the block isnt + "a sexy comment + if s:FindDelimiterIndex(right, theLine) != -1 + return 0 + endif + + let currentLine = currentLine + 1 + endwhile + + "we have not found anything to suggest that this isnt a sexy comment so + return 1 + +endfunction + +" Function: s:LastIndexOfDelim(delim, str) {{{2 +" This function takes a string and a delimiter and returns the last index of +" that delimiter in string +" Args: +" -delim: the delimiter to look for +" -str: the string to look for delim in +function s:LastIndexOfDelim(delim, str) + let delim = a:delim + let lenDelim = strlen(delim) + + "set index to the first occurrence of delim. If there is no occurrence then + "bail + let indx = s:FindDelimiterIndex(delim, a:str) + if indx == -1 + return -1 + endif + + "keep moving to the next instance of delim in str till there is none left + while 1 + + "search for the next delim after the previous one + let searchStr = strpart(a:str, indx+lenDelim) + let indx2 = s:FindDelimiterIndex(delim, searchStr) + + "if we find a delim update indx to record the position of it, if we + "dont find another delim then indx is the last one so break out of + "this loop + if indx2 != -1 + let indx = indx + indx2 + lenDelim + else + break + endif + endwhile + + return indx + +endfunction + +" Function: s:Left(...) {{{2 +" returns left delimiter data +function s:Left(...) + let params = a:0 ? a:1 : {} + + let delim = has_key(params, 'alt') ? b:NERDCommenterDelims['leftAlt'] : b:NERDCommenterDelims['left'] + + if delim == '' + return '' + endif + + if has_key(params, 'space') && g:NERDSpaceDelims + let delim = delim . s:spaceStr + endif + + if has_key(params, 'esc') + let delim = s:Esc(delim) + endif + + return delim +endfunction + +" Function: s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) {{{2 +" This function takes in 2 line numbers and returns the index of the left most +" char (that is not a space or a tab) on all of these lines. +" Args: +" -countCommentedLines: 1 if lines that are commented are to be checked as +" well. 0 otherwise +" -countEmptyLines: 1 if empty lines are to be counted in the search +" -topline: the top line to be checked +" -bottomline: the bottom line to be checked +function s:LeftMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) + + " declare the left most index as an extreme value + let leftMostIndx = 1000 + + " go thru the block line by line updating leftMostIndx + let currentLine = a:topline + while currentLine <= a:bottomline + + " get the next line and if it is allowed to be commented, or is not + " commented, check it + let theLine = getline(currentLine) + if a:countEmptyLines || theLine !~ '^[ \t]*$' + if a:countCommentedLines || (!s:IsCommented(s:Left(), s:Right(), theLine) && !s:IsCommented(s:Left({'alt': 1}), s:Right({'alt': 1}), theLine)) + " convert spaces to tabs and get the number of leading spaces for + " this line and update leftMostIndx if need be + let theLine = s:ConvertLeadingTabsToSpaces(theLine) + let leadSpaceOfLine = strlen( substitute(theLine, '\(^[ \t]*\).*$','\1','') ) + if leadSpaceOfLine < leftMostIndx + let leftMostIndx = leadSpaceOfLine + endif + endif + endif + + " move on to the next line + let currentLine = currentLine + 1 + endwhile + + if leftMostIndx == 1000 + return 0 + else + return leftMostIndx + endif +endfunction + +" Function: s:Multipart() {{{2 +" returns 1 if the current delims are multipart +function s:Multipart() + return s:Right() != '' +endfunction + +" Function: s:NerdEcho(msg, typeOfMsg) {{{2 +" Args: +" -msg: the message to echo +" -typeOfMsg: 0 = warning message +" 1 = normal message +function s:NerdEcho(msg, typeOfMsg) + if a:typeOfMsg == 0 + echohl WarningMsg + echom 'NERDCommenter:' . a:msg + echohl None + elseif a:typeOfMsg == 1 + echom 'NERDCommenter:' . a:msg + endif +endfunction + +" Function: s:NumberOfLeadingTabs(s) {{{2 +" returns the number of leading tabs in the given string +function s:NumberOfLeadingTabs(s) + return strlen(substitute(a:s, '^\(\t*\).*$', '\1', "")) +endfunction + +" Function: s:NumLinesInBuf() {{{2 +" Returns the number of lines in the current buffer +function s:NumLinesInBuf() + return line('$') +endfunction + +" Function: s:ReplaceDelims(toReplace1, toReplace2, replacor1, replacor2, str) {{{2 +" This function takes in a string, 2 delimiters in that string and 2 strings +" to replace these delimiters with. +" +" Args: +" -toReplace1: the first delimiter to replace +" -toReplace2: the second delimiter to replace +" -replacor1: the string to replace toReplace1 with +" -replacor2: the string to replace toReplace2 with +" -str: the string that the delimiters to be replaced are in +function s:ReplaceDelims(toReplace1, toReplace2, replacor1, replacor2, str) + let line = s:ReplaceLeftMostDelim(a:toReplace1, a:replacor1, a:str) + let line = s:ReplaceRightMostDelim(a:toReplace2, a:replacor2, line) + return line +endfunction + +" Function: s:ReplaceLeftMostDelim(toReplace, replacor, str) {{{2 +" This function takes a string and a delimiter and replaces the left most +" occurrence of this delimiter in the string with a given string +" +" Args: +" -toReplace: the delimiter in str that is to be replaced +" -replacor: the string to replace toReplace with +" -str: the string that contains toReplace +function s:ReplaceLeftMostDelim(toReplace, replacor, str) + let toReplace = a:toReplace + let replacor = a:replacor + "get the left most occurrence of toReplace + let indxToReplace = s:FindDelimiterIndex(toReplace, a:str) + + "if there IS an occurrence of toReplace in str then replace it and return + "the resulting string + if indxToReplace != -1 + let line = strpart(a:str, 0, indxToReplace) . replacor . strpart(a:str, indxToReplace+strlen(toReplace)) + return line + endif + + return a:str +endfunction + +" Function: s:ReplaceRightMostDelim(toReplace, replacor, str) {{{2 +" This function takes a string and a delimiter and replaces the right most +" occurrence of this delimiter in the string with a given string +" +" Args: +" -toReplace: the delimiter in str that is to be replaced +" -replacor: the string to replace toReplace with +" -str: the string that contains toReplace +" +function s:ReplaceRightMostDelim(toReplace, replacor, str) + let toReplace = a:toReplace + let replacor = a:replacor + let lenToReplace = strlen(toReplace) + + "get the index of the last delim in str + let indxToReplace = s:LastIndexOfDelim(toReplace, a:str) + + "if there IS a delimiter in str, replace it and return the result + let line = a:str + if indxToReplace != -1 + let line = strpart(a:str, 0, indxToReplace) . replacor . strpart(a:str, indxToReplace+strlen(toReplace)) + endif + return line +endfunction + +"FUNCTION: s:RestoreScreenState() {{{2 +" +"Sets the screen state back to what it was when s:SaveScreenState was last +"called. +" +function s:RestoreScreenState() + if !exists("t:NERDComOldTopLine") || !exists("t:NERDComOldPos") + throw 'NERDCommenter exception: cannot restore screen' + endif + + call cursor(t:NERDComOldTopLine, 0) + normal! zt + call setpos(".", t:NERDComOldPos) +endfunction + +" Function: s:Right(...) {{{2 +" returns right delimiter data +function s:Right(...) + let params = a:0 ? a:1 : {} + + let delim = has_key(params, 'alt') ? b:NERDCommenterDelims['rightAlt'] : b:NERDCommenterDelims['right'] + + if delim == '' + return '' + endif + + if has_key(params, 'space') && g:NERDSpaceDelims + let delim = s:spaceStr . delim + endif + + if has_key(params, 'esc') + let delim = s:Esc(delim) + endif + + return delim +endfunction + +" Function: s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) {{{2 +" This function takes in 2 line numbers and returns the index of the right most +" char on all of these lines. +" Args: +" -countCommentedLines: 1 if lines that are commented are to be checked as +" well. 0 otherwise +" -countEmptyLines: 1 if empty lines are to be counted in the search +" -topline: the top line to be checked +" -bottomline: the bottom line to be checked +function s:RightMostIndx(countCommentedLines, countEmptyLines, topline, bottomline) + let rightMostIndx = -1 + + " go thru the block line by line updating rightMostIndx + let currentLine = a:topline + while currentLine <= a:bottomline + + " get the next line and see if it is commentable, otherwise it doesnt + " count + let theLine = getline(currentLine) + if a:countEmptyLines || theLine !~ '^[ \t]*$' + + if a:countCommentedLines || (!s:IsCommented(s:Left(), s:Right(), theLine) && !s:IsCommented(s:Left({'alt': 1}), s:Right({'alt': 1}), theLine)) + + " update rightMostIndx if need be + let theLine = s:ConvertLeadingTabsToSpaces(theLine) + let lineLen = strlen(theLine) + if lineLen > rightMostIndx + let rightMostIndx = lineLen + endif + endif + endif + + " move on to the next line + let currentLine = currentLine + 1 + endwhile + + return rightMostIndx +endfunction + +"FUNCTION: s:SaveScreenState() {{{2 +"Saves the current cursor position in the current buffer and the window +"scroll position +function s:SaveScreenState() + let t:NERDComOldPos = getpos(".") + let t:NERDComOldTopLine = line("w0") +endfunction + +" Function: s:SwapOutterMultiPartDelimsForPlaceHolders(line) {{{2 +" This function takes a line and swaps the outter most multi-part delims for +" place holders +" Args: +" -line: the line to swap the delims in +" +function s:SwapOutterMultiPartDelimsForPlaceHolders(line) + " find out if the line is commented using normal delims and/or + " alternate ones + let isCommented = s:IsCommented(s:Left(), s:Right(), a:line) + let isCommentedAlt = s:IsCommented(s:Left({'alt': 1}), s:Right({'alt': 1}), a:line) + + let line2 = a:line + + "if the line is commented and there is a right delimiter, replace + "the delims with place-holders + if isCommented && s:Multipart() + let line2 = s:ReplaceDelims(s:Left(), s:Right(), g:NERDLPlace, g:NERDRPlace, a:line) + + "similarly if the line is commented with the alternative + "delimiters + elseif isCommentedAlt && s:AltMultipart() + let line2 = s:ReplaceDelims(s:Left({'alt': 1}), s:Right({'alt': 1}), g:NERDLPlace, g:NERDRPlace, a:line) + endif + + return line2 +endfunction + +" Function: s:SwapOutterPlaceHoldersForMultiPartDelims(line) {{{2 +" This function takes a line and swaps the outtermost place holders for +" multi-part delims +" Args: +" -line: the line to swap the delims in +" +function s:SwapOutterPlaceHoldersForMultiPartDelims(line) + let left = '' + let right = '' + if s:Multipart() + let left = s:Left() + let right = s:Right() + elseif s:AltMultipart() + let left = s:Left({'alt': 1}) + let right = s:Right({'alt': 1}) + endif + + let line = s:ReplaceDelims(g:NERDLPlace, g:NERDRPlace, left, right, a:line) + return line +endfunction +" Function: s:TabbedCol(line, col) {{{2 +" Gets the col number for given line and existing col number. The new col +" number is the col number when all leading spaces are converted to tabs +" Args: +" -line:the line to get the rel col for +" -col: the abs col +function s:TabbedCol(line, col) + let lineTruncated = strpart(a:line, 0, a:col) + let lineSpacesToTabs = substitute(lineTruncated, s:TabSpace(), '\t', 'g') + return strlen(lineSpacesToTabs) +endfunction +"FUNCTION: s:TabSpace() {{{2 +"returns a string of spaces equal in length to &tabstop +function s:TabSpace() + let tabSpace = "" + let spacesPerTab = &tabstop + while spacesPerTab > 0 + let tabSpace = tabSpace . " " + let spacesPerTab = spacesPerTab - 1 + endwhile + return tabSpace +endfunction + +" Function: s:UnEsc(str, escChar) {{{2 +" This function removes all the escape chars from a string +" Args: +" -str: the string to remove esc chars from +" -escChar: the escape char to be removed +function s:UnEsc(str, escChar) + return substitute(a:str, a:escChar, "", "g") +endfunction + +" Function: s:UntabbedCol(line, col) {{{2 +" Takes a line and a col and returns the absolute column of col taking into +" account that a tab is worth 3 or 4 (or whatever) spaces. +" Args: +" -line:the line to get the abs col for +" -col: the col that doesnt take into account tabs +function s:UntabbedCol(line, col) + let lineTruncated = strpart(a:line, 0, a:col) + let lineTabsToSpaces = substitute(lineTruncated, '\t', s:TabSpace(), 'g') + return strlen(lineTabsToSpaces) +endfunction +" Section: Comment mapping setup {{{1 +" =========================================================================== + +" switch to/from alternative delimiters +nnoremap NERDCommenterAltDelims :call SwitchToAlternativeDelimiters(1) + +" comment out lines +nnoremap NERDCommenterComment :call NERDComment(0, "norm") +vnoremap NERDCommenterComment :call NERDComment(1, "norm") + +" toggle comments +nnoremap NERDCommenterToggle :call NERDComment(0, "toggle") +vnoremap NERDCommenterToggle :call NERDComment(1, "toggle") + +" minimal comments +nnoremap NERDCommenterMinimal :call NERDComment(0, "minimal") +vnoremap NERDCommenterMinimal :call NERDComment(1, "minimal") + +" sexy comments +nnoremap NERDCommenterSexy :call NERDComment(0, "sexy") +vnoremap NERDCommenterSexy :call NERDComment(1, "sexy") + +" invert comments +nnoremap NERDCommenterInvert :call NERDComment(0, "invert") +vnoremap NERDCommenterInvert :call NERDComment(1, "invert") + +" yank then comment +nmap NERDCommenterYank :call NERDComment(0, "yank") +vmap NERDCommenterYank :call NERDComment(1, "yank") + +" left aligned comments +nnoremap NERDCommenterAlignLeft :call NERDComment(0, "alignLeft") +vnoremap NERDCommenterAlignLeft :call NERDComment(1, "alignLeft") + +" left and right aligned comments +nnoremap NERDCommenterAlignBoth :call NERDComment(0, "alignBoth") +vnoremap NERDCommenterAlignBoth :call NERDComment(1, "alignBoth") + +" nested comments +nnoremap NERDCommenterNest :call NERDComment(0, "nested") +vnoremap NERDCommenterNest :call NERDComment(1, "nested") + +" uncomment +nnoremap NERDCommenterUncomment :call NERDComment(0, "uncomment") +vnoremap NERDCommenterUncomment :call NERDComment(1, "uncomment") + +" comment till the end of the line +nnoremap NERDCommenterToEOL :call NERDComment(0, "toEOL") + +" append comments +nmap NERDCommenterAppend :call NERDComment(0, "append") + +" insert comments +inoremap NERDCommenterInInsert :call NERDComment(0, "insert") + + +function! s:CreateMaps(target, combo) + if !hasmapto(a:target, 'n') + exec 'nmap ' . a:combo . ' ' . a:target + endif + + if !hasmapto(a:target, 'v') + exec 'vmap ' . a:combo . ' ' . a:target + endif +endfunction + +if g:NERDCreateDefaultMappings + call s:CreateMaps('NERDCommenterComment', 'cc') + call s:CreateMaps('NERDCommenterToggle', 'c') + call s:CreateMaps('NERDCommenterMinimal', 'cm') + call s:CreateMaps('NERDCommenterSexy', 'cs') + call s:CreateMaps('NERDCommenterInvert', 'ci') + call s:CreateMaps('NERDCommenterYank', 'cy') + call s:CreateMaps('NERDCommenterAlignLeft', 'cl') + call s:CreateMaps('NERDCommenterAlignBoth', 'cb') + call s:CreateMaps('NERDCommenterNest', 'cn') + call s:CreateMaps('NERDCommenterUncomment', 'cu') + call s:CreateMaps('NERDCommenterToEOL', 'c$') + call s:CreateMaps('NERDCommenterAppend', 'cA') + + if !hasmapto('NERDCommenterAltDelims', 'n') + nmap ca NERDCommenterAltDelims + endif +endif + + + +" Section: Menu item setup {{{1 +" =========================================================================== +"check if the user wants the menu to be displayed +if g:NERDMenuMode != 0 + + let menuRoot = "" + if g:NERDMenuMode == 1 + let menuRoot = 'comment' + elseif g:NERDMenuMode == 2 + let menuRoot = '&comment' + elseif g:NERDMenuMode == 3 + let menuRoot = '&Plugin.&comment' + endif + + function! s:CreateMenuItems(target, desc, root) + exec 'nmenu ' . a:root . '.' . a:desc . ' ' . a:target + exec 'vmenu ' . a:root . '.' . a:desc . ' ' . a:target + endfunction + call s:CreateMenuItems("NERDCommenterComment", 'Comment', menuRoot) + call s:CreateMenuItems("NERDCommenterToggle", 'Toggle', menuRoot) + call s:CreateMenuItems('NERDCommenterMinimal', 'Minimal', menuRoot) + call s:CreateMenuItems('NERDCommenterNest', 'Nested', menuRoot) + exec 'nmenu '. menuRoot .'.To\ EOL NERDCommenterToEOL' + call s:CreateMenuItems('NERDCommenterInvert', 'Invert', menuRoot) + call s:CreateMenuItems('NERDCommenterSexy', 'Sexy', menuRoot) + call s:CreateMenuItems('NERDCommenterYank', 'Yank\ then\ comment', menuRoot) + exec 'nmenu '. menuRoot .'.Append NERDCommenterAppend' + exec 'menu '. menuRoot .'.-Sep- :' + call s:CreateMenuItems('NERDCommenterAlignLeft', 'Left\ aligned', menuRoot) + call s:CreateMenuItems('NERDCommenterAlignBoth', 'Left\ and\ right\ aligned', menuRoot) + exec 'menu '. menuRoot .'.-Sep2- :' + call s:CreateMenuItems('NERDCommenterUncomment', 'Uncomment', menuRoot) + exec 'nmenu '. menuRoot .'.Switch\ Delimiters NERDCommenterAltDelims' + exec 'imenu '. menuRoot .'.Insert\ Comment\ Here NERDCommenterInInsert' + exec 'menu '. menuRoot .'.-Sep3- :' + exec 'menu '. menuRoot .'.Help :help NERDCommenterContents' +endif +" vim: set foldmethod=marker : diff --git a/vim/oldStyle/disabled_plugins/NERD_tree.vim b/vim/oldStyle/disabled_plugins/NERD_tree.vim new file mode 100644 index 0000000..bc34775 --- /dev/null +++ b/vim/oldStyle/disabled_plugins/NERD_tree.vim @@ -0,0 +1,4017 @@ +" ============================================================================ +" File: NERD_tree.vim +" Description: vim global plugin that provides a nice tree explorer +" Maintainer: Martin Grenfell +" Last Change: 28 December, 2011 +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +" ============================================================================ +let s:NERD_tree_version = '4.2.0' + +" SECTION: Script init stuff {{{1 +"============================================================ +if exists("loaded_nerd_tree") + finish +endif +if v:version < 700 + echoerr "NERDTree: this plugin requires vim >= 7. DOWNLOAD IT! You'll thank me later!" + finish +endif +let loaded_nerd_tree = 1 + +"for line continuation - i.e dont want C in &cpo +let s:old_cpo = &cpo +set cpo&vim + +let s:running_windows = has("win16") || has("win32") || has("win64") + +"Function: s:initVariable() function {{{2 +"This function is used to initialise a given variable to a given value. The +"variable is only initialised if it does not exist prior +" +"Args: +"var: the name of the var to be initialised +"value: the value to initialise var to +" +"Returns: +"1 if the var is set, 0 otherwise +function! s:initVariable(var, value) + if !exists(a:var) + exec 'let ' . a:var . ' = ' . "'" . substitute(a:value, "'", "''", "g") . "'" + return 1 + endif + return 0 +endfunction + +"SECTION: Init variable calls and other random constants {{{2 +call s:initVariable("g:NERDChristmasTree", 1) +call s:initVariable("g:NERDTreeAutoCenter", 1) +call s:initVariable("g:NERDTreeAutoCenterThreshold", 3) +call s:initVariable("g:NERDTreeCaseSensitiveSort", 0) +call s:initVariable("g:NERDTreeChDirMode", 0) +call s:initVariable("g:NERDTreeMinimalUI", 0) +if !exists("g:NERDTreeIgnore") + let g:NERDTreeIgnore = ['\~$'] +endif +call s:initVariable("g:NERDTreeBookmarksFile", expand('$HOME') . '/.NERDTreeBookmarks') +call s:initVariable("g:NERDTreeHighlightCursorline", 1) +call s:initVariable("g:NERDTreeHijackNetrw", 1) +call s:initVariable("g:NERDTreeMouseMode", 1) +call s:initVariable("g:NERDTreeNotificationThreshold", 100) +call s:initVariable("g:NERDTreeQuitOnOpen", 0) +call s:initVariable("g:NERDTreeShowBookmarks", 0) +call s:initVariable("g:NERDTreeShowFiles", 1) +call s:initVariable("g:NERDTreeShowHidden", 0) +call s:initVariable("g:NERDTreeShowLineNumbers", 0) +call s:initVariable("g:NERDTreeSortDirs", 1) +call s:initVariable("g:NERDTreeDirArrows", !s:running_windows) + +if !exists("g:NERDTreeSortOrder") + let g:NERDTreeSortOrder = ['\/$', '*', '\.swp$', '\.bak$', '\~$'] +else + "if there isnt a * in the sort sequence then add one + if count(g:NERDTreeSortOrder, '*') < 1 + call add(g:NERDTreeSortOrder, '*') + endif +endif + +"we need to use this number many times for sorting... so we calculate it only +"once here +let s:NERDTreeSortStarIndex = index(g:NERDTreeSortOrder, '*') + +if !exists('g:NERDTreeStatusline') + + "the exists() crap here is a hack to stop vim spazzing out when + "loading a session that was created with an open nerd tree. It spazzes + "because it doesnt store b:NERDTreeRoot (its a b: var, and its a hash) + let g:NERDTreeStatusline = "%{exists('b:NERDTreeRoot')?b:NERDTreeRoot.path.str():''}" + +endif +call s:initVariable("g:NERDTreeWinPos", "left") +call s:initVariable("g:NERDTreeWinSize", 31) + +"init the shell commands that will be used to copy nodes, and remove dir trees +" +"Note: the space after the command is important +if s:running_windows + call s:initVariable("g:NERDTreeRemoveDirCmd", 'rmdir /s /q ') +else + call s:initVariable("g:NERDTreeRemoveDirCmd", 'rm -rf ') + call s:initVariable("g:NERDTreeCopyCmd", 'cp -r ') +endif + + +"SECTION: Init variable calls for key mappings {{{2 +call s:initVariable("g:NERDTreeMapActivateNode", "o") +call s:initVariable("g:NERDTreeMapChangeRoot", "C") +call s:initVariable("g:NERDTreeMapChdir", "cd") +call s:initVariable("g:NERDTreeMapCloseChildren", "X") +call s:initVariable("g:NERDTreeMapCloseDir", "x") +call s:initVariable("g:NERDTreeMapDeleteBookmark", "D") +call s:initVariable("g:NERDTreeMapMenu", "m") +call s:initVariable("g:NERDTreeMapHelp", "?") +call s:initVariable("g:NERDTreeMapJumpFirstChild", "K") +call s:initVariable("g:NERDTreeMapJumpLastChild", "J") +call s:initVariable("g:NERDTreeMapJumpNextSibling", "") +call s:initVariable("g:NERDTreeMapJumpParent", "p") +call s:initVariable("g:NERDTreeMapJumpPrevSibling", "") +call s:initVariable("g:NERDTreeMapJumpRoot", "P") +call s:initVariable("g:NERDTreeMapOpenExpl", "e") +call s:initVariable("g:NERDTreeMapOpenInTab", "t") +call s:initVariable("g:NERDTreeMapOpenInTabSilent", "T") +call s:initVariable("g:NERDTreeMapOpenRecursively", "O") +call s:initVariable("g:NERDTreeMapOpenSplit", "i") +call s:initVariable("g:NERDTreeMapOpenVSplit", "s") +call s:initVariable("g:NERDTreeMapPreview", "g" . NERDTreeMapActivateNode) +call s:initVariable("g:NERDTreeMapPreviewSplit", "g" . NERDTreeMapOpenSplit) +call s:initVariable("g:NERDTreeMapPreviewVSplit", "g" . NERDTreeMapOpenVSplit) +call s:initVariable("g:NERDTreeMapQuit", "q") +call s:initVariable("g:NERDTreeMapRefresh", "r") +call s:initVariable("g:NERDTreeMapRefreshRoot", "R") +call s:initVariable("g:NERDTreeMapToggleBookmarks", "B") +call s:initVariable("g:NERDTreeMapToggleFiles", "F") +call s:initVariable("g:NERDTreeMapToggleFilters", "f") +call s:initVariable("g:NERDTreeMapToggleHidden", "I") +call s:initVariable("g:NERDTreeMapToggleZoom", "A") +call s:initVariable("g:NERDTreeMapUpdir", "u") +call s:initVariable("g:NERDTreeMapUpdirKeepOpen", "U") + +"SECTION: Script level variable declaration{{{2 +if s:running_windows + let s:escape_chars = " `\|\"#%&,?()\*^<>" +else + let s:escape_chars = " \\`\|\"#%&,?()\*^<>[]" +endif +let s:NERDTreeBufName = 'NERD_tree_' + +let s:tree_wid = 2 +let s:tree_markup_reg = '^[ `|]*[\-+~▾▸ ]\+' +let s:tree_up_dir_line = '.. (up a dir)' + +"the number to add to the nerd tree buffer name to make the buf name unique +let s:next_buffer_number = 1 + +" SECTION: Commands {{{1 +"============================================================ +"init the command that users start the nerd tree with +command! -n=? -complete=dir -bar NERDTree :call s:initNerdTree('') +command! -n=? -complete=dir -bar NERDTreeToggle :call s:toggle('') +command! -n=0 -bar NERDTreeClose :call s:closeTreeIfOpen() +command! -n=1 -complete=customlist,s:completeBookmarks -bar NERDTreeFromBookmark call s:initNerdTree('') +command! -n=0 -bar NERDTreeMirror call s:initNerdTreeMirror() +command! -n=0 -bar NERDTreeFind call s:findAndRevealPath() +" SECTION: Auto commands {{{1 +"============================================================ +augroup NERDTree + "Save the cursor position whenever we close the nerd tree + exec "autocmd BufWinLeave ". s:NERDTreeBufName ."* call saveScreenState()" + + "disallow insert mode in the NERDTree + exec "autocmd BufEnter ". s:NERDTreeBufName ."* stopinsert" + + "cache bookmarks when vim loads + autocmd VimEnter * call s:Bookmark.CacheBookmarks(0) + + "load all nerdtree plugins after vim starts + autocmd VimEnter * runtime! nerdtree_plugin/**/*.vim +augroup END + +if g:NERDTreeHijackNetrw + augroup NERDTreeHijackNetrw + autocmd VimEnter * silent! autocmd! FileExplorer + au BufEnter,VimEnter * call s:checkForBrowse(expand("")) + augroup END +endif + +"SECTION: Classes {{{1 +"============================================================ +"CLASS: Bookmark {{{2 +"============================================================ +let s:Bookmark = {} +" FUNCTION: Bookmark.activate() {{{3 +function! s:Bookmark.activate() + if self.path.isDirectory + call self.toRoot() + else + if self.validate() + let n = s:TreeFileNode.New(self.path) + call n.open() + call s:closeTreeIfQuitOnOpen() + endif + endif +endfunction +" FUNCTION: Bookmark.AddBookmark(name, path) {{{3 +" Class method to add a new bookmark to the list, if a previous bookmark exists +" with the same name, just update the path for that bookmark +function! s:Bookmark.AddBookmark(name, path) + for i in s:Bookmark.Bookmarks() + if i.name ==# a:name + let i.path = a:path + return + endif + endfor + call add(s:Bookmark.Bookmarks(), s:Bookmark.New(a:name, a:path)) + call s:Bookmark.Sort() +endfunction +" Function: Bookmark.Bookmarks() {{{3 +" Class method to get all bookmarks. Lazily initializes the bookmarks global +" variable +function! s:Bookmark.Bookmarks() + if !exists("g:NERDTreeBookmarks") + let g:NERDTreeBookmarks = [] + endif + return g:NERDTreeBookmarks +endfunction +" Function: Bookmark.BookmarkExistsFor(name) {{{3 +" class method that returns 1 if a bookmark with the given name is found, 0 +" otherwise +function! s:Bookmark.BookmarkExistsFor(name) + try + call s:Bookmark.BookmarkFor(a:name) + return 1 + catch /^NERDTree.BookmarkNotFoundError/ + return 0 + endtry +endfunction +" Function: Bookmark.BookmarkFor(name) {{{3 +" Class method to get the bookmark that has the given name. {} is return if no +" bookmark is found +function! s:Bookmark.BookmarkFor(name) + for i in s:Bookmark.Bookmarks() + if i.name ==# a:name + return i + endif + endfor + throw "NERDTree.BookmarkNotFoundError: no bookmark found for name: \"". a:name .'"' +endfunction +" Function: Bookmark.BookmarkNames() {{{3 +" Class method to return an array of all bookmark names +function! s:Bookmark.BookmarkNames() + let names = [] + for i in s:Bookmark.Bookmarks() + call add(names, i.name) + endfor + return names +endfunction +" FUNCTION: Bookmark.CacheBookmarks(silent) {{{3 +" Class method to read all bookmarks from the bookmarks file intialize +" bookmark objects for each one. +" +" Args: +" silent - dont echo an error msg if invalid bookmarks are found +function! s:Bookmark.CacheBookmarks(silent) + if filereadable(g:NERDTreeBookmarksFile) + let g:NERDTreeBookmarks = [] + let g:NERDTreeInvalidBookmarks = [] + let bookmarkStrings = readfile(g:NERDTreeBookmarksFile) + let invalidBookmarksFound = 0 + for i in bookmarkStrings + + "ignore blank lines + if i != '' + + let name = substitute(i, '^\(.\{-}\) .*$', '\1', '') + let path = substitute(i, '^.\{-} \(.*\)$', '\1', '') + + try + let bookmark = s:Bookmark.New(name, s:Path.New(path)) + call add(g:NERDTreeBookmarks, bookmark) + catch /^NERDTree.InvalidArgumentsError/ + call add(g:NERDTreeInvalidBookmarks, i) + let invalidBookmarksFound += 1 + endtry + endif + endfor + if invalidBookmarksFound + call s:Bookmark.Write() + if !a:silent + call s:echo(invalidBookmarksFound . " invalid bookmarks were read. See :help NERDTreeInvalidBookmarks for info.") + endif + endif + call s:Bookmark.Sort() + endif +endfunction +" FUNCTION: Bookmark.compareTo(otherbookmark) {{{3 +" Compare these two bookmarks for sorting purposes +function! s:Bookmark.compareTo(otherbookmark) + return a:otherbookmark.name < self.name +endfunction +" FUNCTION: Bookmark.ClearAll() {{{3 +" Class method to delete all bookmarks. +function! s:Bookmark.ClearAll() + for i in s:Bookmark.Bookmarks() + call i.delete() + endfor + call s:Bookmark.Write() +endfunction +" FUNCTION: Bookmark.delete() {{{3 +" Delete this bookmark. If the node for this bookmark is under the current +" root, then recache bookmarks for its Path object +function! s:Bookmark.delete() + let node = {} + try + let node = self.getNode(1) + catch /^NERDTree.BookmarkedNodeNotFoundError/ + endtry + call remove(s:Bookmark.Bookmarks(), index(s:Bookmark.Bookmarks(), self)) + if !empty(node) + call node.path.cacheDisplayString() + endif + call s:Bookmark.Write() +endfunction +" FUNCTION: Bookmark.getNode(searchFromAbsoluteRoot) {{{3 +" Gets the treenode for this bookmark +" +" Args: +" searchFromAbsoluteRoot: specifies whether we should search from the current +" tree root, or the highest cached node +function! s:Bookmark.getNode(searchFromAbsoluteRoot) + let searchRoot = a:searchFromAbsoluteRoot ? s:TreeDirNode.AbsoluteTreeRoot() : b:NERDTreeRoot + let targetNode = searchRoot.findNode(self.path) + if empty(targetNode) + throw "NERDTree.BookmarkedNodeNotFoundError: no node was found for bookmark: " . self.name + endif + return targetNode +endfunction +" FUNCTION: Bookmark.GetNodeForName(name, searchFromAbsoluteRoot) {{{3 +" Class method that finds the bookmark with the given name and returns the +" treenode for it. +function! s:Bookmark.GetNodeForName(name, searchFromAbsoluteRoot) + let bookmark = s:Bookmark.BookmarkFor(a:name) + return bookmark.getNode(a:searchFromAbsoluteRoot) +endfunction +" FUNCTION: Bookmark.GetSelected() {{{3 +" returns the Bookmark the cursor is over, or {} +function! s:Bookmark.GetSelected() + let line = getline(".") + let name = substitute(line, '^>\(.\{-}\) .\+$', '\1', '') + if name != line + try + return s:Bookmark.BookmarkFor(name) + catch /^NERDTree.BookmarkNotFoundError/ + return {} + endtry + endif + return {} +endfunction + +" Function: Bookmark.InvalidBookmarks() {{{3 +" Class method to get all invalid bookmark strings read from the bookmarks +" file +function! s:Bookmark.InvalidBookmarks() + if !exists("g:NERDTreeInvalidBookmarks") + let g:NERDTreeInvalidBookmarks = [] + endif + return g:NERDTreeInvalidBookmarks +endfunction +" FUNCTION: Bookmark.mustExist() {{{3 +function! s:Bookmark.mustExist() + if !self.path.exists() + call s:Bookmark.CacheBookmarks(1) + throw "NERDTree.BookmarkPointsToInvalidLocationError: the bookmark \"". + \ self.name ."\" points to a non existing location: \"". self.path.str() + endif +endfunction +" FUNCTION: Bookmark.New(name, path) {{{3 +" Create a new bookmark object with the given name and path object +function! s:Bookmark.New(name, path) + if a:name =~# ' ' + throw "NERDTree.IllegalBookmarkNameError: illegal name:" . a:name + endif + + let newBookmark = copy(self) + let newBookmark.name = a:name + let newBookmark.path = a:path + return newBookmark +endfunction +" FUNCTION: Bookmark.openInNewTab(options) {{{3 +" Create a new bookmark object with the given name and path object +function! s:Bookmark.openInNewTab(options) + let currentTab = tabpagenr() + if self.path.isDirectory + tabnew + call s:initNerdTree(self.name) + else + exec "tabedit " . self.path.str({'format': 'Edit'}) + endif + + if has_key(a:options, 'stayInCurrentTab') + exec "tabnext " . currentTab + endif +endfunction +" Function: Bookmark.setPath(path) {{{3 +" makes this bookmark point to the given path +function! s:Bookmark.setPath(path) + let self.path = a:path +endfunction +" Function: Bookmark.Sort() {{{3 +" Class method that sorts all bookmarks +function! s:Bookmark.Sort() + let CompareFunc = function("s:compareBookmarks") + call sort(s:Bookmark.Bookmarks(), CompareFunc) +endfunction +" Function: Bookmark.str() {{{3 +" Get the string that should be rendered in the view for this bookmark +function! s:Bookmark.str() + let pathStrMaxLen = winwidth(s:getTreeWinNum()) - 4 - len(self.name) + if &nu + let pathStrMaxLen = pathStrMaxLen - &numberwidth + endif + + let pathStr = self.path.str({'format': 'UI'}) + if len(pathStr) > pathStrMaxLen + let pathStr = '<' . strpart(pathStr, len(pathStr) - pathStrMaxLen) + endif + return '>' . self.name . ' ' . pathStr +endfunction +" FUNCTION: Bookmark.toRoot() {{{3 +" Make the node for this bookmark the new tree root +function! s:Bookmark.toRoot() + if self.validate() + try + let targetNode = self.getNode(1) + catch /^NERDTree.BookmarkedNodeNotFoundError/ + let targetNode = s:TreeFileNode.New(s:Bookmark.BookmarkFor(self.name).path) + endtry + call targetNode.makeRoot() + call s:renderView() + call targetNode.putCursorHere(0, 0) + endif +endfunction +" FUNCTION: Bookmark.ToRoot(name) {{{3 +" Make the node for this bookmark the new tree root +function! s:Bookmark.ToRoot(name) + let bookmark = s:Bookmark.BookmarkFor(a:name) + call bookmark.toRoot() +endfunction + + +"FUNCTION: Bookmark.validate() {{{3 +function! s:Bookmark.validate() + if self.path.exists() + return 1 + else + call s:Bookmark.CacheBookmarks(1) + call s:renderView() + call s:echo(self.name . "now points to an invalid location. See :help NERDTreeInvalidBookmarks for info.") + return 0 + endif +endfunction + +" Function: Bookmark.Write() {{{3 +" Class method to write all bookmarks to the bookmarks file +function! s:Bookmark.Write() + let bookmarkStrings = [] + for i in s:Bookmark.Bookmarks() + call add(bookmarkStrings, i.name . ' ' . i.path.str()) + endfor + + "add a blank line before the invalid ones + call add(bookmarkStrings, "") + + for j in s:Bookmark.InvalidBookmarks() + call add(bookmarkStrings, j) + endfor + call writefile(bookmarkStrings, g:NERDTreeBookmarksFile) +endfunction +"CLASS: KeyMap {{{2 +"============================================================ +let s:KeyMap = {} +"FUNCTION: KeyMap.All() {{{3 +function! s:KeyMap.All() + if !exists("s:keyMaps") + let s:keyMaps = [] + endif + return s:keyMaps +endfunction + +"FUNCTION: KeyMap.BindAll() {{{3 +function! s:KeyMap.BindAll() + for i in s:KeyMap.All() + call i.bind() + endfor +endfunction + +"FUNCTION: KeyMap.bind() {{{3 +function! s:KeyMap.bind() + exec "nnoremap ". self.key ." :call ". self.callback ."()" +endfunction + +"FUNCTION: KeyMap.Create(options) {{{3 +function! s:KeyMap.Create(options) + let newKeyMap = copy(self) + let newKeyMap.key = a:options['key'] + let newKeyMap.quickhelpText = a:options['quickhelpText'] + let newKeyMap.callback = a:options['callback'] + call add(s:KeyMap.All(), newKeyMap) +endfunction +"CLASS: MenuController {{{2 +"============================================================ +let s:MenuController = {} +"FUNCTION: MenuController.New(menuItems) {{{3 +"create a new menu controller that operates on the given menu items +function! s:MenuController.New(menuItems) + let newMenuController = copy(self) + if a:menuItems[0].isSeparator() + let newMenuController.menuItems = a:menuItems[1:-1] + else + let newMenuController.menuItems = a:menuItems + endif + return newMenuController +endfunction + +"FUNCTION: MenuController.showMenu() {{{3 +"start the main loop of the menu and get the user to choose/execute a menu +"item +function! s:MenuController.showMenu() + call self._saveOptions() + + try + let self.selection = 0 + + let done = 0 + while !done + redraw! + call self._echoPrompt() + let key = nr2char(getchar()) + let done = self._handleKeypress(key) + endwhile + finally + call self._restoreOptions() + endtry + + if self.selection != -1 + let m = self._current() + call m.execute() + endif +endfunction + +"FUNCTION: MenuController._echoPrompt() {{{3 +function! s:MenuController._echoPrompt() + echo "NERDTree Menu. Use j/k/enter and the shortcuts indicated" + echo "==========================================================" + + for i in range(0, len(self.menuItems)-1) + if self.selection == i + echo "> " . self.menuItems[i].text + else + echo " " . self.menuItems[i].text + endif + endfor +endfunction + +"FUNCTION: MenuController._current(key) {{{3 +"get the MenuItem that is currently selected +function! s:MenuController._current() + return self.menuItems[self.selection] +endfunction + +"FUNCTION: MenuController._handleKeypress(key) {{{3 +"change the selection (if appropriate) and return 1 if the user has made +"their choice, 0 otherwise +function! s:MenuController._handleKeypress(key) + if a:key == 'j' + call self._cursorDown() + elseif a:key == 'k' + call self._cursorUp() + elseif a:key == nr2char(27) "escape + let self.selection = -1 + return 1 + elseif a:key == "\r" || a:key == "\n" "enter and ctrl-j + return 1 + else + let index = self._nextIndexFor(a:key) + if index != -1 + let self.selection = index + if len(self._allIndexesFor(a:key)) == 1 + return 1 + endif + endif + endif + + return 0 +endfunction + +"FUNCTION: MenuController._allIndexesFor(shortcut) {{{3 +"get indexes to all menu items with the given shortcut +function! s:MenuController._allIndexesFor(shortcut) + let toReturn = [] + + for i in range(0, len(self.menuItems)-1) + if self.menuItems[i].shortcut == a:shortcut + call add(toReturn, i) + endif + endfor + + return toReturn +endfunction + +"FUNCTION: MenuController._nextIndexFor(shortcut) {{{3 +"get the index to the next menu item with the given shortcut, starts from the +"current cursor location and wraps around to the top again if need be +function! s:MenuController._nextIndexFor(shortcut) + for i in range(self.selection+1, len(self.menuItems)-1) + if self.menuItems[i].shortcut == a:shortcut + return i + endif + endfor + + for i in range(0, self.selection) + if self.menuItems[i].shortcut == a:shortcut + return i + endif + endfor + + return -1 +endfunction + +"FUNCTION: MenuController._setCmdheight() {{{3 +"sets &cmdheight to whatever is needed to display the menu +function! s:MenuController._setCmdheight() + let &cmdheight = len(self.menuItems) + 3 +endfunction + +"FUNCTION: MenuController._saveOptions() {{{3 +"set any vim options that are required to make the menu work (saving their old +"values) +function! s:MenuController._saveOptions() + let self._oldLazyredraw = &lazyredraw + let self._oldCmdheight = &cmdheight + set nolazyredraw + call self._setCmdheight() +endfunction + +"FUNCTION: MenuController._restoreOptions() {{{3 +"restore the options we saved in _saveOptions() +function! s:MenuController._restoreOptions() + let &cmdheight = self._oldCmdheight + let &lazyredraw = self._oldLazyredraw +endfunction + +"FUNCTION: MenuController._cursorDown() {{{3 +"move the cursor to the next menu item, skipping separators +function! s:MenuController._cursorDown() + let done = 0 + while !done + if self.selection < len(self.menuItems)-1 + let self.selection += 1 + else + let self.selection = 0 + endif + + if !self._current().isSeparator() + let done = 1 + endif + endwhile +endfunction + +"FUNCTION: MenuController._cursorUp() {{{3 +"move the cursor to the previous menu item, skipping separators +function! s:MenuController._cursorUp() + let done = 0 + while !done + if self.selection > 0 + let self.selection -= 1 + else + let self.selection = len(self.menuItems)-1 + endif + + if !self._current().isSeparator() + let done = 1 + endif + endwhile +endfunction + +"CLASS: MenuItem {{{2 +"============================================================ +let s:MenuItem = {} +"FUNCTION: MenuItem.All() {{{3 +"get all top level menu items +function! s:MenuItem.All() + if !exists("s:menuItems") + let s:menuItems = [] + endif + return s:menuItems +endfunction + +"FUNCTION: MenuItem.AllEnabled() {{{3 +"get all top level menu items that are currently enabled +function! s:MenuItem.AllEnabled() + let toReturn = [] + for i in s:MenuItem.All() + if i.enabled() + call add(toReturn, i) + endif + endfor + return toReturn +endfunction + +"FUNCTION: MenuItem.Create(options) {{{3 +"make a new menu item and add it to the global list +function! s:MenuItem.Create(options) + let newMenuItem = copy(self) + + let newMenuItem.text = a:options['text'] + let newMenuItem.shortcut = a:options['shortcut'] + let newMenuItem.children = [] + + let newMenuItem.isActiveCallback = -1 + if has_key(a:options, 'isActiveCallback') + let newMenuItem.isActiveCallback = a:options['isActiveCallback'] + endif + + let newMenuItem.callback = -1 + if has_key(a:options, 'callback') + let newMenuItem.callback = a:options['callback'] + endif + + if has_key(a:options, 'parent') + call add(a:options['parent'].children, newMenuItem) + else + call add(s:MenuItem.All(), newMenuItem) + endif + + return newMenuItem +endfunction + +"FUNCTION: MenuItem.CreateSeparator(options) {{{3 +"make a new separator menu item and add it to the global list +function! s:MenuItem.CreateSeparator(options) + let standard_options = { 'text': '--------------------', + \ 'shortcut': -1, + \ 'callback': -1 } + let options = extend(a:options, standard_options, "force") + + return s:MenuItem.Create(options) +endfunction + +"FUNCTION: MenuItem.CreateSubmenu(options) {{{3 +"make a new submenu and add it to global list +function! s:MenuItem.CreateSubmenu(options) + let standard_options = { 'callback': -1 } + let options = extend(a:options, standard_options, "force") + + return s:MenuItem.Create(options) +endfunction + +"FUNCTION: MenuItem.enabled() {{{3 +"return 1 if this menu item should be displayed +" +"delegates off to the isActiveCallback, and defaults to 1 if no callback was +"specified +function! s:MenuItem.enabled() + if self.isActiveCallback != -1 + return {self.isActiveCallback}() + endif + return 1 +endfunction + +"FUNCTION: MenuItem.execute() {{{3 +"perform the action behind this menu item, if this menuitem has children then +"display a new menu for them, otherwise deletegate off to the menuitem's +"callback +function! s:MenuItem.execute() + if len(self.children) + let mc = s:MenuController.New(self.children) + call mc.showMenu() + else + if self.callback != -1 + call {self.callback}() + endif + endif +endfunction + +"FUNCTION: MenuItem.isSeparator() {{{3 +"return 1 if this menuitem is a separator +function! s:MenuItem.isSeparator() + return self.callback == -1 && self.children == [] +endfunction + +"FUNCTION: MenuItem.isSubmenu() {{{3 +"return 1 if this menuitem is a submenu +function! s:MenuItem.isSubmenu() + return self.callback == -1 && !empty(self.children) +endfunction + +"CLASS: TreeFileNode {{{2 +"This class is the parent of the TreeDirNode class and constitures the +"'Component' part of the composite design pattern between the treenode +"classes. +"============================================================ +let s:TreeFileNode = {} +"FUNCTION: TreeFileNode.activate(forceKeepWinOpen) {{{3 +function! s:TreeFileNode.activate(forceKeepWinOpen) + call self.open() + if !a:forceKeepWinOpen + call s:closeTreeIfQuitOnOpen() + end +endfunction +"FUNCTION: TreeFileNode.bookmark(name) {{{3 +"bookmark this node with a:name +function! s:TreeFileNode.bookmark(name) + + "if a bookmark exists with the same name and the node is cached then save + "it so we can update its display string + let oldMarkedNode = {} + try + let oldMarkedNode = s:Bookmark.GetNodeForName(a:name, 1) + catch /^NERDTree.BookmarkNotFoundError/ + catch /^NERDTree.BookmarkedNodeNotFoundError/ + endtry + + call s:Bookmark.AddBookmark(a:name, self.path) + call self.path.cacheDisplayString() + call s:Bookmark.Write() + + if !empty(oldMarkedNode) + call oldMarkedNode.path.cacheDisplayString() + endif +endfunction +"FUNCTION: TreeFileNode.cacheParent() {{{3 +"initializes self.parent if it isnt already +function! s:TreeFileNode.cacheParent() + if empty(self.parent) + let parentPath = self.path.getParent() + if parentPath.equals(self.path) + throw "NERDTree.CannotCacheParentError: already at root" + endif + let self.parent = s:TreeFileNode.New(parentPath) + endif +endfunction +"FUNCTION: TreeFileNode.compareNodes {{{3 +"This is supposed to be a class level method but i cant figure out how to +"get func refs to work from a dict.. +" +"A class level method that compares two nodes +" +"Args: +"n1, n2: the 2 nodes to compare +function! s:compareNodes(n1, n2) + return a:n1.path.compareTo(a:n2.path) +endfunction + +"FUNCTION: TreeFileNode.clearBoomarks() {{{3 +function! s:TreeFileNode.clearBoomarks() + for i in s:Bookmark.Bookmarks() + if i.path.equals(self.path) + call i.delete() + end + endfor + call self.path.cacheDisplayString() +endfunction +"FUNCTION: TreeFileNode.copy(dest) {{{3 +function! s:TreeFileNode.copy(dest) + call self.path.copy(a:dest) + let newPath = s:Path.New(a:dest) + let parent = b:NERDTreeRoot.findNode(newPath.getParent()) + if !empty(parent) + call parent.refresh() + return parent.findNode(newPath) + else + return {} + endif +endfunction + +"FUNCTION: TreeFileNode.delete {{{3 +"Removes this node from the tree and calls the Delete method for its path obj +function! s:TreeFileNode.delete() + call self.path.delete() + call self.parent.removeChild(self) +endfunction + +"FUNCTION: TreeFileNode.displayString() {{{3 +" +"Returns a string that specifies how the node should be represented as a +"string +" +"Return: +"a string that can be used in the view to represent this node +function! s:TreeFileNode.displayString() + return self.path.displayString() +endfunction + +"FUNCTION: TreeFileNode.equals(treenode) {{{3 +" +"Compares this treenode to the input treenode and returns 1 if they are the +"same node. +" +"Use this method instead of == because sometimes when the treenodes contain +"many children, vim seg faults when doing == +" +"Args: +"treenode: the other treenode to compare to +function! s:TreeFileNode.equals(treenode) + return self.path.str() ==# a:treenode.path.str() +endfunction + +"FUNCTION: TreeFileNode.findNode(path) {{{3 +"Returns self if this node.path.Equals the given path. +"Returns {} if not equal. +" +"Args: +"path: the path object to compare against +function! s:TreeFileNode.findNode(path) + if a:path.equals(self.path) + return self + endif + return {} +endfunction +"FUNCTION: TreeFileNode.findOpenDirSiblingWithVisibleChildren(direction) {{{3 +" +"Finds the next sibling for this node in the indicated direction. This sibling +"must be a directory and may/may not have children as specified. +" +"Args: +"direction: 0 if you want to find the previous sibling, 1 for the next sibling +" +"Return: +"a treenode object or {} if no appropriate sibling could be found +function! s:TreeFileNode.findOpenDirSiblingWithVisibleChildren(direction) + "if we have no parent then we can have no siblings + if self.parent != {} + let nextSibling = self.findSibling(a:direction) + + while nextSibling != {} + if nextSibling.path.isDirectory && nextSibling.hasVisibleChildren() && nextSibling.isOpen + return nextSibling + endif + let nextSibling = nextSibling.findSibling(a:direction) + endwhile + endif + + return {} +endfunction +"FUNCTION: TreeFileNode.findSibling(direction) {{{3 +" +"Finds the next sibling for this node in the indicated direction +" +"Args: +"direction: 0 if you want to find the previous sibling, 1 for the next sibling +" +"Return: +"a treenode object or {} if no sibling could be found +function! s:TreeFileNode.findSibling(direction) + "if we have no parent then we can have no siblings + if self.parent != {} + + "get the index of this node in its parents children + let siblingIndx = self.parent.getChildIndex(self.path) + + if siblingIndx != -1 + "move a long to the next potential sibling node + let siblingIndx = a:direction ==# 1 ? siblingIndx+1 : siblingIndx-1 + + "keep moving along to the next sibling till we find one that is valid + let numSiblings = self.parent.getChildCount() + while siblingIndx >= 0 && siblingIndx < numSiblings + + "if the next node is not an ignored node (i.e. wont show up in the + "view) then return it + if self.parent.children[siblingIndx].path.ignore() ==# 0 + return self.parent.children[siblingIndx] + endif + + "go to next node + let siblingIndx = a:direction ==# 1 ? siblingIndx+1 : siblingIndx-1 + endwhile + endif + endif + + return {} +endfunction + +"FUNCTION: TreeFileNode.getLineNum(){{{3 +"returns the line number this node is rendered on, or -1 if it isnt rendered +function! s:TreeFileNode.getLineNum() + "if the node is the root then return the root line no. + if self.isRoot() + return s:TreeFileNode.GetRootLineNum() + endif + + let totalLines = line("$") + + "the path components we have matched so far + let pathcomponents = [substitute(b:NERDTreeRoot.path.str({'format': 'UI'}), '/ *$', '', '')] + "the index of the component we are searching for + let curPathComponent = 1 + + let fullpath = self.path.str({'format': 'UI'}) + + + let lnum = s:TreeFileNode.GetRootLineNum() + while lnum > 0 + let lnum = lnum + 1 + "have we reached the bottom of the tree? + if lnum ==# totalLines+1 + return -1 + endif + + let curLine = getline(lnum) + + let indent = s:indentLevelFor(curLine) + if indent ==# curPathComponent + let curLine = s:stripMarkupFromLine(curLine, 1) + + let curPath = join(pathcomponents, '/') . '/' . curLine + if stridx(fullpath, curPath, 0) ==# 0 + if fullpath ==# curPath || strpart(fullpath, len(curPath)-1,1) ==# '/' + let curLine = substitute(curLine, '/ *$', '', '') + call add(pathcomponents, curLine) + let curPathComponent = curPathComponent + 1 + + if fullpath ==# curPath + return lnum + endif + endif + endif + endif + endwhile + return -1 +endfunction + +"FUNCTION: TreeFileNode.GetRootForTab(){{{3 +"get the root node for this tab +function! s:TreeFileNode.GetRootForTab() + if s:treeExistsForTab() + return getbufvar(t:NERDTreeBufName, 'NERDTreeRoot') + end + return {} +endfunction +"FUNCTION: TreeFileNode.GetRootLineNum(){{{3 +"gets the line number of the root node +function! s:TreeFileNode.GetRootLineNum() + let rootLine = 1 + while getline(rootLine) !~# '^\(/\|<\)' + let rootLine = rootLine + 1 + endwhile + return rootLine +endfunction + +"FUNCTION: TreeFileNode.GetSelected() {{{3 +"gets the treenode that the cursor is currently over +function! s:TreeFileNode.GetSelected() + try + let path = s:getPath(line(".")) + if path ==# {} + return {} + endif + return b:NERDTreeRoot.findNode(path) + catch /NERDTree/ + return {} + endtry +endfunction +"FUNCTION: TreeFileNode.isVisible() {{{3 +"returns 1 if this node should be visible according to the tree filters and +"hidden file filters (and their on/off status) +function! s:TreeFileNode.isVisible() + return !self.path.ignore() +endfunction +"FUNCTION: TreeFileNode.isRoot() {{{3 +"returns 1 if this node is b:NERDTreeRoot +function! s:TreeFileNode.isRoot() + if !s:treeExistsForBuf() + throw "NERDTree.NoTreeError: No tree exists for the current buffer" + endif + + return self.equals(b:NERDTreeRoot) +endfunction + +"FUNCTION: TreeFileNode.makeRoot() {{{3 +"Make this node the root of the tree +function! s:TreeFileNode.makeRoot() + if self.path.isDirectory + let b:NERDTreeRoot = self + else + call self.cacheParent() + let b:NERDTreeRoot = self.parent + endif + + call b:NERDTreeRoot.open() + + "change dir to the dir of the new root if instructed to + if g:NERDTreeChDirMode ==# 2 + exec "cd " . b:NERDTreeRoot.path.str({'format': 'Edit'}) + endif +endfunction +"FUNCTION: TreeFileNode.New(path) {{{3 +"Returns a new TreeNode object with the given path and parent +" +"Args: +"path: a path object representing the full filesystem path to the file/dir that the node represents +function! s:TreeFileNode.New(path) + if a:path.isDirectory + return s:TreeDirNode.New(a:path) + else + let newTreeNode = copy(self) + let newTreeNode.path = a:path + let newTreeNode.parent = {} + return newTreeNode + endif +endfunction + +"FUNCTION: TreeFileNode.open() {{{3 +"Open the file represented by the given node in the current window, splitting +"the window if needed +" +"ARGS: +"treenode: file node to open +function! s:TreeFileNode.open() + if b:NERDTreeType ==# "secondary" + exec 'edit ' . self.path.str({'format': 'Edit'}) + return + endif + + "if the file is already open in this tab then just stick the cursor in it + let winnr = bufwinnr('^' . self.path.str() . '$') + if winnr != -1 + call s:exec(winnr . "wincmd w") + + else + if !s:isWindowUsable(winnr("#")) && s:firstUsableWindow() ==# -1 + call self.openSplit() + else + try + if !s:isWindowUsable(winnr("#")) + call s:exec(s:firstUsableWindow() . "wincmd w") + else + call s:exec('wincmd p') + endif + exec ("edit " . self.path.str({'format': 'Edit'})) + catch /^Vim\%((\a\+)\)\=:E37/ + call s:putCursorInTreeWin() + throw "NERDTree.FileAlreadyOpenAndModifiedError: ". self.path.str() ." is already open and modified." + catch /^Vim\%((\a\+)\)\=:/ + echo v:exception + endtry + endif + endif +endfunction +"FUNCTION: TreeFileNode.openSplit() {{{3 +"Open this node in a new window +function! s:TreeFileNode.openSplit() + + if b:NERDTreeType ==# "secondary" + exec "split " . self.path.str({'format': 'Edit'}) + return + endif + + " Save the user's settings for splitbelow and splitright + let savesplitbelow=&splitbelow + let savesplitright=&splitright + + " 'there' will be set to a command to move from the split window + " back to the explorer window + " + " 'back' will be set to a command to move from the explorer window + " back to the newly split window + " + " 'right' and 'below' will be set to the settings needed for + " splitbelow and splitright IF the explorer is the only window. + " + let there= g:NERDTreeWinPos ==# "left" ? "wincmd h" : "wincmd l" + let back = g:NERDTreeWinPos ==# "left" ? "wincmd l" : "wincmd h" + let right= g:NERDTreeWinPos ==# "left" + let below=0 + + " Attempt to go to adjacent window + call s:exec(back) + + let onlyOneWin = (winnr("$") ==# 1) + + " If no adjacent window, set splitright and splitbelow appropriately + if onlyOneWin + let &splitright=right + let &splitbelow=below + else + " found adjacent window - invert split direction + let &splitright=!right + let &splitbelow=!below + endif + + let splitMode = onlyOneWin ? "vertical" : "" + + " Open the new window + try + exec(splitMode." sp " . self.path.str({'format': 'Edit'})) + catch /^Vim\%((\a\+)\)\=:E37/ + call s:putCursorInTreeWin() + throw "NERDTree.FileAlreadyOpenAndModifiedError: ". self.path.str() ." is already open and modified." + catch /^Vim\%((\a\+)\)\=:/ + "do nothing + endtry + + "resize the tree window if no other window was open before + if onlyOneWin + let size = exists("b:NERDTreeOldWindowSize") ? b:NERDTreeOldWindowSize : g:NERDTreeWinSize + call s:exec(there) + exec("silent ". splitMode ." resize ". size) + call s:exec('wincmd p') + endif + + " Restore splitmode settings + let &splitbelow=savesplitbelow + let &splitright=savesplitright +endfunction +"FUNCTION: TreeFileNode.openVSplit() {{{3 +"Open this node in a new vertical window +function! s:TreeFileNode.openVSplit() + if b:NERDTreeType ==# "secondary" + exec "vnew " . self.path.str({'format': 'Edit'}) + return + endif + + let winwidth = winwidth(".") + if winnr("$")==#1 + let winwidth = g:NERDTreeWinSize + endif + + call s:exec("wincmd p") + exec "vnew " . self.path.str({'format': 'Edit'}) + + "resize the nerd tree back to the original size + call s:putCursorInTreeWin() + exec("silent vertical resize ". winwidth) + call s:exec('wincmd p') +endfunction +"FUNCTION: TreeFileNode.openInNewTab(options) {{{3 +function! s:TreeFileNode.openInNewTab(options) + let currentTab = tabpagenr() + + if !has_key(a:options, 'keepTreeOpen') + call s:closeTreeIfQuitOnOpen() + endif + + exec "tabedit " . self.path.str({'format': 'Edit'}) + + if has_key(a:options, 'stayInCurrentTab') && a:options['stayInCurrentTab'] + exec "tabnext " . currentTab + endif + +endfunction +"FUNCTION: TreeFileNode.putCursorHere(isJump, recurseUpward){{{3 +"Places the cursor on the line number this node is rendered on +" +"Args: +"isJump: 1 if this cursor movement should be counted as a jump by vim +"recurseUpward: try to put the cursor on the parent if the this node isnt +"visible +function! s:TreeFileNode.putCursorHere(isJump, recurseUpward) + let ln = self.getLineNum() + if ln != -1 + if a:isJump + mark ' + endif + call cursor(ln, col(".")) + else + if a:recurseUpward + let node = self + while node != {} && node.getLineNum() ==# -1 + let node = node.parent + call node.open() + endwhile + call s:renderView() + call node.putCursorHere(a:isJump, 0) + endif + endif +endfunction + +"FUNCTION: TreeFileNode.refresh() {{{3 +function! s:TreeFileNode.refresh() + call self.path.refresh() +endfunction +"FUNCTION: TreeFileNode.rename() {{{3 +"Calls the rename method for this nodes path obj +function! s:TreeFileNode.rename(newName) + let newName = substitute(a:newName, '\(\\\|\/\)$', '', '') + call self.path.rename(newName) + call self.parent.removeChild(self) + + let parentPath = self.path.getParent() + let newParent = b:NERDTreeRoot.findNode(parentPath) + + if newParent != {} + call newParent.createChild(self.path, 1) + call newParent.refresh() + endif +endfunction +"FUNCTION: TreeFileNode.renderToString {{{3 +"returns a string representation for this tree to be rendered in the view +function! s:TreeFileNode.renderToString() + return self._renderToString(0, 0, [], self.getChildCount() ==# 1) +endfunction + + +"Args: +"depth: the current depth in the tree for this call +"drawText: 1 if we should actually draw the line for this node (if 0 then the +"child nodes are rendered only) +"vertMap: a binary array that indicates whether a vertical bar should be draw +"for each depth in the tree +"isLastChild:true if this curNode is the last child of its parent +function! s:TreeFileNode._renderToString(depth, drawText, vertMap, isLastChild) + let output = "" + if a:drawText ==# 1 + + let treeParts = '' + + "get all the leading spaces and vertical tree parts for this line + if a:depth > 1 + for j in a:vertMap[0:-2] + if g:NERDTreeDirArrows + let treeParts = treeParts . ' ' + else + if j ==# 1 + let treeParts = treeParts . '| ' + else + let treeParts = treeParts . ' ' + endif + endif + endfor + endif + + "get the last vertical tree part for this line which will be different + "if this node is the last child of its parent + if !g:NERDTreeDirArrows + if a:isLastChild + let treeParts = treeParts . '`' + else + let treeParts = treeParts . '|' + endif + endif + + "smack the appropriate dir/file symbol on the line before the file/dir + "name itself + if self.path.isDirectory + if self.isOpen + if g:NERDTreeDirArrows + let treeParts = treeParts . '▾ ' + else + let treeParts = treeParts . '~' + endif + else + if g:NERDTreeDirArrows + let treeParts = treeParts . '▸ ' + else + let treeParts = treeParts . '+' + endif + endif + else + if g:NERDTreeDirArrows + let treeParts = treeParts . ' ' + else + let treeParts = treeParts . '-' + endif + endif + let line = treeParts . self.displayString() + + let output = output . line . "\n" + endif + + "if the node is an open dir, draw its children + if self.path.isDirectory ==# 1 && self.isOpen ==# 1 + + let childNodesToDraw = self.getVisibleChildren() + if len(childNodesToDraw) > 0 + + "draw all the nodes children except the last + let lastIndx = len(childNodesToDraw)-1 + if lastIndx > 0 + for i in childNodesToDraw[0:lastIndx-1] + let output = output . i._renderToString(a:depth + 1, 1, add(copy(a:vertMap), 1), 0) + endfor + endif + + "draw the last child, indicating that it IS the last + let output = output . childNodesToDraw[lastIndx]._renderToString(a:depth + 1, 1, add(copy(a:vertMap), 0), 1) + endif + endif + + return output +endfunction +"CLASS: TreeDirNode {{{2 +"This class is a child of the TreeFileNode class and constitutes the +"'Composite' part of the composite design pattern between the treenode +"classes. +"============================================================ +let s:TreeDirNode = copy(s:TreeFileNode) +"FUNCTION: TreeDirNode.AbsoluteTreeRoot(){{{3 +"class method that returns the highest cached ancestor of the current root +function! s:TreeDirNode.AbsoluteTreeRoot() + let currentNode = b:NERDTreeRoot + while currentNode.parent != {} + let currentNode = currentNode.parent + endwhile + return currentNode +endfunction +"FUNCTION: TreeDirNode.activate(forceKeepWinOpen) {{{3 +unlet s:TreeDirNode.activate +function! s:TreeDirNode.activate(forceKeepWinOpen) + call self.toggleOpen() + call s:renderView() + call self.putCursorHere(0, 0) +endfunction +"FUNCTION: TreeDirNode.addChild(treenode, inOrder) {{{3 +"Adds the given treenode to the list of children for this node +" +"Args: +"-treenode: the node to add +"-inOrder: 1 if the new node should be inserted in sorted order +function! s:TreeDirNode.addChild(treenode, inOrder) + call add(self.children, a:treenode) + let a:treenode.parent = self + + if a:inOrder + call self.sortChildren() + endif +endfunction + +"FUNCTION: TreeDirNode.close() {{{3 +"Closes this directory +function! s:TreeDirNode.close() + let self.isOpen = 0 +endfunction + +"FUNCTION: TreeDirNode.closeChildren() {{{3 +"Closes all the child dir nodes of this node +function! s:TreeDirNode.closeChildren() + for i in self.children + if i.path.isDirectory + call i.close() + call i.closeChildren() + endif + endfor +endfunction + +"FUNCTION: TreeDirNode.createChild(path, inOrder) {{{3 +"Instantiates a new child node for this node with the given path. The new +"nodes parent is set to this node. +" +"Args: +"path: a Path object that this node will represent/contain +"inOrder: 1 if the new node should be inserted in sorted order +" +"Returns: +"the newly created node +function! s:TreeDirNode.createChild(path, inOrder) + let newTreeNode = s:TreeFileNode.New(a:path) + call self.addChild(newTreeNode, a:inOrder) + return newTreeNode +endfunction + +"FUNCTION: TreeDirNode.findNode(path) {{{3 +"Will find one of the children (recursively) that has the given path +" +"Args: +"path: a path object +unlet s:TreeDirNode.findNode +function! s:TreeDirNode.findNode(path) + if a:path.equals(self.path) + return self + endif + if stridx(a:path.str(), self.path.str(), 0) ==# -1 + return {} + endif + + if self.path.isDirectory + for i in self.children + let retVal = i.findNode(a:path) + if retVal != {} + return retVal + endif + endfor + endif + return {} +endfunction +"FUNCTION: TreeDirNode.getChildCount() {{{3 +"Returns the number of children this node has +function! s:TreeDirNode.getChildCount() + return len(self.children) +endfunction + +"FUNCTION: TreeDirNode.getChild(path) {{{3 +"Returns child node of this node that has the given path or {} if no such node +"exists. +" +"This function doesnt not recurse into child dir nodes +" +"Args: +"path: a path object +function! s:TreeDirNode.getChild(path) + if stridx(a:path.str(), self.path.str(), 0) ==# -1 + return {} + endif + + let index = self.getChildIndex(a:path) + if index ==# -1 + return {} + else + return self.children[index] + endif + +endfunction + +"FUNCTION: TreeDirNode.getChildByIndex(indx, visible) {{{3 +"returns the child at the given index +"Args: +"indx: the index to get the child from +"visible: 1 if only the visible children array should be used, 0 if all the +"children should be searched. +function! s:TreeDirNode.getChildByIndex(indx, visible) + let array_to_search = a:visible? self.getVisibleChildren() : self.children + if a:indx > len(array_to_search) + throw "NERDTree.InvalidArgumentsError: Index is out of bounds." + endif + return array_to_search[a:indx] +endfunction + +"FUNCTION: TreeDirNode.getChildIndex(path) {{{3 +"Returns the index of the child node of this node that has the given path or +"-1 if no such node exists. +" +"This function doesnt not recurse into child dir nodes +" +"Args: +"path: a path object +function! s:TreeDirNode.getChildIndex(path) + if stridx(a:path.str(), self.path.str(), 0) ==# -1 + return -1 + endif + + "do a binary search for the child + let a = 0 + let z = self.getChildCount() + while a < z + let mid = (a+z)/2 + let diff = a:path.compareTo(self.children[mid].path) + + if diff ==# -1 + let z = mid + elseif diff ==# 1 + let a = mid+1 + else + return mid + endif + endwhile + return -1 +endfunction + +"FUNCTION: TreeDirNode.GetSelected() {{{3 +"Returns the current node if it is a dir node, or else returns the current +"nodes parent +unlet s:TreeDirNode.GetSelected +function! s:TreeDirNode.GetSelected() + let currentDir = s:TreeFileNode.GetSelected() + if currentDir != {} && !currentDir.isRoot() + if currentDir.path.isDirectory ==# 0 + let currentDir = currentDir.parent + endif + endif + return currentDir +endfunction +"FUNCTION: TreeDirNode.getVisibleChildCount() {{{3 +"Returns the number of visible children this node has +function! s:TreeDirNode.getVisibleChildCount() + return len(self.getVisibleChildren()) +endfunction + +"FUNCTION: TreeDirNode.getVisibleChildren() {{{3 +"Returns a list of children to display for this node, in the correct order +" +"Return: +"an array of treenodes +function! s:TreeDirNode.getVisibleChildren() + let toReturn = [] + for i in self.children + if i.path.ignore() ==# 0 + call add(toReturn, i) + endif + endfor + return toReturn +endfunction + +"FUNCTION: TreeDirNode.hasVisibleChildren() {{{3 +"returns 1 if this node has any childre, 0 otherwise.. +function! s:TreeDirNode.hasVisibleChildren() + return self.getVisibleChildCount() != 0 +endfunction + +"FUNCTION: TreeDirNode._initChildren() {{{3 +"Removes all childen from this node and re-reads them +" +"Args: +"silent: 1 if the function should not echo any "please wait" messages for +"large directories +" +"Return: the number of child nodes read +function! s:TreeDirNode._initChildren(silent) + "remove all the current child nodes + let self.children = [] + + "get an array of all the files in the nodes dir + let dir = self.path + let globDir = dir.str({'format': 'Glob'}) + let filesStr = globpath(globDir, '*') . "\n" . globpath(globDir, '.*') + let files = split(filesStr, "\n") + + if !a:silent && len(files) > g:NERDTreeNotificationThreshold + call s:echo("Please wait, caching a large dir ...") + endif + + let invalidFilesFound = 0 + for i in files + + "filter out the .. and . directories + "Note: we must match .. AND ../ cos sometimes the globpath returns + "../ for path with strange chars (eg $) + if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$' + + "put the next file in a new node and attach it + try + let path = s:Path.New(i) + call self.createChild(path, 0) + catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/ + let invalidFilesFound += 1 + endtry + endif + endfor + + call self.sortChildren() + + if !a:silent && len(files) > g:NERDTreeNotificationThreshold + call s:echo("Please wait, caching a large dir ... DONE (". self.getChildCount() ." nodes cached).") + endif + + if invalidFilesFound + call s:echoWarning(invalidFilesFound . " file(s) could not be loaded into the NERD tree") + endif + return self.getChildCount() +endfunction +"FUNCTION: TreeDirNode.New(path) {{{3 +"Returns a new TreeNode object with the given path and parent +" +"Args: +"path: a path object representing the full filesystem path to the file/dir that the node represents +unlet s:TreeDirNode.New +function! s:TreeDirNode.New(path) + if a:path.isDirectory != 1 + throw "NERDTree.InvalidArgumentsError: A TreeDirNode object must be instantiated with a directory Path object." + endif + + let newTreeNode = copy(self) + let newTreeNode.path = a:path + + let newTreeNode.isOpen = 0 + let newTreeNode.children = [] + + let newTreeNode.parent = {} + + return newTreeNode +endfunction +"FUNCTION: TreeDirNode.open() {{{3 +"Reads in all this nodes children +" +"Return: the number of child nodes read +unlet s:TreeDirNode.open +function! s:TreeDirNode.open() + let self.isOpen = 1 + if self.children ==# [] + return self._initChildren(0) + else + return 0 + endif +endfunction + +" FUNCTION: TreeDirNode.openExplorer() {{{3 +" opens an explorer window for this node in the previous window (could be a +" nerd tree or a netrw) +function! s:TreeDirNode.openExplorer() + let oldwin = winnr() + call s:exec('wincmd p') + if oldwin ==# winnr() || (&modified && s:bufInWindows(winbufnr(winnr())) < 2) + call s:exec('wincmd p') + call self.openSplit() + else + exec ("silent edit " . self.path.str({'format': 'Edit'})) + endif +endfunction +"FUNCTION: TreeDirNode.openInNewTab(options) {{{3 +unlet s:TreeDirNode.openInNewTab +function! s:TreeDirNode.openInNewTab(options) + let currentTab = tabpagenr() + + if !has_key(a:options, 'keepTreeOpen') || !a:options['keepTreeOpen'] + call s:closeTreeIfQuitOnOpen() + endif + + tabnew + call s:initNerdTree(self.path.str()) + + if has_key(a:options, 'stayInCurrentTab') && a:options['stayInCurrentTab'] + exec "tabnext " . currentTab + endif +endfunction +"FUNCTION: TreeDirNode.openRecursively() {{{3 +"Opens this treenode and all of its children whose paths arent 'ignored' +"because of the file filters. +" +"This method is actually a wrapper for the OpenRecursively2 method which does +"the work. +function! s:TreeDirNode.openRecursively() + call self._openRecursively2(1) +endfunction + +"FUNCTION: TreeDirNode._openRecursively2() {{{3 +"Opens this all children of this treenode recursively if either: +" *they arent filtered by file filters +" *a:forceOpen is 1 +" +"Args: +"forceOpen: 1 if this node should be opened regardless of file filters +function! s:TreeDirNode._openRecursively2(forceOpen) + if self.path.ignore() ==# 0 || a:forceOpen + let self.isOpen = 1 + if self.children ==# [] + call self._initChildren(1) + endif + + for i in self.children + if i.path.isDirectory ==# 1 + call i._openRecursively2(0) + endif + endfor + endif +endfunction + +"FUNCTION: TreeDirNode.refresh() {{{3 +unlet s:TreeDirNode.refresh +function! s:TreeDirNode.refresh() + call self.path.refresh() + + "if this node was ever opened, refresh its children + if self.isOpen || !empty(self.children) + "go thru all the files/dirs under this node + let newChildNodes = [] + let invalidFilesFound = 0 + let dir = self.path + let globDir = dir.str({'format': 'Glob'}) + let filesStr = globpath(globDir, '*') . "\n" . globpath(globDir, '.*') + let files = split(filesStr, "\n") + for i in files + "filter out the .. and . directories + "Note: we must match .. AND ../ cos sometimes the globpath returns + "../ for path with strange chars (eg $) + if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$' + + try + "create a new path and see if it exists in this nodes children + let path = s:Path.New(i) + let newNode = self.getChild(path) + if newNode != {} + call newNode.refresh() + call add(newChildNodes, newNode) + + "the node doesnt exist so create it + else + let newNode = s:TreeFileNode.New(path) + let newNode.parent = self + call add(newChildNodes, newNode) + endif + + + catch /^NERDTree.InvalidArgumentsError/ + let invalidFilesFound = 1 + endtry + endif + endfor + + "swap this nodes children out for the children we just read/refreshed + let self.children = newChildNodes + call self.sortChildren() + + if invalidFilesFound + call s:echoWarning("some files could not be loaded into the NERD tree") + endif + endif +endfunction + +"FUNCTION: TreeDirNode.reveal(path) {{{3 +"reveal the given path, i.e. cache and open all treenodes needed to display it +"in the UI +function! s:TreeDirNode.reveal(path) + if !a:path.isUnder(self.path) + throw "NERDTree.InvalidArgumentsError: " . a:path.str() . " should be under " . self.path.str() + endif + + call self.open() + + if self.path.equals(a:path.getParent()) + let n = self.findNode(a:path) + call s:renderView() + call n.putCursorHere(1,0) + return + endif + + let p = a:path + while !p.getParent().equals(self.path) + let p = p.getParent() + endwhile + + let n = self.findNode(p) + call n.reveal(a:path) +endfunction +"FUNCTION: TreeDirNode.removeChild(treenode) {{{3 +" +"Removes the given treenode from this nodes set of children +" +"Args: +"treenode: the node to remove +" +"Throws a NERDTree.ChildNotFoundError if the given treenode is not found +function! s:TreeDirNode.removeChild(treenode) + for i in range(0, self.getChildCount()-1) + if self.children[i].equals(a:treenode) + call remove(self.children, i) + return + endif + endfor + + throw "NERDTree.ChildNotFoundError: child node was not found" +endfunction + +"FUNCTION: TreeDirNode.sortChildren() {{{3 +" +"Sorts the children of this node according to alphabetical order and the +"directory priority. +" +function! s:TreeDirNode.sortChildren() + let CompareFunc = function("s:compareNodes") + call sort(self.children, CompareFunc) +endfunction + +"FUNCTION: TreeDirNode.toggleOpen() {{{3 +"Opens this directory if it is closed and vice versa +function! s:TreeDirNode.toggleOpen() + if self.isOpen ==# 1 + call self.close() + else + call self.open() + endif +endfunction + +"FUNCTION: TreeDirNode.transplantChild(newNode) {{{3 +"Replaces the child of this with the given node (where the child node's full +"path matches a:newNode's fullpath). The search for the matching node is +"non-recursive +" +"Arg: +"newNode: the node to graft into the tree +function! s:TreeDirNode.transplantChild(newNode) + for i in range(0, self.getChildCount()-1) + if self.children[i].equals(a:newNode) + let self.children[i] = a:newNode + let a:newNode.parent = self + break + endif + endfor +endfunction +"============================================================ +"CLASS: Path {{{2 +"============================================================ +let s:Path = {} +"FUNCTION: Path.AbsolutePathFor(str) {{{3 +function! s:Path.AbsolutePathFor(str) + let prependCWD = 0 + if s:running_windows + let prependCWD = a:str !~# '^.:\(\\\|\/\)' + else + let prependCWD = a:str !~# '^/' + endif + + let toReturn = a:str + if prependCWD + let toReturn = getcwd() . s:Path.Slash() . a:str + endif + + return toReturn +endfunction +"FUNCTION: Path.bookmarkNames() {{{3 +function! s:Path.bookmarkNames() + if !exists("self._bookmarkNames") + call self.cacheDisplayString() + endif + return self._bookmarkNames +endfunction +"FUNCTION: Path.cacheDisplayString() {{{3 +function! s:Path.cacheDisplayString() + let self.cachedDisplayString = self.getLastPathComponent(1) + + if self.isExecutable + let self.cachedDisplayString = self.cachedDisplayString . '*' + endif + + let self._bookmarkNames = [] + for i in s:Bookmark.Bookmarks() + if i.path.equals(self) + call add(self._bookmarkNames, i.name) + endif + endfor + if !empty(self._bookmarkNames) + let self.cachedDisplayString .= ' {' . join(self._bookmarkNames) . '}' + endif + + if self.isSymLink + let self.cachedDisplayString .= ' -> ' . self.symLinkDest + endif + + if self.isReadOnly + let self.cachedDisplayString .= ' [RO]' + endif +endfunction +"FUNCTION: Path.changeToDir() {{{3 +function! s:Path.changeToDir() + let dir = self.str({'format': 'Cd'}) + if self.isDirectory ==# 0 + let dir = self.getParent().str({'format': 'Cd'}) + endif + + try + execute "cd " . dir + call s:echo("CWD is now: " . getcwd()) + catch + throw "NERDTree.PathChangeError: cannot change CWD to " . dir + endtry +endfunction + +"FUNCTION: Path.compareTo() {{{3 +" +"Compares this Path to the given path and returns 0 if they are equal, -1 if +"this Path is "less than" the given path, or 1 if it is "greater". +" +"Args: +"path: the path object to compare this to +" +"Return: +"1, -1 or 0 +function! s:Path.compareTo(path) + let thisPath = self.getLastPathComponent(1) + let thatPath = a:path.getLastPathComponent(1) + + "if the paths are the same then clearly we return 0 + if thisPath ==# thatPath + return 0 + endif + + let thisSS = self.getSortOrderIndex() + let thatSS = a:path.getSortOrderIndex() + + "compare the sort sequences, if they are different then the return + "value is easy + if thisSS < thatSS + return -1 + elseif thisSS > thatSS + return 1 + else + "if the sort sequences are the same then compare the paths + "alphabetically + let pathCompare = g:NERDTreeCaseSensitiveSort ? thisPath <# thatPath : thisPath limit + let toReturn = "<" . strpart(toReturn, len(toReturn) - limit + 1) + endif + endif + + return toReturn +endfunction + +"FUNCTION: Path._strForUI() {{{3 +function! s:Path._strForUI() + let toReturn = '/' . join(self.pathSegments, '/') + if self.isDirectory && toReturn != '/' + let toReturn = toReturn . '/' + endif + return toReturn +endfunction + +"FUNCTION: Path._strForCd() {{{3 +" +" returns a string that can be used with :cd +function! s:Path._strForCd() + return escape(self.str(), s:escape_chars) +endfunction +"FUNCTION: Path._strForEdit() {{{3 +" +"Return: the string for this path that is suitable to be used with the :edit +"command +function! s:Path._strForEdit() + let p = self.str({'format': 'UI'}) + let cwd = getcwd() + + if s:running_windows + let p = tolower(self.str()) + let cwd = tolower(getcwd()) + endif + + let p = escape(p, s:escape_chars) + + let cwd = cwd . s:Path.Slash() + + "return a relative path if we can + if stridx(p, cwd) ==# 0 + let p = strpart(p, strlen(cwd)) + endif + + if p ==# '' + let p = '.' + endif + + return p + +endfunction +"FUNCTION: Path._strForGlob() {{{3 +function! s:Path._strForGlob() + let lead = s:Path.Slash() + + "if we are running windows then slap a drive letter on the front + if s:running_windows + let lead = self.drive . '\' + endif + + let toReturn = lead . join(self.pathSegments, s:Path.Slash()) + + if !s:running_windows + let toReturn = escape(toReturn, s:escape_chars) + endif + return toReturn +endfunction +"FUNCTION: Path._str() {{{3 +" +"Gets the string path for this path object that is appropriate for the OS. +"EG, in windows c:\foo\bar +" in *nix /foo/bar +function! s:Path._str() + let lead = s:Path.Slash() + + "if we are running windows then slap a drive letter on the front + if s:running_windows + let lead = self.drive . '\' + endif + + return lead . join(self.pathSegments, s:Path.Slash()) +endfunction + +"FUNCTION: Path.strTrunk() {{{3 +"Gets the path without the last segment on the end. +function! s:Path.strTrunk() + return self.drive . '/' . join(self.pathSegments[0:-2], '/') +endfunction + +"FUNCTION: Path.WinToUnixPath(pathstr){{{3 +"Takes in a windows path and returns the unix equiv +" +"A class level method +" +"Args: +"pathstr: the windows path to convert +function! s:Path.WinToUnixPath(pathstr) + if !s:running_windows + return a:pathstr + endif + + let toReturn = a:pathstr + + "remove the x:\ of the front + let toReturn = substitute(toReturn, '^.*:\(\\\|/\)\?', '/', "") + + "convert all \ chars to / + let toReturn = substitute(toReturn, '\', '/', "g") + + return toReturn +endfunction + +" SECTION: General Functions {{{1 +"============================================================ +"FUNCTION: s:bufInWindows(bnum){{{2 +"[[STOLEN FROM VTREEEXPLORER.VIM]] +"Determine the number of windows open to this buffer number. +"Care of Yegappan Lakshman. Thanks! +" +"Args: +"bnum: the subject buffers buffer number +function! s:bufInWindows(bnum) + let cnt = 0 + let winnum = 1 + while 1 + let bufnum = winbufnr(winnum) + if bufnum < 0 + break + endif + if bufnum ==# a:bnum + let cnt = cnt + 1 + endif + let winnum = winnum + 1 + endwhile + + return cnt +endfunction " >>> +"FUNCTION: s:checkForBrowse(dir) {{{2 +"inits a secondary nerd tree in the current buffer if appropriate +function! s:checkForBrowse(dir) + if a:dir != '' && isdirectory(a:dir) + call s:initNerdTreeInPlace(a:dir) + endif +endfunction +"FUNCTION: s:compareBookmarks(first, second) {{{2 +"Compares two bookmarks +function! s:compareBookmarks(first, second) + return a:first.compareTo(a:second) +endfunction + +" FUNCTION: s:completeBookmarks(A,L,P) {{{2 +" completion function for the bookmark commands +function! s:completeBookmarks(A,L,P) + return filter(s:Bookmark.BookmarkNames(), 'v:val =~# "^' . a:A . '"') +endfunction +" FUNCTION: s:exec(cmd) {{{2 +" same as :exec cmd but eventignore=all is set for the duration +function! s:exec(cmd) + let old_ei = &ei + set ei=all + exec a:cmd + let &ei = old_ei +endfunction +" FUNCTION: s:findAndRevealPath() {{{2 +function! s:findAndRevealPath() + try + let p = s:Path.New(expand("%:p")) + catch /^NERDTree.InvalidArgumentsError/ + call s:echo("no file for the current buffer") + return + endtry + + if !s:treeExistsForTab() + try + let cwd = s:Path.New(getcwd()) + catch /^NERDTree.InvalidArgumentsError/ + call s:echo("current directory does not exist.") + let cwd = p.getParent() + endtry + + if p.isUnder(cwd) + call s:initNerdTree(cwd.str()) + else + call s:initNerdTree(p.getParent().str()) + endif + else + if !p.isUnder(s:TreeFileNode.GetRootForTab().path) + call s:initNerdTree(p.getParent().str()) + else + if !s:isTreeOpen() + call s:toggle("") + endif + endif + endif + call s:putCursorInTreeWin() + call b:NERDTreeRoot.reveal(p) +endfunction +"FUNCTION: s:initNerdTree(name) {{{2 +"Initialise the nerd tree for this tab. The tree will start in either the +"given directory, or the directory associated with the given bookmark +" +"Args: +"name: the name of a bookmark or a directory +function! s:initNerdTree(name) + let path = {} + if s:Bookmark.BookmarkExistsFor(a:name) + let path = s:Bookmark.BookmarkFor(a:name).path + else + let dir = a:name ==# '' ? getcwd() : a:name + + "hack to get an absolute path if a relative path is given + if dir =~# '^\.' + let dir = getcwd() . s:Path.Slash() . dir + endif + let dir = resolve(dir) + + try + let path = s:Path.New(dir) + catch /^NERDTree.InvalidArgumentsError/ + call s:echo("No bookmark or directory found for: " . a:name) + return + endtry + endif + if !path.isDirectory + let path = path.getParent() + endif + + "if instructed to, then change the vim CWD to the dir the NERDTree is + "inited in + if g:NERDTreeChDirMode != 0 + call path.changeToDir() + endif + + if s:treeExistsForTab() + if s:isTreeOpen() + call s:closeTree() + endif + unlet t:NERDTreeBufName + endif + + let newRoot = s:TreeDirNode.New(path) + call newRoot.open() + + call s:createTreeWin() + let b:treeShowHelp = 0 + let b:NERDTreeIgnoreEnabled = 1 + let b:NERDTreeShowFiles = g:NERDTreeShowFiles + let b:NERDTreeShowHidden = g:NERDTreeShowHidden + let b:NERDTreeShowBookmarks = g:NERDTreeShowBookmarks + let b:NERDTreeRoot = newRoot + + let b:NERDTreeType = "primary" + + call s:renderView() + call b:NERDTreeRoot.putCursorHere(0, 0) +endfunction + +"FUNCTION: s:initNerdTreeInPlace(dir) {{{2 +function! s:initNerdTreeInPlace(dir) + try + let path = s:Path.New(a:dir) + catch /^NERDTree.InvalidArgumentsError/ + call s:echo("Invalid directory name:" . a:name) + return + endtry + + "we want the directory buffer to disappear when we do the :edit below + setlocal bufhidden=wipe + + let previousBuf = expand("#") + + "we need a unique name for each secondary tree buffer to ensure they are + "all independent + exec "silent edit " . s:nextBufferName() + + let b:NERDTreePreviousBuf = bufnr(previousBuf) + + let b:NERDTreeRoot = s:TreeDirNode.New(path) + call b:NERDTreeRoot.open() + + call s:setCommonBufOptions() + let b:NERDTreeType = "secondary" + + call s:renderView() +endfunction +" FUNCTION: s:initNerdTreeMirror() {{{2 +function! s:initNerdTreeMirror() + + "get the names off all the nerd tree buffers + let treeBufNames = [] + for i in range(1, tabpagenr("$")) + let nextName = s:tabpagevar(i, 'NERDTreeBufName') + if nextName != -1 && (!exists("t:NERDTreeBufName") || nextName != t:NERDTreeBufName) + call add(treeBufNames, nextName) + endif + endfor + let treeBufNames = s:unique(treeBufNames) + + "map the option names (that the user will be prompted with) to the nerd + "tree buffer names + let options = {} + let i = 0 + while i < len(treeBufNames) + let bufName = treeBufNames[i] + let treeRoot = getbufvar(bufName, "NERDTreeRoot") + let options[i+1 . '. ' . treeRoot.path.str() . ' (buf name: ' . bufName . ')'] = bufName + let i = i + 1 + endwhile + + "work out which tree to mirror, if there is more than 1 then ask the user + let bufferName = '' + if len(keys(options)) > 1 + let choices = ["Choose a tree to mirror"] + let choices = extend(choices, sort(keys(options))) + let choice = inputlist(choices) + if choice < 1 || choice > len(options) || choice ==# '' + return + endif + + let bufferName = options[sort(keys(options))[choice-1]] + elseif len(keys(options)) ==# 1 + let bufferName = values(options)[0] + else + call s:echo("No trees to mirror") + return + endif + + if s:treeExistsForTab() && s:isTreeOpen() + call s:closeTree() + endif + + let t:NERDTreeBufName = bufferName + call s:createTreeWin() + exec 'buffer ' . bufferName + if !&hidden + call s:renderView() + endif +endfunction +" FUNCTION: s:nextBufferName() {{{2 +" returns the buffer name for the next nerd tree +function! s:nextBufferName() + let name = s:NERDTreeBufName . s:next_buffer_number + let s:next_buffer_number += 1 + return name +endfunction +" FUNCTION: s:tabpagevar(tabnr, var) {{{2 +function! s:tabpagevar(tabnr, var) + let currentTab = tabpagenr() + let old_ei = &ei + set ei=all + + exec "tabnext " . a:tabnr + let v = -1 + if exists('t:' . a:var) + exec 'let v = t:' . a:var + endif + exec "tabnext " . currentTab + + let &ei = old_ei + + return v +endfunction +" Function: s:treeExistsForBuffer() {{{2 +" Returns 1 if a nerd tree root exists in the current buffer +function! s:treeExistsForBuf() + return exists("b:NERDTreeRoot") +endfunction +" Function: s:treeExistsForTab() {{{2 +" Returns 1 if a nerd tree root exists in the current tab +function! s:treeExistsForTab() + return exists("t:NERDTreeBufName") +endfunction +" Function: s:unique(list) {{{2 +" returns a:list without duplicates +function! s:unique(list) + let uniqlist = [] + for elem in a:list + if index(uniqlist, elem) ==# -1 + let uniqlist += [elem] + endif + endfor + return uniqlist +endfunction +" SECTION: Public API {{{1 +"============================================================ +let g:NERDTreePath = s:Path +let g:NERDTreeDirNode = s:TreeDirNode +let g:NERDTreeFileNode = s:TreeFileNode +let g:NERDTreeBookmark = s:Bookmark + +function! NERDTreeAddMenuItem(options) + call s:MenuItem.Create(a:options) +endfunction + +function! NERDTreeAddMenuSeparator(...) + let opts = a:0 ? a:1 : {} + call s:MenuItem.CreateSeparator(opts) +endfunction + +function! NERDTreeAddSubmenu(options) + return s:MenuItem.Create(a:options) +endfunction + +function! NERDTreeAddKeyMap(options) + call s:KeyMap.Create(a:options) +endfunction + +function! NERDTreeRender() + call s:renderView() +endfunction + +" SECTION: View Functions {{{1 +"============================================================ +"FUNCTION: s:centerView() {{{2 +"centers the nerd tree window around the cursor (provided the nerd tree +"options permit) +function! s:centerView() + if g:NERDTreeAutoCenter + let current_line = winline() + let lines_to_top = current_line + let lines_to_bottom = winheight(s:getTreeWinNum()) - current_line + if lines_to_top < g:NERDTreeAutoCenterThreshold || lines_to_bottom < g:NERDTreeAutoCenterThreshold + normal! zz + endif + endif +endfunction +"FUNCTION: s:closeTree() {{{2 +"Closes the primary NERD tree window for this tab +function! s:closeTree() + if !s:isTreeOpen() + throw "NERDTree.NoTreeFoundError: no NERDTree is open" + endif + + if winnr("$") != 1 + if winnr() == s:getTreeWinNum() + wincmd p + let bufnr = bufnr("") + wincmd p + else + let bufnr = bufnr("") + endif + + call s:exec(s:getTreeWinNum() . " wincmd w") + close + call s:exec(bufwinnr(bufnr) . " wincmd w") + else + close + endif +endfunction + +"FUNCTION: s:closeTreeIfOpen() {{{2 +"Closes the NERD tree window if it is open +function! s:closeTreeIfOpen() + if s:isTreeOpen() + call s:closeTree() + endif +endfunction +"FUNCTION: s:closeTreeIfQuitOnOpen() {{{2 +"Closes the NERD tree window if the close on open option is set +function! s:closeTreeIfQuitOnOpen() + if g:NERDTreeQuitOnOpen && s:isTreeOpen() + call s:closeTree() + endif +endfunction +"FUNCTION: s:createTreeWin() {{{2 +"Inits the NERD tree window. ie. opens it, sizes it, sets all the local +"options etc +function! s:createTreeWin() + "create the nerd tree window + let splitLocation = g:NERDTreeWinPos ==# "left" ? "topleft " : "botright " + let splitSize = g:NERDTreeWinSize + + if !exists('t:NERDTreeBufName') + let t:NERDTreeBufName = s:nextBufferName() + silent! exec splitLocation . 'vertical ' . splitSize . ' new' + silent! exec "edit " . t:NERDTreeBufName + else + silent! exec splitLocation . 'vertical ' . splitSize . ' split' + silent! exec "buffer " . t:NERDTreeBufName + endif + + setlocal winfixwidth + call s:setCommonBufOptions() +endfunction + +"FUNCTION: s:dumpHelp {{{2 +"prints out the quick help +function! s:dumpHelp() + let old_h = @h + if b:treeShowHelp ==# 1 + let @h= "\" NERD tree (" . s:NERD_tree_version . ") quickhelp~\n" + let @h=@h."\" ============================\n" + let @h=@h."\" File node mappings~\n" + let @h=@h."\" ". (g:NERDTreeMouseMode ==# 3 ? "single" : "double") ."-click,\n" + let @h=@h."\" ,\n" + if b:NERDTreeType ==# "primary" + let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in prev window\n" + else + let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in current window\n" + endif + if b:NERDTreeType ==# "primary" + let @h=@h."\" ". g:NERDTreeMapPreview .": preview\n" + endif + let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" + let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" + let @h=@h."\" middle-click,\n" + let @h=@h."\" ". g:NERDTreeMapOpenSplit .": open split\n" + let @h=@h."\" ". g:NERDTreeMapPreviewSplit .": preview split\n" + let @h=@h."\" ". g:NERDTreeMapOpenVSplit .": open vsplit\n" + let @h=@h."\" ". g:NERDTreeMapPreviewVSplit .": preview vsplit\n" + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Directory node mappings~\n" + let @h=@h."\" ". (g:NERDTreeMouseMode ==# 1 ? "double" : "single") ."-click,\n" + let @h=@h."\" ". g:NERDTreeMapActivateNode .": open & close node\n" + let @h=@h."\" ". g:NERDTreeMapOpenRecursively .": recursively open node\n" + let @h=@h."\" ". g:NERDTreeMapCloseDir .": close parent of node\n" + let @h=@h."\" ". g:NERDTreeMapCloseChildren .": close all child nodes of\n" + let @h=@h."\" current node recursively\n" + let @h=@h."\" middle-click,\n" + let @h=@h."\" ". g:NERDTreeMapOpenExpl.": explore selected dir\n" + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Bookmark table mappings~\n" + let @h=@h."\" double-click,\n" + let @h=@h."\" ". g:NERDTreeMapActivateNode .": open bookmark\n" + let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" + let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" + let @h=@h."\" ". g:NERDTreeMapDeleteBookmark .": delete bookmark\n" + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Tree navigation mappings~\n" + let @h=@h."\" ". g:NERDTreeMapJumpRoot .": go to root\n" + let @h=@h."\" ". g:NERDTreeMapJumpParent .": go to parent\n" + let @h=@h."\" ". g:NERDTreeMapJumpFirstChild .": go to first child\n" + let @h=@h."\" ". g:NERDTreeMapJumpLastChild .": go to last child\n" + let @h=@h."\" ". g:NERDTreeMapJumpNextSibling .": go to next sibling\n" + let @h=@h."\" ". g:NERDTreeMapJumpPrevSibling .": go to prev sibling\n" + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Filesystem mappings~\n" + let @h=@h."\" ". g:NERDTreeMapChangeRoot .": change tree root to the\n" + let @h=@h."\" selected dir\n" + let @h=@h."\" ". g:NERDTreeMapUpdir .": move tree root up a dir\n" + let @h=@h."\" ". g:NERDTreeMapUpdirKeepOpen .": move tree root up a dir\n" + let @h=@h."\" but leave old root open\n" + let @h=@h."\" ". g:NERDTreeMapRefresh .": refresh cursor dir\n" + let @h=@h."\" ". g:NERDTreeMapRefreshRoot .": refresh current root\n" + let @h=@h."\" ". g:NERDTreeMapMenu .": Show menu\n" + let @h=@h."\" ". g:NERDTreeMapChdir .":change the CWD to the\n" + let @h=@h."\" selected dir\n" + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Tree filtering mappings~\n" + let @h=@h."\" ". g:NERDTreeMapToggleHidden .": hidden files (" . (b:NERDTreeShowHidden ? "on" : "off") . ")\n" + let @h=@h."\" ". g:NERDTreeMapToggleFilters .": file filters (" . (b:NERDTreeIgnoreEnabled ? "on" : "off") . ")\n" + let @h=@h."\" ". g:NERDTreeMapToggleFiles .": files (" . (b:NERDTreeShowFiles ? "on" : "off") . ")\n" + let @h=@h."\" ". g:NERDTreeMapToggleBookmarks .": bookmarks (" . (b:NERDTreeShowBookmarks ? "on" : "off") . ")\n" + + "add quickhelp entries for each custom key map + if len(s:KeyMap.All()) + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Custom mappings~\n" + for i in s:KeyMap.All() + let @h=@h."\" ". i.key .": ". i.quickhelpText ."\n" + endfor + endif + + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Other mappings~\n" + let @h=@h."\" ". g:NERDTreeMapQuit .": Close the NERDTree window\n" + let @h=@h."\" ". g:NERDTreeMapToggleZoom .": Zoom (maximize-minimize)\n" + let @h=@h."\" the NERDTree window\n" + let @h=@h."\" ". g:NERDTreeMapHelp .": toggle help\n" + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Bookmark commands~\n" + let @h=@h."\" :Bookmark \n" + let @h=@h."\" :BookmarkToRoot \n" + let @h=@h."\" :RevealBookmark \n" + let @h=@h."\" :OpenBookmark \n" + let @h=@h."\" :ClearBookmarks []\n" + let @h=@h."\" :ClearAllBookmarks\n" + silent! put h + elseif g:NERDTreeMinimalUI == 0 + let @h="\" Press ". g:NERDTreeMapHelp ." for help\n" + silent! put h + endif + + let @h = old_h +endfunction +"FUNCTION: s:echo {{{2 +"A wrapper for :echo. Appends 'NERDTree:' on the front of all messages +" +"Args: +"msg: the message to echo +function! s:echo(msg) + redraw + echomsg "NERDTree: " . a:msg +endfunction +"FUNCTION: s:echoWarning {{{2 +"Wrapper for s:echo, sets the message type to warningmsg for this message +"Args: +"msg: the message to echo +function! s:echoWarning(msg) + echohl warningmsg + call s:echo(a:msg) + echohl normal +endfunction +"FUNCTION: s:echoError {{{2 +"Wrapper for s:echo, sets the message type to errormsg for this message +"Args: +"msg: the message to echo +function! s:echoError(msg) + echohl errormsg + call s:echo(a:msg) + echohl normal +endfunction +"FUNCTION: s:firstUsableWindow(){{{2 +"find the window number of the first normal window +function! s:firstUsableWindow() + let i = 1 + while i <= winnr("$") + let bnum = winbufnr(i) + if bnum != -1 && getbufvar(bnum, '&buftype') ==# '' + \ && !getwinvar(i, '&previewwindow') + \ && (!getbufvar(bnum, '&modified') || &hidden) + return i + endif + + let i += 1 + endwhile + return -1 +endfunction +"FUNCTION: s:getPath(ln) {{{2 +"Gets the full path to the node that is rendered on the given line number +" +"Args: +"ln: the line number to get the path for +" +"Return: +"A path if a node was selected, {} if nothing is selected. +"If the 'up a dir' line was selected then the path to the parent of the +"current root is returned +function! s:getPath(ln) + let line = getline(a:ln) + + let rootLine = s:TreeFileNode.GetRootLineNum() + + "check to see if we have the root node + if a:ln == rootLine + return b:NERDTreeRoot.path + endif + + if !g:NERDTreeDirArrows + " in case called from outside the tree + if line !~# '^ *[|`▸▾ ]' || line =~# '^$' + return {} + endif + endif + + if line ==# s:tree_up_dir_line + return b:NERDTreeRoot.path.getParent() + endif + + let indent = s:indentLevelFor(line) + + "remove the tree parts and the leading space + let curFile = s:stripMarkupFromLine(line, 0) + + let wasdir = 0 + if curFile =~# '/$' + let wasdir = 1 + let curFile = substitute(curFile, '/\?$', '/', "") + endif + + let dir = "" + let lnum = a:ln + while lnum > 0 + let lnum = lnum - 1 + let curLine = getline(lnum) + let curLineStripped = s:stripMarkupFromLine(curLine, 1) + + "have we reached the top of the tree? + if lnum == rootLine + let dir = b:NERDTreeRoot.path.str({'format': 'UI'}) . dir + break + endif + if curLineStripped =~# '/$' + let lpindent = s:indentLevelFor(curLine) + if lpindent < indent + let indent = indent - 1 + + let dir = substitute (curLineStripped,'^\\', "", "") . dir + continue + endif + endif + endwhile + let curFile = b:NERDTreeRoot.path.drive . dir . curFile + let toReturn = s:Path.New(curFile) + return toReturn +endfunction + +"FUNCTION: s:getTreeWinNum() {{{2 +"gets the nerd tree window number for this tab +function! s:getTreeWinNum() + if exists("t:NERDTreeBufName") + return bufwinnr(t:NERDTreeBufName) + else + return -1 + endif +endfunction +"FUNCTION: s:indentLevelFor(line) {{{2 +function! s:indentLevelFor(line) + let level = match(a:line, '[^ \-+~▸▾`|]') / s:tree_wid + " check if line includes arrows + if match(a:line, '[▸▾]') > -1 + " decrement level as arrow uses 3 ascii chars + let level = level - 1 + endif + return level +endfunction +"FUNCTION: s:isTreeOpen() {{{2 +function! s:isTreeOpen() + return s:getTreeWinNum() != -1 +endfunction +"FUNCTION: s:isWindowUsable(winnumber) {{{2 +"Returns 0 if opening a file from the tree in the given window requires it to +"be split, 1 otherwise +" +"Args: +"winnumber: the number of the window in question +function! s:isWindowUsable(winnumber) + "gotta split if theres only one window (i.e. the NERD tree) + if winnr("$") ==# 1 + return 0 + endif + + let oldwinnr = winnr() + call s:exec(a:winnumber . "wincmd p") + let specialWindow = getbufvar("%", '&buftype') != '' || getwinvar('%', '&previewwindow') + let modified = &modified + call s:exec(oldwinnr . "wincmd p") + + "if its a special window e.g. quickfix or another explorer plugin then we + "have to split + if specialWindow + return 0 + endif + + if &hidden + return 1 + endif + + return !modified || s:bufInWindows(winbufnr(a:winnumber)) >= 2 +endfunction + +" FUNCTION: s:jumpToChild(direction) {{{2 +" Args: +" direction: 0 if going to first child, 1 if going to last +function! s:jumpToChild(direction) + let currentNode = s:TreeFileNode.GetSelected() + if currentNode ==# {} || currentNode.isRoot() + call s:echo("cannot jump to " . (a:direction ? "last" : "first") . " child") + return + end + let dirNode = currentNode.parent + let childNodes = dirNode.getVisibleChildren() + + let targetNode = childNodes[0] + if a:direction + let targetNode = childNodes[len(childNodes) - 1] + endif + + if targetNode.equals(currentNode) + let siblingDir = currentNode.parent.findOpenDirSiblingWithVisibleChildren(a:direction) + if siblingDir != {} + let indx = a:direction ? siblingDir.getVisibleChildCount()-1 : 0 + let targetNode = siblingDir.getChildByIndex(indx, 1) + endif + endif + + call targetNode.putCursorHere(1, 0) + + call s:centerView() +endfunction + + +"FUNCTION: s:promptToDelBuffer(bufnum, msg){{{2 +"prints out the given msg and, if the user responds by pushing 'y' then the +"buffer with the given bufnum is deleted +" +"Args: +"bufnum: the buffer that may be deleted +"msg: a message that will be echoed to the user asking them if they wish to +" del the buffer +function! s:promptToDelBuffer(bufnum, msg) + echo a:msg + if nr2char(getchar()) ==# 'y' + exec "silent bdelete! " . a:bufnum + endif +endfunction + +"FUNCTION: s:putCursorOnBookmarkTable(){{{2 +"Places the cursor at the top of the bookmarks table +function! s:putCursorOnBookmarkTable() + if !b:NERDTreeShowBookmarks + throw "NERDTree.IllegalOperationError: cant find bookmark table, bookmarks arent active" + endif + + if g:NERDTreeMinimalUI + return cursor(1, 2) + endif + + let rootNodeLine = s:TreeFileNode.GetRootLineNum() + + let line = 1 + while getline(line) !~# '^>-\+Bookmarks-\+$' + let line = line + 1 + if line >= rootNodeLine + throw "NERDTree.BookmarkTableNotFoundError: didnt find the bookmarks table" + endif + endwhile + call cursor(line, 2) +endfunction + +"FUNCTION: s:putCursorInTreeWin(){{{2 +"Places the cursor in the nerd tree window +function! s:putCursorInTreeWin() + if !s:isTreeOpen() + throw "NERDTree.InvalidOperationError: cant put cursor in NERD tree window, no window exists" + endif + + call s:exec(s:getTreeWinNum() . "wincmd w") +endfunction + +"FUNCTION: s:renderBookmarks {{{2 +function! s:renderBookmarks() + + if g:NERDTreeMinimalUI == 0 + call setline(line(".")+1, ">----------Bookmarks----------") + call cursor(line(".")+1, col(".")) + endif + + for i in s:Bookmark.Bookmarks() + call setline(line(".")+1, i.str()) + call cursor(line(".")+1, col(".")) + endfor + + call setline(line(".")+1, '') + call cursor(line(".")+1, col(".")) +endfunction +"FUNCTION: s:renderView {{{2 +"The entry function for rendering the tree +function! s:renderView() + setlocal modifiable + + "remember the top line of the buffer and the current line so we can + "restore the view exactly how it was + let curLine = line(".") + let curCol = col(".") + let topLine = line("w0") + + "delete all lines in the buffer (being careful not to clobber a register) + silent 1,$delete _ + + call s:dumpHelp() + + "delete the blank line before the help and add one after it + if g:NERDTreeMinimalUI == 0 + call setline(line(".")+1, "") + call cursor(line(".")+1, col(".")) + endif + + if b:NERDTreeShowBookmarks + call s:renderBookmarks() + endif + + "add the 'up a dir' line + if !g:NERDTreeMinimalUI + call setline(line(".")+1, s:tree_up_dir_line) + call cursor(line(".")+1, col(".")) + endif + + "draw the header line + let header = b:NERDTreeRoot.path.str({'format': 'UI', 'truncateTo': winwidth(0)}) + call setline(line(".")+1, header) + call cursor(line(".")+1, col(".")) + + "draw the tree + let old_o = @o + let @o = b:NERDTreeRoot.renderToString() + silent put o + let @o = old_o + + "delete the blank line at the top of the buffer + silent 1,1delete _ + + "restore the view + let old_scrolloff=&scrolloff + let &scrolloff=0 + call cursor(topLine, 1) + normal! zt + call cursor(curLine, curCol) + let &scrolloff = old_scrolloff + + setlocal nomodifiable +endfunction + +"FUNCTION: s:renderViewSavingPosition {{{2 +"Renders the tree and ensures the cursor stays on the current node or the +"current nodes parent if it is no longer available upon re-rendering +function! s:renderViewSavingPosition() + let currentNode = s:TreeFileNode.GetSelected() + + "go up the tree till we find a node that will be visible or till we run + "out of nodes + while currentNode != {} && !currentNode.isVisible() && !currentNode.isRoot() + let currentNode = currentNode.parent + endwhile + + call s:renderView() + + if currentNode != {} + call currentNode.putCursorHere(0, 0) + endif +endfunction +"FUNCTION: s:restoreScreenState() {{{2 +" +"Sets the screen state back to what it was when s:saveScreenState was last +"called. +" +"Assumes the cursor is in the NERDTree window +function! s:restoreScreenState() + if !exists("b:NERDTreeOldTopLine") || !exists("b:NERDTreeOldPos") || !exists("b:NERDTreeOldWindowSize") + return + endif + exec("silent vertical resize ".b:NERDTreeOldWindowSize) + + let old_scrolloff=&scrolloff + let &scrolloff=0 + call cursor(b:NERDTreeOldTopLine, 0) + normal! zt + call setpos(".", b:NERDTreeOldPos) + let &scrolloff=old_scrolloff +endfunction + +"FUNCTION: s:saveScreenState() {{{2 +"Saves the current cursor position in the current buffer and the window +"scroll position +function! s:saveScreenState() + let win = winnr() + try + call s:putCursorInTreeWin() + let b:NERDTreeOldPos = getpos(".") + let b:NERDTreeOldTopLine = line("w0") + let b:NERDTreeOldWindowSize = winwidth("") + call s:exec(win . "wincmd w") + catch /^NERDTree.InvalidOperationError/ + endtry +endfunction + +"FUNCTION: s:setCommonBufOptions() {{{2 +function! s:setCommonBufOptions() + "throwaway buffer options + setlocal noswapfile + setlocal buftype=nofile + setlocal bufhidden=hide + setlocal nowrap + setlocal foldcolumn=0 + setlocal nobuflisted + setlocal nospell + if g:NERDTreeShowLineNumbers + setlocal nu + else + setlocal nonu + if v:version >= 703 + setlocal nornu + endif + endif + + iabc + + if g:NERDTreeHighlightCursorline + setlocal cursorline + endif + + call s:setupStatusline() + + + let b:treeShowHelp = 0 + let b:NERDTreeIgnoreEnabled = 1 + let b:NERDTreeShowFiles = g:NERDTreeShowFiles + let b:NERDTreeShowHidden = g:NERDTreeShowHidden + let b:NERDTreeShowBookmarks = g:NERDTreeShowBookmarks + setfiletype nerdtree + call s:bindMappings() +endfunction + +"FUNCTION: s:setupStatusline() {{{2 +function! s:setupStatusline() + if g:NERDTreeStatusline != -1 + let &l:statusline = g:NERDTreeStatusline + endif +endfunction +"FUNCTION: s:stripMarkupFromLine(line, removeLeadingSpaces){{{2 +"returns the given line with all the tree parts stripped off +" +"Args: +"line: the subject line +"removeLeadingSpaces: 1 if leading spaces are to be removed (leading spaces = +"any spaces before the actual text of the node) +function! s:stripMarkupFromLine(line, removeLeadingSpaces) + let line = a:line + "remove the tree parts and the leading space + let line = substitute (line, s:tree_markup_reg,"","") + + "strip off any read only flag + let line = substitute (line, ' \[RO\]', "","") + + "strip off any bookmark flags + let line = substitute (line, ' {[^}]*}', "","") + + "strip off any executable flags + let line = substitute (line, '*\ze\($\| \)', "","") + + let wasdir = 0 + if line =~# '/$' + let wasdir = 1 + endif + let line = substitute (line,' -> .*',"","") " remove link to + if wasdir ==# 1 + let line = substitute (line, '/\?$', '/', "") + endif + + if a:removeLeadingSpaces + let line = substitute (line, '^ *', '', '') + endif + + return line +endfunction + +"FUNCTION: s:toggle(dir) {{{2 +"Toggles the NERD tree. I.e the NERD tree is open, it is closed, if it is +"closed it is restored or initialized (if it doesnt exist) +" +"Args: +"dir: the full path for the root node (is only used if the NERD tree is being +"initialized. +function! s:toggle(dir) + if s:treeExistsForTab() + if !s:isTreeOpen() + call s:createTreeWin() + if !&hidden + call s:renderView() + endif + call s:restoreScreenState() + else + call s:closeTree() + endif + else + call s:initNerdTree(a:dir) + endif +endfunction +"SECTION: Interface bindings {{{1 +"============================================================ +"FUNCTION: s:activateNode(forceKeepWindowOpen) {{{2 +"If the current node is a file, open it in the previous window (or a new one +"if the previous is modified). If it is a directory then it is opened. +" +"args: +"forceKeepWindowOpen - dont close the window even if NERDTreeQuitOnOpen is set +function! s:activateNode(forceKeepWindowOpen) + if getline(".") ==# s:tree_up_dir_line + return s:upDir(0) + endif + + let treenode = s:TreeFileNode.GetSelected() + if treenode != {} + call treenode.activate(a:forceKeepWindowOpen) + else + let bookmark = s:Bookmark.GetSelected() + if !empty(bookmark) + call bookmark.activate() + endif + endif +endfunction + +"FUNCTION: s:bindMappings() {{{2 +function! s:bindMappings() + " set up mappings and commands for this buffer + nnoremap :call handleMiddleMouse() + nnoremap :call checkForActivate() + nnoremap <2-leftmouse> :call activateNode(0) + + exec "nnoremap ". g:NERDTreeMapActivateNode . " :call activateNode(0)" + exec "nnoremap ". g:NERDTreeMapOpenSplit ." :call openEntrySplit(0,0)" + exec "nnoremap :call activateNode(0)" + + exec "nnoremap ". g:NERDTreeMapPreview ." :call previewNode(0)" + exec "nnoremap ". g:NERDTreeMapPreviewSplit ." :call previewNode(1)" + + exec "nnoremap ". g:NERDTreeMapOpenVSplit ." :call openEntrySplit(1,0)" + exec "nnoremap ". g:NERDTreeMapPreviewVSplit ." :call previewNode(2)" + + exec "nnoremap ". g:NERDTreeMapOpenRecursively ." :call openNodeRecursively()" + + exec "nnoremap ". g:NERDTreeMapUpdirKeepOpen ." :call upDir(1)" + exec "nnoremap ". g:NERDTreeMapUpdir ." :call upDir(0)" + exec "nnoremap ". g:NERDTreeMapChangeRoot ." :call chRoot()" + + exec "nnoremap ". g:NERDTreeMapChdir ." :call chCwd()" + + exec "nnoremap ". g:NERDTreeMapQuit ." :call closeTreeWindow()" + + exec "nnoremap ". g:NERDTreeMapRefreshRoot ." :call refreshRoot()" + exec "nnoremap ". g:NERDTreeMapRefresh ." :call refreshCurrent()" + + exec "nnoremap ". g:NERDTreeMapHelp ." :call displayHelp()" + exec "nnoremap ". g:NERDTreeMapToggleZoom ." :call toggleZoom()" + exec "nnoremap ". g:NERDTreeMapToggleHidden ." :call toggleShowHidden()" + exec "nnoremap ". g:NERDTreeMapToggleFilters ." :call toggleIgnoreFilter()" + exec "nnoremap ". g:NERDTreeMapToggleFiles ." :call toggleShowFiles()" + exec "nnoremap ". g:NERDTreeMapToggleBookmarks ." :call toggleShowBookmarks()" + + exec "nnoremap ". g:NERDTreeMapCloseDir ." :call closeCurrentDir()" + exec "nnoremap ". g:NERDTreeMapCloseChildren ." :call closeChildren()" + + exec "nnoremap ". g:NERDTreeMapMenu ." :call showMenu()" + + exec "nnoremap ". g:NERDTreeMapJumpParent ." :call jumpToParent()" + exec "nnoremap ". g:NERDTreeMapJumpNextSibling ." :call jumpToSibling(1)" + exec "nnoremap ". g:NERDTreeMapJumpPrevSibling ." :call jumpToSibling(0)" + exec "nnoremap ". g:NERDTreeMapJumpFirstChild ." :call jumpToFirstChild()" + exec "nnoremap ". g:NERDTreeMapJumpLastChild ." :call jumpToLastChild()" + exec "nnoremap ". g:NERDTreeMapJumpRoot ." :call jumpToRoot()" + + exec "nnoremap ". g:NERDTreeMapOpenInTab ." :call openInNewTab(0)" + exec "nnoremap ". g:NERDTreeMapOpenInTabSilent ." :call openInNewTab(1)" + + exec "nnoremap ". g:NERDTreeMapOpenExpl ." :call openExplorer()" + + exec "nnoremap ". g:NERDTreeMapDeleteBookmark ." :call deleteBookmark()" + + "bind all the user custom maps + call s:KeyMap.BindAll() + + command! -buffer -nargs=? Bookmark :call bookmarkNode('') + command! -buffer -complete=customlist,s:completeBookmarks -nargs=1 RevealBookmark :call revealBookmark('') + command! -buffer -complete=customlist,s:completeBookmarks -nargs=1 OpenBookmark :call openBookmark('') + command! -buffer -complete=customlist,s:completeBookmarks -nargs=* ClearBookmarks call clearBookmarks('') + command! -buffer -complete=customlist,s:completeBookmarks -nargs=+ BookmarkToRoot call s:Bookmark.ToRoot('') + command! -buffer -nargs=0 ClearAllBookmarks call s:Bookmark.ClearAll() call renderView() + command! -buffer -nargs=0 ReadBookmarks call s:Bookmark.CacheBookmarks(0) call renderView() + command! -buffer -nargs=0 WriteBookmarks call s:Bookmark.Write() +endfunction + +" FUNCTION: s:bookmarkNode(name) {{{2 +" Associate the current node with the given name +function! s:bookmarkNode(...) + let currentNode = s:TreeFileNode.GetSelected() + if currentNode != {} + let name = a:1 + if empty(name) + let name = currentNode.path.getLastPathComponent(0) + endif + try + call currentNode.bookmark(name) + call s:renderView() + catch /^NERDTree.IllegalBookmarkNameError/ + call s:echo("bookmark names must not contain spaces") + endtry + else + call s:echo("select a node first") + endif +endfunction +"FUNCTION: s:checkForActivate() {{{2 +"Checks if the click should open the current node, if so then activate() is +"called (directories are automatically opened if the symbol beside them is +"clicked) +function! s:checkForActivate() + let currentNode = s:TreeFileNode.GetSelected() + if currentNode != {} + let startToCur = strpart(getline(line(".")), 0, col(".")) + + if currentNode.path.isDirectory + if startToCur =~# s:tree_markup_reg . '$' && startToCur =~# '[+~▾▸]$' + call s:activateNode(0) + return + endif + endif + + if (g:NERDTreeMouseMode ==# 2 && currentNode.path.isDirectory) || g:NERDTreeMouseMode ==# 3 + let char = strpart(startToCur, strlen(startToCur)-1, 1) + if char !~# s:tree_markup_reg + call s:activateNode(0) + return + endif + endif + endif +endfunction + +" FUNCTION: s:chCwd() {{{2 +function! s:chCwd() + let treenode = s:TreeFileNode.GetSelected() + if treenode ==# {} + call s:echo("Select a node first") + return + endif + + try + call treenode.path.changeToDir() + catch /^NERDTree.PathChangeError/ + call s:echoWarning("could not change cwd") + endtry +endfunction + +" FUNCTION: s:chRoot() {{{2 +" changes the current root to the selected one +function! s:chRoot() + let treenode = s:TreeFileNode.GetSelected() + if treenode ==# {} + call s:echo("Select a node first") + return + endif + + call treenode.makeRoot() + call s:renderView() + call b:NERDTreeRoot.putCursorHere(0, 0) +endfunction + +" FUNCTION: s:clearBookmarks(bookmarks) {{{2 +function! s:clearBookmarks(bookmarks) + if a:bookmarks ==# '' + let currentNode = s:TreeFileNode.GetSelected() + if currentNode != {} + call currentNode.clearBoomarks() + endif + else + for name in split(a:bookmarks, ' ') + let bookmark = s:Bookmark.BookmarkFor(name) + call bookmark.delete() + endfor + endif + call s:renderView() +endfunction +" FUNCTION: s:closeChildren() {{{2 +" closes all childnodes of the current node +function! s:closeChildren() + let currentNode = s:TreeDirNode.GetSelected() + if currentNode ==# {} + call s:echo("Select a node first") + return + endif + + call currentNode.closeChildren() + call s:renderView() + call currentNode.putCursorHere(0, 0) +endfunction +" FUNCTION: s:closeCurrentDir() {{{2 +" closes the parent dir of the current node +function! s:closeCurrentDir() + let treenode = s:TreeFileNode.GetSelected() + if treenode ==# {} + call s:echo("Select a node first") + return + endif + + let parent = treenode.parent + if parent ==# {} || parent.isRoot() + call s:echo("cannot close tree root") + else + call treenode.parent.close() + call s:renderView() + call treenode.parent.putCursorHere(0, 0) + endif +endfunction +" FUNCTION: s:closeTreeWindow() {{{2 +" close the tree window +function! s:closeTreeWindow() + if b:NERDTreeType ==# "secondary" && b:NERDTreePreviousBuf != -1 + exec "buffer " . b:NERDTreePreviousBuf + else + if winnr("$") > 1 + call s:closeTree() + else + call s:echo("Cannot close last window") + endif + endif +endfunction +" FUNCTION: s:deleteBookmark() {{{2 +" if the cursor is on a bookmark, prompt to delete +function! s:deleteBookmark() + let bookmark = s:Bookmark.GetSelected() + if bookmark ==# {} + call s:echo("Put the cursor on a bookmark") + return + endif + + echo "Are you sure you wish to delete the bookmark:\n\"" . bookmark.name . "\" (yN):" + + if nr2char(getchar()) ==# 'y' + try + call bookmark.delete() + call s:renderView() + redraw + catch /^NERDTree/ + call s:echoWarning("Could not remove bookmark") + endtry + else + call s:echo("delete aborted" ) + endif + +endfunction + +" FUNCTION: s:displayHelp() {{{2 +" toggles the help display +function! s:displayHelp() + let b:treeShowHelp = b:treeShowHelp ? 0 : 1 + call s:renderView() + call s:centerView() +endfunction + +" FUNCTION: s:handleMiddleMouse() {{{2 +function! s:handleMiddleMouse() + let curNode = s:TreeFileNode.GetSelected() + if curNode ==# {} + call s:echo("Put the cursor on a node first" ) + return + endif + + if curNode.path.isDirectory + call s:openExplorer() + else + call s:openEntrySplit(0,0) + endif +endfunction + + +" FUNCTION: s:jumpToFirstChild() {{{2 +" wrapper for the jump to child method +function! s:jumpToFirstChild() + call s:jumpToChild(0) +endfunction + +" FUNCTION: s:jumpToLastChild() {{{2 +" wrapper for the jump to child method +function! s:jumpToLastChild() + call s:jumpToChild(1) +endfunction + +" FUNCTION: s:jumpToParent() {{{2 +" moves the cursor to the parent of the current node +function! s:jumpToParent() + let currentNode = s:TreeFileNode.GetSelected() + if !empty(currentNode) + if !empty(currentNode.parent) + call currentNode.parent.putCursorHere(1, 0) + call s:centerView() + else + call s:echo("cannot jump to parent") + endif + else + call s:echo("put the cursor on a node first") + endif +endfunction + +" FUNCTION: s:jumpToRoot() {{{2 +" moves the cursor to the root node +function! s:jumpToRoot() + call b:NERDTreeRoot.putCursorHere(1, 0) + call s:centerView() +endfunction + +" FUNCTION: s:jumpToSibling() {{{2 +" moves the cursor to the sibling of the current node in the given direction +" +" Args: +" forward: 1 if the cursor should move to the next sibling, 0 if it should +" move back to the previous sibling +function! s:jumpToSibling(forward) + let currentNode = s:TreeFileNode.GetSelected() + if !empty(currentNode) + let sibling = currentNode.findSibling(a:forward) + + if !empty(sibling) + call sibling.putCursorHere(1, 0) + call s:centerView() + endif + else + call s:echo("put the cursor on a node first") + endif +endfunction + +" FUNCTION: s:openBookmark(name) {{{2 +" put the cursor on the given bookmark and, if its a file, open it +function! s:openBookmark(name) + try + let targetNode = s:Bookmark.GetNodeForName(a:name, 0) + call targetNode.putCursorHere(0, 1) + redraw! + catch /^NERDTree.BookmarkedNodeNotFoundError/ + call s:echo("note - target node is not cached") + let bookmark = s:Bookmark.BookmarkFor(a:name) + let targetNode = s:TreeFileNode.New(bookmark.path) + endtry + if targetNode.path.isDirectory + call targetNode.openExplorer() + else + call targetNode.open() + endif +endfunction +" FUNCTION: s:openEntrySplit(vertical, forceKeepWindowOpen) {{{2 +"Opens the currently selected file from the explorer in a +"new window +" +"args: +"forceKeepWindowOpen - dont close the window even if NERDTreeQuitOnOpen is set +function! s:openEntrySplit(vertical, forceKeepWindowOpen) + let treenode = s:TreeFileNode.GetSelected() + if treenode != {} + if a:vertical + call treenode.openVSplit() + else + call treenode.openSplit() + endif + if !a:forceKeepWindowOpen + call s:closeTreeIfQuitOnOpen() + endif + else + call s:echo("select a node first") + endif +endfunction + +" FUNCTION: s:openExplorer() {{{2 +function! s:openExplorer() + let treenode = s:TreeDirNode.GetSelected() + if treenode != {} + call treenode.openExplorer() + else + call s:echo("select a node first") + endif +endfunction + +" FUNCTION: s:openInNewTab(stayCurrentTab) {{{2 +" Opens the selected node or bookmark in a new tab +" Args: +" stayCurrentTab: if 1 then vim will stay in the current tab, if 0 then vim +" will go to the tab where the new file is opened +function! s:openInNewTab(stayCurrentTab) + let target = s:TreeFileNode.GetSelected() + if target == {} + let target = s:Bookmark.GetSelected() + endif + + if target != {} + call target.openInNewTab({'stayInCurrentTab': a:stayCurrentTab}) + endif +endfunction + +" FUNCTION: s:openNodeRecursively() {{{2 +function! s:openNodeRecursively() + let treenode = s:TreeFileNode.GetSelected() + if treenode ==# {} || treenode.path.isDirectory ==# 0 + call s:echo("Select a directory node first" ) + else + call s:echo("Recursively opening node. Please wait...") + call treenode.openRecursively() + call s:renderView() + redraw + call s:echo("Recursively opening node. Please wait... DONE") + endif + +endfunction + +"FUNCTION: s:previewNode() {{{2 +"Args: +" openNewWin: if 0, use the previous window, if 1 open in new split, if 2 +" open in a vsplit +function! s:previewNode(openNewWin) + let currentBuf = bufnr("") + if a:openNewWin > 0 + call s:openEntrySplit(a:openNewWin ==# 2,1) + else + call s:activateNode(1) + end + call s:exec(bufwinnr(currentBuf) . "wincmd w") +endfunction + +" FUNCTION: s:revealBookmark(name) {{{2 +" put the cursor on the node associate with the given name +function! s:revealBookmark(name) + try + let targetNode = s:Bookmark.GetNodeForName(a:name, 0) + call targetNode.putCursorHere(0, 1) + catch /^NERDTree.BookmarkNotFoundError/ + call s:echo("Bookmark isnt cached under the current root") + endtry +endfunction +" FUNCTION: s:refreshRoot() {{{2 +" Reloads the current root. All nodes below this will be lost and the root dir +" will be reloaded. +function! s:refreshRoot() + call s:echo("Refreshing the root node. This could take a while...") + call b:NERDTreeRoot.refresh() + call s:renderView() + redraw + call s:echo("Refreshing the root node. This could take a while... DONE") +endfunction + +" FUNCTION: s:refreshCurrent() {{{2 +" refreshes the root for the current node +function! s:refreshCurrent() + let treenode = s:TreeDirNode.GetSelected() + if treenode ==# {} + call s:echo("Refresh failed. Select a node first") + return + endif + + call s:echo("Refreshing node. This could take a while...") + call treenode.refresh() + call s:renderView() + redraw + call s:echo("Refreshing node. This could take a while... DONE") +endfunction +" FUNCTION: s:showMenu() {{{2 +function! s:showMenu() + let curNode = s:TreeFileNode.GetSelected() + if curNode ==# {} + call s:echo("Put the cursor on a node first" ) + return + endif + + let mc = s:MenuController.New(s:MenuItem.AllEnabled()) + call mc.showMenu() +endfunction + +" FUNCTION: s:toggleIgnoreFilter() {{{2 +" toggles the use of the NERDTreeIgnore option +function! s:toggleIgnoreFilter() + let b:NERDTreeIgnoreEnabled = !b:NERDTreeIgnoreEnabled + call s:renderViewSavingPosition() + call s:centerView() +endfunction + +" FUNCTION: s:toggleShowBookmarks() {{{2 +" toggles the display of bookmarks +function! s:toggleShowBookmarks() + let b:NERDTreeShowBookmarks = !b:NERDTreeShowBookmarks + if b:NERDTreeShowBookmarks + call s:renderView() + call s:putCursorOnBookmarkTable() + else + call s:renderViewSavingPosition() + endif + call s:centerView() +endfunction +" FUNCTION: s:toggleShowFiles() {{{2 +" toggles the display of hidden files +function! s:toggleShowFiles() + let b:NERDTreeShowFiles = !b:NERDTreeShowFiles + call s:renderViewSavingPosition() + call s:centerView() +endfunction + +" FUNCTION: s:toggleShowHidden() {{{2 +" toggles the display of hidden files +function! s:toggleShowHidden() + let b:NERDTreeShowHidden = !b:NERDTreeShowHidden + call s:renderViewSavingPosition() + call s:centerView() +endfunction + +" FUNCTION: s:toggleZoom() {{2 +" zoom (maximize/minimize) the NERDTree window +function! s:toggleZoom() + if exists("b:NERDTreeZoomed") && b:NERDTreeZoomed + let size = exists("b:NERDTreeOldWindowSize") ? b:NERDTreeOldWindowSize : g:NERDTreeWinSize + exec "silent vertical resize ". size + let b:NERDTreeZoomed = 0 + else + exec "vertical resize" + let b:NERDTreeZoomed = 1 + endif +endfunction + +"FUNCTION: s:upDir(keepState) {{{2 +"moves the tree up a level +" +"Args: +"keepState: 1 if the current root should be left open when the tree is +"re-rendered +function! s:upDir(keepState) + let cwd = b:NERDTreeRoot.path.str({'format': 'UI'}) + if cwd ==# "/" || cwd =~# '^[^/]..$' + call s:echo("already at top dir") + else + if !a:keepState + call b:NERDTreeRoot.close() + endif + + let oldRoot = b:NERDTreeRoot + + if empty(b:NERDTreeRoot.parent) + let path = b:NERDTreeRoot.path.getParent() + let newRoot = s:TreeDirNode.New(path) + call newRoot.open() + call newRoot.transplantChild(b:NERDTreeRoot) + let b:NERDTreeRoot = newRoot + else + let b:NERDTreeRoot = b:NERDTreeRoot.parent + endif + + if g:NERDTreeChDirMode ==# 2 + call b:NERDTreeRoot.path.changeToDir() + endif + + call s:renderView() + call oldRoot.putCursorHere(0, 0) + endif +endfunction + + +"reset &cpo back to users setting +let &cpo = s:old_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/vim/oldStyle/disabled_plugins/conque_term.vim b/vim/oldStyle/disabled_plugins/conque_term.vim new file mode 100644 index 0000000..3d2e59d --- /dev/null +++ b/vim/oldStyle/disabled_plugins/conque_term.vim @@ -0,0 +1,213 @@ +" FILE: plugin/conque_term.vim {{{ +" AUTHOR: Nico Raffo +" WEBSITE: http://conque.googlecode.com +" MODIFIED: 2011-08-12 +" VERSION: 2.2, for Vim 7.0 +" LICENSE: +" Conque - Vim terminal/console emulator +" Copyright (C) 2009-__YEAR__ Nico Raffo +" +" MIT License +" +" Permission is hereby granted, free of charge, to any person obtaining a copy +" of this software and associated documentation files (the "Software"), to deal +" in the Software without restriction, including without limitation the rights +" to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +" copies of the Software, and to permit persons to whom the Software is +" furnished to do so, subject to the following conditions: +" +" The above copyright notice and this permission notice shall be included in +" all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +" OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +" THE SOFTWARE. +" }}} + +" See docs/conque_term.txt for help or type :help ConqueTerm + +if exists('g:ConqueTerm_Loaded') || v:version < 700 + finish +endif + +" ********************************************************************************************************** +" **** CONFIGURATION *************************************************************************************** +" ********************************************************************************************************** + +" {{{ + +" Fast mode {{{ +" Disables all features which could cause Conque to run slowly, including: +" * Disables terminal colors +" * Disables some multi-byte character handling +if !exists('g:ConqueTerm_FastMode') + let g:ConqueTerm_FastMode = 0 +endif " }}} + +" automatically go into insert mode when entering buffer {{{ +if !exists('g:ConqueTerm_InsertOnEnter') + let g:ConqueTerm_InsertOnEnter = 0 +endif " }}} + +" Allow user to use keys to switch window in insert mode. {{{ +if !exists('g:ConqueTerm_CWInsert') + let g:ConqueTerm_CWInsert = 0 +endif " }}} + +" Choose key mapping to leave insert mode {{{ +" If you choose something other than '', then will be sent to terminal +" Using a different key will usually fix Alt/Meta key issues +if !exists('g:ConqueTerm_EscKey') + let g:ConqueTerm_EscKey = '' +endif " }}} + +" Use this key to execute the current file in a split window. {{{ +" THIS IS A GLOBAL KEY MAPPING +if !exists('g:ConqueTerm_ExecFileKey') + let g:ConqueTerm_ExecFileKey = '' +endif " }}} + +" Use this key to send the current file contents to conque. {{{ +" THIS IS A GLOBAL KEY MAPPING +if !exists('g:ConqueTerm_SendFileKey') + let g:ConqueTerm_SendFileKey = '' +endif " }}} + +" Use this key to send selected text to conque. {{{ +" THIS IS A GLOBAL KEY MAPPING +if !exists('g:ConqueTerm_SendVisKey') + let g:ConqueTerm_SendVisKey = '' +endif " }}} + +" Use this key to toggle terminal key mappings. {{{ +" Only mapped inside of Conque buffers. +if !exists('g:ConqueTerm_ToggleKey') + let g:ConqueTerm_ToggleKey = '' +endif " }}} + +" Enable color. {{{ +" If your apps use a lot of color it will slow down the shell. +" 0 - no terminal colors. You still will see Vim syntax highlighting. +" 1 - limited terminal colors (recommended). Past terminal color history cleared regularly. +" 2 - all terminal colors. Terminal color history never cleared. +if !exists('g:ConqueTerm_Color') + let g:ConqueTerm_Color = 1 +endif " }}} + +" Color mode. Windows ONLY {{{ +" Set this variable to 'conceal' to use Vim's conceal mode for terminal colors. +" This makes colors render much faster, but has some odd baggage. +if !exists('g:ConqueTerm_ColorMode') + let g:ConqueTerm_ColorMode = '' +endif " }}} + +" TERM environment setting {{{ +if !exists('g:ConqueTerm_TERM') + let g:ConqueTerm_TERM = 'vt100' +endif " }}} + +" Syntax for your buffer {{{ +if !exists('g:ConqueTerm_Syntax') + let g:ConqueTerm_Syntax = 'conque_term' +endif " }}} + +" Keep on updating the shell window after you've switched to another buffer {{{ +if !exists('g:ConqueTerm_ReadUnfocused') + let g:ConqueTerm_ReadUnfocused = 0 +endif " }}} + +" Use this regular expression to highlight prompt {{{ +if !exists('g:ConqueTerm_PromptRegex') + let g:ConqueTerm_PromptRegex = '^\w\+@[0-9A-Za-z_.-]\+:[0-9A-Za-z_./\~,:-]\+\$' +endif " }}} + +" Choose which Python version to attempt to load first {{{ +" Valid values are 2, 3 or 0 (no preference) +if !exists('g:ConqueTerm_PyVersion') + let g:ConqueTerm_PyVersion = 2 +endif " }}} + +" Path to python.exe. (Windows only) {{{ +" By default, Conque will check C:\PythonNN\python.exe then will search system path +" If you have installed Python in an unusual location and it's not in your path, fill in the full path below +" E.g. 'C:\Program Files\Python\Python27\python.exe' +if !exists('g:ConqueTerm_PyExe') + let g:ConqueTerm_PyExe = '' +endif " }}} + +" Automatically close buffer when program exits {{{ +if !exists('g:ConqueTerm_CloseOnEnd') + let g:ConqueTerm_CloseOnEnd = 0 +endif " }}} + +" Send function key presses to terminal {{{ +if !exists('g:ConqueTerm_SendFunctionKeys') + let g:ConqueTerm_SendFunctionKeys = 0 +endif " }}} + +" Session support {{{ +if !exists('g:ConqueTerm_SessionSupport') + let g:ConqueTerm_SessionSupport = 0 +endif " }}} + +" hide Conque startup messages {{{ +" messages should only appear the first 3 times you start Vim with a new version of Conque +" and include important Conque feature and option descriptions +" TODO - disabled and unused for now +if !exists('g:ConqueTerm_StartMessages') + let g:ConqueTerm_StartMessages = 1 +endif " }}} + +" Windows character code page {{{ +" Leave at 0 to use current environment code page. +" Use 65001 for utf-8, although many console apps do not support it. +if !exists('g:ConqueTerm_CodePage') + let g:ConqueTerm_CodePage = 0 +endif " }}} + +" InsertCharPre support {{{ +" Disable this feature by default, still in Beta +if !exists('g:ConqueTerm_InsertCharPre') + let g:ConqueTerm_InsertCharPre = 0 +endif " }}} + +" }}} + +" ********************************************************************************************************** +" **** Startup ********************************************************************************************* +" ********************************************************************************************************** + +" Startup {{{ + +let g:ConqueTerm_Loaded = 1 +let g:ConqueTerm_Idx = 0 +let g:ConqueTerm_Version = 210 + +command! -nargs=+ -complete=shellcmd ConqueTerm call conque_term#open() +command! -nargs=+ -complete=shellcmd ConqueTermSplit call conque_term#open(, ['belowright split']) +command! -nargs=+ -complete=shellcmd ConqueTermVSplit call conque_term#open(, ['belowright vsplit']) +command! -nargs=+ -complete=shellcmd ConqueTermTab call conque_term#open(, ['tabnew']) + +" }}} + +" ********************************************************************************************************** +" **** Global Mappings & Autocommands ********************************************************************** +" ********************************************************************************************************** + +" Startup {{{ + +if exists('g:ConqueTerm_SessionSupport') && g:ConqueTerm_SessionSupport == 1 + autocmd SessionLoadPost * call conque_term#resume_session() +endif + +if maparg(g:ConqueTerm_ExecFileKey, 'n') == '' + exe 'nnoremap ' . g:ConqueTerm_ExecFileKey . ' :call conque_term#exec_file()' +endif + +" }}} + +" vim:foldmethod=marker diff --git a/vim/plugin/jsbeautify.vim b/vim/oldStyle/disabled_plugins/jsbeautify.vim similarity index 100% rename from vim/plugin/jsbeautify.vim rename to vim/oldStyle/disabled_plugins/jsbeautify.vim diff --git a/vim/oldStyle/disabled_plugins/open_terminal.vim b/vim/oldStyle/disabled_plugins/open_terminal.vim new file mode 100644 index 0000000..e09dd8d --- /dev/null +++ b/vim/oldStyle/disabled_plugins/open_terminal.vim @@ -0,0 +1,108 @@ +" +" File: open_terminal.vim +" +" Requires: +" platform Terminal File manager +" Mac Terminal.app Finder +" (with Applescript) +" Gnome gnome-terminal nautilus +" KDE konsole konqueror +" Windows cmd explorer +" (with start) +" cygwin bash explorer +" +" Example: +" nnoremap :OpenTerminal +" nnoremap :OpenFilemanager +" +" Commands: +" OpenTerminal +" OpenFilemanager +" + +" OpenTerminal {{{1 +function! s:open_terminal() + let l:current_dir = getcwd() + execute("chdir " . escape(expand("%:p:h"), " \"'")) + + if has("mac") + let l:cmd = " + \ tell application 'System Events' \n + \ set is_term_running to exists application process '$Terminal' \n + \ end tell \n + \ + \ set cmd to 'cd $current_path' \n + \ tell application '$Terminal' \n + \ activate \n + \ if is_term_running is true then \n + \ do script with command cmd \n + \ else \n + \ do script with command cmd in window 1 \n + \ end if \n + \ end tell \n + \ " + let l:cmd = substitute(l:cmd, "'", '\\"', 'g') + let l:cmd = substitute( l:cmd, "$Terminal", "Terminal", "g" ) + let l:cmd = substitute( l:cmd, "$current_path", "'" . expand("%:p:h") . "'" , "g") + call system('osascript -e " ' . l:cmd . '"') + + elseif has("gui_gnome") && executable("gnome-terminal") + call system("gnome-terminal &") + elseif has("gui_gnome") && executable("konsole") + call system("konsole &") + elseif has("gui_win32") + try + call system("start cmd") + catch /E484:/ + echo "Ignore E484 error in Windows platform" + endtry + elseif executable("bash") + !bash + elseif has("win32") + stop + endif + + execute("chdir " . escape(l:current_dir, " \"'")) +endfunction + +command! -nargs=0 -bar OpenTerminal call s:open_terminal() + +"}}}1 + +" OpenFilemanager {{{1 +function! s:open_filemanager() + let l:cmd = "$cmd ." + + let l:current_dir = getcwd() + execute("chdir " . escape(expand("%:p:h"), " \"'")) + + if has("mac") + call system("open .") + elseif has("gui_gnome") && executable("nautilus") + call system("nautilus .") + elseif has("gui_gnome") && executable("konqueror") + call system("konqueror .") + elseif has("gui_win32") || has("win32") + call system("explorer .") + elseif executable("bash") + !bash + endif + + execute("chdir " . escape(l:current_dir, " \"'")) +endfunction + +command! -nargs=0 -bar OpenFilemanager call s:open_filemanager() +" }}}1 + +" About file info {{{1 +"============================================================================= +" Copyright (c) 2009 by neocoin +" File: open_terminal.vim +" Author: Sangmin Ryu (neocoin@gmail.com) +" Date: Tue Dec 22 13:33:32 PST 2009 +" License: The MIT License +" Version: 0.1 +"============================================================================= +" }}}1 + +" vim: set fdm=marker: diff --git a/vim/plugin/skeleton.vim b/vim/oldStyle/disabled_plugins/skeleton.vim similarity index 100% rename from vim/plugin/skeleton.vim rename to vim/oldStyle/disabled_plugins/skeleton.vim diff --git a/vim/plugin/taglist.vim b/vim/oldStyle/disabled_plugins/taglist.vim similarity index 100% rename from vim/plugin/taglist.vim rename to vim/oldStyle/disabled_plugins/taglist.vim diff --git a/vim/oldStyle/disabled_plugins/textformat.vim b/vim/oldStyle/disabled_plugins/textformat.vim new file mode 100644 index 0000000..b186c5d --- /dev/null +++ b/vim/oldStyle/disabled_plugins/textformat.vim @@ -0,0 +1,66 @@ +" Text formatter plugin for Vim text editor +" +" Version: 2.1 +" Last Change: 2008-09-13 +" Maintainer: Teemu Likonen +" License: This file is placed in the public domain. +" GetLatestVimScripts: 2324 1 :AutoInstall: TextFormat + +"{{{1 The beginning stuff +if &compatible || exists('g:loaded_textformat') + finish +endif +let s:save_cpo = &cpo +set cpo&vim +"}}}1 + +if v:version < 700 + echohl ErrorMsg + echomsg 'TextFormat plugin needs Vim version 7.0 or later. Sorry.' + echohl None + finish +endif + +if !exists(':AlignLeft') + command -nargs=? -range AlignLeft ,call textformat#Align_Command('left',) +endif +if !exists(':AlignRight') + command -nargs=? -range AlignRight ,call textformat#Align_Command('right',) +endif +if !exists(':AlignJustify') + command -nargs=? -range AlignJustify ,call textformat#Align_Command('justify',) +endif +if !exists(':AlignCenter') + command -nargs=? -range AlignCenter ,call textformat#Align_Command('center',) +endif + +nnoremap Quick_Align_Paragraph_Left :call textformat#Quick_Align_Left() +nnoremap Quick_Align_Paragraph_Right :call textformat#Quick_Align_Right() +nnoremap Quick_Align_Paragraph_Justify :call textformat#Quick_Align_Justify() +nnoremap Quick_Align_Paragraph_Center :call textformat#Quick_Align_Center() + +vnoremap Align_Range_Left :call textformat#Visual_Align_Left() +vnoremap Align_Range_Right :call textformat#Visual_Align_Right() +vnoremap Align_Range_Justify :call textformat#Visual_Align_Justify() +vnoremap Align_Range_Center :call textformat#Visual_Align_Center() + +function! s:Add_Mapping(mode, lhs, rhs) + if maparg(a:lhs, a:mode) == '' && !hasmapto(a:rhs, a:mode) + execute a:mode.'map '.a:lhs.' '.a:rhs + endif +endfunction + +call s:Add_Mapping('n', 'al', 'Quick_Align_Paragraph_Left') +call s:Add_Mapping('n', 'ar', 'Quick_Align_Paragraph_Right') +call s:Add_Mapping('n', 'aj', 'Quick_Align_Paragraph_Justify') +call s:Add_Mapping('n', 'ac', 'Quick_Align_Paragraph_Center') + +call s:Add_Mapping('v', 'al', 'Align_Range_Left') +call s:Add_Mapping('v', 'ar', 'Align_Range_Right') +call s:Add_Mapping('v', 'aj', 'Align_Range_Justify') +call s:Add_Mapping('v', 'ac', 'Align_Range_Center') + +delfunction s:Add_Mapping +let g:loaded_textformat = 1 +let &cpo = s:save_cpo +" vim600: fdm=marker diff --git a/vim/oldStyle/disabled_plugins/vcsbzr.vim b/vim/oldStyle/disabled_plugins/vcsbzr.vim new file mode 100644 index 0000000..2e9c53b --- /dev/null +++ b/vim/oldStyle/disabled_plugins/vcsbzr.vim @@ -0,0 +1,264 @@ +" vim600: set foldmethod=marker: +" +" BZR extension for VCSCommand. +" +" Maintainer: Bob Hiestand +" License: +" Copyright (c) Bob Hiestand +" +" Permission is hereby granted, free of charge, to any person obtaining a copy +" of this software and associated documentation files (the "Software"), to +" deal in the Software without restriction, including without limitation the +" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +" sell copies of the Software, and to permit persons to whom the Software is +" furnished to do so, subject to the following conditions: +" +" The above copyright notice and this permission notice shall be included in +" all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +" IN THE SOFTWARE. +" +" Section: Documentation {{{1 +" +" Options documentation: {{{2 +" +" VCSCommandBZRExec +" This variable specifies the BZR executable. If not set, it defaults to +" 'bzr' executed from the user's executable path. + +" Section: Plugin header {{{1 + +if exists('VCSCommandDisableAll') + finish +endif + +if v:version < 700 + echohl WarningMsg|echomsg 'VCSCommand requires at least VIM 7.0'|echohl None + finish +endif + +if !exists('g:loaded_VCSCommand') + runtime plugin/vcscommand.vim +endif + +if !executable(VCSCommandGetOption('VCSCommandBZRExec', 'bzr')) + " BZR is not installed + finish +endif + +let s:save_cpo=&cpo +set cpo&vim + +" Section: Variable initialization {{{1 + +let s:bzrFunctions = {} + +" Section: Utility functions {{{1 + +" Function: s:Executable() {{{2 +" Returns the executable used to invoke bzr suitable for use in a shell +" command. +function! s:Executable() + return shellescape(VCSCommandGetOption('VCSCommandBZRExec', 'bzr')) +endfunction + +" Function: s:DoCommand(cmd, cmdName, statusText) {{{2 +" Wrapper to VCSCommandDoCommand to add the name of the BZR executable to the +" command argument. +function! s:DoCommand(cmd, cmdName, statusText, options) + if VCSCommandGetVCSType(expand('%')) == 'BZR' + let fullCmd = s:Executable() . ' ' . a:cmd + return VCSCommandDoCommand(fullCmd, a:cmdName, a:statusText, a:options) + else + throw 'BZR VCSCommand plugin called on non-BZR item.' + endif +endfunction + +" Section: VCS function implementations {{{1 + +" Function: s:bzrFunctions.Identify(buffer) {{{2 +function! s:bzrFunctions.Identify(buffer) + let fileName = resolve(bufname(a:buffer)) + let l:save_bzr_log=$BZR_LOG + try + let $BZR_LOG=has("win32") || has("win95") || has("win64") || has("win16") ? "nul" : "/dev/null" + let statusText = s:VCSCommandUtility.system(s:Executable() . ' info -- "' . fileName . '"') + finally + let $BZR_LOG=l:save_bzr_log + endtry + if(v:shell_error) + return 0 + else + return 1 + endif +endfunction + +" Function: s:bzrFunctions.Add() {{{2 +function! s:bzrFunctions.Add(argList) + return s:DoCommand(join(['add'] + a:argList, ' '), 'add', join(a:argList, ' '), {}) +endfunction + +" Function: s:bzrFunctions.Annotate(argList) {{{2 +function! s:bzrFunctions.Annotate(argList) + if len(a:argList) == 0 + if &filetype ==? 'bzrannotate' + " Perform annotation of the version indicated by the current line. + let caption = matchstr(getline('.'),'\v^\s+\zs\d+') + let options = ' -r' . caption + else + let caption = '' + let options = '' + endif + elseif len(a:argList) == 1 && a:argList[0] !~ '^-' + let caption = a:argList[0] + let options = ' -r' . caption + else + let caption = join(a:argList, ' ') + let options = ' ' . caption + endif + + let resultBuffer = s:DoCommand('blame' . options, 'annotate', caption, {}) + if resultBuffer > 0 + normal! 1G2dd + endif + return resultBuffer +endfunction + +" Function: s:bzrFunctions.Commit(argList) {{{2 +function! s:bzrFunctions.Commit(argList) + let resultBuffer = s:DoCommand('commit -F "' . a:argList[0] . '"', 'commit', '', {}) + if resultBuffer == 0 + echomsg 'No commit needed.' + endif +endfunction + +" Function: s:bzrFunctions.Delete() {{{2 +function! s:bzrFunctions.Delete(argList) + return s:DoCommand(join(['rm'] + a:argList, ' '), 'rm', join(a:argList, ' '), {}) +endfunction + +" Function: s:bzrFunctions.Diff(argList) {{{2 +function! s:bzrFunctions.Diff(argList) + if len(a:argList) == 0 + let revOptions = [] + let caption = '' + elseif len(a:argList) <= 2 && match(a:argList, '^-') == -1 + let revOptions = ['-r' . join(a:argList, '..')] + let caption = '(' . a:argList[0] . ' : ' . get(a:argList, 1, 'current') . ')' + else + " Pass-through + let caption = join(a:argList, ' ') + let revOptions = a:argList + endif + + return s:DoCommand(join(['diff'] + revOptions), 'diff', caption, {'allowNonZeroExit': 1}) +endfunction + +" Function: s:bzrFunctions.GetBufferInfo() {{{2 +" Provides version control details for the current file. Current version +" number and current repository version number are required to be returned by +" the vcscommand plugin. +" Returns: List of results: [revision, repository] + +function! s:bzrFunctions.GetBufferInfo() + let originalBuffer = VCSCommandGetOriginalBuffer(bufnr('%')) + let fileName = resolve(bufname(originalBuffer)) + let statusText = s:VCSCommandUtility.system(s:Executable() . ' status -S -- "' . fileName . '"') + let revision = s:VCSCommandUtility.system(s:Executable() . ' revno -- "' . fileName . '"') + if(v:shell_error) + return [] + endif + + " File not under BZR control. + if statusText =~ '^?' + return ['Unknown'] + endif + + let [flags, repository] = matchlist(statusText, '^\(.\{3}\)\s\+\(\S\+\)')[1:2] + if revision == '' + " Error + return ['Unknown'] + elseif flags =~ '^A' + return ['New', 'New'] + else + return [revision, repository] + endif +endfunction + +" Function: s:bzrFunctions.Info(argList) {{{2 +function! s:bzrFunctions.Info(argList) + return s:DoCommand(join(['version-info'] + a:argList, ' '), 'version-info', join(a:argList, ' '), {}) +endfunction + +" Function: s:bzrFunctions.Lock(argList) {{{2 +function! s:bzrFunctions.Lock(argList) + echomsg 'bzr lock is not necessary' +endfunction + +" Function: s:bzrFunctions.Log() {{{2 +function! s:bzrFunctions.Log(argList) + if len(a:argList) == 0 + let options = [] + let caption = '' + elseif len(a:argList) <= 2 && match(a:argList, '^-') == -1 + let options = ['-r' . join(a:argList, ':')] + let caption = options[0] + else + " Pass-through + let options = a:argList + let caption = join(a:argList, ' ') + endif + + let resultBuffer = s:DoCommand(join(['log', '-v'] + options), 'log', caption, {}) + return resultBuffer +endfunction + +" Function: s:bzrFunctions.Revert(argList) {{{2 +function! s:bzrFunctions.Revert(argList) + return s:DoCommand('revert', 'revert', '', {}) +endfunction + +" Function: s:bzrFunctions.Review(argList) {{{2 +function! s:bzrFunctions.Review(argList) + if len(a:argList) == 0 + let versiontag = '(current)' + let versionOption = '' + else + let versiontag = a:argList[0] + let versionOption = ' -r ' . versiontag . ' ' + endif + + return s:DoCommand('cat' . versionOption, 'review', versiontag, {}) +endfunction + +" Function: s:bzrFunctions.Status(argList) {{{2 +function! s:bzrFunctions.Status(argList) + let options = ['-S'] + if len(a:argList) != 0 + let options = a:argList + endif + return s:DoCommand(join(['status'] + options, ' '), 'status', join(options, ' '), {}) +endfunction + +" Function: s:bzrFunctions.Unlock(argList) {{{2 +function! s:bzrFunctions.Unlock(argList) + echomsg 'bzr unlock is not necessary' +endfunction +" Function: s:bzrFunctions.Update(argList) {{{2 +function! s:bzrFunctions.Update(argList) + return s:DoCommand('update', 'update', '', {}) +endfunction + +" Annotate setting {{{2 +let s:bzrFunctions.AnnotateSplitRegex = '^[^|]\+ | ' + +" Section: Plugin Registration {{{1 +let s:VCSCommandUtility = VCSCommandRegisterModule('BZR', expand(''), s:bzrFunctions, []) + +let &cpo = s:save_cpo diff --git a/vim/oldStyle/disabled_plugins/vcscommand.vim b/vim/oldStyle/disabled_plugins/vcscommand.vim new file mode 100644 index 0000000..f95d10c --- /dev/null +++ b/vim/oldStyle/disabled_plugins/vcscommand.vim @@ -0,0 +1,1518 @@ +" vim600: set foldmethod=marker: +" +" Vim plugin to assist in working with files under control of various Version +" Control Systems, such as CVS, SVN, SVK, and git. +" +" Maintainer: Bob Hiestand +" License: +" Copyright (c) Bob Hiestand +" +" Permission is hereby granted, free of charge, to any person obtaining a copy +" of this software and associated documentation files (the "Software"), to +" deal in the Software without restriction, including without limitation the +" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +" sell copies of the Software, and to permit persons to whom the Software is +" furnished to do so, subject to the following conditions: +" +" The above copyright notice and this permission notice shall be included in +" all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +" IN THE SOFTWARE. +" +" Section: Documentation {{{1 +" +" Provides functions to invoke various source control commands on the current +" file (either the current buffer, or, in the case of an directory buffer, the +" directory and all subdirectories associated with the current buffer). The +" output of the commands is captured in a new scratch window. +" +" This plugin needs additional extension plugins, each specific to a source +" control system, to function. Several options include the name of the +" version control system in the option name. Such options use the placeholder +" text '{VCSType}', which would be replaced in actual usage with 'CVS' or +" 'SVN', for instance. +" +" Command documentation {{{2 +" +" VCSAdd Adds the current file to source control. +" +" VCSAnnotate[!] Displays the current file with each line annotated with the +" version in which it was most recently changed. If an +" argument is given, the argument is used as a revision +" number to display. If not given an argument, it uses the +" most recent version of the file on the current branch. +" Additionally, if the current buffer is a VCSAnnotate buffer +" already, the version number on the current line is used. +" +" If '!' is used, the view of the annotated buffer is split +" so that the annotation is in a separate window from the +" content, and each is highlighted separately. +" +" VCSBlame Alias for 'VCSAnnotate'. +" +" VCSCommit[!] Commits changes to the current file to source control. +" +" If called with arguments, the arguments are the log message. +" +" If '!' is used, an empty log message is committed. +" +" If called with no arguments, this is a two-step command. +" The first step opens a buffer to accept a log message. +" When that buffer is written, it is automatically closed and +" the file is committed using the information from that log +" message. The commit can be abandoned if the log message +" buffer is deleted or wiped before being written. +" +" VCSDelete Deletes the current file and removes it from source control. +" +" VCSDiff With no arguments, this displays the differences between +" the current file and its parent version under source +" control in a new scratch buffer. +" +" With one argument, the diff is performed on the +" current file against the specified revision. +" +" With two arguments, the diff is performed between the +" specified revisions of the current file. +" +" This command uses the 'VCSCommand{VCSType}DiffOpt' variable +" to specify diff options. If that variable does not exist, +" a plugin-specific default is used. If you wish to have no +" options, then set it to the empty string. +" +" VCSGotoOriginal Jumps to the source buffer if the current buffer is a VCS +" scratch buffer. If VCSGotoOriginal[!] is used, remove all +" VCS scratch buffers associated with the original file. +" +" VCSInfo Displays extended information about the current file in a +" new scratch buffer. +" +" VCSLock Locks the current file in order to prevent other users from +" concurrently modifying it. The exact semantics of this +" command depend on the underlying VCS. +" +" VCSLog Displays the version history of the current file in a new +" scratch buffer. +" +" VCSRemove Alias for 'VCSDelete'. +" +" VCSRevert Replaces the modified version of the current file with the +" most recent version from the repository. +" +" VCSReview Displays a particular version of the current file in a new +" scratch buffer. If no argument is given, the most recent +" version of the file on the current branch is retrieved. +" +" VCSStatus Displays versioning information about the current file in a +" new scratch buffer. +" +" VCSUnlock Unlocks the current file in order to allow other users from +" concurrently modifying it. The exact semantics of this +" command depend on the underlying VCS. +" +" VCSUpdate Updates the current file with any relevant changes from the +" repository. +" +" VCSVimDiff Uses vimdiff to display differences between versions of the +" current file. +" +" If no revision is specified, the most recent version of the +" file on the current branch is used. With one argument, +" that argument is used as the revision as above. With two +" arguments, the differences between the two revisions is +" displayed using vimdiff. +" +" With either zero or one argument, the original buffer is +" used to perform the vimdiff. When the scratch buffer is +" closed, the original buffer will be returned to normal +" mode. +" +" Once vimdiff mode is started using the above methods, +" additional vimdiff buffers may be added by passing a single +" version argument to the command. There may be up to 4 +" vimdiff buffers total. +" +" Using the 2-argument form of the command resets the vimdiff +" to only those 2 versions. Additionally, invoking the +" command on a different file will close the previous vimdiff +" buffers. +" +" Mapping documentation: {{{2 +" +" By default, a mapping is defined for each command. User-provided mappings +" can be used instead by mapping to CommandName, for instance: +" +" nmap ,ca VCSAdd +" +" The default mappings are as follow: +" +" ca VCSAdd +" cn VCSAnnotate +" cN VCSAnnotate! +" cc VCSCommit +" cD VCSDelete +" cd VCSDiff +" cg VCSGotoOriginal +" cG VCSGotoOriginal! +" ci VCSInfo +" cl VCSLog +" cL VCSLock +" cr VCSReview +" cs VCSStatus +" cu VCSUpdate +" cU VCSUnlock +" cv VCSVimDiff +" +" Options documentation: {{{2 +" +" Several variables are checked by the script to determine behavior as follow: +" +" VCSCommandCommitOnWrite +" This variable, if set to a non-zero value, causes the pending commit to +" take place immediately as soon as the log message buffer is written. If +" set to zero, only the VCSCommit mapping will cause the pending commit to +" occur. If not set, it defaults to 1. +" +" VCSCommandDeleteOnHide +" This variable, if set to a non-zero value, causes the temporary VCS result +" buffers to automatically delete themselves when hidden. +" +" VCSCommand{VCSType}DiffOpt +" This variable, if set, determines the options passed to the diff command +" of the underlying VCS. Each VCS plugin defines a default value. +" +" VCSCommandDiffSplit +" This variable overrides the VCSCommandSplit variable, but only for buffers +" created with VCSVimDiff. +" +" VCSCommandDisableAll +" This variable, if set, prevents the plugin or any extensions from loading +" at all. This is useful when a single runtime distribution is used on +" multiple systems with varying versions. +" +" VCSCommandDisableMappings +" This variable, if set to a non-zero value, prevents the default command +" mappings from being set. +" +" VCSCommandDisableExtensionMappings +" This variable, if set to a non-zero value, prevents the default command +" mappings from being set for commands specific to an individual VCS. +" +" VCSCommandDisableMenu +" This variable, if set to a non-zero value, prevents the default command +" menu from being set. +" +" VCSCommandEdit +" This variable controls whether to split the current window to display a +" scratch buffer ('split'), or to display it in the current buffer ('edit'). +" If not set, it defaults to 'split'. +" +" VCSCommandEnableBufferSetup +" This variable, if set to a non-zero value, activates VCS buffer management +" mode. This mode means that the buffer variable 'VCSRevision' is set if +" the file is VCS-controlled. This is useful for displaying version +" information in the status bar. Additional options may be set by +" individual VCS plugins. +" +" VCSCommandMappings +" This variable, if set, overrides the default mappings used for shortcuts. +" It should be a List of 2-element Lists, each containing a shortcut and +" function name pair. +" +" VCSCommandMapPrefix +" This variable, if set, overrides the default mapping prefix ('c'). +" This allows customization of the mapping space used by the vcscommand +" shortcuts. +" +" VCSCommandMenuPriority +" This variable, if set, overrides the default menu priority '' (empty) +" +" VCSCommandMenuRoot +" This variable, if set, overrides the default menu root 'Plugin.VCS' +" +" VCSCommandResultBufferNameExtension +" This variable, if set to a non-blank value, is appended to the name of the +" VCS command output buffers. For example, '.vcs'. Using this option may +" help avoid problems caused by autocommands dependent on file extension. +" +" VCSCommandResultBufferNameFunction +" This variable, if set, specifies a custom function for naming VCS command +" output buffers. This function will be passed the following arguments: +" +" command - name of the VCS command being executed (such as 'Log' or +" 'Diff'). +" +" originalBuffer - buffer number of the source file. +" +" vcsType - type of VCS controlling this file (such as 'CVS' or 'SVN'). +" +" statusText - extra text associated with the VCS action (such as version +" numbers). +" +" VCSCommandSplit +" This variable controls the orientation of the various window splits that +" may occur (such as with VCSVimDiff, when using a VCS command on a VCS +" command buffer, or when the 'VCSCommandEdit' variable is set to 'split'. +" If set to 'horizontal', the resulting windows will be on stacked on top of +" one another. If set to 'vertical', the resulting windows will be +" side-by-side. If not set, it defaults to 'horizontal' for all but +" VCSVimDiff windows. +" +" VCSCommandVCSTypeOverride +" This variable allows the VCS type detection to be overridden on a +" path-by-path basis. The value of this variable is expected to be a List +" of Lists. Each high-level List item is a List containing two elements. +" The first element is a regular expression that will be matched against the +" full file name of a given buffer. If it matches, the second element will +" be used as the VCS type. +" +" VCSCommandVCSTypePreference +" This variable allows the VCS type detection to be weighted towards a +" specific VCS, in case more than one potential VCS is detected as useable. +" The format of the variable is either a list or a space-separated string +" containing the ordered-by-preference abbreviations of the preferred VCS +" types. +" +" Event documentation {{{2 +" For additional customization, VCSCommand.vim uses User event autocommand +" hooks. Each event is in the VCSCommand group, and different patterns +" match the various hooks. +" +" For instance, the following could be added to the vimrc to provide a 'q' +" mapping to quit a VCS scratch buffer: +" +" augroup VCSCommand +" au VCSCommand User VCSBufferCreated silent! nmap q :bwipeout +" augroup END +" +" The following hooks are available: +" +" VCSBufferCreated This event is fired just after a VCS command +" output buffer is created. It is executed +" within the context of the new buffer. +" +" VCSBufferSetup This event is fired just after VCS buffer setup +" occurs, if enabled. +" +" VCSPluginInit This event is fired when the VCSCommand plugin +" first loads. +" +" VCSPluginFinish This event is fired just after the VCSCommand +" plugin loads. +" +" VCSVimDiffFinish This event is fired just after the VCSVimDiff +" command executes to allow customization of, +" for instance, window placement and focus. +" +" Section: Plugin header {{{1 + +" loaded_VCSCommand is set to 1 when the initialization begins, and 2 when it +" completes. This allows various actions to only be taken by functions after +" system initialization. + +if exists('VCSCommandDisableAll') + finish +endif + +if exists('loaded_VCSCommand') + finish +endif +let loaded_VCSCommand = 1 + +if v:version < 700 + echohl WarningMsg|echomsg 'VCSCommand requires at least VIM 7.0'|echohl None + finish +endif + +let s:save_cpo=&cpo +set cpo&vim + +" Section: Event group setup {{{1 + +augroup VCSCommand +augroup END + +augroup VCSCommandCommit +augroup END + +" Section: Plugin initialization {{{1 +silent do VCSCommand User VCSPluginInit + +" Section: Constants declaration {{{1 + +let g:VCSCOMMAND_IDENTIFY_EXACT = 1 +let g:VCSCOMMAND_IDENTIFY_INEXACT = -1 + +" Section: Script variable initialization {{{1 + +" Hidden functions for use by extensions +let s:VCSCommandUtility = {} + +" plugin-specific information: {vcs -> [script, {command -> function}, {key -> mapping}]} +let s:plugins = {} + +" Stack of dictionaries representing nested options +let s:executionContext = [] + +" state flag used to vary behavior of certain automated actions +let s:isEditFileRunning = 0 + +" Section: Utility functions {{{1 + +" Function: s:ReportError(mapping) {{{2 +" Displays the given error in a consistent faction. This is intended to be +" invoked from a catch statement. + +function! s:ReportError(error) + echohl WarningMsg|echomsg 'VCSCommand: ' . a:error|echohl None +endfunction + +" Function: s:VCSCommandUtility.system(...) {{{2 +" Replacement for system() function. This version protects the quoting in the +" command line on Windows systems. + +function! s:VCSCommandUtility.system(...) + let output = call('system', a:000) + if exists('*iconv') && has('multi_byte') + if(strlen(&tenc) && &tenc != &enc) + let output = iconv(output, &tenc, &enc) + else + let originalBuffer = VCSCommandGetOriginalBuffer(VCSCommandGetOption('VCSCommandEncodeAsFile', 0)) + if originalBuffer + let fenc = getbufvar(originalBuffer, '&fenc') + if fenc != &enc + let output = iconv(output, fenc, &enc) + endif + endif + endif + + endif + return output +endfunction + +" Function: s:VCSCommandUtility.addMenuItem(shortcut, command) {{{2 +" Adds the given menu item. + +function! s:VCSCommandUtility.addMenuItem(shortcut, command) + if s:menuEnabled + exe 'amenu '.s:menuPriority.' '.s:menuRoot.'.'.a:shortcut.' '.a:command + endif +endfunction + +" Function: s:VCSCommandUtility.pushContext(context) {{{2 +" Adds a dictionary containing current options to the stack. + +function! s:VCSCommandUtility.pushContext(context) + call insert(s:executionContext, a:context) +endfunction + +" Function: s:VCSCommandUtility.popContext() {{{2 +" Removes a dictionary containing current options from the stack. + +function! s:VCSCommandUtility.popContext() + call remove(s:executionContext, 0) +endfunction + +" Function: s:ClearMenu() {{{2 +" Removes all VCSCommand menu items +function! s:ClearMenu() + if s:menuEnabled + execute 'aunmenu' s:menuRoot + endif +endfunction + +" Function: s:CreateMapping(shortcut, expansion, display) {{{2 +" Creates the given mapping by prepending the contents of +" 'VCSCommandMapPrefix' (by default 'c') to the given shortcut and +" mapping it to the given plugin function. If a mapping exists for the +" specified shortcut + prefix, emit an error but continue. If a mapping +" exists for the specified function, do nothing. + +function! s:CreateMapping(shortcut, expansion, display) + let lhs = VCSCommandGetOption('VCSCommandMapPrefix', 'c') . a:shortcut + if !hasmapto(a:expansion) + try + execute 'nmap ' lhs a:expansion + catch /^Vim(.*):E227:/ + if(&verbose != 0) + echohl WarningMsg|echomsg 'VCSCommand: mapping ''' . lhs . ''' already exists, refusing to overwrite. The mapping for ' . a:display . ' will not be available.'|echohl None + endif + endtry + endif +endfunction + +" Function: s:ExecuteExtensionMapping(mapping) {{{2 +" Invokes the appropriate extension mapping depending on the type of the +" current buffer. + +function! s:ExecuteExtensionMapping(mapping) + let buffer = bufnr('%') + let vcsType = VCSCommandGetVCSType(buffer) + if !has_key(s:plugins, vcsType) + throw 'Unknown VCS type: ' . vcsType + endif + if !has_key(s:plugins[vcsType][2], a:mapping) + throw 'This extended mapping is not defined for ' . vcsType + endif + silent execute 'normal!' ':' . s:plugins[vcsType][2][a:mapping] . "\" +endfunction + +" Function: s:ExecuteVCSCommand(command, argList) {{{2 +" Calls the indicated plugin-specific VCS command on the current buffer. +" Returns: buffer number of resulting output scratch buffer, or -1 if an error +" occurs. + +function! s:ExecuteVCSCommand(command, argList) + try + let buffer = bufnr('%') + + let vcsType = VCSCommandGetVCSType(buffer) + if !has_key(s:plugins, vcsType) + throw 'Unknown VCS type: ' . vcsType + endif + + let originalBuffer = VCSCommandGetOriginalBuffer(buffer) + let bufferName = bufname(originalBuffer) + + " It is already known that the directory is under VCS control. No further + " checks are needed. Otherwise, perform some basic sanity checks to avoid + " VCS-specific error messages from confusing things. + if !isdirectory(bufferName) + if !filereadable(bufferName) + throw 'No such file ' . bufferName + endif + endif + + let functionMap = s:plugins[vcsType][1] + if !has_key(functionMap, a:command) + throw 'Command ''' . a:command . ''' not implemented for ' . vcsType + endif + return functionMap[a:command](a:argList) + catch + call s:ReportError(v:exception) + return -1 + endtry +endfunction + +" Function: s:GenerateResultBufferName(command, originalBuffer, vcsType, statusText) {{{2 +" Default method of generating the name for VCS result buffers. This can be +" overridden with the VCSResultBufferNameFunction variable. + +function! s:GenerateResultBufferName(command, originalBuffer, vcsType, statusText) + let fileName = bufname(a:originalBuffer) + let bufferName = a:vcsType . ' ' . a:command + if strlen(a:statusText) > 0 + let bufferName .= ' ' . a:statusText + endif + let bufferName .= ' ' . fileName + let counter = 0 + let versionedBufferName = bufferName + while bufexists(versionedBufferName) + let counter += 1 + let versionedBufferName = bufferName . ' (' . counter . ')' + endwhile + return versionedBufferName +endfunction + +" Function: s:GenerateResultBufferNameWithExtension(command, originalBuffer, vcsType, statusText) {{{2 +" Method of generating the name for VCS result buffers that uses the original +" file name with the VCS type and command appended as extensions. + +function! s:GenerateResultBufferNameWithExtension(command, originalBuffer, vcsType, statusText) + let fileName = bufname(a:originalBuffer) + let bufferName = a:vcsType . ' ' . a:command + if strlen(a:statusText) > 0 + let bufferName .= ' ' . a:statusText + endif + let bufferName .= ' ' . fileName . VCSCommandGetOption('VCSCommandResultBufferNameExtension', '.vcs') + let counter = 0 + let versionedBufferName = bufferName + while bufexists(versionedBufferName) + let counter += 1 + let versionedBufferName = '(' . counter . ') ' . bufferName + endwhile + return versionedBufferName +endfunction + +" Function: s:EditFile(command, originalBuffer, statusText) {{{2 +" Creates a new buffer of the given name and associates it with the given +" original buffer. + +function! s:EditFile(command, originalBuffer, statusText) + let vcsType = getbufvar(a:originalBuffer, 'VCSCommandVCSType') + + " Protect against useless buffer set-up + let s:isEditFileRunning += 1 + try + let editCommand = VCSCommandGetOption('VCSCommandEdit', 'split') + if editCommand == 'split' + if VCSCommandGetOption('VCSCommandSplit', 'horizontal') == 'horizontal' + rightbelow split + else + vert rightbelow split + endif + endif + + enew + + call s:SetupScratchBuffer(a:command, vcsType, a:originalBuffer, a:statusText) + + finally + let s:isEditFileRunning -= 1 + endtry +endfunction + +" Function: s:IdentifyVCSType() {{{2 +" This function implements the non-cached identification strategy for +" VcsCommandGetVCSType(). +" +" Returns: VCS type name identified for the given buffer; an exception is +" thrown in case no type can be identified. + +function! s:IdentifyVCSType(buffer) + if exists("g:VCSCommandVCSTypeOverride") + let fullpath = fnamemodify(bufname(a:buffer), ':p') + for [path, vcsType] in g:VCSCommandVCSTypeOverride + if match(fullpath, path) > -1 + return vcsType + endif + endfor + endif + let matches = [] + let exactMatch = '' + let exactMatchCount = 0 + for vcsType in keys(s:plugins) + let identified = s:plugins[vcsType][1].Identify(a:buffer) + if identified + if identified == g:VCSCOMMAND_IDENTIFY_EXACT + let exactMatch = vcsType + let exactMatchCount += 1 + endif + call add(matches, [vcsType, identified]) + endif + endfor + if len(matches) == 1 + return matches[0][0] + elseif len(matches) == 0 + throw 'No suitable plugin' + else + let preferences = VCSCommandGetOption("VCSCommandVCSTypePreference", []) + if len(preferences) > 0 + if type(preferences) == 1 + let listPreferences = split(preferences, '\W\+') + unlet preferences + let preferences = listPreferences + endif + for preferred in preferences + for [vcsType, identified] in matches + if vcsType ==? preferred + return vcsType + endif + endfor + endfor + endif + + if exactMatchCount == 1 + return exactMatch + endif + + throw 'can''t identify VCS type for current buffer due to too many matching VCS: ' . join(map(matches, 'v:val[0]')) + endif +endfunction + +" Function: s:SetupScratchBuffer(command, vcsType, originalBuffer, statusText) {{{2 +" Creates convenience buffer variables and the name of a vcscommand result +" buffer. + +function! s:SetupScratchBuffer(command, vcsType, originalBuffer, statusText) + let nameExtension = VCSCommandGetOption('VCSCommandResultBufferNameExtension', '') + if nameExtension == '' + let nameFunction = VCSCommandGetOption('VCSCommandResultBufferNameFunction', 's:GenerateResultBufferName') + else + let nameFunction = VCSCommandGetOption('VCSCommandResultBufferNameFunction', 's:GenerateResultBufferNameWithExtension') + endif + + let name = call(nameFunction, [a:command, a:originalBuffer, a:vcsType, a:statusText]) + + let b:VCSCommandCommand = a:command + let b:VCSCommandOriginalBuffer = a:originalBuffer + let b:VCSCommandSourceFile = bufname(a:originalBuffer) + let b:VCSCommandVCSType = a:vcsType + if a:statusText != '' + let b:VCSCommandStatusText = a:statusText + endif + + setlocal buftype=nofile + setlocal noswapfile + let &filetype = tolower(a:vcsType . a:command) + + if VCSCommandGetOption('VCSCommandDeleteOnHide', 0) + setlocal bufhidden=delete + endif + silent noautocmd file `=name` +endfunction + +" Function: s:SetupBuffer() {{{2 +" Attempts to set the b:VCSCommandBufferInfo variable + +function! s:SetupBuffer() + if (exists('b:VCSCommandBufferSetup') && b:VCSCommandBufferSetup) + " This buffer is already set up. + return + endif + + if !isdirectory(@%) && (strlen(&buftype) > 0 || !filereadable(@%)) + " No special status for special buffers other than directory buffers. + return + endif + + if !VCSCommandGetOption('VCSCommandEnableBufferSetup', 0) || s:isEditFileRunning > 0 + unlet! b:VCSCommandBufferSetup + return + endif + + try + let vcsType = VCSCommandGetVCSType(bufnr('%')) + let b:VCSCommandBufferInfo = s:plugins[vcsType][1].GetBufferInfo() + silent do VCSCommand User VCSBufferSetup + catch /No suitable plugin/ + " This is not a VCS-controlled file. + let b:VCSCommandBufferInfo = [] + endtry + + let b:VCSCommandBufferSetup = 1 +endfunction + +" Function: s:MarkOrigBufferForSetup(buffer) {{{2 +" Resets the buffer setup state of the original buffer for a given VCS scratch +" buffer. +" Returns: The VCS buffer number in a passthrough mode. + +function! s:MarkOrigBufferForSetup(buffer) + checktime + if a:buffer > 0 + let origBuffer = VCSCommandGetOriginalBuffer(a:buffer) + " This should never not work, but I'm paranoid + if origBuffer != a:buffer + call setbufvar(origBuffer, 'VCSCommandBufferSetup', 0) + endif + endif + return a:buffer +endfunction + +" Function: s:WipeoutCommandBuffers() {{{2 +" Clears all current VCS output buffers of the specified type for a given source. + +function! s:WipeoutCommandBuffers(originalBuffer, VCSCommand) + let buffer = 1 + while buffer <= bufnr('$') + if getbufvar(buffer, 'VCSCommandOriginalBuffer') == a:originalBuffer + if getbufvar(buffer, 'VCSCommandCommand') == a:VCSCommand + execute 'bw' buffer + endif + endif + let buffer = buffer + 1 + endwhile +endfunction + +" Function: s:VimDiffRestore(vimDiffBuff) {{{2 +" Checks whether the given buffer is one whose deletion should trigger +" restoration of an original buffer after it was diffed. If so, it executes +" the appropriate setting command stored with that original buffer. + +function! s:VimDiffRestore(vimDiffBuff) + let s:isEditFileRunning += 1 + try + if exists('t:vcsCommandVimDiffSourceBuffer') + if a:vimDiffBuff == t:vcsCommandVimDiffSourceBuffer + " Original file is being removed. + unlet! t:vcsCommandVimDiffSourceBuffer + unlet! t:vcsCommandVimDiffRestoreCmd + unlet! t:vcsCommandVimDiffScratchList + else + let index = index(t:vcsCommandVimDiffScratchList, a:vimDiffBuff) + if index >= 0 + call remove(t:vcsCommandVimDiffScratchList, index) + if len(t:vcsCommandVimDiffScratchList) == 0 + if exists('t:vcsCommandVimDiffRestoreCmd') + " All scratch buffers are gone, reset the original. + " Only restore if the source buffer is still in Diff mode + + let sourceWinNR = bufwinnr(t:vcsCommandVimDiffSourceBuffer) + if sourceWinNR != -1 + " The buffer is visible in at least one window + let currentWinNR = winnr() + while winbufnr(sourceWinNR) != -1 + if winbufnr(sourceWinNR) == t:vcsCommandVimDiffSourceBuffer + execute sourceWinNR . 'wincmd w' + if getwinvar(0, '&diff') + execute t:vcsCommandVimDiffRestoreCmd + endif + endif + let sourceWinNR = sourceWinNR + 1 + endwhile + execute currentWinNR . 'wincmd w' + else + " The buffer is hidden. It must be visible in order to set the + " diff option. + let currentBufNR = bufnr('') + execute 'hide buffer' t:vcsCommandVimDiffSourceBuffer + if getwinvar(0, '&diff') + execute t:vcsCommandVimDiffRestoreCmd + endif + execute 'hide buffer' currentBufNR + endif + + unlet t:vcsCommandVimDiffRestoreCmd + endif + " All buffers are gone. + unlet t:vcsCommandVimDiffSourceBuffer + unlet t:vcsCommandVimDiffScratchList + endif + endif + endif + endif + finally + let s:isEditFileRunning -= 1 + endtry +endfunction + +" Section: Generic VCS command functions {{{1 + +" Function: s:VCSAnnotate(...) {{{2 +function! s:VCSAnnotate(bang, ...) + call s:VCSCommandUtility.pushContext({'VCSCommandEncodeAsFile': bufnr('%')}) + try + let line = line('.') + let currentBuffer = bufnr('%') + let originalBuffer = VCSCommandGetOriginalBuffer(currentBuffer) + + let annotateBuffer = s:ExecuteVCSCommand('Annotate', a:000) + if annotateBuffer == -1 + return -1 + endif + if a:bang == '!' && VCSCommandGetOption('VCSCommandDisableSplitAnnotate', 0) == 0 + let vcsType = VCSCommandGetVCSType(annotateBuffer) + let functionMap = s:plugins[vcsType][1] + let splitRegex = '' + if has_key(s:plugins[vcsType][1], 'AnnotateSplitRegex') + let splitRegex = s:plugins[vcsType][1]['AnnotateSplitRegex'] + endif + let splitRegex = VCSCommandGetOption('VCSCommand' . vcsType . 'AnnotateSplitRegex', splitRegex) + if splitRegex == '' + return annotateBuffer + endif + wincmd J + let originalFileType = getbufvar(originalBuffer, '&ft') + let annotateFileType = getbufvar(annotateBuffer, '&ft') + + let saveselection = &selection + set selection=inclusive + try + execute "normal! 0zR\G/" . splitRegex . "/e\d" + finally + let &selection = saveselection + endtry + + call setbufvar('%', '&filetype', getbufvar(originalBuffer, '&filetype')) + set scrollbind + leftabove vert new + normal! 0P + execute "normal!" . (col('$') + (&number ? &numberwidth : 0)). "\|" + call s:SetupScratchBuffer('annotate', vcsType, originalBuffer, 'header') + wincmd l + endif + + if currentBuffer == originalBuffer + " Starting from the original source buffer, so the + " current line is relevant. + if a:0 == 0 + " No argument list means that we're annotating + " the current version, so jumping to the same + " line is the expected action. + execute "normal!" line . 'G' + if has('folding') + " The execution of the buffer created autocommand + " re-folds the buffer. Display the current line + " unfolded. + normal! zv + endif + endif + endif + + return annotateBuffer + catch + call s:ReportError(v:exception) + return -1 + finally + call s:VCSCommandUtility.popContext() + endtry +endfunction + +" Function: s:VCSCommit() {{{2 +function! s:VCSCommit(bang, message) + try + let vcsType = VCSCommandGetVCSType(bufnr('%')) + if !has_key(s:plugins, vcsType) + throw 'Unknown VCS type: ' . vcsType + endif + + let originalBuffer = VCSCommandGetOriginalBuffer(bufnr('%')) + + " Handle the commit message being specified. If a message is supplied, it + " is used; if bang is supplied, an empty message is used; otherwise, the + " user is provided a buffer from which to edit the commit message. + + if strlen(a:message) > 0 || a:bang == '!' + return s:VCSFinishCommit([a:message], originalBuffer) + endif + + call s:EditFile('commitlog', originalBuffer, '') + setlocal ft=vcscommit + + " Create a commit mapping. + + nnoremap VCSCommit :call VCSFinishCommitWithBuffer() + + silent 0put ='VCS: ----------------------------------------------------------------------' + silent put ='VCS: Please enter log message. Lines beginning with ''VCS:'' are removed automatically.' + silent put ='VCS: To finish the commit, Type cc (or your own VCSCommit mapping)' + + if VCSCommandGetOption('VCSCommandCommitOnWrite', 1) == 1 + setlocal buftype=acwrite + au VCSCommandCommit BufWriteCmd call s:VCSFinishCommitWithBuffer() + silent put ='VCS: or write this buffer' + endif + + silent put ='VCS: ----------------------------------------------------------------------' + $ + setlocal nomodified + silent do VCSCommand User VCSBufferCreated + catch + call s:ReportError(v:exception) + return -1 + endtry +endfunction + +" Function: s:VCSFinishCommitWithBuffer() {{{2 +" Wrapper for s:VCSFinishCommit which is called only from a commit log buffer +" which removes all lines starting with 'VCS:'. + +function! s:VCSFinishCommitWithBuffer() + setlocal nomodified + let currentBuffer = bufnr('%') + let logMessageList = getbufline('%', 1, '$') + call filter(logMessageList, 'v:val !~ ''^\s*VCS:''') + let resultBuffer = s:VCSFinishCommit(logMessageList, b:VCSCommandOriginalBuffer) + if resultBuffer >= 0 + execute 'bw' currentBuffer + endif + return resultBuffer +endfunction + +" Function: s:VCSFinishCommit(logMessageList, originalBuffer) {{{2 +function! s:VCSFinishCommit(logMessageList, originalBuffer) + let messageFileName = tempname() + if exists('*iconv') && has('multi_byte') + if(strlen(&tenc) && &tenc != &enc) + call map(a:logMessageList, 'iconv(v:val, &enc, &tenc)') + endif + endif + call writefile(a:logMessageList, messageFileName) + try + let resultBuffer = s:ExecuteVCSCommand('Commit', [messageFileName]) + if resultBuffer < 0 + return resultBuffer + endif + return s:MarkOrigBufferForSetup(resultBuffer) + finally + call delete(messageFileName) + endtry +endfunction + +" Function: s:VCSGotoOriginal(bang) {{{2 +function! s:VCSGotoOriginal(bang) + let originalBuffer = VCSCommandGetOriginalBuffer(bufnr('%')) + if originalBuffer > 0 + let origWinNR = bufwinnr(originalBuffer) + if origWinNR == -1 + execute 'buffer' originalBuffer + else + execute origWinNR . 'wincmd w' + endif + if a:bang == '!' + let buffnr = 1 + let buffmaxnr = bufnr('$') + while buffnr <= buffmaxnr + if getbufvar(buffnr, 'VCSCommandOriginalBuffer') == originalBuffer + execute 'bw' buffnr + endif + let buffnr = buffnr + 1 + endwhile + endif + endif +endfunction + +function! s:VCSDiff(...) "{{{2 + call s:VCSCommandUtility.pushContext({'VCSCommandEncodeAsFile': bufnr('%')}) + try + let resultBuffer = s:ExecuteVCSCommand('Diff', a:000) + if resultBuffer > 0 + let &filetype = 'diff' + elseif resultBuffer == 0 + echomsg 'No differences found' + endif + return resultBuffer + finally + call s:VCSCommandUtility.popContext() + endtry +endfunction + +function! s:VCSReview(...) "{{{2 + call s:VCSCommandUtility.pushContext({'VCSCommandEncodeAsFile': bufnr('%')}) + try + let resultBuffer = s:ExecuteVCSCommand('Review', a:000) + if resultBuffer > 0 + let &filetype = getbufvar(b:VCSCommandOriginalBuffer, '&filetype') + endif + return resultBuffer + finally + call s:VCSCommandUtility.popContext() + endtry +endfunction + +" Function: s:VCSVimDiff(...) {{{2 +function! s:VCSVimDiff(...) + try + let vcsType = VCSCommandGetVCSType(bufnr('%')) + if !has_key(s:plugins, vcsType) + throw 'Unknown VCS type: ' . vcsType + endif + let originalBuffer = VCSCommandGetOriginalBuffer(bufnr('%')) + let s:isEditFileRunning = s:isEditFileRunning + 1 + try + " If there's already a VimDiff'ed window, restore it. + " There may only be one VCSVimDiff original window at a time. + + if exists('t:vcsCommandVimDiffSourceBuffer') && t:vcsCommandVimDiffSourceBuffer != originalBuffer + " Clear the existing vimdiff setup by removing the result buffers. + call s:WipeoutCommandBuffers(t:vcsCommandVimDiffSourceBuffer, 'vimdiff') + endif + + let orientation = &diffopt =~ 'horizontal' ? 'horizontal' : 'vertical' + let orientation = VCSCommandGetOption('VCSCommandSplit', orientation) + let orientation = VCSCommandGetOption('VCSCommandDiffSplit', orientation) + + " Split and diff + if(a:0 == 2) + " Reset the vimdiff system, as 2 explicit versions were provided. + if exists('t:vcsCommandVimDiffSourceBuffer') + call s:WipeoutCommandBuffers(t:vcsCommandVimDiffSourceBuffer, 'vimdiff') + endif + let resultBuffer = s:VCSReview(a:1) + if resultBuffer < 0 + echomsg 'Can''t open revision ' . a:1 + return resultBuffer + endif + let b:VCSCommandCommand = 'vimdiff' + diffthis + let t:vcsCommandVimDiffScratchList = [resultBuffer] + call s:VCSCommandUtility.pushContext({'VCSCommandEdit': 'split', 'VCSCommandSplit': orientation}) + try + let resultBuffer = s:VCSReview(a:2) + finally + call s:VCSCommandUtility.popContext() + endtry + if resultBuffer < 0 + echomsg 'Can''t open revision ' . a:1 + return resultBuffer + endif + let b:VCSCommandCommand = 'vimdiff' + diffthis + let t:vcsCommandVimDiffScratchList += [resultBuffer] + else + call s:VCSCommandUtility.pushContext({'VCSCommandEdit': 'split', 'VCSCommandSplit': orientation}) + try + if(a:0 == 0) + let resultBuffer = s:VCSReview() + else + let resultBuffer = s:VCSReview(a:1) + endif + finally + call s:VCSCommandUtility.popContext() + endtry + if resultBuffer < 0 + echomsg 'Can''t open current revision' + return resultBuffer + endif + let b:VCSCommandCommand = 'vimdiff' + diffthis + + if !exists('t:vcsCommandVimDiffSourceBuffer') + " New instance of vimdiff. + let t:vcsCommandVimDiffScratchList = [resultBuffer] + + " This could have been invoked on a VCS result buffer, not the + " original buffer. + wincmd W + execute 'buffer' originalBuffer + " Store info for later original buffer restore + let t:vcsCommandVimDiffRestoreCmd = + \ 'call setbufvar('.originalBuffer.', ''&diff'', '.getbufvar(originalBuffer, '&diff').')' + \ . '|call setbufvar('.originalBuffer.', ''&foldcolumn'', '.getbufvar(originalBuffer, '&foldcolumn').')' + \ . '|call setbufvar('.originalBuffer.', ''&foldenable'', '.getbufvar(originalBuffer, '&foldenable').')' + \ . '|call setbufvar('.originalBuffer.', ''&foldmethod'', '''.getbufvar(originalBuffer, '&foldmethod').''')' + \ . '|call setbufvar('.originalBuffer.', ''&foldlevel'', '''.getbufvar(originalBuffer, '&foldlevel').''')' + \ . '|call setbufvar('.originalBuffer.', ''&scrollbind'', '.getbufvar(originalBuffer, '&scrollbind').')' + \ . '|call setbufvar('.originalBuffer.', ''&wrap'', '.getbufvar(originalBuffer, '&wrap').')' + if has('cursorbind') + let t:vcsCommandVimDiffRestoreCmd .= '|call setbufvar('.originalBuffer.', ''&cursorbind'', '.getbufvar(originalBuffer, '&cursorbind').')' + endif + let t:vcsCommandVimDiffRestoreCmd .= '|if &foldmethod==''manual''|execute ''normal! zE''|endif' + diffthis + wincmd w + else + " Adding a window to an existing vimdiff + let t:vcsCommandVimDiffScratchList += [resultBuffer] + endif + endif + + let t:vcsCommandVimDiffSourceBuffer = originalBuffer + + " Avoid executing the modeline in the current buffer after the autocommand. + + let currentBuffer = bufnr('%') + let saveModeline = getbufvar(currentBuffer, '&modeline') + try + call setbufvar(currentBuffer, '&modeline', 0) + silent do VCSCommand User VCSVimDiffFinish + finally + call setbufvar(currentBuffer, '&modeline', saveModeline) + endtry + return resultBuffer + finally + let s:isEditFileRunning = s:isEditFileRunning - 1 + endtry + catch + call s:ReportError(v:exception) + return -1 + endtry +endfunction + +" Section: Public functions {{{1 + +" Function: VCSCommandGetVCSType() {{{2 +" This function sets the b:VCSCommandVCSType variable in the given buffer to the +" appropriate source control system name and returns the same name. +" +" Returns: VCS type name identified for the given buffer. An exception is +" thrown if no type can be identified. +" +" Rules for determining type: +" 1. use previously-cached value +" 2. use value from 'VCSCommandVCSTypeOverride' +" 3. use single match +" 4. use first matching value from 'VCSCommandTypePreference' +" 5. use single exact match +" 6. error if multiple matching types +" 7. error if no matching types + +function! VCSCommandGetVCSType(buffer) + let vcsType = VCSCommandGetOption('VCSCommandVCSTypeExplicitOverride', '') + if len(vcsType) == 0 + let vcsType = getbufvar(a:buffer, 'VCSCommandVCSType') + if strlen(vcsType) == 0 + let vcsType = s:IdentifyVCSType(a:buffer) + call setbufvar(a:buffer, 'VCSCommandVCSType', vcsType) + endif + endif + return vcsType +endfunction + +" Function: VCSCommandChdir(directory) {{{2 +" Changes the current directory, respecting :lcd changes. + +function! VCSCommandChdir(directory) + let command = 'cd' + if exists("*haslocaldir") && haslocaldir() + let command = 'lcd' + endif + if exists("*fnameescape") + execute command fnameescape(a:directory) + else + execute command escape(a:directory, ' ') + endif +endfunction + +" Function: VCSCommandChangeToCurrentFileDir() {{{2 +" Go to the directory in which the given file is located. + +function! VCSCommandChangeToCurrentFileDir(fileName) + let oldCwd = getcwd() + let newCwd = fnamemodify(resolve(a:fileName), ':p:h') + if strlen(newCwd) > 0 + call VCSCommandChdir(newCwd) + endif + return oldCwd +endfunction + +" Function: VCSCommandGetOriginalBuffer(vcsBuffer) {{{2 +" Attempts to locate the original file to which VCS operations were applied +" for a given buffer. + +function! VCSCommandGetOriginalBuffer(vcsBuffer) + let origBuffer = getbufvar(a:vcsBuffer, 'VCSCommandOriginalBuffer') + if origBuffer + if bufexists(origBuffer) + return origBuffer + else + " Original buffer no longer exists. + throw 'Original buffer for this VCS buffer no longer exists.' + endif + else + " No original buffer + return a:vcsBuffer + endif +endfunction + +" Function: VCSCommandRegisterModule(name, file, commandMap) {{{2 +" Allows VCS modules to register themselves. + +function! VCSCommandRegisterModule(name, path, commandMap, mappingMap) + let s:plugins[a:name] = [a:path, a:commandMap, a:mappingMap] + if !empty(a:mappingMap) + \ && !exists("g:no_plugin_maps") + \ && !VCSCommandGetOption('VCSCommandDisableMappings', 0) + \ && !VCSCommandGetOption('VCSCommandDisableExtensionMappings', 0) + for shortcut in keys(a:mappingMap) + let expansion = ":call ExecuteExtensionMapping('" . shortcut . "')" + call s:CreateMapping(shortcut, expansion, a:name . " extension mapping " . shortcut) + endfor + endif + return s:VCSCommandUtility +endfunction + +" Function: VCSCommandDoCommand(cmd, cmdName, statusText, [options]) {{{2 +" General skeleton for VCS function execution. The given command is executed +" after appending the current buffer name (or substituting it for +" , if such a token is present). The output is captured in a +" new buffer. +" +" The optional 'options' Dictionary may contain the following options: +" allowNonZeroExit: if non-zero, if the underlying VCS command has a +" non-zero exit status, the command is still considered +" successfuly. This defaults to zero. +" Returns: name of the new command buffer containing the command results + +function! VCSCommandDoCommand(cmd, cmdName, statusText, options) + let allowNonZeroExit = 0 + if has_key(a:options, 'allowNonZeroExit') + let allowNonZeroExit = a:options.allowNonZeroExit + endif + + let originalBuffer = VCSCommandGetOriginalBuffer(bufnr('%')) + if originalBuffer == -1 + throw 'Original buffer no longer exists, aborting.' + endif + + let path = resolve(bufname(originalBuffer)) + + " Work with netrw or other systems where a directory listing is displayed in + " a buffer. + + if isdirectory(path) + let fileName = '.' + else + let fileName = fnamemodify(path, ':t') + endif + + if match(a:cmd, '') > 0 + let fullCmd = substitute(a:cmd, '', fileName, 'g') + else + let fullCmd = a:cmd . ' -- ' . shellescape(fileName) + endif + + " Change to the directory of the current buffer. This is done for CVS, but + " is left in for other systems as it does not affect them negatively. + + let oldCwd = VCSCommandChangeToCurrentFileDir(path) + try + let output = s:VCSCommandUtility.system(fullCmd) + finally + call VCSCommandChdir(oldCwd) + endtry + + " HACK: if line endings in the repository have been corrupted, the output + " of the command will be confused. + let output = substitute(output, "\r", '', 'g') + + if v:shell_error && !allowNonZeroExit + if strlen(output) == 0 + throw 'Version control command failed' + else + let output = substitute(output, '\n', ' ', 'g') + throw 'Version control command failed: ' . output + endif + endif + + if strlen(output) == 0 + " Handle case of no output. In this case, it is important to check the + " file status, especially since cvs edit/unedit may change the attributes + " of the file with no visible output. + + checktime + return 0 + endif + + call s:EditFile(a:cmdName, originalBuffer, a:statusText) + + silent 0put=output + + " The last command left a blank line at the end of the buffer. If the + " last line is folded (a side effect of the 'put') then the attempt to + " remove the blank line will kill the last fold. + " + " This could be fixed by explicitly detecting whether the last line is + " within a fold, but I prefer to simply unfold the result buffer altogether. + + if has('folding') + normal! zR + endif + + $d + 1 + + " Define the environment and execute user-defined hooks. + + silent do VCSCommand User VCSBufferCreated + return bufnr('%') +endfunction + +" Function: VCSCommandGetOption(name, default) {{{2 +" Grab a user-specified option to override the default provided. Options are +" searched in the window, buffer, then global spaces. + +function! VCSCommandGetOption(name, default) + for context in s:executionContext + if has_key(context, a:name) + return context[a:name] + endif + endfor + if exists('w:' . a:name) + return w:{a:name} + elseif exists('b:' . a:name) + return b:{a:name} + elseif exists('g:' . a:name) + return g:{a:name} + else + return a:default + endif +endfunction + +" Function: VCSCommandDisableBufferSetup() {{{2 +" Global function for deactivating the buffer autovariables. + +function! VCSCommandDisableBufferSetup() + let g:VCSCommandEnableBufferSetup = 0 + silent! augroup! VCSCommandPlugin +endfunction + +" Function: VCSCommandEnableBufferSetup() {{{2 +" Global function for activating the buffer autovariables. + +function! VCSCommandEnableBufferSetup() + let g:VCSCommandEnableBufferSetup = 1 + augroup VCSCommandPlugin + au! + au BufEnter * call s:SetupBuffer() + augroup END + + " Only auto-load if the plugin is fully loaded. This gives other plugins a + " chance to run. + if g:loaded_VCSCommand == 2 + call s:SetupBuffer() + endif +endfunction + +" Function: VCSCommandGetStatusLine() {{{2 +" Default (sample) status line entry for VCS-controlled files. This is only +" useful if VCS-managed buffer mode is on (see the VCSCommandEnableBufferSetup +" variable for how to do this). + +function! VCSCommandGetStatusLine() + if exists('b:VCSCommandCommand') + " This is a result buffer. Return nothing because the buffer name + " contains information already. + return '' + endif + + if exists('b:VCSCommandVCSType') + \ && exists('g:VCSCommandEnableBufferSetup') + \ && g:VCSCommandEnableBufferSetup + \ && exists('b:VCSCommandBufferInfo') + return '[' . join(extend([b:VCSCommandVCSType], b:VCSCommandBufferInfo), ' ') . ']' + else + return '' + endif +endfunction + +function! VCSCommandSetVCSType(type) + if exists('b:VCSCommandBufferSetup') + unlet b:VCSCommandBufferSetup + endif + let b:VCSCommandVCSType = a:type + call s:SetupBuffer() +endfunction + +" Section: Command definitions {{{1 +" Section: Primary commands {{{2 +com! -nargs=* VCSAdd call s:MarkOrigBufferForSetup(s:ExecuteVCSCommand('Add', [])) +com! -nargs=* -bang VCSAnnotate call s:VCSAnnotate(, ) +com! -nargs=* -bang VCSBlame call s:VCSAnnotate(, ) +com! -nargs=? -bang VCSCommit call s:VCSCommit(, ) +com! -nargs=* VCSDelete call s:ExecuteVCSCommand('Delete', []) +com! -nargs=* VCSDiff call s:VCSDiff() +com! -nargs=0 -bang VCSGotoOriginal call s:VCSGotoOriginal() +com! -nargs=* VCSInfo call s:ExecuteVCSCommand('Info', []) +com! -nargs=* VCSLock call s:MarkOrigBufferForSetup(s:ExecuteVCSCommand('Lock', [])) +com! -nargs=* VCSLog call s:ExecuteVCSCommand('Log', []) +com! -nargs=* VCSRemove call s:ExecuteVCSCommand('Delete', []) +com! -nargs=0 VCSRevert call s:MarkOrigBufferForSetup(s:ExecuteVCSCommand('Revert', [])) +com! -nargs=? VCSReview call s:VCSReview() +com! -nargs=* VCSStatus call s:ExecuteVCSCommand('Status', []) +com! -nargs=* VCSUnlock call s:MarkOrigBufferForSetup(s:ExecuteVCSCommand('Unlock', [])) +com! -nargs=0 VCSUpdate call s:MarkOrigBufferForSetup(s:ExecuteVCSCommand('Update', [])) +com! -nargs=* VCSVimDiff call s:VCSVimDiff() + +" Section: VCS buffer management commands {{{2 +com! VCSCommandDisableBufferSetup call VCSCommandDisableBufferSetup() +com! VCSCommandEnableBufferSetup call VCSCommandEnableBufferSetup() + +" Allow reloading VCSCommand.vim +com! VCSReload let savedPlugins = s:plugins|let s:plugins = {}|call s:ClearMenu()|unlet! g:loaded_VCSCommand|runtime plugin/vcscommand.vim|for plugin in values(savedPlugins)|execute 'source' plugin[0]|endfor|unlet savedPlugins + +" Section: Plugin command mappings {{{1 +if !exists("no_plugin_maps") + nnoremap VCSAdd :VCSAdd + nnoremap VCSAnnotate :VCSAnnotate + nnoremap VCSCommit :VCSCommit + nnoremap VCSDelete :VCSDelete + nnoremap VCSDiff :VCSDiff + nnoremap VCSGotoOriginal :VCSGotoOriginal + nnoremap VCSClearAndGotoOriginal :VCSGotoOriginal! + nnoremap VCSInfo :VCSInfo + nnoremap VCSLock :VCSLock + nnoremap VCSLog :VCSLog + nnoremap VCSRevert :VCSRevert + nnoremap VCSReview :VCSReview + nnoremap VCSSplitAnnotate :VCSAnnotate! + nnoremap VCSStatus :VCSStatus + nnoremap VCSUnlock :VCSUnlock + nnoremap VCSUpdate :VCSUpdate + nnoremap VCSVimDiff :VCSVimDiff +endif + +" Section: Default mappings {{{1 + +let s:defaultMappings = [ + \['a', 'VCSAdd'], + \['c', 'VCSCommit'], + \['D', 'VCSDelete'], + \['d', 'VCSDiff'], + \['G', 'VCSClearAndGotoOriginal'], + \['g', 'VCSGotoOriginal'], + \['i', 'VCSInfo'], + \['L', 'VCSLock'], + \['l', 'VCSLog'], + \['N', 'VCSSplitAnnotate'], + \['n', 'VCSAnnotate'], + \['q', 'VCSRevert'], + \['r', 'VCSReview'], + \['s', 'VCSStatus'], + \['U', 'VCSUnlock'], + \['u', 'VCSUpdate'], + \['v', 'VCSVimDiff'], + \] + +if !exists("g:no_plugin_maps") && !VCSCommandGetOption('VCSCommandDisableMappings', 0) + for [s:shortcut, s:vcsFunction] in VCSCommandGetOption('VCSCommandMappings', s:defaultMappings) + call s:CreateMapping(s:shortcut, '' . s:vcsFunction, '''' . s:vcsFunction . '''') + endfor + unlet s:shortcut s:vcsFunction +endif +unlet s:defaultMappings + +" Section: Menu items {{{1 + +let s:menuEnabled = !VCSCommandGetOption('VCSCommandDisableMenu', 0) +let s:menuRoot = VCSCommandGetOption('VCSCommandMenuRoot', '&Plugin.VCS') +let s:menuPriority = VCSCommandGetOption('VCSCommandMenuPriority', '') + +for [s:shortcut, s:command] in [ + \['&Add', 'VCSAdd'], + \['A&nnotate', 'VCSAnnotate'], + \['&Commit', 'VCSCommit'], + \['Delete', 'VCSDelete'], + \['&Diff', 'VCSDiff'], + \['&Info', 'VCSInfo'], + \['&Log', 'VCSLog'], + \['Revert', 'VCSRevert'], + \['&Review', 'VCSReview'], + \['&Status', 'VCSStatus'], + \['&Update', 'VCSUpdate'], + \['&VimDiff', 'VCSVimDiff'] + \] + call s:VCSCommandUtility.addMenuItem(s:shortcut, s:command) +endfor +unlet s:shortcut s:command + +" Section: Autocommands to restore vimdiff state {{{1 +augroup VimDiffRestore + au! + au BufUnload * call s:VimDiffRestore(str2nr(expand(''))) +augroup END + +" Section: Optional activation of buffer management {{{1 + +if VCSCommandGetOption('VCSCommandEnableBufferSetup', 0) + call VCSCommandEnableBufferSetup() +endif + +" Section: VIM shutdown hook {{{1 + +" Close all result buffers when VIM exits, to prevent them from being restored +" via viminfo. + +" Function: s:CloseAllResultBuffers() {{{2 +" Closes all vcscommand result buffers. +function! s:CloseAllResultBuffers() + " This avoids using bufdo as that may load buffers already loaded in another + " vim process, resulting in an error. + let buffnr = 1 + let buffmaxnr = bufnr('$') + while buffnr <= buffmaxnr + if getbufvar(buffnr, 'VCSCommandOriginalBuffer') != "" + execute 'bw' buffnr + endif + let buffnr = buffnr + 1 + endwhile +endfunction + +augroup VCSCommandVIMShutdown + au! + au VimLeavePre * call s:CloseAllResultBuffers() +augroup END + +" Section: Plugin completion {{{1 + +let loaded_VCSCommand = 2 + +silent do VCSCommand User VCSPluginFinish + +let &cpo = s:save_cpo diff --git a/vim/oldStyle/disabled_plugins/vcscvs.vim b/vim/oldStyle/disabled_plugins/vcscvs.vim new file mode 100644 index 0000000..fe6db21 --- /dev/null +++ b/vim/oldStyle/disabled_plugins/vcscvs.vim @@ -0,0 +1,453 @@ +" vim600: set foldmethod=marker: +" +" CVS extension for VCSCommand. +" +" Maintainer: Bob Hiestand +" License: +" Copyright (c) Bob Hiestand +" +" Permission is hereby granted, free of charge, to any person obtaining a copy +" of this software and associated documentation files (the "Software"), to +" deal in the Software without restriction, including without limitation the +" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +" sell copies of the Software, and to permit persons to whom the Software is +" furnished to do so, subject to the following conditions: +" +" The above copyright notice and this permission notice shall be included in +" all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +" IN THE SOFTWARE. +" +" Section: Documentation {{{1 +" +" Command documentation {{{2 +" +" The following commands only apply to files under CVS source control. +" +" CVSEdit Performs "cvs edit" on the current file. +" +" CVSEditors Performs "cvs editors" on the current file. +" +" CVSUnedit Performs "cvs unedit" on the current file. +" +" CVSWatch Takes an argument which must be one of [on|off|add|remove]. +" Performs "cvs watch" with the given argument on the current +" file. +" +" CVSWatchers Performs "cvs watchers" on the current file. +" +" CVSWatchAdd Alias for "CVSWatch add" +" +" CVSWatchOn Alias for "CVSWatch on" +" +" CVSWatchOff Alias for "CVSWatch off" +" +" CVSWatchRemove Alias for "CVSWatch remove" +" +" Mapping documentation: {{{2 +" +" By default, a mapping is defined for each command. User-provided mappings +" can be used instead by mapping to CommandName, for instance: +" +" nnoremap ,ce CVSEdit +" +" The default mappings are as follow: +" +" ce CVSEdit +" cE CVSEditors +" ct CVSUnedit +" cwv CVSWatchers +" cwa CVSWatchAdd +" cwn CVSWatchOn +" cwf CVSWatchOff +" cwr CVSWatchRemove +" +" Options documentation: {{{2 +" +" VCSCommandCVSExec +" This variable specifies the CVS executable. If not set, it defaults to +" 'cvs' executed from the user's executable path. +" +" VCSCommandCVSDiffOpt +" This variable, if set, determines the options passed to the cvs diff +" command. If not set, it defaults to 'u'. + +" Section: Plugin header {{{1 + +if exists('VCSCommandDisableAll') + finish +endif + +if v:version < 700 + echohl WarningMsg|echomsg 'VCSCommand requires at least VIM 7.0'|echohl None + finish +endif + +if !exists('g:loaded_VCSCommand') + runtime plugin/vcscommand.vim +endif + +if !executable(VCSCommandGetOption('VCSCommandCVSExec', 'cvs')) + " CVS is not installed + finish +endif + +let s:save_cpo=&cpo +set cpo&vim + +" Section: Variable initialization {{{1 + +let s:cvsFunctions = {} + +" Section: Utility functions {{{1 + +" Function: s:Executable() {{{2 +" Returns the executable used to invoke cvs suitable for use in a shell +" command. +function! s:Executable() + return shellescape(VCSCommandGetOption('VCSCommandCVSExec', 'cvs')) +endfunction + +" Function: s:DoCommand(cmd, cmdName, statusText, options) {{{2 +" Wrapper to VCSCommandDoCommand to add the name of the CVS executable to the +" command argument. +function! s:DoCommand(cmd, cmdName, statusText, options) + if VCSCommandGetVCSType(expand('%')) == 'CVS' + let fullCmd = s:Executable() . ' ' . a:cmd + let ret = VCSCommandDoCommand(fullCmd, a:cmdName, a:statusText, a:options) + + if ret > 0 + if getline(line('$')) =~ '^cvs \w\+: closing down connection' + $d + 1 + endif + + endif + + return ret + else + throw 'CVS VCSCommand plugin called on non-CVS item.' + endif +endfunction + +" Function: s:GetRevision() {{{2 +" Function for retrieving the current buffer's revision number. +" Returns: Revision number or an empty string if an error occurs. + +function! s:GetRevision() + if !exists('b:VCSCommandBufferInfo') + let b:VCSCommandBufferInfo = s:cvsFunctions.GetBufferInfo() + endif + + if len(b:VCSCommandBufferInfo) > 0 + return b:VCSCommandBufferInfo[0] + else + return '' + endif +endfunction + +" Section: VCS function implementations {{{1 + +" Function: s:cvsFunctions.Identify(buffer) {{{2 +function! s:cvsFunctions.Identify(buffer) + let fileName = resolve(bufname(a:buffer)) + if isdirectory(fileName) + let directoryName = fileName + else + let directoryName = fnamemodify(fileName, ':h') + endif + if strlen(directoryName) > 0 + let CVSRoot = directoryName . '/CVS/Root' + else + let CVSRoot = 'CVS/Root' + endif + if filereadable(CVSRoot) + return 1 + else + return 0 + endif +endfunction + +" Function: s:cvsFunctions.Add(argList) {{{2 +function! s:cvsFunctions.Add(argList) + return s:DoCommand(join(['add'] + a:argList, ' '), 'add', join(a:argList, ' '), {}) +endfunction + +" Function: s:cvsFunctions.Annotate(argList) {{{2 +function! s:cvsFunctions.Annotate(argList) + if len(a:argList) == 0 + if &filetype ==? 'cvsannotate' + " This is a CVSAnnotate buffer. Perform annotation of the version + " indicated by the current line. + let caption = matchstr(getline('.'),'\v^[0-9.]+') + + if VCSCommandGetOption('VCSCommandCVSAnnotateParent', 0) != 0 + if caption != '1.1' + let revmaj = matchstr(caption,'\v[0-9.]+\ze\.[0-9]+') + let revmin = matchstr(caption,'\v[0-9.]+\.\zs[0-9]+') - 1 + if revmin == 0 + " Jump to ancestor branch + let caption = matchstr(revmaj,'\v[0-9.]+\ze\.[0-9]+') + else + let caption = revmaj . "." . revmin + endif + endif + endif + + let options = ['-r' . caption] + else + " CVS defaults to pulling HEAD, regardless of current branch. + " Therefore, always pass desired revision. + let caption = '' + let options = ['-r' . s:GetRevision()] + endif + elseif len(a:argList) == 1 && a:argList[0] !~ '^-' + let caption = a:argList[0] + let options = ['-r' . caption] + else + let caption = join(a:argList) + let options = a:argList + endif + + let resultBuffer = s:DoCommand(join(['-q', 'annotate'] + options), 'annotate', caption, {}) + if resultBuffer > 0 + " Remove header lines from standard error + silent v/^\d\+\%(\.\d\+\)\+/d + endif + return resultBuffer +endfunction + +" Function: s:cvsFunctions.Commit(argList) {{{2 +function! s:cvsFunctions.Commit(argList) + let resultBuffer = s:DoCommand('commit -F "' . a:argList[0] . '"', 'commit', '', {}) + if resultBuffer == 0 + echomsg 'No commit needed.' + endif + return resultBuffer +endfunction + +" Function: s:cvsFunctions.Delete() {{{2 +" By default, use the -f option to remove the file first. If options are +" passed in, use those instead. +function! s:cvsFunctions.Delete(argList) + let options = ['-f'] + let caption = '' + if len(a:argList) > 0 + let options = a:argList + let caption = join(a:argList, ' ') + endif + return s:DoCommand(join(['remove'] + options, ' '), 'delete', caption, {}) +endfunction + +" Function: s:cvsFunctions.Diff(argList) {{{2 +function! s:cvsFunctions.Diff(argList) + if len(a:argList) == 0 + let revOptions = [] + let caption = '' + elseif len(a:argList) <= 2 && match(a:argList, '^-') == -1 + let revOptions = ['-r' . join(a:argList, ' -r')] + let caption = '(' . a:argList[0] . ' : ' . get(a:argList, 1, 'current') . ')' + else + " Pass-through + let caption = join(a:argList, ' ') + let revOptions = a:argList + endif + + let cvsDiffOpt = VCSCommandGetOption('VCSCommandCVSDiffOpt', 'u') + if cvsDiffOpt == '' + let diffOptions = [] + else + let diffOptions = ['-' . cvsDiffOpt] + endif + + return s:DoCommand(join(['diff'] + diffOptions + revOptions), 'diff', caption, {'allowNonZeroExit': 1}) +endfunction + +" Function: s:cvsFunctions.GetBufferInfo() {{{2 +" Provides version control details for the current file. Current version +" number and current repository version number are required to be returned by +" the vcscommand plugin. This CVS extension adds branch name to the return +" list as well. +" Returns: List of results: [revision, repository, branch] + +function! s:cvsFunctions.GetBufferInfo() + let originalBuffer = VCSCommandGetOriginalBuffer(bufnr('%')) + let fileName = bufname(originalBuffer) + if isdirectory(fileName) + let tag = '' + if filereadable(fileName . '/CVS/Tag') + let tagFile = readfile(fileName . '/CVS/Tag') + if len(tagFile) == 1 + let tag = substitute(tagFile[0], '^T', '', '') + endif + endif + return [tag] + endif + let realFileName = fnamemodify(resolve(fileName), ':t') + if !filereadable(fileName) + return ['Unknown'] + endif + let oldCwd = VCSCommandChangeToCurrentFileDir(fileName) + try + let statusText=s:VCSCommandUtility.system(s:Executable() . ' status -- "' . realFileName . '"') + if(v:shell_error) + return [] + endif + let revision=substitute(statusText, '^\_.*Working revision:\s*\(\d\+\%(\.\d\+\)\+\|New file!\)\_.*$', '\1', '') + + " We can still be in a CVS-controlled directory without this being a CVS + " file + if match(revision, '^New file!$') >= 0 + let revision='New' + elseif match(revision, '^\d\+\.\d\+\%(\.\d\+\.\d\+\)*$') <0 + return ['Unknown'] + endif + + let branch=substitute(statusText, '^\_.*Sticky Tag:\s\+\(\d\+\%(\.\d\+\)\+\|\a[A-Za-z0-9-_]*\|(none)\).*$', '\1', '') + let repository=substitute(statusText, '^\_.*Repository revision:\s*\(\d\+\%(\.\d\+\)\+\|New file!\|No revision control file\)\_.*$', '\1', '') + let repository=substitute(repository, '^New file!\|No revision control file$', 'New', '') + return [revision, repository, branch] + finally + call VCSCommandChdir(oldCwd) + endtry +endfunction + +" Function: s:cvsFunctions.Log() {{{2 +function! s:cvsFunctions.Log(argList) + if len(a:argList) == 0 + let options = [] + let caption = '' + elseif len(a:argList) <= 2 && match(a:argList, '^-') == -1 + let options = ['-r' . join(a:argList, ':')] + let caption = options[0] + else + " Pass-through + let options = a:argList + let caption = join(a:argList, ' ') + endif + + return s:DoCommand(join(['log'] + options), 'log', caption, {}) +endfunction + +" Function: s:cvsFunctions.Revert(argList) {{{2 +function! s:cvsFunctions.Revert(argList) + return s:DoCommand('update -C', 'revert', '', {}) +endfunction + +" Function: s:cvsFunctions.Review(argList) {{{2 +function! s:cvsFunctions.Review(argList) + if len(a:argList) == 0 + let versiontag = '(current)' + let versionOption = '' + else + let versiontag = a:argList[0] + let versionOption = ' -r ' . versiontag . ' ' + endif + + return s:DoCommand('-q update -p' . versionOption, 'review', versiontag, {}) +endfunction + +" Function: s:cvsFunctions.Status(argList) {{{2 +function! s:cvsFunctions.Status(argList) + return s:DoCommand(join(['status'] + a:argList, ' '), 'status', join(a:argList, ' '), {}) +endfunction + +" Function: s:cvsFunctions.Update(argList) {{{2 +function! s:cvsFunctions.Update(argList) + return s:DoCommand('update', 'update', '', {}) +endfunction + +" Section: CVS-specific functions {{{1 + +" Function: s:CVSEdit() {{{2 +function! s:CVSEdit() + return s:DoCommand('edit', 'cvsedit', '', {}) +endfunction + +" Function: s:CVSEditors() {{{2 +function! s:CVSEditors() + return s:DoCommand('editors', 'cvseditors', '', {}) +endfunction + +" Function: s:CVSUnedit() {{{2 +function! s:CVSUnedit() + return s:DoCommand('unedit', 'cvsunedit', '', {}) +endfunction + +" Function: s:CVSWatch(onoff) {{{2 +function! s:CVSWatch(onoff) + if a:onoff !~ '^\c\%(on\|off\|add\|remove\)$' + echoerr 'Argument to CVSWatch must be one of [on|off|add|remove]' + return -1 + end + return s:DoCommand('watch ' . tolower(a:onoff), 'cvswatch', '', {}) +endfunction + +" Function: s:CVSWatchers() {{{2 +function! s:CVSWatchers() + return s:DoCommand('watchers', 'cvswatchers', '', {}) +endfunction + +" Annotate setting {{{2 +let s:cvsFunctions.AnnotateSplitRegex = '): ' + +" Section: Command definitions {{{1 +" Section: Primary commands {{{2 +com! CVSEdit call s:CVSEdit() +com! CVSEditors call s:CVSEditors() +com! CVSUnedit call s:CVSUnedit() +com! -nargs=1 CVSWatch call s:CVSWatch() +com! CVSWatchAdd call s:CVSWatch('add') +com! CVSWatchOn call s:CVSWatch('on') +com! CVSWatchOff call s:CVSWatch('off') +com! CVSWatchRemove call s:CVSWatch('remove') +com! CVSWatchers call s:CVSWatchers() + +" Section: Plugin command mappings {{{1 + +let s:cvsExtensionMappings = {} +if !exists("no_plugin_maps") + let mappingInfo = [ + \['CVSEdit', 'CVSEdit', 'e'], + \['CVSEditors', 'CVSEditors', 'E'], + \['CVSUnedit', 'CVSUnedit', 't'], + \['CVSWatchers', 'CVSWatchers', 'wv'], + \['CVSWatchAdd', 'CVSWatch add', 'wa'], + \['CVSWatchOff', 'CVSWatch off', 'wf'], + \['CVSWatchOn', 'CVSWatch on', 'wn'], + \['CVSWatchRemove', 'CVSWatch remove', 'wr'] + \] + + for [pluginName, commandText, shortCut] in mappingInfo + execute 'nnoremap ' . pluginName . ' :' . commandText . '' + if !hasmapto('' . pluginName) + let s:cvsExtensionMappings[shortCut] = commandText + endif + endfor +endif + +" Section: Plugin Registration {{{1 +let s:VCSCommandUtility = VCSCommandRegisterModule('CVS', expand(''), s:cvsFunctions, s:cvsExtensionMappings) + +" Section: Menu items {{{1 +for [s:shortcut, s:command] in [ + \['CVS.&Edit', 'CVSEdit'], + \['CVS.Ed&itors', 'CVSEditors'], + \['CVS.Unedi&t', 'CVSUnedit'], + \['CVS.&Watchers', 'CVSWatchers'], + \['CVS.WatchAdd', 'CVSWatchAdd'], + \['CVS.WatchOn', 'CVSWatchOn'], + \['CVS.WatchOff', 'CVSWatchOff'], + \['CVS.WatchRemove', 'CVSWatchRemove'] + \] + call s:VCSCommandUtility.addMenuItem(s:shortcut, s:command) +endfor +unlet s:shortcut s:command + +let &cpo = s:save_cpo diff --git a/vim/oldStyle/disabled_plugins/vcsgit.vim b/vim/oldStyle/disabled_plugins/vcsgit.vim new file mode 100644 index 0000000..a893d15 --- /dev/null +++ b/vim/oldStyle/disabled_plugins/vcsgit.vim @@ -0,0 +1,249 @@ +" vim600: set foldmethod=marker: +" +" git extension for VCSCommand. +" +" Maintainer: Bob Hiestand +" License: +" Copyright (c) Bob Hiestand +" +" Permission is hereby granted, free of charge, to any person obtaining a copy +" of this software and associated documentation files (the "Software"), to +" deal in the Software without restriction, including without limitation the +" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +" sell copies of the Software, and to permit persons to whom the Software is +" furnished to do so, subject to the following conditions: +" +" The above copyright notice and this permission notice shall be included in +" all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +" IN THE SOFTWARE. +" +" Section: Documentation {{{1 +" +" Options documentation: {{{2 +" +" VCSCommandGitExec +" This variable specifies the git executable. If not set, it defaults to +" 'git' executed from the user's executable path. +" +" VCSCommandGitDiffOpt +" This variable, if set, determines the default options passed to the +" VCSDiff command. If any options (starting with '-') are passed to the +" command, this variable is not used. + +" Section: Plugin header {{{1 + +if exists('VCSCommandDisableAll') + finish +endif + +if v:version < 700 + echohl WarningMsg|echomsg 'VCSCommand requires at least VIM 7.0'|echohl None + finish +endif + +if !exists('g:loaded_VCSCommand') + runtime plugin/vcscommand.vim +endif + +if !executable(VCSCommandGetOption('VCSCommandGitExec', 'git')) + " git is not installed + finish +endif + +let s:save_cpo=&cpo +set cpo&vim + +" Section: Variable initialization {{{1 + +let s:gitFunctions = {} + +" Section: Utility functions {{{1 + +" Function: s:Executable() {{{2 +" Returns the executable used to invoke git suitable for use in a shell +" command. +function! s:Executable() + return shellescape(VCSCommandGetOption('VCSCommandGitExec', 'git')) +endfunction + +" Function: s:DoCommand(cmd, cmdName, statusText, options) {{{2 +" Wrapper to VCSCommandDoCommand to add the name of the git executable to the +" command argument. +function! s:DoCommand(cmd, cmdName, statusText, options) + if VCSCommandGetVCSType(expand('%')) == 'git' + let fullCmd = s:Executable() . ' ' . a:cmd + return VCSCommandDoCommand(fullCmd, a:cmdName, a:statusText, a:options) + else + throw 'git VCSCommand plugin called on non-git item.' + endif +endfunction + +" Section: VCS function implementations {{{1 + +" Function: s:gitFunctions.Identify(buffer) {{{2 +" This function only returns an inexact match due to the detection method used +" by git, which simply traverses the directory structure upward. +function! s:gitFunctions.Identify(buffer) + let oldCwd = VCSCommandChangeToCurrentFileDir(resolve(bufname(a:buffer))) + try + call s:VCSCommandUtility.system(s:Executable() . ' rev-parse --is-inside-work-tree') + if(v:shell_error) + return 0 + else + return g:VCSCOMMAND_IDENTIFY_INEXACT + endif + finally + call VCSCommandChdir(oldCwd) + endtry +endfunction + +" Function: s:gitFunctions.Add(argList) {{{2 +function! s:gitFunctions.Add(argList) + return s:DoCommand(join(['add'] + ['-v'] + a:argList, ' '), 'add', join(a:argList, ' '), {}) +endfunction + +" Function: s:gitFunctions.Annotate(argList) {{{2 +function! s:gitFunctions.Annotate(argList) + if len(a:argList) == 0 + if &filetype == 'gitannotate' + " Perform annotation of the version indicated by the current line. + let options = matchstr(getline('.'),'^\x\+') + else + let options = '' + endif + elseif len(a:argList) == 1 && a:argList[0] !~ '^-' + let options = a:argList[0] + else + let options = join(a:argList, ' ') + endif + + return s:DoCommand('blame ' . options, 'annotate', options, {}) +endfunction + +" Function: s:gitFunctions.Commit(argList) {{{2 +function! s:gitFunctions.Commit(argList) + try + return s:DoCommand('commit -F "' . a:argList[0] . '"', 'commit', '', {}) + catch /\m^Version control command failed.*nothing\%( added\)\? to commit/ + echomsg 'No commit needed.' + endtry +endfunction + +" Function: s:gitFunctions.Delete() {{{2 +" All options are passed through. +function! s:gitFunctions.Delete(argList) + let options = a:argList + let caption = join(a:argList, ' ') + return s:DoCommand(join(['rm'] + options, ' '), 'delete', caption, {}) +endfunction + +" Function: s:gitFunctions.Diff(argList) {{{2 +" Pass-through call to git-diff. If no options (starting with '-') are found, +" then the options in the 'VCSCommandGitDiffOpt' variable are added. +function! s:gitFunctions.Diff(argList) + let gitDiffOpt = VCSCommandGetOption('VCSCommandGitDiffOpt', '') + if gitDiffOpt == '' + let diffOptions = [] + else + let diffOptions = [gitDiffOpt] + for arg in a:argList + if arg =~ '^-' + let diffOptions = [] + break + endif + endfor + endif + + return s:DoCommand(join(['diff'] + diffOptions + a:argList), 'diff', join(a:argList), {}) +endfunction + +" Function: s:gitFunctions.GetBufferInfo() {{{2 +" Provides version control details for the current file. Current version +" number and current repository version number are required to be returned by +" the vcscommand plugin. This CVS extension adds branch name to the return +" list as well. +" Returns: List of results: [revision, repository, branch] + +function! s:gitFunctions.GetBufferInfo() + let oldCwd = VCSCommandChangeToCurrentFileDir(resolve(bufname('%'))) + try + let branch = substitute(s:VCSCommandUtility.system(s:Executable() . ' symbolic-ref -q HEAD'), '\n$', '', '') + if v:shell_error + let branch = 'DETACHED' + else + let branch = substitute(branch, '^refs/heads/', '', '') + endif + + let info = [branch] + + for method in split(VCSCommandGetOption('VCSCommandGitDescribeArgList', (',tags,all,always')), ',', 1) + if method != '' + let method = ' --' . method + endif + let tag = substitute(s:VCSCommandUtility.system(s:Executable() . ' describe' . method), '\n$', '', '') + if !v:shell_error + call add(info, tag) + break + endif + endfor + + return info + finally + call VCSCommandChdir(oldCwd) + endtry +endfunction + +" Function: s:gitFunctions.Log() {{{2 +function! s:gitFunctions.Log(argList) + return s:DoCommand(join(['log'] + a:argList), 'log', join(a:argList, ' '), {}) +endfunction + +" Function: s:gitFunctions.Revert(argList) {{{2 +function! s:gitFunctions.Revert(argList) + return s:DoCommand('checkout', 'revert', '', {}) +endfunction + +" Function: s:gitFunctions.Review(argList) {{{2 +function! s:gitFunctions.Review(argList) + if len(a:argList) == 0 + let revision = 'HEAD' + else + let revision = a:argList[0] + endif + + let oldCwd = VCSCommandChangeToCurrentFileDir(resolve(bufname(VCSCommandGetOriginalBuffer('%')))) + try + let prefix = s:VCSCommandUtility.system(s:Executable() . ' rev-parse --show-prefix') + finally + call VCSCommandChdir(oldCwd) + endtry + + let prefix = substitute(prefix, '\n$', '', '') + let blob = '"' . revision . ':' . prefix . '"' + return s:DoCommand('show ' . blob, 'review', revision, {}) +endfunction + +" Function: s:gitFunctions.Status(argList) {{{2 +function! s:gitFunctions.Status(argList) + return s:DoCommand(join(['status'] + a:argList), 'status', join(a:argList), {'allowNonZeroExit': 1}) +endfunction + +" Function: s:gitFunctions.Update(argList) {{{2 +function! s:gitFunctions.Update(argList) + throw "This command is not implemented for git because file-by-file update doesn't make much sense in that context. If you have an idea for what it should do, please let me know." +endfunction + +" Annotate setting {{{2 +let s:gitFunctions.AnnotateSplitRegex = ') ' + +" Section: Plugin Registration {{{1 +let s:VCSCommandUtility = VCSCommandRegisterModule('git', expand(''), s:gitFunctions, []) + +let &cpo = s:save_cpo diff --git a/vim/oldStyle/disabled_plugins/vcshg.vim b/vim/oldStyle/disabled_plugins/vcshg.vim new file mode 100644 index 0000000..9dbbde8 --- /dev/null +++ b/vim/oldStyle/disabled_plugins/vcshg.vim @@ -0,0 +1,275 @@ +" vim600: set foldmethod=marker: +" +" Mercurial extension for VCSCommand. +" +" Maintainer: Bob Hiestand +" License: +" Copyright (c) Bob Hiestand +" +" Permission is hereby granted, free of charge, to any person obtaining a copy +" of this software and associated documentation files (the "Software"), to +" deal in the Software without restriction, including without limitation the +" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +" sell copies of the Software, and to permit persons to whom the Software is +" furnished to do so, subject to the following conditions: +" +" The above copyright notice and this permission notice shall be included in +" all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +" IN THE SOFTWARE. +" +" Section: Documentation {{{1 +" +" Options documentation: {{{2 +" +" VCSCommandHGExec +" This variable specifies the mercurial executable. If not set, it defaults +" to 'hg' executed from the user's executable path. +" +" VCSCommandHGDiffExt +" This variable, if set, sets the external diff program used by Subversion. +" +" VCSCommandHGDiffOpt +" This variable, if set, determines the options passed to the hg diff +" command (such as 'u', 'w', or 'b'). + +" Section: Plugin header {{{1 + +if exists('VCSCommandDisableAll') + finish +endif + +if v:version < 700 + echohl WarningMsg|echomsg 'VCSCommand requires at least VIM 7.0'|echohl None + finish +endif + +if !exists('g:loaded_VCSCommand') + runtime plugin/vcscommand.vim +endif + +if !executable(VCSCommandGetOption('VCSCommandHGExec', 'hg')) + " HG is not installed + finish +endif + +let s:save_cpo=&cpo +set cpo&vim + +" Section: Variable initialization {{{1 + +let s:hgFunctions = {} + +" Section: Utility functions {{{1 + +" Function: s:Executable() {{{2 +" Returns the executable used to invoke hg suitable for use in a shell +" command. +function! s:Executable() + return shellescape(VCSCommandGetOption('VCSCommandHGExec', 'hg')) +endfunction + +" Function: s:DoCommand(cmd, cmdName, statusText, options) {{{2 +" Wrapper to VCSCommandDoCommand to add the name of the HG executable to the +" command argument. +function! s:DoCommand(cmd, cmdName, statusText, options) + if VCSCommandGetVCSType(expand('%')) == 'HG' + let fullCmd = s:Executable() . ' ' . a:cmd + return VCSCommandDoCommand(fullCmd, a:cmdName, a:statusText, a:options) + else + throw 'HG VCSCommand plugin called on non-HG item.' + endif +endfunction + +" Section: VCS function implementations {{{1 + +" Function: s:hgFunctions.Identify(buffer) {{{2 +function! s:hgFunctions.Identify(buffer) + let oldCwd = VCSCommandChangeToCurrentFileDir(resolve(bufname(a:buffer))) + try + call s:VCSCommandUtility.system(s:Executable() . ' root') + if(v:shell_error) + return 0 + else + return g:VCSCOMMAND_IDENTIFY_INEXACT + endif + finally + call VCSCommandChdir(oldCwd) + endtry +endfunction + +" Function: s:hgFunctions.Add() {{{2 +function! s:hgFunctions.Add(argList) + return s:DoCommand(join(['add -v'] + a:argList, ' '), 'add', join(a:argList, ' '), {}) +endfunction + +" Function: s:hgFunctions.Annotate(argList) {{{2 +function! s:hgFunctions.Annotate(argList) + if len(a:argList) == 0 + if &filetype ==? 'hgannotate' + " Perform annotation of the version indicated by the current line. + let caption = matchstr(getline('.'),'\v^\s*\w+\s+\zs\d+') + let options = ' -un -r' . caption + else + let caption = '' + let options = ' -un' + endif + elseif len(a:argList) == 1 && a:argList[0] !~ '^-' + let caption = a:argList[0] + let options = ' -un -r' . caption + else + let caption = join(a:argList, ' ') + let options = ' ' . caption + endif + + return s:DoCommand('blame' . options, 'annotate', caption, {}) +endfunction + +" Function: s:hgFunctions.Commit(argList) {{{2 +function! s:hgFunctions.Commit(argList) + try + return s:DoCommand('commit -v -l "' . a:argList[0] . '"', 'commit', '', {}) + catch /Version control command failed.*nothing changed/ + echomsg 'No commit needed.' + endtry +endfunction + +" Function: s:hgFunctions.Delete() {{{2 +function! s:hgFunctions.Delete(argList) + return s:DoCommand(join(['remove'] + a:argList, ' '), 'remove', join(a:argList, ' '), {}) +endfunction + +" Function: s:hgFunctions.Diff(argList) {{{2 +function! s:hgFunctions.Diff(argList) + if len(a:argList) == 0 + let revOptions = [] + let caption = '' + elseif len(a:argList) <= 2 && match(a:argList, '^-') == -1 + let revOptions = ['-r' . join(a:argList, ':')] + let caption = '(' . a:argList[0] . ' : ' . get(a:argList, 1, 'current') . ')' + else + " Pass-through + let caption = join(a:argList, ' ') + let revOptions = a:argList + endif + + let hgDiffExt = VCSCommandGetOption('VCSCommandHGDiffExt', '') + if hgDiffExt == '' + let diffExt = [] + else + let diffExt = ['--diff-cmd ' . hgDiffExt] + endif + + let hgDiffOpt = VCSCommandGetOption('VCSCommandHGDiffOpt', '') + if hgDiffOpt == '' + let diffOptions = [] + else + let diffOptions = ['-x -' . hgDiffOpt] + endif + + return s:DoCommand(join(['diff'] + diffExt + diffOptions + revOptions), 'diff', caption, {}) +endfunction + +" Function: s:hgFunctions.Info(argList) {{{2 +function! s:hgFunctions.Info(argList) + return s:DoCommand(join(['log --limit 1'] + a:argList, ' '), 'log', join(a:argList, ' '), {}) +endfunction + +" Function: s:hgFunctions.GetBufferInfo() {{{2 +" Provides version control details for the current file. Current version +" number and current repository version number are required to be returned by +" the vcscommand plugin. +" Returns: List of results: [revision, repository, branch] + +function! s:hgFunctions.GetBufferInfo() + let originalBuffer = VCSCommandGetOriginalBuffer(bufnr('%')) + let fileName = bufname(originalBuffer) + let statusText = s:VCSCommandUtility.system(s:Executable() . ' status -- "' . fileName . '"') + if(v:shell_error) + return [] + endif + + " File not under HG control. + if statusText =~ '^?' + return ['Unknown'] + endif + + let parentsText = s:VCSCommandUtility.system(s:Executable() . ' parents -- "' . fileName . '"') + let revision = matchlist(parentsText, '^changeset:\s\+\(\S\+\)\n')[1] + + let logText = s:VCSCommandUtility.system(s:Executable() . ' log -- "' . fileName . '"') + let repository = matchlist(logText, '^changeset:\s\+\(\S\+\)\n')[1] + + if revision == '' + " Error + return ['Unknown'] + elseif statusText =~ '^A' + return ['New', 'New'] + else + return [revision, repository] + endif +endfunction + +" Function: s:hgFunctions.Log(argList) {{{2 +function! s:hgFunctions.Log(argList) + if len(a:argList) == 0 + let options = [] + let caption = '' + elseif len(a:argList) <= 2 && match(a:argList, '^-') == -1 + let options = ['-r' . join(a:argList, ':')] + let caption = options[0] + else + " Pass-through + let options = a:argList + let caption = join(a:argList, ' ') + endif + + let resultBuffer = s:DoCommand(join(['log', '-v'] + options), 'log', caption, {}) + return resultBuffer +endfunction + +" Function: s:hgFunctions.Revert(argList) {{{2 +function! s:hgFunctions.Revert(argList) + return s:DoCommand('revert', 'revert', '', {}) +endfunction + +" Function: s:hgFunctions.Review(argList) {{{2 +function! s:hgFunctions.Review(argList) + if len(a:argList) == 0 + let versiontag = '(current)' + let versionOption = '' + else + let versiontag = a:argList[0] + let versionOption = ' -r ' . versiontag . ' ' + endif + + return s:DoCommand('cat' . versionOption, 'review', versiontag, {}) +endfunction + +" Function: s:hgFunctions.Status(argList) {{{2 +function! s:hgFunctions.Status(argList) + let options = ['-A', '-v'] + if len(a:argList) != 0 + let options = a:argList + endif + return s:DoCommand(join(['status'] + options, ' '), 'status', join(options, ' '), {}) +endfunction + +" Function: s:hgFunctions.Update(argList) {{{2 +function! s:hgFunctions.Update(argList) + return s:DoCommand('update', 'update', '', {}) +endfunction + +" Annotate setting {{{2 +let s:hgFunctions.AnnotateSplitRegex = '\d\+: ' + +" Section: Plugin Registration {{{1 +let s:VCSCommandUtility = VCSCommandRegisterModule('HG', expand(''), s:hgFunctions, []) + +let &cpo = s:save_cpo diff --git a/vim/oldStyle/disabled_plugins/vcssvk.vim b/vim/oldStyle/disabled_plugins/vcssvk.vim new file mode 100644 index 0000000..f04c9cc --- /dev/null +++ b/vim/oldStyle/disabled_plugins/vcssvk.vim @@ -0,0 +1,259 @@ +" vim600: set foldmethod=marker: +" +" SVK extension for VCSCommand. +" +" Maintainer: Bob Hiestand +" License: +" Copyright (c) Bob Hiestand +" +" Permission is hereby granted, free of charge, to any person obtaining a copy +" of this software and associated documentation files (the "Software"), to +" deal in the Software without restriction, including without limitation the +" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +" sell copies of the Software, and to permit persons to whom the Software is +" furnished to do so, subject to the following conditions: +" +" The above copyright notice and this permission notice shall be included in +" all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +" IN THE SOFTWARE. +" +" Section: Documentation {{{1 +" +" Options documentation: {{{2 +" +" VCSCommandSVKExec +" This variable specifies the SVK executable. If not set, it defaults to +" 'svk' executed from the user's executable path. + +" Section: Plugin header {{{1 + +if exists('VCSCommandDisableAll') + finish +endif + +if v:version < 700 + echohl WarningMsg|echomsg 'VCSCommand requires at least VIM 7.0'|echohl None + finish +endif + +if !exists('g:loaded_VCSCommand') + runtime plugin/vcscommand.vim +endif + +if !executable(VCSCommandGetOption('VCSCommandSVKExec', 'svk')) + " SVK is not installed + finish +endif + +let s:save_cpo=&cpo +set cpo&vim + +" Section: Variable initialization {{{1 + +let s:svkFunctions = {} + +" Section: Utility functions {{{1 + +" Function: s:Executable() {{{2 +" Returns the executable used to invoke SVK suitable for use in a shell +" command. +function! s:Executable() + return shellescape(VCSCommandGetOption('VCSCommandSVKExec', 'svk')) +endfunction + +" Function: s:DoCommand(cmd, cmdName, statusText, options) {{{2 +" Wrapper to VCSCommandDoCommand to add the name of the SVK executable to the +" command argument. +function! s:DoCommand(cmd, cmdName, statusText, options) + if VCSCommandGetVCSType(expand('%')) == 'SVK' + let fullCmd = s:Executable() . ' ' . a:cmd + return VCSCommandDoCommand(fullCmd, a:cmdName, a:statusText, a:options) + else + throw 'SVK VCSCommand plugin called on non-SVK item.' + endif +endfunction + +" Section: VCS function implementations {{{1 + +" Function: s:svkFunctions.Identify(buffer) {{{2 +function! s:svkFunctions.Identify(buffer) + let fileName = resolve(bufname(a:buffer)) + if isdirectory(fileName) + let directoryName = fileName + else + let directoryName = fnamemodify(fileName, ':p:h') + endif + let statusText = s:VCSCommandUtility.system(s:Executable() . ' info -- "' . directoryName . '"', "no") + if(v:shell_error) + return 0 + else + return 1 + endif +endfunction + +" Function: s:svkFunctions.Add() {{{2 +function! s:svkFunctions.Add(argList) + return s:DoCommand(join(['add'] + a:argList, ' '), 'add', join(a:argList, ' '), {}) +endfunction + +" Function: s:svkFunctions.Annotate(argList) {{{2 +function! s:svkFunctions.Annotate(argList) + if len(a:argList) == 0 + if &filetype ==? 'svkannotate' + " Perform annotation of the version indicated by the current line. + let caption = matchstr(getline('.'),'\v^\s+\zs\d+') + let options = ' -r' . caption + else + let caption = '' + let options = '' + endif + elseif len(a:argList) == 1 && a:argList[0] !~ '^-' + let caption = a:argList[0] + let options = ' -r' . caption + else + let caption = join(a:argList, ' ') + let options = ' ' . caption + endif + + let resultBuffer = s:DoCommand('blame' . options, 'annotate', caption, {}) + if resultBuffer > 0 + normal! 1G2dd + endif + return resultBuffer +endfunction + +" Function: s:svkFunctions.Commit(argList) {{{2 +function! s:svkFunctions.Commit(argList) + let resultBuffer = s:DoCommand('commit -F "' . a:argList[0] . '"', 'commit', '', {}) + if resultBuffer == 0 + echomsg 'No commit needed.' + endif +endfunction + +" Function: s:svkFunctions.Delete() {{{2 +function! s:svkFunctions.Delete(argList) + return s:DoCommand(join(['delete'] + a:argList, ' '), 'delete', join(a:argList, ' '), {}) +endfunction + +" Function: s:svkFunctions.Diff(argList) {{{2 +function! s:svkFunctions.Diff(argList) + if len(a:argList) == 0 + let revOptions = [] + let caption = '' + elseif len(a:argList) <= 2 && match(a:argList, '^-') == -1 + let revOptions = ['-r' . join(a:argList, ':')] + let caption = '(' . a:argList[0] . ' : ' . get(a:argList, 1, 'current') . ')' + else + " Pass-through + let caption = join(a:argList, ' ') + let revOptions = a:argList + endif + + return s:DoCommand(join(['diff'] + revOptions), 'diff', caption, {}) +endfunction + +" Function: s:svkFunctions.GetBufferInfo() {{{2 +" Provides version control details for the current file. Current version +" number and current repository version number are required to be returned by +" the vcscommand plugin. +" Returns: List of results: [revision, repository] + +function! s:svkFunctions.GetBufferInfo() + let originalBuffer = VCSCommandGetOriginalBuffer(bufnr('%')) + let fileName = resolve(bufname(originalBuffer)) + let statusText = s:VCSCommandUtility.system(s:Executable() . ' status -v -- "' . fileName . '"') + if(v:shell_error) + return [] + endif + + " File not under SVK control. + if statusText =~ '^?' + return ['Unknown'] + endif + + let [flags, revision, repository] = matchlist(statusText, '^\(.\{3}\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s')[1:3] + if revision == '' + " Error + return ['Unknown'] + elseif flags =~ '^A' + return ['New', 'New'] + else + return [revision, repository] + endif +endfunction + +" Function: s:svkFunctions.Info(argList) {{{2 +function! s:svkFunctions.Info(argList) + return s:DoCommand(join(['info'] + a:argList, ' '), 'info', join(a:argList, ' '), {}) +endfunction + +" Function: s:svkFunctions.Lock(argList) {{{2 +function! s:svkFunctions.Lock(argList) + return s:DoCommand(join(['lock'] + a:argList, ' '), 'lock', join(a:argList, ' '), {}) +endfunction + +" Function: s:svkFunctions.Log() {{{2 +function! s:svkFunctions.Log(argList) + if len(a:argList) == 0 + let options = [] + let caption = '' + elseif len(a:argList) <= 2 && match(a:argList, '^-') == -1 + let options = ['-r' . join(a:argList, ':')] + let caption = options[0] + else + " Pass-through + let options = a:argList + let caption = join(a:argList, ' ') + endif + + let resultBuffer = s:DoCommand(join(['log', '-v'] + options), 'log', caption, {}) + return resultBuffer +endfunction + +" Function: s:svkFunctions.Revert(argList) {{{2 +function! s:svkFunctions.Revert(argList) + return s:DoCommand('revert', 'revert', '', {}) +endfunction + +" Function: s:svkFunctions.Review(argList) {{{2 +function! s:svkFunctions.Review(argList) + if len(a:argList) == 0 + let versiontag = '(current)' + let versionOption = '' + else + let versiontag = a:argList[0] + let versionOption = ' -r ' . versiontag . ' ' + endif + + return s:DoCommand('cat' . versionOption, 'review', versiontag, {}) +endfunction + +" Function: s:svkFunctions.Status(argList) {{{2 +function! s:svkFunctions.Status(argList) + let options = ['-v'] + if len(a:argList) != 0 + let options = a:argList + endif + return s:DoCommand(join(['status'] + options, ' '), 'status', join(options, ' '), {}) +endfunction + +" Function: s:svkFunctions.Unlock(argList) {{{2 +function! s:svkFunctions.Unlock(argList) + return s:DoCommand(join(['unlock'] + a:argList, ' '), 'unlock', join(a:argList, ' '), {}) +endfunction +" Function: s:svkFunctions.Update(argList) {{{2 +function! s:svkFunctions.Update(argList) + return s:DoCommand('update', 'update', '', {}) +endfunction + +" Section: Plugin Registration {{{1 +let s:VCSCommandUtility = VCSCommandRegisterModule('SVK', expand(''), s:svkFunctions, []) + +let &cpo = s:save_cpo diff --git a/vim/oldStyle/disabled_plugins/vcssvn.vim b/vim/oldStyle/disabled_plugins/vcssvn.vim new file mode 100644 index 0000000..eabe92e --- /dev/null +++ b/vim/oldStyle/disabled_plugins/vcssvn.vim @@ -0,0 +1,285 @@ +" vim600: set foldmethod=marker: +" +" SVN extension for VCSCommand. +" +" Maintainer: Bob Hiestand +" License: +" Copyright (c) Bob Hiestand +" +" Permission is hereby granted, free of charge, to any person obtaining a copy +" of this software and associated documentation files (the "Software"), to +" deal in the Software without restriction, including without limitation the +" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +" sell copies of the Software, and to permit persons to whom the Software is +" furnished to do so, subject to the following conditions: +" +" The above copyright notice and this permission notice shall be included in +" all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +" IN THE SOFTWARE. +" +" Section: Documentation {{{1 +" +" Options documentation: {{{2 +" +" VCSCommandSVNExec +" This variable specifies the SVN executable. If not set, it defaults to +" 'svn' executed from the user's executable path. +" +" VCSCommandSVNDiffExt +" This variable, if set, sets the external diff program used by Subversion. +" +" VCSCommandSVNDiffOpt +" This variable, if set, determines the options passed to the svn diff +" command (such as 'u', 'w', or 'b'). + +" Section: Plugin header {{{1 + +if exists('VCSCommandDisableAll') + finish +endif + +if v:version < 700 + echohl WarningMsg|echomsg 'VCSCommand requires at least VIM 7.0'|echohl None + finish +endif + +if !exists('g:loaded_VCSCommand') + runtime plugin/vcscommand.vim +endif + +if !executable(VCSCommandGetOption('VCSCommandSVNExec', 'svn')) + " SVN is not installed + finish +endif + +let s:save_cpo=&cpo +set cpo&vim + +" Section: Variable initialization {{{1 + +let s:svnFunctions = {} + +" Section: Utility functions {{{1 + +" Function: s:Executable() {{{2 +" Returns the executable used to invoke git suitable for use in a shell +" command. +function! s:Executable() + return shellescape(VCSCommandGetOption('VCSCommandSVNExec', 'svn')) +endfunction + +" Function: s:DoCommand(cmd, cmdName, statusText, options) {{{2 +" Wrapper to VCSCommandDoCommand to add the name of the SVN executable to the +" command argument. +function! s:DoCommand(cmd, cmdName, statusText, options) + if VCSCommandGetVCSType(expand('%')) == 'SVN' + let fullCmd = s:Executable() . ' ' . a:cmd + return VCSCommandDoCommand(fullCmd, a:cmdName, a:statusText, a:options) + else + throw 'SVN VCSCommand plugin called on non-SVN item.' + endif +endfunction + +" Section: VCS function implementations {{{1 + +" Function: s:svnFunctions.Identify(buffer) {{{2 +function! s:svnFunctions.Identify(buffer) + let oldCwd = VCSCommandChangeToCurrentFileDir(resolve(bufname(a:buffer))) + try + call s:VCSCommandUtility.system(s:Executable() . ' info .') + if(v:shell_error) + return 0 + else + return g:VCSCOMMAND_IDENTIFY_EXACT + endif + finally + call VCSCommandChdir(oldCwd) + endtry +endfunction + +" Function: s:svnFunctions.Add() {{{2 +function! s:svnFunctions.Add(argList) + return s:DoCommand(join(['add'] + a:argList, ' '), 'add', join(a:argList, ' '), {}) +endfunction + +" Function: s:svnFunctions.Annotate(argList) {{{2 +function! s:svnFunctions.Annotate(argList) + if len(a:argList) == 0 + if &filetype ==? 'svnannotate' + " Perform annotation of the version indicated by the current line. + let caption = matchstr(getline('.'),'\v^\s+\zs\d+') + let options = ' -r' . caption + else + let caption = '' + let options = '' + endif + elseif len(a:argList) == 1 && a:argList[0] !~ '^-' + let caption = a:argList[0] + let options = ' -r' . caption + else + let caption = join(a:argList, ' ') + let options = ' ' . caption + endif + + return s:DoCommand('blame --non-interactive' . options, 'annotate', caption, {}) +endfunction + +" Function: s:svnFunctions.Commit(argList) {{{2 +function! s:svnFunctions.Commit(argList) + let resultBuffer = s:DoCommand('commit --non-interactive -F "' . a:argList[0] . '"', 'commit', '', {}) + if resultBuffer == 0 + echomsg 'No commit needed.' + endif +endfunction + +" Function: s:svnFunctions.Delete() {{{2 +function! s:svnFunctions.Delete(argList) + return s:DoCommand(join(['delete --non-interactive'] + a:argList, ' '), 'delete', join(a:argList, ' '), {}) +endfunction + +" Function: s:svnFunctions.Diff(argList) {{{2 +function! s:svnFunctions.Diff(argList) + if len(a:argList) == 0 + let revOptions = [] + let caption = '' + elseif len(a:argList) <= 2 && match(a:argList, '^-') == -1 + let revOptions = ['-r' . join(a:argList, ':')] + let caption = '(' . a:argList[0] . ' : ' . get(a:argList, 1, 'current') . ')' + else + " Pass-through + let caption = join(a:argList, ' ') + let revOptions = a:argList + endif + + let svnDiffExt = VCSCommandGetOption('VCSCommandSVNDiffExt', '') + if svnDiffExt == '' + let diffExt = [] + else + let diffExt = ['--diff-cmd ' . svnDiffExt] + endif + + let svnDiffOpt = VCSCommandGetOption('VCSCommandSVNDiffOpt', '') + if svnDiffOpt == '' + let diffOptions = [] + else + let diffOptions = ['-x -' . svnDiffOpt] + endif + + return s:DoCommand(join(['diff --non-interactive'] + diffExt + diffOptions + revOptions), 'diff', caption, {}) +endfunction + +" Function: s:svnFunctions.GetBufferInfo() {{{2 +" Provides version control details for the current file. Current version +" number and current repository version number are required to be returned by +" the vcscommand plugin. +" Returns: List of results: [revision, repository, branch] + +function! s:svnFunctions.GetBufferInfo() + let originalBuffer = VCSCommandGetOriginalBuffer(bufnr('%')) + let fileName = bufname(originalBuffer) + let statusText = s:VCSCommandUtility.system(s:Executable() . ' status --non-interactive -v -- "' . fileName . '"') + if(v:shell_error) + return [] + endif + + " File not under SVN control. + if statusText =~ '^?' + return ['Unknown'] + endif + " File explicitly ignored by SVN. + if statusText =~ '^I' + return ['Ignored'] + endif + + let [flags, revision, repository] = matchlist(statusText, '^\(.\{9}\)\s*\(\d\+\)\s\+\(\d\+\)')[1:3] + if revision == '' + " Error + return ['Unknown'] + elseif flags =~ '^A' + return ['New', 'New'] + elseif flags =~ '*' + return [revision, repository, '*'] + else + return [revision, repository] + endif +endfunction + +" Function: s:svnFunctions.Info(argList) {{{2 +function! s:svnFunctions.Info(argList) + return s:DoCommand(join(['info --non-interactive'] + a:argList, ' '), 'info', join(a:argList, ' '), {}) +endfunction + +" Function: s:svnFunctions.Lock(argList) {{{2 +function! s:svnFunctions.Lock(argList) + return s:DoCommand(join(['lock --non-interactive'] + a:argList, ' '), 'lock', join(a:argList, ' '), {}) +endfunction + +" Function: s:svnFunctions.Log(argList) {{{2 +function! s:svnFunctions.Log(argList) + if len(a:argList) == 0 + let options = [] + let caption = '' + elseif len(a:argList) <= 2 && match(a:argList, '^-') == -1 + let options = ['-r' . join(a:argList, ':')] + let caption = options[0] + else + " Pass-through + let options = a:argList + let caption = join(a:argList, ' ') + endif + + let resultBuffer = s:DoCommand(join(['log --non-interactive', '-v'] + options), 'log', caption, {}) + return resultBuffer +endfunction + +" Function: s:svnFunctions.Revert(argList) {{{2 +function! s:svnFunctions.Revert(argList) + return s:DoCommand('revert', 'revert', '', {}) +endfunction + +" Function: s:svnFunctions.Review(argList) {{{2 +function! s:svnFunctions.Review(argList) + if len(a:argList) == 0 + let versiontag = '(current)' + let versionOption = '' + else + let versiontag = a:argList[0] + let versionOption = ' -r ' . versiontag . ' ' + endif + + return s:DoCommand('cat --non-interactive' . versionOption, 'review', versiontag, {}) +endfunction + +" Function: s:svnFunctions.Status(argList) {{{2 +function! s:svnFunctions.Status(argList) + let options = ['-u', '-v'] + if len(a:argList) != 0 + let options = a:argList + endif + return s:DoCommand(join(['status --non-interactive'] + options, ' '), 'status', join(options, ' '), {}) +endfunction + +" Function: s:svnFunctions.Unlock(argList) {{{2 +function! s:svnFunctions.Unlock(argList) + return s:DoCommand(join(['unlock --non-interactive'] + a:argList, ' '), 'unlock', join(a:argList, ' '), {}) +endfunction + +" Function: s:svnFunctions.Update(argList) {{{2 +function! s:svnFunctions.Update(argList) + return s:DoCommand('update --non-interactive', 'update', '', {}) +endfunction + +" Annotate setting {{{2 +let s:svnFunctions.AnnotateSplitRegex = '\s\+\S\+\s\+\S\+ ' + +" Section: Plugin Registration {{{1 +let s:VCSCommandUtility = VCSCommandRegisterModule('SVN', expand(''), s:svnFunctions, []) + +let &cpo = s:save_cpo diff --git a/vim/templates/skeleton.c b/vim/oldStyle/templates/skeleton.c similarity index 100% rename from vim/templates/skeleton.c rename to vim/oldStyle/templates/skeleton.c diff --git a/vim/templates/skeleton.pl b/vim/oldStyle/templates/skeleton.pl similarity index 100% rename from vim/templates/skeleton.pl rename to vim/oldStyle/templates/skeleton.pl diff --git a/vim/templates/skeleton.py b/vim/oldStyle/templates/skeleton.py similarity index 100% rename from vim/templates/skeleton.py rename to vim/oldStyle/templates/skeleton.py diff --git a/vim/templates/skeleton.sh b/vim/oldStyle/templates/skeleton.sh similarity index 100% rename from vim/templates/skeleton.sh rename to vim/oldStyle/templates/skeleton.sh diff --git a/vim/vimrc b/vim/vimrc index a987044..20277e5 100644 --- a/vim/vimrc +++ b/vim/vimrc @@ -17,6 +17,24 @@ set nostartofline set autochdir set clipboard+=unnamed +" Vundle +set rtp+=~/.vim/bundle/Vundle.vim +call vundle#begin() + +Plugin 'gmarik/Vundle.vim' +Plugin 'The-NERD-Commenter' +Plugin 'The-NERD-Tree' +Plugin 'open-terminal-filemanager' +Plugin 'Conque-Shell' +Plugin 'taglist-plus' +Plugin 'vcscommand.vim' +Plugin 'TextFormat' +Plugin 'jsbeautify' +Plugin 'aperezdc/vim-template.git' + +call vundle#end() " required +filetype plugin indent on " required + " Let's go to 256 colors set t_Co=256 @@ -72,8 +90,7 @@ else set printfont=Monaco\ 12 endif -" colorscheme wombat256 -colorscheme railscasts +colorscheme wombat256 " """"""""" " User Info