From 3f1cdba79985045b80508587a346472a75d6f913 Mon Sep 17 00:00:00 2001 From: amix Date: Sat, 13 Apr 2013 14:45:21 -0300 Subject: [PATCH 01/13] Updated all plugins that are non-forked. Added some new plugins. Added update_plugins.py which can fetch new plugins from GitHub. New plugins added: zencoding, vim-indent-object, taglist, nginx.vim --- .gitignore | 4 + README.md | 4 + sources_forked/yankring/doc/tags | 40 + sources_forked/zencoding/.gitignore | 1 + sources_forked/zencoding/.gitmodules | 4 + sources_forked/zencoding/Makefile | 11 + sources_forked/zencoding/README.mkd | 103 + sources_forked/zencoding/TODO | 0 sources_forked/zencoding/TUTORIAL | 212 + .../zencoding/autoload/zencoding.vim | 1486 ++++++ .../zencoding/autoload/zencoding/lang.vim | 11 + .../zencoding/autoload/zencoding/lang/css.vim | 228 + .../autoload/zencoding/lang/haml.vim | 310 ++ .../autoload/zencoding/lang/html.vim | 692 +++ .../autoload/zencoding/lang/sass.vim | 158 + .../autoload/zencoding/lang/scss.vim | 121 + .../autoload/zencoding/lang/slim.vim | 276 + .../zencoding/autoload/zencoding/util.vim | 249 + sources_forked/zencoding/doc/zencoding.txt | 438 ++ sources_forked/zencoding/plugin/zencoding.vim | 215 + sources_forked/zencoding/unittest.vim | 794 +++ sources_forked/zencoding/zencoding.vim.vimup | 265 + sources_non_forked/ack.vim/README.md | 24 +- sources_non_forked/ack.vim/doc/ack.txt | 14 + sources_non_forked/ack.vim/plugin/ack.vim | 130 +- sources_non_forked/bufexplorer.zip/README | 20 - sources_non_forked/bufexplorer/README.md | 39 + .../doc/bufexplorer.txt | 2 +- sources_non_forked/bufexplorer/doc/tags | 24 + .../plugin/bufexplorer.vim | 2 +- .../ctrlp.vim/autoload/ctrlp.vim | 720 ++- .../ctrlp.vim/autoload/ctrlp/buffertag.vim | 46 +- .../ctrlp.vim/autoload/ctrlp/changes.vim | 5 +- .../ctrlp.vim/autoload/ctrlp/dir.vim | 7 +- .../ctrlp.vim/autoload/ctrlp/line.vim | 9 +- .../ctrlp.vim/autoload/ctrlp/mixed.vim | 7 +- .../ctrlp.vim/autoload/ctrlp/mrufiles.vim | 81 +- .../ctrlp.vim/autoload/ctrlp/quickfix.vim | 19 +- .../ctrlp.vim/autoload/ctrlp/rtscript.vim | 17 +- .../ctrlp.vim/autoload/ctrlp/tag.vim | 14 +- .../ctrlp.vim/autoload/ctrlp/utils.vim | 54 +- sources_non_forked/ctrlp.vim/doc/ctrlp.txt | 352 +- sources_non_forked/ctrlp.vim/plugin/ctrlp.vim | 8 +- sources_non_forked/ctrlp.vim/readme.md | 25 +- sources_non_forked/nerdtree/README.markdown | 4 + .../nerdtree/autoload/nerdtree.vim | 1367 +++++ sources_non_forked/nerdtree/doc/NERD_tree.txt | 31 + .../nerdtree/nerdtree_plugin/fs_menu.vim | 48 +- .../nerdtree/plugin/NERD_tree.vim | 4245 +-------------- .../nerdtree/plugin/nerdtree/bookmark.vim | 315 ++ .../nerdtree/plugin/nerdtree/creator.vim | 322 ++ .../nerdtree/plugin/nerdtree/key_map.vim | 143 + .../plugin/nerdtree/menu_controller.vim | 180 + .../nerdtree/plugin/nerdtree/menu_item.vim | 114 + .../nerdtree/plugin/nerdtree/opener.vim | 264 + .../nerdtree/plugin/nerdtree/path.vim | 724 +++ .../plugin/nerdtree/tree_dir_node.vim | 528 ++ .../plugin/nerdtree/tree_file_node.vim | 485 ++ sources_non_forked/nginx-vim/README.md | 7 + .../nginx-vim/ftdetect/nginx.vim | 2 + sources_non_forked/nginx-vim/indent/nginx.vim | 9 + sources_non_forked/nginx-vim/syntax/nginx.vim | 664 +++ sources_non_forked/nginx.vim/README | 3 + sources_non_forked/nginx.vim/syntax/nginx.vim | 664 +++ .../snipmate-snippets/.gitignore | 16 + .../snipmate-snippets/README.md | 47 - sources_non_forked/snipmate-snippets/Rakefile | 24 + .../_/date/date + time.snippet | 1 + .../snipmate-snippets/_/date/date.snippet | 1 + .../snipmate-snippets/_/lorem.snippet | 1 + .../snipmate-snippets/_/modeline.snippet | 1 + .../snipmate-snippets/ant/skel/basic.snippet | 29 + .../snipmate-snippets/c/cl.snippet | 7 + .../snipmate-snippets/c/def.snippet | 3 + .../snipmate-snippets/c/do.snippet | 3 + .../snipmate-snippets/c/el.snippet | 3 + .../snipmate-snippets/c/for.snippet | 3 + .../snipmate-snippets/c/forr.snippet | 3 + .../snipmate-snippets/c/fpf.snippet | 1 + .../snipmate-snippets/c/fun.snippet | 4 + .../snipmate-snippets/c/if.snippet | 3 + .../snipmate-snippets/c/inc/inc.snippet | 1 + .../c/inc/inc_global.snippet | 1 + .../snipmate-snippets/c/main.snippet | 5 + .../snipmate-snippets/c/map.snippet | 1 + .../snipmate-snippets/c/ns.snippet | 3 + .../snipmate-snippets/c/once.snippet | 6 + .../snipmate-snippets/c/pr.snippet | 1 + .../snipmate-snippets/c/readfile.snippet | 7 + .../snipmate-snippets/c/st.snippet | 3 + .../snipmate-snippets/c/t.snippet | 1 + .../snipmate-snippets/c/td.snippet | 1 + .../snipmate-snippets/c/tds.snippet | 3 + .../snipmate-snippets/c/vector.snippet | 1 + .../snipmate-snippets/c/wh.snippet | 3 + .../snipmate-snippets/css/#.snippet | 3 + .../css/background/all.snippet | 1 + .../css/background/attachment.snippet | 1 + .../css/background/color.snippet | 1 + .../css/background/color_name.snippet | 1 + .../css/background/color_rgb.snippet | 1 + .../css/background/color_transparent.snippet | 1 + .../css/background/image_none.snippet | 1 + .../css/background/image_url.snippet | 1 + .../css/background/position.snippet | 1 + .../css/background/repeat.snippet | 1 + .../css/border/basic.snippet | 1 + .../css/border/color.snippet | 1 + .../css/border/style.snippet | 1 + .../css/border/width.snippet | 1 + .../css/borderb/basic.snippet | 1 + .../css/borderb/color.snippet | 1 + .../css/borderb/style.snippet | 1 + .../css/borderb/width.snippet | 1 + .../css/borderl/basic.snippet | 1 + .../css/borderl/color.snippet | 1 + .../css/borderl/style.snippet | 1 + .../css/borderl/width.snippet | 1 + .../css/borderr/basic.snippet | 1 + .../css/borderr/color.snippet | 1 + .../css/borderr/style.snippet | 1 + .../css/borderr/width.snippet | 1 + .../css/bordert/basic.snippet | 1 + .../css/bordert/color.snippet | 1 + .../css/bordert/style.snippet | 1 + .../css/bordert/width.snippet | 1 + .../snipmate-snippets/css/cl.snippet | 3 + .../snipmate-snippets/css/clear.snippet | 1 + .../snipmate-snippets/css/color.snippet | 1 + .../snipmate-snippets/css/colorn.snippet | 1 + .../snipmate-snippets/css/colorr.snippet | 1 + .../snipmate-snippets/css/cursor.snippet | 1 + .../snipmate-snippets/css/cursuru.snippet | 1 + .../snipmate-snippets/css/direction.snippet | 1 + .../css/display/block.snippet | 1 + .../css/display/common.snippet | 1 + .../css/display/inline.snippet | 1 + .../css/display/table.snippet | 1 + .../snipmate-snippets/css/float.snippet | 1 + .../snipmate-snippets/css/font/all.snippet | 1 + .../snipmate-snippets/css/font/family.snippet | 1 + .../snipmate-snippets/css/font/size.snippet | 1 + .../css/font/size_font.snippet | 1 + .../snipmate-snippets/css/font/style.snippet | 1 + .../css/font/variant.snippet | 1 + .../snipmate-snippets/css/font/weight.snippet | 1 + .../snipmate-snippets/css/i.snippet | 1 + .../snipmate-snippets/css/letter.snippet | 1 + .../snipmate-snippets/css/letterem.snippet | 1 + .../snipmate-snippets/css/letterpx.snippet | 1 + .../css/list-style/image.snippet | 1 + .../css/list-style/position.snippet | 1 + .../css/list-style/type_asian.snippet | 1 + .../css/list-style/type_marker.snippet | 1 + .../css/list-style/type_numeric.snippet | 1 + .../css/list-style/type_other.snippet | 1 + .../list-style/type_position_image.snippet | 1 + .../list-style/type_roman_alpha_greek.snippet | 1 + .../snipmate-snippets/css/margin.snippet | 1 + .../snipmate-snippets/css/marginb.snippet | 1 + .../snipmate-snippets/css/marginl.snippet | 1 + .../css/margino/T_R_B_L.snippet | 1 + .../snipmate-snippets/css/margino/V_H.snippet | 1 + .../snipmate-snippets/css/margino/all.snippet | 1 + .../css/margino/bottom.snippet | 1 + .../css/margino/left.snippet | 1 + .../css/margino/right.snippet | 1 + .../snipmate-snippets/css/margino/top.snippet | 1 + .../snipmate-snippets/css/marginr.snippet | 1 + .../snipmate-snippets/css/margint.snippet | 1 + .../css/marker/offset_auto.snippet | 1 + .../css/marker/offset_length.snippet | 1 + .../snipmate-snippets/css/opacity.snippet | 3 + .../snipmate-snippets/css/overflow.snippet | 1 + .../snipmate-snippets/css/padding.snippet | 1 + .../snipmate-snippets/css/paddingb.snippet | 1 + .../snipmate-snippets/css/paddingl.snippet | 1 + .../css/paddingo/T_R_B_L.snippet | 1 + .../css/paddingo/V_H.snippet | 1 + .../css/paddingo/all.snippet | 1 + .../css/paddingo/bottom.snippet | 1 + .../css/paddingo/left.snippet | 1 + .../css/paddingo/right.snippet | 1 + .../css/paddingo/top.snippet | 1 + .../snipmate-snippets/css/paddingr.snippet | 1 + .../snipmate-snippets/css/paddingt.snippet | 1 + .../snipmate-snippets/css/position.snippet | 1 + .../snipmate-snippets/css/scrollbar.snippet | 8 + .../snipmate-snippets/css/tag.snippet | 3 + .../snipmate-snippets/css/text/align.snippet | 1 + .../css/text/decoration.snippet | 1 + .../snipmate-snippets/css/text/indent.snippet | 1 + .../css/text/shadow_hex.snippet | 1 + .../css/text/shadow_none.snippet | 1 + .../css/text/shadow_rgb.snippet | 1 + .../css/text/transform.snippet | 1 + .../css/text/transform_none.snippet | 1 + .../snipmate-snippets/css/vertical.snippet | 1 + .../snipmate-snippets/css/visibility.snippet | 1 + .../snipmate-snippets/css/white.snippet | 1 + .../css/word/spacing_length.snippet | 1 + .../css/word/spacing_normal.snippet | 1 + .../snipmate-snippets/css/z.snippet | 1 + .../eruby-rails/conf.snippet | 3 + .../snipmate-snippets/eruby-rails/cs.snippet | 1 + .../snipmate-snippets/eruby-rails/ct.snippet | 1 + .../snipmate-snippets/eruby-rails/end.snippet | 1 + .../snipmate-snippets/eruby-rails/ff.snippet | 3 + .../eruby-rails/ffcb.snippet | 1 + .../snipmate-snippets/eruby-rails/ffe.snippet | 5 + .../eruby-rails/ffff.snippet | 1 + .../eruby-rails/ffhf.snippet | 1 + .../snipmate-snippets/eruby-rails/ffl.snippet | 1 + .../eruby-rails/ffpf.snippet | 1 + .../eruby-rails/ffrb.snippet | 1 + .../snipmate-snippets/eruby-rails/ffs.snippet | 1 + .../eruby-rails/ffta.snippet | 1 + .../eruby-rails/fftf.snippet | 1 + .../eruby-rails/fields.snippet | 3 + .../snipmate-snippets/eruby-rails/for.snippet | 3 + .../snipmate-snippets/eruby-rails/ft.snippet | 3 + .../snipmate-snippets/eruby-rails/i18.snippet | 1 + .../snipmate-snippets/eruby-rails/it.snippet | 1 + .../snipmate-snippets/eruby-rails/jit.snippet | 1 + .../eruby-rails/jsit.snippet | 1 + .../snipmate-snippets/eruby-rails/lia.snippet | 1 + .../eruby-rails/liai.snippet | 1 + .../snipmate-snippets/eruby-rails/lic.snippet | 1 + .../eruby-rails/lica.snippet | 1 + .../eruby-rails/licai.snippet | 1 + .../snipmate-snippets/eruby-rails/lim.snippet | 1 + .../eruby-rails/linp.snippet | 1 + .../eruby-rails/linpp.snippet | 1 + .../snipmate-snippets/eruby-rails/lip.snippet | 1 + .../eruby-rails/lipp.snippet | 1 + .../snipmate-snippets/eruby-rails/lt.snippet | 1 + .../eruby-rails/ofcfs.snippet | 1 + .../snipmate-snippets/eruby-rails/rf.snippet | 1 + .../snipmate-snippets/eruby-rails/rp.snippet | 1 + .../snipmate-snippets/eruby-rails/rt.snippet | 1 + .../snipmate-snippets/eruby-rails/slt.snippet | 1 + .../eruby-rails/sslt.snippet | 1 + .../snipmate-snippets/eruby-rails/st.snippet | 1 + .../snipmate-snippets/eruby/if.snippet | 3 + .../snipmate-snippets/eruby/ife.snippet | 4 + .../snipmate-snippets/eruby/unless.snippet | 3 + .../snipmate-snippets/eruby/unlesse.snippet | 4 + .../snipmate-snippets/haml/conf.snippet | 3 + .../snipmate-snippets/haml/cs.snippet | 1 + .../snipmate-snippets/haml/ff.snippet | 2 + .../snipmate-snippets/haml/ffcb.snippet | 1 + .../snipmate-snippets/haml/ffe.snippet | 4 + .../snipmate-snippets/haml/ffff.snippet | 1 + .../snipmate-snippets/haml/ffhf.snippet | 1 + .../snipmate-snippets/haml/ffl.snippet | 1 + .../snipmate-snippets/haml/ffpf.snippet | 1 + .../snipmate-snippets/haml/ffrb.snippet | 1 + .../snipmate-snippets/haml/ffs.snippet | 1 + .../snipmate-snippets/haml/ffta.snippet | 1 + .../snipmate-snippets/haml/fftf.snippet | 1 + .../snipmate-snippets/haml/fields.snippet | 2 + .../snipmate-snippets/haml/for.snippet | 6 + .../snipmate-snippets/haml/ft.snippet | 2 + .../snipmate-snippets/haml/if.snippet | 2 + .../snipmate-snippets/haml/ife.snippet | 4 + .../snipmate-snippets/haml/it.snippet | 1 + .../snipmate-snippets/haml/jit.snippet | 1 + .../snipmate-snippets/haml/jsit.snippet | 1 + .../snipmate-snippets/haml/lia.snippet | 1 + .../snipmate-snippets/haml/liai.snippet | 1 + .../snipmate-snippets/haml/lic.snippet | 1 + .../snipmate-snippets/haml/lica.snippet | 1 + .../snipmate-snippets/haml/licai.snippet | 1 + .../snipmate-snippets/haml/lim.snippet | 1 + .../snipmate-snippets/haml/linp.snippet | 1 + .../snipmate-snippets/haml/linpp.snippet | 1 + .../snipmate-snippets/haml/lip.snippet | 1 + .../snipmate-snippets/haml/lipp.snippet | 1 + .../snipmate-snippets/haml/lt.snippet | 1 + .../snipmate-snippets/haml/ofcfs.snippet | 1 + .../snipmate-snippets/haml/rf.snippet | 1 + .../snipmate-snippets/haml/rp.snippet | 1 + .../snipmate-snippets/haml/rt.snippet | 1 + .../snipmate-snippets/haml/slt.snippet | 1 + .../snipmate-snippets/haml/sslt.snippet | 1 + .../snipmate-snippets/haml/st.snippet | 1 + .../snipmate-snippets/haml/unless.snippet | 3 + .../snipmate-snippets/haml/unlesse.snippet | 4 + .../snipmate-snippets/html/base.snippet | 1 + .../snipmate-snippets/html/body.snippet | 3 + .../snipmate-snippets/html/div.snippet | 3 + .../snipmate-snippets/html/doctype.snippet | 1 + .../snipmate-snippets/html/form.snippet | 5 + .../snipmate-snippets/html/h1.snippet | 1 + .../snipmate-snippets/html/head.snippet | 5 + .../snipmate-snippets/html/href.snippet | 1 + .../snipmate-snippets/html/ifie.snippet | 1 + .../snipmate-snippets/html/img.snippet | 1 + .../snipmate-snippets/html/input.snippet | 1 + .../snipmate-snippets/html/inputl.snippet | 2 + .../snipmate-snippets/html/label.snippet | 1 + .../snipmate-snippets/html/link.snippet | 1 + .../snipmate-snippets/html/mailto.snippet | 1 + .../snipmate-snippets/html/meta.snippet | 1 + .../snipmate-snippets/html/option.snippet | 1 + .../html/script/include_script.snippet | 1 + .../html/script/inline_script.snippet | 5 + .../snipmate-snippets/html/select.snippet | 3 + .../snipmate-snippets/html/skel/basic.snippet | 13 + .../html/skel/basic_with_meta.snippet | 15 + .../snipmate-snippets/html/style.snippet | 3 + .../snipmate-snippets/html/t.snippet | 3 + .../html/table/basic.snippet | 3 + .../html/table/hardcore.snippet | 9 + .../snipmate-snippets/html/textarea.snippet | 1 + .../java/class/basic+constructor+main.snippet | 17 + .../java/class/basic+constructor.snippet | 14 + .../java/class/basic.snippet | 14 + .../snipmate-snippets/java/for.snippet | 3 + .../snipmate-snippets/java/gs.snippet | 9 + .../snipmate-snippets/java/if.snippet | 3 + .../snipmate-snippets/java/ife.snippet | 4 + .../snipmate-snippets/java/log.snippet | 1 + .../snipmate-snippets/java/m.snippet | 8 + .../javascript-jquery/add.snippet | 1 + .../javascript-jquery/addClass.snippet | 1 + .../javascript-jquery/after.snippet | 1 + .../javascript-jquery/ajax.snippet | 18 + .../javascript-jquery/ajaxerror.snippet | 4 + .../javascript-jquery/ajaxget.snippet | 3 + .../javascript-jquery/ajaxgetif.snippet | 3 + .../javascript-jquery/ajaxpost.snippet | 5 + .../javascript-jquery/ajaxsend.snippet | 4 + .../javascript-jquery/ajaxsetup.snippet | 18 + .../javascript-jquery/ajaxstart.snippet | 4 + .../javascript-jquery/ajaxstop.snippet | 4 + .../javascript-jquery/ajaxsuccess.snippet | 4 + .../javascript-jquery/animate.snippet | 1 + .../javascript-jquery/append.snippet | 1 + .../javascript-jquery/appendTo.snippet | 1 + .../javascript-jquery/attr.snippet | 1 + .../javascript-jquery/attrm.snippet | 1 + .../javascript-jquery/before.snippet | 1 + .../javascript-jquery/bind.snippet | 3 + .../javascript-jquery/blur.snippet | 3 + .../javascript-jquery/change.snippet | 3 + .../javascript-jquery/children.snippet | 1 + .../javascript-jquery/click.snippet | 3 + .../javascript-jquery/clone.snippet | 1 + .../javascript-jquery/contains.snippet | 1 + .../javascript-jquery/css.snippet | 1 + .../javascript-jquery/cssm.snippet | 1 + .../javascript-jquery/dblclick.snippet | 3 + .../javascript-jquery/each.snippet | 3 + .../javascript-jquery/el.snippet | 1 + .../javascript-jquery/eltrim.snippet | 1 + .../javascript-jquery/end.snippet | 1 + .../javascript-jquery/error.snippet | 3 + .../javascript-jquery/fadein.snippet | 1 + .../javascript-jquery/fadeinc.snippet | 3 + .../javascript-jquery/fadeout.snippet | 1 + .../javascript-jquery/fadeoutc.snippet | 3 + .../javascript-jquery/fadeto.snippet | 1 + .../javascript-jquery/fadetoc.snippet | 3 + .../javascript-jquery/filter.snippet | 1 + .../javascript-jquery/find.snippet | 1 + .../javascript-jquery/focus.snippet | 3 + .../javascript-jquery/get.snippet | 1 + .../javascript-jquery/getjson.snippet | 5 + .../javascript-jquery/getscript.snippet | 3 + .../javascript-jquery/height.snippet | 1 + .../javascript-jquery/hide.snippet | 1 + .../javascript-jquery/hidec.snippet | 3 + .../javascript-jquery/hover.snippet | 5 + .../javascript-jquery/html.snippet | 1 + .../javascript-jquery/insertAfter.snippet | 1 + .../javascript-jquery/insertBefore.snippet | 1 + .../javascript-jquery/is.snippet | 1 + .../javascript-jquery/load.snippet | 3 + .../javascript-jquery/loadf.snippet | 3 + .../javascript-jquery/loadif.snippet | 3 + .../javascript-jquery/mdown.snippet | 3 + .../javascript-jquery/mmove.snippet | 3 + .../javascript-jquery/mout.snippet | 3 + .../javascript-jquery/mover.snippet | 3 + .../javascript-jquery/mup.snippet | 3 + .../javascript-jquery/next.snippet | 1 + .../javascript-jquery/not.snippet | 1 + .../javascript-jquery/one.snippet | 3 + .../javascript-jquery/parent.snippet | 1 + .../javascript-jquery/parents.snippet | 1 + .../javascript-jquery/prepend.snippet | 1 + .../javascript-jquery/prependto.snippet | 1 + .../javascript-jquery/prev.snippet | 1 + .../javascript-jquery/ready.snippet | 3 + .../javascript-jquery/remove.snippet | 1 + .../javascript-jquery/removeattr.snippet | 1 + .../javascript-jquery/removeclass.snippet | 1 + .../javascript-jquery/reset.snippet | 3 + .../javascript-jquery/resize.snippet | 3 + .../javascript-jquery/scroll.snippet | 3 + .../javascript-jquery/sdown.snippet | 1 + .../javascript-jquery/sdownc.snippet | 3 + .../javascript-jquery/sdupc.snippet | 3 + .../javascript-jquery/select.snippet | 3 + .../javascript-jquery/show.snippet | 1 + .../javascript-jquery/showc.snippet | 3 + .../javascript-jquery/sib.snippet | 1 + .../javascript-jquery/size.snippet | 1 + .../javascript-jquery/stoggle.snippet | 1 + .../javascript-jquery/submit.snippet | 3 + .../javascript-jquery/sup.snippet | 1 + .../javascript-jquery/text.snippet | 1 + .../javascript-jquery/this.snippet | 1 + .../javascript-jquery/tog.snippet | 6 + .../javascript-jquery/togclass.snippet | 1 + .../javascript-jquery/togsh.snippet | 1 + .../javascript-jquery/trig.snippet | 1 + .../javascript-jquery/unbind.snippet | 1 + .../javascript-jquery/val.snippet | 1 + .../javascript-jquery/width.snippet | 1 + .../javascript-jquery/wrap.snippet | 1 + .../snipmate-snippets/javascript/anon.snippet | 1 + .../snipmate-snippets/javascript/for.snippet | 3 + .../snipmate-snippets/javascript/fun.snippet | 3 + .../snipmate-snippets/javascript/if.snippet | 1 + .../snipmate-snippets/javascript/ife.snippet | 4 + .../snipmate-snippets/javascript/log.snippet | 1 + .../snipmate-snippets/javascript/met.snippet | 3 + .../javascript/proto.snippet | 3 + .../javascript/timeout.snippet | 1 + .../snipmate-snippets/objc/I.snippet | 6 + .../snipmate-snippets/objc/Imp.snippet | 1 + .../snipmate-snippets/objc/alloc.snippet | 1 + .../snipmate-snippets/objc/array.snippet | 1 + .../snipmate-snippets/objc/bez.snippet | 1 + .../snipmate-snippets/objc/cat.snippet | 6 + .../snipmate-snippets/objc/cati.snippet | 3 + .../snipmate-snippets/objc/cli.snippet | 5 + .../snipmate-snippets/objc/dict.snippet | 1 + .../snipmate-snippets/objc/forarray.snippet | 7 + .../snipmate-snippets/objc/log.snippet | 1 + .../objc/m/class method.snippet | 4 + .../snipmate-snippets/objc/m/method.snippet | 4 + .../snipmate-snippets/objc/objacc.snippet | 11 + .../snipmate-snippets/objc/objc.snippet | 14 + .../snipmate-snippets/objc/prop.snippet | 1 + .../snipmate-snippets/objc/rel.snippet | 1 + .../snipmate-snippets/objc/ret.snippet | 1 + .../snipmate-snippets/objc/sel.snippet | 1 + .../snipmate-snippets/objc/sm.snippet | 5 + .../snipmate-snippets/objc/syn.snippet | 1 + .../snipmate-snippets/php/array.snippet | 1 + .../snipmate-snippets/php/case.snippet | 3 + .../snipmate-snippets/php/class.snippet | 11 + .../snipmate-snippets/php/classe.snippet | 12 + .../snipmate-snippets/php/def.snippet | 1 + .../snipmate-snippets/php/defd.snippet | 1 + .../snipmate-snippets/php/do.snippet | 3 + .../snipmate-snippets/php/doc_cp.snippet | 6 + .../snipmate-snippets/php/doc_f.snippet | 8 + .../snipmate-snippets/php/doc_h.snippet | 10 + .../snipmate-snippets/php/doc_i.snippet | 8 + .../snipmate-snippets/php/ec.snippet | 1 + .../snipmate-snippets/php/else.snippet | 3 + .../snipmate-snippets/php/elseif.snippet | 3 + .../snipmate-snippets/php/for.snippet | 3 + .../snipmate-snippets/php/foreach.snippet | 3 + .../snipmate-snippets/php/foreachk.snippet | 3 + .../snipmate-snippets/php/fun.snippet | 4 + .../snipmate-snippets/php/get.snippet | 1 + .../snipmate-snippets/php/globals.snippet | 1 + .../snipmate-snippets/php/if.snippet | 3 + .../snipmate-snippets/php/ife.snippet | 4 + .../snipmate-snippets/php/inc.snippet | 1 + .../snipmate-snippets/php/inc1.snippet | 1 + .../snipmate-snippets/php/log.snippet | 1 + .../snipmate-snippets/php/php.snippet | 3 + .../snipmate-snippets/php/post.snippet | 1 + .../snipmate-snippets/php/req.snippet | 1 + .../snipmate-snippets/php/req1.snippet | 1 + .../snipmate-snippets/php/request.snippet | 1 + .../snipmate-snippets/php/session.snippet | 1 + .../snipmate-snippets/php/switch.snippet | 9 + .../snipmate-snippets/php/t.snippet | 1 + .../snipmate-snippets/php/try.snippet | 6 + .../snipmate-snippets/php/var.snippet | 1 + .../snipmate-snippets/php/wh.snippet | 3 + .../snipmate-snippets/po/msg.snippet | 2 + .../snipmate-snippets/python/class.snippet | 2 + .../snipmate-snippets/python/def.snippet | 2 + .../snipmate-snippets/python/for.snippet | 3 + .../snipmate-snippets/python/from.snippet | 2 + .../snipmate-snippets/python/get.snippet | 3 + .../snipmate-snippets/python/ifmain.snippet | 2 + .../snipmate-snippets/python/import.snippet | 2 + .../snipmate-snippets/python/init.snippet | 2 + .../snipmate-snippets/python/set.snippet | 1 + .../snipmate-snippets/python/try.snippet | 4 + .../ruby-factorygirl/fac.snippet | 1 + .../ruby-factorygirl/facb.snippet | 1 + .../ruby-factorygirl/facd.snippet | 4 + .../ruby-factorygirl/facn.snippet | 1 + .../ruby-factorygirl/facs.snippet | 4 + .../snipmate-snippets/ruby-rails/art.snippet | 1 + .../ruby-rails/artnp.snippet | 1 + .../ruby-rails/artnpp.snippet | 1 + .../snipmate-snippets/ruby-rails/artp.snippet | 1 + .../ruby-rails/artpp.snippet | 1 + .../snipmate-snippets/ruby-rails/asd.snippet | 3 + .../snipmate-snippets/ruby-rails/asnd.snippet | 3 + .../snipmate-snippets/ruby-rails/asre.snippet | 1 + .../snipmate-snippets/ruby-rails/asrj.snippet | 1 + .../snipmate-snippets/ruby-rails/ass.snippet | 1 + .../snipmate-snippets/ruby-rails/bf.snippet | 1 + .../snipmate-snippets/ruby-rails/bt.snippet | 1 + .../snipmate-snippets/ruby-rails/crw.snippet | 1 + .../ruby-rails/defcreate.snippet | 14 + .../ruby-rails/defdestroy.snippet | 9 + .../ruby-rails/defedit.snippet | 3 + .../ruby-rails/defindex.snippet | 8 + .../ruby-rails/defnew.snippet | 8 + .../ruby-rails/defshow.snippet | 8 + .../ruby-rails/defupdate.snippet | 14 + .../snipmate-snippets/ruby-rails/fina.snippet | 1 + .../snipmate-snippets/ruby-rails/finf.snippet | 1 + .../snipmate-snippets/ruby-rails/fini.snippet | 1 + .../snipmate-snippets/ruby-rails/finl.snippet | 1 + .../ruby-rails/flash.snippet | 1 + .../ruby-rails/habtm.snippet | 1 + .../snipmate-snippets/ruby-rails/hm.snippet | 1 + .../snipmate-snippets/ruby-rails/hmd.snippet | 1 + .../snipmate-snippets/ruby-rails/hmt.snippet | 1 + .../snipmate-snippets/ruby-rails/ho.snippet | 1 + .../snipmate-snippets/ruby-rails/i18.snippet | 1 + .../snipmate-snippets/ruby-rails/ist.snippet | 1 + .../snipmate-snippets/ruby-rails/log.snippet | 1 + .../snipmate-snippets/ruby-rails/logd.snippet | 1 + .../snipmate-snippets/ruby-rails/loge.snippet | 1 + .../snipmate-snippets/ruby-rails/logf.snippet | 1 + .../snipmate-snippets/ruby-rails/logi.snippet | 1 + .../snipmate-snippets/ruby-rails/logw.snippet | 1 + .../snipmate-snippets/ruby-rails/mac.snippet | 1 + .../snipmate-snippets/ruby-rails/mapc.snippet | 1 + .../ruby-rails/mapca.snippet | 1 + .../snipmate-snippets/ruby-rails/mapr.snippet | 1 + .../ruby-rails/maprs.snippet | 1 + .../ruby-rails/mapwo.snippet | 3 + .../snipmate-snippets/ruby-rails/mbs.snippet | 1 + .../snipmate-snippets/ruby-rails/mcc.snippet | 1 + .../snipmate-snippets/ruby-rails/mccc.snippet | 1 + .../snipmate-snippets/ruby-rails/mcht.snippet | 3 + .../snipmate-snippets/ruby-rails/mcol.snippet | 1 + .../snipmate-snippets/ruby-rails/mct.snippet | 3 + .../ruby-rails/migration.snippet | 8 + .../snipmate-snippets/ruby-rails/mp.snippet | 1 + .../snipmate-snippets/ruby-rails/mrc.snippet | 1 + .../snipmate-snippets/ruby-rails/mrmc.snippet | 1 + .../snipmate-snippets/ruby-rails/mrnc.snippet | 1 + .../snipmate-snippets/ruby-rails/mrw.snippet | 1 + .../snipmate-snippets/ruby-rails/nc.snippet | 1 + .../snipmate-snippets/ruby-rails/ncl.snippet | 1 + .../snipmate-snippets/ruby-rails/pa.snippet | 1 + .../snipmate-snippets/ruby-rails/ra.snippet | 1 + .../snipmate-snippets/ruby-rails/ral.snippet | 1 + .../snipmate-snippets/ruby-rails/rest.snippet | 3 + .../snipmate-snippets/ruby-rails/rf.snippet | 1 + .../snipmate-snippets/ruby-rails/rfu.snippet | 1 + .../snipmate-snippets/ruby-rails/ri.snippet | 1 + .../snipmate-snippets/ruby-rails/ril.snippet | 1 + .../snipmate-snippets/ruby-rails/rit.snippet | 1 + .../ruby-rails/rjson.snippet | 1 + .../snipmate-snippets/ruby-rails/rl.snippet | 1 + .../snipmate-snippets/ruby-rails/rn.snippet | 1 + .../snipmate-snippets/ruby-rails/rns.snippet | 1 + .../snipmate-snippets/ruby-rails/rp.snippet | 1 + .../snipmate-snippets/ruby-rails/rpc.snippet | 1 + .../snipmate-snippets/ruby-rails/rpl.snippet | 1 + .../snipmate-snippets/ruby-rails/rpo.snippet | 1 + .../snipmate-snippets/ruby-rails/rps.snippet | 1 + .../snipmate-snippets/ruby-rails/rt.snippet | 1 + .../snipmate-snippets/ruby-rails/rtl.snippet | 1 + .../snipmate-snippets/ruby-rails/rtlt.snippet | 1 + .../snipmate-snippets/ruby-rails/rts.snippet | 1 + .../snipmate-snippets/ruby-rails/ru.snippet | 3 + .../snipmate-snippets/ruby-rails/rxml.snippet | 1 + .../snipmate-snippets/ruby-rails/sha1.snippet | 1 + .../ruby-rails/sweeper.snippet | 15 + .../snipmate-snippets/ruby-rails/tcb.snippet | 2 + .../snipmate-snippets/ruby-rails/tcbi.snippet | 2 + .../snipmate-snippets/ruby-rails/tcd.snippet | 2 + .../snipmate-snippets/ruby-rails/tcda.snippet | 2 + .../snipmate-snippets/ruby-rails/tcdt.snippet | 2 + .../snipmate-snippets/ruby-rails/tcf.snippet | 2 + .../snipmate-snippets/ruby-rails/tch.snippet | 2 + .../snipmate-snippets/ruby-rails/tci.snippet | 2 + .../snipmate-snippets/ruby-rails/tcl.snippet | 2 + .../snipmate-snippets/ruby-rails/tcr.snippet | 2 + .../snipmate-snippets/ruby-rails/tcs.snippet | 2 + .../snipmate-snippets/ruby-rails/tct.snippet | 2 + .../snipmate-snippets/ruby-rails/tcti.snippet | 2 + .../snipmate-snippets/ruby-rails/tcts.snippet | 2 + .../ruby-rails/tctss.snippet | 2 + .../snipmate-snippets/ruby-rails/trc.snippet | 1 + .../snipmate-snippets/ruby-rails/tre.snippet | 2 + .../snipmate-snippets/ruby-rails/tref.snippet | 1 + .../snipmate-snippets/ruby-rails/va.snippet | 1 + .../snipmate-snippets/ruby-rails/vao.snippet | 1 + .../snipmate-snippets/ruby-rails/vc.snippet | 1 + .../snipmate-snippets/ruby-rails/ve.snippet | 1 + .../snipmate-snippets/ruby-rails/vf.snippet | 1 + .../snipmate-snippets/ruby-rails/vi.snippet | 1 + .../snipmate-snippets/ruby-rails/vl.snippet | 1 + .../snipmate-snippets/ruby-rails/vn.snippet | 1 + .../snipmate-snippets/ruby-rails/vpo.snippet | 1 + .../snipmate-snippets/ruby-rails/vu.snippet | 1 + .../ruby-rails/wants.snippet | 1 + .../ruby-rails/xdelete.snippet | 1 + .../snipmate-snippets/ruby-rails/xget.snippet | 1 + .../ruby-rails/xpost.snippet | 1 + .../snipmate-snippets/ruby-rails/xput.snippet | 1 + .../snipmate-snippets/ruby-rspec/aft.snippet | 3 + .../ruby-rspec/annot.snippet | 1 + .../snipmate-snippets/ruby-rspec/anr.snippet | 1 + .../snipmate-snippets/ruby-rspec/anra.snippet | 1 + .../snipmate-snippets/ruby-rspec/anrb.snippet | 1 + .../snipmate-snippets/ruby-rspec/ant.snippet | 1 + .../snipmate-snippets/ruby-rspec/any.snippet | 1 + .../snipmate-snippets/ruby-rspec/atl.snippet | 1 + .../snipmate-snippets/ruby-rspec/atm.snippet | 1 + .../snipmate-snippets/ruby-rspec/bef.snippet | 3 + .../snipmate-snippets/ruby-rspec/conn.snippet | 1 + .../snipmate-snippets/ruby-rspec/des.snippet | 3 + .../snipmate-snippets/ruby-rspec/desc.snippet | 5 + .../ruby-rspec/desrc.snippet | 3 + .../snipmate-snippets/ruby-rspec/dest.snippet | 3 + .../ruby-rspec/dests.snippet | 3 + .../snipmate-snippets/ruby-rspec/ex.snippet | 1 + .../snipmate-snippets/ruby-rspec/isbl.snippet | 1 + .../snipmate-snippets/ruby-rspec/it.snippet | 3 + .../snipmate-snippets/ruby-rspec/its.snippet | 1 + .../snipmate-snippets/ruby-rspec/mat.snippet | 24 + .../snipmate-snippets/ruby-rspec/mm.snippet | 1 + .../snipmate-snippets/ruby-rspec/moc.snippet | 2 + .../snipmate-snippets/ruby-rspec/mocw.snippet | 3 + .../snipmate-snippets/ruby-rspec/on.snippet | 1 + .../snipmate-snippets/ruby-rspec/resh.snippet | 1 + .../snipmate-snippets/ruby-rspec/sef.snippet | 3 + .../snipmate-snippets/ruby-rspec/sh.snippet | 2 + .../snipmate-snippets/ruby-rspec/shb.snippet | 2 + .../snipmate-snippets/ruby-rspec/shbc.snippet | 2 + .../ruby-rspec/shbio.snippet | 2 + .../ruby-rspec/shbko.snippet | 2 + .../snipmate-snippets/ruby-rspec/shbr.snippet | 2 + .../snipmate-snippets/ruby-rspec/shbs.snippet | 2 + .../snipmate-snippets/ruby-rspec/shc.snippet | 3 + .../snipmate-snippets/ruby-rspec/shdm.snippet | 2 + .../snipmate-snippets/ruby-rspec/she.snippet | 2 + .../snipmate-snippets/ruby-rspec/sheq.snippet | 2 + .../snipmate-snippets/ruby-rspec/shh.snippet | 2 + .../ruby-rspec/shhal.snippet | 2 + .../ruby-rspec/shham.snippet | 2 + .../snipmate-snippets/ruby-rspec/shhr.snippet | 2 + .../snipmate-snippets/ruby-rspec/shn.snippet | 2 + .../snipmate-snippets/ruby-rspec/shnb.snippet | 2 + .../ruby-rspec/shnbc.snippet | 2 + .../ruby-rspec/shnbio.snippet | 2 + .../ruby-rspec/shnbko.snippet | 2 + .../ruby-rspec/shnbr.snippet | 2 + .../ruby-rspec/shnbs.snippet | 2 + .../snipmate-snippets/ruby-rspec/shnc.snippet | 3 + .../snipmate-snippets/ruby-rspec/shne.snippet | 2 + .../ruby-rspec/shneq.snippet | 2 + .../snipmate-snippets/ruby-rspec/shnm.snippet | 2 + .../snipmate-snippets/ruby-rspec/shnp.snippet | 1 + .../snipmate-snippets/ruby-rspec/shnr.snippet | 2 + .../ruby-rspec/shnre.snippet | 2 + .../ruby-rspec/shnredt.snippet | 2 + .../ruby-rspec/shnrt.snippet | 2 + .../snipmate-snippets/ruby-rspec/shns.snippet | 2 + .../snipmate-snippets/ruby-rspec/shnt.snippet | 2 + .../snipmate-snippets/ruby-rspec/shp.snippet | 1 + .../snipmate-snippets/ruby-rspec/shr.snippet | 2 + .../snipmate-snippets/ruby-rspec/shre.snippet | 2 + .../ruby-rspec/shredt.snippet | 2 + .../snipmate-snippets/ruby-rspec/shrt.snippet | 2 + .../snipmate-snippets/ruby-rspec/shs.snippet | 2 + .../snipmate-snippets/ruby-rspec/sht.snippet | 2 + .../ruby-rspec/shtemp.snippet | 2 + .../snipmate-snippets/ruby-rspec/tw.snippet | 1 + .../snipmate-snippets/ruby-rspec/wia.snippet | 2 + .../ruby-shoulda/context.snippet | 5 + .../ruby-shoulda/samao.snippet | 1 + .../ruby-shoulda/savf.snippet | 1 + .../ruby-shoulda/sbt.snippet | 1 + .../ruby-shoulda/selal.snippet | 1 + .../ruby-shoulda/seli.snippet | 1 + .../ruby-shoulda/selir.snippet | 1 + .../ruby-shoulda/setup.snippet | 3 + .../ruby-shoulda/sevir.snippet | 1 + .../ruby-shoulda/shabtm.snippet | 1 + .../ruby-shoulda/shcm.snippet | 1 + .../ruby-shoulda/shdc.snippet | 1 + .../ruby-shoulda/shi.snippet | 1 + .../ruby-shoulda/shim.snippet | 1 + .../ruby-shoulda/shm.snippet | 1 + .../ruby-shoulda/sho.snippet | 1 + .../ruby-shoulda/shroa.snippet | 1 + .../ruby-shoulda/snamao.snippet | 1 + .../ruby-shoulda/snavf.snippet | 1 + .../ruby-shoulda/svao.snippet | 1 + .../ruby-shoulda/svno.snippet | 1 + .../ruby-shoulda/svpo.snippet | 1 + .../ruby-shoulda/svuo.snippet | 1 + .../snipmate-snippets/ruby/Md.snippet | 1 + .../snipmate-snippets/ruby/Ml.snippet | 1 + .../snipmate-snippets/ruby/Pn.snippet | 1 + .../snipmate-snippets/ruby/Yd.snippet | 1 + .../snipmate-snippets/ruby/Yl.snippet | 1 + .../snipmate-snippets/ruby/am.snippet | 1 + .../snipmate-snippets/ruby/as.snippet | 1 + .../snipmate-snippets/ruby/asam.snippet | 1 + .../snipmate-snippets/ruby/asb.snippet | 1 + .../snipmate-snippets/ruby/asc.snippet | 1 + .../snipmate-snippets/ruby/ascd.snippet | 1 + .../snipmate-snippets/ruby/ase.snippet | 1 + .../snipmate-snippets/ruby/asem.snippet | 1 + .../snipmate-snippets/ruby/asf.snippet | 1 + .../snipmate-snippets/ruby/asfa.snippet | 1 + .../snipmate-snippets/ruby/asi.snippet | 1 + .../snipmate-snippets/ruby/asid.snippet | 1 + .../snipmate-snippets/ruby/asie.snippet | 1 + .../snipmate-snippets/ruby/asio.snippet | 1 + .../snipmate-snippets/ruby/asko.snippet | 1 + .../snipmate-snippets/ruby/asm.snippet | 1 + .../snipmate-snippets/ruby/asn.snippet | 1 + .../snipmate-snippets/ruby/asncd.snippet | 1 + .../snipmate-snippets/ruby/asne.snippet | 1 + .../snipmate-snippets/ruby/asnem.snippet | 1 + .../snipmate-snippets/ruby/asni.snippet | 1 + .../snipmate-snippets/ruby/asnid.snippet | 1 + .../snipmate-snippets/ruby/asnie.snippet | 1 + .../snipmate-snippets/ruby/asnm.snippet | 1 + .../snipmate-snippets/ruby/asnn.snippet | 1 + .../snipmate-snippets/ruby/asnp.snippet | 1 + .../snipmate-snippets/ruby/asnr.snippet | 1 + .../snipmate-snippets/ruby/asnrt.snippet | 1 + .../snipmate-snippets/ruby/asns.snippet | 1 + .../snipmate-snippets/ruby/asnse.snippet | 1 + .../snipmate-snippets/ruby/asnt.snippet | 1 + .../snipmate-snippets/ruby/aso.snippet | 1 + .../snipmate-snippets/ruby/asp.snippet | 1 + .../snipmate-snippets/ruby/aspe.snippet | 1 + .../snipmate-snippets/ruby/aspne.snippet | 1 + .../snipmate-snippets/ruby/asr.snippet | 1 + .../snipmate-snippets/ruby/asrko.snippet | 1 + .../snipmate-snippets/ruby/asrm.snippet | 1 + .../snipmate-snippets/ruby/asrt.snippet | 1 + .../snipmate-snippets/ruby/asse.snippet | 1 + .../snipmate-snippets/ruby/ast.snippet | 1 + .../snipmate-snippets/ruby/astr.snippet | 1 + .../snipmate-snippets/ruby/bm.snippet | 4 + .../snipmate-snippets/ruby/case.snippet | 5 + .../snipmate-snippets/ruby/class.snippet | 3 + .../snipmate-snippets/ruby/classe.snippet | 1 + .../snipmate-snippets/ruby/def.snippet | 3 + .../snipmate-snippets/ruby/defi.snippet | 3 + .../snipmate-snippets/ruby/defmm.snippet | 3 + .../snipmate-snippets/ruby/defs.snippet | 3 + .../snipmate-snippets/ruby/deft.snippet | 3 + .../snipmate-snippets/ruby/detect.snippet | 1 + .../snipmate-snippets/ruby/detecto.snippet | 3 + .../snipmate-snippets/ruby/dglob.snippet | 1 + .../snipmate-snippets/ruby/do.snippet | 3 + .../snipmate-snippets/ruby/dop.snippet | 3 + .../snipmate-snippets/ruby/ea.snippet | 1 + .../snipmate-snippets/ruby/each.snippet | 1 + .../ruby/each_with_index.snippet | 1 + .../ruby/each_with_indexo.snippet | 4 + .../snipmate-snippets/ruby/eacho.snippet | 3 + .../snipmate-snippets/ruby/eado.snippet | 3 + .../snipmate-snippets/ruby/eawi.snippet | 1 + .../snipmate-snippets/ruby/eawido.snippet | 4 + .../snipmate-snippets/ruby/elsif.snippet | 2 + .../snipmate-snippets/ruby/fileeach.snippet | 1 + .../snipmate-snippets/ruby/fopen.snippet | 1 + .../snipmate-snippets/ruby/fread.snippet | 1 + .../snipmate-snippets/ruby/http_get.snippet | 2 + .../snipmate-snippets/ruby/http_post.snippet | 2 + .../snipmate-snippets/ruby/if.snippet | 3 + .../snipmate-snippets/ruby/ife.snippet | 4 + .../snipmate-snippets/ruby/inj.snippet | 1 + .../snipmate-snippets/ruby/injdo.snippet | 3 + .../snipmate-snippets/ruby/inject.snippet | 1 + .../snipmate-snippets/ruby/injecto.snippet | 3 + .../snipmate-snippets/ruby/ip.snippet | 1 + .../snipmate-snippets/ruby/map.snippet | 1 + .../snipmate-snippets/ruby/mapdo.snippet | 3 + .../snipmate-snippets/ruby/mapo.snippet | 3 + .../snipmate-snippets/ruby/mod.snippet | 3 + .../snipmate-snippets/ruby/module.snippet | 14 + .../snipmate-snippets/ruby/nam.snippet | 3 + .../snipmate-snippets/ruby/ope.snippet | 1 + .../snipmate-snippets/ruby/pathhere.snippet | 1 + .../snipmate-snippets/ruby/r.snippet | 1 + .../snipmate-snippets/ruby/reject.snippet | 1 + .../snipmate-snippets/ruby/rejecto.snippet | 3 + .../snipmate-snippets/ruby/rep.snippet | 1 + .../snipmate-snippets/ruby/rw.snippet | 1 + .../snipmate-snippets/ruby/select.snippet | 1 + .../snipmate-snippets/ruby/selecto.snippet | 3 + .../snipmate-snippets/ruby/sinc.snippet | 1 + .../snipmate-snippets/ruby/sort.snippet | 1 + .../snipmate-snippets/ruby/sorto.snippet | 3 + .../snipmate-snippets/ruby/tas.snippet | 4 + .../snipmate-snippets/ruby/task.snippet | 4 + .../snipmate-snippets/ruby/tc.snippet | 9 + .../snipmate-snippets/ruby/unless.snippet | 3 + .../snipmate-snippets/ruby/unlesse.snippet | 4 + .../snipmate-snippets/ruby/w.snippet | 1 + .../snipmate-snippets/ruby/while.snippet | 3 + .../snipmate-snippets/ruby/xmlr.snippet | 1 + .../snipmate-snippets/ruby/xpa.snippet | 3 + .../snipmate-snippets/ruby/zip.snippet | 1 + .../snipmate-snippets/sinatra/get.snippet | 3 + .../snipmate-snippets/snippets/cpp.snippets | 66 - .../snipmate-snippets/snippets/sh.snippets | 43 - .../snipmate-snippets/sshconfig/host.snippet | 3 + .../snipmate-snippets/support_functions.vim | 115 + .../snipmate-snippets/vim/au.snippet | 1 + .../snipmate-snippets/vim/com.snippet | 1 + .../snipmate-snippets/vim/func.snippet | 8 + .../snipmate-snippets/vim/if.snippet | 3 + .../snipmate-snippets/vim/ife.snippet | 4 + .../snipmate-snippets/vim/log.snippet | 1 + .../snipmate-snippets/vim/try.snippet | 4 + .../snipmate-snippets/xslt/call.snippet | 3 + .../snipmate-snippets/xslt/choose.snippet | 7 + .../snipmate-snippets/xslt/mat.snippet | 3 + .../snipmate-snippets/xslt/out.snippet | 1 + .../snipmate-snippets/xslt/param.snippet | 1 + .../snipmate-snippets/xslt/sty.snippet | 3 + .../snipmate-snippets/xslt/tem.snippet | 3 + .../snipmate-snippets/xslt/value.snippet | 1 + .../snipmate-snippets/xslt/var.snippet | 3 + .../snipmate-snippets/xslt/wparam.snippet | 1 + .../snipmate-snippets/xslt/xdec.snippet | 2 + .../snipmate-snippets/zend/assert.snippet | 1 + .../snipmate-snippets/zend/boolcol.snippet | 1 + .../snipmate-snippets/zend/clac.snippet | 20 + .../snipmate-snippets/zend/flash.snippet | 1 + .../snipmate-snippets/zend/getconf.snippet | 1 + .../snipmate-snippets/zend/input.snippet | 4 + .../snipmate-snippets/zend/inputarr.snippet | 6 + .../snipmate-snippets/zend/intcol.snippet | 1 + .../snipmate-snippets/zend/lib.snippet | 5 + .../snipmate-snippets/zend/model.snippet | 32 + .../snipmate-snippets/zend/navi.snippet | 1 + .../snipmate-snippets/zend/route.snippet | 1 + .../snipmate-snippets/zend/rp.snippet | 2 + .../snipmate-snippets/zend/strcol.snippet | 1 + sources_non_forked/taglist.vim/README | 18 + .../taglist.vim/doc/taglist.txt | 1501 ++++++ sources_non_forked/taglist.vim/doc/tags | 62 + .../taglist.vim/plugin/taglist.vim | 4546 +++++++++++++++++ sources_non_forked/taglist/doc/taglist.txt | 1501 ++++++ sources_non_forked/taglist/doc/tags | 62 + sources_non_forked/taglist/plugin/taglist.vim | 4546 +++++++++++++++++ .../tlib/autoload/tlib/Filter_cnf.vim | 23 +- .../tlib/autoload/tlib/Filter_cnfd.vim | 19 +- .../tlib/autoload/tlib/Filter_cnfx.vim | 42 + .../tlib/autoload/tlib/Filter_fuzzy.vim | 20 +- .../tlib/autoload/tlib/Filter_seq.vim | 98 - .../tlib/autoload/tlib/World.vim | 477 +- .../tlib/autoload/tlib/agent.vim | 83 +- .../tlib/autoload/tlib/buffer.vim | 5 +- .../tlib/autoload/tlib/cache.vim | 104 +- sources_non_forked/tlib/autoload/tlib/cmd.vim | 12 +- .../tlib/autoload/tlib/file.vim | 31 +- .../tlib/autoload/tlib/input.vim | 330 +- .../tlib/autoload/tlib/notify.vim | 7 +- .../tlib/autoload/tlib/persistent.vim | 47 + .../tlib/autoload/tlib/scratch.vim | 24 +- sources_non_forked/tlib/autoload/tlib/tag.vim | 5 +- sources_non_forked/tlib/autoload/tlib/vcs.vim | 155 + sources_non_forked/tlib/autoload/tlib/vim.vim | 19 +- sources_non_forked/tlib/doc/tags | 252 + sources_non_forked/tlib/doc/tlib.txt | 1941 +++---- sources_non_forked/tlib/plugin/02tlib.vim | 89 +- .../autoload/tovl/scratch_buffer.vim | 103 + .../autoload/tovl/ui/filter_list.vim | 473 ++ .../vim-coffee-script/Readme.md | 5 +- .../vim-coffee-script/compiler/coffee.vim | 22 +- .../vim-coffee-script/ftdetect/coffee.vim | 2 +- .../vim-coffee-script/syntax/coffee.vim | 0 .../vim-indent-object/.gitignore | 2 + .../vim-indent-object/doc/indent-object.txt | 120 + .../plugin/indent-object.vim | 224 + sources_non_forked/vim-less/ftplugin/less.vim | 2 + sources_non_forked/vim-less/syntax/less.vim | 28 +- .../vim-markdown/syntax/markdown.vim | 49 +- sources_non_forked/vim-powerline/.gitignore | 2 - sources_non_forked/vim-powerline/README.md | 0 sources_non_forked/vim-powerline/README.rst | 107 - .../vim-powerline/autoload/Pl.vim | 183 - .../vim-powerline/autoload/Pl/Colorscheme.vim | 145 - .../vim-powerline/autoload/Pl/Hi.vim | 140 - .../vim-powerline/autoload/Pl/Match.vim | 43 - .../vim-powerline/autoload/Pl/Mod.vim | 40 - .../vim-powerline/autoload/Pl/Parser.vim | 371 -- .../vim-powerline/autoload/Pl/Segment.vim | 188 - .../vim-powerline/autoload/Pl/Theme.vim | 100 - .../Powerline/Colorschemes/default.vim | 166 - .../autoload/Powerline/Colorschemes/skwp.vim | 192 - .../autoload/Powerline/Functions.vim | 141 - .../autoload/Powerline/Functions/ft_man.vim | 12 - .../autoload/Powerline/Functions/fugitive.vim | 7 - .../autoload/Powerline/Functions/hgrev.vim | 17 - .../Powerline/Functions/syntastic.vim | 16 - .../autoload/Powerline/Matches.vim | 13 - .../autoload/Powerline/Segments.vim | 30 - .../autoload/Powerline/Segments/ctrlp.vim | 20 - .../autoload/Powerline/Segments/ft_man.vim | 3 - .../autoload/Powerline/Segments/fugitive.vim | 5 - .../autoload/Powerline/Segments/hgrev.vim | 4 - .../autoload/Powerline/Segments/rvm.vim | 6 - .../autoload/Powerline/Segments/syntastic.vim | 5 - .../autoload/Powerline/Segments/tagbar.vim | 6 - .../Powerline/Segments/virtualenv.vim | 5 - .../autoload/Powerline/Themes/default.vim | 116 - .../autoload/Powerline/Themes/skwp.vim | 116 - .../vim-powerline/doc/Powerline.txt | 429 -- .../fontpatcher/PowerlineSymbols.sfd | 319 -- .../vim-powerline/fontpatcher/README.rst | 164 - .../vim-powerline/fontpatcher/fontpatcher | 240 - .../vim-powerline/plugin/Powerline.vim | 69 - sources_non_forked/vim-snipmate/README.rst | 139 +- .../vim-snipmate/addon-info.json | 4 +- .../vim-snipmate/after/plugin/snipMate.vim | 14 +- .../vim-snipmate/autoload/snipMate.vim | 424 +- .../vim-snipmate/doc/snipMate.txt | 9 +- .../vim-snipmate/plugin/snipMate.vim | 2 +- .../AUTHORS | 5 + .../LICENSE | 0 sources_non_forked/vim-snippets/README.md | 118 + .../vim-snippets/UltiSnips/README | 21 + .../vim-snippets/{ => UltiSnips}/all.snippets | 0 .../{ => UltiSnips}/bindzone.snippets | 0 .../vim-snippets/{ => UltiSnips}/c.snippets | 19 +- .../{ => UltiSnips}/coffee.snippets | 0 .../{ => UltiSnips}/coffee_jasmine.snippets | 0 .../vim-snippets/{ => UltiSnips}/cpp.snippets | 2 - .../vim-snippets/{ => UltiSnips}/css.snippets | 0 .../vim-snippets/UltiSnips/d.snippets | 583 +++ .../{ => UltiSnips}/django.snippets | 0 .../{ => UltiSnips}/erlang.snippets | 0 .../{ => UltiSnips}/eruby.snippets | 0 .../vim-snippets/{ => UltiSnips}/go.snippets | 0 .../{ => UltiSnips}/haskell.snippets | 0 .../{ => UltiSnips}/help.snippets | 4 +- .../{ => UltiSnips}/html.snippets | 164 +- .../{ => UltiSnips}/htmldjango.snippets | 0 .../{ => UltiSnips}/java.snippets | 0 .../{ => UltiSnips}/javascript.snippets | 0 .../javascript_jasmine.snippets | 0 .../{ => UltiSnips}/jinja2.snippets | 0 .../{ => UltiSnips}/json.snippets | 0 .../vim-snippets/{ => UltiSnips}/lua.snippets | 0 .../{ => UltiSnips}/mako.snippets | 0 .../markdown.snippets} | 4 +- .../{ => UltiSnips}/objc.snippets | 0 .../vim-snippets/UltiSnips/ocaml.snippets | 172 + .../{ => UltiSnips}/perl.snippets | 0 .../vim-snippets/UltiSnips/php.snippets | 258 + .../{ => UltiSnips}/puppet.snippets | 0 .../{ => UltiSnips}/python.snippets | 7 +- .../{ => UltiSnips}/rails.snippets | 0 .../vim-snippets/{ => UltiSnips}/rst.snippets | 0 .../{ => UltiSnips}/ruby.snippets | 0 .../vim-snippets/{ => UltiSnips}/sh.snippets | 25 +- .../{ => UltiSnips}/snippets.snippets | 0 .../vim-snippets/{ => UltiSnips}/tcl.snippets | 0 .../vim-snippets/{ => UltiSnips}/tex.snippets | 1 - .../{ => UltiSnips}/texmath.snippets | 0 .../vim-snippets/{ => UltiSnips}/vim.snippets | 0 .../vim-snippets/UltiSnips/xhtml.snippets | 0 .../vim-snippets/UltiSnips/xml.snippets | 9 + .../vim-snippets/UltiSnips/zsh.snippets | 11 + .../addon-info.json | 1 - .../vim-snippets/pascal.snippets | 122 - sources_non_forked/vim-snippets/php.snippets | 236 - .../vim-snippets/phtml.snippets | 74 - .../snippets/_.snippets | 30 +- .../snippets/actionscript.snippets | 2 +- .../snippets/apache.snippets | 0 .../snippets/autoit.snippets | 0 .../snippets/c.snippets | 172 +- .../snippets/chef.snippets | 0 .../snippets/clojure.snippets | 0 .../snippets/cmake.snippets | 0 .../snippets/coffee.snippets | 8 + .../vim-snippets/snippets/cpp.snippets | 131 + .../snippets/cs.snippets | 0 .../snippets/css.snippets | 0 .../snippets/dart.snippets | 0 .../snippets/diff.snippets | 0 .../snippets/django.snippets | 0 .../snippets/erlang.snippets | 0 .../snippets/eruby.snippets | 4 - .../snippets/falcon.snippets | 0 .../snippets/go.snippets | 34 +- .../snippets/haml.snippets | 0 .../snippets/haskell.snippets | 0 .../snippets/html.snippets | 20 +- .../snippets/htmldjango.snippets | 5 + .../snippets/htmltornado.snippets | 0 .../snippets/java.snippets | 6 +- .../snippets/javascript-jquery.snippets | 0 .../snippets/javascript.snippets | 31 +- .../snippets/javascript_jquery.snippets | 1 + .../snippets/jsp.snippets | 0 .../vim-snippets/snippets/ledger.snippets | 5 + .../snippets/lua.snippets | 0 .../snippets/make.snippets | 0 .../snippets/mako.snippets | 0 .../snippets/markdown.snippets | 0 .../snippets/objc.snippets | 0 .../vim-snippets/snippets/openfoam.snippets | 53 + .../snippets/perl.snippets | 117 +- .../snippets/php.snippets | 77 +- .../vim-snippets/snippets/plsql.snippets | 109 + .../snippets/po.snippets | 0 .../snippets/processing.snippets | 0 .../snippets/progress.snippets | 0 .../snippets/puppet.snippets | 0 .../snippets/python.snippets | 71 +- .../snippets/r.snippets | 26 + .../snippets/rst.snippets | 6 +- .../snippets/ruby.snippets | 46 +- .../vim-snippets/snippets/scala.snippets | 349 ++ .../vim-snippets/snippets/sh.snippets | 86 + .../snippets/snippets.snippets | 0 .../vim-snippets/snippets/sql.snippets | 26 + .../snippets/tcl.snippets | 0 .../snippets/tex.snippets | 26 +- .../snippets/textile.snippets | 0 .../snippets/vim.snippets | 0 .../snippets/xslt.snippets | 2 +- .../vim-snippets/snippets/yii-chtml.snippets | 248 + .../vim-snippets/snippets/yii.snippets | 300 ++ .../snippets/zsh.snippets | 0 .../vim-snippets/xhtml.snippets | 1 - .../vim-surround/doc/surround.txt | 12 +- .../vim-surround/plugin/surround.vim | 26 +- update_plugins.py | 76 + vimrcs/basic.vim | 4 + vimrcs/plugins_config.vim | 8 + 1057 files changed, 33631 insertions(+), 10806 deletions(-) create mode 100644 .gitignore create mode 100644 sources_forked/yankring/doc/tags create mode 100755 sources_forked/zencoding/.gitignore create mode 100755 sources_forked/zencoding/.gitmodules create mode 100755 sources_forked/zencoding/Makefile create mode 100755 sources_forked/zencoding/README.mkd create mode 100755 sources_forked/zencoding/TODO create mode 100755 sources_forked/zencoding/TUTORIAL create mode 100755 sources_forked/zencoding/autoload/zencoding.vim create mode 100755 sources_forked/zencoding/autoload/zencoding/lang.vim create mode 100755 sources_forked/zencoding/autoload/zencoding/lang/css.vim create mode 100755 sources_forked/zencoding/autoload/zencoding/lang/haml.vim create mode 100755 sources_forked/zencoding/autoload/zencoding/lang/html.vim create mode 100755 sources_forked/zencoding/autoload/zencoding/lang/sass.vim create mode 100755 sources_forked/zencoding/autoload/zencoding/lang/scss.vim create mode 100755 sources_forked/zencoding/autoload/zencoding/lang/slim.vim create mode 100755 sources_forked/zencoding/autoload/zencoding/util.vim create mode 100755 sources_forked/zencoding/doc/zencoding.txt create mode 100755 sources_forked/zencoding/plugin/zencoding.vim create mode 100755 sources_forked/zencoding/unittest.vim create mode 100755 sources_forked/zencoding/zencoding.vim.vimup delete mode 100644 sources_non_forked/bufexplorer.zip/README create mode 100644 sources_non_forked/bufexplorer/README.md rename sources_non_forked/{bufexplorer.zip => bufexplorer}/doc/bufexplorer.txt (99%) create mode 100644 sources_non_forked/bufexplorer/doc/tags rename sources_non_forked/{bufexplorer.zip => bufexplorer}/plugin/bufexplorer.vim (99%) create mode 100644 sources_non_forked/nerdtree/autoload/nerdtree.vim create mode 100644 sources_non_forked/nerdtree/plugin/nerdtree/bookmark.vim create mode 100644 sources_non_forked/nerdtree/plugin/nerdtree/creator.vim create mode 100644 sources_non_forked/nerdtree/plugin/nerdtree/key_map.vim create mode 100644 sources_non_forked/nerdtree/plugin/nerdtree/menu_controller.vim create mode 100644 sources_non_forked/nerdtree/plugin/nerdtree/menu_item.vim create mode 100644 sources_non_forked/nerdtree/plugin/nerdtree/opener.vim create mode 100644 sources_non_forked/nerdtree/plugin/nerdtree/path.vim create mode 100644 sources_non_forked/nerdtree/plugin/nerdtree/tree_dir_node.vim create mode 100644 sources_non_forked/nerdtree/plugin/nerdtree/tree_file_node.vim create mode 100755 sources_non_forked/nginx-vim/README.md create mode 100755 sources_non_forked/nginx-vim/ftdetect/nginx.vim create mode 100755 sources_non_forked/nginx-vim/indent/nginx.vim create mode 100755 sources_non_forked/nginx-vim/syntax/nginx.vim create mode 100644 sources_non_forked/nginx.vim/README create mode 100644 sources_non_forked/nginx.vim/syntax/nginx.vim create mode 100644 sources_non_forked/snipmate-snippets/.gitignore delete mode 100644 sources_non_forked/snipmate-snippets/README.md create mode 100644 sources_non_forked/snipmate-snippets/Rakefile create mode 100644 sources_non_forked/snipmate-snippets/_/date/date + time.snippet create mode 100644 sources_non_forked/snipmate-snippets/_/date/date.snippet create mode 100644 sources_non_forked/snipmate-snippets/_/lorem.snippet create mode 100644 sources_non_forked/snipmate-snippets/_/modeline.snippet create mode 100644 sources_non_forked/snipmate-snippets/ant/skel/basic.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/cl.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/def.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/do.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/el.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/for.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/forr.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/fpf.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/fun.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/if.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/inc/inc.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/inc/inc_global.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/main.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/map.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/ns.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/once.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/pr.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/readfile.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/st.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/t.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/td.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/tds.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/vector.snippet create mode 100644 sources_non_forked/snipmate-snippets/c/wh.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/#.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/background/all.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/background/attachment.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/background/color.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/background/color_name.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/background/color_rgb.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/background/color_transparent.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/background/image_none.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/background/image_url.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/background/position.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/background/repeat.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/border/basic.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/border/color.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/border/style.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/border/width.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/borderb/basic.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/borderb/color.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/borderb/style.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/borderb/width.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/borderl/basic.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/borderl/color.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/borderl/style.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/borderl/width.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/borderr/basic.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/borderr/color.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/borderr/style.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/borderr/width.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/bordert/basic.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/bordert/color.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/bordert/style.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/bordert/width.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/cl.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/clear.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/color.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/colorn.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/colorr.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/cursor.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/cursuru.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/direction.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/display/block.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/display/common.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/display/inline.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/display/table.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/float.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/font/all.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/font/family.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/font/size.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/font/size_font.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/font/style.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/font/variant.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/font/weight.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/i.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/letter.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/letterem.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/letterpx.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/list-style/image.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/list-style/position.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/list-style/type_asian.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/list-style/type_marker.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/list-style/type_numeric.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/list-style/type_other.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/list-style/type_position_image.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/list-style/type_roman_alpha_greek.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/margin.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/marginb.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/marginl.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/margino/T_R_B_L.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/margino/V_H.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/margino/all.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/margino/bottom.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/margino/left.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/margino/right.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/margino/top.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/marginr.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/margint.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/marker/offset_auto.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/marker/offset_length.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/opacity.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/overflow.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/padding.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/paddingb.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/paddingl.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/paddingo/T_R_B_L.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/paddingo/V_H.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/paddingo/all.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/paddingo/bottom.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/paddingo/left.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/paddingo/right.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/paddingo/top.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/paddingr.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/paddingt.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/position.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/scrollbar.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/tag.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/text/align.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/text/decoration.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/text/indent.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/text/shadow_hex.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/text/shadow_none.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/text/shadow_rgb.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/text/transform.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/text/transform_none.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/vertical.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/visibility.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/white.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/word/spacing_length.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/word/spacing_normal.snippet create mode 100644 sources_non_forked/snipmate-snippets/css/z.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/conf.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/cs.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/ct.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/end.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/ff.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/ffcb.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/ffe.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/ffff.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/ffhf.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/ffl.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/ffpf.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/ffrb.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/ffs.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/ffta.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/fftf.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/fields.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/for.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/ft.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/i18.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/it.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/jit.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/jsit.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/lia.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/liai.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/lic.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/lica.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/licai.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/lim.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/linp.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/linpp.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/lip.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/lipp.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/lt.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/ofcfs.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/rf.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/rp.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/rt.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/slt.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/sslt.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby-rails/st.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby/if.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby/ife.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby/unless.snippet create mode 100644 sources_non_forked/snipmate-snippets/eruby/unlesse.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/conf.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/cs.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/ff.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/ffcb.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/ffe.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/ffff.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/ffhf.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/ffl.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/ffpf.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/ffrb.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/ffs.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/ffta.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/fftf.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/fields.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/for.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/ft.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/if.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/ife.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/it.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/jit.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/jsit.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/lia.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/liai.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/lic.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/lica.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/licai.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/lim.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/linp.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/linpp.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/lip.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/lipp.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/lt.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/ofcfs.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/rf.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/rp.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/rt.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/slt.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/sslt.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/st.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/unless.snippet create mode 100644 sources_non_forked/snipmate-snippets/haml/unlesse.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/base.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/body.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/div.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/doctype.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/form.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/h1.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/head.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/href.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/ifie.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/img.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/input.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/inputl.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/label.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/link.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/mailto.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/meta.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/option.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/script/include_script.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/script/inline_script.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/select.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/skel/basic.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/skel/basic_with_meta.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/style.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/t.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/table/basic.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/table/hardcore.snippet create mode 100644 sources_non_forked/snipmate-snippets/html/textarea.snippet create mode 100644 sources_non_forked/snipmate-snippets/java/class/basic+constructor+main.snippet create mode 100644 sources_non_forked/snipmate-snippets/java/class/basic+constructor.snippet create mode 100644 sources_non_forked/snipmate-snippets/java/class/basic.snippet create mode 100644 sources_non_forked/snipmate-snippets/java/for.snippet create mode 100644 sources_non_forked/snipmate-snippets/java/gs.snippet create mode 100644 sources_non_forked/snipmate-snippets/java/if.snippet create mode 100644 sources_non_forked/snipmate-snippets/java/ife.snippet create mode 100644 sources_non_forked/snipmate-snippets/java/log.snippet create mode 100644 sources_non_forked/snipmate-snippets/java/m.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/add.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/addClass.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/after.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/ajax.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/ajaxerror.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/ajaxget.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/ajaxgetif.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/ajaxpost.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/ajaxsend.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/ajaxsetup.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/ajaxstart.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/ajaxstop.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/ajaxsuccess.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/animate.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/append.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/appendTo.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/attr.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/attrm.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/before.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/bind.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/blur.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/change.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/children.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/click.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/clone.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/contains.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/css.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/cssm.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/dblclick.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/each.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/el.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/eltrim.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/end.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/error.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/fadein.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/fadeinc.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/fadeout.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/fadeoutc.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/fadeto.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/fadetoc.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/filter.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/find.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/focus.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/get.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/getjson.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/getscript.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/height.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/hide.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/hidec.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/hover.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/html.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/insertAfter.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/insertBefore.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/is.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/load.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/loadf.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/loadif.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/mdown.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/mmove.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/mout.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/mover.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/mup.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/next.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/not.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/one.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/parent.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/parents.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/prepend.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/prependto.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/prev.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/ready.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/remove.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/removeattr.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/removeclass.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/reset.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/resize.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/scroll.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/sdown.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/sdownc.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/sdupc.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/select.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/show.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/showc.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/sib.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/size.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/stoggle.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/submit.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/sup.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/text.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/this.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/tog.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/togclass.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/togsh.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/trig.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/unbind.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/val.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/width.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript-jquery/wrap.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript/anon.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript/for.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript/fun.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript/if.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript/ife.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript/log.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript/met.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript/proto.snippet create mode 100644 sources_non_forked/snipmate-snippets/javascript/timeout.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/I.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/Imp.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/alloc.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/array.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/bez.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/cat.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/cati.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/cli.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/dict.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/forarray.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/log.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/m/class method.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/m/method.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/objacc.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/objc.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/prop.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/rel.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/ret.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/sel.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/sm.snippet create mode 100644 sources_non_forked/snipmate-snippets/objc/syn.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/array.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/case.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/class.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/classe.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/def.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/defd.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/do.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/doc_cp.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/doc_f.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/doc_h.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/doc_i.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/ec.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/else.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/elseif.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/for.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/foreach.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/foreachk.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/fun.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/get.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/globals.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/if.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/ife.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/inc.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/inc1.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/log.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/php.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/post.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/req.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/req1.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/request.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/session.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/switch.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/t.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/try.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/var.snippet create mode 100644 sources_non_forked/snipmate-snippets/php/wh.snippet create mode 100644 sources_non_forked/snipmate-snippets/po/msg.snippet create mode 100644 sources_non_forked/snipmate-snippets/python/class.snippet create mode 100644 sources_non_forked/snipmate-snippets/python/def.snippet create mode 100644 sources_non_forked/snipmate-snippets/python/for.snippet create mode 100644 sources_non_forked/snipmate-snippets/python/from.snippet create mode 100644 sources_non_forked/snipmate-snippets/python/get.snippet create mode 100644 sources_non_forked/snipmate-snippets/python/ifmain.snippet create mode 100644 sources_non_forked/snipmate-snippets/python/import.snippet create mode 100644 sources_non_forked/snipmate-snippets/python/init.snippet create mode 100644 sources_non_forked/snipmate-snippets/python/set.snippet create mode 100644 sources_non_forked/snipmate-snippets/python/try.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-factorygirl/fac.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-factorygirl/facb.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-factorygirl/facd.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-factorygirl/facn.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-factorygirl/facs.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/art.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/artnp.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/artnpp.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/artp.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/artpp.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/asd.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/asnd.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/asre.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/asrj.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/ass.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/bf.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/bt.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/crw.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/defcreate.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/defdestroy.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/defedit.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/defindex.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/defnew.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/defshow.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/defupdate.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/fina.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/finf.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/fini.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/finl.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/flash.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/habtm.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/hm.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/hmd.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/hmt.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/ho.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/i18.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/ist.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/log.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/logd.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/loge.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/logf.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/logi.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/logw.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/mac.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/mapc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/mapca.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/mapr.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/maprs.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/mapwo.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/mbs.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/mcc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/mccc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/mcht.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/mcol.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/mct.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/migration.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/mp.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/mrc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/mrmc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/mrnc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/mrw.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/nc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/ncl.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/pa.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/ra.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/ral.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rest.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rf.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rfu.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/ri.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/ril.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rit.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rjson.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rl.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rn.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rns.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rp.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rpc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rpl.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rpo.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rps.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rt.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rtl.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rtlt.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rts.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/ru.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/rxml.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/sha1.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/sweeper.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tcb.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tcbi.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tcd.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tcda.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tcdt.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tcf.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tch.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tci.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tcl.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tcr.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tcs.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tct.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tcti.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tcts.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tctss.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/trc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tre.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/tref.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/va.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/vao.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/vc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/ve.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/vf.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/vi.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/vl.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/vn.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/vpo.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/vu.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/wants.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/xdelete.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/xget.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/xpost.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rails/xput.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/aft.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/annot.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/anr.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/anra.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/anrb.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/ant.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/any.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/atl.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/atm.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/bef.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/conn.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/des.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/desc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/desrc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/dest.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/dests.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/ex.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/isbl.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/it.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/its.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/mat.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/mm.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/moc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/mocw.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/on.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/resh.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/sef.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/sh.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shb.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shbc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shbio.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shbko.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shbr.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shbs.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shdm.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/she.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/sheq.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shh.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shhal.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shham.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shhr.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shn.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shnb.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shnbc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shnbio.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shnbko.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shnbr.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shnbs.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shnc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shne.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shneq.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shnm.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shnp.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shnr.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shnre.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shnredt.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shnrt.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shns.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shnt.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shp.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shr.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shre.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shredt.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shrt.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shs.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/sht.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/shtemp.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/tw.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-rspec/wia.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/context.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/samao.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/savf.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/sbt.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/selal.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/seli.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/selir.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/setup.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/sevir.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/shabtm.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/shcm.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/shdc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/shi.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/shim.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/shm.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/sho.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/shroa.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/snamao.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/snavf.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/svao.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/svno.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/svpo.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby-shoulda/svuo.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/Md.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/Ml.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/Pn.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/Yd.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/Yl.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/am.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/as.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asam.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asb.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/ascd.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/ase.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asem.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asf.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asfa.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asi.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asid.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asie.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asio.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asko.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asm.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asn.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asncd.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asne.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asnem.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asni.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asnid.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asnie.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asnm.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asnn.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asnp.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asnr.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asnrt.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asns.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asnse.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asnt.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/aso.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asp.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/aspe.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/aspne.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asr.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asrko.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asrm.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asrt.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/asse.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/ast.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/astr.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/bm.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/case.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/class.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/classe.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/def.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/defi.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/defmm.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/defs.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/deft.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/detect.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/detecto.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/dglob.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/do.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/dop.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/ea.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/each.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/each_with_index.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/each_with_indexo.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/eacho.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/eado.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/eawi.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/eawido.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/elsif.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/fileeach.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/fopen.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/fread.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/http_get.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/http_post.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/if.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/ife.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/inj.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/injdo.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/inject.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/injecto.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/ip.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/map.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/mapdo.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/mapo.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/mod.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/module.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/nam.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/ope.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/pathhere.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/r.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/reject.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/rejecto.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/rep.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/rw.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/select.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/selecto.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/sinc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/sort.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/sorto.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/tas.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/task.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/tc.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/unless.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/unlesse.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/w.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/while.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/xmlr.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/xpa.snippet create mode 100644 sources_non_forked/snipmate-snippets/ruby/zip.snippet create mode 100644 sources_non_forked/snipmate-snippets/sinatra/get.snippet delete mode 100644 sources_non_forked/snipmate-snippets/snippets/cpp.snippets delete mode 100644 sources_non_forked/snipmate-snippets/snippets/sh.snippets create mode 100644 sources_non_forked/snipmate-snippets/sshconfig/host.snippet create mode 100644 sources_non_forked/snipmate-snippets/support_functions.vim create mode 100644 sources_non_forked/snipmate-snippets/vim/au.snippet create mode 100644 sources_non_forked/snipmate-snippets/vim/com.snippet create mode 100644 sources_non_forked/snipmate-snippets/vim/func.snippet create mode 100644 sources_non_forked/snipmate-snippets/vim/if.snippet create mode 100644 sources_non_forked/snipmate-snippets/vim/ife.snippet create mode 100644 sources_non_forked/snipmate-snippets/vim/log.snippet create mode 100644 sources_non_forked/snipmate-snippets/vim/try.snippet create mode 100644 sources_non_forked/snipmate-snippets/xslt/call.snippet create mode 100644 sources_non_forked/snipmate-snippets/xslt/choose.snippet create mode 100644 sources_non_forked/snipmate-snippets/xslt/mat.snippet create mode 100644 sources_non_forked/snipmate-snippets/xslt/out.snippet create mode 100644 sources_non_forked/snipmate-snippets/xslt/param.snippet create mode 100644 sources_non_forked/snipmate-snippets/xslt/sty.snippet create mode 100644 sources_non_forked/snipmate-snippets/xslt/tem.snippet create mode 100644 sources_non_forked/snipmate-snippets/xslt/value.snippet create mode 100644 sources_non_forked/snipmate-snippets/xslt/var.snippet create mode 100644 sources_non_forked/snipmate-snippets/xslt/wparam.snippet create mode 100644 sources_non_forked/snipmate-snippets/xslt/xdec.snippet create mode 100644 sources_non_forked/snipmate-snippets/zend/assert.snippet create mode 100644 sources_non_forked/snipmate-snippets/zend/boolcol.snippet create mode 100644 sources_non_forked/snipmate-snippets/zend/clac.snippet create mode 100644 sources_non_forked/snipmate-snippets/zend/flash.snippet create mode 100644 sources_non_forked/snipmate-snippets/zend/getconf.snippet create mode 100644 sources_non_forked/snipmate-snippets/zend/input.snippet create mode 100644 sources_non_forked/snipmate-snippets/zend/inputarr.snippet create mode 100644 sources_non_forked/snipmate-snippets/zend/intcol.snippet create mode 100644 sources_non_forked/snipmate-snippets/zend/lib.snippet create mode 100644 sources_non_forked/snipmate-snippets/zend/model.snippet create mode 100644 sources_non_forked/snipmate-snippets/zend/navi.snippet create mode 100644 sources_non_forked/snipmate-snippets/zend/route.snippet create mode 100644 sources_non_forked/snipmate-snippets/zend/rp.snippet create mode 100644 sources_non_forked/snipmate-snippets/zend/strcol.snippet create mode 100644 sources_non_forked/taglist.vim/README create mode 100644 sources_non_forked/taglist.vim/doc/taglist.txt create mode 100644 sources_non_forked/taglist.vim/doc/tags create mode 100644 sources_non_forked/taglist.vim/plugin/taglist.vim create mode 100755 sources_non_forked/taglist/doc/taglist.txt create mode 100644 sources_non_forked/taglist/doc/tags create mode 100644 sources_non_forked/taglist/plugin/taglist.vim create mode 100644 sources_non_forked/tlib/autoload/tlib/Filter_cnfx.vim delete mode 100644 sources_non_forked/tlib/autoload/tlib/Filter_seq.vim create mode 100644 sources_non_forked/tlib/autoload/tlib/persistent.vim create mode 100644 sources_non_forked/tlib/autoload/tlib/vcs.vim create mode 100644 sources_non_forked/tlib/doc/tags create mode 100644 sources_non_forked/vim-addon-mw-utils/autoload/tovl/scratch_buffer.vim create mode 100644 sources_non_forked/vim-addon-mw-utils/autoload/tovl/ui/filter_list.vim mode change 100755 => 100644 sources_non_forked/vim-coffee-script/syntax/coffee.vim create mode 100644 sources_non_forked/vim-indent-object/.gitignore create mode 100644 sources_non_forked/vim-indent-object/doc/indent-object.txt create mode 100644 sources_non_forked/vim-indent-object/plugin/indent-object.vim delete mode 100644 sources_non_forked/vim-powerline/.gitignore create mode 100644 sources_non_forked/vim-powerline/README.md delete mode 100644 sources_non_forked/vim-powerline/README.rst delete mode 100644 sources_non_forked/vim-powerline/autoload/Pl.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Pl/Colorscheme.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Pl/Hi.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Pl/Match.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Pl/Mod.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Pl/Parser.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Pl/Segment.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Pl/Theme.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/default.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/skwp.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Functions.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Functions/ft_man.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Functions/fugitive.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Functions/hgrev.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Functions/syntastic.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Matches.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Segments.vim delete mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Segments/ctrlp.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Segments/ft_man.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Segments/fugitive.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Segments/hgrev.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Segments/rvm.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Segments/syntastic.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Segments/tagbar.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Segments/virtualenv.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Themes/default.vim delete mode 100644 sources_non_forked/vim-powerline/autoload/Powerline/Themes/skwp.vim delete mode 100644 sources_non_forked/vim-powerline/doc/Powerline.txt delete mode 100644 sources_non_forked/vim-powerline/fontpatcher/PowerlineSymbols.sfd delete mode 100644 sources_non_forked/vim-powerline/fontpatcher/README.rst delete mode 100755 sources_non_forked/vim-powerline/fontpatcher/fontpatcher delete mode 100644 sources_non_forked/vim-powerline/plugin/Powerline.vim rename sources_non_forked/{snipmate-snippets => vim-snippets}/AUTHORS (78%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/LICENSE (100%) create mode 100644 sources_non_forked/vim-snippets/README.md create mode 100644 sources_non_forked/vim-snippets/UltiSnips/README rename sources_non_forked/vim-snippets/{ => UltiSnips}/all.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/bindzone.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/c.snippets (89%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/coffee.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/coffee_jasmine.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/cpp.snippets (99%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/css.snippets (100%) create mode 100644 sources_non_forked/vim-snippets/UltiSnips/d.snippets rename sources_non_forked/vim-snippets/{ => UltiSnips}/django.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/erlang.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/eruby.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/go.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/haskell.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/help.snippets (88%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/html.snippets (84%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/htmldjango.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/java.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/javascript.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/javascript_jasmine.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/jinja2.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/json.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/lua.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/mako.snippets (100%) rename sources_non_forked/vim-snippets/{mkd.snippets => UltiSnips/markdown.snippets} (92%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/objc.snippets (100%) create mode 100644 sources_non_forked/vim-snippets/UltiSnips/ocaml.snippets rename sources_non_forked/vim-snippets/{ => UltiSnips}/perl.snippets (100%) create mode 100644 sources_non_forked/vim-snippets/UltiSnips/php.snippets rename sources_non_forked/vim-snippets/{ => UltiSnips}/puppet.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/python.snippets (98%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/rails.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/rst.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/ruby.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/sh.snippets (67%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/snippets.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/tcl.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/tex.snippets (99%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/texmath.snippets (100%) rename sources_non_forked/vim-snippets/{ => UltiSnips}/vim.snippets (100%) create mode 100644 sources_non_forked/vim-snippets/UltiSnips/xhtml.snippets create mode 100644 sources_non_forked/vim-snippets/UltiSnips/xml.snippets create mode 100644 sources_non_forked/vim-snippets/UltiSnips/zsh.snippets rename sources_non_forked/{snipmate-snippets => vim-snippets}/addon-info.json (93%) delete mode 100644 sources_non_forked/vim-snippets/pascal.snippets delete mode 100644 sources_non_forked/vim-snippets/php.snippets delete mode 100644 sources_non_forked/vim-snippets/phtml.snippets rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/_.snippets (93%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/actionscript.snippets (99%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/apache.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/autoit.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/c.snippets (52%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/chef.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/clojure.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/cmake.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/coffee.snippets (93%) create mode 100644 sources_non_forked/vim-snippets/snippets/cpp.snippets rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/cs.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/css.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/dart.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/diff.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/django.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/erlang.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/eruby.snippets (98%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/falcon.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/go.snippets (85%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/haml.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/haskell.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/html.snippets (97%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/htmldjango.snippets (97%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/htmltornado.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/java.snippets (97%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/javascript-jquery.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/javascript.snippets (82%) create mode 100644 sources_non_forked/vim-snippets/snippets/javascript_jquery.snippets rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/jsp.snippets (100%) create mode 100644 sources_non_forked/vim-snippets/snippets/ledger.snippets rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/lua.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/make.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/mako.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/markdown.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/objc.snippets (100%) create mode 100644 sources_non_forked/vim-snippets/snippets/openfoam.snippets rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/perl.snippets (83%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/php.snippets (83%) create mode 100644 sources_non_forked/vim-snippets/snippets/plsql.snippets rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/po.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/processing.snippets (100%) mode change 100755 => 100644 rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/progress.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/puppet.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/python.snippets (66%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/r.snippets (77%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/rst.snippets (69%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/ruby.snippets (95%) create mode 100644 sources_non_forked/vim-snippets/snippets/scala.snippets create mode 100644 sources_non_forked/vim-snippets/snippets/sh.snippets rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/snippets.snippets (100%) create mode 100644 sources_non_forked/vim-snippets/snippets/sql.snippets rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/tcl.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/tex.snippets (84%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/textile.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/vim.snippets (100%) rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/xslt.snippets (98%) create mode 100644 sources_non_forked/vim-snippets/snippets/yii-chtml.snippets create mode 100644 sources_non_forked/vim-snippets/snippets/yii.snippets rename sources_non_forked/{snipmate-snippets => vim-snippets}/snippets/zsh.snippets (100%) delete mode 100644 sources_non_forked/vim-snippets/xhtml.snippets create mode 100644 update_plugins.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..1a13e7c7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +temp_dirs/undodir* +sources_non_forked/ack.vim/.netrwhist +temp_dirs/yankring_history_v2.txt +my_configs.vim diff --git a/README.md b/README.md index b518d85c..d1c16a05 100644 --- a/README.md +++ b/README.md @@ -257,6 +257,10 @@ Bash like keys for the command line: cnoremap cnoremap +Write the file as sudo (only on Unix). [Vim tip](http://vim.wikia.com/wiki/Su-write): + + :W + ### Spell checking Pressing `ss` will toggle and untoggle spell checking diff --git a/sources_forked/yankring/doc/tags b/sources_forked/yankring/doc/tags new file mode 100644 index 00000000..36de7820 --- /dev/null +++ b/sources_forked/yankring/doc/tags @@ -0,0 +1,40 @@ +YRClear yankring.txt /*YRClear* +YRClear-example yankring.txt /*YRClear-example* +YRDeleteRange yankring.txt /*YRDeleteRange* +YRGetElem yankring.txt /*YRGetElem* +YRGetMultiple yankring.txt /*YRGetMultiple* +YRGetMultiple-example yankring.txt /*YRGetMultiple-example* +YRMapsCreate yankring.txt /*YRMapsCreate* +YRMapsDelete yankring.txt /*YRMapsDelete* +YRPaste yankring.txt /*YRPaste* +YRPop yankring.txt /*YRPop* +YRPop-example yankring.txt /*YRPop-example* +YRPush yankring.txt /*YRPush* +YRPush-example yankring.txt /*YRPush-example* +YRReplace yankring.txt /*YRReplace* +YRReplace-example yankring.txt /*YRReplace-example* +YRSearch yankring.txt /*YRSearch* +YRSearch-example yankring.txt /*YRSearch-example* +YRShow yankring.txt /*YRShow* +YRShow-example yankring.txt /*YRShow-example* +YRToggle yankring.txt /*YRToggle* +YRYankCount yankring.txt /*YRYankCount* +YRYankRange yankring.txt /*YRYankRange* +YRYankRange-example yankring.txt /*YRYankRange-example* +any-item-example yankring.txt /*any-item-example* +global-example yankring.txt /*global-example* +multiple-items-example yankring.txt /*multiple-items-example* +yankring yankring.txt /*yankring* +yankring-commands yankring.txt /*yankring-commands* +yankring-configure yankring.txt /*yankring-configure* +yankring-contents yankring.txt /*yankring-contents* +yankring-custom-maps yankring.txt /*yankring-custom-maps* +yankring-description yankring.txt /*yankring-description* +yankring-globals yankring.txt /*yankring-globals* +yankring-history yankring.txt /*yankring-history* +yankring-mappings yankring.txt /*yankring-mappings* +yankring-tutorial yankring.txt /*yankring-tutorial* +yankring-visual-example yankring.txt /*yankring-visual-example* +yankring-window yankring.txt /*yankring-window* +yankring-window-example yankring.txt /*yankring-window-example* +yankring.txt yankring.txt /*yankring.txt* diff --git a/sources_forked/zencoding/.gitignore b/sources_forked/zencoding/.gitignore new file mode 100755 index 00000000..0a56e3fc --- /dev/null +++ b/sources_forked/zencoding/.gitignore @@ -0,0 +1 @@ +/doc/tags diff --git a/sources_forked/zencoding/.gitmodules b/sources_forked/zencoding/.gitmodules new file mode 100755 index 00000000..8225cc06 --- /dev/null +++ b/sources_forked/zencoding/.gitmodules @@ -0,0 +1,4 @@ +[submodule "docs"] + path = docs + url = git@github.com:mattn/zencoding-vim.git + branch = gh-pages diff --git a/sources_forked/zencoding/Makefile b/sources_forked/zencoding/Makefile new file mode 100755 index 00000000..94c355a8 --- /dev/null +++ b/sources_forked/zencoding/Makefile @@ -0,0 +1,11 @@ +all : zencoding-vim.zip + +remove-zip: + -rm doc/tags + -rm zencoding-vim.zip + +zencoding-vim.zip: remove-zip + zip -r zencoding-vim.zip autoload plugin doc + +release: zencoding-vim.zip + vimup update-script zencoding.vim diff --git a/sources_forked/zencoding/README.mkd b/sources_forked/zencoding/README.mkd new file mode 100755 index 00000000..36eead34 --- /dev/null +++ b/sources_forked/zencoding/README.mkd @@ -0,0 +1,103 @@ +# ZenCoding-vim + +[zencoding-vim](http://mattn.github.com/zencoding-vim) is vim script support for expanding abbreviation like zen-coding(emmet). + +## Installation + +[Download zip file](http://www.vim.org/scripts/script.php?script_id=2981): + + cd ~/.vim + unzip zencoding-vim.zip + +If you install pathogen.vim: + + cd ~/.vim/bundle # or make directory + unzip /path/to/zencoding-vim.zip + +If you get source from repository: + + cd ~/.vim/bundle # or make directory + git clone http://github.com/mattn/zencoding-vim.git + +or: + + git clone http://github.com/mattn/zencoding-vim.git + cd zencoding-vim + cp plugin/zencoding.vim ~/.vim/plugin/ + cp autoload/zencoding.vim ~/.vim/autoload/ + cp -a autoload/zencoding ~/.vim/autoload/ + + +## Quick Tutorial + +Open or create New File: + + vim index.html + +Type ("_" is the cursor position): + + html:5_ + +Then type "," (Ctrl + y + ','), you should see: + + + + + + + + + _ + + + +[More Tutorials](https://raw.github.com/mattn/zencoding-vim/master/TUTORIAL) + + +## Enable in different mode + +If you don't want enable zencoding in all mode, +you can use set a option in `vimrc`: + + let g:user_zen_mode='n' "only enable normal mode functions. + let g:user_zen_mode='inv' "enable all functions, which is equal to + let g:user_zen_mode='a' "enable all function in all mode. + +## Project Authors + +[Yasuhiro Matsumoto](http://mattn.kaoriya.net/) + +## Links + +### zen-coding official site: + +> + +### zencoding.vim: + +> + +### development repository: + +> + +### my blog posts about zencoding-vim: + +> + +> + +### japanese blog posts about zencoding-vim: + +> + +> + +> + +> + +### tutorial traslated in chinese: + +> + diff --git a/sources_forked/zencoding/TODO b/sources_forked/zencoding/TODO new file mode 100755 index 00000000..e69de29b diff --git a/sources_forked/zencoding/TUTORIAL b/sources_forked/zencoding/TUTORIAL new file mode 100755 index 00000000..ad460418 --- /dev/null +++ b/sources_forked/zencoding/TUTORIAL @@ -0,0 +1,212 @@ +Tutorial of zencoding.vim + + mattn + +1. Expand Abbreviation + + Type abbreviation as 'div>p#foo$*3>a' and type ','. + --------------------- +
+

+ +

+

+ +

+

+ +

+
+ --------------------- + +2. Wrap with Abbreviation + + Write as below. + --------------------- + test1 + test2 + test3 + --------------------- + Then do visual select(line wize) and type ','. + If you request 'Tag:', then type 'ul>li*'. + --------------------- +
    +
  • test1
  • +
  • test2
  • +
  • test3
  • +
+ --------------------- + + If you type tag as 'blockquote', then you'll see as following. + --------------------- +
+ test1 + test2 + test3 +
+ --------------------- + +3. Balance Tag Inward + + type 'd' in insert mode. + +4. Balance Tag Outward + + type 'D' in insert mode. + +5. Go to Next Edit Point + + type 'n' in insert mode. + +6. Go to Previous Edit Point + + type 'N' in insert mode. + +7. Update Size + + Move cursor to img tag. + --------------------- + + --------------------- + Type 'i' on img tag + --------------------- + + --------------------- + +8. Merge Lines + + select the lines included '
  • ' + --------------------- +
      +
    • +
    • +
    • +
    + --------------------- + and type 'm' + --------------------- +
      +
    • +
    + --------------------- + +9. Remove Tag + + Move cursor in block + --------------------- + + --------------------- + Type 'k' in insert mode. + --------------------- +
    + +
    + --------------------- + + And type 'k' in there again. + --------------------- + + --------------------- + +10. Split/Join Tag + + Move cursor in block + --------------------- +
    + cursor is here +
    + --------------------- + Type 'j' in insert mode. + --------------------- +
    + --------------------- + + And type 'j' in there again. + --------------------- +
    +
    + --------------------- + +11. Toggle Comment + + Move cursor to block + --------------------- +
    + hello world +
    + --------------------- + Type '/' in insert mode. + --------------------- + + --------------------- + Type '/' in there again. + --------------------- +
    + hello world +
    + --------------------- + +12. Make anchor from URL + + Move cursor to URL + --------------------- + http://www.google.com/ + --------------------- + Type 'a' + --------------------- + Google + --------------------- + +13. Make quoted text from URL + + Move cursor to URL + --------------------- + http://github.com/ + --------------------- + Type 'A' + --------------------- +
    + Secure source code hosting and collaborative development - GitHub
    +

    How does it work? Get up and running in seconds by forking a project, pushing an existing repository...

    + http://github.com/ +
    + --------------------- + +14. Installing zencoding.vim for language you using. + + # cd ~/.vim + # unzip zencoding-vim.zip + + or if you install pathogen.vim: + + # cd ~/.vim/bundle # or make directory + # unzip /path/to/zencoding-vim.zip + + if you get sources from repository: + + # cd ~/.vim/bundle # or make directory + # git clone http://github.com/mattn/zencoding-vim.git + +15. Enable zencoding.vim for language you using. + + You can customize the behavior of language you using. + + --------------------- + # cat >> ~/.vimrc + let g:user_zen_settings = { + \ 'php' : { + \ 'extends' : 'html', + \ 'filters' : 'c', + \ }, + \ 'xml' : { + \ 'extends' : 'html', + \ }, + \ 'haml' : { + \ 'extends' : 'html', + \ }, + \} + --------------------- diff --git a/sources_forked/zencoding/autoload/zencoding.vim b/sources_forked/zencoding/autoload/zencoding.vim new file mode 100755 index 00000000..a6961439 --- /dev/null +++ b/sources_forked/zencoding/autoload/zencoding.vim @@ -0,0 +1,1486 @@ +"============================================================================= +" zencoding.vim +" Author: Yasuhiro Matsumoto +" Last Change: 09-Apr-2013. + +let s:save_cpo = &cpo +set cpo&vim + +function! zencoding#getExpandos(type, key) + let expandos = zencoding#getResource(a:type, 'expandos', {}) + if has_key(expandos, a:key) + return expandos[a:key] + endif + return a:key +endfunction + +function! zencoding#splitFilterArg(filters) + for f in a:filters + if f =~ '^/' + return f[1:] + endif + endfor + return '' +endfunction + +function! zencoding#useFilter(filters, filter) + for f in a:filters + if a:filter == '/' && f =~ '^/' + return 1 + elseif f == a:filter + return 1 + endif + endfor + return 0 +endfunction + +function! zencoding#getIndentation(...) + if a:0 > 0 + let type = a:1 + else + let type = zencoding#getFileType() + endif + if has_key(s:zen_settings, type) && has_key(s:zen_settings[type], 'indentation') + let indent = s:zen_settings[type].indentation + elseif has_key(s:zen_settings, 'indentation') + let indent = s:zen_settings.indentation + else + let indent = (&l:expandtab || &l:tabstop != &l:shiftwidth) ? repeat(' ', &l:shiftwidth) : "\t" + endif + return indent +endfunction + +function! zencoding#getBaseType(type) + if !has_key(s:zen_settings, a:type) + return '' + endif + if !has_key(s:zen_settings[a:type], 'extends') + return a:type + endif + let extends = s:zen_settings[a:type].extends + if type(extends) == 1 + let tmp = split(extends, '\s*,\s*') + let ext = tmp[0] + else + let ext = extends[0] + endif + if a:type != ext + return zencoding#getBaseType(ext) + endif + return '' +endfunction + +function! zencoding#isExtends(type, extend) + if a:type == a:extend + return 1 + endif + if !has_key(s:zen_settings, a:type) + return 0 + endif + if !has_key(s:zen_settings[a:type], 'extends') + return 0 + endif + let extends = s:zen_settings[a:type].extends + if type(extends) == 1 + let tmp = split(extends, '\s*,\s*') + unlet! extends + let extends = tmp + endif + for ext in extends + if a:extend == ext + return 1 + endif + endfor + return 0 +endfunction + +function! zencoding#parseIntoTree(abbr, type) + let abbr = a:abbr + let type = a:type + let rtype = zencoding#lang#exists(type) ? type : 'html' + return zencoding#lang#{rtype}#parseIntoTree(abbr, type) +endfunction + +function! s:mergeConfig(lhs, rhs) + if type(a:lhs) == 3 && type(a:rhs) == 3 + let a:lhs += a:rhs + if len(a:lhs) + call remove(a:lhs, 0, len(a:lhs)-1) + endif + for rhi in a:rhs + call add(a:lhs, a:rhs[rhi]) + endfor + elseif type(a:lhs) == 4 && type(a:rhs) == 4 + for key in keys(a:rhs) + if type(a:rhs[key]) == 3 + if !has_key(a:lhs, key) + let a:lhs[key] = [] + endif + let a:lhs[key] += a:rhs[key] + elseif type(a:rhs[key]) == 4 + if has_key(a:lhs, key) + call s:mergeConfig(a:lhs[key], a:rhs[key]) + else + let a:lhs[key] = a:rhs[key] + endif + else + let a:lhs[key] = a:rhs[key] + endif + endfor + endif +endfunction + +function! zencoding#toString(...) + let current = a:1 + if a:0 > 1 + let type = a:2 + else + let type = &ft + endif + if len(type) == 0 | let type = 'html' | endif + if a:0 > 2 + let inline = a:3 + else + let inline = 0 + endif + if a:0 > 3 + if type(a:4) == 1 + let filters = split(a:4, '\s*,\s*') + else + let filters = a:4 + endif + else + let filters = ['html'] + endif + if a:0 > 4 + let group_itemno = a:5 + else + let group_itemno = 0 + endif + + let dollar_expr = zencoding#getResource(type, 'dollar_expr', 1) + let indent = zencoding#getIndentation(type) + let itemno = 0 + let str = '' + let use_pipe_for_cursor = zencoding#getResource(type, 'use_pipe_for_cursor', 1) + let rtype = zencoding#lang#exists(type) ? type : 'html' + while itemno < current.multiplier + if len(current.name) + if group_itemno != 0 + let inner = zencoding#lang#{rtype}#toString(s:zen_settings, current, type, inline, filters, group_itemno, indent) + else + let inner = zencoding#lang#{rtype}#toString(s:zen_settings, current, type, inline, filters, itemno, indent) + endif + if current.multiplier > 1 + let inner = substitute(inner, '\$#', '$line'.(itemno+1).'$', 'g') + endif + let str .= inner + else + let snippet = current.snippet + if len(current.snippet) == 0 + let snippets = zencoding#getResource(type, 'snippets', {}) + if !empty(snippets) && has_key(snippets, 'zensnippet') + let snippet = snippets['zensnippet'] + endif + endif + if len(snippet) > 0 + let tmp = snippet + if use_pipe_for_cursor + let tmp = substitute(tmp, '|', '${cursor}', 'g') + endif + let tmp = substitute(tmp, '\${zenname}', current.name, 'g') + let snippet_node = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 0, 'parent': {}, 'value': '{'.tmp.'}', 'pos': 0, 'important': current.important } + let str = zencoding#lang#{rtype}#toString(s:zen_settings, snippet_node, type, inline, filters, group_itemno, indent) + else + if len(current.name) + let str .= current.name + endif + if len(current.value) + let text = current.value[1:-2] + if dollar_expr + let text = substitute(text, '\%(\\\)\@\{$#}' + endif + if zencoding#useFilter(filters, '/') + let spl = zencoding#splitFilterArg(filters) + let fline = getline(a:firstline) + let query = substitute(query, '>\{0,1}{\$#}\s*$', '{\\$column\\$}*' . len(split(fline, spl)), '') + endif + let items = zencoding#parseIntoTree(query, type).child + for item in items + let expand .= zencoding#toString(item, type, 0, filters) + endfor + if zencoding#useFilter(filters, 'e') + let expand = substitute(expand, '&', '\&', 'g') + let expand = substitute(expand, '<', '\<', 'g') + let expand = substitute(expand, '>', '\>', 'g') + endif + let line = getline(a:firstline) + let part = substitute(line, '^\s*', '', '') + for n in range(a:firstline, a:lastline) + let lline = getline(n) + let lpart = substitute(lline, '^\s\+', '', '') + if zencoding#useFilter(filters, 't') + let lpart = substitute(lpart, '^[0-9.-]\+\s\+', '', '') + let lpart = substitute(lpart, '\s\+$', '', '') + endif + if zencoding#useFilter(filters, '/') + for column in split(lpart, spl) + let expand = substitute(expand, '\$column\$', '\=column', '') + endfor + else + let expand = substitute(expand, '\$line'.(n-a:firstline+1).'\$', '\=lpart', 'g') + endif + endfor + let expand = substitute(expand, '\$line\d*\$', '', 'g') + let expand = substitute(expand, '\$column\$', '', 'g') + let content = join(getline(a:firstline, a:lastline), "\n") + if stridx(expand, '$#') < len(expand)-2 + let expand = substitute(expand, '^\(.*\)\$#\s*$', '\1', '') + endif + let expand = substitute(expand, '\$#', '\=content', 'g') + else + let str = '' + if visualmode() ==# 'V' + let line = getline(a:firstline) + let part = substitute(line, '^\s*', '', '') + for n in range(a:firstline, a:lastline) + if len(leader) > 0 + let str .= getline(n) . "\n" + else + let lpart = substitute(getline(n), '^\s*', '', '') + let str .= lpart . "\n" + endif + endfor + let leader .= (str =~ "\n" ? ">{\n" : "{") . str . "}" + let items = zencoding#parseIntoTree(leader, type).child + else + let save_regcont = @" + let save_regtype = getregtype('"') + silent! normal! gvygv + let str = @" + call setreg('"', save_regcont, save_regtype) + let items = zencoding#parseIntoTree(leader . "{".str."}", type).child + endif + for item in items + let expand .= zencoding#toString(item, type, 0, filters) + endfor + if zencoding#useFilter(filters, 'e') + let expand = substitute(expand, '&', '\&', 'g') + let expand = substitute(expand, '<', '\<', 'g') + let expand = substitute(expand, '>', '\>', 'g') + endif + endif + elseif a:mode == 4 + let line = getline('.') + let spaces = matchstr(line, '^\s*') + if line !~ '^\s*$' + put =spaces.a:abbr + else + call setline('.', spaces.a:abbr) + endif + normal! $ + call zencoding#expandAbbr(0, "") + return + else + let line = getline('.') + if col('.') < len(line) + let line = matchstr(line, '^\(.*\%'.col('.').'c.\)') + endif + if a:mode == 1 + let part = matchstr(line, '\([a-zA-Z0-9:_\-\@|]\+\)$') + else + let part = matchstr(line, '\(\S.*\)$') + let ftype = zencoding#lang#exists(type) ? type : 'html' + let part = zencoding#lang#{ftype}#findTokens(part) + endif + let rest = getline('.')[len(line):] + let str = part + let mx = '|\(\%(html\|haml\|slim\|e\|c\|fc\|xsl\|t\|\/[^ ]\+\)\s*,\{0,1}\s*\)*$' + if str =~ mx + let filters = split(matchstr(str, mx)[1:], '\s*,\s*') + let str = substitute(str, mx, '', '') + endif + let items = zencoding#parseIntoTree(str, rtype).child + for item in items + let expand .= zencoding#toString(item, rtype, 0, filters) + endfor + if zencoding#useFilter(filters, 'e') + let expand = substitute(expand, '&', '\&', 'g') + let expand = substitute(expand, '<', '\<', 'g') + let expand = substitute(expand, '>', '\>', 'g') + endif + let expand = substitute(expand, '\$line\([0-9]\+\)\$', '\=submatch(1)', 'g') + endif + if len(expand) + if expand !~ '\${cursor}' + if a:mode == 2 | + let expand = '${cursor}' . expand + else + let expand .= '${cursor}' + endif + endif + let expand = substitute(expand, '${lang}', s:zen_settings.lang, 'g') + let expand = substitute(expand, '${charset}', s:zen_settings.charset, 'g') + if has_key(s:zen_settings, 'timezone') && len(s:zen_settings.timezone) + let expand = substitute(expand, '${datetime}', strftime("%Y-%m-%dT%H:%M:%S") . s:zen_settings.timezone, 'g') + else + " TODO: on windows, %z/%Z is 'Tokyo(Standard)' + let expand = substitute(expand, '${datetime}', strftime("%Y-%m-%dT%H:%M:%S %z"), 'g') + endif + if a:mode == 2 && visualmode() ==# 'v' + if a:firstline == a:lastline + let expand = substitute(expand, '\n\s*', '', 'g') + else + let expand = substitute(expand, '\n$', '', 'g') + endif + let expand = substitute(expand, '\${cursor}', '$cursor$', '') + let expand = substitute(expand, '\${cursor}', '', 'g') + silent! normal! gv + let col = col("'<") + silent! normal! c + let line = getline('.') + let lhs = matchstr(line, '.*\%<'.col.'c.') + let rhs = matchstr(line, '\%>'.(col-1).'c.*') + let expand = lhs.expand.rhs + let lines = split(expand, '\n') + call setline(line('.'), lines[0]) + if len(lines) > 1 + call append(line('.'), lines[1:]) + endif + else + let expand = substitute(expand, '\${cursor}', '$cursor$', '') + let expand = substitute(expand, '\${cursor}', '', 'g') + if line[:-len(part)-1] =~ '^\s\+$' + let indent = line[:-len(part)-1] + else + let indent = '' + endif + let expand = substitute(expand, '\n\s*$', '', 'g') + let expand = line[:-len(part)-1] . substitute(expand, "\n", "\n" . indent, 'g') . rest + let lines = split(expand, '\n') + if a:mode == 2 + silent! exe "normal! gvc" + endif + call setline(line('.'), lines[0]) + if len(lines) > 1 + call append(line('.'), lines[1:]) + endif + endif + endif + if search('\$cursor\$', 'e') + let oldselection = &selection + let &selection = 'inclusive' + silent! foldopen + silent! exe "normal! v7h\"_s" + let &selection = oldselection + endif + if g:zencoding_debug > 1 + call getchar() + endif +endfunction + +function! zencoding#moveNextPrev(flag) + let type = zencoding#getFileType() + let rtype = zencoding#lang#exists(type) ? type : 'html' + return zencoding#lang#{rtype}#moveNextPrev(a:flag) +endfunction + +function! zencoding#imageSize() + let type = zencoding#getFileType() + let rtype = zencoding#lang#exists(type) ? type : 'html' + return zencoding#lang#{rtype}#imageSize() +endfunction + +function! zencoding#encodeImage() + let type = zencoding#getFileType() + let rtype = zencoding#lang#exists(type) ? type : 'html' + return zencoding#lang#{rtype}#encodeImage() +endfunction + +function! zencoding#toggleComment() + let type = zencoding#getFileType() + let rtype = zencoding#lang#exists(type) ? type : 'html' + return zencoding#lang#{rtype}#toggleComment() +endfunction + +function! zencoding#balanceTag(flag) range + let type = zencoding#getFileType() + let rtype = zencoding#lang#exists(type) ? type : 'html' + return zencoding#lang#{rtype}#balanceTag(a:flag) +endfunction + +function! zencoding#splitJoinTag() + let type = zencoding#getFileType() + let rtype = zencoding#lang#exists(type) ? type : 'html' + return zencoding#lang#{rtype}#splitJoinTag() +endfunction + +function! zencoding#mergeLines() range + let lines = join(map(getline(a:firstline, a:lastline), 'matchstr(v:val, "^\\s*\\zs.*\\ze\\s*$")'), '') + let indent = substitute(getline('.'), '^\(\s*\).*', '\1', '') + silent! exe "normal! gvc" + call setline('.', indent . lines) +endfunction + +function! zencoding#removeTag() + let type = zencoding#getFileType() + let rtype = zencoding#lang#exists(type) ? type : 'html' + return zencoding#lang#{rtype}#removeTag() +endfunction + +function! zencoding#anchorizeURL(flag) + let mx = 'https\=:\/\/[-!#$%&*+,./:;=?@0-9a-zA-Z_~]\+' + let pos1 = searchpos(mx, 'bcnW') + let url = matchstr(getline(pos1[0])[pos1[1]-1:], mx) + let block = [pos1, [pos1[0], pos1[1] + len(url) - 1]] + if !zencoding#util#cursorInRegion(block) + return + endif + + let mx = '.*]*>\s*\zs\([^<]\+\)\ze\s*<\/title[^>]*>.*' + let content = zencoding#util#getContentFromURL(url) + let content = substitute(content, '\r', '', 'g') + let content = substitute(content, '[ \n]\+', ' ', 'g') + let content = substitute(content, '', '', 'g') + let title = matchstr(content, mx) + + let type = zencoding#getFileType() + let rtype = zencoding#lang#exists(type) ? type : 'html' + if a:flag == 0 + let a = zencoding#lang#html#parseTag('') + let a.attr.href = url + let a.value = '{' . title . '}' + let expand = zencoding#toString(a, rtype, 0, []) + let expand = substitute(expand, '\${cursor}', '', 'g') + else + let body = zencoding#util#getTextFromHTML(content) + let body = '{' . substitute(body, '^\(.\{0,100}\).*', '\1', '') . '...}' + + let blockquote = zencoding#lang#html#parseTag('
    ') + let a = zencoding#lang#html#parseTag('') + let a.attr.href = url + let a.value = '{' . title . '}' + call add(blockquote.child, a) + call add(blockquote.child, zencoding#lang#html#parseTag('
    ')) + let p = zencoding#lang#html#parseTag('

    ') + let p.value = body + call add(blockquote.child, p) + let cite = zencoding#lang#html#parseTag('') + let cite.value = '{' . url . '}' + call add(blockquote.child, cite) + let expand = zencoding#toString(blockquote, rtype, 0, []) + let expand = substitute(expand, '\${cursor}', '', 'g') + endif + let indent = substitute(getline('.'), '^\(\s*\).*', '\1', '') + let expand = substitute(expand, "\n", "\n" . indent, 'g') + call zencoding#util#setContent(block, expand) +endfunction + +function! zencoding#codePretty() range + let type = input('FileType: ', &ft, 'filetype') + if len(type) == 0 + return + endif + let block = zencoding#util#getVisualBlock() + let content = zencoding#util#getContent(block) + silent! 1new + let &l:filetype = type + call setline(1, split(content, "\n")) + let old_lazyredraw = &lazyredraw + set lazyredraw + silent! TOhtml + let &lazyredraw = old_lazyredraw + let content = join(getline(1, '$'), "\n") + silent! bw! + silent! bw! + let content = matchstr(content, ']*>[\s\n]*\zs.*\ze') + call zencoding#util#setContent(block, content) +endfunction + +function! zencoding#ExpandWord(abbr, type, orig) + let mx = '|\(\%(html\|haml\|slim\|e\|c\|fc\|xsl\|t\|\/[^ ]\+\)\s*,\{0,1}\s*\)*$' + let str = a:abbr + let type = a:type + + if len(type) == 0 | let type = 'html' | endif + if str =~ mx + let filters = split(matchstr(str, mx)[1:], '\s*,\s*') + let str = substitute(str, mx, '', '') + elseif has_key(s:zen_settings[a:type], 'filters') + let filters = split(s:zen_settings[a:type].filters, '\s*,\s*') + else + let filters = ['html'] + endif + let items = zencoding#parseIntoTree(str, a:type).child + let expand = '' + for item in items + let expand .= zencoding#toString(item, a:type, 0, filters) + endfor + if zencoding#useFilter(filters, 'e') + let expand = substitute(expand, '&', '\&', 'g') + let expand = substitute(expand, '<', '\<', 'g') + let expand = substitute(expand, '>', '\>', 'g') + endif + if a:orig == 0 + let expand = substitute(expand, '\${lang}', s:zen_settings.lang, 'g') + let expand = substitute(expand, '\${charset}', s:zen_settings.charset, 'g') + let expand = substitute(expand, '\${cursor}', '', 'g') + endif + return expand +endfunction + +function! zencoding#getSnippets(type) + let type = a:type + if len(type) == 0 || !has_key(s:zen_settings, type) + let type = 'html' + endif + return zencoding#getResource(type, 'snippets', {}) +endfunction + +function! zencoding#CompleteTag(findstart, base) + if a:findstart + let line = getline('.') + let start = col('.') - 1 + while start > 0 && line[start - 1] =~ '[a-zA-Z0-9:_\@\-]' + let start -= 1 + endwhile + return start + else + let type = zencoding#getFileType() + let res = [] + + let snippets = zencoding#getResource(type, 'snippets', {}) + for item in keys(snippets) + if stridx(item, a:base) != -1 + call add(res, substitute(item, '\${cursor}\||', '', 'g')) + endif + endfor + let aliases = zencoding#getResource(type, 'aliases', {}) + for item in values(aliases) + if stridx(item, a:base) != -1 + call add(res, substitute(item, '\${cursor}\||', '', 'g')) + endif + endfor + return res + endif +endfunction + +unlet! s:zen_settings +let s:zen_settings = { +\ 'lang': "en", +\ 'charset': "UTF-8", +\ 'css': { +\ 'snippets': { +\ '@i': '@import url(|);', +\ '@m': "@media print {\n\t|\n}", +\ '@f': "@font-face {\n\tfont-family:|;\n\tsrc:url(|);\n}", +\ '!': '!important', +\ 'pos': 'position:|;', +\ 'pos:s': 'position:static;', +\ 'pos:a': 'position:absolute;', +\ 'pos:r': 'position:relative;', +\ 'pos:f': 'position:fixed;', +\ 't': 'top:|;', +\ 't:a': 'top:auto;', +\ 'r': 'right:|;', +\ 'r:a': 'right:auto;', +\ 'b': 'bottom:|;', +\ 'b:a': 'bottom:auto;', +\ 'l': 'left:|;', +\ 'l:a': 'left:auto;', +\ 'z': 'z-index:|;', +\ 'z:a': 'z-index:auto;', +\ 'fl': 'float:|;', +\ 'fl:n': 'float:none;', +\ 'fl:l': 'float:left;', +\ 'fl:r': 'float:right;', +\ 'cl': 'clear:|;', +\ 'cl:n': 'clear:none;', +\ 'cl:l': 'clear:left;', +\ 'cl:r': 'clear:right;', +\ 'cl:b': 'clear:both;', +\ 'd': 'display:|;', +\ 'd:n': 'display:none;', +\ 'd:b': 'display:block;', +\ 'd:i': 'display:inline;', +\ 'd:ib': 'display:inline-block;', +\ 'd:li': 'display:list-item;', +\ 'd:ri': 'display:run-in;', +\ 'd:cp': 'display:compact;', +\ 'd:tb': 'display:table;', +\ 'd:itb': 'display:inline-table;', +\ 'd:tbcp': 'display:table-caption;', +\ 'd:tbcl': 'display:table-column;', +\ 'd:tbclg': 'display:table-column-group;', +\ 'd:tbhg': 'display:table-header-group;', +\ 'd:tbfg': 'display:table-footer-group;', +\ 'd:tbr': 'display:table-row;', +\ 'd:tbrg': 'display:table-row-group;', +\ 'd:tbc': 'display:table-cell;', +\ 'd:rb': 'display:ruby;', +\ 'd:rbb': 'display:ruby-base;', +\ 'd:rbbg': 'display:ruby-base-group;', +\ 'd:rbt': 'display:ruby-text;', +\ 'd:rbtg': 'display:ruby-text-group;', +\ 'v': 'visibility:|;', +\ 'v:v': 'visibility:visible;', +\ 'v:h': 'visibility:hidden;', +\ 'v:c': 'visibility:collapse;', +\ 'ov': 'overflow:|;', +\ 'ov:v': 'overflow:visible;', +\ 'ov:h': 'overflow:hidden;', +\ 'ov:s': 'overflow:scroll;', +\ 'ov:a': 'overflow:auto;', +\ 'ovx': 'overflow-x:|;', +\ 'ovx:v': 'overflow-x:visible;', +\ 'ovx:h': 'overflow-x:hidden;', +\ 'ovx:s': 'overflow-x:scroll;', +\ 'ovx:a': 'overflow-x:auto;', +\ 'ovy': 'overflow-y:|;', +\ 'ovy:v': 'overflow-y:visible;', +\ 'ovy:h': 'overflow-y:hidden;', +\ 'ovy:s': 'overflow-y:scroll;', +\ 'ovy:a': 'overflow-y:auto;', +\ 'ovs': 'overflow-style:|;', +\ 'ovs:a': 'overflow-style:auto;', +\ 'ovs:s': 'overflow-style:scrollbar;', +\ 'ovs:p': 'overflow-style:panner;', +\ 'ovs:m': 'overflow-style:move;', +\ 'ovs:mq': 'overflow-style:marquee;', +\ 'zoo': 'zoom:1;', +\ 'cp': 'clip:|;', +\ 'cp:a': 'clip:auto;', +\ 'cp:r': 'clip:rect(|);', +\ 'bxz': 'box-sizing:|;', +\ 'bxz:cb': 'box-sizing:content-box;', +\ 'bxz:bb': 'box-sizing:border-box;', +\ 'bxsh': 'box-shadow:|;', +\ 'bxsh:n': 'box-shadow:none;', +\ 'bxsh:w': '-webkit-box-shadow:0 0 0 #000;', +\ 'bxsh:m': '-moz-box-shadow:0 0 0 0 #000;', +\ 'm': 'margin:|;', +\ 'm:a': 'margin:auto;', +\ 'm:0': 'margin:0;', +\ 'm:2': 'margin:0 0;', +\ 'm:3': 'margin:0 0 0;', +\ 'm:4': 'margin:0 0 0 0;', +\ 'mt': 'margin-top:|;', +\ 'mt:a': 'margin-top:auto;', +\ 'mr': 'margin-right:|;', +\ 'mr:a': 'margin-right:auto;', +\ 'mb': 'margin-bottom:|;', +\ 'mb:a': 'margin-bottom:auto;', +\ 'ml': 'margin-left:|;', +\ 'ml:a': 'margin-left:auto;', +\ 'p': 'padding:|;', +\ 'p:0': 'padding:0;', +\ 'p:2': 'padding:0 0;', +\ 'p:3': 'padding:0 0 0;', +\ 'p:4': 'padding:0 0 0 0;', +\ 'pt': 'padding-top:|;', +\ 'pr': 'padding-right:|;', +\ 'pb': 'padding-bottom:|;', +\ 'pl': 'padding-left:|;', +\ 'w': 'width:|;', +\ 'w:a': 'width:auto;', +\ 'h': 'height:|;', +\ 'h:a': 'height:auto;', +\ 'maw': 'max-width:|;', +\ 'maw:n': 'max-width:none;', +\ 'mah': 'max-height:|;', +\ 'mah:n': 'max-height:none;', +\ 'miw': 'min-width:|;', +\ 'mih': 'min-height:|;', +\ 'o': 'outline:|;', +\ 'o:n': 'outline:none;', +\ 'oo': 'outline-offset:|;', +\ 'ow': 'outline-width:|;', +\ 'os': 'outline-style:|;', +\ 'oc': 'outline-color:#000;', +\ 'oc:i': 'outline-color:invert;', +\ 'bd': 'border:|;', +\ 'bd+': 'border:1px solid #000;', +\ 'bd:n': 'border:none;', +\ 'bdbk': 'border-break:|;', +\ 'bdbk:c': 'border-break:close;', +\ 'bdcl': 'border-collapse:|;', +\ 'bdcl:c': 'border-collapse:collapse;', +\ 'bdcl:s': 'border-collapse:separate;', +\ 'bdc': 'border-color:#000;', +\ 'bdi': 'border-image:url(|);', +\ 'bdi:n': 'border-image:none;', +\ 'bdi:w': '-webkit-border-image:url(|) 0 0 0 0 stretch stretch;', +\ 'bdi:m': '-moz-border-image:url(|) 0 0 0 0 stretch stretch;', +\ 'bdti': 'border-top-image:url(|);', +\ 'bdti:n': 'border-top-image:none;', +\ 'bdri': 'border-right-image:url(|);', +\ 'bdri:n': 'border-right-image:none;', +\ 'bdbi': 'border-bottom-image:url(|);', +\ 'bdbi:n': 'border-bottom-image:none;', +\ 'bdli': 'border-left-image:url(|);', +\ 'bdli:n': 'border-left-image:none;', +\ 'bdci': 'border-corner-image:url(|);', +\ 'bdci:n': 'border-corner-image:none;', +\ 'bdci:c': 'border-corner-image:continue;', +\ 'bdtli': 'border-top-left-image:url(|);', +\ 'bdtli:n': 'border-top-left-image:none;', +\ 'bdtli:c': 'border-top-left-image:continue;', +\ 'bdtri': 'border-top-right-image:url(|);', +\ 'bdtri:n': 'border-top-right-image:none;', +\ 'bdtri:c': 'border-top-right-image:continue;', +\ 'bdbri': 'border-bottom-right-image:url(|);', +\ 'bdbri:n': 'border-bottom-right-image:none;', +\ 'bdbri:c': 'border-bottom-right-image:continue;', +\ 'bdbli': 'border-bottom-left-image:url(|);', +\ 'bdbli:n': 'border-bottom-left-image:none;', +\ 'bdbli:c': 'border-bottom-left-image:continue;', +\ 'bdf': 'border-fit:|;', +\ 'bdf:c': 'border-fit:clip;', +\ 'bdf:r': 'border-fit:repeat;', +\ 'bdf:sc': 'border-fit:scale;', +\ 'bdf:st': 'border-fit:stretch;', +\ 'bdf:ow': 'border-fit:overwrite;', +\ 'bdf:of': 'border-fit:overflow;', +\ 'bdf:sp': 'border-fit:space;', +\ 'bdl': 'border-left:|;', +\ 'bdl:a': 'border-length:auto;', +\ 'bdsp': 'border-spacing:|;', +\ 'bds': 'border-style:|;', +\ 'bds:n': 'border-style:none;', +\ 'bds:h': 'border-style:hidden;', +\ 'bds:dt': 'border-style:dotted;', +\ 'bds:ds': 'border-style:dashed;', +\ 'bds:s': 'border-style:solid;', +\ 'bds:db': 'border-style:double;', +\ 'bds:dtds': 'border-style:dot-dash;', +\ 'bds:dtdtds': 'border-style:dot-dot-dash;', +\ 'bds:w': 'border-style:wave;', +\ 'bds:g': 'border-style:groove;', +\ 'bds:r': 'border-style:ridge;', +\ 'bds:i': 'border-style:inset;', +\ 'bds:o': 'border-style:outset;', +\ 'bdw': 'border-width:|;', +\ 'bdt': 'border-top:|;', +\ 'bdt+': 'border-top:1px solid #000;', +\ 'bdt:n': 'border-top:none;', +\ 'bdtw': 'border-top-width:|;', +\ 'bdts': 'border-top-style:|;', +\ 'bdts:n': 'border-top-style:none;', +\ 'bdtc': 'border-top-color:#000;', +\ 'bdr': 'border-right:|;', +\ 'bdr+': 'border-right:1px solid #000;', +\ 'bdr:n': 'border-right:none;', +\ 'bdrw': 'border-right-width:|;', +\ 'bdrt': 'border-right-style:|;', +\ 'bdrs:n': 'border-right-style:none;', +\ 'bdrc': 'border-right-color:#000;', +\ 'bdb': 'border-bottom:|;', +\ 'bdb+': 'border-bottom:1px solid #000;', +\ 'bdb:n': 'border-bottom:none;', +\ 'bdbw': 'border-bottom-width:|;', +\ 'bdbs': 'border-bottom-style:|;', +\ 'bdbs:n': 'border-bottom-style:none;', +\ 'bdbc': 'border-bottom-color:#000;', +\ 'bdln': 'border-length:|;', +\ 'bdl+': 'border-left:1px solid #000;', +\ 'bdl:n': 'border-left:none;', +\ 'bdlw': 'border-left-width:|;', +\ 'bdls': 'border-left-style:|;', +\ 'bdls:n': 'border-left-style:none;', +\ 'bdlc': 'border-left-color:#000;', +\ 'bdrs': 'border-radius:|;', +\ 'bdtrrz': 'border-top-right-radius:|;', +\ 'bdtlrz': 'border-top-left-radius:|;', +\ 'bdbrrz': 'border-bottom-right-radius:|;', +\ 'bdblrz': 'border-bottom-left-radius:|;', +\ 'bdrz:w': '-webkit-border-radius:|;', +\ 'bdrz:m': '-moz-border-radius:|;', +\ 'bg': 'background:|;', +\ 'bg+': 'background:#FFF url(|) 0 0 no-repeat;', +\ 'bg:n': 'background:none;', +\ 'bg:ie': 'filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=''|x.png'');', +\ 'bgc': 'background-color:#FFF;', +\ 'bgi': 'background-image:url(|);', +\ 'bgi:n': 'background-image:none;', +\ 'bgr': 'background-repeat:|;', +\ 'bgr:n': 'background-repeat:no-repeat;', +\ 'bgr:x': 'background-repeat:repeat-x;', +\ 'bgr:y': 'background-repeat:repeat-y;', +\ 'bga': 'background-attachment:|;', +\ 'bga:f': 'background-attachment:fixed;', +\ 'bga:s': 'background-attachment:scroll;', +\ 'bgp': 'background-position:0 0;', +\ 'bgpx': 'background-position-x:|;', +\ 'bgpy': 'background-position-y:|;', +\ 'bgbk': 'background-break:|;', +\ 'bgbk:bb': 'background-break:bounding-box;', +\ 'bgbk:eb': 'background-break:each-box;', +\ 'bgbk:c': 'background-break:continuous;', +\ 'bgcp': 'background-clip:|;', +\ 'bgcp:bb': 'background-clip:border-box;', +\ 'bgcp:pb': 'background-clip:padding-box;', +\ 'bgcp:cb': 'background-clip:content-box;', +\ 'bgcp:nc': 'background-clip:no-clip;', +\ 'bgo': 'background-origin:|;', +\ 'bgo:pb': 'background-origin:padding-box;', +\ 'bgo:bb': 'background-origin:border-box;', +\ 'bgo:cb': 'background-origin:content-box;', +\ 'bgz': 'background-size:|;', +\ 'bgz:a': 'background-size:auto;', +\ 'bgz:ct': 'background-size:contain;', +\ 'bgz:cv': 'background-size:cover;', +\ 'c': 'color:#000;', +\ 'tbl': 'table-layout:|;', +\ 'tbl:a': 'table-layout:auto;', +\ 'tbl:f': 'table-layout:fixed;', +\ 'cps': 'caption-side:|;', +\ 'cps:t': 'caption-side:top;', +\ 'cps:b': 'caption-side:bottom;', +\ 'ec': 'empty-cells:|;', +\ 'ec:s': 'empty-cells:show;', +\ 'ec:h': 'empty-cells:hide;', +\ 'lis': 'list-style:|;', +\ 'lis:n': 'list-style:none;', +\ 'lisp': 'list-style-position:|;', +\ 'lisp:i': 'list-style-position:inside;', +\ 'lisp:o': 'list-style-position:outside;', +\ 'list': 'list-style-type:|;', +\ 'list:n': 'list-style-type:none;', +\ 'list:d': 'list-style-type:disc;', +\ 'list:c': 'list-style-type:circle;', +\ 'list:s': 'list-style-type:square;', +\ 'list:dc': 'list-style-type:decimal;', +\ 'list:dclz': 'list-style-type:decimal-leading-zero;', +\ 'list:lr': 'list-style-type:lower-roman;', +\ 'list:ur': 'list-style-type:upper-roman;', +\ 'lisi': 'list-style-image:|;', +\ 'lisi:n': 'list-style-image:none;', +\ 'q': 'quotes:|;', +\ 'q:n': 'quotes:none;', +\ 'q:ru': 'quotes:''\00AB'' ''\00BB'' ''\201E'' ''\201C'';', +\ 'q:en': 'quotes:''\201C'' ''\201D'' ''\2018'' ''\2019'';', +\ 'ct': 'content:|;', +\ 'ct:n': 'content:normal;', +\ 'ct:oq': 'content:open-quote;', +\ 'ct:noq': 'content:no-open-quote;', +\ 'ct:cq': 'content:close-quote;', +\ 'ct:ncq': 'content:no-close-quote;', +\ 'ct:a': 'content:attr(|);', +\ 'ct:c': 'content:counter(|);', +\ 'ct:cs': 'content:counters(|);', +\ 'coi': 'counter-increment:|;', +\ 'cor': 'counter-reset:|;', +\ 'va': 'vertical-align:|;', +\ 'va:sup': 'vertical-align:super;', +\ 'va:t': 'vertical-align:top;', +\ 'va:tt': 'vertical-align:text-top;', +\ 'va:m': 'vertical-align:middle;', +\ 'va:bl': 'vertical-align:baseline;', +\ 'va:b': 'vertical-align:bottom;', +\ 'va:tb': 'vertical-align:text-bottom;', +\ 'va:sub': 'vertical-align:sub;', +\ 'ta': 'text-align:|;', +\ 'ta:l': 'text-align:left;', +\ 'ta:c': 'text-align:center;', +\ 'ta:r': 'text-align:right;', +\ 'tal': 'text-align-last:|;', +\ 'tal:a': 'text-align-last:auto;', +\ 'tal:l': 'text-align-last:left;', +\ 'tal:c': 'text-align-last:center;', +\ 'tal:r': 'text-align-last:right;', +\ 'td': 'text-decoration:|;', +\ 'td:n': 'text-decoration:none;', +\ 'td:u': 'text-decoration:underline;', +\ 'td:o': 'text-decoration:overline;', +\ 'td:l': 'text-decoration:line-through;', +\ 'te': 'text-emphasis:|;', +\ 'te:n': 'text-emphasis:none;', +\ 'te:ac': 'text-emphasis:accent;', +\ 'te:dt': 'text-emphasis:dot;', +\ 'te:c': 'text-emphasis:circle;', +\ 'te:ds': 'text-emphasis:disc;', +\ 'te:b': 'text-emphasis:before;', +\ 'te:a': 'text-emphasis:after;', +\ 'th': 'text-height:|;', +\ 'th:a': 'text-height:auto;', +\ 'th:f': 'text-height:font-size;', +\ 'th:t': 'text-height:text-size;', +\ 'th:m': 'text-height:max-size;', +\ 'ti': 'text-indent:|;', +\ 'ti:-': 'text-indent:-9999px;', +\ 'tj': 'text-justify:|;', +\ 'tj:a': 'text-justify:auto;', +\ 'tj:iw': 'text-justify:inter-word;', +\ 'tj:ii': 'text-justify:inter-ideograph;', +\ 'tj:ic': 'text-justify:inter-cluster;', +\ 'tj:d': 'text-justify:distribute;', +\ 'tj:k': 'text-justify:kashida;', +\ 'tj:t': 'text-justify:tibetan;', +\ 'to': 'text-outline:|;', +\ 'to+': 'text-outline:0 0 #000;', +\ 'to:n': 'text-outline:none;', +\ 'tr': 'text-replace:|;', +\ 'tr:n': 'text-replace:none;', +\ 'tt': 'text-transform:|;', +\ 'tt:n': 'text-transform:none;', +\ 'tt:c': 'text-transform:capitalize;', +\ 'tt:u': 'text-transform:uppercase;', +\ 'tt:l': 'text-transform:lowercase;', +\ 'tw': 'text-wrap:|;', +\ 'tw:n': 'text-wrap:normal;', +\ 'tw:no': 'text-wrap:none;', +\ 'tw:u': 'text-wrap:unrestricted;', +\ 'tw:s': 'text-wrap:suppress;', +\ 'tsh': 'text-shadow:|;', +\ 'tsh+': 'text-shadow:0 0 0 #000;', +\ 'tsh:n': 'text-shadow:none;', +\ 'lh': 'line-height:|;', +\ 'whs': 'white-space:|;', +\ 'whs:n': 'white-space:normal;', +\ 'whs:p': 'white-space:pre;', +\ 'whs:nw': 'white-space:nowrap;', +\ 'whs:pw': 'white-space:pre-wrap;', +\ 'whs:pl': 'white-space:pre-line;', +\ 'whsc': 'white-space-collapse:|;', +\ 'whsc:n': 'white-space-collapse:normal;', +\ 'whsc:k': 'white-space-collapse:keep-all;', +\ 'whsc:l': 'white-space-collapse:loose;', +\ 'whsc:bs': 'white-space-collapse:break-strict;', +\ 'whsc:ba': 'white-space-collapse:break-all;', +\ 'wob': 'word-break:|;', +\ 'wob:n': 'word-break:normal;', +\ 'wob:k': 'word-break:keep-all;', +\ 'wob:l': 'word-break:loose;', +\ 'wob:bs': 'word-break:break-strict;', +\ 'wob:ba': 'word-break:break-all;', +\ 'wos': 'word-spacing:|;', +\ 'wow': 'word-wrap:|;', +\ 'wow:nm': 'word-wrap:normal;', +\ 'wow:n': 'word-wrap:none;', +\ 'wow:u': 'word-wrap:unrestricted;', +\ 'wow:s': 'word-wrap:suppress;', +\ 'lts': 'letter-spacing:|;', +\ 'f': 'font:|;', +\ 'f+': 'font:1em Arial,sans-serif;', +\ 'fw': 'font-weight:|;', +\ 'fw:n': 'font-weight:normal;', +\ 'fw:b': 'font-weight:bold;', +\ 'fw:br': 'font-weight:bolder;', +\ 'fw:lr': 'font-weight:lighter;', +\ 'fs': 'font-style:|;', +\ 'fs:n': 'font-style:normal;', +\ 'fs:i': 'font-style:italic;', +\ 'fs:o': 'font-style:oblique;', +\ 'fv': 'font-variant:|;', +\ 'fv:n': 'font-variant:normal;', +\ 'fv:sc': 'font-variant:small-caps;', +\ 'fz': 'font-size:|;', +\ 'fza': 'font-size-adjust:|;', +\ 'fza:n': 'font-size-adjust:none;', +\ 'ff': 'font-family:|;', +\ 'ff:s': 'font-family:serif;', +\ 'ff:ss': 'font-family:sans-serif;', +\ 'ff:c': 'font-family:cursive;', +\ 'ff:f': 'font-family:fantasy;', +\ 'ff:m': 'font-family:monospace;', +\ 'fef': 'font-effect:|;', +\ 'fef:n': 'font-effect:none;', +\ 'fef:eg': 'font-effect:engrave;', +\ 'fef:eb': 'font-effect:emboss;', +\ 'fef:o': 'font-effect:outline;', +\ 'fem': 'font-emphasize:|;', +\ 'femp': 'font-emphasize-position:|;', +\ 'femp:b': 'font-emphasize-position:before;', +\ 'femp:a': 'font-emphasize-position:after;', +\ 'fems': 'font-emphasize-style:|;', +\ 'fems:n': 'font-emphasize-style:none;', +\ 'fems:ac': 'font-emphasize-style:accent;', +\ 'fems:dt': 'font-emphasize-style:dot;', +\ 'fems:c': 'font-emphasize-style:circle;', +\ 'fems:ds': 'font-emphasize-style:disc;', +\ 'fsm': 'font-smooth:|;', +\ 'fsm:a': 'font-smooth:auto;', +\ 'fsm:n': 'font-smooth:never;', +\ 'fsm:aw': 'font-smooth:always;', +\ 'fst': 'font-stretch:|;', +\ 'fst:n': 'font-stretch:normal;', +\ 'fst:uc': 'font-stretch:ultra-condensed;', +\ 'fst:ec': 'font-stretch:extra-condensed;', +\ 'fst:c': 'font-stretch:condensed;', +\ 'fst:sc': 'font-stretch:semi-condensed;', +\ 'fst:se': 'font-stretch:semi-expanded;', +\ 'fst:e': 'font-stretch:expanded;', +\ 'fst:ee': 'font-stretch:extra-expanded;', +\ 'fst:ue': 'font-stretch:ultra-expanded;', +\ 'op': 'opacity:|;', +\ 'op:ie': 'filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);', +\ 'op:ms': '-ms-filter:''progid:DXImageTransform.Microsoft.Alpha(Opacity=100)'';', +\ 'rz': 'resize:|;', +\ 'rz:n': 'resize:none;', +\ 'rz:b': 'resize:both;', +\ 'rz:h': 'resize:horizontal;', +\ 'rz:v': 'resize:vertical;', +\ 'cur': 'cursor:|;', +\ 'cur:a': 'cursor:auto;', +\ 'cur:d': 'cursor:default;', +\ 'cur:c': 'cursor:crosshair;', +\ 'cur:ha': 'cursor:hand;', +\ 'cur:he': 'cursor:help;', +\ 'cur:m': 'cursor:move;', +\ 'cur:p': 'cursor:pointer;', +\ 'cur:t': 'cursor:text;', +\ 'pgbb': 'page-break-before:|;', +\ 'pgbb:au': 'page-break-before:auto;', +\ 'pgbb:al': 'page-break-before:always;', +\ 'pgbb:l': 'page-break-before:left;', +\ 'pgbb:r': 'page-break-before:right;', +\ 'pgbi': 'page-break-inside:|;', +\ 'pgbi:au': 'page-break-inside:auto;', +\ 'pgbi:av': 'page-break-inside:avoid;', +\ 'pgba': 'page-break-after:|;', +\ 'pgba:au': 'page-break-after:auto;', +\ 'pgba:al': 'page-break-after:always;', +\ 'pgba:l': 'page-break-after:left;', +\ 'pgba:r': 'page-break-after:right;', +\ 'orp': 'orphans:|;', +\ 'wid': 'widows:|;' +\ }, +\ 'filters': 'fc' +\ }, +\ 'sass': { +\ 'extends': 'css', +\ 'snippets': { +\ '@if': "@if {\n\t|\n}", +\ '@e': "@else {\n\t|\n}", +\ '@in': "@include |", +\ '@ex': "@extend |", +\ '@mx': "@mixin {\n\t|\n}", +\ '@fn': "@function {\n\t|\n}", +\ '@r': "@return |", +\ }, +\ }, +\ 'scss': { +\ 'extends': 'css', +\ }, +\ 'less': { +\ 'extends': 'css', +\ }, +\ 'css.drupal': { +\ 'extends': 'css', +\ }, +\ 'html': { +\ 'snippets': { +\ 'cc:ie6': "", +\ 'cc:ie': "", +\ 'cc:noie': "\n\t${child}|\n", +\ 'html:4t': "\n" +\ ."\n" +\ ."\n" +\ ."\t\n" +\ ."\t\n" +\ ."\n" +\ ."\n\t${child}|\n\n" +\ ."", +\ 'html:4s': "\n" +\ ."\n" +\ ."\n" +\ ."\t\n" +\ ."\t\n" +\ ."\n" +\ ."\n\t${child}|\n\n" +\ ."", +\ 'html:xt': "\n" +\ ."\n" +\ ."\n" +\ ."\t\n" +\ ."\t\n" +\ ."\n" +\ ."\n\t${child}|\n\n" +\ ."", +\ 'html:xs': "\n" +\ ."\n" +\ ."\n" +\ ."\t\n" +\ ."\t\n" +\ ."\n" +\ ."\n\t${child}|\n\n" +\ ."", +\ 'html:xxs': "\n" +\ ."\n" +\ ."\n" +\ ."\t\n" +\ ."\t\n" +\ ."\n" +\ ."\n\t${child}|\n\n" +\ ."", +\ 'html:5': "\n" +\ ."\n" +\ ."\n" +\ ."\t\n" +\ ."\t\n" +\ ."\n" +\ ."\n\t${child}|\n\n" +\ ."" +\ }, +\ 'default_attributes': { +\ 'a': {'href': ''}, +\ 'a:link': {'href': 'http://|'}, +\ 'a:mail': {'href': 'mailto:|'}, +\ 'abbr': {'title': ''}, +\ 'acronym': {'title': ''}, +\ 'base': {'href': ''}, +\ 'bdo': {'dir': ''}, +\ 'bdo:r': {'dir': 'rtl'}, +\ 'bdo:l': {'dir': 'ltr'}, +\ 'del': {'datetime': '${datetime}'}, +\ 'ins': {'datetime': '${datetime}'}, +\ 'link:css': [{'rel': 'stylesheet'}, {'type': 'text/css'}, {'href': '|style.css'}, {'media': 'all'}], +\ 'link:print': [{'rel': 'stylesheet'}, {'type': 'text/css'}, {'href': '|print.css'}, {'media': 'print'}], +\ 'link:favicon': [{'rel': 'shortcut icon'}, {'type': 'image/x-icon'}, {'href': '|favicon.ico'}], +\ 'link:touch': [{'rel': 'apple-touch-icon'}, {'href': '|favicon.png'}], +\ 'link:rss': [{'rel': 'alternate'}, {'type': 'application/rss+xml'}, {'title': 'RSS'}, {'href': '|rss.xml'}], +\ 'link:atom': [{'rel': 'alternate'}, {'type': 'application/atom+xml'}, {'title': 'Atom'}, {'href': 'atom.xml'}], +\ 'meta:utf': [{'http-equiv': 'Content-Type'}, {'content': 'text/html;charset=UTF-8'}], +\ 'meta:win': [{'http-equiv': 'Content-Type'}, {'content': 'text/html;charset=Win-1251'}], +\ 'meta:compat': [{'http-equiv': 'X-UA-Compatible'}, {'content': 'IE=7'}], +\ 'style': {'type': 'text/css'}, +\ 'script': {'type': 'text/javascript'}, +\ 'script:src': [{'type': 'text/javascript'}, {'src': ''}], +\ 'img': [{'src': ''}, {'alt': ''}], +\ 'iframe': [{'src': ''}, {'frameborder': '0'}], +\ 'embed': [{'src': ''}, {'type': ''}], +\ 'object': [{'data': ''}, {'type': ''}], +\ 'param': [{'name': ''}, {'value': ''}], +\ 'map': {'name': ''}, +\ 'area': [{'shape': ''}, {'coords': ''}, {'href': ''}, {'alt': ''}], +\ 'area:d': [{'shape': 'default'}, {'href': ''}, {'alt': ''}], +\ 'area:c': [{'shape': 'circle'}, {'coords': ''}, {'href': ''}, {'alt': ''}], +\ 'area:r': [{'shape': 'rect'}, {'coords': ''}, {'href': ''}, {'alt': ''}], +\ 'area:p': [{'shape': 'poly'}, {'coords': ''}, {'href': ''}, {'alt': ''}], +\ 'link': [{'rel': 'stylesheet'}, {'href': ''}], +\ 'form': {'action': ''}, +\ 'form:get': {'action': '', 'method': 'get'}, +\ 'form:post': {'action': '', 'method': 'post'}, +\ 'form:upload': {'action': '', 'method': 'post', 'enctype': 'multipart/form-data'}, +\ 'label': {'for': ''}, +\ 'input': {'type': ''}, +\ 'input:hidden': [{'type': 'hidden'}, {'name': ''}], +\ 'input:h': [{'type': 'hidden'}, {'name': ''}], +\ 'input:text': [{'type': 'text'}, {'name': ''}, {'id': ''}], +\ 'input:t': [{'type': 'text'}, {'name': ''}, {'id': ''}], +\ 'input:search': [{'type': 'search'}, {'name': ''}, {'id': ''}], +\ 'input:email': [{'type': 'email'}, {'name': ''}, {'id': ''}], +\ 'input:url': [{'type': 'url'}, {'name': ''}, {'id': ''}], +\ 'input:password': [{'type': 'password'}, {'name': ''}, {'id': ''}], +\ 'input:p': [{'type': 'password'}, {'name': ''}, {'id': ''}], +\ 'input:datetime': [{'type': 'datetime'}, {'name': ''}, {'id': ''}], +\ 'input:date': [{'type': 'date'}, {'name': ''}, {'id': ''}], +\ 'input:datetime-local': [{'type': 'datetime-local'}, {'name': ''}, {'id': ''}], +\ 'input:month': [{'type': 'month'}, {'name': ''}, {'id': ''}], +\ 'input:week': [{'type': 'week'}, {'name': ''}, {'id': ''}], +\ 'input:time': [{'type': 'time'}, {'name': ''}, {'id': ''}], +\ 'input:number': [{'type': 'number'}, {'name': ''}, {'id': ''}], +\ 'input:color': [{'type': 'color'}, {'name': ''}, {'id': ''}], +\ 'input:checkbox': [{'type': 'checkbox'}, {'name': ''}, {'id': ''}], +\ 'input:c': [{'type': 'checkbox'}, {'name': ''}, {'id': ''}], +\ 'input:radio': [{'type': 'radio'}, {'name': ''}, {'id': ''}], +\ 'input:r': [{'type': 'radio'}, {'name': ''}, {'id': ''}], +\ 'input:range': [{'type': 'range'}, {'name': ''}, {'id': ''}], +\ 'input:file': [{'type': 'file'}, {'name': ''}, {'id': ''}], +\ 'input:f': [{'type': 'file'}, {'name': ''}, {'id': ''}], +\ 'input:submit': [{'type': 'submit'}, {'value': ''}], +\ 'input:s': [{'type': 'submit'}, {'value': ''}], +\ 'input:image': [{'type': 'image'}, {'src': ''}, {'alt': ''}], +\ 'input:i': [{'type': 'image'}, {'src': ''}, {'alt': ''}], +\ 'input:reset': [{'type': 'reset'}, {'value': ''}], +\ 'input:button': [{'type': 'button'}, {'value': ''}], +\ 'input:b': [{'type': 'button'}, {'value': ''}], +\ 'select': [{'name': ''}, {'id': ''}], +\ 'option': {'value': ''}, +\ 'textarea': [{'name': ''}, {'id': ''}, {'cols': '30'}, {'rows': '10'}], +\ 'menu:context': {'type': 'context'}, +\ 'menu:c': {'type': 'context'}, +\ 'menu:toolbar': {'type': 'toolbar'}, +\ 'menu:t': {'type': 'toolbar'}, +\ 'video': {'src': ''}, +\ 'audio': {'src': ''}, +\ 'html:xml': [{'xmlns': 'http://www.w3.org/1999/xhtml'}, {'xml:lang': '${lang}'}] +\ }, +\ 'aliases': { +\ 'link:*': 'link', +\ 'meta:*': 'meta', +\ 'area:*': 'area', +\ 'bdo:*': 'bdo', +\ 'form:*': 'form', +\ 'input:*': 'input', +\ 'script:*': 'script', +\ 'html:*': 'html', +\ 'a:*': 'a', +\ 'menu:*': 'menu', +\ 'bq': 'blockquote', +\ 'acr': 'acronym', +\ 'fig': 'figure', +\ 'ifr': 'iframe', +\ 'emb': 'embed', +\ 'obj': 'object', +\ 'src': 'source', +\ 'cap': 'caption', +\ 'colg': 'colgroup', +\ 'fst': 'fieldset', +\ 'btn': 'button', +\ 'optg': 'optgroup', +\ 'opt': 'option', +\ 'tarea': 'textarea', +\ 'leg': 'legend', +\ 'sect': 'section', +\ 'art': 'article', +\ 'hdr': 'header', +\ 'ftr': 'footer', +\ 'adr': 'address', +\ 'dlg': 'dialog', +\ 'str': 'strong', +\ 'sty': 'style', +\ 'prog': 'progress', +\ 'fset': 'fieldset', +\ 'datag': 'datagrid', +\ 'datal': 'datalist', +\ 'kg': 'keygen', +\ 'out': 'output', +\ 'det': 'details', +\ 'cmd': 'command' +\ }, +\ 'expandos': { +\ 'ol': 'ol>li', +\ 'ul': 'ul>li', +\ 'dl': 'dl>dt+dd', +\ 'map': 'map>area', +\ 'table': 'table>tr>td', +\ 'colgroup': 'colgroup>col', +\ 'colg': 'colgroup>col', +\ 'tr': 'tr>td', +\ 'select': 'select>option', +\ 'optgroup': 'optgroup>option', +\ 'optg': 'optgroup>option' +\ }, +\ 'empty_elements': 'area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,keygen,command', +\ 'block_elements': 'address,applet,blockquote,button,center,dd,del,dir,div,dl,dt,fieldset,form,frameset,hr,iframe,ins,isindex,li,link,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul,h1,h2,h3,h4,h5,h6', +\ 'inline_elements': 'a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var', +\ 'empty_element_suffix': ' />' +\ }, +\ 'htmldjango': { +\ 'extends': 'html', +\ }, +\ 'html.django_template': { +\ 'extends': 'html', +\ }, +\ 'xsl': { +\ 'extends': 'html', +\ 'default_attributes': { +\ 'tmatch': [{'match': ''}, {'mode': ''}], +\ 'tname': [{'name': ''}], +\ 'xsl:when': {'test': ''}, +\ 'var': [{'name': ''}, {'select': ''}], +\ 'vari': {'name': ''}, +\ 'if': {'test': ''}, +\ 'call': {'name': ''}, +\ 'attr': {'name': ''}, +\ 'wp': [{'name': ''}, {'select': ''}], +\ 'par': [{'name': ''}, {'select': ''}], +\ 'val': {'select': ''}, +\ 'co': {'select': ''}, +\ 'each': {'select': ''}, +\ 'ap': [{'select': ''}, {'mode': ''}] +\ }, +\ 'aliases': { +\ 'tmatch': 'xsl:template', +\ 'tname': 'xsl:template', +\ 'var': 'xsl:variable', +\ 'vari': 'xsl:variable', +\ 'if': 'xsl:if', +\ 'choose': 'xsl:choose', +\ 'call': 'xsl:call-template', +\ 'wp': 'xsl:with-param', +\ 'par': 'xsl:param', +\ 'val': 'xsl:value-of', +\ 'attr': 'xsl:attribute', +\ 'co' : 'xsl:copy-of', +\ 'each' : 'xsl:for-each', +\ 'ap' : 'xsl:apply-templates' +\ }, +\ 'expandos': { +\ 'choose': 'xsl:choose>xsl:when+xsl:otherwise' +\ } +\ }, +\ 'xslt': { +\ 'extends': 'xsl', +\ }, +\ 'haml': { +\ 'indentation': ' ', +\ 'extends': 'html', +\ 'snippets': { +\ 'html:5': "!!! 5\n" +\ ."%html{:lang => \"${lang}\"}\n" +\ ."\t%head\n" +\ ."\t\t%meta{:charset => \"${charset}\"}\n" +\ ."\t\t%title\n" +\ ."\t%body\n" +\ ."\t\t${child}|\n" +\ }, +\ }, +\ 'slim': { +\ 'indentation': ' ', +\ 'extends': 'html', +\ 'snippets': { +\ 'html:5': "doctype 5\n" +\ ."html lang=\"${lang}\"\n" +\ ."\thead\n" +\ ."\t\tmeta charset=\"${charset}\"\n" +\ ."\t\ttitle\n" +\ ."\tbody\n" +\ ."\t\t${child}|\n" +\ }, +\ }, +\ 'xhtml': { +\ 'extends': 'html' +\ }, +\ 'mustache': { +\ 'extends': 'html' +\ }, +\ 'xsd': { +\ 'extends': 'html', +\ 'snippets': { +\ 'xsd:w3c': "\n" +\ ."\n" +\ ."\t\n" +\ ."\n" +\ } +\ } +\} + +if exists('g:user_zen_settings') + call s:mergeConfig(s:zen_settings, g:user_zen_settings) +endif + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim:set et: diff --git a/sources_forked/zencoding/autoload/zencoding/lang.vim b/sources_forked/zencoding/autoload/zencoding/lang.vim new file mode 100755 index 00000000..a9735991 --- /dev/null +++ b/sources_forked/zencoding/autoload/zencoding/lang.vim @@ -0,0 +1,11 @@ +let s:exists = {} +function zencoding#lang#exists(type) + if len(a:type) == 0 + return 0 + elseif has_key(s:exists, a:type) + return s:exists[a:type] + endif + let s:exists[a:type] = len(globpath(&rtp, 'autoload/zencoding/lang/'.a:type.'.vim')) > 0 + return s:exists[a:type] +endfunction + diff --git a/sources_forked/zencoding/autoload/zencoding/lang/css.vim b/sources_forked/zencoding/autoload/zencoding/lang/css.vim new file mode 100755 index 00000000..5b1c1182 --- /dev/null +++ b/sources_forked/zencoding/autoload/zencoding/lang/css.vim @@ -0,0 +1,228 @@ +function! zencoding#lang#css#findTokens(str) + return substitute(a:str, '^.*[;{]\s*', '', '') +endfunction + +function! zencoding#lang#css#parseIntoTree(abbr, type) + let abbr = a:abbr + let type = a:type + let prefix = 0 + let value = '' + + let settings = zencoding#getSettings() + let indent = zencoding#getIndentation(type) + + let root = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0, 'important': 0 } + + " emmet + let tokens = split(abbr, '+\ze[^)!]') + for n in range(len(tokens)) + let token = tokens[n] + let prop = matchlist(token, '^\(-\{0,1}[a-zA-Z]\+\|[a-zA-Z0-9]\++\{0,1}\|([a-zA-Z0-9]\++\{0,1})\)\(\%([0-9.-]\+[pe]\{0,1}-\{0,1}\|-auto\)*\)$') + if len(prop) + let token = substitute(prop[1], '^(\(.*\))', '\1', '') + if token =~ '^-' + let prefix = 1 + let token = token[1:] + endif + let value = '' + for v in split(prop[2], '\d\zs-') + if len(value) > 0 + let value .= ' ' + endif + if token =~ '^[z]' + " TODO + let value .= substitute(v, '[^0-9.]*$', '', '') + elseif v =~ 'p$' + let value .= substitute(v, 'p$', '%', '') + elseif v =~ 'e$' + let value .= substitute(v, 'e$', 'em', '') + elseif v =~ '\.' + let value .= v . 'em' + elseif v == 'auto' + let value .= v + else + let value .= v . 'px' + endif + endfor + endif + + let tag_name = token + if tag_name =~ '.!$' + let tag_name = tag_name[:-2] + let important = 1 + else + let important = 0 + endif + " make default node + let current = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0, 'important': important } + let current.name = tag_name + + " aliases + let aliases = zencoding#getResource(type, 'aliases', {}) + if has_key(aliases, tag_name) + let current.name = aliases[tag_name] + endif + let use_pipe_for_cursor = zencoding#getResource(type, 'use_pipe_for_cursor', 1) + + " snippets + let snippets = zencoding#getResource(type, 'snippets', {}) + if !empty(snippets) && has_key(snippets, tag_name) + let snippet = snippets[tag_name] + if use_pipe_for_cursor + let snippet = substitute(snippet, '|', '${cursor}', 'g') + endif + let lines = split(snippet, "\n") + call map(lines, 'substitute(v:val, "\\( \\|\\t\\)", escape(indent, "\\\\"), "g")') + let current.snippet = join(lines, "\n") + let current.name = '' + let current.snippet = substitute(current.snippet, ';', value . ';', '') + if use_pipe_for_cursor && len(value) > 0 && stridx(value, '${cursor}') == -1 + let current.snippet = substitute(current.snippet, '${cursor}', '', 'g') . '${cursor}' + endif + if n < len(tokens) - 1 + let current.snippet .= "\n" + endif + endif + + let current.pos = 0 + let lg = matchlist(token, '^\%(linear-gradient\|lg\)(\s*\(\w\+\)\s*,\s*\([^,]\+\)\s*,\s*\([^)]\+\)\s*)$') + if len(lg) + let current.name = '' + let current.snippet = printf("background-image: -webkit-gradient(%s, 0 0, 0 100%, from(%s), to(%s));\n", lg[1], lg[2], lg[3]) + call add(root.child, deepcopy(current)) + let current.snippet = printf("background-image: -webkit-linear-gradient(%s, %s);\n", lg[2], lg[3]) + call add(root.child, deepcopy(current)) + let current.snippet = printf("background-image: -moz-linear-gradient(%s, %s);\n", lg[2], lg[3]) + call add(root.child, deepcopy(current)) + let current.snippet = printf("background-image: -o-linear-gradient(%s, %s);\n", lg[2], lg[3]) + call add(root.child, deepcopy(current)) + let current.snippet = printf("background-image: linear-gradient(%s, %s);\n", lg[2], lg[3]) + call add(root.child, deepcopy(current)) + elseif prefix + let snippet = current.snippet + let current.snippet = '-webkit-' . snippet . "\n" + call add(root.child, deepcopy(current)) + let current.snippet = '-moz-' . snippet . "\n" + call add(root.child, deepcopy(current)) + let current.snippet = snippet + call add(root.child, current) + else + call add(root.child, current) + endif + endfor + return root +endfunction + +function! zencoding#lang#css#toString(settings, current, type, inline, filters, itemno, indent) + let current = a:current + let value = current.value[1:-2] + if zencoding#useFilter(a:filters, 'fc') + let value = substitute(value, '\([^:]\+\):\([^;]*;\)', '\1: \2', 'g') + else + let value = substitute(value, '\([^:]\+\):\([^;]*;\)', '\1:\2', 'g') + endif + if current.important + let value = substitute(value, ';', ' !important;', '') + endif + return value +endfunction + +function! zencoding#lang#css#imageSize() +endfunction + +function! zencoding#lang#css#encodeImage() +endfunction + +function! zencoding#lang#css#parseTag(tag) + return {} +endfunction + +function! zencoding#lang#css#toggleComment() + let line = getline('.') + let mx = '^\(\s*\)/\*\s*\(.*\)\s*\*/\s*$' + if line =~ '{\s*$' + let block = zencoding#util#searchRegion('/\*', '\*/\zs') + if zencoding#util#regionIsValid(block) + let content = zencoding#util#getContent(block) + let content = substitute(content, '/\*\s\(.*\)\s\*/', '\1', '') + call zencoding#util#setContent(block, content) + else + let node = expand('') + if len(node) + exe "normal ciw\='/* '.node.' */'\" + endif + endif + else + if line =~ mx + let space = substitute(matchstr(line, mx), mx, '\1', '') + let line = substitute(matchstr(line, mx), mx, '\2', '') + let line = space . substitute(line, '^\s*\|\s*$', '\1', 'g') + else + let mx = '^\(\s*\)\(.*\)\s*$' + let line = substitute(line, mx, '\1/* \2 */', '') + endif + call setline('.', line) + endif +endfunction + +function! zencoding#lang#css#balanceTag(flag) range + if a:flag == -2 || a:flag == 2 + let curpos = [0, line("'<"), col("'<"), 0] + else + let curpos = getpos('.') + endif + let block = zencoding#util#getVisualBlock() + if !zencoding#util#regionIsValid(block) + if a:flag > 0 + let block = zencoding#util#searchRegion('^', ';') + if zencoding#util#regionIsValid(block) + call zencoding#util#selectRegion(block) + return + endif + endif + else + if a:flag > 0 + let content = zencoding#util#getContent(block) + if content !~ '^{.*}$' + let block = zencoding#util#searchRegion('{', '}') + if zencoding#util#regionIsValid(block) + call zencoding#util#selectRegion(block) + return + endif + endif + else + let pos = searchpos('.*;', 'nW') + if pos[0] != 0 + call setpos('.', [0, pos[0], pos[1], 0]) + let block = zencoding#util#searchRegion('^', ';') + if zencoding#util#regionIsValid(block) + call zencoding#util#selectRegion(block) + return + endif + endif + endif + endif + if a:flag == -2 || a:flag == 2 + silent! exe "normal! gv" + else + call setpos('.', curpos) + endif +endfunction + +function! zencoding#lang#css#moveNextPrev(flag) + let pos = search('""\|()\|\(:\s*\zs$\)', a:flag ? 'Wbp' : 'Wp') + if pos == 2 + startinsert! + else + silent! normal! l + startinsert + endif +endfunction + +function! zencoding#lang#css#splitJoinTag() + " nothing to do +endfunction + +function! zencoding#lang#css#removeTag() + " nothing to do +endfunction diff --git a/sources_forked/zencoding/autoload/zencoding/lang/haml.vim b/sources_forked/zencoding/autoload/zencoding/lang/haml.vim new file mode 100755 index 00000000..be421c1c --- /dev/null +++ b/sources_forked/zencoding/autoload/zencoding/lang/haml.vim @@ -0,0 +1,310 @@ +function! zencoding#lang#haml#findTokens(str) + return zencoding#lang#html#findTokens(a:str) +endfunction + +function! zencoding#lang#haml#parseIntoTree(abbr, type) + return zencoding#lang#html#parseIntoTree(a:abbr, a:type) +endfunction + +function! zencoding#lang#haml#toString(settings, current, type, inline, filters, itemno, indent) + let settings = a:settings + let current = a:current + let type = a:type + let inline = a:inline + let filters = a:filters + let itemno = a:itemno + let indent = a:indent + let dollar_expr = zencoding#getResource(type, 'dollar_expr', 1) + let str = "" + + let comment_indent = '' + let comment = '' + let current_name = current.name + if dollar_expr + let current_name = substitute(current.name, '\$$', itemno+1, '') + endif + if len(current.name) > 0 + let str .= '%' . current_name + let tmp = '' + for attr in current.attrs_order + if !has_key(current.attr, attr) + continue + endif + let val = current.attr[attr] + if dollar_expr + while val =~ '\$\([^#{]\|$\)' + let val = substitute(val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g') + endwhile + let attr = substitute(attr, '\$$', itemno+1, '') + endif + let valtmp = substitute(val, '\${cursor}', '', '') + if attr == 'id' && len(valtmp) > 0 + let str .= '#' . val + elseif attr == 'class' && len(valtmp) > 0 + let str .= '.' . substitute(val, ' ', '.', 'g') + else + if len(tmp) > 0 | let tmp .= ',' | endif + let val = substitute(val, '\${cursor}', '', '') + let tmp .= ' :' . attr . ' => "' . val . '"' + endif + endfor + if len(tmp) + let str .= '{' . tmp . ' }' + endif + if stridx(','.settings.html.empty_elements.',', ','.current_name.',') != -1 && len(current.value) == 0 + let str .= "/" + endif + + let inner = '' + if len(current.value) > 0 + let text = current.value[1:-2] + if dollar_expr + let text = substitute(text, '\%(\\\)\@\ 0 + for child in current.child + let inner .= zencoding#toString(child, type, inline, filters, itemno) + endfor + let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g') + let inner = substitute(inner, "\n" . escape(indent, '\') . "$", "", 'g') + let str .= "\n" . indent . inner + endif + else + let str = current.value[1:-2] + if dollar_expr + let str = substitute(str, '\%(\\\)\@\\s*\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)' + while len(attrs) > 0 + let match = matchstr(attrs, mx) + if len(match) == 0 + break + endif + let attr_match = matchlist(match, mx) + let name = attr_match[1] + let value = len(attr_match[2]) ? attr_match[2] : attr_match[3] + let current.attr[name] = value + let current.attrs_order += [name] + let attrs = attrs[stridx(attrs, match) + len(match):] + endwhile + return current +endfunction + +function! zencoding#lang#haml#toggleComment() + let line = getline('.') + let space = matchstr(line, '^\s*') + if line =~ '^\s*-#' + call setline('.', space . matchstr(line[len(space)+2:], '^\s*\zs.*')) + elseif line =~ '^\s*%[a-z]' + call setline('.', space . '-# ' . line[len(space):]) + endif +endfunction + +function! zencoding#lang#haml#balanceTag(flag) range + let block = zencoding#util#getVisualBlock() + if a:flag == -2 || a:flag == 2 + let curpos = [0, line("'<"), col("'<"), 0] + else + let curpos = getpos('.') + endif + let n = curpos[1] + let ml = len(matchstr(getline(n), '^\s*')) + + if a:flag > 0 + if a:flag == 1 || !zencoding#util#regionIsValid(block) + let n = line('.') + else + while n > 0 + let l = len(matchstr(getline(n), '^\s*\ze%[a-z]')) + if l > 0 && l < ml + let ml = l + break + endif + let n -= 1 + endwhile + endif + let sn = n + if n == 0 + let ml = 0 + endif + while n < line('$') + let l = len(matchstr(getline(n), '^\s*%[a-z]')) + if l > 0 && l <= ml + let n -= 1 + break + endif + let n += 1 + endwhile + call setpos('.', [0, n, 1, 0]) + normal! V + call setpos('.', [0, sn, 1, 0]) + else + while n > 0 + let l = len(matchstr(getline(n), '^\s*\ze[a-z]')) + if l > 0 && l > ml + let ml = l + break + endif + let n += 1 + endwhile + let sn = n + if n == 0 + let ml = 0 + endif + while n < line('$') + let l = len(matchstr(getline(n), '^\s*%[a-z]')) + if l > 0 && l <= ml + let n -= 1 + break + endif + let n += 1 + endwhile + call setpos('.', [0, n, 1, 0]) + normal! V + call setpos('.', [0, sn, 1, 0]) + endif +endfunction + +function! zencoding#lang#haml#moveNextPrev(flag) + let pos = search('""', a:flag ? 'Wb' : 'W') + if pos != 0 + silent! normal! l + startinsert + endif +endfunction + +function! zencoding#lang#haml#splitJoinTag() + let n = line('.') + let sml = len(matchstr(getline(n), '^\s*%[a-z]')) + while n > 0 + if getline(n) =~ '^\s*\ze%[a-z]' + if len(matchstr(getline(n), '^\s*%[a-z]')) < sml + break + endif + let line = getline(n) + call setline(n, substitute(line, '^\s*%\w\+\%(\s*{[^}]*}\|\s\)\zs.*', '', '')) + let sn = n + let n += 1 + let ml = len(matchstr(getline(n), '^\s*%[a-z]')) + if len(matchstr(getline(n), '^\s*')) > ml + while n <= line('$') + let l = len(matchstr(getline(n), '^\s*')) + if l <= ml + break + endif + exe n "delete" + endwhile + call setpos('.', [0, sn, 1, 0]) + else + let tag = matchstr(getline(sn), '^\s*%\zs\(\w\+\)') + let spaces = matchstr(getline(sn), '^\s*') + let settings = zencoding#getSettings() + if stridx(','.settings.html.inline_elements.',', ','.tag.',') == -1 + call append(sn, spaces . ' ') + call setpos('.', [0, sn+1, 1, 0]) + else + call setpos('.', [0, sn, 1, 0]) + endif + startinsert! + endif + break + endif + let n -= 1 + endwhile +endfunction + +function! zencoding#lang#haml#removeTag() + let n = line('.') + let ml = 0 + while n > 0 + if getline(n) =~ '^\s*\ze[a-z]' + let ml = len(matchstr(getline(n), '^\s*%[a-z]')) + break + endif + let n -= 1 + endwhile + let sn = n + while n < line('$') + let l = len(matchstr(getline(n), '^\s*%[a-z]')) + if l > 0 && l <= ml + let n -= 1 + break + endif + let n += 1 + endwhile + if sn == n + exe "delete" + else + exe sn "," (n-1) "delete" + endif +endfunction diff --git a/sources_forked/zencoding/autoload/zencoding/lang/html.vim b/sources_forked/zencoding/autoload/zencoding/lang/html.vim new file mode 100755 index 00000000..d7a1e634 --- /dev/null +++ b/sources_forked/zencoding/autoload/zencoding/lang/html.vim @@ -0,0 +1,692 @@ +let s:mx = '\([+>]\|[<^]\+\)\{-}\s*' +\ .'\((*\)\{-}\s*' +\ .'\([@#.]\{-}[a-zA-Z\!][a-zA-Z0-9:_\!\-$]*\|{\%([^$}]\+\|\$#\|\${\w\+}\|\$\+\)*}[ \t\r\n}]*\)' +\ .'\(' +\ .'\%(' +\ .'\%(#{[{}a-zA-Z0-9_\-\$]\+\|#[a-zA-Z0-9_\-\$]\+\)' +\ .'\|\%(\[[^\]]\+\]\)' +\ .'\|\%(\.{[{}a-zA-Z0-9_\-\$]\+\|\.[a-zA-Z0-9_\-\$]\+\)' +\ .'\)*' +\ .'\)' +\ .'\%(\({\%([^$}]\+\|\$#\|\${\w\+}\|\$\+\)*}\)\)\{0,1}' +\ .'\%(\*\([0-9]\+\)\)\{0,1}' +\ .'\(\%()\%(\*[0-9]\+\)\{0,1}\)*\)' + +function! zencoding#lang#html#findTokens(str) + let str = a:str + let [pos, last_pos] = [0, 0] + while 1 + let tag = matchstr(str, '<[a-zA-Z].\{-}>', pos) + if len(tag) == 0 + break + endif + let pos = stridx(str, tag, pos) + len(tag) + endwhile + let last_pos = pos + while len(str) > 0 + let token = matchstr(str, s:mx, pos) + if token == '' + break + endif + if token =~ '^\s' + let token = matchstr(token, '^\s*\zs.*') + let last_pos = stridx(str, token, pos) + endif + let pos = stridx(str, token, pos) + len(token) + endwhile + return a:str[last_pos :-1] +endfunction + +function! zencoding#lang#html#parseIntoTree(abbr, type) + let abbr = a:abbr + let type = a:type + + let settings = zencoding#getSettings() + if !has_key(settings, type) + let type = 'html' + endif + if len(type) == 0 | let type = 'html' | endif + + let settings = zencoding#getSettings() + let indent = zencoding#getIndentation(type) + + " try 'foo' to (foo-x) + let rabbr = zencoding#getExpandos(type, abbr) + if rabbr == abbr + " try 'foo+(' to (foo-x) + let rabbr = substitute(abbr, '\%(+\|^\)\([a-zA-Z][a-zA-Z0-9+]\+\)+\([(){}>]\|$\)', '\="(".zencoding#getExpandos(type, submatch(1)).")".submatch(2)', 'i') + endif + let abbr = rabbr + + let root = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0, 'important': 0, 'attrs_order': ['id', 'class'] } + let parent = root + let last = root + let pos = [] + while len(abbr) + " parse line + let match = matchstr(abbr, s:mx) + let str = substitute(match, s:mx, '\0', 'ig') + let operator = substitute(match, s:mx, '\1', 'ig') + let block_start = substitute(match, s:mx, '\2', 'ig') + let tag_name = substitute(match, s:mx, '\3', 'ig') + let attributes = substitute(match, s:mx, '\4', 'ig') + let value = substitute(match, s:mx, '\5', 'ig') + let multiplier = 0 + substitute(match, s:mx, '\6', 'ig') + let block_end = substitute(match, s:mx, '\7', 'ig') + let important = 0 + if len(str) == 0 + break + endif + if tag_name =~ '^#' + let attributes = tag_name . attributes + let tag_name = 'div' + endif + if tag_name =~ '.!$' + let tag_name = tag_name[:-2] + let important = 1 + endif + if tag_name =~ '^\.' + let attributes = tag_name . attributes + let tag_name = 'div' + endif + if multiplier <= 0 | let multiplier = 1 | endif + + " make default node + let current = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0, 'important': 0, 'attrs_order': ['id', 'class'] } + let current.name = tag_name + + let current.important = important + + " aliases + let aliases = zencoding#getResource(type, 'aliases', {}) + if has_key(aliases, tag_name) + let current.name = aliases[tag_name] + endif + + let use_pipe_for_cursor = zencoding#getResource(type, 'use_pipe_for_cursor', 1) + + " snippets + let snippets = zencoding#getResource(type, 'snippets', {}) + if !empty(snippets) && has_key(snippets, tag_name) + let snippet = snippets[tag_name] + if use_pipe_for_cursor + let snippet = substitute(snippet, '|', '${cursor}', 'g') + endif + let lines = split(snippet, "\n") + call map(lines, 'substitute(v:val, "\\( \\|\\t\\)", escape(indent, "\\\\"), "g")') + let current.snippet = join(lines, "\n") + let current.name = '' + endif + + " default_attributes + let default_attributes = zencoding#getResource(type, 'default_attributes', {}) + if !empty(default_attributes) + for pat in [current.name, tag_name] + if has_key(default_attributes, pat) + if type(default_attributes[pat]) == 4 + let a = default_attributes[pat] + let current.attrs_order += keys(a) + if use_pipe_for_cursor + for k in keys(a) + let current.attr[k] = len(a[k]) ? substitute(a[k], '|', '${cursor}', 'g') : '${cursor}' + endfor + else + for k in keys(a) + let current.attr[k] = a[k] + endfor + endif + else + for a in default_attributes[pat] + let current.attrs_order += keys(a) + if use_pipe_for_cursor + for k in keys(a) + let current.attr[k] = len(a[k]) ? substitute(a[k], '|', '${cursor}', 'g') : '${cursor}' + endfor + else + for k in keys(a) + let current.attr[k] = a[k] + endfor + endif + endfor + endif + if has_key(settings.html.default_attributes, current.name) + let current.name = substitute(current.name, ':.*$', '', '') + endif + break + endif + endfor + endif + + " parse attributes + if len(attributes) + let attr = attributes + while len(attr) + let item = matchstr(attr, '\(\%(\%(#[{}a-zA-Z0-9_\-\$]\+\)\|\%(\[[^\]]\+\]\)\|\%(\.[{}a-zA-Z0-9_\-\$]\+\)*\)\)') + if len(item) == 0 + break + endif + if item[0] == '#' + let current.attr.id = item[1:] + endif + if item[0] == '.' + let current.attr.class = substitute(item[1:], '\.', ' ', 'g') + endif + if item[0] == '[' + let atts = item[1:-2] + while len(atts) + let amat = matchstr(atts, '\(\w\+\%(="[^"]*"\|=''[^'']*''\|[^ ''"\]]*\)\{0,1}\)') + if len(amat) == 0 + break + endif + let key = split(amat, '=')[0] + let val = amat[len(key)+1:] + if val =~ '^["'']' + let val = val[1:-2] + endif + let current.attr[key] = val + if index(current.attrs_order, key) == -1 + let current.attrs_order += [key] + endif + let atts = atts[stridx(atts, amat) + len(amat):] + endwhile + endif + let attr = substitute(strpart(attr, len(item)), '^\s*', '', '') + endwhile + endif + + " parse text + if tag_name =~ '^{.*}$' + let current.name = '' + let current.value = tag_name + else + let current.value = value + endif + let current.multiplier = multiplier + + " parse step inside/outside + if !empty(last) + if operator =~ '>' + unlet! parent + let parent = last + let current.parent = last + let current.pos = last.pos + 1 + else + let current.parent = parent + let current.pos = last.pos + endif + else + let current.parent = parent + let current.pos = 1 + endif + if operator =~ '[<^]' + for c in range(len(operator)) + let tmp = parent.parent + if empty(tmp) + break + endif + let parent = tmp + let current.parent = tmp + endfor + endif + + call add(parent.child, current) + let last = current + + " parse block + if block_start =~ '(' + if operator =~ '>' + let last.pos += 1 + endif + for n in range(len(block_start)) + let pos += [last.pos] + endfor + endif + if block_end =~ ')' + for n in split(substitute(substitute(block_end, ' ', '', 'g'), ')', ',),', 'g'), ',') + if n == ')' + if len(pos) > 0 && last.pos >= pos[-1] + for c in range(last.pos - pos[-1]) + let tmp = parent.parent + if !has_key(tmp, 'parent') + break + endif + let parent = tmp + endfor + if len(pos) > 0 + call remove(pos, -1) + endif + let last = parent + let last.pos += 1 + endif + elseif len(n) + let cl = last.child + let cls = [] + for c in range(n[1:]) + let cls += cl + endfor + let last.child = cls + endif + endfor + endif + let abbr = abbr[stridx(abbr, match) + len(match):] + + if g:zencoding_debug > 1 + echomsg "str=".str + echomsg "block_start=".block_start + echomsg "tag_name=".tag_name + echomsg "operator=".operator + echomsg "attributes=".attributes + echomsg "value=".value + echomsg "multiplier=".multiplier + echomsg "block_end=".block_end + echomsg "abbr=".abbr + echomsg "pos=".string(pos) + echomsg "---" + endif + endwhile + return root +endfunction + +function! zencoding#lang#html#toString(settings, current, type, inline, filters, itemno, indent) + let settings = a:settings + let current = a:current + let type = a:type + let inline = a:inline + let filters = a:filters + let itemno = a:itemno + let indent = a:indent + let dollar_expr = zencoding#getResource(type, 'dollar_expr', 1) + + if zencoding#useFilter(filters, 'haml') + return zencoding#lang#haml#toString(settings, current, type, inline, filters, itemno, indent) + endif + if zencoding#useFilter(filters, 'slim') + return zencoding#lang#slim#toString(settings, current, type, inline, filters, itemno, indent) + endif + + let comment = '' + let current_name = current.name + if dollar_expr + let current_name = substitute(current_name, '\$$', itemno+1, '') + endif + + let str = '' + if len(current_name) == 0 + let text = current.value[1:-2] + if dollar_expr + let text = substitute(text, '\%(\\\)\@\ 0 + let str .= '<' . current_name + for attr in current.attrs_order + if !has_key(current.attr, attr) + continue + endif + let val = current.attr[attr] + if dollar_expr + while val =~ '\$\([^#{]\|$\)' + let val = substitute(val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g') + endwhile + let attr = substitute(attr, '\$$', itemno+1, '') + endif + let str .= ' ' . attr . '="' . val . '"' + if zencoding#useFilter(filters, 'c') + if attr == 'id' | let comment .= '#' . val | endif + if attr == 'class' | let comment .= '.' . val | endif + endif + endfor + if len(comment) > 0 + let str = "\n" . str + endif + if stridx(','.settings.html.empty_elements.',', ','.current_name.',') != -1 + let str .= settings.html.empty_element_suffix + else + let str .= ">" + let text = current.value[1:-2] + if dollar_expr + let text = substitute(text, '\%(\\\)\@\ 0 + for n in range(nc) + let child = current.child[n] + if child.multiplier > 1 + let str .= "\n" . indent + let dr = 1 + elseif len(current_name) > 0 && stridx(','.settings.html.inline_elements.',', ','.current_name.',') == -1 + if nc > 1 || (len(child.name) > 0 && stridx(','.settings.html.inline_elements.',', ','.child.name.',') == -1) + let str .= "\n" . indent + let dr = 1 + elseif current.multiplier == 1 && nc == 1 && len(child.name) == 0 + let str .= "\n" . indent + let dr = 1 + endif + endif + let inner = zencoding#toString(child, type, 0, filters, itemno) + let inner = substitute(inner, "^\n", "", 'g') + let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g') + let inner = substitute(inner, "\n" . escape(indent, '\') . '$', '', 'g') + let str .= inner + endfor + else + let str .= '${cursor}' + endif + if dr + let str .= "\n" + endif + let str .= "" + endif + if len(comment) > 0 + let str .= "\n" + endif + if len(current_name) > 0 && current.multiplier > 0 || stridx(','.settings.html.block_elements.',', ','.current_name.',') != -1 + let str .= "\n" + endif + return str +endfunction + +function! zencoding#lang#html#imageSize() + let img_region = zencoding#util#searchRegion('') + if !zencoding#util#regionIsValid(img_region) || !zencoding#util#cursorInRegion(img_region) + return + endif + let content = zencoding#util#getContent(img_region) + if content !~ '^<]\+>$' + return + endif + let current = zencoding#lang#html#parseTag(content) + if empty(current) || !has_key(current.attr, 'src') + return + endif + let fn = current.attr.src + if fn =~ '^\s*$' + return + elseif fn !~ '^\(/\|http\)' + let fn = simplify(expand('%:h') . '/' . fn) + endif + + let [width, height] = zencoding#util#getImageSize(fn) + if width == -1 && height == -1 + return + endif + let current.attr.width = width + let current.attr.height = height + let current.attrs_order += ['width', 'height'] + let html = substitute(zencoding#toString(current, 'html', 1), '\n', '', '') + let html = substitute(html, '\${cursor}', '', '') + call zencoding#util#setContent(img_region, html) +endfunction + +function! zencoding#lang#html#encodeImage() + let img_region = zencoding#util#searchRegion('') + if !zencoding#util#regionIsValid(img_region) || !zencoding#util#cursorInRegion(img_region) + return + endif + let content = zencoding#util#getContent(img_region) + if content !~ '^<]\+>$' + return + endif + let current = zencoding#lang#html#parseTag(content) + if empty(current) || !has_key(current.attr, 'src') + return + endif + let fn = current.attr.src + if fn !~ '^\(/\|http\)' + let fn = simplify(expand('%:h') . '/' . fn) + endif + + let [width, height] = zencoding#util#getImageSize(fn) + if width == -1 && height == -1 + return + endif + let current.attr.width = width + let current.attr.height = height + let html = zencoding#toString(current, 'html', 1) + call zencoding#util#setContent(img_region, html) +endfunction + +function! zencoding#lang#html#parseTag(tag) + let current = { 'name': '', 'attr': {}, 'child': [], 'snippet': '', 'multiplier': 1, 'parent': {}, 'value': '', 'pos': 0, 'attrs_order': [] } + let mx = '<\([a-zA-Z][a-zA-Z0-9]*\)\(\%(\s[a-zA-Z][a-zA-Z0-9]\+=\%([^"'' \t]\+\|"[^"]\{-}"\|''[^'']\{-}''\)\s*\)*\)\(/\{0,1}\)>' + let match = matchstr(a:tag, mx) + let current.name = substitute(match, mx, '\1', 'i') + let attrs = substitute(match, mx, '\2', 'i') + let mx = '\([a-zA-Z0-9]\+\)=\%(\([^"'' \t]\+\)\|"\([^"]\{-}\)"\|''\([^'']\{-}\)''\)' + while len(attrs) > 0 + let match = matchstr(attrs, mx) + if len(match) == 0 + break + endif + let attr_match = matchlist(match, mx) + let name = attr_match[1] + let value = len(attr_match[2]) ? attr_match[2] : attr_match[3] + let current.attr[name] = value + let current.attrs_order += [name] + let attrs = attrs[stridx(attrs, match) + len(match):] + endwhile + return current +endfunction + +function! zencoding#lang#html#toggleComment() + let orgpos = getpos('.') + let curpos = getpos('.') + let mx = '<\%#[^>]*>' + while 1 + let block = zencoding#util#searchRegion('') + if zencoding#util#regionIsValid(block) + let block[1][1] += 2 + let content = zencoding#util#getContent(block) + let content = substitute(content, '^$', '\1', '') + call zencoding#util#setContent(block, content) + silent! call setpos('.', orgpos) + return + endif + let block = zencoding#util#searchRegion('<[^>]', '>') + if !zencoding#util#regionIsValid(block) + let pos1 = searchpos('<', 'bcW') + if pos1[0] == 0 && pos1[1] == 0 + return + endif + let curpos = getpos('.') + continue + endif + let pos1 = block[0] + let pos2 = block[1] + let content = zencoding#util#getContent(block) + let tag_name = matchstr(content, '^<\zs/\{0,1}[^ \r\n>]\+') + if tag_name[0] == '/' + call setpos('.', [0, pos1[0], pos1[1], 0]) + let pos2 = searchpairpos('<'. tag_name[1:] . '>', '', '', 'bnW') + let pos1 = searchpos('>', 'cneW') + let block = [pos2, pos1] + elseif tag_name =~ '/$' + if !zencoding#util#pointInRegion(orgpos[1:2], block) + " it's broken tree + call setpos('.', orgpos) + let block = zencoding#util#searchRegion('>', '<') + let content = '><' + call zencoding#util#setContent(block, content) + silent! call setpos('.', orgpos) + return + endif + else + call setpos('.', [0, pos2[0], pos2[1], 0]) + let pos2 = searchpairpos('<'. tag_name . '>', '', '', 'nW') + call setpos('.', [0, pos2[0], pos2[1], 0]) + let pos2 = searchpos('>', 'neW') + let block = [pos1, pos2] + endif + if !zencoding#util#regionIsValid(block) + silent! call setpos('.', orgpos) + return + endif + if zencoding#util#pointInRegion(curpos[1:2], block) + let content = '' + call zencoding#util#setContent(block, content) + silent! call setpos('.', orgpos) + return + endif + endwhile +endfunction + +function! zencoding#lang#html#balanceTag(flag) range + let vblock = zencoding#util#getVisualBlock() + if a:flag == -2 || a:flag == 2 + let curpos = [0, line("'<"), col("'<"), 0] + else + let curpos = getpos('.') + endif + let settings = zencoding#getSettings() + + if a:flag > 0 + let mx = '<\([a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*>' + while 1 + let pos1 = searchpos(mx, 'bW') + let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx) + let tag_name = matchstr(content, '^<\zs[a-zA-Z0-9:_\-]*\ze') + if stridx(','.settings.html.empty_elements.',', ','.tag_name.',') != -1 + let pos2 = searchpos('>', 'nW') + else + let pos2 = searchpairpos('<' . tag_name . '[^>]*>', '', '\zs', 'nW') + endif + let block = [pos1, pos2] + if pos1[0] == 0 && pos1[1] == 0 + break + endif + if zencoding#util#pointInRegion(curpos[1:2], block) && zencoding#util#regionIsValid(block) + call zencoding#util#selectRegion(block) + return + endif + endwhile + else + let mx = '<\([a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*>' + while 1 + let pos1 = searchpos(mx, 'W') + if pos1 == curpos[1:2] + let pos1 = searchpos(mx . '\zs', 'W') + let pos2 = searchpos('.\ze<', 'W') + let block = [pos1, pos2] + if zencoding#util#regionIsValid(block) + call zencoding#util#selectRegion(block) + return + endif + endif + let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx) + let tag_name = matchstr(content, '^<\zs[a-zA-Z0-9:_\-]*\ze') + if stridx(','.settings.html.empty_elements.',', ','.tag_name.',') != -1 + let pos2 = searchpos('>', 'nW') + else + let pos2 = searchpairpos('<' . tag_name . '[^>]*>', '', '\zs', 'nW') + endif + let block = [pos1, pos2] + if pos1[0] == 0 && pos1[1] == 0 + break + endif + if zencoding#util#regionIsValid(block) + call zencoding#util#selectRegion(block) + return + endif + endwhile + endif + call setpos('.', curpos) + if a:flag == -2 || a:flag == 2 + silent! exe "normal! gv" + endif +endfunction + +function! zencoding#lang#html#moveNextPrev(flag) + let pos = search('\%(<\/\|\(""\)\|^\(\s*\)$', a:flag ? 'Wpb' : 'Wp') + if pos == 3 + startinsert! + elseif pos != 0 + silent! normal! l + startinsert + endif +endfunction + +function! zencoding#lang#html#splitJoinTag() + let curpos = getpos('.') + while 1 + let mx = '<\(/\{0,1}[a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*>' + let pos1 = searchpos(mx, 'bcnW') + let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx) + let tag_name = substitute(content, '^<\(/\{0,1}[a-zA-Z][a-zA-Z0-9:_\-]*\).*$', '\1', '') + let block = [pos1, [pos1[0], pos1[1] + len(content) - 1]] + if content[-2:] == '/>' && zencoding#util#cursorInRegion(block) + let content = content[:-3] . ">' + call zencoding#util#setContent(block, content) + call setpos('.', [0, block[0][0], block[0][1], 0]) + return + else + if tag_name[0] == '/' + let pos1 = searchpos('<' . tag_name[1:] . '[^a-zA-Z0-9]', 'bcnW') + call setpos('.', [0, pos1[0], pos1[1], 0]) + let pos2 = searchpos('', 'cneW') + else + let pos2 = searchpos('', 'cneW') + endif + let block = [pos1, pos2] + let content = zencoding#util#getContent(block) + if zencoding#util#pointInRegion(curpos[1:2], block) && content[1:] !~ '<' . tag_name . '[^a-zA-Z0-9]*[^>]*>' + let content = matchstr(content, mx)[:-2] . '/>' + call zencoding#util#setContent(block, content) + call setpos('.', [0, block[0][0], block[0][1], 0]) + return + else + if block[0][0] > 0 + call setpos('.', [0, block[0][0]-1, block[0][1], 0]) + else + call setpos('.', curpos) + return + endif + endif + endif + endwhile +endfunction + +function! zencoding#lang#html#removeTag() + let curpos = getpos('.') + while 1 + let mx = '<\(/\{0,1}[a-zA-Z][a-zA-Z0-9:_\-]*\)[^>]*>' + let pos1 = searchpos(mx, 'bcnW') + let content = matchstr(getline(pos1[0])[pos1[1]-1:], mx) + let tag_name = substitute(content, '^<\(/\{0,1}[a-zA-Z0-9:_\-]*\).*$', '\1', '') + let block = [pos1, [pos1[0], pos1[1] + len(content) - 1]] + if content[-2:] == '/>' && zencoding#util#cursorInRegion(block) + call zencoding#util#setContent(block, '') + call setpos('.', [0, block[0][0], block[0][1], 0]) + return + else + if tag_name[0] == '/' + let pos1 = searchpos('<' . tag_name[1:] . '[^a-zA-Z0-9]', 'bcnW') + call setpos('.', [0, pos1[0], pos1[1], 0]) + let pos2 = searchpos('', 'cneW') + else + let pos2 = searchpos('', 'cneW') + endif + let block = [pos1, pos2] + let content = zencoding#util#getContent(block) + if zencoding#util#pointInRegion(curpos[1:2], block) && content[1:] !~ '<' . tag_name . '[^a-zA-Z0-9]*[^>]*>' + call zencoding#util#setContent(block, '') + call setpos('.', [0, block[0][0], block[0][1], 0]) + return + else + if block[0][0] > 0 + call setpos('.', [0, block[0][0]-1, block[0][1], 0]) + else + call setpos('.', curpos) + return + endif + endif + endif + endwhile +endfunction diff --git a/sources_forked/zencoding/autoload/zencoding/lang/sass.vim b/sources_forked/zencoding/autoload/zencoding/lang/sass.vim new file mode 100755 index 00000000..6b89b893 --- /dev/null +++ b/sources_forked/zencoding/autoload/zencoding/lang/sass.vim @@ -0,0 +1,158 @@ +function! zencoding#lang#sass#findTokens(str) + return zencoding#lang#html#findTokens(a:str) +endfunction + +function! zencoding#lang#sass#parseIntoTree(abbr, type) + if a:abbr =~ '>' + return zencoding#lang#html#parseIntoTree(a:abbr, a:type) + else + return zencoding#lang#css#parseIntoTree(a:abbr, a:type) + endif +endfunction + +function! zencoding#lang#sass#toString(settings, current, type, inline, filters, itemno, indent) + let settings = a:settings + let current = a:current + let type = a:type + let inline = a:inline + let filters = a:filters + let itemno = a:itemno + let indent = a:indent + let str = "" + + let current_name = current.name + let current_name = substitute(current.name, '\$$', itemno+1, '') + if len(current.name) > 0 + let str .= current_name + let tmp = '' + for attr in keys(current.attr) + let val = current.attr[attr] + while val =~ '\$\([^#{]\|$\)' + let val = substitute(val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g') + endwhile + let attr = substitute(attr, '\$$', itemno+1, '') + if attr == 'id' + let str .= '#' . val + elseif attr == 'class' + let str .= '.' . val + else + let tmp .= attr . ': ' . val + endif + endfor + if len(tmp) > 0 + let str .= "\n" + for line in split(tmp, "\n") + let str .= indent . line . "\n" + endfor + else + let str .= "\n" + endif + + let inner = '' + for child in current.child + let inner .= zencoding#toString(child, type, inline, filters, itemno) + endfor + let inner = substitute(inner, "\n", "\n" . indent, 'g') + let inner = substitute(inner, "\n" . indent . "$", "", 'g') + let str .= indent . inner + else + let text = zencoding#lang#css#toString(settings, current, type, inline, filters, itemno, indent) + let text = substitute(text, '\${cursor}', '', 'g') + let text = substitute(text, '\s*;$', '', '') + return text + endif + return str +endfunction + +function! zencoding#lang#sass#imageSize() +endfunction + +function! zencoding#lang#sass#encodeImage() +endfunction + +function! zencoding#lang#sass#parseTag(tag) +endfunction + +function! zencoding#lang#sass#toggleComment() +endfunction + +function! zencoding#lang#sass#balanceTag(flag) range + let block = zencoding#util#getVisualBlock() + if a:flag == -2 || a:flag == 2 + let curpos = [0, line("'<"), col("'<"), 0] + else + let curpos = getpos('.') + endif + let n = curpos[1] + let ml = len(matchstr(getline(n), '^\s*')) + + if a:flag > 0 + if a:flag == 1 || !zencoding#util#regionIsValid(block) + let n = line('.') + else + while n > 0 + let l = len(matchstr(getline(n), '^\s*\ze[a-z]')) + if l > 0 && l < ml + let ml = l + break + endif + let n -= 1 + endwhile + endif + let sn = n + if n == 0 + let ml = 0 + endif + while n < line('$') + let l = len(matchstr(getline(n), '^\s*[a-z]')) + if l > 0 && l <= ml + let n -= 1 + break + endif + let n += 1 + endwhile + call setpos('.', [0, n, 1, 0]) + normal! V + call setpos('.', [0, sn, 1, 0]) + else + while n > 0 + let l = len(matchstr(getline(n), '^\s*\ze[a-z]')) + if l > 0 && l > ml + let ml = l + break + endif + let n += 1 + endwhile + let sn = n + if n == 0 + let ml = 0 + endif + while n < line('$') + let l = len(matchstr(getline(n), '^\s*[a-z]')) + if l > 0 && l <= ml + let n -= 1 + break + endif + let n += 1 + endwhile + call setpos('.', [0, n, 1, 0]) + normal! V + call setpos('.', [0, sn, 1, 0]) + endif +endfunction + +function! zencoding#lang#sass#moveNextPrev(flag) + let pos = search('""\|\(^\s*|\s*\zs\)', a:flag ? 'Wpb' : 'Wp') + if pos == 2 + startinsert! + elseif pos != 0 + silent! normal! l + startinsert + endif +endfunction + +function! zencoding#lang#sass#splitJoinTag() +endfunction + +function! zencoding#lang#sass#removeTag() +endfunction diff --git a/sources_forked/zencoding/autoload/zencoding/lang/scss.vim b/sources_forked/zencoding/autoload/zencoding/lang/scss.vim new file mode 100755 index 00000000..39890af2 --- /dev/null +++ b/sources_forked/zencoding/autoload/zencoding/lang/scss.vim @@ -0,0 +1,121 @@ +function! zencoding#lang#scss#findTokens(str) + return zencoding#lang#html#findTokens(a:str) +endfunction + +function! zencoding#lang#scss#parseIntoTree(abbr, type) + if a:abbr =~ '>' + return zencoding#lang#html#parseIntoTree(a:abbr, a:type) + else + return zencoding#lang#css#parseIntoTree(a:abbr, a:type) + endif +endfunction + +function! zencoding#lang#scss#toString(settings, current, type, inline, filters, itemno, indent) + let settings = a:settings + let current = a:current + let type = a:type + let inline = a:inline + let filters = a:filters + let itemno = a:itemno + let indent = a:indent + let str = "" + + let current_name = substitute(current.name, '\$$', itemno+1, '') + if len(current.name) > 0 + let str .= current_name + let tmp = '' + for attr in keys(current.attr) + let val = current.attr[attr] + while val =~ '\$\([^#{]\|$\)' + let val = substitute(val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g') + endwhile + let attr = substitute(attr, '\$$', itemno+1, '') + if attr == 'id' + let str .= '#' . val + elseif attr == 'class' + let str .= '.' . val + else + let tmp .= attr . ': ' . val . ';' + endif + endfor + if len(tmp) > 0 + let str .= " {\n" + for line in split(tmp, "\n") + let str .= indent . line . "\n" + endfor + else + let str .= " {\n" + endif + + let inner = '' + for child in current.child + let inner .= zencoding#toString(child, type, inline, filters, itemno) + endfor + let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g') + let inner = substitute(inner, "\n" . escape(indent, '\') . "$", "", 'g') + let str .= indent . inner . "\n}\n" + else + return zencoding#lang#css#toString(settings, current, type, inline, filters, itemno, indent) + endif + return str +endfunction + +function! zencoding#lang#scss#imageSize() + call zencoding#lang#css#imageSize() +endfunction + +function! zencoding#lang#scss#encodeImage() + return zencoding#lang#css#encodeImage() +endfunction + +function! zencoding#lang#scss#parseTag(tag) + return zencoding#lang#css#parseTag(a:tag) +endfunction + +function! zencoding#lang#scss#toggleComment() + call zencoding#lang#css#toggleComment() +endfunction + +function! zencoding#lang#scss#balanceTag(flag) range + if a:flag == -2 || a:flag == 2 + let curpos = [0, line("'<"), col("'<"), 0] + call setpos('.', curpos) + else + let curpos = getpos('.') + endif + if a:flag < 0 + let ret = searchpair('}', '', '.\zs{') + else + let ret = searchpair('{', '', '}', 'bW') + endif + if ret > 0 + let pos1 = getpos('.')[1:2] + if a:flag < 0 + let pos2 = searchpairpos('{', '', '}') + else + let pos2 = searchpairpos('{', '', '}') + endif + let block = [pos1, pos2] + if zencoding#util#regionIsValid(block) + call zencoding#util#selectRegion(block) + return + endif + endif + if a:flag == -2 || a:flag == 2 + silent! exe "normal! gv" + else + call setpos('.', curpos) + endif +endfunction + +function! zencoding#lang#scss#moveNextPrev(flag) + call zencoding#lang#css#moveNextPrev(a:flag) +endfunction + +function! zencoding#lang#scss#splitJoinTag() + call zencoding#lang#css#splitJoinTag() +endfunction + +function! zencoding#lang#scss#removeTag() + call zencoding#lang#ss#removeTag() +endfunction diff --git a/sources_forked/zencoding/autoload/zencoding/lang/slim.vim b/sources_forked/zencoding/autoload/zencoding/lang/slim.vim new file mode 100755 index 00000000..15bc968c --- /dev/null +++ b/sources_forked/zencoding/autoload/zencoding/lang/slim.vim @@ -0,0 +1,276 @@ +function! zencoding#lang#slim#findTokens(str) + return zencoding#lang#html#findTokens(a:str) +endfunction + +function! zencoding#lang#slim#parseIntoTree(abbr, type) + return zencoding#lang#html#parseIntoTree(a:abbr, a:type) +endfunction + +function! zencoding#lang#slim#toString(settings, current, type, inline, filters, itemno, indent) + let settings = a:settings + let current = a:current + let type = a:type + let inline = a:inline + let filters = a:filters + let itemno = a:itemno + let indent = a:indent + let dollar_expr = zencoding#getResource(type, 'dollar_expr', 1) + let str = "" + + let comment_indent = '' + let comment = '' + let current_name = current.name + if dollar_expr + let current_name = substitute(current.name, '\$$', itemno+1, '') + endif + if len(current.name) > 0 + let str .= current_name + for attr in current.attrs_order + if !has_key(current.attr, attr) + continue + endif + let val = current.attr[attr] + if dollar_expr + while val =~ '\$\([^#{]\|$\)' + let val = substitute(val, '\(\$\+\)\([^{]\|$\)', '\=printf("%0".len(submatch(1))."d", itemno+1).submatch(2)', 'g') + endwhile + endif + let attr = substitute(attr, '\$$', itemno+1, '') + let str .= ' ' . attr . '="' . val . '"' + endfor + + let inner = '' + if len(current.value) > 0 + let str .= "\n" + let text = current.value[1:-2] + if dollar_expr + let text = substitute(text, '\%(\\\)\@\ 0 + for child in current.child + let inner .= zencoding#toString(child, type, inline, filters, itemno) + endfor + let inner = substitute(inner, "\n", "\n" . escape(indent, '\'), 'g') + let inner = substitute(inner, "\n" . escape(indent, '\') . "$", "", 'g') + let str .= "\n" . indent . inner + endif + else + let str = current.value[1:-2] + if dollar_expr + let str = substitute(str, '\%(\\\)\@\ 0 + let match = matchstr(attrs, mx) + if len(match) == 0 + break + endif + let attr_match = matchlist(match, mx) + let name = attr_match[1] + let value = len(attr_match[2]) ? attr_match[2] : attr_match[3] + let current.attr[name] = value + let current.attrs_order += [name] + let attrs = attrs[stridx(attrs, match) + len(match):] + endwhile + return current +endfunction + +function! zencoding#lang#slim#toggleComment() + let line = getline('.') + let space = matchstr(line, '^\s*') + if line =~ '^\s*/' + call setline('.', space . line[len(space)+1:]) + elseif line =~ '^\s*[a-z]' + call setline('.', space . '/' . line[len(space):]) + endif +endfunction + +function! zencoding#lang#slim#balanceTag(flag) range + let block = zencoding#util#getVisualBlock() + if a:flag == -2 || a:flag == 2 + let curpos = [0, line("'<"), col("'<"), 0] + else + let curpos = getpos('.') + endif + let n = curpos[1] + let ml = len(matchstr(getline(n), '^\s*')) + + if a:flag > 0 + if a:flag == 1 || !zencoding#util#regionIsValid(block) + let n = line('.') + else + while n > 0 + let l = len(matchstr(getline(n), '^\s*\ze[a-z]')) + if l > 0 && l < ml + let ml = l + break + endif + let n -= 1 + endwhile + endif + let sn = n + if n == 0 + let ml = 0 + endif + while n < line('$') + let l = len(matchstr(getline(n), '^\s*[a-z]')) + if l > 0 && l <= ml + let n -= 1 + break + endif + let n += 1 + endwhile + call setpos('.', [0, n, 1, 0]) + normal! V + call setpos('.', [0, sn, 1, 0]) + else + while n > 0 + let l = len(matchstr(getline(n), '^\s*\ze[a-z]')) + if l > 0 && l > ml + let ml = l + break + endif + let n += 1 + endwhile + let sn = n + if n == 0 + let ml = 0 + endif + while n < line('$') + let l = len(matchstr(getline(n), '^\s*[a-z]')) + if l > 0 && l <= ml + let n -= 1 + break + endif + let n += 1 + endwhile + call setpos('.', [0, n, 1, 0]) + normal! V + call setpos('.', [0, sn, 1, 0]) + endif +endfunction + +function! zencoding#lang#slim#moveNextPrev(flag) + let pos = search('""\|\(^\s*|\s*\zs\)', a:flag ? 'Wpb' : 'Wp') + if pos == 2 + startinsert! + elseif pos != 0 + silent! normal! l + startinsert + endif +endfunction + +function! zencoding#lang#slim#splitJoinTag() + let n = line('.') + while n > 0 + if getline(n) =~ '^\s*\ze[a-z]' + let sn = n + let n += 1 + if getline(n) =~ '^\s*|' + while n <= line('$') + if getline(n) !~ '^\s*|' + break + endif + exe n "delete" + endwhile + call setpos('.', [0, sn, 1, 0]) + else + let spaces = matchstr(getline(sn), '^\s*') + call append(sn, spaces . ' | ') + call setpos('.', [0, sn+1, 1, 0]) + startinsert! + endif + break + endif + let n -= 1 + endwhile +endfunction + +function! zencoding#lang#slim#removeTag() + let n = line('.') + let ml = 0 + while n > 0 + if getline(n) =~ '^\s*\ze[a-z]' + let ml = len(matchstr(getline(n), '^\s*[a-z]')) + break + endif + let n -= 1 + endwhile + let sn = n + while n < line('$') + let l = len(matchstr(getline(n), '^\s*[a-z]')) + if l > 0 && l <= ml + let n -= 1 + break + endif + let n += 1 + endwhile + if sn == n + exe "delete" + else + exe sn "," (n-1) "delete" + endif +endfunction diff --git a/sources_forked/zencoding/autoload/zencoding/util.vim b/sources_forked/zencoding/autoload/zencoding/util.vim new file mode 100755 index 00000000..5a028c97 --- /dev/null +++ b/sources_forked/zencoding/autoload/zencoding/util.vim @@ -0,0 +1,249 @@ +"============================================================================== +" region utils +"============================================================================== +" deleteContent : delete content in region +" if region make from between '' and '' +" -------------------- +" begin: +" :end +" -------------------- +" this function make the content as following +" -------------------- +" begin::end +" -------------------- +function! zencoding#util#deleteContent(region) + let lines = getline(a:region[0][0], a:region[1][0]) + call setpos('.', [0, a:region[0][0], a:region[0][1], 0]) + silent! exe "delete ".(a:region[1][0] - a:region[0][0]) + call setline(line('.'), lines[0][:a:region[0][1]-2] . lines[-1][a:region[1][1]]) +endfunction + +" change_content : change content in region +" if region make from between '' and '' +" -------------------- +" begin: +" :end +" -------------------- +" and content is +" -------------------- +" foo +" bar +" baz +" -------------------- +" this function make the content as following +" -------------------- +" begin:foo +" bar +" baz:end +" -------------------- +function! zencoding#util#setContent(region, content) + let newlines = split(a:content, '\n', 1) + let oldlines = getline(a:region[0][0], a:region[1][0]) + call setpos('.', [0, a:region[0][0], a:region[0][1], 0]) + silent! exe "delete ".(a:region[1][0] - a:region[0][0]) + if len(newlines) == 0 + let tmp = '' + if a:region[0][1] > 1 + let tmp = oldlines[0][:a:region[0][1]-2] + endif + if a:region[1][1] >= 1 + let tmp .= oldlines[-1][a:region[1][1]:] + endif + call setline(line('.'), tmp) + elseif len(newlines) == 1 + if a:region[0][1] > 1 + let newlines[0] = oldlines[0][:a:region[0][1]-2] . newlines[0] + endif + if a:region[1][1] >= 1 + let newlines[0] .= oldlines[-1][a:region[1][1]:] + endif + call setline(line('.'), newlines[0]) + else + if a:region[0][1] > 1 + let newlines[0] = oldlines[0][:a:region[0][1]-2] . newlines[0] + endif + if a:region[1][1] >= 1 + let newlines[-1] .= oldlines[-1][a:region[1][1]:] + endif + call setline(line('.'), newlines[0]) + call append(line('.'), newlines[1:]) + endif +endfunction + +" select_region : select region +" this function make a selection of region +function! zencoding#util#selectRegion(region) + call setpos('.', [0, a:region[1][0], a:region[1][1], 0]) + normal! v + call setpos('.', [0, a:region[0][0], a:region[0][1], 0]) +endfunction + +" point_in_region : check point is in the region +" this function return 0 or 1 +function! zencoding#util#pointInRegion(point, region) + if !zencoding#util#regionIsValid(a:region) | return 0 | endif + if a:region[0][0] > a:point[0] | return 0 | endif + if a:region[1][0] < a:point[0] | return 0 | endif + if a:region[0][0] == a:point[0] && a:region[0][1] > a:point[1] | return 0 | endif + if a:region[1][0] == a:point[0] && a:region[1][1] < a:point[1] | return 0 | endif + return 1 +endfunction + +" cursor_in_region : check cursor is in the region +" this function return 0 or 1 +function! zencoding#util#cursorInRegion(region) + if !zencoding#util#regionIsValid(a:region) | return 0 | endif + let cur = getpos('.')[1:2] + return zencoding#util#pointInRegion(cur, a:region) +endfunction + +" region_is_valid : check region is valid +" this function return 0 or 1 +function! zencoding#util#regionIsValid(region) + if a:region[0][0] == 0 || a:region[1][0] == 0 | return 0 | endif + return 1 +endfunction + +" search_region : make region from pattern which is composing start/end +" this function return array of position +function! zencoding#util#searchRegion(start, end) + return [searchpairpos(a:start, '', a:end, 'bcnW'), searchpairpos(a:start, '\%#', a:end, 'nW')] +endfunction + +" get_content : get content in region +" this function return string in region +function! zencoding#util#getContent(region) + if !zencoding#util#regionIsValid(a:region) + return '' + endif + let lines = getline(a:region[0][0], a:region[1][0]) + if a:region[0][0] == a:region[1][0] + let lines[0] = lines[0][a:region[0][1]-1:a:region[1][1]-1] + else + let lines[0] = lines[0][a:region[0][1]-1:] + let lines[-1] = lines[-1][:a:region[1][1]-1] + endif + return join(lines, "\n") +endfunction + +" region_in_region : check region is in the region +" this function return 0 or 1 +function! zencoding#util#regionInRegion(outer, inner) + if !zencoding#util#regionIsValid(a:inner) || !zencoding#util#regionIsValid(a:outer) + return 0 + endif + return zencoding#util#pointInRegion(a:inner[0], a:outer) && zencoding#util#pointInRegion(a:inner[1], a:outer) +endfunction + +" get_visualblock : get region of visual block +" this function return region of visual block +function! zencoding#util#getVisualBlock() + return [[line("'<"), col("'<")], [line("'>"), col("'>")]] +endfunction + +"============================================================================== +" html utils +"============================================================================== +function! zencoding#util#getContentFromURL(url) + let res = system(printf("%s %s", g:zencoding_curl_command, shellescape(substitute(a:url, '#.*', '', '')))) + let s1 = len(split(res, '?')) + let utf8 = iconv(res, 'utf-8', &encoding) + let s2 = len(split(utf8, '?')) + return (s2 == s1 || s2 >= s1 * 2) ? utf8 : res +endfunction + +function! zencoding#util#getTextFromHTML(buf) + let threshold_len = 100 + let threshold_per = 0.1 + let buf = a:buf + + let buf = strpart(buf, stridx(buf, '')) + let buf = substitute(buf, ']*>.\{-}', '', 'g') + let buf = substitute(buf, ']*>.\{-}', '', 'g') + let res = '' + let max = 0 + let mx = '\(]\{-}>\)\|\(<\/td>\)\|\(]\{-}>\)\|\(<\/div>\)' + let m = split(buf, mx) + for str in m + let c = split(str, '<[^>]*?>') + let str = substitute(str, '<[^>]\{-}>', ' ', 'g') + let str = substitute(str, '>', '>', 'g') + let str = substitute(str, '<', '<', 'g') + let str = substitute(str, '"', '"', 'g') + let str = substitute(str, ''', "'", 'g') + let str = substitute(str, ' ', ' ', 'g') + let str = substitute(str, '¥', '\¥', 'g') + let str = substitute(str, '&', '\&', 'g') + let str = substitute(str, '^\s*\(.*\)\s*$', '\1', '') + let str = substitute(str, '\s\+', ' ', 'g') + let l = len(str) + if l > threshold_len + let per = (l+0.0) / len(c) + if max < l && per > threshold_per + let max = l + let res = str + endif + endif + endfor + let res = substitute(res, '^\s*\(.*\)\s*$', '\1', 'g') + return res +endfunction + +function! zencoding#util#getImageSize(fn) + let fn = a:fn + + if zencoding#util#isImageMagickInstalled() + return zencoding#util#imageSizeWithImageMagick(fn) + endif + + if filereadable(fn) + let hex = substitute(system('xxd -p "'.fn.'"'), '\n', '', 'g') + else + let hex = substitute(system(g:zencoding_curl_command.' "'.fn.'" | xxd -p'), '\n', '', 'g') + endif + + let [width, height] = [-1, -1] + if hex =~ '^89504e470d0a1a0a' + let width = eval('0x'.hex[32:39]) + let height = eval('0x'.hex[40:47]) + endif + if hex =~ '^ffd8' + let pos = 4 + while pos < len(hex) + let bs = hex[pos+0:pos+3] + let pos += 4 + if bs == 'ffc0' || bs == 'ffc2' + let pos += 6 + let height = eval('0x'.hex[pos+0:pos+1])*256 + eval('0x'.hex[pos+2:pos+3]) + let pos += 4 + let width = eval('0x'.hex[pos+0:pos+1])*256 + eval('0x'.hex[pos+2:pos+3]) + break + elseif bs =~ 'ffd[9a]' + break + elseif bs =~ 'ff\(e[0-9a-e]\|fe\|db\|dd\|c4\)' + let pos += (eval('0x'.hex[pos+0:pos+1])*256 + eval('0x'.hex[pos+2:pos+3])) * 2 + endif + endwhile + endif + if hex =~ '^47494638' + let width = eval('0x'.hex[14:15].hex[12:13]) + let height = eval('0x'.hex[18:19].hex[16:17]) + endif + + return [width, height] +endfunction + +function! zencoding#util#imageSizeWithImageMagick(fn) + let img_info = system('identify -format "%wx%h" "'.a:fn.'"') + let img_size = split(substitute(img_info, '\n', '', ''), 'x') + let width = img_size[0] + let height = img_size[1] + return [width, height] +endfunction + +function! zencoding#util#isImageMagickInstalled() + if !get(s:, 'zencoding_use_identify', 1) + return 0 + endif + return executable('identify') +endfunction diff --git a/sources_forked/zencoding/doc/zencoding.txt b/sources_forked/zencoding/doc/zencoding.txt new file mode 100755 index 00000000..ee453283 --- /dev/null +++ b/sources_forked/zencoding/doc/zencoding.txt @@ -0,0 +1,438 @@ +*zencoding.txt* ZenCoding for Vim + + ------------------------------------------------------- + ZenCoding: vim plugins for HTML and CSS hi-speed coding + ------------------------------------------------------- + +Author: Yasuhiro Matsumoto +WebSite: http://mattn.kaoriya.net/ +Repository: http://github.com/mattn/zencoding-vim +Site: http://mattn.github.com/zencoding-vim +License: BSD style license + +============================================================================== +CONTENTS *zencoding-contents* + +Introduction |zencoding-introduction| +Install |zencoding-install| +Tutorial |zencoding-tutorial| + 1. Expand Abbreviation |zencoding-expandabbr| + 2. Wrap with Abbreviation |zencoding-wrap-wtih-abbreviation| + 3. Balance Tag Inward |zencoding-balance-tag-inward| + 4. Balance Tag Outward |zencoding-balance-tag-outward| + 5. Go to Next Edit Point |zencoding-goto-next-point| |n| + 6. Go to Previous Edit Point |zencoding-goto-previous-point| + 7. Update Size |zencoding-update-image-size| + 8. Merge Lines |zencoding-merge-lines| + 9. Remove Tag |zencoding-remove-tag| + 10. Split/Join Tag |zencoding-split-join-tag| + 11. Toggle Comment |zencoding-toggle-comment| + 12. Make anchor from URL |zencoding-make-anchor-url| + 13. Make quoted text from URL |zencoding-quoted-text-url| + 14. Code Pretty |zencoding-code-pretty| +Customize |zencoding-customize| + 1. Key Mappings |zencoding-customize-keymappings| + 2. Indent Size |zencoding-indent-size| + 3. Define Tag's Behavior |zencoding-define-tags-behavior| + 4. Complete Tag |zencoding-complete-tag| +Links |zencoding-links| +ToDo |zencoding-todo| + +============================================================================== +INTRODUCTION *zencoding-introduction* *zencoding* + +|ZenCoding| is an editor plugin for high-speed HTML, XML, XSL (or any other +structured code format) coding and editing. The core of this plugin is a +powerful abbreviation engine which allows you to expand expressions?similar to +CSS selectors?into HTML code: +> + div#page>div.logo+ul#navigation>li*5>a +< +...can be expanded into: +> +

    + + +
    +< +Read more about current Zen Coding syntax + http://code.google.com/p/zen-coding/wiki/ZenHTMLSelectorsEn + +Abbreviation engine has a modular structure which allows you to expand +abbreviations into different languages. Zen Coding currently supports CSS, +HTML, XML/XSL and HAML, Slim languages via filters. + +============================================================================== +INSTALL *zencoding-install* + +Install the distributed files into Vim runtime directory which is usually +~/.vim/, or $HOME/vimfiles on Windows. + +If you install pathogen that provided from Tim Pope, you should extract the +file into 'bundle' directory. + +============================================================================== +TUTORIAL *zencoding-tutorial* + +If you are seeing this file as :help, then you can't edit this file. +You should copy this section and create new buffer, paste and write as +'zencoding-tutor.txt'. Formally, open the file to start tutorial. + +1. Expand Abbreviation *zencoding-expandabbr* *,* + + Type abbreviation as 'div>p#foo$*3>a' and type |,|. +> +
    +

    + +

    +

    + +

    +

    + +

    +
    +< +2. Wrap with Abbreviation *zencoding-wrap-wtih-abbreviation* *v_,* + + Write as below. +> + test1 + test2 + test3 +< + Then do visual select(line wize) and type |,|. + If you request 'Tag:', then type 'ul>li*'. +> +
      +
    • test1
    • +
    • test2
    • +
    • test3
    • +
    +< + If you type tag as 'blockquote', then you'll see as following. +> +
    + test1 + test2 + test3 +
    +< +3. Balance Tag Inward *zencoding-balance-tag-inward* *d* + + To select inward of ul tag, type |d| in insert mode. +> +
      + *
    • +
    • +
    • +
    +< + If cursor is at '*', |d| select from begin of
      to end of
    . + If cursor is at first of
  • , it select
  • . + +4. Balance Tag Outward *zencoding-balance-tag-outward* *D* + + To select outward of ul tag, insert mode, type D in insert mode. +> +
      + *
    • +
    • +
    • +
    +< + If cursor is at '*', |D| select from next letter of
      to previous + letter of
    . + If cursor is at first of
  • , it select
  • . + +5. Go to Next Edit Point *zencoding-goto-next-point* *n* + + To jump next point that need to edit, type |n| in insert mode. +> + *
    foo
    +
  • +< + If cursor is at '*', |n| move a cursor into attribute value of div + specified id as 'foo'. And type again |n| move a cursor into inner of + div specified id as 'bar'. + +6. Go to Previous Edit Point *zencoding-goto-previous-point* *N* + + To jump previous point that need to edit, type |N| in insert mode. +> +
    foo
    +
    * +< + If cursor is at '*', |N| move a cursor into div specified id as 'bar'. + And type again |N| move a cursor into attribute value of 'foo'. + +7. Update Size *zencoding-update-image-size* *i* + + To expand or update size of image, type |i| on img tag +> + +< + Type 'i' on img tag +> + +< + If you change image, then type it again. it will be following. +> + +< +8. Merge Lines *zencoding-merge-lines* + + To join multi line text like following, type |J|. +> +
      +
    • +
    • +
    • +
    +< + If you select part of line include
  • and type |m|, it will be + following. +> +
      +
    • +
    +< +9. Remove Tag *zencoding-remove-tag* *k* + + To remove tag in the block, type |k|. +> + +< + Type |k| in insert mode, then +> +
    + +
    +< + And type |k| in there again, then div will be removed. + +10. Split/Join Tag *zencoding-split-join-tag* *j* + + To join block, type |j|. +> +
    + cursor is here +
    +< + Type |j| in insert mode. then, +> +
    +< + And type |j| in there again. +> +
    +
    +< +11. Toggle Comment *zencoding-toggle-comment* */* + + Move cursor to block +> +
    + hello world +
    +< + Type '/' in insert mode. +> + +< + Type '/' in there again. +> +
    + hello world +
    +< +12. Make anchor from URL *zencoding-make-anchor-url* *a* + + Move cursor to URL +> + http://www.google.com/ +< + Type |a| +> + Google +< +13. Make quoted text from URL *zencoding-quoted-text-url* *A* + + Move cursor to URL +> + http://github.com/ +< + Type |A| +> +
    + Secure source code hosting and collaborative development - GitHub
    +

    How does it work? Get up and running in seconds by forking a project, pushing an existing repository...

    + http://github.com/ +
    +< +14. Code Pretty *zencoding-code-pretty* *c* + + Select code block, for example select following code from "int main()". +> +

    Writing in C language

    + + int main() { + puts("hello world"); + } +< + Type |c| +> +

    Writing in C language

    + + int main() {
    +   puts("hello world");
    + }
    +< +============================================================================== +CUSTOMIZE *zencoding-customize* + +1. Key Mapping *zencoding-customize-keymappings* + + To specify leading key for expanding or balance tag, or for all, + Add this line in your vimrc: > +> + let g:user_zen_leader_key = '' +< + Or if you prefer to map for each actions, then you set each variables. + + 'user_zen_expandabbr_key' + 'user_zen_expandword_key' + 'user_zen_balancetaginward_key' + 'user_zen_balancetagoutward_key' + 'user_zen_next_key' + 'user_zen_prev_key' + 'user_zen_imagesize_key' + 'user_zen_togglecomment_key' + 'user_zen_splitjointag_key' + 'user_zen_removetag_key' + 'user_zen_anchorizeurl_key' + 'user_zen_anchorizesummary_key' + +2. Indent Size *zencoding-indent-size* + + To change indent size of html, add this code in your vimrc. +> + let g:user_zen_settings = { + \ 'html' : { + \ 'indentation' : ' ' + \ }, + \} +< + If you prefer to change global indent size then add this. +> + let g:user_zen_settings = { + \ 'indentation' : ' ' + \} +< +3. Define Tag's Behavior *zencoding-define-tags-behavior* + + zencoding.vim can change behavior of expanding abbreviation for each + filetypes as |Dictionary|. for details, see official site of zencoding. + for example, vimmer can add following. +> + let g:user_zen_settings = { + \ 'lang' : 'ja', + \ 'html' : { + \ 'filters' : 'html', + \ 'indentation' : ' ' + \ }, + \ 'perl' : { + \ 'indentation' : ' ', + \ 'aliases' : { + \ 'req' : "require '|'" + \ }, + \ 'snippets' : { + \ 'use' : "use strict\nuse warnings\n\n", + \ 'w' : "warn \"${cursor}\";", + \ }, + \ }, + \ 'php' : { + \ 'extends' : 'html', + \ 'filters' : 'html,c', + \ }, + \ 'css' : { + \ 'filters' : 'fc', + \ }, + \ 'javascript' : { + \ 'snippets' : { + \ 'jq' : "$(function() {\n\t${cursor}${child}\n});", + \ 'jq:each' : "$.each(arr, function(index, item)\n\t${child}\n});", + \ 'fn' : "(function() {\n\t${cursor}\n})();", + \ 'tm' : "setTimeout(function() {\n\t${cursor}\n}, 100);", + \ }, + \ }, + \ 'java' : { + \ 'indentation' : ' ', + \ 'snippets' : { + \ 'main': "public static void main(String[] args) {\n\t|\n}", + \ 'println': "System.out.println(\"|\");", + \ 'class': "public class | {\n}\n", + \ }, + \ }, + \} +< +4. Complete Tag *zencoding-complete-tag* + + If you want to complete tags using |omnifunc| then add this. +> + let g:use_zen_complete_tag = 1 +< + +5. Enable functions in different mode + + If you want to use zencoding only in some modes, set an mode option: + + let g:user_zen_mode='n' "only enable normal mode functions, or + let g:user_zen_mode='inv' "enable all functions, which is equal to + let g:user_zen_mode='a' "enable all function in all mode. + +============================================================================== +LINKS *zencoding-links* + +zen-coding official site: + http://code.google.com/p/zen-coding/ + +zencoding.vim: + http://mattn.github.com/zencoding-vim + +development repository: + https://github.com/mattn/zencoding-vim + +my blog posts about zencoding-vim: + http://mattn.kaoriya.net/software/vim/20100222103327.htm + http://mattn.kaoriya.net/software/vim/20100306021632.htm + +japanese blog posts about zencoding-vim: + http://d.hatena.ne.jp/idesaku/20100424/1272092255 + http://d.hatena.ne.jp/griefworker/20110118/vim_zen_coding + http://d.hatena.ne.jp/sakurako_s/20110126/1295988873 + http://looxu.blogspot.jp/2010/02/zencodingvimhtml.html + +tutorial traslated in chinese: + http://www.zfanw.com/blog/zencoding-vim-tutorial-chinese.html + +============================================================================== +TODO *zencoding-todo* + * wrapping inline selected. + * more documents. + * more contributor. + * more time to improve zencodig.vim. + +============================================================================== +vim:tw=78:ts=8:ft=help:norl:noet:fen:fdl=0: diff --git a/sources_forked/zencoding/plugin/zencoding.vim b/sources_forked/zencoding/plugin/zencoding.vim new file mode 100755 index 00000000..e627653d --- /dev/null +++ b/sources_forked/zencoding/plugin/zencoding.vim @@ -0,0 +1,215 @@ +"============================================================================= +" File: zencoding.vim +" Author: Yasuhiro Matsumoto +" Last Change: 13-Feb-2013. +" Version: 0.75 +" WebPage: http://github.com/mattn/zencoding-vim +" Description: vim plugins for HTML and CSS hi-speed coding. +" SeeAlso: http://code.google.com/p/zen-coding/ +" Usage: +" +" This is vim script support expanding abbreviation like zen-coding. +" ref: http://code.google.com/p/zen-coding/ +" +" Type abbreviation +" +------------------------------------- +" | html:5_ +" +------------------------------------- +" "_" is a cursor position. and type "," (Ctrl+y and Comma) +" NOTE: Don't worry about key map. you can change it easily. +" +------------------------------------- +" | +" | +" | +" | +" | +" | +" | +" | _ +" | +" | +" +------------------------------------- +" Type following +" +------------------------------------- +" | div#foo$*2>div.bar +" +------------------------------------- +" And type "," +" +------------------------------------- +" |
    +" |
    _
    +" |
    +" |
    +" |
    +" |
    +" +------------------------------------- +" +" Tips: +" +" You can customize behavior of expanding with overriding config. +" This configuration will be marged at loading plugin. +" +" let g:user_zen_settings = { +" \ 'indentation' : ' ', +" \ 'perl' : { +" \ 'aliases' : { +" \ 'req' : 'require ' +" \ }, +" \ 'snippets' : { +" \ 'use' : "use strict\nuse warnings\n\n", +" \ 'warn' : "warn \"|\";", +" \ } +" \ } +" \} +" +" You can set language attribute in html using 'zen_settings.lang'. +" +" GetLatestVimScripts: 2981 1 :AutoInstall: zencoding.vim +" script type: plugin + +if &cp || (exists('g:loaded_zencoding_vim') && g:loaded_zencoding_vim) + finish +endif +let g:loaded_zencoding_vim = 1 + +let s:save_cpo = &cpo +set cpo&vim + +if !exists('g:zencoding_debug') + let g:zencoding_debug = 0 +endif + +if !exists('g:zencoding_curl_command') + let g:zencoding_curl_command = 'curl -s -L -A Mozilla/5.0' +endif + +if exists('g:use_zen_complete_tag') && g:use_zen_complete_tag + setlocal omnifunc=zencoding#CompleteTag +endif + +if !exists('g:user_zen_leader_key') + let g:user_zen_leader_key = '' +endif + +function! s:install_plugin_i() + for item in [ + \ {'mode': 'i', 'var': 'user_zen_expandabbr_key', 'key': ',', 'plug': 'ZenCodingExpandAbbr', 'func': 'u:call zencoding#expandAbbr(0,"")a'}, + \ {'mode': 'i', 'var': 'user_zen_expandword_key', 'key': ';', 'plug': 'ZenCodingExpandWord', 'func': 'u:call zencoding#expandAbbr(1,"")a'}, + \ {'mode': 'i', 'var': 'user_zen_balancetaginward_key', 'key': 'd', 'plug': 'ZenCodingBalanceTagInwardInsert', 'func': ':call zencoding#balanceTag(1)'}, + \ {'mode': 'i', 'var': 'user_zen_balancetagoutward_key', 'key': 'D', 'plug': 'ZenCodingBalanceTagOutwardInsert', 'func': ':call zencoding#balanceTag(-1)'}, + \ {'mode': 'i', 'var': 'user_zen_next_key', 'key': 'n', 'plug': 'ZenCodingNext', 'func': ':call zencoding#moveNextPrev(0)'}, + \ {'mode': 'i', 'var': 'user_zen_prev_key', 'key': 'N', 'plug': 'ZenCodingPrev', 'func': ':call zencoding#moveNextPrev(1)'}, + \ {'mode': 'i', 'var': 'user_zen_imagesize_key', 'key': 'i', 'plug': 'ZenCodingImageSize', 'func': ':call zencoding#imageSize()a'}, + \ {'mode': 'i', 'var': 'user_zen_togglecomment_key', 'key': '/', 'plug': 'ZenCodingToggleComment', 'func': ':call zencoding#toggleComment()a'}, + \ {'mode': 'i', 'var': 'user_zen_splitjointag_key', 'key': 'j', 'plug': 'ZenCodingSplitJoinTagInsert', 'func': ':call zencoding#splitJoinTag()'}, + \ {'mode': 'i', 'var': 'user_zen_removetag_key', 'key': 'k', 'plug': 'ZenCodingRemoveTag', 'func': ':call zencoding#removeTag()a'}, + \ {'mode': 'i', 'var': 'user_zen_anchorizeurl_key', 'key': 'a', 'plug': 'ZenCodingAnchorizeURL', 'func': ':call zencoding#anchorizeURL(0)a'}, + \ {'mode': 'i', 'var': 'user_zen_anchorizesummary_key', 'key': 'A', 'plug': 'ZenCodingAnchorizeSummary', 'func': ':call zencoding#anchorizeURL(1)a'}, + \] + + if !hasmapto(''.item.plug, item.mode) + exe item.mode . 'noremap ' . item.plug . ' ' . item.func + endif + if !exists('g:' . item.var) + endif + if exists('g:' . item.var) + let key = eval('g:' . item.var) + else + let key = g:user_zen_leader_key . item.key + endif + if len(maparg(key, item.mode)) == 0 + exe item.mode . 'map ' . key . ' ' . item.plug + endif + endfor +endfunction + +function! s:install_plugin_n() + for item in [ + \ {'mode': 'n', 'var': 'user_zen_expandabbr_key', 'key': ',', 'plug': 'ZenCodingExpandNormal', 'func': ':call zencoding#expandAbbr(3,"")'}, + \ {'mode': 'n', 'var': 'user_zen_expandword_key', 'key': ',', 'plug': 'ZenCodingExpandWord', 'func': ':call zencoding#expandAbbr(1,"")'}, + \ {'mode': 'n', 'var': 'user_zen_balancetaginward_key', 'key': 'd', 'plug': 'ZenCodingBalanceTagInwardNormal', 'func': ':call zencoding#balanceTag(1)'}, + \ {'mode': 'n', 'var': 'user_zen_balancetagoutward_key', 'key': 'D', 'plug': 'ZenCodingBalanceTagOutwardNormal', 'func': ':call zencoding#balanceTag(-1)'}, + \ {'mode': 'n', 'var': 'user_zen_next_key', 'key': 'n', 'plug': 'ZenCodingNext', 'func': ':call zencoding#moveNextPrev(0)'}, + \ {'mode': 'n', 'var': 'user_zen_prev_key', 'key': 'N', 'plug': 'ZenCodingPrev', 'func': ':call zencoding#moveNextPrev(1)'}, + \ {'mode': 'n', 'var': 'user_zen_imagesize_key', 'key': 'i', 'plug': 'ZenCodingImageSize', 'func': ':call zencoding#imageSize()'}, + \ {'mode': 'n', 'var': 'user_zen_togglecomment_key', 'key': '/', 'plug': 'ZenCodingToggleComment', 'func': ':call zencoding#toggleComment()'}, + \ {'mode': 'n', 'var': 'user_zen_splitjointag_key', 'key': 'j', 'plug': 'ZenCodingSplitJoinTagNormal', 'func': ':call zencoding#splitJoinTag()'}, + \ {'mode': 'n', 'var': 'user_zen_removetag_key', 'key': 'k', 'plug': 'ZenCodingRemoveTag', 'func': ':call zencoding#removeTag()'}, + \ {'mode': 'n', 'var': 'user_zen_anchorizeurl_key', 'key': 'a', 'plug': 'ZenCodingAnchorizeURL', 'func': ':call zencoding#anchorizeURL(0)'}, + \ {'mode': 'n', 'var': 'user_zen_anchorizesummary_key', 'key': 'A', 'plug': 'ZenCodingAnchorizeSummary', 'func': ':call zencoding#anchorizeURL(1)'}, + \] + + if !hasmapto(''.item.plug, item.mode) + exe item.mode . 'noremap ' . item.plug . ' ' . item.func + endif + if !exists('g:' . item.var) + endif + if exists('g:' . item.var) + let key = eval('g:' . item.var) + else + let key = g:user_zen_leader_key . item.key + endif + if len(maparg(key, item.mode)) == 0 + exe item.mode . 'map ' . key . ' ' . item.plug + endif + endfor +endfunction + +function! s:install_plugin_v() + for item in [ + \ {'mode': 'v', 'var': 'user_zen_expandabbr_key', 'key': ',', 'plug': 'ZenCodingExpandVisual', 'func': ':call zencoding#expandAbbr(2,"")'}, + \ {'mode': 'v', 'var': 'user_zen_balancetaginward_key', 'key': 'd', 'plug': 'ZenCodingBalanceTagInwardVisual', 'func': ':call zencoding#balanceTag(2)'}, + \ {'mode': 'v', 'var': 'user_zen_balancetagoutward_key', 'key': 'D', 'plug': 'ZenCodingBalanceTagOutwardVisual', 'func': ':call zencoding#balanceTag(-2)'}, + \ {'mode': 'v', 'var': 'user_zen_mergelines_key', 'key': 'm', 'plug': 'ZenCodingMergeLines', 'func': ':call zencoding#mergeLines()'}, + \ {'mode': 'v', 'var': 'user_zen_codepretty_key', 'key': 'c', 'plug': 'ZenCodingCodePretty', 'func': ':call zencoding#codePretty()'}, + \] + + if !hasmapto(''.item.plug, item.mode) + exe item.mode . 'noremap ' . item.plug . ' ' . item.func + endif + if !exists('g:' . item.var) + endif + if exists('g:' . item.var) + let key = eval('g:' . item.var) + else + let key = g:user_zen_leader_key . item.key + endif + if len(maparg(key, item.mode)) == 0 + exe item.mode . 'map ' . key . ' ' . item.plug + endif + endfor +endfunction + + +if exists('g:user_zen_mode') + let imode = matchstr(g:user_zen_mode, '[ai]') + let nmode = matchstr(g:user_zen_mode, '[an]') + let vmode = matchstr(g:user_zen_mode, '[av]') + + if !empty(imode) + call s:install_plugin_i() + endif + + if !empty(nmode) + call s:install_plugin_n() + endif + + if !empty(vmode) + call s:install_plugin_v() + endif +else + call s:install_plugin_i() + call s:install_plugin_n() + call s:install_plugin_v() +endif + + +delfunction s:install_plugin_i +delfunction s:install_plugin_n +delfunction s:install_plugin_v + +command! -nargs=1 Zen call zencoding#expandAbbr(4, ) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim:set et: diff --git a/sources_forked/zencoding/unittest.vim b/sources_forked/zencoding/unittest.vim new file mode 100755 index 00000000..c4fcc3d2 --- /dev/null +++ b/sources_forked/zencoding/unittest.vim @@ -0,0 +1,794 @@ +let s:sfile = expand('') + +function! s:reload(d) + exe "so" a:d."/plugin/zencoding.vim" + for f in split(globpath(a:d, 'autoload/**/*.vim'), "\n") + silent! exe "so" f + endfor +endfunction + +function! s:show_type(type) + echohl Search | echon "[" a:type "]\n" | echohl None + echo "\r" +endfunction + +function! s:show_category(category) + echohl MatchParen | echon "[" a:category "]\n" | echohl None + echo "\r" +endfunction + +function! s:show_pass(pass) + echohl Title | echo "pass".a:pass."\n" | echohl None +endfunction + +function! s:show_done() + echohl IncSearch | echo "done" | echohl None +endfunction + +function! s:escape(str) + let str = a:str + let str = substitute(str, "\n", '\\n', 'g') + let str = substitute(str, "\t", '\\t', 'g') + return str +endfunction + +function! s:show_title(no, title) + let title = s:escape(a:title) + let width = &columns - 23 + echohl MoreMsg | echon "\rtesting #".printf("%03d", a:no) + echohl None | echon ": " . (len(title) < width ? (title.repeat(' ', width-len(title))) : strpart(title, 0, width)) . ' ... ' +endfunction + +function! s:show_skip(no, title) + let title = s:escape(a:title) + let width = &columns - 23 + echohl WarningMsg | echon "\rskipped #".printf("%03d", a:no) + echohl None | echon ": " . (len(title) < width ? (title.repeat(' ', width-len(title))) : strpart(title, 0, width)) . ' ... ' + echo "" +endfunction + +function! s:show_ok() + echohl Title | echon "ok\n" | echohl None + echo "" +endfunction + +function! s:show_ng(no, expect, got) + echohl WarningMsg | echon "ng\n" | echohl None + echohl ErrorMsg | echo "failed test #".a:no | echohl None + set more + echohl WarningMsg | echo printf("expect(%d):", len(a:expect)) | echohl None + echo join(split(a:expect, "\n", 1), "|\n") + echohl WarningMsg | echo printf("got(%d):", len(a:got)) | echohl None + echo join(split(a:got, "\n", 1), "|\n") + let cs = split(a:expect, '\zs') + for c in range(len(cs)) + if c < len(a:got) + if a:expect[c] != a:got[c] + echohl WarningMsg | echo "differ at:" | echohl None + echo a:expect[c :-1] + break + endif + endif + endfor + echo "" + throw "stop" +endfunction + +function! s:test(...) + let type = get(a:000, 0, '') + let name = get(a:000, 1, '') + let index = get(a:000, 2, '') + + let testgroups = eval(join(filter(split(substitute(join(readfile(s:sfile), "\n"), '.*\nfinish\n', '', ''), '\n', 1), "v:val !~ '^\"'"))) + for testgroup in testgroups + if len(type) > 0 && testgroup.type != type | continue | endif + call s:show_type(testgroup.type) + for category in testgroup.categories + if len(name) > 0 && substitute(category.name,' ','_','g') != name | continue | endif + call s:show_category(category.name) + let tests = category.tests + let start = reltime() + for n in range(len(tests)) + if len(index) > 0 && n != index | continue | endif + let query = tests[n].query + let result = tests[n].result + if has_key(tests[n], 'skip') && tests[n].skip != 0 + call s:show_skip(n+1, query) + continue + endif + if stridx(query, '$$$$') != -1 + silent! 1new + silent! exe "setlocal ft=".testgroup.type + silent! let key = matchstr(query, '.*\$\$\$\$\zs.*\ze\$\$\$\$') + if len(key) > 0 + exe printf('let key = "%s"', key) + else + let key = "\," + endif + silent! let query = substitute(query, '\$\$\$\$.*\$\$\$\$', '$$$$', '') + silent! call setline(1, split(query, "\n")) + let cmd = "normal gg0/\\$\\$\\$\\$\ri\\\\".key + if stridx(result, '$$$$') != -1 + let cmd .= '$$$$' + endif + silent! exe cmd + unlet! res | let res = join(getline(1, line('$')), "\n") + silent! bw! + call s:show_title(n+1, query) + else + call s:show_title(n+1, query) + unlet! res | let res = zencoding#ExpandWord(query, testgroup.type, 0) + endif + if stridx(result, '$$$$') != -1 + if res ==# result + call s:show_ok() + else + call s:show_ng(n+1, result, res) + endif + else + if res ==# result + call s:show_ok() + else + call s:show_ng(n+1, result, res) + endif + endif + endfor + call s:show_pass(reltimestr(reltime(start))) + endfor + endfor +endfunction + +function! s:do_tests(...) + try + if exists('g:user_zen_settings') + let s:old_user_zen_settings = g:user_zen_settings + let g:user_zen_settings = { 'indentation': "\t" } + endif + let oldmore = &more + call s:reload(fnamemodify(s:sfile, ':h')) + let &more = 0 + call call('s:test', a:000) + call s:show_done() + catch + echohl ErrorMsg | echomsg v:exception | echohl None + finally + let &more=oldmore + if exists('g:user_zen_settings') + let g:user_zen_settings = s:old_user_zen_settings + endif + endtry +endfunction + +function! g:zencoding_unittest_complete(arglead, cmdline, cmdpos) + let args = split(a:cmdline, '\s\+', 1) + let testgroups = eval(join(filter(split(substitute(join(readfile(s:sfile), "\n"), '.*\nfinish\n', '', ''), '\n', 1), "v:val !~ '^\"'"))) + try + if len(args) == 2 + return filter(map(testgroups, 'v:val.type'), 'stridx(v:val,args[1])!=-1') + elseif len(args) == 3 + return map(filter(testgroups, 'v:val.type==args[1]')[0].categories, 'substitute(v:val.name," ","_","g")') + endif + catch + endtry + return [] +endfunction + +command! -nargs=* -complete=customlist,g:zencoding_unittest_complete ZenCodingUnitTest call s:do_tests() +if s:sfile == expand('%:p') + ZenCodingUnitTest +endif + +finish +[ +{ + 'type': "html", + 'categories': [ + { + 'name': 'expand abbreviation', + 'tests': [ + { + 'query': "div", + 'result': "
    \n", + }, + { + 'query': "div#wrapper", + 'result': "
    \n", + }, + { + 'query': "div.box", + 'result': "
    \n", + }, + { + 'query': "a[title=TITLE]", + 'result': "\n", + }, + { + 'query': "div#wrapper.box", + 'result': "
    \n", + }, + { + 'query': "div#wrapper.box.current", + 'result': "
    \n", + }, + { + 'query': "div#wrapper.box.current[title=TITLE rel]", + 'result': "
    \n", + }, + { + 'query': "div#main+div#sub", + 'result': "
    \n
    \n", + }, + { + 'query': "div#main>div#sub", + 'result': "
    \n\t
    \n
    \n", + }, + { + 'query': "html:xt>div#header>div#logo+ul#nav>li.item-$*5>a", + 'result': "\n\n\n\t\n\t\n\n\n\t
    \n\t\t
    \n\t\t
      \n\t\t\t
    • \n\t\t\t
    • \n\t\t\t
    • \n\t\t\t
    • \n\t\t\t
    • \n\t\t
    \n\t
    \n\t\n\n", + }, + { + 'query': "ol>li*2", + 'result': "
      \n\t
    1. \n\t
    2. \n
    \n", + }, + { + 'query': "a", + 'result': "\n", + }, + { + 'query': "obj", + 'result': "\n", + }, + { + 'query': "cc:ie6>p+blockquote#sample$.so.many.classes*2", + 'result': "", + }, + { + 'query': "html:4t>div#wrapper>div#header+div#contents+div#footer", + 'result': "\n\n\n\t\n\t\n\n\n\t
    \n\t\t
    \n\t\t
    \n\t\t
    \n\t
    \n\t\n\n", + }, + { + 'query': "a[href=http://www.google.com/].foo#hoge", + 'result': "\n", + }, + { + 'query': "a[href=http://www.google.com/]{Google}", + 'result': "Google\n", + }, + { + 'query': "{ZenCoding}", + 'result': "ZenCoding", + }, + { + 'query': "a+b", + 'result': "\n\n", + }, + { + 'query': "a>b>i\n", + }, + { + 'query': "a>b>i^b", + 'result': "\n", + }, + { + 'query': "a>b>i<\n\n", + }, + { + 'query': "a>b>i^^b", + 'result': "\n\n", + }, + { + 'query': "blockquote>b>i<\n\n", + }, + { + 'query': "blockquote>b>i^^b", + 'result': "
    \n\n", + }, + { + 'query': "a[href=foo][class=bar]", + 'result': "\n", + }, + { + 'query': "a[a=b][b=c=d][e]{foo}*2", + 'result': "foo\nfoo\n", + }, + { + 'query': "a[a=b][b=c=d][e]*2{foo}", + 'result': "\n\nfoo", + }, + { + 'query': "a*2{foo}a", + 'result': "\n\nfoo\n", + }, + { + 'query': "a{foo}*2>b", + 'result': "foo\nfoo\n", + }, + { + 'query': "a*2{foo}>b", + 'result': "\n\nfoo", + }, + { + 'query': "table>tr>td.name#foo+td*3", + 'result': "\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n
    \n", + }, + { + 'query': "div#header + div#footer", + 'result': "
    \n
    \n", + }, + { + 'query': "#header + div#footer", + 'result': "
    \n
    \n", + }, + { + 'query': "#header > ul > li < p{Footer}", + 'result': "
    \n\t
      \n\t\t
    • \n\t
    \n\t

    Footer

    \n
    \n", + }, + { + 'query': "#header > ul > li ^ p{Footer}", + 'result': "
    \n\t
      \n\t\t
    • \n\t
    \n\t

    Footer

    \n
    \n", + }, + { + 'query': "a#foo$$$*3", + 'result': "\n\n\n", + }, + { + 'query': "ul+", + 'result': "
      \n\t
    • \n
    \n", + }, + { + 'query': "table+", + 'result': "\n\t\n\t\t\n\t\n
    \n", + }, + { + 'query': "#header>li<#content", + 'result': "
    \n\t
  • \n
    \n
    \n", + }, + { + 'query': "#header>li^#content", + 'result': "
    \n\t
  • \n
    \n
    \n", + }, + { + 'query': "(#header>li)<#content", + 'result': "
    \n\t
  • \n
    \n
    \n", + }, + { + 'query': "(#header>li)^#content", + 'result': "
    \n\t
  • \n
    \n
    \n", + }, + { + 'query': "a>b>i<\n
    \n", + }, + { + 'query': "a>b>i^^div", + 'result': "\n
    \n", + }, + { + 'query': "(#header>h1)+#content+#footer", + 'result': "
    \n\t

    \n
    \n
    \n
    \n", + }, + { + 'query': "(#header>h1)+(#content>(#main>h2+div#entry$.section*5>(h3>a)+div>p*3+ul+)+(#utilities))+(#footer>address)", + 'result': "
    \n\t

    \n
    \n
    \n\t
    \n\t\t

    \n\t\t
    \n\t\t\t

    \n\t\t\t
    \n\t\t\t\t

    \n\t\t\t\t

    \n\t\t\t\t

    \n\t\t\t\t
      \n\t\t\t\t\t
    • \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t

    \n\t\t\t
    \n\t\t\t\t

    \n\t\t\t\t

    \n\t\t\t\t

    \n\t\t\t\t
      \n\t\t\t\t\t
    • \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t

    \n\t\t\t
    \n\t\t\t\t

    \n\t\t\t\t

    \n\t\t\t\t

    \n\t\t\t\t
      \n\t\t\t\t\t
    • \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t

    \n\t\t\t
    \n\t\t\t\t

    \n\t\t\t\t

    \n\t\t\t\t

    \n\t\t\t\t
      \n\t\t\t\t\t
    • \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t\t
    \n\t\t\t

    \n\t\t\t
    \n\t\t\t\t

    \n\t\t\t\t

    \n\t\t\t\t

    \n\t\t\t\t
      \n\t\t\t\t\t
    • \n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n\t
    \n
    \n
    \n\t
    \n
    \n", + }, + { + 'query': "(div>(ul*2)*2)+(#utilities)", + 'result': "
    \n\t
      \n\t
        \n\t
          \n\t
            \n
            \n
            \n", + }, + { + 'query': "table>(tr>td*3)*4", + 'result': "\n\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\n
            \n", + }, + { + 'query': "(((a#foo+a#bar)*2)*3)", + 'result': "\n\n\n\n\n\n\n\n\n\n\n\n", + }, + { + 'query': "div#box$*3>h3+p*2", + 'result': "
            \n\t

            \n\t

            \n\t

            \n
            \n
            \n\t

            \n\t

            \n\t

            \n
            \n
            \n\t

            \n\t

            \n\t

            \n
            \n" + }, + { + 'query': "div#box.foo$$$.bar$$$*3", + 'result': "
            \n
            \n
            \n", + }, + { + 'query': "div#box$*3>h3+p.bar*2|e", + 'result': "<div id=\"box1\">\n\t<h3></h3>\n\t<p class=\"bar\"></p>\n\t<p class=\"bar\"></p>\n</div>\n<div id=\"box2\">\n\t<h3></h3>\n\t<p class=\"bar\"></p>\n\t<p class=\"bar\"></p>\n</div>\n<div id=\"box3\">\n\t<h3></h3>\n\t<p class=\"bar\"></p>\n\t<p class=\"bar\"></p>\n</div>\n", + }, + { + 'query': "div>div#page>p.title+p|c", + 'result': "
            \n\t\n\t
            \n\t\t\n\t\t

            \n\t\t\n\t\t

            \n\t
            \n\t\n
            \n", + }, + { + 'query': "link:css", + 'result': "\n", + }, + { + 'query': "a[title=\"Hello', world\" rel]", + 'result': "\n", + }, + { + 'query': "div>a#foo{bar}", + 'result': "\n", + }, + { + 'query': ".content{Hello!}", + 'result': "
            Hello!
            \n", + }, + { + 'query': "div.logo+(div#navigation)+(div#links)", + 'result': "
            \n
            \n
            \n", + }, + { + 'query': "h1{header}+{Text}+a[href=http://link.org]{linktext}+{again some text}+a[href=http://anoterlink.org]{click me!}+{some final text}", + 'result': "

            header

            \nTextlinktext\nagain some textclick me!\nsome final text", + }, + { + 'query': "a{&}+div{&&}", + 'result': "&\n
            &&
            \n", + }, + { + 'query': "span$$$$\\,$$$$", + 'result': "", + }, + { + 'query': "foo span$$$$\\,$$$$", + 'result': "foo ", + }, + { + 'query': "foo span$$$$\\,$$$$ bar", + 'result': "foo bar", + }, + { + 'query': "foo $$$$\\ve\\,p\\$$$$bar baz", + 'result': "foo

            bar

            baz", + }, + { + 'query': "foo $$$$\\vee\\,p\\$$$$bar baz", + 'result': "foo

            bar baz

            ", + }, + { + 'query': "f div.boxes>article.box2>header>(hgroup>h2{aaa}+h3{bbb})+p{ccc}$$$$", + 'result': "f
            \n\t
            \n\t\t
            \n\t\t\t
            \n\t\t\t\t

            aaa

            \n\t\t\t\t

            bbb

            \n\t\t\t
            \n\t\t\t

            ccc

            \n\t\t
            \n\t
            \n
            ", + }, + { + 'query': "div.boxes>(div.box2>section>h2{a}+p{b})+(div.box1>section>h2{c}+p{d}+p{e}+(bq>h2{f}+h3{g})+p{h})", + 'result': "
            \n\t
            \n\t\t
            \n\t\t\t

            a

            \n\t\t\t

            b

            \n\t\t
            \n\t
            \n\t
            \n\t\t
            \n\t\t\t

            c

            \n\t\t\t

            d

            \n\t\t\t

            e

            \n\t\t\t
            \n\t\t\t\t

            f

            \n\t\t\t\t

            g

            \n\t\t\t
            \n\t\t\t

            h

            \n\t\t
            \n\t
            \n
            \n", + }, + { + 'query': "(div>(label+input))+div", + 'result': "
            \n\t\n\t\n
            \n
            \n", + }, + { + 'query': "test1\ntest2\ntest3$$$$\\ggVG\\,ul>li>span*>a\\$$$$", + 'result': "", + }, + { + 'query': "test1\ntest2\ntest3$$$$\\ggVG\\,input[type=input value=$#]*\\$$$$", + 'result': "\n\n", + }, + { + 'query': "div#id-$*5>div#id2-$", + 'result': "
            \n\t
            \n
            \n
            \n\t
            \n
            \n
            \n\t
            \n
            \n
            \n\t
            \n
            \n
            \n\t
            \n
            \n", + }, + { + 'query': "{test case $ }*3", + 'result': "test case 1 test case 2 test case 3 ", + }, + { + 'query': "{test case $${nr}}*3", + 'result': "test case 1\ntest case 2\ntest case 3\n", + }, + { + 'query': "{test case \\$ }*3", + 'result': "test case $ test case $ test case $ ", + }, + { + 'query': "{test case $$$ }*3", + 'result': "test case 001 test case 002 test case 003 ", + }, + { + 'query': "a[title=$#]{foo}", + 'result': "foo\n", + }, + ], + }, + { + 'name': 'split join tag', + 'tests': [ + { + 'query': "
            \n\t$$$$\\j$$$$\n
            ", + 'result': "
            \n\t\n
            ", + }, + { + 'query': "
            \n\tj$$$$/>\n
            ", + 'result': "
            \n\t\n
            ", + }, + ], + }, + { + 'name': 'toggle comment', + 'tests': [ + { + 'query': "
            \n\t$$$$\\/$$$$\n
            ", + 'result': "
            \n\t\n
            ", + }, + { + 'query': "
            \n\t\n
            ", + 'result': "
            \n\t\n
            ", + }, + ], + }, + { + 'name': 'image size', + 'tests': [ + { + 'query': "img[src=http://mattn.kaoriya.net/images/logo.png]$$$$\\,\\i$$$$", + 'result': "\"\"", + }, + { + 'query': "img[src=/logo.png]$$$$\\,\\i$$$$", + 'result': "\"\"", + }, + ], + }, + { + 'name': 'move next prev', + 'tests': [ + { + 'query': "foo+bar+baz[dankogai=\"\"]$$$$\\,\\gg0\\n\\n\\n\\Byw:%d _\\p$$$$", + 'result': "dankogai", + }, + ], + }, + ], +}, +{ + 'type': 'css', + 'categories': [ + { + 'name': 'expand abbreviation', + 'tests': [ + { + 'query': "@i", + 'result': "@import url();", + }, + { + 'query': "fs:n", + 'result': "font-style: normal;", + }, + { + 'query': "fl:l|fc", + 'result': "float: left;", + }, + { + 'query': "bg+$$$$", + 'result': "background: #FFF url($$$$) 0 0 no-repeat;", + }, + { + 'query': "bg+!$$$$", + 'result': "background: #FFF url($$$$) 0 0 no-repeat !important;", + }, + { + 'query': "m$$$$", + 'result': "margin: $$$$;", + }, + { + 'query': "m0.1p$$$$", + 'result': "margin: 0.1%;", + }, + { + 'query': "m1.0$$$$", + 'result': "margin: 1.0em;", + }, + { + 'query': "m2$$$$", + 'result': "margin: 2px;", + }, + { + 'query': "bdrs10$$$$", + 'result': "border-radius: 10px;", + }, + { + 'query': "-bdrs20$$$$", + 'result': "-webkit-border-radius: 20px;\n-moz-border-radius: 20px;\nborder-radius: 20px;", + }, + { + 'query': "lg(top,#fff,#000)$$$$", + 'result': "background-image: -webkit-gradient(top, 0 0, 0 100, from(#fff), to(#000));\nbackground-image: -webkit-linear-gradient(#fff, #000);\nbackground-image: -moz-linear-gradient(#fff, #000);\nbackground-image: -o-linear-gradient(#fff, #000);\nbackground-image: linear-gradient(#fff, #000);\n", + }, + { + 'query': "m10-5-0$$$$", + 'result': "margin: 10px 5px 0px;", + }, + { + 'query': "m-10--5$$$$", + 'result': "margin: -10px -5px;", + }, + { + 'query': "m10-auto$$$$", + 'result': "margin: 10px auto;", + }, + { + 'query': "w100p$$$$", + 'result': "width: 100%;", + }, + { + 'query': "h50e$$$$", + 'result': "height: 50em;", + }, + { + 'query': "(bg+)+c$$$$", + 'result': "background: #FFF url($$$$) 0 0 no-repeat;\ncolor: #000;", + }, + ], + }, + ], +}, +{ + 'type': 'haml', + 'categories': [ + { + 'name': 'expand abbreviation', + 'tests': [ + { + 'query': "div>p+ul#foo>li.bar$[foo=bar][bar=baz]*3>{baz}", + 'result': "%div\n %p\n %ul#foo\n %li.bar1{ :foo => \"bar\", :bar => \"baz\" } baz\n %li.bar2{ :foo => \"bar\", :bar => \"baz\" } baz\n %li.bar3{ :foo => \"bar\", :bar => \"baz\" } baz\n", + }, + { + 'query': "div>p+ul#foo>li.bar$[foo=bar][bar=baz]*3>{baz}|haml", + 'result': "%div\n %p\n %ul#foo\n %li.bar1{ :foo => \"bar\", :bar => \"baz\" } baz\n %li.bar2{ :foo => \"bar\", :bar => \"baz\" } baz\n %li.bar3{ :foo => \"bar\", :bar => \"baz\" } baz\n", + }, + { + 'query': "a*3|haml", + 'result': "%a{ :href => \"\" }\n%a{ :href => \"\" }\n%a{ :href => \"\" }\n", + }, + { + 'query': ".content{Hello!}|haml", + 'result': "%div.content Hello!\n", + }, + { + 'query': "a[title=$#]{foo}", + 'result': "%a{ :href => \"\", :title => \"foo\" } foo\n", + }, + ], + }, + { + 'name': 'expand abbreviation', + 'tests': [ + { + 'query': "%a foo\n bar$$$$\\j$$$$", + 'result': "%a ", + }, + { + 'query': "$$$$\\j$$$$%a ", + 'result': "%a $$$$", + }, + ], + }, + { + 'name': 'toggle comment', + 'tests': [ + { + 'query': "%a{ :href => \"http://www.google.com\"$$$$\\/$$$$ } hello", + 'result': "-# %a{ :href => \"http://www.google.com\" } hello", + }, + { + 'query': "-# %a{ :href => \"http://www.google.com\"$$$$\\/$$$$ } hello", + 'result': "%a{ :href => \"http://www.google.com\" } hello", + }, + ], + }, + ], +}, +{ + 'type': 'slim', + 'categories': [ + { + 'name': 'expand abbreviation', + 'tests': [ + { + 'query': "div>p+ul#foo>li.bar$[foo=bar][bar=baz]*3>{baz}", + 'result': "div\n p\n ul id=\"foo\"\n li class=\"bar1\" foo=\"bar\" bar=\"baz\"\n | baz\n li class=\"bar2\" foo=\"bar\" bar=\"baz\"\n | baz\n li class=\"bar3\" foo=\"bar\" bar=\"baz\"\n | baz\n", + }, + { + 'query': "div>p+ul#foo>li.bar$[foo=bar][bar=baz]*3>{baz}|slim", + 'result': "div\n p\n ul id=\"foo\"\n li class=\"bar1\" foo=\"bar\" bar=\"baz\"\n | baz\n li class=\"bar2\" foo=\"bar\" bar=\"baz\"\n | baz\n li class=\"bar3\" foo=\"bar\" bar=\"baz\"\n | baz\n", + }, + { + 'query': "a*3|slim", + 'result': "a href=\"\"\na href=\"\"\na href=\"\"\n", + }, + { + 'query': ".content{Hello!}|slim", + 'result': "div class=\"content\"\n | Hello!\n", + }, + { + 'query': "a[title=$#]{foo}", + 'result': "a href=\"\" title=\"foo\"\n | foo\n", + }, + ], + }, + { + 'name': 'split join tag', + 'tests': [ + { + 'query': "a\n | foo$$$$\\j$$$$", + 'result': "a", + }, + { + 'query': "a$$$$\\j$$$$", + 'result': "a\n | $$$$", + }, + ], + }, + { + 'name': 'toggle comment', + 'tests': [ + { + 'query': "a href=\"http://www.google.com\"$$$$\\/$$$$\n | hello", + 'result': "/a href=\"http://www.google.com\"\n | hello", + }, + { + 'query': "/a href=\"http://www.google.com\"$$$$\\/$$$$\n | hello", + 'result': "a href=\"http://www.google.com\"\n | hello", + }, + ], + }, + ], +}, +{ + 'type': 'xsl', + 'categories': [ + { + 'name': 'expand abbreviation', + 'tests': [ + { + 'query': "vari", + 'result': "\n", + }, + { + 'query': "ap>wp", + 'result': "\n\t\n\n", + }, + ], + }, + ], +}, +{ + 'type': 'xsd', + 'categories': [ + { + 'name': 'expand abbreviation', + 'tests': [ + { + 'query': "xsd:w3c", + 'result': "\n\n\t\n", + }, + ], + }, + ], +}, +{ + 'type': 'mustache', + 'categories': [ + { + 'name': 'expand abbreviation', + 'tests': [ + { + 'query': "div#{{foo}}", + 'result': "
            \n", + }, + { + 'query': "div.{{foo}}", + 'result': "
            \n", + }, + ], + }, + ], +}, +] +" vim:set et: diff --git a/sources_forked/zencoding/zencoding.vim.vimup b/sources_forked/zencoding/zencoding.vim.vimup new file mode 100755 index 00000000..72608e48 --- /dev/null +++ b/sources_forked/zencoding/zencoding.vim.vimup @@ -0,0 +1,265 @@ +script_name: ZenCoding.vim +script_id: '2981' +script_type: utility +script_package: zencoding-vim.zip +script_version: '0.80' +required_vim_version: '7.0' +summary: vim plugins for HTML and CSS hi-speed coding. + +detailed_description: | + + This is vim script support expanding abbreviation like zen-coding. + ref: http://code.google.com/p/zen-coding/ + + There is a movie using zencoding.vim + ref: http://mattn.github.com/zencoding-vim + + Source Repository. + ref: http://github.com/mattn/zencoding-vim + + Type abbreviation + +------------------------------------- + | html:5_ + +------------------------------------- + "_" is a cursor position. and type "," (Ctrl + y and Comma) + NOTE: Don't worry about key map. you can change it easily. + +------------------------------------- + | + | + | + | + | + | + | + | _ + | + | + +------------------------------------- + Type following + +------------------------------------- + | div#foo$*2>div.bar + +------------------------------------- + And type "," + +------------------------------------- + |
            + |
            _
            + |
            + |
            + |
            + |
            + | _ + +------------------------------------- + + Tutorial: + + http://github.com/mattn/zencoding-vim/raw/master/TUTORIAL + + How work this: + + http://mattn.github.com/zencoding-vim + + Tips: + + You can customize behavior of expanding with overriding config. + This configuration will be marged at loading plugin. + + let g:user_zen_settings = { + \ 'indentation' : ' ', + \ 'perl' : { + \ 'aliases' : { + \ 'req' : 'require ' + \ }, + \ 'snippets' : { + \ 'use' : "use strict\nuse warnings\n\n", + \ 'warn' : "warn \"|\";", + \ } + \ } + \} + + let g:user_zen_expandabbr_key = '' + + let g:use_zen_complete_tag = 1 + + You can set language attribute in html using zen_settings['lang']. + +install_details: | + + # cd ~/.vim + # unzip zencoding-vim.zip + + or if you install pathogen.vim: + + # cd ~/.vim/bundle # or make directory + # unzip /path/to/zencoding-vim.zip + + if you get sources from repository: + + # cd ~/.vim/bundle # or make directory + # git clone http://github.com/mattn/zencoding-vim.git + +versions: +- '0.80': | + This is an upgrade for ZenCoding.vim: add emmet features. +- '0.74': | + This is an upgrade for ZenCoding.vim: many bug fixes. +- '0.73': | + This is an upgrade for ZenCoding.vim: many bug fixes. and support slim format (experimental). +- '0.72': | + This is an upgrade for ZenCoding.vim: + [fix] fix finding tokens. +- '0.71': | + This is an upgrade for ZenCoding.vim: + [fix] fix finding begin of tokens. +- '0.70': | + This is an upgrade for ZenCoding.vim: + [mod] Changed behavior of expanding. "div div>a|" should keep first div element. + [add] Supported slim formatter. +- '0.60': | + This is an upgrade for ZenCoding.vim: + [fix] fixed expanding {{}}. +- '0.59': | + This is an upgrade for ZenCoding.vim: + [fix] fixed toggleComment and mny bugs. +- '0.58': | + This is an upgrade for ZenCoding.vim: + [fix] fixed 'foo+' style expandos. +- '0.57': | + This is an upgrade for ZenCoding.vim: + [fix] fixed expandos that don't work 'choose' in xsl. +- '0.56': | + This is an upgrade for ZenCoding.vim: + [fix] fixed contents parser. +- '0.55': | + uploaded again: sorry, files was old. +- '0.54': | + [add] support sass, xsd. + [fix] expanding with html tag. + uploaded again: sorry, fileformat was DOS. +- '0.53': | + [fix] gif width/height was swapped. +- '0.52': | + [fix] broken wrap expanding. +- '0.51': | + This is an upgrade for ZenCoding.vim: + [fix] wrap expanding with '&'. + [fix] expand .content to class="content". + [fix] haml expanding. + [fix] bg+ snippet +- '0.50': | + This is an upgrade for ZenCoding.vim: + [fix] fixed parsing '#{{foo}}' and '.{{bar}}'. +- '0.49': | + This is an upgrade for ZenCoding.vim: + [doc] add help manual. +- '0.48': | + This is an upgrade for ZenCoding.vim: + [fix] install mappings to global. +- '0.47': | + This is an upgrade for ZenCoding.vim: + [drastic changes] enable autoload. you should whole replace older files. + package was empty. upload again. +- '0.46': | + This is an upgrade for ZenCoding.vim: + [drastic changes] enable autoload. you should whole replace older files. +- '0.45': | + This is an upgrade for ZenCoding.vim: + fixed attribute parsing like: a[href="hello', world" rel]. +- '0.44': | + This is an upgrade for ZenCoding.vim: + fixed checking whether have mapping using maparg() / hasmapto(). +- '0.43': | + This is an upgrade for ZenCoding.vim: + fixed behavior for nested block. like "html:5>#page>(header#globalHeader>(hgroup>h1+h2)+(nav>ul>li*3>a)+(form>p.siteSearch>input+input[type=button]))+(#contents>(#main>(section>h2+p*5)+p.pagetop>a[href=#page])+(#sub>p+(nav>ul>li>a)))+(footer#globalFoooter>(ul>li>a)+(p.copyright>small))" +- '0.42': | + This is an upgrade for ZenCoding.vim: + fixed select/option indent. +- '0.41': | + This is an upgrade for ZenCoding.vim: + fixed default filter. when using 'e' filter, output become empty. +- '0.40': | + This is an upgrade for ZenCoding.vim: + add the pure vimscript code for 'get image size'. you can use it without perl interface just now. + change key assign of ZenCodingExpandWord from ',' to ';'. it don't effect to most users. +- '0.39': | + This is an upgrade for ZenCoding.vim: fixed problem about 'selection'. see http://github.com/mattn/zencoding-vim/issues/#issue/2 +- '0.38': | + This is an upgrade for ZenCoding.vim: use v7h"_s instead of v7hs for backspace. +- '0.37': | + This is an upgrade for ZenCoding.vim: fixed problem that won't working with some 'backspace' options. +- '0.36': | + This is an upgrade for ZenCoding.vim: fixed problem that filter does not work. +- '0.35': | + This is an upgrade for ZenCoding.vim: enable zencoding for other languages. (meaning php also) +- '0.34': | + This is an upgrade for ZenCoding.vim: enable zencoding for xsl. (you should add ~/.vim/ftplugin/xslt/zencoding.vim) +- '0.33': | + This is an upgrade for ZenCoding.vim: fixed problem breaking multibyte when cursor is in a part of line. enabled zencoding for javascript in html. +- '0.32': | + This is an upgrade for ZenCoding.vim: fixed indentation. supported extends so that you can enable zencoding for php/xhtml/haml other's section 14 in http://github.com/mattn/zencoding-vim/raw/master/TUTORIAL +- '0.31': | + This is an upgrade for ZenCoding.vim: fixed indentation and $$$ problem. fixed about missing support multiple classes. +- '0.30': | + This is an upgrade for ZenCoding.vim: Fixed key assign. +- '0.29': | + This is an upgrade for ZenCoding.vim: Changed leading key to '' from ''. +- '0.28': | + This is an upgrade for ZenCoding.vim: supported 'Balance Tag Inward/Outward', 'Go to Next/Previous Edit Point', 'Update Size', 'Remove Tag', 'Split/Join Tag', 'Toggle Comment' +- '0.27': | + This is an upgrade for ZenCoding.vim: fixed problem that can't work on the part of multibyte characters. fixed inline elements behavior. +- '0.26': | + This is an upgrade for ZenCoding.vim: The count of '(((a#foo + a#bar)*2)*3)' should be 12. +- '0.25': | + This is an upgrade for ZenCoding.vim: store undo before working. good luck about 'table>(tr>td*3)*4'. +- '0.24': | + This is an upgrade for ZenCoding.vim: fixed behavior of parsing area of visual selection. +- '0.23': | + This is an upgrade for ZenCoding.vim: pre-expand '#header>li<#content' to 'div#header>lili'. fix undo ring. support visual selection. when type trigger key on visual select, it request you leader like 'ul>li'. if you give 'ul>li*' as leader, you'll get each separate 'ul>li' tags. and when you give 'blockquote' as leader, you'll get blocked text. +- '0.21': | + This is an upgrade for ZenCoding.vim: treat xhtml as html. +- '0.20': | + This is an upgrade for ZenCoding.vim: add option use_zen_complete_tag for complete abbr. +- '0.19': | + This is an upgrade for ZenCoding.vim: fixed problem that couldn't expand 'link:css' correctly. +- '0.18': | + This is an upgrade for ZenCoding.vim: ignore duplicate key map. +- '0.17': | + This is an upgrade for ZenCoding.vim: fixed key map. +- '0.16': | + This is an upgrade for ZenCoding.vim: fixed problem 'endless loop'. +- '0.15': | + This is an upgrade for ZenCoding.vim: set default filetype to 'html'. +- '0.14': | + This is an upgrade for ZenCoding.vim: fixed tag name like 'fs:n' in 'css'. +- '0.14': | + This is an upgrade for ZenCoding.vim: indentation for each languages. +- '0.13': | + This is an upgrade for ZenCoding.vim: user key map. +- '0.12': | + This is an upgrade for ZenCoding.vim: few extensive notation. +- '0.11': | + This is an upgrade for ZenCoding.vim: fixed indent. +- '0.10': | + This is an upgrade for ZenCoding.vim: fixed behavior of '+' operator +- '0.9': | + This is an upgrade for ZenCoding.vim: fixed single line behavior +- '0.8': | + This is an upgrade for ZenCoding.vim: support 'a[href=http://www.google.com]{Google}' +- '0.7': | + This is an upgrade for ZenCoding.vim: fixed behavior in 'a+b'. +- '0.6': | + This is an upgrade for ZenCoding.vim: fixed strange behavior about 'b_'. +- '0.5': | + This is an upgrade for ZenCoding.vim: recover rest part in line. +- '0.4': | + This is an upgrade for ZenCoding.vim: fixed cursor position. fixed ${lang} replacement. +- '0.3': | + This is an upgrade for ZenCoding.vim: fixed line expanding. +- '0.2': | + This is an upgrade for ZenCoding.vim: fixed problem that moving cursor with expanding. +- '0.1': | + Initial upload + +# __END__ +# vim: filetype=yaml diff --git a/sources_non_forked/ack.vim/README.md b/sources_non_forked/ack.vim/README.md index 50d23686..e7182452 100644 --- a/sources_non_forked/ack.vim/README.md +++ b/sources_non_forked/ack.vim/README.md @@ -18,9 +18,13 @@ Install on Debian / Ubuntu with: sudo apt-get install ack-grep -For Debian / Ubuntu you can add this line into your .vimrc: +Install on Fedora with: - let g:ackprg="ack-grep -H --nocolor --nogroup --column" + su -l -c 'yum install ack' + +Install on openSUSE with: + + sudo zypper install ack Install on Gentoo with: @@ -34,10 +38,18 @@ Install with MacPorts: sudo port install p5-app-ack -Install with Gentoo Prefix +Install with Gentoo Prefix: emerge ack +Install on FreeBSD with: + + cd /usr/ports/textproc/p5-ack/ && make install clean + +You can specify a custom ack name and path in your .vimrc like so: + + let g:ackprg=" -H --nocolor --nogroup --column" + Otherwise, you are on your own. ### The Plugin @@ -75,6 +87,10 @@ Just like where you use :grep, :grepadd, :lgrep, and :lgrepadd, you can use `:Ac See ack --help=types for a list of valid types. +### Gotchas ### + +Some characters have special meaning, and need to be escaped your search pattern. For instance, '#'. You have to escape it like this `:Ack '\\\#define foo'` to search for `#define foo`. (From [blueyed in issue #5](https://github.com/mileszs/ack.vim/issues/5).) + ### Keyboard Shortcuts ### In the quickfix window, you can use: @@ -83,6 +99,8 @@ In the quickfix window, you can use: go to preview file (open but maintain focus on ack.vim results) t to open in new tab T to open in new tab silently + h to open in horizontal split + H to open in horizontal split silently v to open in vertical split gv to open in vertical split silently q to close the quickfix window diff --git a/sources_non_forked/ack.vim/doc/ack.txt b/sources_non_forked/ack.vim/doc/ack.txt index 683ef8d0..ec06da3a 100644 --- a/sources_non_forked/ack.vim/doc/ack.txt +++ b/sources_non_forked/ack.vim/doc/ack.txt @@ -43,6 +43,16 @@ shows the results in a split window. directory) for filenames matching the {pattern}. Behaves just like the |:grep| command, but will open the |Quickfix| window for you. +:AckHelp[!] [options] {pattern} *:AckHelp* + + Search vim documentation files for the {pattern}. Behaves just like the + |:Ack| command, but searches only vim documentation .txt files + +:LAckHelp [options] {pattern} *:LAckHelp* + + Just like |:AckHelp| but instead of the |quickfix| list, matches are placed + in the current |location-list|. + Files containing the search term will be listed in the split window, along with the line number of the occurrence, once for each occurrence. on a line in this window will open the file, and place the cursor on the matching @@ -63,6 +73,10 @@ t open in a new tab. T open in new tab silently. +h open in horizontal split. + +H open in horizontal split silently. + v open in vertical split. gv open in vertical split silently. diff --git a/sources_non_forked/ack.vim/plugin/ack.vim b/sources_non_forked/ack.vim/plugin/ack.vim index 55326182..ccd46861 100644 --- a/sources_non_forked/ack.vim/plugin/ack.vim +++ b/sources_non_forked/ack.vim/plugin/ack.vim @@ -2,74 +2,112 @@ " in your path. " On Debian / Ubuntu: " sudo apt-get install ack-grep -" On your vimrc: -" let g:ackprg="ack-grep -H --nocolor --nogroup --column" -" " With MacPorts: " sudo port install p5-app-ack +" With Homebrew: +" brew install ack " Location of the ack utility if !exists("g:ackprg") - let g:ackprg="ack -H --nocolor --nogroup --column" + let s:ackcommand = executable('ack-grep') ? 'ack-grep' : 'ack' + let g:ackprg=s:ackcommand." -H --nocolor --nogroup --column" +endif + +if !exists("g:ack_apply_qmappings") + let g:ack_apply_qmappings = !exists("g:ack_qhandler") +endif + +if !exists("g:ack_apply_lmappings") + let g:ack_apply_lmappings = !exists("g:ack_lhandler") +endif + +if !exists("g:ack_qhandler") + let g:ack_qhandler="botright copen" +endif + +if !exists("g:ack_lhandler") + let g:ack_lhandler="botright lopen" endif function! s:Ack(cmd, args) - redraw - echo "Searching ..." + redraw + echo "Searching ..." - " If no pattern is provided, search for the word under the cursor - if empty(a:args) - let l:grepargs = expand("") - else - let l:grepargs = a:args - end + " If no pattern is provided, search for the word under the cursor + if empty(a:args) + let l:grepargs = expand("") + else + let l:grepargs = a:args . join(a:000, ' ') + end - " Format, used to manage column jump - if a:cmd =~# '-g$' - let g:ackformat="%f" - else - let g:ackformat="%f:%l:%c:%m" - end + " Format, used to manage column jump + if a:cmd =~# '-g$' + let g:ackformat="%f" + else + let g:ackformat="%f:%l:%c:%m" + end - let grepprg_bak=&grepprg - let grepformat_bak=&grepformat - try - let &grepprg=g:ackprg - let &grepformat=g:ackformat - silent execute a:cmd . " " . l:grepargs - finally - let &grepprg=grepprg_bak - let &grepformat=grepformat_bak - endtry + let grepprg_bak=&grepprg + let grepformat_bak=&grepformat + try + let &grepprg=g:ackprg + let &grepformat=g:ackformat + silent execute a:cmd . " " . escape(l:grepargs, '|') + finally + let &grepprg=grepprg_bak + let &grepformat=grepformat_bak + endtry - if a:cmd =~# '^l' - botright lopen - else - botright copen - endif + if a:cmd =~# '^l' + exe g:ack_lhandler + let l:apply_mappings = g:ack_apply_lmappings + else + exe g:ack_qhandler + let l:apply_mappings = g:ack_apply_qmappings + endif + if l:apply_mappings exec "nnoremap q :ccl" exec "nnoremap t T" exec "nnoremap T TgT" exec "nnoremap o " exec "nnoremap go " - exec "nnoremap v v" - exec "nnoremap gv v" + exec "nnoremap h K" + exec "nnoremap H Kb" + exec "nnoremap v HbJt" + exec "nnoremap gv HbJ" + endif - " If highlighting is on, highlight the search keyword. - if exists("g:ackhighlight") - let @/=a:args - set hlsearch - end + " If highlighting is on, highlight the search keyword. + if exists("g:ackhighlight") + let @/=a:args + set hlsearch + end - redraw! + redraw! endfunction function! s:AckFromSearch(cmd, args) - let search = getreg('/') - " translate vim regular expression to perl regular expression. - let search = substitute(search,'\(\\<\|\\>\)','\\b','g') - call s:Ack(a:cmd, '"' . search .'" '. a:args) + let search = getreg('/') + " translate vim regular expression to perl regular expression. + let search = substitute(search,'\(\\<\|\\>\)','\\b','g') + call s:Ack(a:cmd, '"' . search .'" '. a:args) +endfunction + +function! s:GetDocLocations() + let dp = '' + for p in split(&rtp,',') + let p = p.'/doc/' + if isdirectory(p) + let dp = p.'*.txt '.dp + endif + endfor + return dp +endfunction + +function! s:AckHelp(cmd,args) + let args = a:args.' '.s:GetDocLocations() + call s:Ack(a:cmd,args) endfunction command! -bang -nargs=* -complete=file Ack call s:Ack('grep',) @@ -78,3 +116,5 @@ command! -bang -nargs=* -complete=file AckFromSearch call s:AckFromSearch('grep< command! -bang -nargs=* -complete=file LAck call s:Ack('lgrep', ) command! -bang -nargs=* -complete=file LAckAdd call s:Ack('lgrepadd', ) command! -bang -nargs=* -complete=file AckFile call s:Ack('grep -g', ) +command! -bang -nargs=* -complete=help AckHelp call s:AckHelp('grep',) +command! -bang -nargs=* -complete=help LAckHelp call s:AckHelp('lgrep',) diff --git a/sources_non_forked/bufexplorer.zip/README b/sources_non_forked/bufexplorer.zip/README deleted file mode 100644 index 0975ab13..00000000 --- a/sources_non_forked/bufexplorer.zip/README +++ /dev/null @@ -1,20 +0,0 @@ -This is a mirror of http://www.vim.org/scripts/script.php?script_id=42 - -With bufexplorer, you can quickly and easily switch between buffers by using the one of the default public interfaces: - - '\be' (normal open) or - '\bs' (force horizontal split open) or - '\bv' (force vertical split open) - -Once the bufexplorer window is open you can use the normal movement keys (hjkl) to move around and then use or to select the buffer you would like to open. If you would like to have the selected buffer opened in a new tab, simply press either or 't'. Please note that when opening a buffer in a tab, that if the buffer is already in another tab, bufexplorer can switch to that tab automatically for you if you would like. More about that in the supplied VIM help. - -Bufexplorer also offers various options including: -- Display the list of buffers in various sort orders including: - - Most Recently Used (MRU) which is the default - - Buffer number - - File name - - File extension - - Full file path name -- Delete buffer from list - -For more about options, sort orders, configuration options, etc. please see the supplied VIM help. diff --git a/sources_non_forked/bufexplorer/README.md b/sources_non_forked/bufexplorer/README.md new file mode 100644 index 00000000..f34dab5e --- /dev/null +++ b/sources_non_forked/bufexplorer/README.md @@ -0,0 +1,39 @@ +created by +--------- +[jeff lanzarotta](http://www.vim.org/account/profile.php?user_id=97) + +script type +---------- +utility + +description +----------- +With bufexplorer, you can quickly and easily switch between buffers by using the one of the default public interfaces: + + '\be' (normal open) or + '\bs' (force horizontal split open) or + '\bv' (force vertical split open) + +Once the bufexplorer window is open you can use the normal movement keys (hjkl) to move around and then use or to select the buffer you would like to open. If you would like to have the selected buffer opened in a new tab, simply press either or 't'. Please note that when opening a buffer in a tab, that if the buffer is already in another tab, bufexplorer can switch to that tab automatically for you if you would like. More about that in the supplied VIM help. + +Bufexplorer also offers various options including: + +* Display the list of buffers in various sort orders including: + * Most Recently Used (MRU) which is the default + * Buffer number + * File name + * File extension + * Full file path name +* Delete buffer from list + +For more about options, sort orders, configuration options, etc. please see the supplied VIM help. + +install details +--------------- +Simply unzip bufexplorer.zip into a directory in your 'runtimepath', usually ~/.vim or c:\vimfiles, and restart Vim. This zip file contains plugin\bufexplorer.vim, and doc\bufexplorer.txt. See ':help add-local-help' on how to add bufexplorer.txt to vim's help system. + +NOTE +---- +Version 7.0.12 and above will ONLY work with 7.0 and above of Vim. + +**IMPORTANT**: If you have a version prior to 7.1.2 that contains an autoload\bufexplorer.vim file, please REMOVE the autoload\bufexlorer.vim AND the plugin\bufexplorer.vim files before installing a new version. diff --git a/sources_non_forked/bufexplorer.zip/doc/bufexplorer.txt b/sources_non_forked/bufexplorer/doc/bufexplorer.txt similarity index 99% rename from sources_non_forked/bufexplorer.zip/doc/bufexplorer.txt rename to sources_non_forked/bufexplorer/doc/bufexplorer.txt index 3864a312..06e92237 100644 --- a/sources_non_forked/bufexplorer.zip/doc/bufexplorer.txt +++ b/sources_non_forked/bufexplorer/doc/bufexplorer.txt @@ -1,4 +1,4 @@ -*bufexplorer.txt* Buffer Explorer Last Change: 16 Feb 2010 +*bufexplorer.txt* Buffer Explorer Last Change: 22 Oct 2010 Buffer Explorer *buffer-explorer* *bufexplorer* Version 7.2.8 diff --git a/sources_non_forked/bufexplorer/doc/tags b/sources_non_forked/bufexplorer/doc/tags new file mode 100644 index 00000000..5432bc98 --- /dev/null +++ b/sources_non_forked/bufexplorer/doc/tags @@ -0,0 +1,24 @@ +bufexplorer bufexplorer.txt /*bufexplorer* +bufexplorer-changelog bufexplorer.txt /*bufexplorer-changelog* +bufexplorer-credits bufexplorer.txt /*bufexplorer-credits* +bufexplorer-customization bufexplorer.txt /*bufexplorer-customization* +bufexplorer-installation bufexplorer.txt /*bufexplorer-installation* +bufexplorer-todo bufexplorer.txt /*bufexplorer-todo* +bufexplorer-usage bufexplorer.txt /*bufexplorer-usage* +bufexplorer-windowlayout bufexplorer.txt /*bufexplorer-windowlayout* +bufexplorer.txt bufexplorer.txt /*bufexplorer.txt* +buffer-explorer bufexplorer.txt /*buffer-explorer* +g:bufExplorerChgWin bufexplorer.txt /*g:bufExplorerChgWin* +g:bufExplorerDefaultHelp bufexplorer.txt /*g:bufExplorerDefaultHelp* +g:bufExplorerDetailedHelp bufexplorer.txt /*g:bufExplorerDetailedHelp* +g:bufExplorerFindActive bufexplorer.txt /*g:bufExplorerFindActive* +g:bufExplorerFuncRef bufexplorer.txt /*g:bufExplorerFuncRef* +g:bufExplorerReverseSort bufexplorer.txt /*g:bufExplorerReverseSort* +g:bufExplorerShowDirectories bufexplorer.txt /*g:bufExplorerShowDirectories* +g:bufExplorerShowRelativePath bufexplorer.txt /*g:bufExplorerShowRelativePath* +g:bufExplorerShowTabBuffer bufexplorer.txt /*g:bufExplorerShowTabBuffer* +g:bufExplorerShowUnlisted bufexplorer.txt /*g:bufExplorerShowUnlisted* +g:bufExplorerSortBy bufexplorer.txt /*g:bufExplorerSortBy* +g:bufExplorerSplitBelow bufexplorer.txt /*g:bufExplorerSplitBelow* +g:bufExplorerSplitOutPathName bufexplorer.txt /*g:bufExplorerSplitOutPathName* +g:bufExplorerSplitRight bufexplorer.txt /*g:bufExplorerSplitRight* diff --git a/sources_non_forked/bufexplorer.zip/plugin/bufexplorer.vim b/sources_non_forked/bufexplorer/plugin/bufexplorer.vim similarity index 99% rename from sources_non_forked/bufexplorer.zip/plugin/bufexplorer.vim rename to sources_non_forked/bufexplorer/plugin/bufexplorer.vim index 9224dbda..87913639 100644 --- a/sources_non_forked/bufexplorer.zip/plugin/bufexplorer.vim +++ b/sources_non_forked/bufexplorer/plugin/bufexplorer.vim @@ -10,7 +10,7 @@ " Name Of File: bufexplorer.vim " Description: Buffer Explorer Vim Plugin " Maintainer: Jeff Lanzarotta (delux256-vim at yahoo dot com) -" Last Changed: Tuesday, 16 Feb 2010 +" Last Changed: Friday, 22 October 2010 " Version: See g:bufexplorer_version for version number. " Usage: This file should reside in the plugin directory and be " automatically sourced. diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim index 09237b30..f233c197 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim @@ -2,32 +2,33 @@ " File: autoload/ctrlp.vim " Description: Fuzzy file, buffer, mru, tag, etc finder. " Author: Kien Nguyen -" Version: 1.78 +" Version: 1.79 " ============================================================================= " ** Static variables {{{1 -fu! s:ignore() "{{{2 +" s:ignore() {{{2 +fu! s:ignore() let igdirs = [ - \ '\.git$', - \ '\.hg$', - \ '\.svn$', - \ '_darcs$', - \ '\.bzr$', - \ '\.cdv$', - \ '\~\.dep$', - \ '\~\.dot$', - \ '\~\.nib$', - \ '\~\.plst$', - \ '\.pc$', - \ '_MTN$', - \ ' ', { \ 'PrtExit()': ['', '', ''], \ }] -if !has('gui_running') && ( has('win32') || has('win64') ) +if !has('gui_running') cal add(s:prtmaps['PrtBS()'], remove(s:prtmaps['PrtCurLeft()'], 0)) en -let s:lash = ctrlp#utils#lash() - let s:compare_lim = 3000 let s:ficounts = {} +let s:ccex = s:pref.'clear_cache_on_exit' + " Regexp let s:fpats = { \ '^\(\\|\)\|\(\\|\)$': '\\|', @@ -152,22 +161,6 @@ let s:fpats = { \ '^\S\\?$': '\\?', \ } -" Specials -let s:prtunmaps = [ - \ 'PrtBS()', - \ 'PrtDelete()', - \ 'PrtDeleteWord()', - \ 'PrtClear()', - \ 'PrtCurStart()', - \ 'PrtCurEnd()', - \ 'PrtCurLeft()', - \ 'PrtCurRight()', - \ 'PrtHistory(-1)', - \ 'PrtHistory(1)', - \ 'PrtInsert("c")', - \ 'PrtInsert()', - \ ] - " Keypad let s:kprange = { \ 'Plus': '+', @@ -188,9 +181,8 @@ let s:hlgrps = { \ 'PrtText': 'Normal', \ 'PrtCursor': 'Constant', \ } - -fu! s:opts() "{{{2 - " Options +" s:opts() {{{2 +fu! s:opts(...) unl! s:usrign s:usrcmd s:urprtmaps for each in ['byfname', 'regexp', 'extensions'] | if exists('s:'.each) let {each} = s:{each} @@ -202,14 +194,36 @@ fu! s:opts() "{{{2 for [ke, va] in items(s:new_opts) let {va} = {exists(s:pref.ke) ? s:pref.ke : va} endfo + unl va + for [ke, va] in items(s:lc_opts) + if exists(s:bpref.ke) + unl {va} + let {va} = {s:bpref.ke} + en + endfo + if a:0 && a:1 != {} + unl va + for [ke, va] in items(a:1) + let opke = substitute(ke, '\(\w:\)\?ctrlp_', '', '') + if has_key(s:lc_opts, opke) + let sva = s:lc_opts[opke] + unl {sva} + let {sva} = va + en + endfo + en for each in ['byfname', 'regexp'] | if exists(each) let s:{each} = {each} en | endfo if !exists('g:ctrlp_newcache') | let g:ctrlp_newcache = 0 | en let s:maxdepth = min([s:maxdepth, 100]) let s:mxheight = max([s:mxheight, 1]) - let s:glob = s:dotfiles ? '.*\|*' : '*' + let s:glob = s:showhidden ? '.*\|*' : '*' let s:igntype = empty(s:usrign) ? -1 : type(s:usrign) + let s:lash = ctrlp#utils#lash() + if s:keyloop + let [s:lazy, s:glbs['imd']] = [0, 0] + en if s:lazy cal extend(s:glbs, { 'ut': ( s:lazy > 1 ? s:lazy : 250 ) }) en @@ -227,13 +241,13 @@ endf "}}}1 " * Open & Close {{{1 fu! s:Open() - let s:ermsg = v:errmsg cal s:log(1) cal s:getenv() cal s:execextvar('enter') sil! exe 'keepa' ( s:mwbottom ? 'bo' : 'to' ) '1new ControlP' cal s:buffunc(1) - let [s:bufnr, s:prompt, s:winw] = [bufnr('%'), ['', '', ''], winwidth(0)] + let [s:bufnr, s:winw] = [bufnr('%'), winwidth(0)] + let [s:focus, s:prompt] = [1, ['', '', '']] abc if !exists('s:hstry') let hst = filereadable(s:gethistloc()[1]) ? s:gethistdata() : [''] @@ -250,19 +264,23 @@ endf fu! s:Close() cal s:buffunc(0) - try | bun! - cat | clo! | endt - cal s:unmarksigns() + if winnr('$') == 1 + bw! + el + try | bun! + cat | clo! | endt + cal s:unmarksigns() + en for key in keys(s:glbs) | if exists('+'.key) sil! exe 'let &'.key.' = s:glb_'.key en | endfo if exists('s:glb_acd') | let &acd = s:glb_acd | en let g:ctrlp_lines = [] if s:winres[1] >= &lines && s:winres[2] == winnr('$') - exe s:winres[0] + exe s:winres[0].s:winres[0] en unl! s:focus s:hisidx s:hstgot s:marked s:statypes s:cline s:init s:savestr - \ s:mrbs + \ s:mrbs s:did_exp cal ctrlp#recordhist() cal s:execextvar('exit') cal s:log(0) @@ -275,18 +293,18 @@ fu! ctrlp#clr(...) endf fu! ctrlp#clra() - let cache_dir = ctrlp#utils#cachedir() - if isdirectory(cache_dir) - let cache_files = split(s:glbpath(cache_dir, '**', 1), "\n") - let eval = '!isdirectory(v:val) && fnamemodify(v:val, ":t") !~' - \ . ' ''\v^[.a-z]+$|\.log$''' - sil! cal map(filter(cache_files, eval), 'delete(v:val)') + let cadir = ctrlp#utils#cachedir() + if isdirectory(cadir) + let cafiles = split(s:glbpath(s:fnesc(cadir, 'g', ','), '**', 1), "\n") + let eval = '!isdirectory(v:val) && v:val !~ ''\v[\/]cache[.a-z]+$|\.log$''' + sil! cal map(filter(cafiles, eval), 'delete(v:val)') en cal ctrlp#clr() endf -fu! ctrlp#reset() - cal s:opts() +fu! s:Reset(args) + let opts = has_key(a:args, 'opts') ? [a:args['opts']] : [] + cal call('s:opts', opts) cal s:autocmds() cal ctrlp#utils#opts() cal s:execextvar('opts') @@ -294,11 +312,13 @@ endf " * Files {{{1 fu! ctrlp#files() let cafile = ctrlp#utils#cachefile() - if g:ctrlp_newcache || !filereadable(cafile) || s:nocache() + if g:ctrlp_newcache || !filereadable(cafile) || s:nocache(cafile) let [lscmd, s:initcwd, g:ctrlp_allfiles] = [s:lsCmd(), s:dyncwd, []] " Get the list of files if empty(lscmd) - cal s:GlobPath(s:dyncwd, 0) + if !ctrlp#igncwd(s:dyncwd) + cal s:GlobPath(s:fnesc(s:dyncwd, 'g', ','), 0) + en el sil! cal ctrlp#progress('Indexing...') try | cal s:UserCmd(lscmd) @@ -310,13 +330,16 @@ fu! ctrlp#files() cal sort(g:ctrlp_allfiles, 'ctrlp#complen') en cal s:writecache(cafile) + let catime = getftime(cafile) el + let catime = getftime(cafile) if !( exists('s:initcwd') && s:initcwd == s:dyncwd ) + \ || get(s:ficounts, s:dyncwd, [0, catime])[1] != catime let s:initcwd = s:dyncwd let g:ctrlp_allfiles = ctrlp#utils#readfile(cafile) en en - cal extend(s:ficounts, { s:dyncwd : len(g:ctrlp_allfiles) }) + cal extend(s:ficounts, { s:dyncwd : [len(g:ctrlp_allfiles), catime] }) retu g:ctrlp_allfiles endf @@ -326,12 +349,15 @@ fu! s:GlobPath(dirs, depth) cal extend(g:ctrlp_allfiles, dnf[1]) if !empty(dnf[0]) && !s:maxf(len(g:ctrlp_allfiles)) && depth <= s:maxdepth sil! cal ctrlp#progress(len(g:ctrlp_allfiles), 1) - cal s:GlobPath(join(dnf[0], ','), depth) + cal s:GlobPath(join(map(dnf[0], 's:fnesc(v:val, "g", ",")'), ','), depth) en endf fu! s:UserCmd(lscmd) let [path, lscmd] = [s:dyncwd, a:lscmd] + let do_ign = + \ type(s:usrcmd) == 4 && has_key(s:usrcmd, 'ignore') && s:usrcmd['ignore'] + if do_ign && ctrlp#igncwd(s:cwd) | retu | en if exists('+ssl') && &ssl let [ssl, &ssl, path] = [&ssl, 0, tr(path, '/', '\')] en @@ -347,6 +373,14 @@ fu! s:UserCmd(lscmd) if exists('s:vcscmd') && s:vcscmd cal map(g:ctrlp_allfiles, 'tr(v:val, "/", "\\")') en + if do_ign + if !empty(s:usrign) + let g:ctrlp_allfiles = ctrlp#dirnfile(g:ctrlp_allfiles)[1] + en + if &wig != '' + cal filter(g:ctrlp_allfiles, 'glob(v:val) != ""') + en + en endf fu! s:lsCmd() @@ -357,35 +391,50 @@ fu! s:lsCmd() if s:findroot(s:dyncwd, cmd[0], 0, 1) == [] retu len(cmd) == 3 ? cmd[2] : '' en - let s:vcscmd = s:lash == '\' ? 1 : 0 + let s:vcscmd = s:lash == '\' retu cmd[1] - elsei type(cmd) == 4 && has_key(cmd, 'types') - let [markrs, cmdtypes] = [[], values(cmd['types'])] - for pair in cmdtypes - cal add(markrs, pair[0]) - endfo - let fndroot = s:findroot(s:dyncwd, markrs, 0, 1) + elsei type(cmd) == 4 && ( has_key(cmd, 'types') || has_key(cmd, 'fallback') ) + let fndroot = [] + if has_key(cmd, 'types') && cmd['types'] != {} + let [markrs, cmdtypes] = [[], values(cmd['types'])] + for pair in cmdtypes + cal add(markrs, pair[0]) + endfo + let fndroot = s:findroot(s:dyncwd, markrs, 0, 1) + en if fndroot == [] retu has_key(cmd, 'fallback') ? cmd['fallback'] : '' en for pair in cmdtypes if pair[0] == fndroot[0] | brea | en endfo - let s:vcscmd = s:lash == '\' ? 1 : 0 + let s:vcscmd = s:lash == '\' retu pair[1] en endf " - Buffers {{{1 fu! ctrlp#buffers(...) let ids = sort(filter(range(1, bufnr('$')), 'empty(getbufvar(v:val, "&bt"))' - \ .' && getbufvar(v:val, "&bl") && strlen(bufname(v:val))'), 's:compmreb') - retu a:0 && a:1 == 'id' ? ids : map(ids, 'fnamemodify(bufname(v:val), ":.")') + \ .' && getbufvar(v:val, "&bl")'), 's:compmreb') + if a:0 && a:1 == 'id' + retu ids + el + let bufs = [[], []] + for id in ids + let bname = bufname(id) + let ebname = bname == '' + let fname = fnamemodify(ebname ? '['.id.'*No Name]' : bname, ':.') + cal add(bufs[ebname], fname) + endfo + retu bufs[0] + bufs[1] + en endf " * MatchedItems() {{{1 fu! s:MatchIt(items, pat, limit, exc) let [lines, id] = [[], 0] - let pat = s:byfname ? - \ map(split(a:pat, '^[^;]\+\zs;', 1), 's:martcs.v:val') : s:martcs.a:pat + let pat = + \ s:byfname ? map(split(a:pat, '^[^;]\+\\\@= 0 @@ -402,11 +451,12 @@ fu! s:MatchedItems(items, pat, limit) let items = s:narrowable() ? s:matched + s:mdata[3] : a:items if s:matcher != {} let argms = [items, a:pat, a:limit, s:mmode(), s:ispath, exc, s:regexp] - let lines = call(s:matcher['match'], argms) + let lines = call(s:matcher['match'], argms, s:matcher) el let lines = s:MatchIt(items, a:pat, a:limit, exc) en let s:matches = len(lines) + unl! s:did_exp retu lines endf @@ -445,7 +495,7 @@ endf " * BuildPrompt() {{{1 fu! s:Render(lines, pat) let [&ma, lines, s:height] = [1, a:lines, min([len(a:lines), s:winh])] - let pat = s:byfname ? split(a:pat, '^[^;]\+\zs;', 1)[0] : a:pat + let pat = s:byfname ? split(a:pat, '^[^;]\+\\\@' ).( s:byfname ? 'd' : '>' ).'> ' - let [estr, prt] = ['"\', copy(s:prompt)] - cal map(prt, 'escape(v:val, estr)') - let str = join(prt, '') - let lazy = empty(str) || exists('s:force') || !has('autocmd') ? 0 : s:lazy - if a:upd && !lazy && ( s:matches || s:regexp + let str = escape(s:getinput(), '\') + let lazy = str == '' || exists('s:force') || !has('autocmd') ? 0 : s:lazy + if a:upd && !lazy && ( s:matches || s:regexp || exists('s:did_exp') \ || str =~ '\(\\\(<\|>\)\|[*|]\)\|\(\\\:\([^:]\|\\:\)*$\)' ) sil! cal s:Update(str) en sil! cal ctrlp#statusline() " Toggling - let [hiactive, hicursor, base] = a:0 && !a:1 - \ ? ['CtrlPPrtBase', 'CtrlPPrtBase', tr(base, '>', '-')] - \ : ['CtrlPPrtText', 'CtrlPPrtCursor', base] + let [hiactive, hicursor, base] = s:focus + \ ? ['CtrlPPrtText', 'CtrlPPrtCursor', base] + \ : ['CtrlPPrtBase', 'CtrlPPrtBase', tr(base, '>', '-')] let hibase = 'CtrlPPrtBase' " Build it redr + let prt = copy(s:prompt) + cal map(prt, 'escape(v:val, ''"\'')') exe 'echoh' hibase '| echon "'.base.'" \ | echoh' hiactive '| echon "'.prt[0].'" \ | echoh' hicursor '| echon "'.prt[1].'" \ | echoh' hiactive '| echon "'.prt[2].'" | echoh None' " Append the cursor at the end - if empty(prt[1]) && !( a:0 && !a:1 ) + if empty(prt[1]) && s:focus exe 'echoh' hibase '| echon "_" | echoh None' en endf @@ -544,6 +592,7 @@ endf " ** Prt Actions {{{1 " Editing {{{2 fu! s:PrtClear() + if !s:focus | retu | en unl! s:hstgot let [s:prompt, s:matches] = [['', '', ''], 1] cal s:BuildPrompt(1) @@ -558,12 +607,14 @@ fu! s:PrtAdd(char) endf fu! s:PrtBS() + if !s:focus | retu | en unl! s:hstgot let [s:prompt[0], s:matches] = [substitute(s:prompt[0], '.$', '', ''), 1] cal s:BuildPrompt(1) endf fu! s:PrtDelete() + if !s:focus | retu | en unl! s:hstgot let [prt, s:matches] = [s:prompt, 1] let prt[1] = matchstr(prt[2], '^.') @@ -572,6 +623,7 @@ fu! s:PrtDelete() endf fu! s:PrtDeleteWord() + if !s:focus | retu | en unl! s:hstgot let [str, s:matches] = [s:prompt[0], 1] let str = str =~ '\W\w\+$' ? matchstr(str, '^.\+\W\ze\w\+$') @@ -583,6 +635,7 @@ fu! s:PrtDeleteWord() endf fu! s:PrtInsert(...) + if !s:focus | retu | en let type = !a:0 ? '' : a:1 if !a:0 let type = s:insertstr() @@ -605,15 +658,31 @@ fu! s:PrtInsert(...) endf fu! s:PrtExpandDir() - let str = s:prompt[0] + if !s:focus | retu | en + let str = s:getinput('c') if str =~ '\v^\@(cd|lc[hd]?|chd)\s.+' && s:spi let hasat = split(str, '\v^\@(cd|lc[hd]?|chd)\s*\zs') let str = get(hasat, 1, '') + if str =~# '\v^[~$]\i{-}[\/]?|^#(\):(p|h|8|\~|\.|g?s+)' + let spc = str =~# '^%' ? s:crfile + \ : str =~# '^' ? s:crgfile + \ : str =~# '^' ? s:crword + \ : str =~# '^' ? s:crnbword : '' + let pat = '(:(p|h|8|\~|\.|g?s(.)[^\3]*\3[^\3]*\3))+' + let mdr = matchstr(str, '\v^[^:]+\zs'.pat) + let nmd = matchstr(str, '\v^[^:]+'.pat.'\zs.{-}$') + let str = fnamemodify(s:fnesc(spc, 'g'), mdr).nmd + en en if str == '' | retu | en unl! s:hstgot let s:act_add = 1 let [base, seed] = s:headntail(str) + if str =~# '^[\/]' + let base = expand('/').base + en let dirs = s:dircompl(base, seed) if len(dirs) == 1 let str = dirs[0] @@ -626,6 +695,7 @@ fu! s:PrtExpandDir() endf " Movement {{{2 fu! s:PrtCurLeft() + if !s:focus | retu | en let prt = s:prompt if !empty(prt[0]) let s:prompt = [substitute(prt[0], '.$', '', ''), matchstr(prt[0], '.$'), @@ -635,6 +705,7 @@ fu! s:PrtCurLeft() endf fu! s:PrtCurRight() + if !s:focus | retu | en let prt = s:prompt let s:prompt = [prt[0] . prt[1], matchstr(prt[2], '^.'), \ substitute(prt[2], '^.', '', '')] @@ -642,12 +713,14 @@ fu! s:PrtCurRight() endf fu! s:PrtCurStart() + if !s:focus | retu | en let str = join(s:prompt, '') let s:prompt = ['', matchstr(str, '^.'), substitute(str, '^.', '', '')] cal s:BuildPrompt(0) endf fu! s:PrtCurEnd() + if !s:focus | retu | en let s:prompt = [join(s:prompt, ''), '', ''] cal s:BuildPrompt(0) endf @@ -657,33 +730,38 @@ fu! s:PrtSelectMove(dir) let dirs = {'t': 'gg','b': 'G','j': 'j','k': 'k','u': wht.'k','d': wht.'j'} exe 'keepj norm!' dirs[a:dir] if s:nolim != 1 | let s:cline = line('.') | en - if line('$') > winheight(0) | cal s:BuildPrompt(0, s:Focus()) | en + if line('$') > winheight(0) | cal s:BuildPrompt(0) | en endf -fu! s:PrtSelectJump(char, ...) +fu! s:PrtSelectJump(char) let lines = copy(s:lines) - if a:0 + if s:byfname cal map(lines, 'split(v:val, ''[\/]\ze[^\/]\+$'')[-1]') en " Cycle through matches, use s:jmpchr to store last jump - let chr = escape(a:char, '.~') - if match(lines, '\c^'.chr) >= 0 + let chr = escape(matchstr(a:char, '^.'), '.~') + let smartcs = &scs && chr =~ '\u' ? '\C' : '' + if match(lines, smartcs.'^'.chr) >= 0 " If not exists or does but not for the same char - let pos = match(lines, '\c^'.chr) + let pos = match(lines, smartcs.'^'.chr) if !exists('s:jmpchr') || ( exists('s:jmpchr') && s:jmpchr[0] != chr ) let [jmpln, s:jmpchr] = [pos, [chr, pos]] elsei exists('s:jmpchr') && s:jmpchr[0] == chr " Start of lines if s:jmpchr[1] == -1 | let s:jmpchr[1] = pos | en - let npos = match(lines, '\c^'.chr, s:jmpchr[1] + 1) + let npos = match(lines, smartcs.'^'.chr, s:jmpchr[1] + 1) let [jmpln, s:jmpchr] = [npos == -1 ? pos : npos, [chr, npos]] en - keepj exe jmpln + 1 + exe 'keepj norm!' ( jmpln + 1 ).'G' if s:nolim != 1 | let s:cline = line('.') | en - if line('$') > winheight(0) | cal s:BuildPrompt(0, s:Focus()) | en + if line('$') > winheight(0) | cal s:BuildPrompt(0) | en en endf " Misc {{{2 +fu! s:PrtFocusMap(char) + cal call(( s:focus ? 's:PrtAdd' : 's:PrtSelectJump' ), [a:char]) +endf + fu! s:PrtClearCache() if s:itemtype == 0 cal ctrlp#clr() @@ -715,12 +793,14 @@ fu! s:PrtDeleteMRU() endf fu! s:PrtExit() - if !has('autocmd') | cal s:Close() | en - exe ( winnr('$') == 1 ? 'bw!' : 'winc p' ) + if bufnr('%') == s:bufnr && bufname('%') == 'ControlP' + noa cal s:Close() + noa winc p + en endf fu! s:PrtHistory(...) - if !s:maxhst | retu | en + if !s:focus || !s:maxhst | retu | en let [str, hst, s:matches] = [join(s:prompt, ''), s:hstry, 1] " Save to history if not saved before let [hst[0], hslen] = [exists('s:hstgot') ? hst[0] : str, len(hst)] @@ -733,67 +813,72 @@ fu! s:PrtHistory(...) unl s:force endf "}}}1 -" * MapKeys() {{{1 -fu! s:MapKeys(...) - " Normal keys - let pfunc = a:0 && !a:1 ? 'PrtSelectJump' : 'PrtAdd' - let dojmp = s:byfname && a:0 && !a:1 ? ', 1' : '' - let pcmd = "nn \ \ \ :\cal \%s(\"%s\"%s)\" +" * Mappings {{{1 +fu! s:MapNorms() + if exists('s:nmapped') && s:nmapped == s:bufnr | retu | en + let pcmd = "nn \ \ \ :\cal \%s(\"%s\")\" let cmd = substitute(pcmd, 'k%s', 'char-%d', '') - for each in range(32, 126) - exe printf(cmd, each, pfunc, escape(nr2char(each), '"|\'), dojmp) + let pfunc = 'PrtFocusMap' + let ranges = [32, 33, 125, 126] + range(35, 91) + range(93, 123) + for each in [34, 92, 124] + exe printf(cmd, each, pfunc, escape(nr2char(each), '"|\')) + endfo + for each in ranges + exe printf(cmd, each, pfunc, nr2char(each)) endfo for each in range(0, 9) - exe printf(pcmd, each, pfunc, each, dojmp) + exe printf(pcmd, each, pfunc, each) endfo for [ke, va] in items(s:kprange) - exe printf(pcmd, ke, pfunc, va, dojmp) + exe printf(pcmd, ke, pfunc, va) endfo - " Special keys - if a:0 < 2 - cal call('s:MapSpecs', a:0 && !a:1 ? [1] : []) - en + let s:nmapped = s:bufnr endf -fu! s:MapSpecs(...) - " Correct arrow keys in terminal - if ( has('termresponse') && v:termresponse =~ "\" ) - \ || &term =~? '\vxterm|','\B ','\C ','\D '] - exe s:lcmap.' ['.each - endfo - en - if a:0 - for ke in s:prtunmaps | for kp in s:prtmaps[ke] - exe s:lcmap kp '' - endfo | endfo - el - for [ke, va] in items(s:prtmaps) | for kp in va - exe s:lcmap kp ':cal '.ke.'' - endfo | endfo +fu! s:MapSpecs() + if !( exists('s:smapped') && s:smapped == s:bufnr ) + " Correct arrow keys in terminal + if ( has('termresponse') && v:termresponse =~ "\" ) + \ || &term =~? '\vxterm|','\B ','\C ','\D '] + exe s:lcmap.' ['.each + endfo + en en + for [ke, va] in items(s:prtmaps) | for kp in va + exe s:lcmap kp ':cal '.ke.'' + endfo | endfo + let s:smapped = s:bufnr +endf + +fu! s:KeyLoop() + wh exists('s:init') && s:keyloop + redr + let nr = getchar() + let chr = !type(nr) ? nr2char(nr) : nr + if nr >=# 0x20 + cal s:PrtFocusMap(chr) + el + let cmd = matchstr(maparg(chr), ':\zs.\+\ze$') + exe ( cmd != '' ? cmd : 'norm '.chr ) + en + endw endf " * Toggling {{{1 -fu! s:Focus() - retu !exists('s:focus') ? 1 : s:focus -endf - fu! s:ToggleFocus() - let s:focus = !exists('s:focus') || s:focus ? 0 : 1 - cal s:MapKeys(s:focus) - cal s:BuildPrompt(0, s:focus) + let s:focus = !s:focus + cal s:BuildPrompt(0) endf fu! s:ToggleRegex() - let s:regexp = s:regexp ? 0 : 1 + let s:regexp = !s:regexp cal s:PrtSwitcher() endf fu! s:ToggleByFname() if s:ispath - let s:byfname = s:byfname ? 0 : 1 + let s:byfname = !s:byfname let s:mfunc = s:mfunc() - cal s:MapKeys(s:Focus(), 1) cal s:PrtSwitcher() en endf @@ -806,20 +891,38 @@ fu! s:ToggleType(dir) cal s:PrtSwitcher() endf +fu! s:ToggleKeyLoop() + let s:keyloop = !s:keyloop + if exists('+imd') + let &imd = !s:keyloop + en + if s:keyloop + let [&ut, s:lazy] = [0, 0] + cal s:KeyLoop() + elsei has_key(s:glbs, 'ut') + let [&ut, s:lazy] = [s:glbs['ut'], 1] + en +endf + fu! s:PrtSwitcher() let [s:force, s:matches] = [1, 1] - cal s:BuildPrompt(1, s:Focus()) + cal s:BuildPrompt(1) unl s:force endf " - SetWD() {{{1 fu! s:SetWD(args) - let [s:crfilerel, s:dyncwd] = [fnamemodify(s:crfile, ':.'), getcwd()] - let pmode = has_key(a:args, 'mode') ? a:args['mode'] : s:wpmode + if has_key(a:args, 'args') && stridx(a:args['args'], '--dir') >= 0 + \ && exists('s:dyncwd') + cal ctrlp#setdir(s:dyncwd) | retu + en if has_key(a:args, 'dir') && a:args['dir'] != '' cal ctrlp#setdir(a:args['dir']) | retu en + let pmode = has_key(a:args, 'mode') ? a:args['mode'] : s:pathmode + let [s:crfilerel, s:dyncwd] = [fnamemodify(s:crfile, ':.'), getcwd()] if s:crfile =~ '^.\+://' | retu | en - if pmode =~ 'c' || ( !type(pmode) && pmode ) + if pmode =~ 'c' || ( pmode =~ 'a' && stridx(s:crfpath, s:cwd) < 0 ) + \ || ( !type(pmode) && pmode ) if exists('+acd') | let [s:glb_acd, &acd] = [&acd, 0] | en cal ctrlp#setdir(s:crfpath) en @@ -835,26 +938,40 @@ fu! s:SetWD(args) endf " * AcceptSelection() {{{1 fu! ctrlp#acceptfile(mode, line, ...) - let [md, filpath] = [a:mode, fnamemodify(a:line, ':p')] + let [md, useb] = [a:mode, 0] + if !type(a:line) + let [filpath, bufnr, useb] = [a:line, a:line, 1] + el + let filpath = fnamemodify(a:line, ':p') + if s:nonamecond(a:line, filpath) + let bufnr = str2nr(matchstr(a:line, '[\/]\?\[\zs\d\+\ze\*No Name\]$')) + let [filpath, useb] = [bufnr, 1] + el + let bufnr = bufnr('^'.filpath.'$') + en + en cal s:PrtExit() - let [bufnr, tail] = [bufnr('^'.filpath.'$'), s:tail()] - let j2l = a:0 ? a:1 : str2nr(matchstr(tail, '^ +\D*\zs\d\+\ze\D*')) - if s:jmptobuf && bufnr > 0 && md =~ 'e\|t' + let tail = s:tail() + let j2l = a:0 ? a:1 : matchstr(tail, '^ +\zs\d\+$') + if ( s:jmptobuf =~ md || ( s:jmptobuf && md =~ '[et]' ) ) && bufnr > 0 \ && !( md == 'e' && bufnr == bufnr('%') ) let [jmpb, bufwinnr] = [1, bufwinnr(bufnr)] - let buftab = s:jmptobuf > 1 ? s:buftab(bufnr, md) : [0, 0] + let buftab = ( s:jmptobuf =~# '[tTVH]' || s:jmptobuf > 1 ) + \ ? s:buftab(bufnr, md) : [0, 0] en " Switch to existing buffer or open new one - if exists('jmpb') && bufwinnr > 0 && md != 't' + if exists('jmpb') && bufwinnr > 0 + \ && !( md == 't' && ( s:jmptobuf !~# toupper(md) || buftab[0] ) ) exe bufwinnr.'winc w' if j2l | cal ctrlp#j2l(j2l) | en elsei exists('jmpb') && buftab[0] + \ && !( md =~ '[evh]' && s:jmptobuf !~# toupper(md) ) exe 'tabn' buftab[0] exe buftab[1].'winc w' if j2l | cal ctrlp#j2l(j2l) | en el " Determine the command to use - let useb = bufnr > 0 && buflisted(bufnr) && empty(tail) + let useb = bufnr > 0 && buflisted(bufnr) && ( empty(tail) || useb ) let cmd = \ md == 't' || s:splitwin == 1 ? ( useb ? 'tab sb' : 'tabe' ) : \ md == 'h' || s:splitwin == 2 ? ( useb ? 'sb' : 'new' ) : @@ -863,7 +980,8 @@ fu! ctrlp#acceptfile(mode, line, ...) " Reset &switchbuf option let [swb, &swb] = [&swb, ''] " Open new window/buffer - let args = [cmd, useb ? bufnr : filpath, a:0 ? ' +'.a:1 : tail, useb, j2l] + let [fid, tail] = [( useb ? bufnr : filpath ), ( a:0 ? ' +'.a:1 : tail )] + let args = [cmd, fid, tail, 1, [useb, j2l]] cal call('s:openfile', args) let &swb = swb en @@ -895,10 +1013,10 @@ endf fu! s:AcceptSelection(mode) if a:mode != 'e' && s:OpenMulti(a:mode) != -1 | retu | en - let str = join(s:prompt, '') + let str = s:getinput() if a:mode == 'e' | if s:SpecInputs(str) | retu | en | en " Get the selected line - let line = !empty(s:lines) ? s:lines[line('.') - 1] : '' + let line = ctrlp#getcline() if a:mode != 'e' && !s:itemtype && line == '' \ && str !~ '\v^(\.\.([\/]\.\.)*[\/]?[.\/]*|/|\\|\?|\@.+)$' cal s:CreateNewFile(a:mode) | retu @@ -914,7 +1032,7 @@ fu! s:AcceptSelection(mode) endf " - CreateNewFile() {{{1 fu! s:CreateNewFile(...) - let [md, str] = ['', join(s:prompt, '')] + let [md, str] = ['', s:getinput('n')] if empty(str) | retu | en if s:argmap && !a:0 " Get the extra argument @@ -942,7 +1060,7 @@ fu! s:CreateNewFile(...) \ s:newfop =~ '2\|h' || ( a:0 && a:1 == 'h' ) || md == 'h' ? 'new' : \ s:newfop =~ '3\|v' || ( a:0 && a:1 == 'v' ) || md == 'v' ? 'vne' : \ ctrlp#normcmd('e') - cal s:openfile(cmd, filpath, tail) + cal s:openfile(cmd, filpath, tail, 1) endf " * OpenMulti() {{{1 fu! s:MarkToOpen() @@ -950,7 +1068,7 @@ fu! s:MarkToOpen() \ || ( s:itemtype > 2 && s:getextvar('opmul') != 1 ) retu en - let line = !empty(s:lines) ? s:lines[line('.') - 1] : '' + let line = ctrlp#getcline() if empty(line) | retu | en let filpath = s:ispath ? fnamemodify(line, ':p') : line if exists('s:marked') && s:dictindex(s:marked, filpath) > 0 @@ -989,7 +1107,7 @@ fu! s:OpenMulti(...) let md = a:0 ? a:1 : ( md == '' ? 'v' : md ) let nopt = exists('g:ctrlp_open_multiple_files') if !has_marked - let line = !empty(s:lines) ? s:lines[line('.') - 1] : '' + let line = ctrlp#getcline() if line == '' | retu | en let marked = { 1 : fnamemodify(line, ':p') } let [nr, ur, jf, nopt] = ['1', 0, 0, 1] @@ -1000,16 +1118,8 @@ fu! s:OpenMulti(...) cal s:unmarksigns() unl! s:marked cal s:BuildPrompt(0) - elsei !has_marked && md == 'a' - let [s:marked, key] = [{}, 1] - for line in s:lines - let s:marked = extend(s:marked, { key : fnamemodify(line, ':p') }) - let key += 1 - endfo - cal s:remarksigns() - retu s:BuildPrompt(0) - elsei !has_marked && md == 'x' - retu call(s:openfunc[s:ctype], [md, line]) + elsei !has_marked && md =~ '[axd]' + retu s:OpenNoMarks(md, line) en if md =~ '\v^c(ancel)?$' | retu | en let nr = nr == '0' ? ( nopt ? '' : '1' ) : nr @@ -1019,9 +1129,9 @@ fu! s:OpenMulti(...) cal s:sanstail(join(s:prompt, '')) cal s:PrtExit() if nr == '0' || md == 'i' - retu map(mkd, "s:openfile('bad', fnamemodify(v:val, ':.'), '')") + retu map(mkd, "s:openfile('bad', v:val, '', 0)") en - let [tail, fnesc] = [s:tail(), exists('*fnameescape') && v:version > 701] + let tail = s:tail() let [emptytail, bufnr] = [empty(tail), bufnr('^'.mkd[0].'$')] let useb = bufnr > 0 && buflisted(bufnr) && emptytail " Move to a replaceable window @@ -1048,19 +1158,16 @@ fu! s:OpenMulti(...) let conds = [( nr != '' && nr > 1 && nr < ic ) || ( nr == '' && ic > 1 ), \ nr != '' && nr < ic] if conds[nopt] - if bufnr <= 0 | if fnesc - cal s:openfile('bad', fnamemodify(va, ':.'), '') - el - cal s:openfile(cmd, va, tail) | sil! hid clo! - en | en + if !buflisted(bufnr) | cal s:openfile('bad', va, '', 0) | en el - cal s:openfile(cmd, useb ? bufnr : va, tail) | let ic += 1 - if jf | if ic == 2 + cal s:openfile(cmd, useb ? bufnr : va, tail, ic == 1) + if jf | if ic == 1 let crpos = [tabpagenr(), winnr()] el let crpos[0] += tabpagenr() <= crpos[0] - let crpos[1] += winnr() == crpos[1] + let crpos[1] += winnr() <= crpos[1] en | en + let ic += 1 en endfo if jf && exists('crpos') && ic > 2 @@ -1069,6 +1176,28 @@ fu! s:OpenMulti(...) let &swb = swb unl! s:tabct endf + +fu! s:OpenNoMarks(md, line) + if a:md == 'a' + let [s:marked, key] = [{}, 1] + for line in s:lines + let s:marked = extend(s:marked, { key : fnamemodify(line, ':p') }) + let key += 1 + endfo + cal s:remarksigns() + cal s:BuildPrompt(0) + elsei a:md == 'x' + cal call(s:openfunc[s:ctype], [a:md, a:line], s:openfunc) + elsei a:md == 'd' + let dir = fnamemodify(a:line, ':h') + if isdirectory(dir) + cal ctrlp#setdir(dir) + cal ctrlp#switchtype(0) + cal ctrlp#recordhist() + cal s:PrtClear() + en + en +endf " ** Helper functions {{{1 " Sorting {{{2 fu! ctrlp#complen(...) @@ -1140,6 +1269,12 @@ fu! s:shortest(lens) endf fu! s:mixedsort(...) + if s:itemtype == 1 + let pat = '[\/]\?\[\d\+\*No Name\]$' + if a:1 =~# pat && a:2 =~# pat | retu 0 + elsei a:1 =~# pat | retu 1 + elsei a:2 =~# pat | retu -1 | en + en let [cln, cml] = [ctrlp#complen(a:1, a:2), s:compmatlen(a:1, a:2)] if s:ispath let ms = [] @@ -1188,13 +1323,13 @@ fu! ctrlp#statusline() let nxt = tps[s:walker(max, s:itemtype, 1)][1] let prv = tps[s:walker(max, s:itemtype, -1)][1] let s:ctype = tps[s:itemtype][0] - let focus = s:Focus() ? 'prt' : 'win' + let focus = s:focus ? 'prt' : 'win' let byfname = s:byfname ? 'file' : 'path' let marked = s:opmul != '0' ? \ exists('s:marked') ? ' <'.s:dismrk().'>' : ' <->' : '' if s:status != {} let args = [focus, byfname, s:regexp, prv, s:ctype, nxt, marked] - let &l:stl = call(s:status['main'], args) + let &l:stl = call(s:status['main'], args, s:status) el let item = '%#CtrlPMode1# '.s:ctype.' %*' let focus = '%#CtrlPMode2# '.focus.' %*' @@ -1214,15 +1349,27 @@ endf fu! ctrlp#progress(enum, ...) if has('macunix') || has('mac') | sl 1m | en let txt = a:0 ? '(press ctrl-c to abort)' : '' - let &l:stl = s:status != {} ? call(s:status['prog'], [a:enum]) + let &l:stl = s:status != {} ? call(s:status['prog'], [a:enum], s:status) \ : '%#CtrlPStats# '.a:enum.' %* '.txt.'%=%<%#CtrlPMode2# %{getcwd()} %*' redraws endf " *** Paths {{{2 " Line formatting {{{3 fu! s:formatline(str) - let cond = s:ispath && ( s:winw - 4 ) < s:strwidth(a:str) - retu '> '.( cond ? s:pathshorten(a:str) : a:str ) + let str = a:str + if s:itemtype == 1 + let filpath = fnamemodify(str, ':p') + let bufnr = s:nonamecond(str, filpath) + \ ? str2nr(matchstr(str, '[\/]\?\[\zs\d\+\ze\*No Name\]$')) + \ : bufnr('^'.filpath.'$') + let idc = ( bufnr == bufnr('#') ? '#' : '' ) + \ . ( getbufvar(bufnr, '&ma') ? '' : '-' ) + \ . ( getbufvar(bufnr, '&ro') ? '=' : '' ) + \ . ( getbufvar(bufnr, '&mod') ? '+' : '' ) + let str .= idc != '' ? ' '.idc : '' + en + let cond = s:ispath && ( s:winw - 4 ) < s:strwidth(str) + retu '> '.( cond ? s:pathshorten(str) : str ) endf fu! s:pathshorten(str) @@ -1232,8 +1379,16 @@ endf " Directory completion {{{3 fu! s:dircompl(be, sd) if a:sd == '' | retu [] | en - let [be, sd] = a:be == '' ? [s:dyncwd, a:sd] : [a:be, a:be.s:lash(a:be).a:sd] - let dirs = ctrlp#rmbasedir(split(globpath(be, a:sd.'*/'), "\n")) + if a:be == '' + let [be, sd] = [s:dyncwd, a:sd] + el + let be = a:be.s:lash(a:be) + let sd = be.a:sd + en + let dirs = split(globpath(s:fnesc(be, 'g', ','), a:sd.'*/'), "\n") + if a:be == '' + let dirs = ctrlp#rmbasedir(dirs) + en cal filter(dirs, '!match(v:val, escape(sd, ''~$.\''))' \ . ' && v:val !~ ''\v(^|[\/])\.{1,2}[\/]$''') retu dirs @@ -1266,13 +1421,18 @@ fu! s:ispathitem() retu s:itemtype < 3 || ( s:itemtype > 2 && s:getextvar('type') == 'path' ) endf +fu! ctrlp#igncwd(cwd) + retu ctrlp#utils#glob(a:cwd, 0) == '' || + \ ( s:igntype >= 0 && s:usrign(a:cwd, getftype(a:cwd)) ) +endf + fu! ctrlp#dirnfile(entries) let [items, cwd] = [[[], []], s:dyncwd.s:lash()] for each in a:entries let etype = getftype(each) if s:igntype >= 0 && s:usrign(each, etype) | con | en if etype == 'dir' - if s:dotfiles | if each !~ '[\/]\.\{1,2}$' + if s:showhidden | if each !~ '[\/]\.\{1,2}$' cal add(items[0], each) en | el cal add(items[0], each) @@ -1304,8 +1464,9 @@ fu! s:samerootsyml(each, isfile, cwd) endf fu! ctrlp#rmbasedir(items) - if a:items != [] && !stridx(a:items[0], s:dyncwd) - let idx = strlen(s:dyncwd) + ( s:dyncwd !~ '[\/]$' ) + let cwd = s:dyncwd.( s:dyncwd !~ '[\/]$' ? s:lash : '' ) + if a:items != [] && !stridx(a:items[0], cwd) + let idx = strlen(cwd) retu map(a:items, 'strpart(v:val, idx)') en retu a:items @@ -1322,10 +1483,13 @@ endf fu! s:findroot(curr, mark, depth, type) let [depth, fnd] = [a:depth + 1, 0] if type(a:mark) == 1 - let fnd = s:glbpath(a:curr, a:mark, 1) != '' + let fnd = s:glbpath(s:fnesc(a:curr, 'g', ','), a:mark, 1) != '' elsei type(a:mark) == 3 for markr in a:mark - if s:glbpath(a:curr, markr, 1) != '' | let fnd = 1 | brea | en + if s:glbpath(s:fnesc(a:curr, 'g', ','), markr, 1) != '' + let fnd = 1 + brea + en endfo en if fnd @@ -1344,17 +1508,16 @@ endf fu! ctrlp#setdir(path, ...) let cmd = a:0 ? a:1 : 'lc!' - sil! exe cmd ctrlp#fnesc(a:path) + sil! exe cmd s:fnesc(a:path, 'c') let [s:crfilerel, s:dyncwd] = [fnamemodify(s:crfile, ':.'), getcwd()] endf " Fallbacks {{{3 fu! s:glbpath(...) - let cond = v:version > 702 || ( v:version == 702 && has('patch051') ) - retu call('globpath', cond ? a:000 : a:000[:1]) + retu call('ctrlp#utils#globpath', a:000) endf -fu! ctrlp#fnesc(path) - retu exists('*fnameescape') ? fnameescape(a:path) : escape(a:path, " %#*?|<\"\n") +fu! s:fnesc(...) + retu call('ctrlp#utils#fnesc', a:000) endf fu! ctrlp#setlcdir() @@ -1473,6 +1636,19 @@ fu! s:buftab(bufnr, md) retu [0, 0] endf +fu! s:bufwins(bufnr) + let winns = 0 + for tabnr in range(1, tabpagenr('$')) + let winns += count(tabpagebuflist(tabnr), a:bufnr) + endfo + retu winns +endf + +fu! s:nonamecond(str, filpath) + retu a:str =~ '[\/]\?\[\d\+\*No Name\]$' && !filereadable(a:filpath) + \ && bufnr('^'.a:filpath.'$') < 1 +endf + fu! ctrlp#normcmd(cmd, ...) if a:0 < 2 && s:nosplit() | retu a:cmd | en let norwins = filter(range(1, winnr('$')), @@ -1493,6 +1669,11 @@ fu! ctrlp#normcmd(cmd, ...) retu a:0 ? a:1 : 'bo vne' endf +fu! ctrlp#modfilecond(w) + retu &mod && !&hid && &bh != 'hide' && s:bufwins(bufnr('%')) == 1 && !&cf && + \ ( ( !&awa && a:w ) || filewritable(fnamemodify(bufname('%'), ':p')) != 1 ) +endf + fu! s:nosplit() retu !empty(s:nosplit) && match([bufname('%'), &l:ft, &l:bt], s:nosplit) >= 0 endf @@ -1507,7 +1688,7 @@ endf fu! s:leavepre() if exists('s:bufnr') && s:bufnr == bufnr('%') | bw! | en - if !( exists('g:ctrlp_clear_cache_on_exit') && !g:ctrlp_clear_cache_on_exit ) + if !( exists(s:ccex) && !{s:ccex} ) \ && !( has('clientserver') && len(split(serverlist(), "\n")) > 1 ) cal ctrlp#clra() en @@ -1570,11 +1751,17 @@ fu! s:argmaps(md, i) let roh = [ \ ['Open Multiple Files', '/h[i]dden/[c]lear', ['i', 'c']], \ ['Create a New File', '/[r]eplace', ['r']], - \ ['Open Selected', '/[r]eplace/h[i]dden? Mark [a]ll', ['r', 'i', 'a']], + \ ['Open Selected', '/[r]eplace', ['r', 'd', 'a']], \ ] - if a:i == 2 && s:openfunc != {} && has_key(s:openfunc, s:ctype) - let roh[2][1] = '/[r]eplace/h[i]dden/e[x]ternal? Mark [a]ll' - let roh[2][2] = ['r', 'i', 'x', 'a'] + if a:i == 2 + if !buflisted(bufnr('^'.fnamemodify(ctrlp#getcline(), ':p').'$')) + let roh[2][1] .= '/h[i]dden' + let roh[2][2] += ['i'] + en + if s:openfunc != {} && has_key(s:openfunc, s:ctype) + let roh[2][1] .= '/e[x]ternal' + let roh[2][2] += ['x'] + en en let str = roh[a:i][0].': [t]ab/[v]ertical/[h]orizontal'.roh[a:i][1].'? ' retu s:choices(str, ['t', 'v', 'h'] + roh[a:i][2], 's:argmaps', [a:md, a:i]) @@ -1636,14 +1823,40 @@ endf fu! s:narrowable() retu exists('s:act_add') && exists('s:matched') && s:matched != [] \ && exists('s:mdata') && s:mdata[:2] == [s:dyncwd, s:itemtype, s:regexp] - \ && s:matcher == {} + \ && s:matcher == {} && !exists('s:did_exp') +endf + +fu! s:getinput(...) + let [prt, spi] = [s:prompt, ( a:0 ? a:1 : '' )] + if s:abbrev != {} + let gmd = has_key(s:abbrev, 'gmode') ? s:abbrev['gmode'] : '' + let str = ( gmd =~ 't' && !a:0 ) || spi == 'c' ? prt[0] : join(prt, '') + if gmd =~ 't' && gmd =~ 'k' && !a:0 && matchstr(str, '.$') =~ '\k' + retu join(prt, '') + en + let [pf, rz] = [( s:byfname ? 'f' : 'p' ), ( s:regexp ? 'r' : 'z' )] + for dict in s:abbrev['abbrevs'] + let dmd = has_key(dict, 'mode') ? dict['mode'] : '' + let pat = escape(dict['pattern'], '~') + if ( dmd == '' || ( dmd =~ pf && dmd =~ rz && !a:0 ) + \ || dmd =~ '['.spi.']' ) && str =~ pat + let [str, s:did_exp] = [join(split(str, pat, 1), dict['expanded']), 1] + en + endfo + if gmd =~ 't' && !a:0 + let prt[0] = str + el + retu str + en + en + retu spi == 'c' ? prt[0] : join(prt, '') endf fu! s:migemo(str) - let str = a:str - let dict = s:glbpath(&rtp, printf("dict/%s/migemo-dict", &enc), 1) + let [str, rtp] = [a:str, s:fnesc(&rtp, 'g')] + let dict = s:glbpath(rtp, printf("dict/%s/migemo-dict", &enc), 1) if !len(dict) - let dict = s:glbpath(&rtp, "dict/migemo-dict", 1) + let dict = s:glbpath(rtp, "dict/migemo-dict", 1) en if len(dict) let [tokens, str, cmd] = [split(str, '\s'), '', 'cmigemo -v -w %s -d %s'] @@ -1660,12 +1873,12 @@ fu! s:strwidth(str) endf fu! ctrlp#j2l(nr) - exe a:nr + exe 'norm!' a:nr.'G' sil! norm! zvzz endf fu! s:maxf(len) - retu s:maxfiles && a:len > s:maxfiles ? 1 : 0 + retu s:maxfiles && a:len > s:maxfiles endf fu! s:regexfilter(str) @@ -1677,7 +1890,7 @@ fu! s:regexfilter(str) endf fu! s:walker(m, p, d) - retu a:d > 0 ? a:p < a:m ? a:p + a:d : 0 : a:p > 0 ? a:p + a:d : a:m + retu a:d >= 0 ? a:p < a:m ? a:p + a:d : 0 : a:p > 0 ? a:p + a:d : a:m endf fu! s:delent(rfunc) @@ -1701,13 +1914,14 @@ endf " Entering & Exiting {{{2 fu! s:getenv() let [s:cwd, s:winres] = [getcwd(), [winrestcmd(), &lines, winnr('$')]] - let [s:crfile, s:crfpath] = [expand('%:p', 1), expand('%:p:h', 1)] - let [s:crword, s:crline] = [expand('', 1), getline('.')] + let [s:crword, s:crnbword] = [expand('', 1), expand('', 1)] + let [s:crgfile, s:crline] = [expand('', 1), getline('.')] let [s:winh, s:crcursor] = [min([s:mxheight, &lines]), getpos('.')] let [s:crbufnr, s:crvisual] = [bufnr('%'), s:lastvisual()] - let s:wpmode = exists('b:ctrlp_working_path_mode') - \ ? b:ctrlp_working_path_mode : s:pathmode - let [s:mrbs, s:crgfile] = [ctrlp#mrufiles#bufs(), expand('', 1)] + let s:crfile = bufname('%') == '' + \ ? '['.s:crbufnr.'*No Name]' : expand('%:p', 1) + let s:crfpath = expand('%:p:h', 1) + let s:mrbs = ctrlp#mrufiles#bufs() endf fu! s:lastvisual() @@ -1733,21 +1947,24 @@ endf fu! s:buffunc(e) if a:e && has_key(s:buffunc, 'enter') - cal call(s:buffunc['enter'], []) + cal call(s:buffunc['enter'], [], s:buffunc) elsei !a:e && has_key(s:buffunc, 'exit') - cal call(s:buffunc['exit'], []) + cal call(s:buffunc['exit'], [], s:buffunc) en endf -fu! s:openfile(cmd, fid, tail, ...) - let cmd = a:cmd =~ '^[eb]$' && &modified ? 'hid '.a:cmd : a:cmd - let cmd = cmd =~ '^tab' ? ctrlp#tabcount().cmd : cmd - let j2l = a:0 && a:1 ? a:2 : 0 - exe cmd.( a:0 && a:1 ? '' : a:tail ) ctrlp#fnesc(a:fid) - if j2l - exe j2l +fu! s:openfile(cmd, fid, tail, chkmod, ...) + let cmd = a:cmd + if a:chkmod && cmd =~ '^[eb]$' && ctrlp#modfilecond(!( cmd == 'b' && &aw )) + let cmd = cmd == 'b' ? 'sb' : 'sp' en - if !empty(a:tail) || j2l + let cmd = cmd =~ '^tab' ? ctrlp#tabcount().cmd : cmd + let j2l = a:0 && a:1[0] ? a:1[1] : 0 + exe cmd.( a:0 && a:1[0] ? '' : a:tail ) s:fnesc(a:fid, 'f') + if j2l + cal ctrlp#j2l(j2l) + en + if !empty(a:tail) sil! norm! zvzz en if cmd != 'bad' @@ -1827,20 +2044,30 @@ fu! s:mmode() retu matchmodes[s:mfunc] endf " Cache {{{2 -fu! s:writecache(cache_file) - if ( g:ctrlp_newcache || !filereadable(a:cache_file) ) && !s:nocache() +fu! s:writecache(cafile) + if ( g:ctrlp_newcache || !filereadable(a:cafile) ) && !s:nocache() cal ctrlp#utils#writecache(g:ctrlp_allfiles) let g:ctrlp_newcache = 0 en endf -fu! s:nocache() - retu !s:caching || ( s:caching > 1 && get(s:ficounts, s:dyncwd) < s:caching ) +fu! s:nocache(...) + if !s:caching + retu 1 + elsei s:caching > 1 + if !( exists(s:ccex) && !{s:ccex} ) || has_key(s:ficounts, s:dyncwd) + retu get(s:ficounts, s:dyncwd, [0, 0])[0] < s:caching + elsei a:0 && filereadable(a:1) + retu len(ctrlp#utils#readfile(a:1)) < s:caching + en + retu 1 + en + retu 0 endf fu! s:insertcache(str) let [data, g:ctrlp_newcache, str] = [g:ctrlp_allfiles, 1, a:str] - if strlen(str) <= strlen(data[0]) + if data == [] || strlen(str) <= strlen(data[0]) let pos = 0 elsei strlen(str) >= strlen(data[-1]) let pos = len(data) - 1 @@ -1874,6 +2101,14 @@ fu! s:getextvar(key) retu -1 endf +fu! ctrlp#getcline() + retu !empty(s:lines) ? s:lines[line('.') - 1] : '' +endf + +fu! ctrlp#getmarkedlist() + retu exists('s:marked') ? values(s:marked) : [] +endf + fu! ctrlp#exit() cal s:PrtExit() endf @@ -1897,7 +2132,7 @@ fu! ctrlp#hicheck(grp, defgrp) endf fu! ctrlp#call(func, ...) - cal call(a:func, a:000) + retu call(a:func, a:000) endf "}}}1 " * Initialization {{{1 @@ -1913,15 +2148,18 @@ endf fu! ctrlp#init(type, ...) if exists('s:init') || s:iscmdwin() | retu | en + let [s:ermsg, v:errmsg] = [v:errmsg, ''] let [s:matches, s:init] = [1, 1] - cal ctrlp#reset() + cal s:Reset(a:0 ? a:1 : {}) noa cal s:Open() cal s:SetWD(a:0 ? a:1 : {}) - cal s:MapKeys() + cal s:MapNorms() + cal s:MapSpecs() cal ctrlp#syntax() cal ctrlp#setlines(s:settype(a:type)) cal s:SetDefTxt() cal s:BuildPrompt(1) + if s:keyloop | cal s:KeyLoop() | en endf " - Autocmds {{{1 if has('autocmd') diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp/buffertag.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp/buffertag.vim index 09e18bea..aa67afa6 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp/buffertag.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp/buffertag.vim @@ -149,13 +149,16 @@ fu! s:esctagscmd(bin, args, ...) if exists('+ssl') let [ssl, &ssl] = [&ssl, 0] en - let fname = a:0 == 1 ? shellescape(a:1) : '' + let fname = a:0 ? shellescape(a:1) : '' let cmd = shellescape(a:bin).' '.a:args.' '.fname + if &sh =~ 'cmd\.exe' + let cmd = substitute(cmd, '[&()@^<>|]', '^\0', 'g') + en if exists('+ssl') let &ssl = ssl en if has('iconv') - let last = s:enc != &enc ? s:enc : !empty($LANG) ? $LANG : &enc + let last = s:enc != &enc ? s:enc : !empty( $LANG ) ? $LANG : &enc let cmd = iconv(cmd, &enc, last) en retu cmd @@ -170,12 +173,14 @@ fu! s:process(fname, ftype) el let data = s:exectagsonfile(a:fname, a:ftype) let [raw, lines] = [split(data, '\n\+'), []] - for line in raw | if len(split(line, ';"')) == 2 - let parsed_line = s:parseline(line) - if parsed_line != '' - cal add(lines, parsed_line) + for line in raw + if line !~# '^!_TAG_' && len(split(line, ';"')) == 2 + let parsed_line = s:parseline(line) + if parsed_line != '' + cal add(lines, parsed_line) + en en - en | endfo + endfo let cache = { a:fname : { 'time': ftime, 'lines': lines } } cal extend(g:ctrlp_buftags, cache) en @@ -183,8 +188,8 @@ fu! s:process(fname, ftype) endf fu! s:parseline(line) - let eval = '\v^([^\t]+)\t(.+)\t\/\^(.+)\$\/\;\"\t(.+)\tline(no)?\:(\d+)' - let vals = matchlist(a:line, eval) + let vals = matchlist(a:line, + \ '\v^([^\t]+)\t(.+)\t[?/]\^?(.{-1,})\$?[?/]\;\"\t(.+)\tline(no)?\:(\d+)') if vals == [] | retu '' | en let [bufnr, bufname] = [bufnr('^'.vals[2].'$'), fnamemodify(vals[2], ':p:t')] retu vals[1].' '.vals[4].'|'.bufnr.':'.bufname.'|'.vals[6].'| '.vals[3] @@ -200,6 +205,19 @@ fu! s:syntax() sy match CtrlPTabExtra '\zs\t.*\ze$' contains=CtrlPBufName,CtrlPTagKind en endf + +fu! s:chknearby(pat) + if match(getline('.'), a:pat) < 0 + let [int, forw, maxl] = [1, 1, line('$')] + wh !search(a:pat, 'W'.( forw ? '' : 'b' )) + if !forw + if int > maxl | brea | en + let int += int + en + let forw = !forw + endw + en +endf " Public {{{1 fu! ctrlp#buffertag#init(fname) let bufs = exists('s:btmode') && s:btmode @@ -208,7 +226,7 @@ fu! ctrlp#buffertag#init(fname) let lines = [] for each in bufs let bname = fnamemodify(each, ':p') - let tftype = get(split(getbufvar(bname, '&ft'), '\.'), 0, '') + let tftype = get(split(getbufvar('^'.bname.'$', '&ft'), '\.'), 0, '') cal extend(lines, s:process(bname, tftype)) endfo cal s:syntax() @@ -216,10 +234,14 @@ fu! ctrlp#buffertag#init(fname) endf fu! ctrlp#buffertag#accept(mode, str) - let vals = matchlist(a:str, '\v^[^\t]+\t+[^\t|]+\|(\d+)\:[^\t|]+\|(\d+)\|') + let vals = matchlist(a:str, + \ '\v^[^\t]+\t+[^\t|]+\|(\d+)\:[^\t|]+\|(\d+)\|\s(.+)$') let bufnr = str2nr(get(vals, 1)) if bufnr - cal ctrlp#acceptfile(a:mode, bufname(bufnr), get(vals, 2)) + cal ctrlp#acceptfile(a:mode, bufnr) + exe 'norm!' str2nr(get(vals, 2, line('.'))).'G' + cal s:chknearby('\V\C'.get(vals, 3, '')) + sil! norm! zvzz en endf diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp/changes.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp/changes.vim index c391aad9..67a299c6 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp/changes.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp/changes.vim @@ -59,7 +59,8 @@ fu! ctrlp#changes#init(original_bufnr, bufnr) let [swb, &swb] = [&swb, ''] let lines = [] for each in bufs - let fnamet = fnamemodify(bufname(each), ':t') + let bname = bufname(each) + let fnamet = fnamemodify(bname == '' ? '[No Name]' : bname, ':t') cal extend(lines, s:process(s:changelist(each), each, fnamet)) endfo sil! exe 'noa hid b' a:original_bufnr @@ -73,7 +74,7 @@ fu! ctrlp#changes#accept(mode, str) let info = matchlist(a:str, '\t|\(\d\+\):[^|]\+|\(\d\+\):\(\d\+\)|$') let bufnr = str2nr(get(info, 1)) if bufnr - cal ctrlp#acceptfile(a:mode, bufname(bufnr)) + cal ctrlp#acceptfile(a:mode, bufnr) cal cursor(get(info, 2), get(info, 3)) sil! norm! zvzz en diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp/dir.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp/dir.vim index e9a6c1ca..091e66c2 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp/dir.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp/dir.vim @@ -32,12 +32,13 @@ fu! s:globdirs(dirs, depth) let nr = len(g:ctrlp_alldirs) if !empty(dirs) && !s:max(nr, s:maxfiles) && depth <= s:maxdepth sil! cal ctrlp#progress(nr) + cal map(dirs, 'ctrlp#utils#fnesc(v:val, "g", ",")') cal s:globdirs(join(dirs, ','), depth) en endf fu! s:max(len, max) - retu a:max && a:len > a:max ? 1 : 0 + retu a:max && a:len > a:max endf fu! s:nocache() @@ -53,7 +54,9 @@ fu! ctrlp#dir#init(...) let cafile = cadir.ctrlp#utils#lash().ctrlp#utils#cachefile('dir') if g:ctrlp_newdir || s:nocache() || !filereadable(cafile) let [s:initcwd, g:ctrlp_alldirs] = [s:cwd, []] - cal s:globdirs(s:cwd, 0) + if !ctrlp#igncwd(s:cwd) + cal s:globdirs(ctrlp#utils#fnesc(s:cwd, 'g', ','), 0) + en cal ctrlp#rmbasedir(g:ctrlp_alldirs) if len(g:ctrlp_alldirs) <= s:compare_lim cal sort(g:ctrlp_alldirs, 'ctrlp#complen') diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp/line.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp/line.vim index a2e0ddeb..e82bf1b5 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp/line.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp/line.vim @@ -33,9 +33,12 @@ fu! ctrlp#line#init() let [bufs, lines] = [ctrlp#buffers('id'), []] for bufnr in bufs let [lfb, bufn] = [getbufline(bufnr, 1, '$'), bufname(bufnr)] - let lfb = lfb == [] ? ctrlp#utils#readfile(fnamemodify(bufn, ':p')) : lfb + if lfb == [] && bufn != '' + let lfb = ctrlp#utils#readfile(fnamemodify(bufn, ':p')) + en cal map(lfb, 'tr(v:val, '' '', '' '')') - let [linenr, len_lfb, buft] = [1, len(lfb), fnamemodify(bufn, ':t')] + let [linenr, len_lfb] = [1, len(lfb)] + let buft = bufn == '' ? '[No Name]' : fnamemodify(bufn, ':t') wh linenr <= len_lfb let lfb[linenr - 1] .= ' |'.buft.'|'.bufnr.':'.linenr.'|' let linenr += 1 @@ -50,7 +53,7 @@ fu! ctrlp#line#accept(mode, str) let info = matchlist(a:str, '\t|[^|]\+|\(\d\+\):\(\d\+\)|$') let bufnr = str2nr(get(info, 1)) if bufnr - cal ctrlp#acceptfile(a:mode, bufname(bufnr), get(info, 2)) + cal ctrlp#acceptfile(a:mode, bufnr, get(info, 2)) en endf diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp/mixed.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp/mixed.vim index cf01d107..74d904d8 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp/mixed.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp/mixed.vim @@ -41,7 +41,11 @@ fu! s:getnewmix(cwd, clim) if exists('+ssl') && &ssl cal map(mrufs, 'tr(v:val, "\\", "/")') en - let bufs = map(ctrlp#buffers('id'), 'fnamemodify(bufname(v:val), ":p")') + let allbufs = map(ctrlp#buffers(), 'fnamemodify(v:val, ":p")') + let [bufs, ubufs] = [[], []] + for each in allbufs + cal add(filereadable(each) ? bufs : ubufs, each) + endfo let mrufs = bufs + filter(mrufs, 'index(bufs, v:val) < 0') if len(mrufs) > len(g:ctrlp_lines) cal filter(mrufs, 'stridx(v:val, a:cwd)') @@ -53,6 +57,7 @@ fu! s:getnewmix(cwd, clim) if id >= 0 | cal remove(g:ctrlp_lines, id) | en endfo en + let mrufs += ubufs cal map(mrufs, 'fnamemodify(v:val, ":.")') let g:ctrlp_lines = len(mrufs) > len(g:ctrlp_lines) \ ? g:ctrlp_lines + mrufs : mrufs + g:ctrlp_lines diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp/mrufiles.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp/mrufiles.vim index 161df2da..e34f4504 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp/mrufiles.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp/mrufiles.vim @@ -14,6 +14,7 @@ fu! ctrlp#mrufiles#opts() \ 'exclude': ['s:ex', ''], \ 'case_sensitive': ['s:cseno', 1], \ 'relative': ['s:re', 0], + \ 'save_on_update': ['s:soup', 1], \ }] for [ke, va] in items(opts) let [{va[0]}, {pref.ke}] = [pref.ke, exists(pref.ke) ? {pref.ke} : va[1]] @@ -37,29 +38,47 @@ fu! s:chop(mrufs) retu a:mrufs endf -fu! s:reformat(mrufs) +fu! s:reformat(mrufs, ...) + let cwd = getcwd() + let cwd .= cwd !~ '[\/]$' ? ctrlp#utils#lash() : '' if {s:re} - let cwd = exists('+ssl') ? tr(getcwd(), '/', '\') : getcwd() + let cwd = exists('+ssl') ? tr(cwd, '/', '\') : cwd cal filter(a:mrufs, '!stridx(v:val, cwd)') en - retu map(a:mrufs, 'fnamemodify(v:val, ":.")') + if a:0 && a:1 == 'raw' | retu a:mrufs | en + let idx = strlen(cwd) + if exists('+ssl') && &ssl + let cwd = tr(cwd, '\', '/') + cal map(a:mrufs, 'tr(v:val, "\\", "/")') + en + retu map(a:mrufs, '!stridx(v:val, cwd) ? strpart(v:val, idx) : v:val') endf fu! s:record(bufnr) if s:locked | retu | en let bufnr = a:bufnr + 0 - if bufnr <= 0 | retu | en let bufname = bufname(bufnr) - if empty(bufname) | retu | en - let fn = fnamemodify(bufname, ':p') - let fn = exists('+ssl') ? tr(fn, '/', '\') : fn - cal filter(s:mrbs, 'v:val != bufnr') - cal insert(s:mrbs, bufnr) - if ( !empty({s:in}) && fn !~# {s:in} ) || ( !empty({s:ex}) && fn =~# {s:ex} ) - \ || !empty(&bt) || !filereadable(fn) | retu + if bufnr > 0 && !empty(bufname) + cal filter(s:mrbs, 'v:val != bufnr') + cal insert(s:mrbs, bufnr) + cal s:addtomrufs(bufname) + en +endf + +fu! s:addtomrufs(fname) + let fn = fnamemodify(a:fname, ':p') + let fn = exists('+ssl') ? tr(fn, '/', '\') : fn + if ( !empty({s:in}) && fn !~# {s:in} ) || ( !empty({s:ex}) && fn =~# {s:ex} ) + \ || !empty(getbufvar('^'.fn.'$', '&bt')) || !filereadable(fn) | retu + en + let idx = index(s:mrufs, fn, 0, !{s:cseno}) + if idx + cal filter(s:mrufs, 'v:val !='.( {s:cseno} ? '#' : '?' ).' fn') + cal insert(s:mrufs, fn) + if {s:soup} && idx < 0 + cal s:savetofile(s:mergelists()) + en en - cal filter(s:mrufs, 'v:val !='.( {s:cseno} ? '#' : '?' ).' fn') - cal insert(s:mrufs, fn) endf fu! s:savetofile(mrufs) @@ -67,28 +86,40 @@ fu! s:savetofile(mrufs) endf " Public {{{1 fu! ctrlp#mrufiles#refresh(...) - let s:mrufs = s:mergelists() - cal filter(s:mrufs, '!empty(ctrlp#utils#glob(v:val, 1)) && !s:excl(v:val)') + let mrufs = s:mergelists() + cal filter(mrufs, '!empty(ctrlp#utils#glob(v:val, 1)) && !s:excl(v:val)') if exists('+ssl') + cal map(mrufs, 'tr(v:val, "/", "\\")') cal map(s:mrufs, 'tr(v:val, "/", "\\")') - cal filter(s:mrufs, 'count(s:mrufs, v:val) == 1') + let cond = 'count(mrufs, v:val, !{s:cseno}) == 1' + cal filter(mrufs, cond) + cal filter(s:mrufs, cond) en - cal s:savetofile(s:mrufs) - retu a:0 && a:1 == 'raw' ? [] : s:reformat(copy(s:mrufs)) + cal s:savetofile(mrufs) + retu a:0 && a:1 == 'raw' ? [] : s:reformat(mrufs) endf fu! ctrlp#mrufiles#remove(files) - let s:mrufs = [] + let mrufs = [] if a:files != [] - let s:mrufs = s:mergelists() - cal filter(s:mrufs, 'index(a:files, v:val, 0, '.(!{s:cseno}).') < 0') + let mrufs = s:mergelists() + let cond = 'index(a:files, v:val, 0, !{s:cseno}) < 0' + cal filter(mrufs, cond) + cal filter(s:mrufs, cond) + en + cal s:savetofile(mrufs) + retu s:reformat(mrufs) +endf + +fu! ctrlp#mrufiles#add(fn) + if !empty(a:fn) + cal s:addtomrufs(a:fn) en - cal s:savetofile(s:mrufs) - retu s:reformat(copy(s:mrufs)) endf fu! ctrlp#mrufiles#list(...) - retu a:0 ? a:1 == 'raw' ? s:mergelists() : 0 : s:reformat(s:mergelists()) + retu a:0 ? a:1 == 'raw' ? s:reformat(s:mergelists(), a:1) : 0 + \ : s:reformat(s:mergelists()) endf fu! ctrlp#mrufiles#bufs() @@ -108,7 +139,7 @@ fu! ctrlp#mrufiles#init() let s:locked = 0 aug CtrlPMRUF au! - au BufAdd,BufEnter,BufLeave,BufUnload * cal s:record(expand('', 1)) + au BufAdd,BufEnter,BufLeave,BufWritePost * cal s:record(expand('', 1)) au QuickFixCmdPre *vimgrep* let s:locked = 1 au QuickFixCmdPost *vimgrep* let s:locked = 0 au VimLeavePre * cal s:savetofile(s:mergelists()) diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp/quickfix.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp/quickfix.vim index 144851de..03ab9210 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp/quickfix.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp/quickfix.vim @@ -40,18 +40,15 @@ fu! ctrlp#quickfix#init() endf fu! ctrlp#quickfix#accept(mode, str) - let items = matchlist(a:str, '^\([^|]\+\ze\)|\(\d\+\):\(\d\+\)|') - if items == [] | retu | en - let [md, filpath] = [a:mode, fnamemodify(items[1], ':p')] - if empty(filpath) | retu | en - cal ctrlp#exit() - let cmd = md == 't' ? 'tabe' : md == 'h' ? 'new' : md == 'v' ? 'vne' - \ : ctrlp#normcmd('e') - let cmd = cmd == 'e' && &modified ? 'hid e' : cmd - exe cmd ctrlp#fnesc(filpath) - cal cursor(items[2], items[3]) + let vals = matchlist(a:str, '^\([^|]\+\ze\)|\(\d\+\):\(\d\+\)|') + if vals == [] || vals[1] == '' | retu | en + cal ctrlp#acceptfile(a:mode, vals[1]) + let cur_pos = getpos('.')[1:2] + if cur_pos != [1, 1] && cur_pos != map(vals[2:3], 'str2nr(v:val)') + mark ' + en + cal cursor(vals[2], vals[3]) sil! norm! zvzz - cal ctrlp#setlcdir() endf fu! ctrlp#quickfix#id() diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp/rtscript.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp/rtscript.vim index cdae9a19..eed21c61 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp/rtscript.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp/rtscript.vim @@ -24,23 +24,26 @@ let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) let s:filecounts = {} " Utilities {{{1 fu! s:nocache() - retu !s:caching || ( s:caching > 1 && get(s:filecounts, s:cwd) < s:caching ) + retu g:ctrlp_newrts || + \ !s:caching || ( s:caching > 1 && get(s:filecounts, s:cwd) < s:caching ) endf " Public {{{1 fu! ctrlp#rtscript#init(caching) let [s:caching, s:cwd] = [a:caching, getcwd()] - if g:ctrlp_newrts || s:nocache() - \ || !( exists('g:ctrlp_rtscache') && g:ctrlp_rtscache[0] == &rtp ) + if s:nocache() || + \ !( exists('g:ctrlp_rtscache') && g:ctrlp_rtscache[0] == &rtp ) sil! cal ctrlp#progress('Indexing...') - let entries = split(globpath(&rtp, '**/*.*'), "\n") + let entries = split(globpath(ctrlp#utils#fnesc(&rtp, 'g'), '**/*.*'), "\n") cal filter(entries, 'count(entries, v:val) == 1') let [entries, echoed] = [ctrlp#dirnfile(entries)[1], 1] el let [entries, results] = g:ctrlp_rtscache[2:3] en - if g:ctrlp_newrts || s:nocache() - \ || !( exists('g:ctrlp_rtscache') && g:ctrlp_rtscache[:1] == [&rtp, s:cwd] ) - if !exists('echoed') | sil! cal ctrlp#progress('Processing...') | en + if s:nocache() || + \ !( exists('g:ctrlp_rtscache') && g:ctrlp_rtscache[:1] == [&rtp, s:cwd] ) + if !exists('echoed') + sil! cal ctrlp#progress('Processing...') + en let results = map(copy(entries), 'fnamemodify(v:val, '':.'')') en let [g:ctrlp_rtscache, g:ctrlp_newrts] = [[&rtp, s:cwd, entries, results], 0] diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp/tag.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp/tag.vim index 53b5d612..cd4d9097 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp/tag.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp/tag.vim @@ -54,11 +54,11 @@ fu! s:filter(tags) let nr = 0 wh 0 < 1 if a:tags == [] | brea | en - if a:tags[nr] =~ '^!' && a:tags[nr] !~ '^!_TAG_' + if a:tags[nr] =~ '^!' && a:tags[nr] !~# '^!_TAG_' let nr += 1 con en - if a:tags[nr] =~ '^!_TAG_' && len(a:tags) > nr + if a:tags[nr] =~# '^!_TAG_' && len(a:tags) > nr cal remove(a:tags, nr) el brea @@ -97,15 +97,19 @@ fu! ctrlp#tag#accept(mode, str) \ 'e': ['', 'tj'], \ } let cmd = fnd[0] == 1 ? cmds[a:mode][0] : cmds[a:mode][1] - let cmd = cmd == 'tj' && &mod ? 'hid '.cmd : cmd + let cmd = a:mode == 'e' && ctrlp#modfilecond(!&aw) + \ ? ( cmd == 'tj' ? 'stj' : 'sp' ) : cmd let cmd = a:mode == 't' ? ctrlp#tabcount().cmd : cmd if fnd[0] == 1 if cmd != '' exe cmd en - exe fnd[1].'ta' tg + let save_cst = &cst + set cst& + cal feedkeys(":".fnd[1]."ta ".tg."\r", 'nt') + let &cst = save_cst el - exe cmd tg + cal feedkeys(":".cmd." ".tg."\r", 'nt') en cal ctrlp#setlcdir() endf diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp/utils.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp/utils.vim index f2aa9050..91b9f24e 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp/utils.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp/utils.vim @@ -8,25 +8,28 @@ fu! ctrlp#utils#lash() retu &ssl || !exists('+ssl') ? '/' : '\' endf -let s:lash = ctrlp#utils#lash() fu! s:lash(...) retu ( a:0 ? a:1 : getcwd() ) !~ '[\/]$' ? s:lash : '' endf fu! ctrlp#utils#opts() - let usrhome = $HOME.s:lash($HOME) + let s:lash = ctrlp#utils#lash() + let usrhome = $HOME . s:lash( $HOME ) let cahome = exists('$XDG_CACHE_HOME') ? $XDG_CACHE_HOME : usrhome.'.cache' - let s:cache_dir = isdirectory(usrhome.'.ctrlp_cache') + let cadir = isdirectory(usrhome.'.ctrlp_cache') \ ? usrhome.'.ctrlp_cache' : cahome.s:lash(cahome).'ctrlp' if exists('g:ctrlp_cache_dir') - let s:cache_dir = expand(g:ctrlp_cache_dir, 1) - if isdirectory(s:cache_dir.s:lash(s:cache_dir).'.ctrlp_cache') - let s:cache_dir = s:cache_dir.s:lash(s:cache_dir).'.ctrlp_cache' + let cadir = expand(g:ctrlp_cache_dir, 1) + if isdirectory(cadir.s:lash(cadir).'.ctrlp_cache') + let cadir = cadir.s:lash(cadir).'.ctrlp_cache' en en + let s:cache_dir = cadir endf cal ctrlp#utils#opts() + +let s:wig_cond = v:version > 702 || ( v:version == 702 && has('patch051') ) " Files and Directories {{{1 fu! ctrlp#utils#cachedir() retu s:cache_dir @@ -64,8 +67,43 @@ fu! ctrlp#utils#writecache(lines, ...) endf fu! ctrlp#utils#glob(...) - let cond = v:version > 702 || ( v:version == 702 && has('patch051') ) - retu call('glob', cond ? a:000 : [a:1]) + let path = ctrlp#utils#fnesc(a:1, 'g') + retu s:wig_cond ? glob(path, a:2) : glob(path) +endf + +fu! ctrlp#utils#globpath(...) + retu call('globpath', s:wig_cond ? a:000 : a:000[:1]) +endf + +fu! ctrlp#utils#fnesc(path, type, ...) + if exists('*fnameescape') + if exists('+ssl') + if a:type == 'c' + let path = escape(a:path, '%#') + elsei a:type == 'f' + let path = fnameescape(a:path) + elsei a:type == 'g' + let path = escape(a:path, '?*') + en + let path = substitute(path, '[', '[[]', 'g') + el + let path = fnameescape(a:path) + en + el + if exists('+ssl') + if a:type == 'c' + let path = escape(a:path, '%#') + elsei a:type == 'f' + let path = escape(a:path, " \t\n%#*?|<\"") + elsei a:type == 'g' + let path = escape(a:path, '?*') + en + let path = substitute(path, '[', '[[]', 'g') + el + let path = escape(a:path, " \t\n*?[{`$\\%#'\"|!<") + en + en + retu a:0 ? escape(path, a:1) : path endf "}}} diff --git a/sources_non_forked/ctrlp.vim/doc/ctrlp.txt b/sources_non_forked/ctrlp.vim/doc/ctrlp.txt index 82633a47..cf3e23a4 100644 --- a/sources_non_forked/ctrlp.vim/doc/ctrlp.txt +++ b/sources_non_forked/ctrlp.vim/doc/ctrlp.txt @@ -1,4 +1,4 @@ -*ctrlp.txt* Fuzzy file, buffer, mru, tag, ... finder. v1.78 +*ctrlp.txt* Fuzzy file, buffer, mru, tag, ... finder. v1.79 *CtrlP* *ControlP* *'ctrlp'* *'ctrl-p'* =============================================================================== # # @@ -35,50 +35,53 @@ OPTIONS *ctrlp-options* Overview:~ - |loaded_ctrlp| Disable the plugin. - |ctrlp_map| Default mapping. - |ctrlp_cmd| Default command used for the default mapping. - |ctrlp_by_filename| Default to filename mode or not. - |ctrlp_regexp| Default to regexp mode or not. - |ctrlp_match_window_bottom| Where to show the match window. - |ctrlp_match_window_reversed| Sort order in the match window. - |ctrlp_max_height| Max height of the match window. - |ctrlp_switch_buffer| Jump to an open buffer if already opened. - |ctrlp_reuse_window| Reuse special windows (help, quickfix, etc). - |ctrlp_tabpage_position| Where to put the new tab page. - |ctrlp_working_path_mode| How to set CtrlP's local working directory. - |ctrlp_root_markers| Additional, high priority root markers. - |ctrlp_use_caching| Use per-session caching or not. - |ctrlp_clear_cache_on_exit| Keep cache after exiting Vim or not. - |ctrlp_cache_dir| Location of the cache directory. - |ctrlp_dotfiles| Ignore dotfiles and dotdirs or not. - |ctrlp_custom_ignore| Hide stuff when using |globpath()|. - |ctrlp_max_files| Number of files to scan initially. - |ctrlp_max_depth| Directory depth to recurse into when scanning. - |ctrlp_user_command| Use an external scanner. - |ctrlp_max_history| Number of entries saved in the prompt history. - |ctrlp_open_new_file| How to open a file created by . - |ctrlp_open_multiple_files| How to open files selected by . - |ctrlp_arg_map| Intercept and or not. - |ctrlp_follow_symlinks| Follow symbolic links or not. - |ctrlp_lazy_update| Only update when typing has stopped. - |ctrlp_default_input| Seed the prompt with an initial string. - |ctrlp_use_migemo| Use Migemo patterns for Japanese filenames. - |ctrlp_prompt_mappings| Change the mappings in the prompt. + |loaded_ctrlp|................Disable the plugin. + |ctrlp_map|...................Default mapping. + |ctrlp_cmd|...................Default command used for the default mapping. + |ctrlp_by_filename|...........Default to filename mode or not. + |ctrlp_regexp|................Default to regexp mode or not. + |ctrlp_match_window_bottom|...Where to show the match window. + |ctrlp_match_window_reversed|.Sort order in the match window. + |ctrlp_max_height|............Max height of the match window. + |ctrlp_switch_buffer|.........Jump to an open buffer if already opened. + |ctrlp_reuse_window|..........Reuse special windows (help, quickfix, etc). + |ctrlp_tabpage_position|......Where to put the new tab page. + |ctrlp_working_path_mode|.....How to set CtrlP's local working directory. + |ctrlp_root_markers|..........Additional, high priority root markers. + |ctrlp_use_caching|...........Use per-session caching or not. + |ctrlp_clear_cache_on_exit|...Keep cache after exiting Vim or not. + |ctrlp_cache_dir|.............Location of the cache directory. + |ctrlp_show_hidden|...........Ignore dotfiles and dotdirs or not. + |ctrlp_custom_ignore|.........Hide stuff when using |globpath()|. + |ctrlp_max_files|.............Number of files to scan initially. + |ctrlp_max_depth|.............Directory depth to recurse into when scanning. + |ctrlp_user_command|..........Use an external scanner. + |ctrlp_max_history|...........Number of entries saved in the prompt history. + |ctrlp_open_new_file|.........How to open a file created by . + |ctrlp_open_multiple_files|...How to open files selected by . + |ctrlp_arg_map|...............Intercept and or not. + |ctrlp_follow_symlinks|.......Follow symbolic links or not. + |ctrlp_lazy_update|...........Only update when typing has stopped. + |ctrlp_default_input|.........Seed the prompt with an initial string. + |ctrlp_abbrev|................Input abbreviations. + |ctrlp_key_loop|..............Use input looping for multi-byte input. + |ctrlp_use_migemo|............Use Migemo patterns for Japanese filenames. + |ctrlp_prompt_mappings|.......Change the mappings inside the prompt. MRU mode: - |ctrlp_mruf_max| Max MRU entries to remember. - |ctrlp_mruf_exclude| Files that shouldn't be remembered. - |ctrlp_mruf_include| Files to be remembered. - |ctrlp_mruf_relative| Show only MRU files in the working directory. - |ctrlp_mruf_default_order| Disable sorting. - |ctrlp_mruf_case_sensitive| MRU files are case sensitive or not. + |ctrlp_mruf_max|..............Max MRU entries to remember. + |ctrlp_mruf_exclude|..........Files that shouldn't be remembered. + |ctrlp_mruf_include|..........Files to be remembered. + |ctrlp_mruf_relative|.........Show only MRU files in the working directory. + |ctrlp_mruf_default_order|....Disable sorting. + |ctrlp_mruf_case_sensitive|...MRU files are case sensitive or not. + |ctrlp_mruf_save_on_update|...Save to disk whenever a new entry is added. Advanced options: - |ctrlp_open_func| Use custom file opening functions. - |ctrlp_status_func| Change CtrlP's two statuslines. - |ctrlp_buffer_func| Call custom functions in the CtrlP buffer. - |ctrlp_match_func| Replace the built-in matching algorithm. + |ctrlp_open_func|.............Use custom file opening functions. + |ctrlp_status_func|...........Change CtrlP's two statuslines. + |ctrlp_buffer_func|...........Call custom functions in the CtrlP buffer. + |ctrlp_match_func|............Replace the built-in matching algorithm. ------------------------------------------------------------------------------- Detailed descriptions and default values:~ @@ -128,13 +131,16 @@ Set the maximum height of the match window: > < *'g:ctrlp_switch_buffer'* -When opening a file with or , if the file's already opened somewhere -CtrlP will try to jump to it instead of opening a new instance: > - let g:ctrlp_switch_buffer = 2 +When opening a file, if it's already open in a window somewhere, CtrlP will try +to jump to it instead of opening a new instance: > + let g:ctrlp_switch_buffer = 'Et' < - 1 - only jump to the buffer if it's opened in the current tab. - 2 - jump tab as well if the buffer's opened in another tab. - 0 - disable this feature. + e - jump when is pressed, but only to windows in the current tab. + t - jump when is pressed, but only to windows in another tab. + v - like "e", but jump when is pressed. + h - like "e", but jump when is pressed. + E, T, V, H - like "e", "t", "v", and "h", but jump to windows anywhere. + 0 or - disable this feature. *'g:ctrlp_reuse_window'* When opening a file with , CtrlP avoids opening it in windows created by @@ -160,24 +166,29 @@ Where to put the new tab page when opening one: > *'g:ctrlp_working_path_mode'* When starting up, CtrlP sets its local working directory according to this variable: > - let g:ctrlp_working_path_mode = 'rc' + let g:ctrlp_working_path_mode = 'ra' < c - the directory of the current file. + a - like "c", but only applies when the current working directory outside of + CtrlP isn't a direct ancestor of the directory of the current file. r - the nearest ancestor that contains one of these directories or files: .git .hg .svn .bzr _darcs - {empty-string} - don't manage working directory. + w - begin finding a root from the current working directory outside of CtrlP + instead of from the directory of the current file (default). Only applies + when "r" is also present. + 0 or - disable this feature. -Note #1: you can use b:ctrlp_working_path_mode (a |b:var|) to set this option -on a per buffer basis. +Note #1: if "a" or "c" is included with "r", use the behavior of "a" or "c" (as +a fallback) when a root can't be found. -Note #2: with both 'r' and 'c' in the option, when a root isn't found, use the -directory of the current file. +Note #2: you can use a |b:var| to set this option on a per buffer basis. *'g:ctrlp_root_markers'* Use this to set your own root markers in addition to the default ones (.git, .hg, .svn, .bzr, and _darcs). Your markers will take precedence: > let g:ctrlp_root_markers = [''] < +Note: you can use a |b:var| to set this option on a per buffer basis. *'g:ctrlp_use_caching'* Enable/Disable per-session caching: > @@ -187,6 +198,7 @@ Enable/Disable per-session caching: > 1 - Enable caching. n - When bigger than 1, disable caching and use the number as the limit to enable caching again. + Note: you can quickly purge the cache by pressing while inside CtrlP. *'g:ctrlp_clear_cache_on_exit'* @@ -200,18 +212,20 @@ Set the directory to store the cache files: > let g:ctrlp_cache_dir = $HOME.'/.cache/ctrlp' < - *'g:ctrlp_dotfiles'* -Set this to 0 if you don't want CtrlP to scan for dotfiles and dotdirs: > - let g:ctrlp_dotfiles = 1 + *'g:ctrlp_show_hidden'* +Set this to 1 if you want CtrlP to scan for dotfiles and dotdirs: > + let g:ctrlp_show_hidden = 0 < +Note: does not apply when a command defined with |g:ctrlp_user_command| is +being used. *'ctrlp-wildignore'* You can use Vim's |'wildignore'| to exclude files and directories from the results. Examples: > " Excluding version control directories - set wildignore+=*/.git/*,*/.hg/*,*/.svn/* " Linux/MacOSX - set wildignore+=.git\*,.hg\*,.svn\* " Windows + set wildignore+=*/.git/*,*/.hg/*,*/.svn/* " Linux/MacOSX + set wildignore+=*\\.git\\*,*\\.hg\\*,*\\.svn\\* " Windows ('noshellslash') < Note #1: the `*/` in front of each directory glob is required. @@ -226,25 +240,36 @@ CtrlP to not show. Use regexp to specify the patterns: > let g:ctrlp_custom_ignore = '' < Examples: > - let g:ctrlp_custom_ignore = '\.git$\|\.hg$\|\.svn$' + let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$' let g:ctrlp_custom_ignore = { - \ 'dir': '\.git$\|\.hg$\|\.svn$', - \ 'file': '\.exe$\|\.so$\|\.dll$', + \ 'dir': '\v[\/]\.(git|hg|svn)$', + \ 'file': '\v\.(exe|so|dll)$', \ 'link': 'SOME_BAD_SYMBOLIC_LINKS', \ } + let g:ctrlp_custom_ignore = { + \ 'file': '\v(\.cpp|\.h|\.hh|\.cxx)@ let g:ctrlp_max_files = 10000 < +Note: does not apply when a command defined with |g:ctrlp_user_command| is +being used. *'g:ctrlp_max_depth'* The maximum depth of a directory tree to recurse into: > let g:ctrlp_max_depth = 40 < -Note: the larger these values, the more memory Vim uses. +Note: does not apply when a command defined with |g:ctrlp_user_command| is +being used. *'g:ctrlp_user_command'* Specify an external tool to use for listing files instead of using Vim's @@ -257,8 +282,10 @@ Examples: > < You can also use 'grep', 'findstr' or something else to filter the results. Examples: > - let g:ctrlp_user_command = 'find %s -type f | grep (?!tmp/.*)' - let g:ctrlp_user_command = 'dir %s /-n /b /s /a-d | findstr .*\.py$' + let g:ctrlp_user_command = + \ 'find %s -type f | grep -v -P "\.jpg$|/tmp/"' " MacOSX/Linux + let g:ctrlp_user_command = + \ 'dir %s /-n /b /s /a-d | findstr /v /l ".jpg \\tmp\\"' " Windows < Use a version control listing command when inside a repository, this is faster when scanning large projects: > @@ -268,12 +295,16 @@ when scanning large projects: > \ 1: [root_marker_1, listing_command_1], \ n: [root_marker_n, listing_command_n], \ }, - \ 'fallback': fallback_command + \ 'fallback': fallback_command, + \ 'ignore': 0 or 1 \ } < -Examples: > +Some examples: > + " Single VCS, listing command does not list untracked files: let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files'] let g:ctrlp_user_command = ['.hg', 'hg --cwd %s locate -I .'] + + " Multiple VCS's: let g:ctrlp_user_command = { \ 'types': { \ 1: ['.git', 'cd %s && git ls-files'], @@ -281,9 +312,29 @@ Examples: > \ }, \ 'fallback': 'find %s -type f' \ } + + " Single VCS, listing command lists untracked files (slower): + let g:ctrlp_user_command = + \ ['.git', 'cd %s && git ls-files . -co --exclude-standard'] + + let g:ctrlp_user_command = + \ ['.hg', 'hg --cwd %s status -numac -I . $(hg root)'] " MacOSX/Linux + + let g:ctrlp_user_command = ['.hg', 'for /f "tokens=1" %%a in (''hg root'') ' + \ . 'do hg --cwd %s status -numac -I . %%a'] " Windows < -If the fallback_command is empty or not defined, |globpath()| will then be used -when searching outside a repo. +Note #1: if the fallback_command is empty or the 'fallback' key is not defined, +|globpath()| will then be used when scanning outside of a repository. + +Note #2: unless the |Dictionary| format is used and 'ignore' is defined and set +to 1, the |wildignore| and |g:ctrlp_custom_ignore| options do not apply when +these custom commands are being used. When not present, 'ignore' is set to 0 by +default to retain the performance advantage of using external commands. + +Note #3: when changing the option's variable type, remember to |:unlet| it +first or restart Vim to avoid the "E706: Variable type mismatch" error. + +Note #4: you can use a |b:var| to set this option on a per buffer basis. *'g:ctrlp_max_history'* The maximum number of input strings you want CtrlP to remember. The default @@ -294,14 +345,13 @@ Set to 0 to disable prompt's history. Browse the history with and . *'g:ctrlp_open_new_file'* Use this option to specify how the newly created file is to be opened when -pressing : - t - in a new tab - h - in a new horizontal split - v - in a new vertical split - r - in the current window -> +pressing : > let g:ctrlp_open_new_file = 'v' < + t - in a new tab. + h - in a new horizontal split. + v - in a new vertical split. + r - in the current window. *'g:ctrlp_open_multiple_files'* If non-zero, this will enable opening multiple files with and : > @@ -322,7 +372,8 @@ For the letters: i - all files as hidden buffers. j - after opening, jump to the first opened tab or window. r - open the first file in the current window, then the remaining files in - new splits or new tabs depending on which of h, v and t is also present. + new splits or new tabs depending on which of "h", "v" and "t" is also + present. *'g:ctrlp_arg_map'* When this is set to 1, the and mappings will accept one extra key @@ -348,6 +399,9 @@ If non-zero, CtrlP will follow symbolic links when listing files: > 1 - follow but ignore looped internal symlinks to avoid duplicates. 2 - follow all symlinks indiscriminately. +Note: does not apply when a command defined with |g:ctrlp_user_command| is +being used. + *'g:ctrlp_lazy_update'* Set this to 1 to enable the lazy-update feature: only update the match window after typing's been stopped for a certain amount of time: > @@ -366,6 +420,68 @@ as the default input: > let g:ctrlp_default_input = 'anystring' < + *'g:ctrlp_abbrev'* +Define input abbreviations that can be expanded (either internally or visibly) +in the prompt: > + let g:ctrlp_abbrev = {} +< +Examples: > + let g:ctrlp_abbrev = { + \ 'gmode': 'i', + \ 'abbrevs': [ + \ { + \ 'pattern': '^cd b', + \ 'expanded': '@cd ~/.vim/bundle', + \ 'mode': 'pfrz', + \ }, + \ { + \ 'pattern': '\(^@.\+\|\\\@ (use the expanded string in the + new filename). + c - only when auto-completing directory names with (expand the pattern + immediately before doing the auto-completion). + or not defined - always enable. + +Note: the abbrev entries are evaluated in sequence, so a later entry can be +evaluated against the expanded result of a previous entry; this includes itself +when 'gmode' is "t". + + *'g:ctrlp_key_loop'* +An experimental feature. Set this to 1 to enable input looping for the typing +of multi-byte characters: > + let g:ctrlp_key_loop = 0 +< +Note #1: when set, this option resets the |g:ctrlp_lazy_update| option. + +Note #2: you can toggle this feature inside the prompt with a custom mapping: > + let g:ctrlp_prompt_mappings = { 'ToggleKeyLoop()': [''] } +< + *'g:ctrlp_use_migemo'* Set this to 1 to use Migemo Pattern for Japanese filenames. Migemo Search only works in regexp mode. To split the pattern, separate words with space: > @@ -412,9 +528,8 @@ only need to keep the lines that you've changed the values (inside []): > \ 'PrtExit()': ['', '', ''], \ } < -Note: In some terminals, it's not possible to remap without also changing - (|keycodes|). So if pressing moves the cursor to the left instead of -deleting a char for you, add this to your |.vimrc| to disable the plugin's +Note: if pressing moves the cursor one character to the left instead of +deleting a character for you, add this to your |.vimrc| to disable the plugin's default mapping: > let g:ctrlp_prompt_mappings = { 'PrtCurLeft()': ['', ''] } < @@ -460,6 +575,12 @@ MRU entries: > let g:ctrlp_mruf_case_sensitive = 1 < + *'g:ctrlp_mruf_save_on_update'* +Set this to 0 to disable saving of the MRU list to hard drive whenever a new +entry is added, saving will then only occur when exiting Vim: > + let g:ctrlp_mruf_save_on_update = 1 +< + ---------------------------------------- Advanced options:~ @@ -634,12 +755,13 @@ COMMANDS *ctrlp-commands* Open CtrlP in find Most-Recently-Used file mode. *:CtrlPLastMode* -:CtrlPLastMode - Open CtrlP in the last mode used. +:CtrlPLastMode [--dir] + Open CtrlP in the last mode used. When having the "--dir" argument, also + reuse the last working directory. *:CtrlPRoot* :CtrlPRoot - This acts like |:CtrlP| with |g:ctrlp_working_path_mode| = 'rc' and ignores + This acts like |:CtrlP| with |g:ctrlp_working_path_mode| = 'r' and ignores the variable's current value. *:CtrlPClearCache* @@ -768,7 +890,22 @@ Opening multiple files:~ - Mark/unmark a file to create a new file in its directory using . - Open files marked by . + - Open files marked by . + - When no file has been marked by , open a console dialog with the + following options: + + Open the selected file: + t - in a tab page. + v - in a vertical split. + h - in a horizontal split. + r - in the current window. + i - as a hidden buffer. + x - (optional) with the function defined in |g:ctrlp_open_func|. + + Other options (not shown): + a - mark all files in the match window. + d - change CtrlP's local working directory to the selected file's + directory and switch to find file mode. Function keys:~ @@ -891,7 +1028,7 @@ Available extensions:~ *:CtrlPTag* * Tag mode:~ - Name: 'tag' - - Command: ':CtrlPTag' + - Command: ":CtrlPTag" - Search for a tag within a generated central tags file, and jump to the definition. Use the Vim's option |'tags'| to specify the names and the locations of the tags file(s). @@ -901,21 +1038,21 @@ Available extensions:~ *:CtrlPBufTagAll* * Buffer Tag mode:~ - Name: 'buffertag' - - Commands: ':CtrlPBufTag [buffer]', - ':CtrlPBufTagAll'. + - Commands: ":CtrlPBufTag [buffer]", + ":CtrlPBufTagAll". - Search for a tag within the current buffer or all listed buffers and jump to the definition. Requires |exuberant_ctags| or compatible programs. *:CtrlPQuickfix* * Quickfix mode:~ - Name: 'quickfix' - - Command: ':CtrlPQuickfix' + - Command: ":CtrlPQuickfix" - Search for an entry in the current quickfix errors and jump to it. *:CtrlPDir* * Directory mode:~ - Name: 'dir' - - Command: ':CtrlPDir [starting-directory]' + - Command: ":CtrlPDir [starting-directory]" - Search for a directory and change the working directory to it. - Mappings: + change the local working directory for CtrlP and keep it open. @@ -927,42 +1064,42 @@ Available extensions:~ *:CtrlPRTS* * Runtime script mode:~ - Name: 'rtscript' - - Command: ':CtrlPRTS' + - Command: ":CtrlPRTS" - Search for files (vimscripts, docs, snippets...) in runtimepath. *:CtrlPUndo* * Undo mode:~ - Name: 'undo' - - Command: ':CtrlPUndo' + - Command: ":CtrlPUndo" - Browse undo history. *:CtrlPLine* * Line mode:~ - Name: 'line' - - Command: ':CtrlPLine' + - Command: ":CtrlPLine" - Search for a line in all listed buffers. *:CtrlPChange* *:CtrlPChangeAll* * Change list mode:~ - Name: 'changes' - - Commands: ':CtrlPChange [buffer]', - ':CtrlPChangeAll'. + - Commands: ":CtrlPChange [buffer]", + ":CtrlPChangeAll". - Search for and jump to a recent change in the current buffer or in all listed buffers. *:CtrlPMixed* * Mixed mode:~ - Name: 'mixed' - - Command: ':CtrlPMixed' + - Command: ":CtrlPMixed" - Search in files, buffers and MRU files at the same time. *:CtrlPBookmarkDir* *:CtrlPBookmarkDirAdd* * BookmarkDir mode:~ - Name: 'bookmarkdir' - - Commands: ':CtrlPBookmarkDir', - ':CtrlPBookmarkDirAdd [directory]'. + - Commands: ":CtrlPBookmarkDir", + ":CtrlPBookmarkDirAdd [directory]". - Search for a bookmarked directory and change the working directory to it. - Mappings: + change the local working directory for CtrlP, keep it open and @@ -1027,8 +1164,8 @@ Highlighting:~ Statuslines:~ * Highlight groups: - CtrlPMode1 : 'prt' or 'win', also for 'regex' (Character) - CtrlPMode2 : 'file' or 'path', also for the local working dir (|hl-LineNr|) + CtrlPMode1 : 'file' or 'path', and the current mode (Character) + CtrlPMode2 : 'prt' or 'win', 'regex', the working directory (|hl-LineNr|) CtrlPStats : the scanning status (Function) For rebuilding the statuslines, see |g:ctrlp_status_func|. @@ -1083,7 +1220,7 @@ MISCELLANEOUS CONFIGS *ctrlp-miscellaneous-configs* =============================================================================== CREDITS *ctrlp-credits* -Developed by Kien Nguyen . +Developed by Kien Nguyen . Distributed under Vim's |license|. Project's homepage: http://kien.github.com/ctrlp.vim Git repository: https://github.com/kien/ctrlp.vim @@ -1109,12 +1246,25 @@ Special thanks:~ * Luca Pette * Seth Fowler * Lowe Thiderman + * Christopher Fredén + * Zahary Karadjov + * Jo De Boeck =============================================================================== CHANGELOG *ctrlp-changelog* - + New options: |g:ctrlp_open_func|. - |g:ctrlp_tabpage_position|. +Before 2012/11/30~ + + + New options: |g:ctrlp_abbrev|, + |g:ctrlp_key_loop|, + |g:ctrlp_open_func|, + |g:ctrlp_tabpage_position|, + |g:ctrlp_mruf_save_on_update| + + Rename: + *g:ctrlp_dotfiles* -> |g:ctrlp_show_hidden|. + + Change |g:ctrlp_switch_buffer|'s and |g:ctrlp_working_path_mode|'s type + (old values still work). + + New key for |g:ctrlp_user_command| when it's a Dictionary: 'ignore'. Before 2012/06/15~ diff --git a/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim b/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim index f7d1b133..b6f9a27e 100644 --- a/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim +++ b/sources_non_forked/ctrlp.vim/plugin/ctrlp.vim @@ -21,19 +21,17 @@ com! -n=? -com=dir CtrlP cal ctrlp#init(0, { 'dir': }) com! -n=? -com=dir CtrlPMRUFiles cal ctrlp#init(2, { 'dir': }) com! -bar CtrlPBuffer cal ctrlp#init(1) -com! -bar CtrlPLastMode cal ctrlp#init(-1) +com! -n=? CtrlPLastMode cal ctrlp#init(-1, { 'args': }) com! -bar CtrlPClearCache cal ctrlp#clr() com! -bar CtrlPClearAllCaches cal ctrlp#clra() -com! -bar CtrlPReload cal ctrlp#reset() com! -bar ClearCtrlPCache cal ctrlp#clr() com! -bar ClearAllCtrlPCaches cal ctrlp#clra() -com! -bar ResetCtrlP cal ctrlp#reset() com! -bar CtrlPCurWD cal ctrlp#init(0, { 'mode': '' }) com! -bar CtrlPCurFile cal ctrlp#init(0, { 'mode': 'c' }) -com! -bar CtrlPRoot cal ctrlp#init(0, { 'mode': 'rc' }) +com! -bar CtrlPRoot cal ctrlp#init(0, { 'mode': 'r' }) if g:ctrlp_map != '' && !hasmapto(':'.g:ctrlp_cmd.'', 'n') exe 'nn ' g:ctrlp_map ':'.g:ctrlp_cmd.'' @@ -64,3 +62,5 @@ com! -bar CtrlPBookmarkDir cal ctrlp#init(ctrlp#bookmarkdir#id()) com! -n=? -com=dir CtrlPBookmarkDirAdd \ cal ctrlp#call('ctrlp#bookmarkdir#add', ) + +" vim:ts=2:sw=2:sts=2 diff --git a/sources_non_forked/ctrlp.vim/readme.md b/sources_non_forked/ctrlp.vim/readme.md index 90d6e6f9..bcd07c7f 100644 --- a/sources_non_forked/ctrlp.vim/readme.md +++ b/sources_non_forked/ctrlp.vim/readme.md @@ -23,6 +23,8 @@ Check `:help ctrlp-commands` and `:help ctrlp-extensions` for other commands. * Press `` and `` to cycle between modes. * Press `` to switch to filename only search instead of full path. * Press `` to switch to regexp mode. +* Use ``, `` or the arrow keys to navigate the result list. +* Use `` or ``, `` to open the selected entry in a new tab or in a new split. * Use ``, `` to select the next/previous string in the prompt's history. * Use `` to create a new file and its parent directories. * Use `` to mark/unmark multiple files and `` to open them. @@ -32,8 +34,7 @@ Run `:help ctrlp-mappings` or submit `?` in CtrlP for more mapping help. * Submit two or more dots `..` to go up the directory tree by one or multiple levels. * End the input string with a colon `:` followed by a command to execute it on the opening file(s): Use `:25` to jump to line 25. -Use `:/any\:\ string` to jump to the first instance of `any: string`. -Use `:difft` when opening multiple files to run `:difft` on the first 4 files. +Use `:diffthis` when opening multiple files to run `:diffthis` on the first 4 files. ## Basic Options * Change the default mapping and the default command to invoke CtrlP: @@ -46,26 +47,26 @@ Use `:difft` when opening multiple files to run `:difft` on the first 4 files. * When invoked, unless a starting directory is specified, CtrlP will set its local working directory according to this variable: ```vim - let g:ctrlp_working_path_mode = 'rc' + let g:ctrlp_working_path_mode = 'ra' ``` - `{empty-string}` - don't manage working directory. - `c` - the directory of the current file. - `r` - the nearest ancestor that contains one of these directories or files: - `.git` `.hg` `.svn` `.bzr` `_darcs` + `'c'` - the directory of the current file. + `'r'` - the nearest ancestor that contains one of these directories or files: `.git` `.hg` `.svn` `.bzr` `_darcs` + `'a'` - like c, but only if the current working directory outside of CtrlP is not a direct ancestor of the directory of the current file. + `0` or `''` (empty string) - disable this feature. Define additional root markers with the `g:ctrlp_root_markers` option. * Exclude files and directories using Vim's `wildignore` and CtrlP's own `g:ctrlp_custom_ignore`: ```vim - set wildignore+=*/tmp/*,*.so,*.swp,*.zip " MacOSX/Linux - set wildignore+=tmp\*,*.swp,*.zip,*.exe " Windows + set wildignore+=*/tmp/*,*.so,*.swp,*.zip " MacOSX/Linux + set wildignore+=*\\tmp\\*,*.swp,*.zip,*.exe " Windows - let g:ctrlp_custom_ignore = '\.git$\|\.hg$\|\.svn$' + let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$' let g:ctrlp_custom_ignore = { - \ 'dir': '\.git$\|\.hg$\|\.svn$', - \ 'file': '\.exe$\|\.so$\|\.dll$', + \ 'dir': '\v[\/]\.(git|hg|svn)$', + \ 'file': '\v\.(exe|so|dll)$', \ 'link': 'some_bad_symbolic_links', \ } ``` diff --git a/sources_non_forked/nerdtree/README.markdown b/sources_non_forked/nerdtree/README.markdown index 19217ba4..60869dea 100644 --- a/sources_non_forked/nerdtree/README.markdown +++ b/sources_non_forked/nerdtree/README.markdown @@ -82,6 +82,10 @@ __Q. How can I open a NERDTree automatically when vim starts up if no files were A. Stick this in your vimrc `autocmd vimenter * if !argc() | NERDTree | endif` +__Q. How can I map a specific key or shortcut to open NERDTree?__ + +A. Stick this in your vimrc to open NERDTree with `Ctrl+n` (you can set whatever key you want): `map :NERDTreeToggle` + __Q. How can I close vim if the only window left open is a NERDTree?__ A. Stick this in your vimrc: diff --git a/sources_non_forked/nerdtree/autoload/nerdtree.vim b/sources_non_forked/nerdtree/autoload/nerdtree.vim new file mode 100644 index 00000000..3da55662 --- /dev/null +++ b/sources_non_forked/nerdtree/autoload/nerdtree.vim @@ -0,0 +1,1367 @@ +if exists("g:loaded_nerdtree_autoload") + finish +endif +let g:loaded_nerdtree_autoload = 1 + +function! nerdtree#version() + return '4.2.0' +endfunction + +" SECTION: General Functions {{{1 +"============================================================ +"FUNCTION: nerdtree#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! nerdtree#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: nerdtree#checkForBrowse(dir) {{{2 +"inits a secondary nerd tree in the current buffer if appropriate +function! nerdtree#checkForBrowse(dir) + if a:dir != '' && isdirectory(a:dir) + call g:NERDTreeCreator.CreateSecondary(a:dir) + endif +endfunction + +" FUNCTION: nerdtree#completeBookmarks(A,L,P) {{{2 +" completion function for the bookmark commands +function! nerdtree#completeBookmarks(A,L,P) + return filter(g:NERDTreeBookmark.BookmarkNames(), 'v:val =~# "^' . a:A . '"') +endfunction + +"FUNCTION: nerdtree#compareBookmarks(dir) {{{2 +function! nerdtree#compareBookmarks(first, second) + return a:first.compareTo(a:second) +endfunction + +"FUNCTION: nerdtree#compareNodes(dir) {{{2 +function! nerdtree#compareNodes(n1, n2) + return a:n1.path.compareTo(a:n2.path) +endfunction + +" FUNCTION: nerdtree#createDefaultBindings() {{{2 +function! nerdtree#createDefaultBindings() + let s = '' . s:SID() . '_' + + call NERDTreeAddKeyMap({ 'key': '', 'scope': "all", 'callback': s."handleMiddleMouse" }) + call NERDTreeAddKeyMap({ 'key': '', 'scope': "all", 'callback': s."handleLeftClick" }) + call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': "DirNode", 'callback': s."activateDirNode" }) + call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': "FileNode", 'callback': s."activateFileNode" }) + call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': "Bookmark", 'callback': s."activateBookmark" }) + call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': "all", 'callback': s."activateAll" }) + + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': "DirNode", 'callback': s."activateDirNode" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': "FileNode", 'callback': s."activateFileNode" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': "Bookmark", 'callback': s."activateBookmark" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': "all", 'callback': s."activateAll" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenSplit, 'scope': "Node", 'callback': s."openHSplit" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenVSplit, 'scope': "Node", 'callback': s."openVSplit" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenSplit, 'scope': "Bookmark", 'callback': s."openHSplit" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenVSplit, 'scope': "Bookmark", 'callback': s."openVSplit" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreview, 'scope': "Node", 'callback': s."previewNodeCurrent" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewVSplit, 'scope': "Node", 'callback': s."previewNodeVSplit" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewSplit, 'scope': "Node", 'callback': s."previewNodeHSplit" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreview, 'scope': "Bookmark", 'callback': s."previewNodeCurrent" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewVSplit, 'scope': "Bookmark", 'callback': s."previewNodeVSplit" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewSplit, 'scope': "Bookmark", 'callback': s."previewNodeHSplit" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenRecursively, 'scope': "DirNode", 'callback': s."openNodeRecursively" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapUpdir, 'scope': "all", 'callback': s."upDirCurrentRootClosed" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapUpdirKeepOpen, 'scope': "all", 'callback': s."upDirCurrentRootOpen" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapChangeRoot, 'scope': "Node", 'callback': s."chRoot" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapChdir, 'scope': "Node", 'callback': s."chCwd" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapQuit, 'scope': "all", 'callback': s."closeTreeWindow" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCWD, 'scope': "all", 'callback': "nerdtree#chRootCwd" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapRefreshRoot, 'scope': "all", 'callback': s."refreshRoot" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapRefresh, 'scope': "Node", 'callback': s."refreshCurrent" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapHelp, 'scope': "all", 'callback': s."displayHelp" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleZoom, 'scope': "all", 'callback': s."toggleZoom" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleHidden, 'scope': "all", 'callback': s."toggleShowHidden" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleFilters, 'scope': "all", 'callback': s."toggleIgnoreFilter" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleFiles, 'scope': "all", 'callback': s."toggleShowFiles" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleBookmarks, 'scope': "all", 'callback': s."toggleShowBookmarks" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCloseDir, 'scope': "Node", 'callback': s."closeCurrentDir" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCloseChildren, 'scope': "DirNode", 'callback': s."closeChildren" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapMenu, 'scope': "Node", 'callback': s."showMenu" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpParent, 'scope': "Node", 'callback': s."jumpToParent" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpFirstChild, 'scope': "Node", 'callback': s."jumpToFirstChild" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpLastChild, 'scope': "Node", 'callback': s."jumpToLastChild" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpRoot, 'scope': "all", 'callback': s."jumpToRoot" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpNextSibling, 'scope': "Node", 'callback': s."jumpToNextSibling" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpPrevSibling, 'scope': "Node", 'callback': s."jumpToPrevSibling" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTab, 'scope': "Node", 'callback': s."openInNewTab" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTabSilent, 'scope': "Node", 'callback': s."openInNewTabSilent" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTab, 'scope': "Bookmark", 'callback': s."openInNewTab" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTabSilent, 'scope': "Bookmark", 'callback': s."openInNewTabSilent" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenExpl, 'scope': "DirNode", 'callback': s."openExplorer" }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapDeleteBookmark, 'scope': "Bookmark", 'callback': s."deleteBookmark" }) +endfunction + +" FUNCTION: nerdtree#deprecated(func, [msg]) {{{2 +" Issue a deprecation warning for a:func. If a second arg is given, use this +" as the deprecation message +function! nerdtree#deprecated(func, ...) + let msg = a:0 ? a:func . ' ' . a:1 : a:func . ' is deprecated' + + if !exists('s:deprecationWarnings') + let s:deprecationWarnings = {} + endif + if !has_key(s:deprecationWarnings, a:func) + let s:deprecationWarnings[a:func] = 1 + echomsg msg + endif +endfunction + +"FUNCTION: nerdtree#escChars(dir) {{{2 +function! nerdtree#escChars() + if nerdtree#runningWindows() + return " `\|\"#%&,?()\*^<>" + endif + + return " \\`\|\"#%&,?()\*^<>[]" +endfunction + +" FUNCTION: nerdtree#exec(cmd) {{{2 +" same as :exec cmd but eventignore=all is set for the duration +function! nerdtree#exec(cmd) + let old_ei = &ei + set ei=all + exec a:cmd + let &ei = old_ei +endfunction + +" FUNCTION: nerdtree#findAndRevealPath() {{{2 +function! nerdtree#findAndRevealPath() + try + let p = g:NERDTreePath.New(expand("%:p")) + catch /^NERDTree.InvalidArgumentsError/ + call nerdtree#echo("no file for the current buffer") + return + endtry + + if p.isUnixHiddenPath() + let showhidden=g:NERDTreeShowHidden + let g:NERDTreeShowHidden = 1 + endif + + if !nerdtree#treeExistsForTab() + try + let cwd = g:NERDTreePath.New(getcwd()) + catch /^NERDTree.InvalidArgumentsError/ + call nerdtree#echo("current directory does not exist.") + let cwd = p.getParent() + endtry + + if p.isUnder(cwd) + call g:NERDTreeCreator.CreatePrimary(cwd.str()) + else + call g:NERDTreeCreator.CreatePrimary(p.getParent().str()) + endif + else + if !p.isUnder(g:NERDTreeFileNode.GetRootForTab().path) + if !nerdtree#isTreeOpen() + call g:NERDTreeCreator.TogglePrimary('') + else + call nerdtree#putCursorInTreeWin() + endif + let b:NERDTreeShowHidden = g:NERDTreeShowHidden + call nerdtree#chRoot(g:NERDTreeDirNode.New(p.getParent())) + else + if !nerdtree#isTreeOpen() + call g:NERDTreeCreator.TogglePrimary("") + endif + endif + endif + call nerdtree#putCursorInTreeWin() + call b:NERDTreeRoot.reveal(p) + + if p.isUnixHiddenFile() + let g:NERDTreeShowHidden = showhidden + endif +endfunction + +" FUNCTION: nerdtree#has_opt(options, name) {{{2 +function! nerdtree#has_opt(options, name) + return has_key(a:options, a:name) && a:options[a:name] == 1 +endfunction + +" FUNCTION: nerdtree#invokeKeyMap(key) {{{2 +"this is needed since I cant figure out how to invoke dict functions from a +"key map +function! nerdtree#invokeKeyMap(key) + call g:NERDTreeKeyMap.Invoke(a:key) +endfunction + +" FUNCTION: nerdtree#postSourceActions() {{{2 +function! nerdtree#postSourceActions() + call g:NERDTreeBookmark.CacheBookmarks(0) + call nerdtree#createDefaultBindings() + + "load all nerdtree plugins + runtime! nerdtree_plugin/**/*.vim +endfunction + +"FUNCTION: nerdtree#runningWindows(dir) {{{2 +function! nerdtree#runningWindows() + return has("win16") || has("win32") || has("win64") +endfunction + +" Function: s:SID() {{{2 +function s:SID() + if !exists("s:sid") + let s:sid = matchstr(expand(''), '\zs\d\+\ze_SID$') + endif + return s:sid +endfun + +" FUNCTION: nerdtree#tabpagevar(tabnr, var) {{{2 +function! nerdtree#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: nerdtree#treeExistsForBuffer() {{{2 +" Returns 1 if a nerd tree root exists in the current buffer +function! nerdtree#treeExistsForBuf() + return exists("b:NERDTreeRoot") +endfunction + +" Function: nerdtree#treeExistsForTab() {{{2 +" Returns 1 if a nerd tree root exists in the current tab +function! nerdtree#treeExistsForTab() + return exists("t:NERDTreeBufName") +endfunction + +"FUNCTION: nerdtree#treeMarkupReg(dir) {{{2 +function! nerdtree#treeMarkupReg() + if g:NERDTreeDirArrows + return '^\([▾▸] \| \+[▾▸] \| \+\)' + endif + + return '^[ `|]*[\-+~]' +endfunction + +"FUNCTION: nerdtree#treeUpDirLine(dir) {{{2 +function! nerdtree#treeUpDirLine() + return '.. (up a dir)' +endfunction + +"FUNCTION: nerdtree#treeWid(dir) {{{2 +function! nerdtree#treeWid() + return 2 +endfunction + +"FUNCTION: nerdtree#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! nerdtree#upDir(keepState) + let cwd = b:NERDTreeRoot.path.str({'format': 'UI'}) + if cwd ==# "/" || cwd =~# '^[^/]..$' + call nerdtree#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 = g:NERDTreeDirNode.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 nerdtree#renderView() + call oldRoot.putCursorHere(0, 0) + endif +endfunction + +" Function: nerdtree#unique(list) {{{2 +" returns a:list without duplicates +function! nerdtree#unique(list) + let uniqlist = [] + for elem in a:list + if index(uniqlist, elem) ==# -1 + let uniqlist += [elem] + endif + endfor + return uniqlist +endfunction + +" SECTION: View Functions {{{1 +"============================================================ +" +"FUNCTION: nerdtree#centerView() {{{2 +"centers the nerd tree window around the cursor (provided the nerd tree +"options permit) +function! nerdtree#centerView() + if g:NERDTreeAutoCenter + let current_line = winline() + let lines_to_top = current_line + let lines_to_bottom = winheight(nerdtree#getTreeWinNum()) - current_line + if lines_to_top < g:NERDTreeAutoCenterThreshold || lines_to_bottom < g:NERDTreeAutoCenterThreshold + normal! zz + endif + endif +endfunction + +" FUNCTION: nerdtree#chRoot(node) {{{2 +" changes the current root to the selected one +function! nerdtree#chRoot(node) + call s:chRoot(a:node) +endfunction +"FUNCTION: nerdtree#closeTree() {{{2 +"Closes the primary NERD tree window for this tab +function! nerdtree#closeTree() + if !nerdtree#isTreeOpen() + throw "NERDTree.NoTreeFoundError: no NERDTree is open" + endif + + if winnr("$") != 1 + if winnr() == nerdtree#getTreeWinNum() + call nerdtree#exec("wincmd p") + let bufnr = bufnr("") + call nerdtree#exec("wincmd p") + else + let bufnr = bufnr("") + endif + + call nerdtree#exec(nerdtree#getTreeWinNum() . " wincmd w") + close + call nerdtree#exec(bufwinnr(bufnr) . " wincmd w") + else + close + endif +endfunction + +"FUNCTION: nerdtree#closeTreeIfOpen() {{{2 +"Closes the NERD tree window if it is open +function! nerdtree#closeTreeIfOpen() + if nerdtree#isTreeOpen() + call nerdtree#closeTree() + endif +endfunction + +"FUNCTION: nerdtree#closeTreeIfQuitOnOpen() {{{2 +"Closes the NERD tree window if the close on open option is set +function! nerdtree#closeTreeIfQuitOnOpen() + if g:NERDTreeQuitOnOpen && nerdtree#isTreeOpen() + call nerdtree#closeTree() + endif +endfunction + +"FUNCTION: nerdtree#dumpHelp {{{2 +"prints out the quick help +function! nerdtree#dumpHelp() + let old_h = @h + if b:treeShowHelp ==# 1 + let @h= "\" NERD tree (" . nerdtree#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."\" ". g:NERDTreeMapCWD .":change tree root to CWD\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 + let @h=@h."\"\n\" ----------------------------\n" + let @h=@h."\" Custom mappings~\n" + for i in g:NERDTreeKeyMap.All() + if !empty(i.quickhelpText) + let @h=@h."\" ". i.key .": ". i.quickhelpText ."\n" + endif + endfor + + 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: nerdtree#echo {{{2 +"A wrapper for :echo. Appends 'NERDTree:' on the front of all messages +" +"Args: +"msg: the message to echo +function! nerdtree#echo(msg) + redraw + echomsg "NERDTree: " . a:msg +endfunction + +"FUNCTION: nerdtree#echoError {{{2 +"Wrapper for nerdtree#echo, sets the message type to errormsg for this message +"Args: +"msg: the message to echo +function! nerdtree#echoError(msg) + echohl errormsg + call nerdtree#echo(a:msg) + echohl normal +endfunction + +"FUNCTION: nerdtree#echoWarning {{{2 +"Wrapper for nerdtree#echo, sets the message type to warningmsg for this message +"Args: +"msg: the message to echo +function! nerdtree#echoWarning(msg) + echohl warningmsg + call nerdtree#echo(a:msg) + echohl normal +endfunction + +"FUNCTION: nerdtree#firstUsableWindow(){{{2 +"find the window number of the first normal window +function! nerdtree#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: nerdtree#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! nerdtree#getPath(ln) + let line = getline(a:ln) + + let rootLine = g:NERDTreeFileNode.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 ==# nerdtree#treeUpDirLine() + return b:NERDTreeRoot.path.getParent() + endif + + let indent = nerdtree#indentLevelFor(line) + + "remove the tree parts and the leading space + let curFile = nerdtree#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 = nerdtree#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 = nerdtree#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 = g:NERDTreePath.New(curFile) + return toReturn +endfunction + +"FUNCTION: nerdtree#getTreeWinNum() {{{2 +"gets the nerd tree window number for this tab +function! nerdtree#getTreeWinNum() + if exists("t:NERDTreeBufName") + return bufwinnr(t:NERDTreeBufName) + else + return -1 + endif +endfunction + +"FUNCTION: nerdtree#indentLevelFor(line) {{{2 +function! nerdtree#indentLevelFor(line) + let level = match(a:line, '[^ \-+~▸▾`|]') / nerdtree#treeWid() + " 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: nerdtree#isTreeOpen() {{{2 +function! nerdtree#isTreeOpen() + return nerdtree#getTreeWinNum() != -1 +endfunction + +"FUNCTION: nerdtree#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! nerdtree#isWindowUsable(winnumber) + "gotta split if theres only one window (i.e. the NERD tree) + if winnr("$") ==# 1 + return 0 + endif + + let oldwinnr = winnr() + call nerdtree#exec(a:winnumber . "wincmd p") + let specialWindow = getbufvar("%", '&buftype') != '' || getwinvar('%', '&previewwindow') + let modified = &modified + call nerdtree#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 || nerdtree#bufInWindows(winbufnr(a:winnumber)) >= 2 +endfunction + +" FUNCTION: nerdtree#jumpToChild(direction) {{{2 +" Args: +" direction: 0 if going to first child, 1 if going to last +function! nerdtree#jumpToChild(currentNode, direction) + if a:currentNode.isRoot() + return nerdtree#echo("cannot jump to " . (a:direction ? "last" : "first") . " child") + end + let dirNode = a:currentNode.parent + let childNodes = dirNode.getVisibleChildren() + + let targetNode = childNodes[0] + if a:direction + let targetNode = childNodes[len(childNodes) - 1] + endif + + if targetNode.equals(a:currentNode) + let siblingDir = a: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 nerdtree#centerView() +endfunction + +" FUNCTION: nerdtree#jumpToSibling(currentNode, forward) {{{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! nerdtree#jumpToSibling(currentNode, forward) + let sibling = a:currentNode.findSibling(a:forward) + + if !empty(sibling) + call sibling.putCursorHere(1, 0) + call nerdtree#centerView() + endif +endfunction + +"FUNCTION: nerdtree#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! nerdtree#promptToDelBuffer(bufnum, msg) + echo a:msg + if nr2char(getchar()) ==# 'y' + exec "silent bdelete! " . a:bufnum + endif +endfunction + +"FUNCTION: nerdtree#putCursorOnBookmarkTable(){{{2 +"Places the cursor at the top of the bookmarks table +function! nerdtree#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 = g:NERDTreeFileNode.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: nerdtree#putCursorInTreeWin(){{{2 +"Places the cursor in the nerd tree window +function! nerdtree#putCursorInTreeWin() + if !nerdtree#isTreeOpen() + throw "NERDTree.InvalidOperationError: cant put cursor in NERD tree window, no window exists" + endif + + call nerdtree#exec(nerdtree#getTreeWinNum() . "wincmd w") +endfunction + +"FUNCTION: nerdtree#renderBookmarks {{{2 +function! nerdtree#renderBookmarks() + + if g:NERDTreeMinimalUI == 0 + call setline(line(".")+1, ">----------Bookmarks----------") + call cursor(line(".")+1, col(".")) + endif + + for i in g:NERDTreeBookmark.Bookmarks() + call setline(line(".")+1, i.str()) + call cursor(line(".")+1, col(".")) + endfor + + call setline(line(".")+1, '') + call cursor(line(".")+1, col(".")) +endfunction + +"FUNCTION: nerdtree#renderView {{{2 +"The entry function for rendering the tree +function! nerdtree#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 nerdtree#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 nerdtree#renderBookmarks() + endif + + "add the 'up a dir' line + if !g:NERDTreeMinimalUI + call setline(line(".")+1, nerdtree#treeUpDirLine()) + 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: nerdtree#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! nerdtree#renderViewSavingPosition() + let currentNode = g:NERDTreeFileNode.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 nerdtree#renderView() + + if currentNode != {} + call currentNode.putCursorHere(0, 0) + endif +endfunction +" +"FUNCTION: nerdtree#restoreScreenState() {{{2 +" +"Sets the screen state back to what it was when nerdtree#saveScreenState was last +"called. +" +"Assumes the cursor is in the NERDTree window +function! nerdtree#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: nerdtree#saveScreenState() {{{2 +"Saves the current cursor position in the current buffer and the window +"scroll position +function! nerdtree#saveScreenState() + let win = winnr() + try + call nerdtree#putCursorInTreeWin() + let b:NERDTreeOldPos = getpos(".") + let b:NERDTreeOldTopLine = line("w0") + let b:NERDTreeOldWindowSize = winwidth("") + call nerdtree#exec(win . "wincmd w") + catch /^NERDTree.InvalidOperationError/ + endtry +endfunction + +"FUNCTION: nerdtree#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! nerdtree#stripMarkupFromLine(line, removeLeadingSpaces) + let line = a:line + "remove the tree parts and the leading space + let line = substitute (line, nerdtree#treeMarkupReg(),"","") + + "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 + +"SECTION: Interface bindings {{{1 +"============================================================ + +"FUNCTION: s:activateAll() {{{2 +"handle the user activating the updir line +function! s:activateAll() + if getline(".") ==# nerdtree#treeUpDirLine() + return nerdtree#upDir(0) + endif +endfunction +"FUNCTION: s:activateDirNode() {{{2 +"handle the user activating a tree node +function! s:activateDirNode(node) + call a:node.activate({'reuse': 1}) +endfunction + +"FUNCTION: s:activateFileNode() {{{2 +"handle the user activating a tree node +function! s:activateFileNode(node) + call a:node.activate({'reuse': 1, 'where': 'p'}) +endfunction + +"FUNCTION: s:activateBookmark() {{{2 +"handle the user activating a bookmark +function! s:activateBookmark(bm) + call a:bm.activate(!a:bm.path.isDirectory ? {'where': 'p'} : {}) +endfunction + +" FUNCTION: nerdtree#bookmarkNode(name) {{{2 +" Associate the current node with the given name +function! nerdtree#bookmarkNode(...) + let currentNode = g:NERDTreeFileNode.GetSelected() + if currentNode != {} + let name = a:1 + if empty(name) + let name = currentNode.path.getLastPathComponent(0) + endif + try + call currentNode.bookmark(name) + call nerdtree#renderView() + catch /^NERDTree.IllegalBookmarkNameError/ + call nerdtree#echo("bookmark names must not contain spaces") + endtry + else + call nerdtree#echo("select a node first") + endif +endfunction + +" FUNCTION: s:chCwd(node) {{{2 +function! s:chCwd(node) + try + call a:node.path.changeToDir() + catch /^NERDTree.PathChangeError/ + call nerdtree#echoWarning("could not change cwd") + endtry +endfunction + +" FUNCTION: s:chRoot(node) {{{2 +" changes the current root to the selected one +function! s:chRoot(node) + call a:node.makeRoot() + call nerdtree#renderView() + call b:NERDTreeRoot.putCursorHere(0, 0) +endfunction + +" FUNCTION: s:chRootCwd() {{{2 +" changes the current root to CWD +function! nerdtree#chRootCwd() + try + let cwd = g:NERDTreePath.New(getcwd()) + catch /^NERDTree.InvalidArgumentsError/ + call nerdtree#echo("current directory does not exist.") + return + endtry + if cwd.str() == g:NERDTreeFileNode.GetRootForTab().path.str() + return + endif + call nerdtree#chRoot(g:NERDTreeDirNode.New(cwd)) +endfunction + +" FUNCTION: nerdtree#clearBookmarks(bookmarks) {{{2 +function! nerdtree#clearBookmarks(bookmarks) + if a:bookmarks ==# '' + let currentNode = g:NERDTreeFileNode.GetSelected() + if currentNode != {} + call currentNode.clearBookmarks() + endif + else + for name in split(a:bookmarks, ' ') + let bookmark = g:NERDTreeBookmark.BookmarkFor(name) + call bookmark.delete() + endfor + endif + call nerdtree#renderView() +endfunction + +" FUNCTION: s:closeChildren(node) {{{2 +" closes all childnodes of the current node +function! s:closeChildren(node) + call a:node.closeChildren() + call nerdtree#renderView() + call a:node.putCursorHere(0, 0) +endfunction + +" FUNCTION: s:closeCurrentDir(node) {{{2 +" closes the parent dir of the current node +function! s:closeCurrentDir(node) + let parent = a:node.parent + if parent ==# {} || parent.isRoot() + call nerdtree#echo("cannot close tree root") + else + call a:node.parent.close() + call nerdtree#renderView() + call a:node.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 nerdtree#closeTree() + else + call nerdtree#echo("Cannot close last window") + endif + endif +endfunction + +" FUNCTION: s:deleteBookmark(bm) {{{2 +" if the cursor is on a bookmark, prompt to delete +function! s:deleteBookmark(bm) + echo "Are you sure you wish to delete the bookmark:\n\"" . a:bm.name . "\" (yN):" + + if nr2char(getchar()) ==# 'y' + try + call a:bm.delete() + call nerdtree#renderView() + redraw + catch /^NERDTree/ + call nerdtree#echoWarning("Could not remove bookmark") + endtry + else + call nerdtree#echo("delete aborted" ) + endif + +endfunction + +" FUNCTION: s:displayHelp() {{{2 +" toggles the help display +function! s:displayHelp() + let b:treeShowHelp = b:treeShowHelp ? 0 : 1 + call nerdtree#renderView() + call nerdtree#centerView() +endfunction + +"FUNCTION: s:handleLeftClick() {{{2 +"Checks if the click should open the current node +function! s:handleLeftClick() + let currentNode = g:NERDTreeFileNode.GetSelected() + if currentNode != {} + + "the dir arrows are multibyte chars, and vim's string functions only + "deal with single bytes - so split the line up with the hack below and + "take the line substring manually + let line = split(getline(line(".")), '\zs') + let startToCur = "" + for i in range(0,len(line)-1) + let startToCur .= line[i] + endfor + + if currentNode.path.isDirectory + if startToCur =~# nerdtree#treeMarkupReg() && startToCur =~# '[+~▾▸] \?$' + call currentNode.activate() + return + endif + endif + + if (g:NERDTreeMouseMode ==# 2 && currentNode.path.isDirectory) || g:NERDTreeMouseMode ==# 3 + let char = strpart(startToCur, strlen(startToCur)-1, 1) + if char !~# nerdtree#treeMarkupReg() + if currentNode.path.isDirectory + call currentNode.activate() + else + call currentNode.activate({'reuse': 1, 'where': 'p'}) + endif + return + endif + endif + endif +endfunction + +" FUNCTION: s:handleMiddleMouse() {{{2 +function! s:handleMiddleMouse() + let curNode = g:NERDTreeFileNode.GetSelected() + if curNode ==# {} + call nerdtree#echo("Put the cursor on a node first" ) + return + endif + + if curNode.path.isDirectory + call nerdtree#openExplorer(curNode) + else + call curNode.open({'where': 'h'}) + endif +endfunction + +" FUNCTION: s:jumpToFirstChild() {{{2 +" wrapper for the jump to child method +function! s:jumpToFirstChild(node) + call nerdtree#jumpToChild(a:node, 0) +endfunction + +" FUNCTION: s:jumpToLastChild() {{{2 +" wrapper for the jump to child method +function! s:jumpToLastChild(node) + call nerdtree#jumpToChild(a:node, 1) +endfunction + +" FUNCTION: s:jumpToParent(node) {{{2 +" moves the cursor to the parent of the current node +function! s:jumpToParent(node) + if !empty(a:node.parent) + call a:node.parent.putCursorHere(1, 0) + call nerdtree#centerView() + else + call nerdtree#echo("cannot jump to parent") + endif +endfunction + +" FUNCTION: s:jumpToRoot() {{{2 +" moves the cursor to the root node +function! s:jumpToRoot() + call b:NERDTreeRoot.putCursorHere(1, 0) + call nerdtree#centerView() +endfunction + +" FUNCTION: s:jumpToNextSibling(node) {{{2 +function! s:jumpToNextSibling(node) + call nerdtree#jumpToSibling(a:node, 1) +endfunction + +" FUNCTION: s:jumpToPrevSibling(node) {{{2 +function! s:jumpToPrevSibling(node) + call nerdtree#jumpToSibling(a:node, 0) +endfunction + +" FUNCTION: nerdtree#openBookmark(name) {{{2 +" put the cursor on the given bookmark and, if its a file, open it +function! nerdtree#openBookmark(name) + try + let targetNode = g:NERDTreeBookmark.GetNodeForName(a:name, 0) + call targetNode.putCursorHere(0, 1) + redraw! + catch /^NERDTree.BookmarkedNodeNotFoundError/ + call nerdtree#echo("note - target node is not cached") + let bookmark = g:NERDTreeBookmark.BookmarkFor(a:name) + let targetNode = g:NERDTreeFileNode.New(bookmark.path) + endtry + if targetNode.path.isDirectory + call targetNode.openExplorer() + else + call targetNode.open({'where': 'p'}) + endif +endfunction + +" FUNCTION: s:openHSplit(target) {{{2 +function! s:openHSplit(target) + call a:target.activate({'where': 'h'}) +endfunction + +" FUNCTION: s:openVSplit(target) {{{2 +function! s:openVSplit(target) + call a:target.activate({'where': 'v'}) +endfunction + +" FUNCTION: s:openExplorer(node) {{{2 +function! s:openExplorer(node) + call a:node.openExplorer() +endfunction + +" FUNCTION: s:openInNewTab(target) {{{2 +function! s:openInNewTab(target) + call a:target.activate({'where': 't'}) +endfunction + +" FUNCTION: s:openInNewTabSilent(target) {{{2 +function! s:openInNewTabSilent(target) + call a:target.activate({'where': 't', 'stay': 1}) +endfunction + +" FUNCTION: s:openNodeRecursively(node) {{{2 +function! s:openNodeRecursively(node) + call nerdtree#echo("Recursively opening node. Please wait...") + call a:node.openRecursively() + call nerdtree#renderView() + redraw + call nerdtree#echo("Recursively opening node. Please wait... DONE") +endfunction + +"FUNCTION: s:previewNodeCurrent(node) {{{2 +function! s:previewNodeCurrent(node) + call a:node.open({'stay': 1, 'where': 'p', 'keepopen': 1}) +endfunction + +"FUNCTION: s:previewNodeHSplit(node) {{{2 +function! s:previewNodeHSplit(node) + call a:node.open({'stay': 1, 'where': 'h', 'keepopen': 1}) +endfunction + +"FUNCTION: s:previewNodeVSplit(node) {{{2 +function! s:previewNodeVSplit(node) + call a:node.open({'stay': 1, 'where': 'v', 'keepopen': 1}) +endfunction + +" FUNCTION: nerdtree#revealBookmark(name) {{{2 +" put the cursor on the node associate with the given name +function! nerdtree#revealBookmark(name) + try + let targetNode = g:NERDTreeBookmark.GetNodeForName(a:name, 0) + call targetNode.putCursorHere(0, 1) + catch /^NERDTree.BookmarkNotFoundError/ + call nerdtree#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 nerdtree#echo("Refreshing the root node. This could take a while...") + call b:NERDTreeRoot.refresh() + call nerdtree#renderView() + redraw + call nerdtree#echo("Refreshing the root node. This could take a while... DONE") +endfunction + +" FUNCTION: s:refreshCurrent(node) {{{2 +" refreshes the root for the current node +function! s:refreshCurrent(node) + let node = a:node + if !node.path.isDirectory + let node = node.parent + endif + + call nerdtree#echo("Refreshing node. This could take a while...") + call node.refresh() + call nerdtree#renderView() + redraw + call nerdtree#echo("Refreshing node. This could take a while... DONE") +endfunction + +" FUNCTION: s:showMenu(node) {{{2 +function! s:showMenu(node) + let mc = g:NERDTreeMenuController.New(g:NERDTreeMenuItem.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 nerdtree#renderViewSavingPosition() + call nerdtree#centerView() +endfunction + +" FUNCTION: s:toggleShowBookmarks() {{{2 +" toggles the display of bookmarks +function! s:toggleShowBookmarks() + let b:NERDTreeShowBookmarks = !b:NERDTreeShowBookmarks + if b:NERDTreeShowBookmarks + call nerdtree#renderView() + call nerdtree#putCursorOnBookmarkTable() + else + call nerdtree#renderViewSavingPosition() + endif + call nerdtree#centerView() +endfunction + +" FUNCTION: s:toggleShowFiles() {{{2 +" toggles the display of hidden files +function! s:toggleShowFiles() + let b:NERDTreeShowFiles = !b:NERDTreeShowFiles + call nerdtree#renderViewSavingPosition() + call nerdtree#centerView() +endfunction + +" FUNCTION: s:toggleShowHidden() {{{2 +" toggles the display of hidden files +function! s:toggleShowHidden() + let b:NERDTreeShowHidden = !b:NERDTreeShowHidden + call nerdtree#renderViewSavingPosition() + call nerdtree#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:upDirCurrentRootOpen() {{{2 +function! s:upDirCurrentRootOpen() + call nerdtree#upDir(1) +endfunction + +" FUNCTION: s:upDirCurrentRootClosed() {{{2 +function! s:upDirCurrentRootClosed() + call nerdtree#upDir(0) +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/nerdtree/doc/NERD_tree.txt b/sources_non_forked/nerdtree/doc/NERD_tree.txt index adcf5a54..47f34726 100644 --- a/sources_non_forked/nerdtree/doc/NERD_tree.txt +++ b/sources_non_forked/nerdtree/doc/NERD_tree.txt @@ -137,6 +137,10 @@ The following features and functionality are provided by the NERD tree: In any case, the current file is revealed and the cursor is placed on it. +:NERDTreeCWD *:NERDTreeCWD* + Change tree root to current directory. If no NERD tree exists for this + tab, a new tree will be opened. + ------------------------------------------------------------------------------ 2.2. Bookmarks *NERDTreeBookmarks* @@ -247,6 +251,7 @@ 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| +CD......Change tree root to the CWD..............................|NERDTree-CD| I.......Toggle whether hidden files displayed....................|NERDTree-I| f.......Toggle whether the file filters are used.................|NERDTree-f| @@ -514,6 +519,14 @@ Applies to: files and directories. Change vims current working directory to that of the selected node. +------------------------------------------------------------------------------ + *NERDTree-CD* +Default key: CD +Map option: NERDTreeMapCWD +Applies to: no restrictions. + +Change tree root to vims current working directory. + ------------------------------------------------------------------------------ *NERDTree-I* Default key: I @@ -658,6 +671,10 @@ NERD tree. These options should be set in your vimrc. Casade open while selected directory has only one child that also is a directory. +|'NERDTreeAutoDeleteBuffer'| Tells the NERD tree to automatically remove + a buffer when a file is being deleted or renamed + via a context menu command. + ------------------------------------------------------------------------------ 3.2. Customisation details *NERDTreeOptionDetails* @@ -982,6 +999,20 @@ for Java projects. Use one of the follow lines to set this option: > let NERDTreeCasadeOpenSingleChildDir=1 < +------------------------------------------------------------------------------ + *'NERDTreeAutoDeleteBuffer'* +Values: 0 or 1 +Default: 0. + +When using a context menu to delete or rename a file you may also want to delete +the buffer which is no more valid. If the option is not set you will see a +confirmation if you really want to delete an old buffer. If you always press 'y' +then it worths to set this option to 1. Use one of the follow lines to set this +option: > + let NERDTreeAutoDeleteBuffer=0 + let NERDTreeAutoDeleteBuffer=1 +< + ============================================================================== 4. The NERD tree API *NERDTreeAPI* diff --git a/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim b/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim index 0e2f7287..9b81ed37 100644 --- a/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim +++ b/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim @@ -15,6 +15,11 @@ if exists("g:loaded_nerdtree_fs_menu") endif let g:loaded_nerdtree_fs_menu = 1 +"Automatically delete the buffer after deleting or renaming a file +if !exists("g:NERDTreeAutoDeleteBuffer") + let g:NERDTreeAutoDeleteBuffer = 0 +endif + 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'}) @@ -26,7 +31,7 @@ if has("gui_mac") || has("gui_macvim") endif if g:NERDTreePath.CopyingSupported() - call NERDTreeAddMenuItem({'text': '(c)copy the current node', 'shortcut': 'c', 'callback': 'NERDTreeCopyNode'}) + call NERDTreeAddMenuItem({'text': '(c)opy the current node', 'shortcut': 'c', 'callback': 'NERDTreeCopyNode'}) endif "FUNCTION: s:echo(msg){{{1 @@ -52,11 +57,44 @@ endfunction " del the buffer function! s:promptToDelBuffer(bufnum, msg) echo a:msg - if nr2char(getchar()) ==# 'y' - exec "silent bdelete! " . a:bufnum + if g:NERDTreeAutoDeleteBuffer || nr2char(getchar()) ==# 'y' + " 1. ensure that all windows which display the just deleted filename + " now display an empty buffer (so a layout is preserved). + " Is not it better to close single tabs with this file only ? + let s:originalTabNumber = tabpagenr() + let s:originalWindowNumber = winnr() + exec "tabdo windo if winbufnr(0) == " . a:bufnum . " | exec ':enew! ' | endif" + exec "tabnext " . s:originalTabNumber + exec s:originalWindowNumber . "wincmd w" + " 3. We don't need a previous buffer anymore + exec "bwipeout! " . a:bufnum endif endfunction +"FUNCTION: s:promptToRenameBuffer(bufnum, msg){{{1 +"prints out the given msg and, if the user responds by pushing 'y' then the +"buffer with the given bufnum is replaced with a new one +" +"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:promptToRenameBuffer(bufnum, msg, newFileName) + echo a:msg + if g:NERDTreeAutoDeleteBuffer || nr2char(getchar()) ==# 'y' + " 1. ensure that a new buffer is loaded + exec "badd " . a:newFileName + " 2. ensure that all windows which display the just deleted filename + " display a buffer for a new filename. + let s:originalTabNumber = tabpagenr() + let s:originalWindowNumber = winnr() + exec "tabdo windo if winbufnr(0) == " . a:bufnum . " | exec ':e! " . a:newFileName . "' | endif" + exec "tabnext " . s:originalTabNumber + exec s:originalWindowNumber . "wincmd w" + " 3. We don't need a previous buffer anymore + exec "bwipeout! " . a:bufnum + endif +endfunction "FUNCTION: NERDTreeAddNode(){{{1 function! NERDTreeAddNode() let curDirNode = g:NERDTreeDirNode.GetSelected() @@ -108,8 +146,8 @@ function! NERDTreeMoveNode() "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) + let prompt = "\nNode renamed.\n\nThe old file is open in buffer ". bufnum . (bufwinnr(bufnum) ==# -1 ? " (hidden)" : "") .". Replace this buffer with a new file? (yN)" + call s:promptToRenameBuffer(bufnum, prompt, newNodePath) endif call curNode.putCursorHere(1, 0) diff --git a/sources_non_forked/nerdtree/plugin/NERD_tree.vim b/sources_non_forked/nerdtree/plugin/NERD_tree.vim index 60460251..6c19a3fa 100644 --- a/sources_non_forked/nerdtree/plugin/NERD_tree.vim +++ b/sources_non_forked/nerdtree/plugin/NERD_tree.vim @@ -10,8 +10,7 @@ " 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") @@ -27,8 +26,6 @@ let loaded_nerd_tree = 1 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 @@ -68,7 +65,7 @@ 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) +call s:initVariable("g:NERDTreeDirArrows", !nerdtree#runningWindows()) call s:initVariable("g:NERDTreeCasadeOpenSingleChildDir", 1) if !exists("g:NERDTreeSortOrder") @@ -80,10 +77,6 @@ else 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 @@ -98,7 +91,7 @@ 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 +if nerdtree#runningWindows() call s:initVariable("g:NERDTreeRemoveDirCmd", 'rmdir /s /q ') else call s:initVariable("g:NERDTreeRemoveDirCmd", 'rm -rf ') @@ -140,4250 +133,84 @@ call s:initVariable("g:NERDTreeMapToggleHidden", "I") call s:initVariable("g:NERDTreeMapToggleZoom", "A") call s:initVariable("g:NERDTreeMapUpdir", "u") call s:initVariable("g:NERDTreeMapUpdirKeepOpen", "U") +call s:initVariable("g:NERDTreeMapCWD", "CD") -"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 - -if g:NERDTreeDirArrows - let s:tree_markup_reg = '^\([▾▸] \| \+[▾▸] \| \+\)' -else - let s:tree_markup_reg = '^[ `|]*[\-+~]' -endif -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: Load class files{{{2 +runtime plugin/nerdtree/path.vim +runtime plugin/nerdtree/menu_controller.vim +runtime plugin/nerdtree/menu_item.vim +runtime plugin/nerdtree/key_map.vim +runtime plugin/nerdtree/bookmark.vim +runtime plugin/nerdtree/tree_file_node.vim +runtime plugin/nerdtree/tree_dir_node.vim +runtime plugin/nerdtree/opener.vim +runtime plugin/nerdtree/creator.vim " 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() +command! -n=? -complete=dir -bar NERDTree :call g:NERDTreeCreator.CreatePrimary('') +command! -n=? -complete=dir -bar NERDTreeToggle :call g:NERDTreeCreator.TogglePrimary('') +command! -n=0 -bar NERDTreeClose :call nerdtree#closeTreeIfOpen() +command! -n=1 -complete=customlist,nerdtree#completeBookmarks -bar NERDTreeFromBookmark call g:NERDTreeCreator.CreatePrimary('') +command! -n=0 -bar NERDTreeMirror call g:NERDTreeCreator.CreateMirror() +command! -n=0 -bar NERDTreeFind call nerdtree#findAndRevealPath() command! -n=0 -bar NERDTreeFocus call NERDTreeFocus() +command! -n=0 -bar NERDTreeCWD call NERDTreeCWD() " SECTION: Auto commands {{{1 "============================================================ augroup NERDTree "Save the cursor position whenever we close the nerd tree - exec "autocmd BufWinLeave ". s:NERDTreeBufName ."* call saveScreenState()" + exec "autocmd BufWinLeave ". g:NERDTreeCreator.BufNamePrefix() ."* call nerdtree#saveScreenState()" "disallow insert mode in the NERDTree - exec "autocmd BufEnter ". s:NERDTreeBufName ."* stopinsert" + exec "autocmd BufEnter ". g:NERDTreeCreator.BufNamePrefix() ."* stopinsert" augroup END if g:NERDTreeHijackNetrw augroup NERDTreeHijackNetrw autocmd VimEnter * silent! autocmd! FileExplorer - au BufEnter,VimEnter * call s:checkForBrowse(expand("")) + au BufEnter,VimEnter * call nerdtree#checkForBrowse(expand("")) augroup END endif -"SECTION: Classes {{{1 -"============================================================ -"CLASS: Bookmark {{{2 -"============================================================ -let s:Bookmark = {} -" FUNCTION: Bookmark.activate() {{{3 -function! s:Bookmark.activate(...) - call self.open(a:0 ? a:1 : {}) -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.open([options]) {{{3 -"Args: -"A dictionary containing the following keys (all optional): -" 'where': Specifies whether the node should be opened in new split/tab or in -" the previous window. Can be either 'v' (vertical split), 'h' -" (horizontal split), 't' (new tab) or 'p' (previous window). -" 'reuse': if a window is displaying the file then jump the cursor there -" 'keepopen': dont close the tree window -" 'stay': open the file, but keep the cursor in the tree win -" -function! s:Bookmark.open(...) - let opts = a:0 ? a:1 : {} - - if self.path.isDirectory && !has_key(opts, 'where') - call self.toRoot() - else - let opener = s:Opener.New(self.path, opts) - call opener.open(self) - endif -endfunction -" FUNCTION: Bookmark.openInNewTab(options) {{{3 -" Create a new bookmark object with the given name and path object -function! s:Bookmark.openInNewTab(options) - call s:deprecated('Bookmark.openInNewTab', 'is deprecated, use open() instead') - call self.open(a:options) -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.FindFor(key, scope) {{{3 -function! s:KeyMap.FindFor(key, scope) - for i in s:KeyMap.All() - if i.key ==# a:key && i.scope ==# a:scope - return i - endif - endfor - return {} -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() - " If the key sequence we're trying to map contains any '<>' notation, we - " must replace each of the '<' characters with '' to ensure the string - " is not translated into its corresponding keycode during the later part - " of the map command below - " :he <> - let specialNotationRegex = '\m<\([[:alnum:]_-]\+>\)' - if self.key =~# specialNotationRegex - let keymapInvokeString = substitute(self.key, specialNotationRegex, '\1', 'g') - else - let keymapInvokeString = self.key - endif - - let premap = self.key == "" ? " " : " " - - exec 'nnoremap '. self.key . premap . ':call KeyMap_Invoke("'. keymapInvokeString .'")' -endfunction - -"FUNCTION: KeyMap.Remove(key, scope) {{{3 -function! s:KeyMap.Remove(key, scope) - let maps = s:KeyMap.All() - for i in range(len(maps)) - if maps[i].key ==# a:key && maps[i].scope ==# a:scope - return remove(maps, i) - endif - endfor -endfunction -"FUNCTION: KeyMap.invoke() {{{3 -"Call the KeyMaps callback function -function! s:KeyMap.invoke(...) - let Callback = function(self.callback) - if a:0 - call Callback(a:1) - else - call Callback() - endif -endfunction - - -"FUNCTION: KeyMap.Invoke() {{{3 -"Find a keymapping for a:key and the current scope invoke it. -" -"Scope is determined as follows: -" * if the cursor is on a dir node then "DirNode" -" * if the cursor is on a file node then "FileNode" -" * if the cursor is on a bookmark then "Bookmark" -" -"If a keymap has the scope of "all" then it will be called if no other keymap -"is found for a:key and the scope. -function! s:KeyMap.Invoke(key) - let node = s:TreeFileNode.GetSelected() - if !empty(node) - - "try file node - if !node.path.isDirectory - let km = s:KeyMap.FindFor(a:key, "FileNode") - if !empty(km) - return km.invoke(node) - endif - endif - - "try dir node - if node.path.isDirectory - let km = s:KeyMap.FindFor(a:key, "DirNode") - if !empty(km) - return km.invoke(node) - endif - endif - - "try generic node - let km = s:KeyMap.FindFor(a:key, "Node") - if !empty(km) - return km.invoke(node) - endif - - endif - - "try bookmark - let bm = s:Bookmark.GetSelected() - if !empty(bm) - let km = s:KeyMap.FindFor(a:key, "Bookmark") - if !empty(km) - return km.invoke(bm) - endif - endif - - "try all - let km = s:KeyMap.FindFor(a:key, "all") - if !empty(km) - return km.invoke() - endif -endfunction - -"this is needed since I cant figure out how to invoke dict functions from a -"key map -function! s:KeyMap_Invoke(key) - call s:KeyMap.Invoke(a:key) -endfunction - -"FUNCTION: KeyMap.Create(options) {{{3 -function! s:KeyMap.Create(options) - let newKeyMap = copy(self) - let opts = extend({'scope': 'all', 'quickhelpText': ''}, copy(a:options)) - let newKeyMap.key = opts['key'] - let newKeyMap.quickhelpText = opts['quickhelpText'] - let newKeyMap.callback = opts['callback'] - let newKeyMap.scope = opts['scope'] - - call s:KeyMap.Add(newKeyMap) -endfunction - -"FUNCTION: KeyMap.Add(keymap) {{{3 -function! s:KeyMap.Add(keymap) - call s:KeyMap.Remove(a:keymap.key, a:keymap.scope) - call add(s:KeyMap.All(), a:keymap) -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(...) {{{3 -function! s:TreeFileNode.activate(...) - call self.open(a:0 ? a:1 : {}) -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.clearBookmarks() {{{3 -function! s:TreeFileNode.clearBookmarks() - 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 - - silent doautocmd User NERDTreeNewRoot -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 -function! s:TreeFileNode.open(...) - let opts = a:0 ? a:1 : {} - let opener = s:Opener.New(self.path, opts) - call opener.open(self) -endfunction - -"FUNCTION: TreeFileNode.openSplit() {{{3 -"Open this node in a new window -function! s:TreeFileNode.openSplit() - call s:deprecated('TreeFileNode.openSplit', 'is deprecated, use .open() instead.') - call self.open({'where': 'h'}) -endfunction -"FUNCTION: TreeFileNode.openVSplit() {{{3 -"Open this node in a new vertical window -function! s:TreeFileNode.openVSplit() - call s:deprecated('TreeFileNode.openVSplit', 'is deprecated, use .open() instead.') - call self.open({'where': 'v'}) -endfunction -"FUNCTION: TreeFileNode.openInNewTab(options) {{{3 -function! s:TreeFileNode.openInNewTab(options) - echomsg 'TreeFileNode.openInNewTab is deprecated' - call self.open(extend({'where': 't'}, a:options)) -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([options]) {{{3 -unlet s:TreeDirNode.activate -function! s:TreeDirNode.activate(...) - let opts = a:0 ? a:1 : {} - call self.toggleOpen(opts) - 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, '*',1) . "\n" . globpath(globDir, '.*',1) - 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([opts]) {{{3 -"Open the dir in the current tree or in a new tree elsewhere. -" -"If opening in the current tree, return the number of cached nodes. -unlet s:TreeDirNode.open -function! s:TreeDirNode.open(...) - let opts = a:0 ? a:1 : {} - - if has_key(opts, 'where') && !empty(opts['where']) - let opener = s:Opener.New(self.path, opts) - call opener.open(self) - else - let self.isOpen = 1 - if self.children ==# [] - return self._initChildren(0) - else - return 0 - endif - endif -endfunction -"FUNCTION: TreeDirNode.openAlong([opts]) {{{3 -"recursive open the dir if it has only one directory child. -" -"return the level of opened directories. -function! s:TreeDirNode.openAlong(...) - let opts = a:0 ? a:1 : {} - let level = 0 - - let node = self - while node.path.isDirectory - call node.open(opts) - let level += 1 - if node.getVisibleChildCount() == 1 - let node = node.getChildByIndex(0, 1) - else - break - endif - endwhile - return level -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() - call self.open({'where': 'p'}) -endfunction -"FUNCTION: TreeDirNode.openInNewTab(options) {{{3 -unlet s:TreeDirNode.openInNewTab -function! s:TreeDirNode.openInNewTab(options) - call s:deprecated('TreeDirNode.openInNewTab', 'is deprecated, use open() instead') - call self.open({'where': 't'}) -endfunction -"FUNCTION: TreeDirNode._openInNewTab() {{{3 -function! s:TreeDirNode._openInNewTab() - tabnew - call s:initNerdTree(self.path.str()) -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([options]) {{{3 -"Opens this directory if it is closed and vice versa -function! s:TreeDirNode.toggleOpen(...) - let opts = a:0 ? a:1 : {} - if self.isOpen ==# 1 - call self.close() - else - if g:NERDTreeCasadeOpenSingleChildDir == 0 - call self.open(opts) - else - call self.openAlong(opts) - endif - 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: Opener {{{2 -"============================================================ -let s:Opener = {} - -"FUNCTION: Opener._checkToCloseTree(newtab) {{{3 -"Check the class options and global options (i.e. NERDTreeQuitOnOpen) to see -"if the tree should be closed now. -" -"Args: -"a:newtab - boolean. If set, only close the tree now if we are opening the -"target in a new tab. This is needed because we have to close tree before we -"leave the tab -function! s:Opener._checkToCloseTree(newtab) - if self._keepopen - return - endif - - if (a:newtab && self._where == 't') || !a:newtab - call s:closeTreeIfQuitOnOpen() - endif -endfunction - -"FUNCTION: Opener._gotoTargetWin() {{{3 -function! s:Opener._gotoTargetWin() - if b:NERDTreeType ==# "secondary" - if self._where == 'v' - vsplit - elseif self._where == 'h' - split - elseif self._where == 't' - tabnew - endif - else - call self._checkToCloseTree(1) - - if self._where == 'v' - call self._newVSplit() - elseif self._where == 'h' - call self._newSplit() - elseif self._where == 't' - tabnew - elseif self._where == 'p' - call self._previousWindow() - endif - - call self._checkToCloseTree(0) - endif -endfunction - -"FUNCTION: Opener.New(path, opts) {{{3 -"Args: -" -"a:path: The path object that is to be opened. -" -"a:opts: -" -"A dictionary containing the following keys (all optional): -" 'where': Specifies whether the node should be opened in new split/tab or in -" the previous window. Can be either 'v' or 'h' or 't' (for open in -" new tab) -" 'reuse': if a window is displaying the file then jump the cursor there -" 'keepopen': dont close the tree window -" 'stay': open the file, but keep the cursor in the tree win -function! s:Opener.New(path, opts) - let newObj = copy(self) - - let newObj._path = a:path - let newObj._stay = s:has_opt(a:opts, 'stay') - let newObj._reuse = s:has_opt(a:opts, 'reuse') - let newObj._keepopen = s:has_opt(a:opts, 'keepopen') - let newObj._where = has_key(a:opts, 'where') ? a:opts['where'] : '' - let newObj._treetype = b:NERDTreeType - call newObj._saveCursorPos() - - return newObj -endfunction - -"FUNCTION: Opener._newSplit() {{{3 -function! s:Opener._newSplit() - " 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 ") - 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: Opener._newVSplit() {{{3 -function! s:Opener._newVSplit() - let winwidth = winwidth(".") - if winnr("$")==#1 - let winwidth = g:NERDTreeWinSize - endif - - call s:exec("wincmd p") - vnew - - "resize the nerd tree back to the original size - call s:putCursorInTreeWin() - exec("silent vertical resize ". winwidth) - call s:exec('wincmd p') -endfunction - -"FUNCTION: Opener.open(target) {{{3 -function! s:Opener.open(target) - if self._path.isDirectory - call self._openDirectory(a:target) - else - call self._openFile() - endif -endfunction - -"FUNCTION: Opener._openFile() {{{3 -function! s:Opener._openFile() - if self._reuse && self._reuseWindow() - return - endif - - call self._gotoTargetWin() - - if self._treetype ==# "secondary" - call self._path.edit() - else - call self._path.edit() - - - if self._stay - call self._restoreCursorPos() - endif - endif -endfunction - -"FUNCTION: Opener._openDirectory(node) {{{3 -function! s:Opener._openDirectory(node) - if self._treetype ==# "secondary" - call self._gotoTargetWin() - call s:initNerdTreeInPlace(a:node.path.str()) - else - call self._gotoTargetWin() - if empty(self._where) - call a:node.makeRoot() - call s:renderView() - call a:node.putCursorHere(0, 0) - elseif self._where == 't' - call s:initNerdTree(a:node.path.str()) - else - call s:initNerdTreeInPlace(a:node.path.str()) - endif - endif - - if self._stay - call self._restoreCursorPos() - endif -endfunction - -"FUNCTION: Opener._previousWindow() {{{3 -function! s:Opener._previousWindow() - if !s:isWindowUsable(winnr("#")) && s:firstUsableWindow() ==# -1 - call self._newSplit() - else - try - if !s:isWindowUsable(winnr("#")) - call s:exec(s:firstUsableWindow() . "wincmd w") - else - call s:exec('wincmd p') - endif - 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 -endfunction - -"FUNCTION: Opener._restoreCursorPos(){{{3 -function! s:Opener._restoreCursorPos() - call s:exec('normal ' . self._tabnr . 'gt') - call s:exec(bufwinnr(self._bufnr) . 'wincmd w') -endfunction - -"FUNCTION: Opener._reuseWindow(){{{3 -"put the cursor in the first window we find for this file -" -"return 1 if we were successful -function! s:Opener._reuseWindow() - "check the current tab for the window - let winnr = bufwinnr('^' . self._path.str() . '$') - if winnr != -1 - call s:exec(winnr . "wincmd w") - call self._checkToCloseTree(0) - return 1 - else - "check other tabs - let tabnr = self._path.tabnr() - if tabnr - call self._checkToCloseTree(1) - call s:exec('normal! ' . tabnr . 'gt') - let winnr = bufwinnr('^' . self._path.str() . '$') - call s:exec(winnr . "wincmd w") - return 1 - endif - endif - return 0 -endfunction - -"FUNCTION: Opener._saveCursorPos(){{{3 -function! s:Opener._saveCursorPos() - let self._bufnr = bufnr("") - let self._tabnr = tabpagenr() -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 !~# '^.:\(\\\|\/\)' && 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 = escape(self.str({'format': 'UI'}), s:escape_chars) - let cwd = getcwd() . s:Path.Slash() - - "return a relative path if we can - let isRelative = 0 - if s:running_windows - let isRelative = stridx(tolower(p), tolower(cwd)) == 0 - else - let isRelative = stridx(p, cwd) == 0 - endif - - if isRelative - let p = strpart(p, strlen(cwd)) - - "handle the edge case where the file begins with a + (vim interprets - "the +foo in `:e +foo` as an option to :edit) - if p[0] == "+" - let p = '\' . p - endif - 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.tabnr() {{{3 -" return the number of the first tab that is displaying this file -" -" return 0 if no tab was found -function! s:Path.tabnr() - let str = self.str() - for t in range(tabpagenr('$')) - for b in tabpagebuflist(t+1) - if str == expand('#' . b . ':p') - return t+1 - endif - endfor - endfor - return 0 -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, '^.*:\(\\\|/\)\?', '/', "") - - "remove the \\ network share from 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:createDefaultBindings() {{{2 -function! s:createDefaultBindings() - let s = '' . s:SID() . '_' - - call NERDTreeAddKeyMap({ 'key': '', 'scope': "all", 'callback': s."handleMiddleMouse" }) - call NERDTreeAddKeyMap({ 'key': '', 'scope': "all", 'callback': s."handleLeftClick" }) - call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': "DirNode", 'callback': s."activateDirNode" }) - call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': "FileNode", 'callback': s."activateFileNode" }) - call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': "Bookmark", 'callback': s."activateBookmark" }) - call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': "all", 'callback': s."activateAll" }) - - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': "DirNode", 'callback': s."activateDirNode" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': "FileNode", 'callback': s."activateFileNode" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': "Bookmark", 'callback': s."activateBookmark" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': "all", 'callback': s."activateAll" }) - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenSplit, 'scope': "Node", 'callback': s."openHSplit" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenVSplit, 'scope': "Node", 'callback': s."openVSplit" }) - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenSplit, 'scope': "Bookmark", 'callback': s."openHSplit" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenVSplit, 'scope': "Bookmark", 'callback': s."openVSplit" }) - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreview, 'scope': "Node", 'callback': s."previewNodeCurrent" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewVSplit, 'scope': "Node", 'callback': s."previewNodeVSplit" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewSplit, 'scope': "Node", 'callback': s."previewNodeHSplit" }) - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreview, 'scope': "Bookmark", 'callback': s."previewNodeCurrent" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewVSplit, 'scope': "Bookmark", 'callback': s."previewNodeVSplit" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewSplit, 'scope': "Bookmark", 'callback': s."previewNodeHSplit" }) - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenRecursively, 'scope': "DirNode", 'callback': s."openNodeRecursively" }) - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapUpdir, 'scope': "all", 'callback': s."upDirCurrentRootClosed" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapUpdirKeepOpen, 'scope': "all", 'callback': s."upDirCurrentRootOpen" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapChangeRoot, 'scope': "Node", 'callback': s."chRoot" }) - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapChdir, 'scope': "Node", 'callback': s."chCwd" }) - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapQuit, 'scope': "all", 'callback': s."closeTreeWindow" }) - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapRefreshRoot, 'scope': "all", 'callback': s."refreshRoot" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapRefresh, 'scope': "Node", 'callback': s."refreshCurrent" }) - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapHelp, 'scope': "all", 'callback': s."displayHelp" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleZoom, 'scope': "all", 'callback': s."toggleZoom" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleHidden, 'scope': "all", 'callback': s."toggleShowHidden" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleFilters, 'scope': "all", 'callback': s."toggleIgnoreFilter" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleFiles, 'scope': "all", 'callback': s."toggleShowFiles" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleBookmarks, 'scope': "all", 'callback': s."toggleShowBookmarks" }) - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCloseDir, 'scope': "Node", 'callback': s."closeCurrentDir" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCloseChildren, 'scope': "DirNode", 'callback': s."closeChildren" }) - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapMenu, 'scope': "Node", 'callback': s."showMenu" }) - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpParent, 'scope': "Node", 'callback': s."jumpToParent" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpFirstChild, 'scope': "Node", 'callback': s."jumpToFirstChild" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpLastChild, 'scope': "Node", 'callback': s."jumpToLastChild" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpRoot, 'scope': "all", 'callback': s."jumpToRoot" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpNextSibling, 'scope': "Node", 'callback': s."jumpToNextSibling" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpPrevSibling, 'scope': "Node", 'callback': s."jumpToPrevSibling" }) - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTab, 'scope': "Node", 'callback': s."openInNewTab" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTabSilent, 'scope': "Node", 'callback': s."openInNewTabSilent" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTab, 'scope': "Bookmark", 'callback': s."openInNewTab" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTabSilent, 'scope': "Bookmark", 'callback': s."openInNewTabSilent" }) - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenExpl, 'scope': "DirNode", 'callback': s."openExplorer" }) - - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapDeleteBookmark, 'scope': "Bookmark", 'callback': s."deleteBookmark" }) - -endfunction -" FUNCTION: s:deprecated(func, [msg]) {{{2 -" Issue a deprecation warning for a:func. If a second arg is given, use this -" as the deprecation message -function! s:deprecated(func, ...) - let msg = a:0 ? a:func . ' ' . a:1 : a:func . ' is deprecated' - - if !exists('s:deprecationWarnings') - let s:deprecationWarnings = {} - endif - if !has_key(s:deprecationWarnings, a:func) - let s:deprecationWarnings[a:func] = 1 - echomsg msg - endif -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:has_opt(options, name) {{{2 -function! s:has_opt(options, name) - return has_key(a:options, a:name) && a:options[a:name] == 1 -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 = s:Path.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) - - silent doautocmd User NERDTreeInit -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() - - silent doautocmd User NERDTreeInit -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:postSourceActions() {{{2 -function! s:postSourceActions() - call s:Bookmark.CacheBookmarks(0) - call s:createDefaultBindings() - - "load all nerdtree plugins - runtime! nerdtree_plugin/**/*.vim -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:SID() {{{2 -function s:SID() - if !exists("s:sid") - let s:sid = matchstr(expand(''), '\zs\d\+\ze_SID$') - endif - return s:sid -endfun -"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 -" 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) + call g:NERDTreeMenuItem.Create(a:options) endfunction function! NERDTreeAddMenuSeparator(...) let opts = a:0 ? a:1 : {} - call s:MenuItem.CreateSeparator(opts) + call g:NERDTreeMenuItem.CreateSeparator(opts) endfunction function! NERDTreeAddSubmenu(options) - return s:MenuItem.Create(a:options) + return g:NERDTreeMenuItem.Create(a:options) endfunction function! NERDTreeAddKeyMap(options) - call s:KeyMap.Create(a:options) + call g:NERDTreeKeyMap.Create(a:options) endfunction function! NERDTreeRender() - call s:renderView() + call nerdtree#renderView() endfunction function! NERDTreeFocus() - if s:isTreeOpen() - call s:putCursorInTreeWin() + if nerdtree#isTreeOpen() + call nerdtree#putCursorInTreeWin() else - call s:toggle("") + call g:NERDTreeCreator.TogglePrimary("") endif 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 +function! NERDTreeCWD() + call NERDTreeFocus() + call nerdtree#chRootCwd() 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() - call s:exec("wincmd p") - let bufnr = bufnr("") - call s:exec("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 - let @h=@h."\"\n\" ----------------------------\n" - let @h=@h."\" Custom mappings~\n" - for i in s:KeyMap.All() - if !empty(i.quickhelpText) - let @h=@h."\" ". i.key .": ". i.quickhelpText ."\n" - endif - endfor - - 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(currentNode, direction) - if a:currentNode.isRoot() - return s:echo("cannot jump to " . (a:direction ? "last" : "first") . " child") - end - let dirNode = a:currentNode.parent - let childNodes = dirNode.getVisibleChildren() - - let targetNode = childNodes[0] - if a:direction - let targetNode = childNodes[len(childNodes) - 1] - endif - - if targetNode.equals(a:currentNode) - let siblingDir = a: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:jumpToSibling(currentNode, forward) {{{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(currentNode, forward) - let sibling = a:currentNode.findSibling(a:forward) - - if !empty(sibling) - call sibling.putCursorHere(1, 0) - call s:centerView() - endif -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 foldmethod=manual - setlocal nofoldenable - 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:activateAll() {{{2 -"handle the user activating the updir line -function! s:activateAll() - if getline(".") ==# s:tree_up_dir_line - return s:upDir(0) - endif -endfunction - -"FUNCTION: s:activateDirNode() {{{2 -"handle the user activating a tree node -function! s:activateDirNode(node) - call a:node.activate({'reuse': 1}) -endfunction - -"FUNCTION: s:activateFileNode() {{{2 -"handle the user activating a tree node -function! s:activateFileNode(node) - call a:node.activate({'reuse': 1, 'where': 'p'}) -endfunction - -"FUNCTION: s:activateBookmark() {{{2 -"handle the user activating a bookmark -function! s:activateBookmark(bm) - call a:bm.activate(!a:bm.path.isDirectory ? {'where': 'p'} : {}) -endfunction - -"FUNCTION: s:bindMappings() {{{2 -function! s:bindMappings() - "make do the same as the default 'o' mapping - exec "nnoremap :call KeyMap_Invoke('". g:NERDTreeMapActivateNode ."')" - - 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:chCwd(node) {{{2 -function! s:chCwd(node) - try - call a:node.path.changeToDir() - catch /^NERDTree.PathChangeError/ - call s:echoWarning("could not change cwd") - endtry -endfunction - -" FUNCTION: s:chRoot(node) {{{2 -" changes the current root to the selected one -function! s:chRoot(node) - call a:node.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.clearBookmarks() - 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(node) {{{2 -" closes all childnodes of the current node -function! s:closeChildren(node) - call a:node.closeChildren() - call s:renderView() - call a:node.putCursorHere(0, 0) -endfunction -" FUNCTION: s:closeCurrentDir(node) {{{2 -" closes the parent dir of the current node -function! s:closeCurrentDir(node) - let parent = a:node.parent - if parent ==# {} || parent.isRoot() - call s:echo("cannot close tree root") - else - call a:node.parent.close() - call s:renderView() - call a:node.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(bm) {{{2 -" if the cursor is on a bookmark, prompt to delete -function! s:deleteBookmark(bm) - echo "Are you sure you wish to delete the bookmark:\n\"" . a:bm.name . "\" (yN):" - - if nr2char(getchar()) ==# 'y' - try - call a:bm.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:handleLeftClick() {{{2 -"Checks if the click should open the current node -function! s:handleLeftClick() - let currentNode = s:TreeFileNode.GetSelected() - if currentNode != {} - - "the dir arrows are multibyte chars, and vim's string functions only - "deal with single bytes - so split the line up with the hack below and - "take the line substring manually - let line = split(getline(line(".")), '\zs') - let startToCur = "" - for i in range(0,virtcol(".")-1) - let startToCur .= line[i] - endfor - - if currentNode.path.isDirectory - if startToCur =~# s:tree_markup_reg && startToCur =~# '[+~▾▸] \?$' - call currentNode.activate() - 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 - if currentNode.path.isDirectory - call currentNode.activate() - else - call currentNode.activate({'reuse': 1, 'where': 'p'}) - endif - return - endif - endif - endif -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(curNode) - else - call curNode.open({'where': 'h'}) - endif -endfunction - -" FUNCTION: s:jumpToFirstChild() {{{2 -" wrapper for the jump to child method -function! s:jumpToFirstChild(node) - call s:jumpToChild(a:node, 0) -endfunction - -" FUNCTION: s:jumpToLastChild() {{{2 -" wrapper for the jump to child method -function! s:jumpToLastChild(node) - call s:jumpToChild(a:node, 1) -endfunction - -" FUNCTION: s:jumpToParent(node) {{{2 -" moves the cursor to the parent of the current node -function! s:jumpToParent(node) - if !empty(a:node.parent) - call a:node.parent.putCursorHere(1, 0) - call s:centerView() - else - call s:echo("cannot jump to parent") - 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:jumpToNextSibling(node) {{{2 -function! s:jumpToNextSibling(node) - call s:jumpToSibling(a:node, 1) -endfunction - -" FUNCTION: s:jumpToPrevSibling(node) {{{2 -function! s:jumpToPrevSibling(node) - call s:jumpToSibling(a:node, 0) -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({'where': 'p'}) - endif -endfunction - -" FUNCTION: s:openHSplit(target) {{{2 -function! s:openHSplit(target) - call a:target.activate({'where': 'h'}) -endfunction - -" FUNCTION: s:openVSplit(target) {{{2 -function! s:openVSplit(target) - call a:target.activate({'where': 'v'}) -endfunction - -" FUNCTION: s:openExplorer(node) {{{2 -function! s:openExplorer(node) - call a:node.openExplorer() -endfunction - -" FUNCTION: s:openInNewTab(target) {{{2 -function! s:openInNewTab(target) - call a:target.activate({'where': 't'}) -endfunction - -" FUNCTION: s:openInNewTabSilent(target) {{{2 -function! s:openInNewTabSilent(target) - call a:target.activate({'where': 't', 'stay': 1}) -endfunction - -" FUNCTION: s:openNodeRecursively(node) {{{2 -function! s:openNodeRecursively(node) - call s:echo("Recursively opening node. Please wait...") - call a:node.openRecursively() - call s:renderView() - redraw - call s:echo("Recursively opening node. Please wait... DONE") -endfunction - -"FUNCTION: s:previewNodeCurrent(node) {{{2 -function! s:previewNodeCurrent(node) - call a:node.open({'stay': 1, 'where': 'p', 'keepopen': 1}) -endfunction - -"FUNCTION: s:previewNodeHSplit(node) {{{2 -function! s:previewNodeHSplit(node) - call a:node.open({'stay': 1, 'where': 'h', 'keepopen': 1}) -endfunction - -"FUNCTION: s:previewNodeVSplit(node) {{{2 -function! s:previewNodeVSplit(node) - call a:node.open({'stay': 1, 'where': 'v', 'keepopen': 1}) -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(node) {{{2 -" refreshes the root for the current node -function! s:refreshCurrent(node) - let node = a:node - if !node.path.isDirectory - let node = node.parent - endif - - call s:echo("Refreshing node. This could take a while...") - call node.refresh() - call s:renderView() - redraw - call s:echo("Refreshing node. This could take a while... DONE") -endfunction -" FUNCTION: s:showMenu(node) {{{2 -function! s:showMenu(node) - 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:upDirCurrentRootOpen() {{{2 -function! s:upDirCurrentRootOpen() - call s:upDir(1) -endfunction - -" FUNCTION: s:upDirCurrentRootClosed() {{{2 -function! s:upDirCurrentRootClosed() - call s:upDir(0) -endfunction - " SECTION: Post Source Actions {{{1 -call s:postSourceActions() +call nerdtree#postSourceActions() "reset &cpo back to users setting let &cpo = s:old_cpo diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/bookmark.vim b/sources_non_forked/nerdtree/plugin/nerdtree/bookmark.vim new file mode 100644 index 00000000..0d37b478 --- /dev/null +++ b/sources_non_forked/nerdtree/plugin/nerdtree/bookmark.vim @@ -0,0 +1,315 @@ +"CLASS: Bookmark +"============================================================ +let s:Bookmark = {} +let g:NERDTreeBookmark = s:Bookmark + +" FUNCTION: Bookmark.activate() {{{1 +function! s:Bookmark.activate(...) + call self.open(a:0 ? a:1 : {}) +endfunction + +" FUNCTION: Bookmark.AddBookmark(name, path) {{{1 +" 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() {{{1 +" 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) {{{1 +" 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) {{{1 +" 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() {{{1 +" 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) {{{1 +" 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, g:NERDTreePath.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 nerdtree#echo(invalidBookmarksFound . " invalid bookmarks were read. See :help NERDTreeInvalidBookmarks for info.") + endif + endif + call s:Bookmark.Sort() + endif +endfunction + +" FUNCTION: Bookmark.compareTo(otherbookmark) {{{1 +" Compare these two bookmarks for sorting purposes +function! s:Bookmark.compareTo(otherbookmark) + return a:otherbookmark.name < self.name +endfunction +" FUNCTION: Bookmark.ClearAll() {{{1 +" 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() {{{1 +" 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) {{{1 +" 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 ? g:NERDTreeDirNode.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) {{{1 +" 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() {{{1 +" 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() {{{1 +" 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() {{{1 +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) {{{1 +" 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.open([options]) {{{1 +"Args: +"A dictionary containing the following keys (all optional): +" 'where': Specifies whether the node should be opened in new split/tab or in +" the previous window. Can be either 'v' (vertical split), 'h' +" (horizontal split), 't' (new tab) or 'p' (previous window). +" 'reuse': if a window is displaying the file then jump the cursor there +" 'keepopen': dont close the tree window +" 'stay': open the file, but keep the cursor in the tree win +" +function! s:Bookmark.open(...) + let opts = a:0 ? a:1 : {} + + if self.path.isDirectory && !has_key(opts, 'where') + call self.toRoot() + else + let opener = g:NERDTreeOpener.New(self.path, opts) + call opener.open(self) + endif +endfunction + +" FUNCTION: Bookmark.openInNewTab(options) {{{1 +" Create a new bookmark object with the given name and path object +function! s:Bookmark.openInNewTab(options) + call nerdtree#deprecated('Bookmark.openInNewTab', 'is deprecated, use open() instead') + call self.open(a:options) +endfunction + +" FUNCTION: Bookmark.setPath(path) {{{1 +" makes this bookmark point to the given path +function! s:Bookmark.setPath(path) + let self.path = a:path +endfunction + +" FUNCTION: Bookmark.Sort() {{{1 +" Class method that sorts all bookmarks +function! s:Bookmark.Sort() + let CompareFunc = function("nerdtree#compareBookmarks") + call sort(s:Bookmark.Bookmarks(), CompareFunc) +endfunction + +" FUNCTION: Bookmark.str() {{{1 +" Get the string that should be rendered in the view for this bookmark +function! s:Bookmark.str() + let pathStrMaxLen = winwidth(nerdtree#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() {{{1 +" 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 = g:NERDTreeFileNode.New(s:Bookmark.BookmarkFor(self.name).path) + endtry + call targetNode.makeRoot() + call nerdtree#renderView() + call targetNode.putCursorHere(0, 0) + endif +endfunction + +" FUNCTION: Bookmark.ToRoot(name) {{{1 +" 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() {{{1 +function! s:Bookmark.validate() + if self.path.exists() + return 1 + else + call s:Bookmark.CacheBookmarks(1) + call nerdtree#renderView() + call nerdtree#echo(self.name . "now points to an invalid location. See :help NERDTreeInvalidBookmarks for info.") + return 0 + endif +endfunction + +" FUNCTION: Bookmark.Write() {{{1 +" 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 + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/creator.vim b/sources_non_forked/nerdtree/plugin/nerdtree/creator.vim new file mode 100644 index 00000000..7f0721f0 --- /dev/null +++ b/sources_non_forked/nerdtree/plugin/nerdtree/creator.vim @@ -0,0 +1,322 @@ +"CLASS: Creator +"Creates primary/secondary/mirror nerdtree windows. Sets up all the window and +"buffer options and key mappings etc. +"============================================================ +let s:Creator = {} +let g:NERDTreeCreator = s:Creator + +"FUNCTION: s:Creator._bindMappings() {{{1 +function! s:Creator._bindMappings() + "make do the same as the default 'o' mapping + exec "nnoremap :call nerdtree#invokeKeyMap('". g:NERDTreeMapActivateNode ."')" + + call g:NERDTreeKeyMap.BindAll() + + command! -buffer -nargs=? Bookmark :call nerdtree#bookmarkNode('') + command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=1 RevealBookmark :call nerdtree#revealBookmark('') + command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=1 OpenBookmark :call nerdtree#openBookmark('') + command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=* ClearBookmarks call nerdtree#clearBookmarks('') + command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=+ BookmarkToRoot call g:NERDTreeBookmark.ToRoot('') + command! -buffer -nargs=0 ClearAllBookmarks call g:NERDTreeBookmark.ClearAll() call nerdtree#renderView() + command! -buffer -nargs=0 ReadBookmarks call g:NERDTreeBookmark.CacheBookmarks(0) call nerdtree#renderView() + command! -buffer -nargs=0 WriteBookmarks call g:NERDTreeBookmark.Write() +endfunction + +"FUNCTION: s:Creator._broadcastInitEvent() {{{1 +function! s:Creator._broadcastInitEvent() + silent doautocmd User NERDTreeInit +endfunction + +" FUNCTION: s:Creator.BufNamePrefix() {{{2 +function! s:Creator.BufNamePrefix() + return 'NERD_tree_' +endfunction + +"FUNCTION: s:Creator.CreatePrimary(a:name) {{{1 +function! s:Creator.CreatePrimary(name) + let creator = s:Creator.New() + call creator.createPrimary(a:name) +endfunction + +"FUNCTION: s:Creator.createPrimary(a:name) {{{1 +"name: the name of a bookmark or a directory +function! s:Creator.createPrimary(name) + let path = self._pathForString(a:name) + + "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 nerdtree#treeExistsForTab() + if nerdtree#isTreeOpen() + call nerdtree#closeTree() + endif + unlet t:NERDTreeBufName + endif + + let newRoot = g:NERDTreeDirNode.New(path) + call newRoot.open() + + call self._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 nerdtree#renderView() + call b:NERDTreeRoot.putCursorHere(0, 0) + + call self._broadcastInitEvent() +endfunction + +"FUNCTION: s:Creator.CreateSecondary(dir) {{{1 +function! s:Creator.CreateSecondary(dir) + let creator = s:Creator.New() + call creator.createSecondary(a:dir) +endfunction + +"FUNCTION: s:Creator.createSecondary(dir) {{{1 +function! s:Creator.createSecondary(dir) + try + let path = g:NERDTreePath.New(a:dir) + catch /^NERDTree.InvalidArgumentsError/ + call nerdtree#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 " . self._nextBufferName() + + let b:NERDTreePreviousBuf = bufnr(previousBuf) + + let b:NERDTreeRoot = g:NERDTreeDirNode.New(path) + call b:NERDTreeRoot.open() + + call self._setCommonBufOptions() + let b:NERDTreeType = "secondary" + + call nerdtree#renderView() + + call self._broadcastInitEvent() +endfunction + +" FUNCTION: s:Creator.CreateMirror() {{{1 +function! s:Creator.CreateMirror() + let creator = s:Creator.New() + call creator.createMirror() +endfunction + +" FUNCTION: s:Creator.createMirror() {{{1 +function! s:Creator.createMirror() + "get the names off all the nerd tree buffers + let treeBufNames = [] + for i in range(1, tabpagenr("$")) + let nextName = nerdtree#tabpagevar(i, 'NERDTreeBufName') + if nextName != -1 && (!exists("t:NERDTreeBufName") || nextName != t:NERDTreeBufName) + call add(treeBufNames, nextName) + endif + endfor + let treeBufNames = nerdtree#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 nerdtree#echo("No trees to mirror") + return + endif + + if nerdtree#treeExistsForTab() && nerdtree#isTreeOpen() + call nerdtree#closeTree() + endif + + let t:NERDTreeBufName = bufferName + call self._createTreeWin() + exec 'buffer ' . bufferName + if !&hidden + call nerdtree#renderView() + endif +endfunction + +"FUNCTION: s:Creator._createTreeWin() {{{1 +"Inits the NERD tree window. ie. opens it, sizes it, sets all the local +"options etc +function! s:Creator._createTreeWin() + "create the nerd tree window + let splitLocation = g:NERDTreeWinPos ==# "left" ? "topleft " : "botright " + let splitSize = g:NERDTreeWinSize + + if !exists('t:NERDTreeBufName') + let t:NERDTreeBufName = self._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 self._setCommonBufOptions() +endfunction + +"FUNCTION: s:Creator.New() {{{1 +function! s:Creator.New() + let newCreator = copy(self) + return newCreator +endfunction + +" FUNCTION: s:Creator._nextBufferName() {{{2 +" returns the buffer name for the next nerd tree +function! s:Creator._nextBufferName() + let name = s:Creator.BufNamePrefix() . self._nextBufferNumber() + return name +endfunction + +" FUNCTION: s:Creator._nextBufferNumber() {{{2 +" the number to add to the nerd tree buffer name to make the buf name unique +function! s:Creator._nextBufferNumber() + if !exists("s:Creator._NextBufNum") + let s:Creator._NextBufNum = 1 + else + let s:Creator._NextBufNum += 1 + endif + + return s:Creator._NextBufNum +endfunction + +"FUNCTION: s:Creator._pathForString(str) {{{1 +"find a bookmark or adirectory for the given string +function! s:Creator._pathForString(str) + let path = {} + if g:NERDTreeBookmark.BookmarkExistsFor(a:str) + let path = g:NERDTreeBookmark.BookmarkFor(a:str).path + else + let dir = a:str ==# '' ? getcwd() : a:str + + "hack to get an absolute path if a relative path is given + if dir =~# '^\.' + let dir = getcwd() . g:NERDTreePath.Slash() . dir + endif + let dir = g:NERDTreePath.Resolve(dir) + + try + let path = g:NERDTreePath.New(dir) + catch /^NERDTree.InvalidArgumentsError/ + call nerdtree#echo("No bookmark or directory found for: " . a:str) + return + endtry + endif + if !path.isDirectory + let path = path.getParent() + endif + + return path +endfunction + +"FUNCTION: s:Creator._setCommonBufOptions() {{{1 +function! s:Creator._setCommonBufOptions() + "throwaway buffer options + setlocal noswapfile + setlocal buftype=nofile + setlocal bufhidden=hide + setlocal nowrap + setlocal foldcolumn=0 + setlocal foldmethod=manual + setlocal nofoldenable + 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 self._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 self._bindMappings() +endfunction + +"FUNCTION: s:Creator._setupStatusline() {{{1 +function! s:Creator._setupStatusline() + if g:NERDTreeStatusline != -1 + let &l:statusline = g:NERDTreeStatusline + endif +endfunction + +"FUNCTION: s:Creator.TogglePrimary(dir) {{{1 +function! s:Creator.TogglePrimary(dir) + let creator = s:Creator.New() + call creator.togglePrimary(a:dir) +endfunction + +"FUNCTION: s:Creator.togglePrimary(dir) {{{1 +"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:Creator.togglePrimary(dir) + if nerdtree#treeExistsForTab() + if !nerdtree#isTreeOpen() + call self._createTreeWin() + if !&hidden + call nerdtree#renderView() + endif + call nerdtree#restoreScreenState() + else + call nerdtree#closeTree() + endif + else + call self.createPrimary(a:dir) + endif +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/key_map.vim b/sources_non_forked/nerdtree/plugin/nerdtree/key_map.vim new file mode 100644 index 00000000..86457652 --- /dev/null +++ b/sources_non_forked/nerdtree/plugin/nerdtree/key_map.vim @@ -0,0 +1,143 @@ +"CLASS: KeyMap +"============================================================ +let s:KeyMap = {} +let g:NERDTreeKeyMap = s:KeyMap + +"FUNCTION: KeyMap.All() {{{1 +function! s:KeyMap.All() + if !exists("s:keyMaps") + let s:keyMaps = [] + endif + return s:keyMaps +endfunction + +"FUNCTION: KeyMap.FindFor(key, scope) {{{1 +function! s:KeyMap.FindFor(key, scope) + for i in s:KeyMap.All() + if i.key ==# a:key && i.scope ==# a:scope + return i + endif + endfor + return {} +endfunction + +"FUNCTION: KeyMap.BindAll() {{{1 +function! s:KeyMap.BindAll() + for i in s:KeyMap.All() + call i.bind() + endfor +endfunction + +"FUNCTION: KeyMap.bind() {{{1 +function! s:KeyMap.bind() + " If the key sequence we're trying to map contains any '<>' notation, we + " must replace each of the '<' characters with '' to ensure the string + " is not translated into its corresponding keycode during the later part + " of the map command below + " :he <> + let specialNotationRegex = '\m<\([[:alnum:]_-]\+>\)' + if self.key =~# specialNotationRegex + let keymapInvokeString = substitute(self.key, specialNotationRegex, '\1', 'g') + else + let keymapInvokeString = self.key + endif + + let premap = self.key == "" ? " " : " " + + exec 'nnoremap '. self.key . premap . ':call nerdtree#invokeKeyMap("'. keymapInvokeString .'")' +endfunction + +"FUNCTION: KeyMap.Remove(key, scope) {{{1 +function! s:KeyMap.Remove(key, scope) + let maps = s:KeyMap.All() + for i in range(len(maps)) + if maps[i].key ==# a:key && maps[i].scope ==# a:scope + return remove(maps, i) + endif + endfor +endfunction + +"FUNCTION: KeyMap.invoke() {{{1 +"Call the KeyMaps callback function +function! s:KeyMap.invoke(...) + let Callback = function(self.callback) + if a:0 + call Callback(a:1) + else + call Callback() + endif +endfunction + +"FUNCTION: KeyMap.Invoke() {{{1 +"Find a keymapping for a:key and the current scope invoke it. +" +"Scope is determined as follows: +" * if the cursor is on a dir node then "DirNode" +" * if the cursor is on a file node then "FileNode" +" * if the cursor is on a bookmark then "Bookmark" +" +"If a keymap has the scope of "all" then it will be called if no other keymap +"is found for a:key and the scope. +function! s:KeyMap.Invoke(key) + let node = g:NERDTreeFileNode.GetSelected() + if !empty(node) + + "try file node + if !node.path.isDirectory + let km = s:KeyMap.FindFor(a:key, "FileNode") + if !empty(km) + return km.invoke(node) + endif + endif + + "try dir node + if node.path.isDirectory + let km = s:KeyMap.FindFor(a:key, "DirNode") + if !empty(km) + return km.invoke(node) + endif + endif + + "try generic node + let km = s:KeyMap.FindFor(a:key, "Node") + if !empty(km) + return km.invoke(node) + endif + + endif + + "try bookmark + let bm = g:NERDTreeBookmark.GetSelected() + if !empty(bm) + let km = s:KeyMap.FindFor(a:key, "Bookmark") + if !empty(km) + return km.invoke(bm) + endif + endif + + "try all + let km = s:KeyMap.FindFor(a:key, "all") + if !empty(km) + return km.invoke() + endif +endfunction + +"FUNCTION: KeyMap.Create(options) {{{1 +function! s:KeyMap.Create(options) + let newKeyMap = copy(self) + let opts = extend({'scope': 'all', 'quickhelpText': ''}, copy(a:options)) + let newKeyMap.key = opts['key'] + let newKeyMap.quickhelpText = opts['quickhelpText'] + let newKeyMap.callback = opts['callback'] + let newKeyMap.scope = opts['scope'] + + call s:KeyMap.Add(newKeyMap) +endfunction + +"FUNCTION: KeyMap.Add(keymap) {{{1 +function! s:KeyMap.Add(keymap) + call s:KeyMap.Remove(a:keymap.key, a:keymap.scope) + call add(s:KeyMap.All(), a:keymap) +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/menu_controller.vim b/sources_non_forked/nerdtree/plugin/nerdtree/menu_controller.vim new file mode 100644 index 00000000..ae0ee848 --- /dev/null +++ b/sources_non_forked/nerdtree/plugin/nerdtree/menu_controller.vim @@ -0,0 +1,180 @@ +"CLASS: MenuController +"============================================================ +let s:MenuController = {} +let g:NERDTreeMenuController = s:MenuController + +"FUNCTION: MenuController.New(menuItems) {{{1 +"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() {{{1 +"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() {{{1 +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) {{{1 +"get the MenuItem that is currently selected +function! s:MenuController._current() + return self.menuItems[self.selection] +endfunction + +"FUNCTION: MenuController._handleKeypress(key) {{{1 +"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) {{{1 +"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) {{{1 +"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() {{{1 +"sets &cmdheight to whatever is needed to display the menu +function! s:MenuController._setCmdheight() + let &cmdheight = len(self.menuItems) + 3 +endfunction + +"FUNCTION: MenuController._saveOptions() {{{1 +"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() {{{1 +"restore the options we saved in _saveOptions() +function! s:MenuController._restoreOptions() + let &cmdheight = self._oldCmdheight + let &lazyredraw = self._oldLazyredraw +endfunction + +"FUNCTION: MenuController._cursorDown() {{{1 +"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() {{{1 +"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 + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/menu_item.vim b/sources_non_forked/nerdtree/plugin/nerdtree/menu_item.vim new file mode 100644 index 00000000..6fb9d9e3 --- /dev/null +++ b/sources_non_forked/nerdtree/plugin/nerdtree/menu_item.vim @@ -0,0 +1,114 @@ +"CLASS: MenuItem +"============================================================ +let s:MenuItem = {} +let g:NERDTreeMenuItem = s:MenuItem + +"FUNCTION: MenuItem.All() {{{1 +"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() {{{1 +"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) {{{1 +"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) {{{1 +"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) {{{1 +"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() {{{1 +"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() {{{1 +"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() {{{1 +"return 1 if this menuitem is a separator +function! s:MenuItem.isSeparator() + return self.callback == -1 && self.children == [] +endfunction + +"FUNCTION: MenuItem.isSubmenu() {{{1 +"return 1 if this menuitem is a submenu +function! s:MenuItem.isSubmenu() + return self.callback == -1 && !empty(self.children) +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/opener.vim b/sources_non_forked/nerdtree/plugin/nerdtree/opener.vim new file mode 100644 index 00000000..bcc0d4fc --- /dev/null +++ b/sources_non_forked/nerdtree/plugin/nerdtree/opener.vim @@ -0,0 +1,264 @@ +"CLASS: Opener +"============================================================ +let s:Opener = {} +let g:NERDTreeOpener = s:Opener + +"FUNCTION: Opener._checkToCloseTree(newtab) {{{1 +"Check the class options and global options (i.e. NERDTreeQuitOnOpen) to see +"if the tree should be closed now. +" +"Args: +"a:newtab - boolean. If set, only close the tree now if we are opening the +"target in a new tab. This is needed because we have to close tree before we +"leave the tab +function! s:Opener._checkToCloseTree(newtab) + if self._keepopen + return + endif + + if (a:newtab && self._where == 't') || !a:newtab + call nerdtree#closeTreeIfQuitOnOpen() + endif +endfunction + +"FUNCTION: Opener._gotoTargetWin() {{{1 +function! s:Opener._gotoTargetWin() + if b:NERDTreeType ==# "secondary" + if self._where == 'v' + vsplit + elseif self._where == 'h' + split + elseif self._where == 't' + tabnew + endif + else + call self._checkToCloseTree(1) + + if self._where == 'v' + call self._newVSplit() + elseif self._where == 'h' + call self._newSplit() + elseif self._where == 't' + tabnew + elseif self._where == 'p' + call self._previousWindow() + endif + + call self._checkToCloseTree(0) + endif +endfunction + +"FUNCTION: Opener.New(path, opts) {{{1 +"Args: +" +"a:path: The path object that is to be opened. +" +"a:opts: +" +"A dictionary containing the following keys (all optional): +" 'where': Specifies whether the node should be opened in new split/tab or in +" the previous window. Can be either 'v' or 'h' or 't' (for open in +" new tab) +" 'reuse': if a window is displaying the file then jump the cursor there +" 'keepopen': dont close the tree window +" 'stay': open the file, but keep the cursor in the tree win +function! s:Opener.New(path, opts) + let newObj = copy(self) + + let newObj._path = a:path + let newObj._stay = nerdtree#has_opt(a:opts, 'stay') + let newObj._reuse = nerdtree#has_opt(a:opts, 'reuse') + let newObj._keepopen = nerdtree#has_opt(a:opts, 'keepopen') + let newObj._where = has_key(a:opts, 'where') ? a:opts['where'] : '' + let newObj._treetype = b:NERDTreeType + call newObj._saveCursorPos() + + return newObj +endfunction + +"FUNCTION: Opener._newSplit() {{{1 +function! s:Opener._newSplit() + " 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 nerdtree#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 ") + catch /^Vim\%((\a\+)\)\=:E37/ + call nerdtree#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 nerdtree#exec(there) + exec("silent ". splitMode ." resize ". size) + call nerdtree#exec('wincmd p') + endif + + " Restore splitmode settings + let &splitbelow=savesplitbelow + let &splitright=savesplitright +endfunction + +"FUNCTION: Opener._newVSplit() {{{1 +function! s:Opener._newVSplit() + let winwidth = winwidth(".") + if winnr("$")==#1 + let winwidth = g:NERDTreeWinSize + endif + + call nerdtree#exec("wincmd p") + vnew + + "resize the nerd tree back to the original size + call nerdtree#putCursorInTreeWin() + exec("silent vertical resize ". winwidth) + call nerdtree#exec('wincmd p') +endfunction + +"FUNCTION: Opener.open(target) {{{1 +function! s:Opener.open(target) + if self._path.isDirectory + call self._openDirectory(a:target) + else + call self._openFile() + endif +endfunction + +"FUNCTION: Opener._openFile() {{{1 +function! s:Opener._openFile() + if self._reuse && self._reuseWindow() + return + endif + + call self._gotoTargetWin() + + if self._treetype ==# "secondary" + call self._path.edit() + else + call self._path.edit() + + + if self._stay + call self._restoreCursorPos() + endif + endif +endfunction + +"FUNCTION: Opener._openDirectory(node) {{{1 +function! s:Opener._openDirectory(node) + if self._treetype ==# "secondary" + call self._gotoTargetWin() + call g:NERDTreeCreator.CreateSecondary(a:node.path.str()) + else + call self._gotoTargetWin() + if empty(self._where) + call a:node.makeRoot() + call nerdtree#renderView() + call a:node.putCursorHere(0, 0) + elseif self._where == 't' + call g:NERDTreeCreator.CreatePrimary(a:node.path.str()) + else + call g:NERDTreeCreator.CreateSecondary(a:node.path.str()) + endif + endif + + if self._stay + call self._restoreCursorPos() + endif +endfunction + +"FUNCTION: Opener._previousWindow() {{{1 +function! s:Opener._previousWindow() + if !nerdtree#isWindowUsable(winnr("#")) && nerdtree#firstUsableWindow() ==# -1 + call self._newSplit() + else + try + if !nerdtree#isWindowUsable(winnr("#")) + call nerdtree#exec(nerdtree#firstUsableWindow() . "wincmd w") + else + call nerdtree#exec('wincmd p') + endif + catch /^Vim\%((\a\+)\)\=:E37/ + call nerdtree#putCursorInTreeWin() + throw "NERDTree.FileAlreadyOpenAndModifiedError: ". self._path.str() ." is already open and modified." + catch /^Vim\%((\a\+)\)\=:/ + echo v:exception + endtry + endif +endfunction + +"FUNCTION: Opener._restoreCursorPos(){{{1 +function! s:Opener._restoreCursorPos() + call nerdtree#exec('normal ' . self._tabnr . 'gt') + call nerdtree#exec(bufwinnr(self._bufnr) . 'wincmd w') +endfunction + +"FUNCTION: Opener._reuseWindow(){{{1 +"put the cursor in the first window we find for this file +" +"return 1 if we were successful +function! s:Opener._reuseWindow() + "check the current tab for the window + let winnr = bufwinnr('^' . self._path.str() . '$') + if winnr != -1 + call nerdtree#exec(winnr . "wincmd w") + call self._checkToCloseTree(0) + return 1 + else + "check other tabs + let tabnr = self._path.tabnr() + if tabnr + call self._checkToCloseTree(1) + call nerdtree#exec('normal! ' . tabnr . 'gt') + let winnr = bufwinnr('^' . self._path.str() . '$') + call nerdtree#exec(winnr . "wincmd w") + return 1 + endif + endif + return 0 +endfunction + +"FUNCTION: Opener._saveCursorPos(){{{1 +function! s:Opener._saveCursorPos() + let self._bufnr = bufnr("") + let self._tabnr = tabpagenr() +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/path.vim b/sources_non_forked/nerdtree/plugin/nerdtree/path.vim new file mode 100644 index 00000000..58bb0138 --- /dev/null +++ b/sources_non_forked/nerdtree/plugin/nerdtree/path.vim @@ -0,0 +1,724 @@ +"we need to use this number many times for sorting... so we calculate it only +"once here +let s:NERDTreeSortStarIndex = index(g:NERDTreeSortOrder, '*') + +"CLASS: Path +"============================================================ +let s:Path = {} +let g:NERDTreePath = s:Path + +"FUNCTION: Path.AbsolutePathFor(str) {{{1 +function! s:Path.AbsolutePathFor(str) + let prependCWD = 0 + if nerdtree#runningWindows() + let prependCWD = a:str !~# '^.:\(\\\|\/\)' && 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() {{{1 +function! s:Path.bookmarkNames() + if !exists("self._bookmarkNames") + call self.cacheDisplayString() + endif + return self._bookmarkNames +endfunction + +"FUNCTION: Path.cacheDisplayString() {{{1 +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 g:NERDTreeBookmark.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() {{{1 +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 nerdtree#echo("CWD is now: " . getcwd()) + catch + throw "NERDTree.PathChangeError: cannot change CWD to " . dir + endtry +endfunction + +"FUNCTION: Path.compareTo() {{{1 +" +"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() {{{1 +function! s:Path._strForUI() + let toReturn = '/' . join(self.pathSegments, '/') + if self.isDirectory && toReturn != '/' + let toReturn = toReturn . '/' + endif + return toReturn +endfunction + +"FUNCTION: Path._strForCd() {{{1 +" +" returns a string that can be used with :cd +function! s:Path._strForCd() + return escape(self.str(), nerdtree#escChars()) +endfunction + +"FUNCTION: Path._strForEdit() {{{1 +" +"Return: the string for this path that is suitable to be used with the :edit +"command +function! s:Path._strForEdit() + let p = escape(self.str({'format': 'UI'}), nerdtree#escChars()) + let cwd = getcwd() . s:Path.Slash() + + "return a relative path if we can + let isRelative = 0 + if nerdtree#runningWindows() + let isRelative = stridx(tolower(p), tolower(cwd)) == 0 + else + let isRelative = stridx(p, cwd) == 0 + endif + + if isRelative + let p = strpart(p, strlen(cwd)) + + "handle the edge case where the file begins with a + (vim interprets + "the +foo in `:e +foo` as an option to :edit) + if p[0] == "+" + let p = '\' . p + endif + endif + + if p ==# '' + let p = '.' + endif + + return p +endfunction + +"FUNCTION: Path._strForGlob() {{{1 +function! s:Path._strForGlob() + let lead = s:Path.Slash() + + "if we are running windows then slap a drive letter on the front + if nerdtree#runningWindows() + let lead = self.drive . '\' + endif + + let toReturn = lead . join(self.pathSegments, s:Path.Slash()) + + if !nerdtree#runningWindows() + let toReturn = escape(toReturn, nerdtree#escChars()) + endif + return toReturn +endfunction + +"FUNCTION: Path._str() {{{1 +" +"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 nerdtree#runningWindows() + let lead = self.drive . '\' + endif + + return lead . join(self.pathSegments, s:Path.Slash()) +endfunction + +"FUNCTION: Path.strTrunk() {{{1 +"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.tabnr() {{{1 +" return the number of the first tab that is displaying this file +" +" return 0 if no tab was found +function! s:Path.tabnr() + let str = self.str() + for t in range(tabpagenr('$')) + for b in tabpagebuflist(t+1) + if str == expand('#' . b . ':p') + return t+1 + endif + endfor + endfor + return 0 +endfunction + +"FUNCTION: Path.WinToUnixPath(pathstr){{{1 +"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 !nerdtree#runningWindows() + return a:pathstr + endif + + let toReturn = a:pathstr + + "remove the x:\ of the front + let toReturn = substitute(toReturn, '^.*:\(\\\|/\)\?', '/', "") + + "remove the \\ network share from the front + let toReturn = substitute(toReturn, '^\(\\\\\|\/\/\)[^\\\/]*\(\\\|\/\)[^\\\/]*\(\\\|\/\)\?', '/', "") + + "convert all \ chars to / + let toReturn = substitute(toReturn, '\', '/', "g") + + return toReturn +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/tree_dir_node.vim b/sources_non_forked/nerdtree/plugin/nerdtree/tree_dir_node.vim new file mode 100644 index 00000000..e3a068ed --- /dev/null +++ b/sources_non_forked/nerdtree/plugin/nerdtree/tree_dir_node.vim @@ -0,0 +1,528 @@ +"CLASS: TreeDirNode +"A subclass of NERDTreeFileNode. +" +"The 'composite' part of the file/dir composite. +"============================================================ +let s:TreeDirNode = copy(g:NERDTreeFileNode) +let g:NERDTreeDirNode = s:TreeDirNode + +"FUNCTION: TreeDirNode.AbsoluteTreeRoot(){{{1 +"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([options]) {{{1 +unlet s:TreeDirNode.activate +function! s:TreeDirNode.activate(...) + let opts = a:0 ? a:1 : {} + call self.toggleOpen(opts) + call nerdtree#renderView() + call self.putCursorHere(0, 0) +endfunction + +"FUNCTION: TreeDirNode.addChild(treenode, inOrder) {{{1 +"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() {{{1 +"Closes this directory +function! s:TreeDirNode.close() + let self.isOpen = 0 +endfunction + +"FUNCTION: TreeDirNode.closeChildren() {{{1 +"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) {{{1 +"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 = g:NERDTreeFileNode.New(a:path) + call self.addChild(newTreeNode, a:inOrder) + return newTreeNode +endfunction + +"FUNCTION: TreeDirNode.findNode(path) {{{1 +"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() {{{1 +"Returns the number of children this node has +function! s:TreeDirNode.getChildCount() + return len(self.children) +endfunction + +"FUNCTION: TreeDirNode.getChild(path) {{{1 +"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) {{{1 +"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) {{{1 +"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() {{{1 +"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 = g:NERDTreeFileNode.GetSelected() + if currentDir != {} && !currentDir.isRoot() + if currentDir.path.isDirectory ==# 0 + let currentDir = currentDir.parent + endif + endif + return currentDir +endfunction + +"FUNCTION: TreeDirNode.getVisibleChildCount() {{{1 +"Returns the number of visible children this node has +function! s:TreeDirNode.getVisibleChildCount() + return len(self.getVisibleChildren()) +endfunction + +"FUNCTION: TreeDirNode.getVisibleChildren() {{{1 +"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() {{{1 +"returns 1 if this node has any childre, 0 otherwise.. +function! s:TreeDirNode.hasVisibleChildren() + return self.getVisibleChildCount() != 0 +endfunction + +"FUNCTION: TreeDirNode._initChildren() {{{1 +"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'}) + + if version >= 703 + let filesStr = globpath(globDir, '*', 1) . "\n" . globpath(globDir, '.*', 1) + else + let filesStr = globpath(globDir, '*') . "\n" . globpath(globDir, '.*') + endif + + let files = split(filesStr, "\n") + + if !a:silent && len(files) > g:NERDTreeNotificationThreshold + call nerdtree#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 = g:NERDTreePath.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 nerdtree#echo("Please wait, caching a large dir ... DONE (". self.getChildCount() ." nodes cached).") + endif + + if invalidFilesFound + call nerdtree#echoWarning(invalidFilesFound . " file(s) could not be loaded into the NERD tree") + endif + return self.getChildCount() +endfunction + +"FUNCTION: TreeDirNode.New(path) {{{1 +"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([opts]) {{{1 +"Open the dir in the current tree or in a new tree elsewhere. +" +"If opening in the current tree, return the number of cached nodes. +unlet s:TreeDirNode.open +function! s:TreeDirNode.open(...) + let opts = a:0 ? a:1 : {} + + if has_key(opts, 'where') && !empty(opts['where']) + let opener = g:NERDTreeOpener.New(self.path, opts) + call opener.open(self) + else + let self.isOpen = 1 + if self.children ==# [] + return self._initChildren(0) + else + return 0 + endif + endif +endfunction + +"FUNCTION: TreeDirNode.openAlong([opts]) {{{1 +"recursive open the dir if it has only one directory child. +" +"return the level of opened directories. +function! s:TreeDirNode.openAlong(...) + let opts = a:0 ? a:1 : {} + let level = 0 + + let node = self + while node.path.isDirectory + call node.open(opts) + let level += 1 + if node.getVisibleChildCount() == 1 + let node = node.getChildByIndex(0, 1) + else + break + endif + endwhile + return level +endfunction + +" FUNCTION: TreeDirNode.openExplorer() {{{1 +" opens an explorer window for this node in the previous window (could be a +" nerd tree or a netrw) +function! s:TreeDirNode.openExplorer() + call self.open({'where': 'p'}) +endfunction + +"FUNCTION: TreeDirNode.openInNewTab(options) {{{1 +unlet s:TreeDirNode.openInNewTab +function! s:TreeDirNode.openInNewTab(options) + call nerdtree#deprecated('TreeDirNode.openInNewTab', 'is deprecated, use open() instead') + call self.open({'where': 't'}) +endfunction + +"FUNCTION: TreeDirNode._openInNewTab() {{{1 +function! s:TreeDirNode._openInNewTab() + tabnew + call g:NERDTreeCreator.CreatePrimary(self.path.str()) +endfunction + +"FUNCTION: TreeDirNode.openRecursively() {{{1 +"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() {{{1 +"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() {{{1 +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 = g:NERDTreePath.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 = g:NERDTreeFileNode.New(path) + let newNode.parent = self + call add(newChildNodes, newNode) + endif + + + catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/ + 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 nerdtree#echoWarning("some files could not be loaded into the NERD tree") + endif + endif +endfunction + +"FUNCTION: TreeDirNode.reveal(path) {{{1 +"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 nerdtree#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) {{{1 +" +"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() {{{1 +" +"Sorts the children of this node according to alphabetical order and the +"directory priority. +" +function! s:TreeDirNode.sortChildren() + let CompareFunc = function("nerdtree#compareNodes") + call sort(self.children, CompareFunc) +endfunction + +"FUNCTION: TreeDirNode.toggleOpen([options]) {{{1 +"Opens this directory if it is closed and vice versa +function! s:TreeDirNode.toggleOpen(...) + let opts = a:0 ? a:1 : {} + if self.isOpen ==# 1 + call self.close() + else + if g:NERDTreeCasadeOpenSingleChildDir == 0 + call self.open(opts) + else + call self.openAlong(opts) + endif + endif +endfunction + +"FUNCTION: TreeDirNode.transplantChild(newNode) {{{1 +"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 + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/tree_file_node.vim b/sources_non_forked/nerdtree/plugin/nerdtree/tree_file_node.vim new file mode 100644 index 00000000..ab8d3719 --- /dev/null +++ b/sources_non_forked/nerdtree/plugin/nerdtree/tree_file_node.vim @@ -0,0 +1,485 @@ +"CLASS: TreeFileNode +"This class is the parent of the TreeDirNode class and is the +"'Component' part of the composite design pattern between the treenode +"classes. +"============================================================ +let s:TreeFileNode = {} +let g:NERDTreeFileNode = s:TreeFileNode + +"FUNCTION: TreeFileNode.activate(...) {{{1 +function! s:TreeFileNode.activate(...) + call self.open(a:0 ? a:1 : {}) +endfunction + +"FUNCTION: TreeFileNode.bookmark(name) {{{1 +"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 = g:NERDTreeBookmark.GetNodeForName(a:name, 1) + catch /^NERDTree.BookmarkNotFoundError/ + catch /^NERDTree.BookmarkedNodeNotFoundError/ + endtry + + call g:NERDTreeBookmark.AddBookmark(a:name, self.path) + call self.path.cacheDisplayString() + call g:NERDTreeBookmark.Write() + + if !empty(oldMarkedNode) + call oldMarkedNode.path.cacheDisplayString() + endif +endfunction + +"FUNCTION: TreeFileNode.cacheParent() {{{1 +"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.clearBookmarks() {{{1 +function! s:TreeFileNode.clearBookmarks() + for i in g:NERDTreeBookmark.Bookmarks() + if i.path.equals(self.path) + call i.delete() + end + endfor + call self.path.cacheDisplayString() +endfunction + +"FUNCTION: TreeFileNode.copy(dest) {{{1 +function! s:TreeFileNode.copy(dest) + call self.path.copy(a:dest) + let newPath = g:NERDTreePath.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 {{{1 +"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() {{{1 +" +"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) {{{1 +" +"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) {{{1 +"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) {{{1 +" +"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) {{{1 +" +"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(){{{1 +"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 = nerdtree#indentLevelFor(curLine) + if indent ==# curPathComponent + let curLine = nerdtree#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(){{{1 +"get the root node for this tab +function! s:TreeFileNode.GetRootForTab() + if nerdtree#treeExistsForTab() + return getbufvar(t:NERDTreeBufName, 'NERDTreeRoot') + end + return {} +endfunction + +"FUNCTION: TreeFileNode.GetRootLineNum(){{{1 +"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() {{{1 +"gets the treenode that the cursor is currently over +function! s:TreeFileNode.GetSelected() + try + let path = nerdtree#getPath(line(".")) + if path ==# {} + return {} + endif + return b:NERDTreeRoot.findNode(path) + catch /^NERDTree/ + return {} + endtry +endfunction + +"FUNCTION: TreeFileNode.isVisible() {{{1 +"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() {{{1 +"returns 1 if this node is b:NERDTreeRoot +function! s:TreeFileNode.isRoot() + if !nerdtree#treeExistsForBuf() + throw "NERDTree.NoTreeError: No tree exists for the current buffer" + endif + + return self.equals(b:NERDTreeRoot) +endfunction + +"FUNCTION: TreeFileNode.makeRoot() {{{1 +"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 + + silent doautocmd User NERDTreeNewRoot +endfunction + +"FUNCTION: TreeFileNode.New(path) {{{1 +"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 g:NERDTreeDirNode.New(a:path) + else + let newTreeNode = copy(self) + let newTreeNode.path = a:path + let newTreeNode.parent = {} + return newTreeNode + endif +endfunction + +"FUNCTION: TreeFileNode.open() {{{1 +function! s:TreeFileNode.open(...) + let opts = a:0 ? a:1 : {} + let opener = g:NERDTreeOpener.New(self.path, opts) + call opener.open(self) +endfunction + +"FUNCTION: TreeFileNode.openSplit() {{{1 +"Open this node in a new window +function! s:TreeFileNode.openSplit() + call nerdtree#deprecated('TreeFileNode.openSplit', 'is deprecated, use .open() instead.') + call self.open({'where': 'h'}) +endfunction + +"FUNCTION: TreeFileNode.openVSplit() {{{1 +"Open this node in a new vertical window +function! s:TreeFileNode.openVSplit() + call nerdtree#deprecated('TreeFileNode.openVSplit', 'is deprecated, use .open() instead.') + call self.open({'where': 'v'}) +endfunction + +"FUNCTION: TreeFileNode.openInNewTab(options) {{{1 +function! s:TreeFileNode.openInNewTab(options) + echomsg 'TreeFileNode.openInNewTab is deprecated' + call self.open(extend({'where': 't'}, a:options)) +endfunction + +"FUNCTION: TreeFileNode.putCursorHere(isJump, recurseUpward){{{1 +"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 nerdtree#renderView() + call node.putCursorHere(a:isJump, 0) + endif + endif +endfunction + +"FUNCTION: TreeFileNode.refresh() {{{1 +function! s:TreeFileNode.refresh() + call self.path.refresh() +endfunction + +"FUNCTION: TreeFileNode.rename() {{{1 +"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 {{{1 +"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 + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/nginx-vim/README.md b/sources_non_forked/nginx-vim/README.md new file mode 100755 index 00000000..8124452e --- /dev/null +++ b/sources_non_forked/nginx-vim/README.md @@ -0,0 +1,7 @@ +# nginx syntax files for Vim. + +Copied into a directory to play well with pathogen. + +* Original: http://www.vim.org/scripts/script.php?script_id=1886 + + diff --git a/sources_non_forked/nginx-vim/ftdetect/nginx.vim b/sources_non_forked/nginx-vim/ftdetect/nginx.vim new file mode 100755 index 00000000..d12c2bf1 --- /dev/null +++ b/sources_non_forked/nginx-vim/ftdetect/nginx.vim @@ -0,0 +1,2 @@ +au BufRead,BufNewFile /etc/nginx/* set ft=nginx +au BufRead,BufNewFile /usr/local/nginx/conf/* set ft=nginx diff --git a/sources_non_forked/nginx-vim/indent/nginx.vim b/sources_non_forked/nginx-vim/indent/nginx.vim new file mode 100755 index 00000000..51115e91 --- /dev/null +++ b/sources_non_forked/nginx-vim/indent/nginx.vim @@ -0,0 +1,9 @@ +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +" cindent actually works for nginx' simple file structure +setlocal cindent +" Just make sure that the comments are not reset as defs would be. +setlocal cinkeys-=0# diff --git a/sources_non_forked/nginx-vim/syntax/nginx.vim b/sources_non_forked/nginx-vim/syntax/nginx.vim new file mode 100755 index 00000000..ccd47680 --- /dev/null +++ b/sources_non_forked/nginx-vim/syntax/nginx.vim @@ -0,0 +1,664 @@ +" Vim syntax file +" Language: nginx.conf + +if exists("b:current_syntax") + finish +end + +setlocal iskeyword+=. +setlocal iskeyword+=/ +setlocal iskeyword+=: + +syn match ngxVariable '\$\w\w*' +syn match ngxVariableBlock '\$\w\w*' contained +syn match ngxVariableString '\$\w\w*' contained +syn region ngxBlock start=+^+ end=+{+ contains=ngxComment,ngxDirectiveBlock,ngxVariableBlock,ngxString oneline +syn region ngxString start=+"+ end=+"+ skip=+\\\\\|\\"+ contains=ngxVariableString oneline +syn region ngxString start=+'+ end=+'+ skip=+\\\\\|\\'+ contains=ngxVariableString oneline +syn match ngxComment ' *#.*$' + +syn keyword ngxBoolean on +syn keyword ngxBoolean off + +syn keyword ngxDirectiveBlock http contained +syn keyword ngxDirectiveBlock mail contained +syn keyword ngxDirectiveBlock events contained +syn keyword ngxDirectiveBlock server contained +syn keyword ngxDirectiveBlock types contained +syn keyword ngxDirectiveBlock location contained +syn keyword ngxDirectiveBlock upstream contained +syn keyword ngxDirectiveBlock charset_map contained +syn keyword ngxDirectiveBlock limit_except contained +syn keyword ngxDirectiveBlock if contained +syn keyword ngxDirectiveBlock geo contained +syn keyword ngxDirectiveBlock map contained + +syn keyword ngxDirectiveImportant include +syn keyword ngxDirectiveImportant root +syn keyword ngxDirectiveImportant server +syn keyword ngxDirectiveImportant server_name +syn keyword ngxDirectiveImportant listen +syn keyword ngxDirectiveImportant internal +syn keyword ngxDirectiveImportant proxy_pass +syn keyword ngxDirectiveImportant memcached_pass +syn keyword ngxDirectiveImportant fastcgi_pass +syn keyword ngxDirectiveImportant try_files + +syn keyword ngxDirectiveControl break +syn keyword ngxDirectiveControl return +syn keyword ngxDirectiveControl rewrite +syn keyword ngxDirectiveControl set + +syn keyword ngxDirectiveError error_page +syn keyword ngxDirectiveError post_action + +syn keyword ngxDirectiveDeprecated connections +syn keyword ngxDirectiveDeprecated imap +syn keyword ngxDirectiveDeprecated open_file_cache_retest +syn keyword ngxDirectiveDeprecated optimize_server_names +syn keyword ngxDirectiveDeprecated satisfy_any + +syn keyword ngxDirective accept_mutex +syn keyword ngxDirective accept_mutex_delay +syn keyword ngxDirective access_log +syn keyword ngxDirective add_after_body +syn keyword ngxDirective add_before_body +syn keyword ngxDirective add_header +syn keyword ngxDirective addition_types +syn keyword ngxDirective aio +syn keyword ngxDirective alias +syn keyword ngxDirective allow +syn keyword ngxDirective ancient_browser +syn keyword ngxDirective ancient_browser_value +syn keyword ngxDirective auth_basic +syn keyword ngxDirective auth_basic_user_file +syn keyword ngxDirective auth_http +syn keyword ngxDirective auth_http_header +syn keyword ngxDirective auth_http_timeout +syn keyword ngxDirective autoindex +syn keyword ngxDirective autoindex_exact_size +syn keyword ngxDirective autoindex_localtime +syn keyword ngxDirective charset +syn keyword ngxDirective charset_types +syn keyword ngxDirective client_body_buffer_size +syn keyword ngxDirective client_body_in_file_only +syn keyword ngxDirective client_body_in_single_buffer +syn keyword ngxDirective client_body_temp_path +syn keyword ngxDirective client_body_timeout +syn keyword ngxDirective client_header_buffer_size +syn keyword ngxDirective client_header_timeout +syn keyword ngxDirective client_max_body_size +syn keyword ngxDirective connection_pool_size +syn keyword ngxDirective create_full_put_path +syn keyword ngxDirective daemon +syn keyword ngxDirective dav_access +syn keyword ngxDirective dav_methods +syn keyword ngxDirective debug_connection +syn keyword ngxDirective debug_points +syn keyword ngxDirective default_type +syn keyword ngxDirective degradation +syn keyword ngxDirective degrade +syn keyword ngxDirective deny +syn keyword ngxDirective devpoll_changes +syn keyword ngxDirective devpoll_events +syn keyword ngxDirective directio +syn keyword ngxDirective directio_alignment +syn keyword ngxDirective empty_gif +syn keyword ngxDirective env +syn keyword ngxDirective epoll_events +syn keyword ngxDirective error_log +syn keyword ngxDirective eventport_events +syn keyword ngxDirective expires +syn keyword ngxDirective fastcgi_bind +syn keyword ngxDirective fastcgi_buffer_size +syn keyword ngxDirective fastcgi_buffers +syn keyword ngxDirective fastcgi_busy_buffers_size +syn keyword ngxDirective fastcgi_cache +syn keyword ngxDirective fastcgi_cache_key +syn keyword ngxDirective fastcgi_cache_methods +syn keyword ngxDirective fastcgi_cache_min_uses +syn keyword ngxDirective fastcgi_cache_path +syn keyword ngxDirective fastcgi_cache_use_stale +syn keyword ngxDirective fastcgi_cache_valid +syn keyword ngxDirective fastcgi_catch_stderr +syn keyword ngxDirective fastcgi_connect_timeout +syn keyword ngxDirective fastcgi_hide_header +syn keyword ngxDirective fastcgi_ignore_client_abort +syn keyword ngxDirective fastcgi_ignore_headers +syn keyword ngxDirective fastcgi_index +syn keyword ngxDirective fastcgi_intercept_errors +syn keyword ngxDirective fastcgi_max_temp_file_size +syn keyword ngxDirective fastcgi_next_upstream +syn keyword ngxDirective fastcgi_param +syn keyword ngxDirective fastcgi_pass_header +syn keyword ngxDirective fastcgi_pass_request_body +syn keyword ngxDirective fastcgi_pass_request_headers +syn keyword ngxDirective fastcgi_read_timeout +syn keyword ngxDirective fastcgi_send_lowat +syn keyword ngxDirective fastcgi_send_timeout +syn keyword ngxDirective fastcgi_split_path_info +syn keyword ngxDirective fastcgi_store +syn keyword ngxDirective fastcgi_store_access +syn keyword ngxDirective fastcgi_temp_file_write_size +syn keyword ngxDirective fastcgi_temp_path +syn keyword ngxDirective fastcgi_upstream_fail_timeout +syn keyword ngxDirective fastcgi_upstream_max_fails +syn keyword ngxDirective flv +syn keyword ngxDirective geoip_city +syn keyword ngxDirective geoip_country +syn keyword ngxDirective google_perftools_profiles +syn keyword ngxDirective gzip +syn keyword ngxDirective gzip_buffers +syn keyword ngxDirective gzip_comp_level +syn keyword ngxDirective gzip_disable +syn keyword ngxDirective gzip_hash +syn keyword ngxDirective gzip_http_version +syn keyword ngxDirective gzip_min_length +syn keyword ngxDirective gzip_no_buffer +syn keyword ngxDirective gzip_proxied +syn keyword ngxDirective gzip_static +syn keyword ngxDirective gzip_types +syn keyword ngxDirective gzip_vary +syn keyword ngxDirective gzip_window +syn keyword ngxDirective if_modified_since +syn keyword ngxDirective ignore_invalid_headers +syn keyword ngxDirective image_filter +syn keyword ngxDirective image_filter_buffer +syn keyword ngxDirective image_filter_jpeg_quality +syn keyword ngxDirective image_filter_transparency +syn keyword ngxDirective imap_auth +syn keyword ngxDirective imap_capabilities +syn keyword ngxDirective imap_client_buffer +syn keyword ngxDirective index +syn keyword ngxDirective ip_hash +syn keyword ngxDirective keepalive_requests +syn keyword ngxDirective keepalive_timeout +syn keyword ngxDirective kqueue_changes +syn keyword ngxDirective kqueue_events +syn keyword ngxDirective large_client_header_buffers +syn keyword ngxDirective limit_conn +syn keyword ngxDirective limit_conn_log_level +syn keyword ngxDirective limit_rate +syn keyword ngxDirective limit_rate_after +syn keyword ngxDirective limit_req +syn keyword ngxDirective limit_req_log_level +syn keyword ngxDirective limit_req_zone +syn keyword ngxDirective limit_zone +syn keyword ngxDirective lingering_time +syn keyword ngxDirective lingering_timeout +syn keyword ngxDirective lock_file +syn keyword ngxDirective log_format +syn keyword ngxDirective log_not_found +syn keyword ngxDirective log_subrequest +syn keyword ngxDirective map_hash_bucket_size +syn keyword ngxDirective map_hash_max_size +syn keyword ngxDirective master_process +syn keyword ngxDirective memcached_bind +syn keyword ngxDirective memcached_buffer_size +syn keyword ngxDirective memcached_connect_timeout +syn keyword ngxDirective memcached_next_upstream +syn keyword ngxDirective memcached_read_timeout +syn keyword ngxDirective memcached_send_timeout +syn keyword ngxDirective memcached_upstream_fail_timeout +syn keyword ngxDirective memcached_upstream_max_fails +syn keyword ngxDirective merge_slashes +syn keyword ngxDirective min_delete_depth +syn keyword ngxDirective modern_browser +syn keyword ngxDirective modern_browser_value +syn keyword ngxDirective msie_padding +syn keyword ngxDirective msie_refresh +syn keyword ngxDirective multi_accept +syn keyword ngxDirective open_file_cache +syn keyword ngxDirective open_file_cache_errors +syn keyword ngxDirective open_file_cache_events +syn keyword ngxDirective open_file_cache_min_uses +syn keyword ngxDirective open_file_cache_valid +syn keyword ngxDirective open_log_file_cache +syn keyword ngxDirective output_buffers +syn keyword ngxDirective override_charset +syn keyword ngxDirective perl +syn keyword ngxDirective perl_modules +syn keyword ngxDirective perl_require +syn keyword ngxDirective perl_set +syn keyword ngxDirective pid +syn keyword ngxDirective pop3_auth +syn keyword ngxDirective pop3_capabilities +syn keyword ngxDirective port_in_redirect +syn keyword ngxDirective postpone_gzipping +syn keyword ngxDirective postpone_output +syn keyword ngxDirective protocol +syn keyword ngxDirective proxy +syn keyword ngxDirective proxy_bind +syn keyword ngxDirective proxy_buffer +syn keyword ngxDirective proxy_buffer_size +syn keyword ngxDirective proxy_buffering +syn keyword ngxDirective proxy_buffers +syn keyword ngxDirective proxy_busy_buffers_size +syn keyword ngxDirective proxy_cache +syn keyword ngxDirective proxy_cache_key +syn keyword ngxDirective proxy_cache_methods +syn keyword ngxDirective proxy_cache_min_uses +syn keyword ngxDirective proxy_cache_path +syn keyword ngxDirective proxy_cache_use_stale +syn keyword ngxDirective proxy_cache_valid +syn keyword ngxDirective proxy_connect_timeout +syn keyword ngxDirective proxy_headers_hash_bucket_size +syn keyword ngxDirective proxy_headers_hash_max_size +syn keyword ngxDirective proxy_hide_header +syn keyword ngxDirective proxy_ignore_client_abort +syn keyword ngxDirective proxy_ignore_headers +syn keyword ngxDirective proxy_intercept_errors +syn keyword ngxDirective proxy_max_temp_file_size +syn keyword ngxDirective proxy_method +syn keyword ngxDirective proxy_next_upstream +syn keyword ngxDirective proxy_pass_error_message +syn keyword ngxDirective proxy_pass_header +syn keyword ngxDirective proxy_pass_request_body +syn keyword ngxDirective proxy_pass_request_headers +syn keyword ngxDirective proxy_read_timeout +syn keyword ngxDirective proxy_redirect +syn keyword ngxDirective proxy_send_lowat +syn keyword ngxDirective proxy_send_timeout +syn keyword ngxDirective proxy_set_body +syn keyword ngxDirective proxy_set_header +syn keyword ngxDirective proxy_ssl_session_reuse +syn keyword ngxDirective proxy_store +syn keyword ngxDirective proxy_store_access +syn keyword ngxDirective proxy_temp_file_write_size +syn keyword ngxDirective proxy_temp_path +syn keyword ngxDirective proxy_timeout +syn keyword ngxDirective proxy_upstream_fail_timeout +syn keyword ngxDirective proxy_upstream_max_fails +syn keyword ngxDirective random_index +syn keyword ngxDirective read_ahead +syn keyword ngxDirective real_ip_header +syn keyword ngxDirective recursive_error_pages +syn keyword ngxDirective request_pool_size +syn keyword ngxDirective reset_timedout_connection +syn keyword ngxDirective resolver +syn keyword ngxDirective resolver_timeout +syn keyword ngxDirective rewrite_log +syn keyword ngxDirective rtsig_overflow_events +syn keyword ngxDirective rtsig_overflow_test +syn keyword ngxDirective rtsig_overflow_threshold +syn keyword ngxDirective rtsig_signo +syn keyword ngxDirective satisfy +syn keyword ngxDirective secure_link_secret +syn keyword ngxDirective send_lowat +syn keyword ngxDirective send_timeout +syn keyword ngxDirective sendfile +syn keyword ngxDirective sendfile_max_chunk +syn keyword ngxDirective server_name_in_redirect +syn keyword ngxDirective server_names_hash_bucket_size +syn keyword ngxDirective server_names_hash_max_size +syn keyword ngxDirective server_tokens +syn keyword ngxDirective set_real_ip_from +syn keyword ngxDirective smtp_auth +syn keyword ngxDirective smtp_capabilities +syn keyword ngxDirective smtp_client_buffer +syn keyword ngxDirective smtp_greeting_delay +syn keyword ngxDirective so_keepalive +syn keyword ngxDirective source_charset +syn keyword ngxDirective ssi +syn keyword ngxDirective ssi_ignore_recycled_buffers +syn keyword ngxDirective ssi_min_file_chunk +syn keyword ngxDirective ssi_silent_errors +syn keyword ngxDirective ssi_types +syn keyword ngxDirective ssi_value_length +syn keyword ngxDirective ssl +syn keyword ngxDirective ssl_certificate +syn keyword ngxDirective ssl_certificate_key +syn keyword ngxDirective ssl_ciphers +syn keyword ngxDirective ssl_client_certificate +syn keyword ngxDirective ssl_crl +syn keyword ngxDirective ssl_dhparam +syn keyword ngxDirective ssl_engine +syn keyword ngxDirective ssl_prefer_server_ciphers +syn keyword ngxDirective ssl_protocols +syn keyword ngxDirective ssl_session_cache +syn keyword ngxDirective ssl_session_timeout +syn keyword ngxDirective ssl_verify_client +syn keyword ngxDirective ssl_verify_depth +syn keyword ngxDirective starttls +syn keyword ngxDirective stub_status +syn keyword ngxDirective sub_filter +syn keyword ngxDirective sub_filter_once +syn keyword ngxDirective sub_filter_types +syn keyword ngxDirective tcp_nodelay +syn keyword ngxDirective tcp_nopush +syn keyword ngxDirective thread_stack_size +syn keyword ngxDirective timeout +syn keyword ngxDirective timer_resolution +syn keyword ngxDirective types_hash_bucket_size +syn keyword ngxDirective types_hash_max_size +syn keyword ngxDirective underscores_in_headers +syn keyword ngxDirective uninitialized_variable_warn +syn keyword ngxDirective use +syn keyword ngxDirective user +syn keyword ngxDirective userid +syn keyword ngxDirective userid_domain +syn keyword ngxDirective userid_expires +syn keyword ngxDirective userid_mark +syn keyword ngxDirective userid_name +syn keyword ngxDirective userid_p3p +syn keyword ngxDirective userid_path +syn keyword ngxDirective userid_service +syn keyword ngxDirective valid_referers +syn keyword ngxDirective variables_hash_bucket_size +syn keyword ngxDirective variables_hash_max_size +syn keyword ngxDirective worker_connections +syn keyword ngxDirective worker_cpu_affinity +syn keyword ngxDirective worker_priority +syn keyword ngxDirective worker_processes +syn keyword ngxDirective worker_rlimit_core +syn keyword ngxDirective worker_rlimit_nofile +syn keyword ngxDirective worker_rlimit_sigpending +syn keyword ngxDirective worker_threads +syn keyword ngxDirective working_directory +syn keyword ngxDirective xclient +syn keyword ngxDirective xml_entities +syn keyword ngxDirective xslt_stylesheet +syn keyword ngxDirective xslt_types + +" 3rd party module list: +" http://wiki.nginx.org/Nginx3rdPartyModules + +" Accept Language Module +" Parses the Accept-Language header and gives the most suitable locale from a list of supported locales. +syn keyword ngxDirectiveThirdParty set_from_accept_language + +" Access Key Module +" Denies access unless the request URL contains an access key. +syn keyword ngxDirectiveThirdParty accesskey +syn keyword ngxDirectiveThirdParty accesskey_arg +syn keyword ngxDirectiveThirdParty accesskey_hashmethod +syn keyword ngxDirectiveThirdParty accesskey_signature + +" Auth PAM Module +" HTTP Basic Authentication using PAM. +syn keyword ngxDirectiveThirdParty auth_pam +syn keyword ngxDirectiveThirdParty auth_pam_service_name + +" Cache Purge Module +" Module adding ability to purge content from FastCGI and proxy caches. +syn keyword ngxDirectiveThirdParty fastcgi_cache_purge +syn keyword ngxDirectiveThirdParty proxy_cache_purge + +" Chunkin Module +" HTTP 1.1 chunked-encoding request body support for Nginx. +syn keyword ngxDirectiveThirdParty chunkin +syn keyword ngxDirectiveThirdParty chunkin_keepalive +syn keyword ngxDirectiveThirdParty chunkin_max_chunks_per_buf +syn keyword ngxDirectiveThirdParty chunkin_resume + +" Circle GIF Module +" Generates simple circle images with the colors and size specified in the URL. +syn keyword ngxDirectiveThirdParty circle_gif +syn keyword ngxDirectiveThirdParty circle_gif_max_radius +syn keyword ngxDirectiveThirdParty circle_gif_min_radius +syn keyword ngxDirectiveThirdParty circle_gif_step_radius + +" Drizzle Module +" Make nginx talk directly to mysql, drizzle, and sqlite3 by libdrizzle. +syn keyword ngxDirectiveThirdParty drizzle_connect_timeout +syn keyword ngxDirectiveThirdParty drizzle_dbname +syn keyword ngxDirectiveThirdParty drizzle_keepalive +syn keyword ngxDirectiveThirdParty drizzle_module_header +syn keyword ngxDirectiveThirdParty drizzle_pass +syn keyword ngxDirectiveThirdParty drizzle_query +syn keyword ngxDirectiveThirdParty drizzle_recv_cols_timeout +syn keyword ngxDirectiveThirdParty drizzle_recv_rows_timeout +syn keyword ngxDirectiveThirdParty drizzle_send_query_timeout +syn keyword ngxDirectiveThirdParty drizzle_server + +" Echo Module +" Brings 'echo', 'sleep', 'time', 'exec' and more shell-style goodies to Nginx config file. +syn keyword ngxDirectiveThirdParty echo +syn keyword ngxDirectiveThirdParty echo_after_body +syn keyword ngxDirectiveThirdParty echo_before_body +syn keyword ngxDirectiveThirdParty echo_blocking_sleep +syn keyword ngxDirectiveThirdParty echo_duplicate +syn keyword ngxDirectiveThirdParty echo_end +syn keyword ngxDirectiveThirdParty echo_exec +syn keyword ngxDirectiveThirdParty echo_flush +syn keyword ngxDirectiveThirdParty echo_foreach_split +syn keyword ngxDirectiveThirdParty echo_location +syn keyword ngxDirectiveThirdParty echo_location_async +syn keyword ngxDirectiveThirdParty echo_read_request_body +syn keyword ngxDirectiveThirdParty echo_request_body +syn keyword ngxDirectiveThirdParty echo_reset_timer +syn keyword ngxDirectiveThirdParty echo_sleep +syn keyword ngxDirectiveThirdParty echo_subrequest +syn keyword ngxDirectiveThirdParty echo_subrequest_async + +" Events Module +" Privides options for start/stop events. +syn keyword ngxDirectiveThirdParty on_start +syn keyword ngxDirectiveThirdParty on_stop + +" EY Balancer Module +" Adds a request queue to Nginx that allows the limiting of concurrent requests passed to the upstream. +syn keyword ngxDirectiveThirdParty max_connections +syn keyword ngxDirectiveThirdParty max_connections_max_queue_length +syn keyword ngxDirectiveThirdParty max_connections_queue_timeout + +" Fancy Indexes Module +" Like the built-in autoindex module, but fancier. +syn keyword ngxDirectiveThirdParty fancyindex +syn keyword ngxDirectiveThirdParty fancyindex_exact_size +syn keyword ngxDirectiveThirdParty fancyindex_footer +syn keyword ngxDirectiveThirdParty fancyindex_header +syn keyword ngxDirectiveThirdParty fancyindex_localtime +syn keyword ngxDirectiveThirdParty fancyindex_readme +syn keyword ngxDirectiveThirdParty fancyindex_readme_mode + +" GeoIP Module (DEPRECATED) +" Country code lookups via the MaxMind GeoIP API. +syn keyword ngxDirectiveThirdParty geoip_country_file + +" Headers More Module +" Set and clear input and output headers...more than "add"! +syn keyword ngxDirectiveThirdParty more_clear_headers +syn keyword ngxDirectiveThirdParty more_clear_input_headers +syn keyword ngxDirectiveThirdParty more_set_headers +syn keyword ngxDirectiveThirdParty more_set_input_headers + +" HTTP Push Module +" Turn Nginx into an adept long-polling HTTP Push (Comet) server. +syn keyword ngxDirectiveThirdParty push_buffer_size +syn keyword ngxDirectiveThirdParty push_listener +syn keyword ngxDirectiveThirdParty push_message_timeout +syn keyword ngxDirectiveThirdParty push_queue_messages +syn keyword ngxDirectiveThirdParty push_sender + +" HTTP Redis Module > +" Redis support.> +syn keyword ngxDirectiveThirdParty redis_bind +syn keyword ngxDirectiveThirdParty redis_buffer_size +syn keyword ngxDirectiveThirdParty redis_connect_timeout +syn keyword ngxDirectiveThirdParty redis_next_upstream +syn keyword ngxDirectiveThirdParty redis_pass +syn keyword ngxDirectiveThirdParty redis_read_timeout +syn keyword ngxDirectiveThirdParty redis_send_timeout + +" HTTP JavaScript Module +" Embedding SpiderMonkey. Nearly full port on Perl module. +syn keyword ngxDirectiveThirdParty js +syn keyword ngxDirectiveThirdParty js_filter +syn keyword ngxDirectiveThirdParty js_filter_types +syn keyword ngxDirectiveThirdParty js_load +syn keyword ngxDirectiveThirdParty js_maxmem +syn keyword ngxDirectiveThirdParty js_require +syn keyword ngxDirectiveThirdParty js_set +syn keyword ngxDirectiveThirdParty js_utf8 + +" Log Request Speed +" Log the time it took to process each request. +syn keyword ngxDirectiveThirdParty log_request_speed_filter +syn keyword ngxDirectiveThirdParty log_request_speed_filter_timeout + +" Memc Module +" An extended version of the standard memcached module that supports set, add, delete, and many more memcached commands. +syn keyword ngxDirectiveThirdParty memc_buffer_size +syn keyword ngxDirectiveThirdParty memc_cmds_allowed +syn keyword ngxDirectiveThirdParty memc_connect_timeout +syn keyword ngxDirectiveThirdParty memc_flags_to_last_modified +syn keyword ngxDirectiveThirdParty memc_next_upstream +syn keyword ngxDirectiveThirdParty memc_pass +syn keyword ngxDirectiveThirdParty memc_read_timeout +syn keyword ngxDirectiveThirdParty memc_send_timeout +syn keyword ngxDirectiveThirdParty memc_upstream_fail_timeout +syn keyword ngxDirectiveThirdParty memc_upstream_max_fails + +" Mogilefs Module +" Implements a MogileFS client, provides a replace to the Perlbal reverse proxy of the original MogileFS. +syn keyword ngxDirectiveThirdParty mogilefs_connect_timeout +syn keyword ngxDirectiveThirdParty mogilefs_domain +syn keyword ngxDirectiveThirdParty mogilefs_methods +syn keyword ngxDirectiveThirdParty mogilefs_noverify +syn keyword ngxDirectiveThirdParty mogilefs_pass +syn keyword ngxDirectiveThirdParty mogilefs_read_timeout +syn keyword ngxDirectiveThirdParty mogilefs_send_timeout +syn keyword ngxDirectiveThirdParty mogilefs_tracker + +" MP4 Streaming Lite Module +" Will seek to a certain time within H.264/MP4 files when provided with a 'start' parameter in the URL. +syn keyword ngxDirectiveThirdParty mp4 + +" Nginx Notice Module +" Serve static file to POST requests. +syn keyword ngxDirectiveThirdParty notice +syn keyword ngxDirectiveThirdParty notice_type + +" Phusion Passenger +" Easy and robust deployment of Ruby on Rails application on Apache and Nginx webservers. +syn keyword ngxDirectiveThirdParty passenger_base_uri +syn keyword ngxDirectiveThirdParty passenger_default_user +syn keyword ngxDirectiveThirdParty passenger_enabled +syn keyword ngxDirectiveThirdParty passenger_log_level +syn keyword ngxDirectiveThirdParty passenger_max_instances_per_app +syn keyword ngxDirectiveThirdParty passenger_max_pool_size +syn keyword ngxDirectiveThirdParty passenger_pool_idle_time +syn keyword ngxDirectiveThirdParty passenger_root +syn keyword ngxDirectiveThirdParty passenger_ruby +syn keyword ngxDirectiveThirdParty passenger_use_global_queue +syn keyword ngxDirectiveThirdParty passenger_user_switching +syn keyword ngxDirectiveThirdParty rack_env +syn keyword ngxDirectiveThirdParty rails_app_spawner_idle_time +syn keyword ngxDirectiveThirdParty rails_env +syn keyword ngxDirectiveThirdParty rails_framework_spawner_idle_time +syn keyword ngxDirectiveThirdParty rails_spawn_method + +" RDS JSON Module +" Help ngx_drizzle and other DBD modules emit JSON data. +syn keyword ngxDirectiveThirdParty rds_json +syn keyword ngxDirectiveThirdParty rds_json_content_type +syn keyword ngxDirectiveThirdParty rds_json_format +syn keyword ngxDirectiveThirdParty rds_json_ret + +" RRD Graph Module +" This module provides an HTTP interface to RRDtool's graphing facilities. +syn keyword ngxDirectiveThirdParty rrd_graph +syn keyword ngxDirectiveThirdParty rrd_graph_root + +" Secure Download +" Create expiring links. +syn keyword ngxDirectiveThirdParty secure_download +syn keyword ngxDirectiveThirdParty secure_download_fail_location +syn keyword ngxDirectiveThirdParty secure_download_path_mode +syn keyword ngxDirectiveThirdParty secure_download_secret + +" SlowFS Cache Module +" Module adding ability to cache static files. +syn keyword ngxDirectiveThirdParty slowfs_big_file_size +syn keyword ngxDirectiveThirdParty slowfs_cache +syn keyword ngxDirectiveThirdParty slowfs_cache_key +syn keyword ngxDirectiveThirdParty slowfs_cache_min_uses +syn keyword ngxDirectiveThirdParty slowfs_cache_path +syn keyword ngxDirectiveThirdParty slowfs_cache_purge +syn keyword ngxDirectiveThirdParty slowfs_cache_valid +syn keyword ngxDirectiveThirdParty slowfs_temp_path + +" Strip Module +" Whitespace remover. +syn keyword ngxDirectiveThirdParty strip + +" Substitutions Module +" A filter module which can do both regular expression and fixed string substitutions on response bodies. +syn keyword ngxDirectiveThirdParty subs_filter +syn keyword ngxDirectiveThirdParty subs_filter_types + +" Supervisord Module +" Module providing nginx with API to communicate with supervisord and manage (start/stop) backends on-demand. +syn keyword ngxDirectiveThirdParty supervisord +syn keyword ngxDirectiveThirdParty supervisord_inherit_backend_status +syn keyword ngxDirectiveThirdParty supervisord_name +syn keyword ngxDirectiveThirdParty supervisord_start +syn keyword ngxDirectiveThirdParty supervisord_stop + +" Upload Module +" Parses multipart/form-data allowing arbitrary handling of uploaded files. +syn keyword ngxDirectiveThirdParty upload_aggregate_form_field +syn keyword ngxDirectiveThirdParty upload_buffer_size +syn keyword ngxDirectiveThirdParty upload_cleanup +syn keyword ngxDirectiveThirdParty upload_limit_rate +syn keyword ngxDirectiveThirdParty upload_max_file_size +syn keyword ngxDirectiveThirdParty upload_max_output_body_len +syn keyword ngxDirectiveThirdParty upload_max_part_header_len +syn keyword ngxDirectiveThirdParty upload_pass +syn keyword ngxDirectiveThirdParty upload_pass_args +syn keyword ngxDirectiveThirdParty upload_pass_form_field +syn keyword ngxDirectiveThirdParty upload_set_form_field +syn keyword ngxDirectiveThirdParty upload_store +syn keyword ngxDirectiveThirdParty upload_store_access + +" Upload Progress Module +" Tracks and reports upload progress. +syn keyword ngxDirectiveThirdParty report_uploads +syn keyword ngxDirectiveThirdParty track_uploads +syn keyword ngxDirectiveThirdParty upload_progress +syn keyword ngxDirectiveThirdParty upload_progress_content_type +syn keyword ngxDirectiveThirdParty upload_progress_header +syn keyword ngxDirectiveThirdParty upload_progress_json_output +syn keyword ngxDirectiveThirdParty upload_progress_template + +" Upstream Fair Balancer +" Sends an incoming request to the least-busy backend server, rather than distributing requests round-robin. +syn keyword ngxDirectiveThirdParty fair +syn keyword ngxDirectiveThirdParty upstream_fair_shm_size + +" Upstream Consistent Hash +" Select backend based on Consistent hash ring. +syn keyword ngxDirectiveThirdParty consistent_hash + +" Upstream Hash Module +" Provides simple upstream load distribution by hashing a configurable variable. +syn keyword ngxDirectiveThirdParty hash +syn keyword ngxDirectiveThirdParty hash_again + +" XSS Module +" Native support for cross-site scripting (XSS) in an nginx. +syn keyword ngxDirectiveThirdParty xss_callback_arg +syn keyword ngxDirectiveThirdParty xss_get +syn keyword ngxDirectiveThirdParty xss_input_types +syn keyword ngxDirectiveThirdParty xss_output_type + +" highlight + +hi link ngxComment Comment +hi link ngxVariable Identifier +hi link ngxVariableBlock Identifier +hi link ngxVariableString PreProc +hi link ngxBlock Normal +hi link ngxString String + +hi link ngxBoolean Boolean +hi link ngxDirectiveBlock Statement +hi link ngxDirectiveImportant Type +hi link ngxDirectiveControl Keyword +hi link ngxDirectiveError Constant +hi link ngxDirectiveDeprecated Error +hi link ngxDirective Identifier +hi link ngxDirectiveThirdParty Special + +let b:current_syntax = "nginx" diff --git a/sources_non_forked/nginx.vim/README b/sources_non_forked/nginx.vim/README new file mode 100644 index 00000000..91ceb224 --- /dev/null +++ b/sources_non_forked/nginx.vim/README @@ -0,0 +1,3 @@ +This is a mirror of http://www.vim.org/scripts/script.php?script_id=1886 + +nginx.vim highlights configuration files for nginx, the high-performance web server (see http://nginx.net). diff --git a/sources_non_forked/nginx.vim/syntax/nginx.vim b/sources_non_forked/nginx.vim/syntax/nginx.vim new file mode 100644 index 00000000..ccd47680 --- /dev/null +++ b/sources_non_forked/nginx.vim/syntax/nginx.vim @@ -0,0 +1,664 @@ +" Vim syntax file +" Language: nginx.conf + +if exists("b:current_syntax") + finish +end + +setlocal iskeyword+=. +setlocal iskeyword+=/ +setlocal iskeyword+=: + +syn match ngxVariable '\$\w\w*' +syn match ngxVariableBlock '\$\w\w*' contained +syn match ngxVariableString '\$\w\w*' contained +syn region ngxBlock start=+^+ end=+{+ contains=ngxComment,ngxDirectiveBlock,ngxVariableBlock,ngxString oneline +syn region ngxString start=+"+ end=+"+ skip=+\\\\\|\\"+ contains=ngxVariableString oneline +syn region ngxString start=+'+ end=+'+ skip=+\\\\\|\\'+ contains=ngxVariableString oneline +syn match ngxComment ' *#.*$' + +syn keyword ngxBoolean on +syn keyword ngxBoolean off + +syn keyword ngxDirectiveBlock http contained +syn keyword ngxDirectiveBlock mail contained +syn keyword ngxDirectiveBlock events contained +syn keyword ngxDirectiveBlock server contained +syn keyword ngxDirectiveBlock types contained +syn keyword ngxDirectiveBlock location contained +syn keyword ngxDirectiveBlock upstream contained +syn keyword ngxDirectiveBlock charset_map contained +syn keyword ngxDirectiveBlock limit_except contained +syn keyword ngxDirectiveBlock if contained +syn keyword ngxDirectiveBlock geo contained +syn keyword ngxDirectiveBlock map contained + +syn keyword ngxDirectiveImportant include +syn keyword ngxDirectiveImportant root +syn keyword ngxDirectiveImportant server +syn keyword ngxDirectiveImportant server_name +syn keyword ngxDirectiveImportant listen +syn keyword ngxDirectiveImportant internal +syn keyword ngxDirectiveImportant proxy_pass +syn keyword ngxDirectiveImportant memcached_pass +syn keyword ngxDirectiveImportant fastcgi_pass +syn keyword ngxDirectiveImportant try_files + +syn keyword ngxDirectiveControl break +syn keyword ngxDirectiveControl return +syn keyword ngxDirectiveControl rewrite +syn keyword ngxDirectiveControl set + +syn keyword ngxDirectiveError error_page +syn keyword ngxDirectiveError post_action + +syn keyword ngxDirectiveDeprecated connections +syn keyword ngxDirectiveDeprecated imap +syn keyword ngxDirectiveDeprecated open_file_cache_retest +syn keyword ngxDirectiveDeprecated optimize_server_names +syn keyword ngxDirectiveDeprecated satisfy_any + +syn keyword ngxDirective accept_mutex +syn keyword ngxDirective accept_mutex_delay +syn keyword ngxDirective access_log +syn keyword ngxDirective add_after_body +syn keyword ngxDirective add_before_body +syn keyword ngxDirective add_header +syn keyword ngxDirective addition_types +syn keyword ngxDirective aio +syn keyword ngxDirective alias +syn keyword ngxDirective allow +syn keyword ngxDirective ancient_browser +syn keyword ngxDirective ancient_browser_value +syn keyword ngxDirective auth_basic +syn keyword ngxDirective auth_basic_user_file +syn keyword ngxDirective auth_http +syn keyword ngxDirective auth_http_header +syn keyword ngxDirective auth_http_timeout +syn keyword ngxDirective autoindex +syn keyword ngxDirective autoindex_exact_size +syn keyword ngxDirective autoindex_localtime +syn keyword ngxDirective charset +syn keyword ngxDirective charset_types +syn keyword ngxDirective client_body_buffer_size +syn keyword ngxDirective client_body_in_file_only +syn keyword ngxDirective client_body_in_single_buffer +syn keyword ngxDirective client_body_temp_path +syn keyword ngxDirective client_body_timeout +syn keyword ngxDirective client_header_buffer_size +syn keyword ngxDirective client_header_timeout +syn keyword ngxDirective client_max_body_size +syn keyword ngxDirective connection_pool_size +syn keyword ngxDirective create_full_put_path +syn keyword ngxDirective daemon +syn keyword ngxDirective dav_access +syn keyword ngxDirective dav_methods +syn keyword ngxDirective debug_connection +syn keyword ngxDirective debug_points +syn keyword ngxDirective default_type +syn keyword ngxDirective degradation +syn keyword ngxDirective degrade +syn keyword ngxDirective deny +syn keyword ngxDirective devpoll_changes +syn keyword ngxDirective devpoll_events +syn keyword ngxDirective directio +syn keyword ngxDirective directio_alignment +syn keyword ngxDirective empty_gif +syn keyword ngxDirective env +syn keyword ngxDirective epoll_events +syn keyword ngxDirective error_log +syn keyword ngxDirective eventport_events +syn keyword ngxDirective expires +syn keyword ngxDirective fastcgi_bind +syn keyword ngxDirective fastcgi_buffer_size +syn keyword ngxDirective fastcgi_buffers +syn keyword ngxDirective fastcgi_busy_buffers_size +syn keyword ngxDirective fastcgi_cache +syn keyword ngxDirective fastcgi_cache_key +syn keyword ngxDirective fastcgi_cache_methods +syn keyword ngxDirective fastcgi_cache_min_uses +syn keyword ngxDirective fastcgi_cache_path +syn keyword ngxDirective fastcgi_cache_use_stale +syn keyword ngxDirective fastcgi_cache_valid +syn keyword ngxDirective fastcgi_catch_stderr +syn keyword ngxDirective fastcgi_connect_timeout +syn keyword ngxDirective fastcgi_hide_header +syn keyword ngxDirective fastcgi_ignore_client_abort +syn keyword ngxDirective fastcgi_ignore_headers +syn keyword ngxDirective fastcgi_index +syn keyword ngxDirective fastcgi_intercept_errors +syn keyword ngxDirective fastcgi_max_temp_file_size +syn keyword ngxDirective fastcgi_next_upstream +syn keyword ngxDirective fastcgi_param +syn keyword ngxDirective fastcgi_pass_header +syn keyword ngxDirective fastcgi_pass_request_body +syn keyword ngxDirective fastcgi_pass_request_headers +syn keyword ngxDirective fastcgi_read_timeout +syn keyword ngxDirective fastcgi_send_lowat +syn keyword ngxDirective fastcgi_send_timeout +syn keyword ngxDirective fastcgi_split_path_info +syn keyword ngxDirective fastcgi_store +syn keyword ngxDirective fastcgi_store_access +syn keyword ngxDirective fastcgi_temp_file_write_size +syn keyword ngxDirective fastcgi_temp_path +syn keyword ngxDirective fastcgi_upstream_fail_timeout +syn keyword ngxDirective fastcgi_upstream_max_fails +syn keyword ngxDirective flv +syn keyword ngxDirective geoip_city +syn keyword ngxDirective geoip_country +syn keyword ngxDirective google_perftools_profiles +syn keyword ngxDirective gzip +syn keyword ngxDirective gzip_buffers +syn keyword ngxDirective gzip_comp_level +syn keyword ngxDirective gzip_disable +syn keyword ngxDirective gzip_hash +syn keyword ngxDirective gzip_http_version +syn keyword ngxDirective gzip_min_length +syn keyword ngxDirective gzip_no_buffer +syn keyword ngxDirective gzip_proxied +syn keyword ngxDirective gzip_static +syn keyword ngxDirective gzip_types +syn keyword ngxDirective gzip_vary +syn keyword ngxDirective gzip_window +syn keyword ngxDirective if_modified_since +syn keyword ngxDirective ignore_invalid_headers +syn keyword ngxDirective image_filter +syn keyword ngxDirective image_filter_buffer +syn keyword ngxDirective image_filter_jpeg_quality +syn keyword ngxDirective image_filter_transparency +syn keyword ngxDirective imap_auth +syn keyword ngxDirective imap_capabilities +syn keyword ngxDirective imap_client_buffer +syn keyword ngxDirective index +syn keyword ngxDirective ip_hash +syn keyword ngxDirective keepalive_requests +syn keyword ngxDirective keepalive_timeout +syn keyword ngxDirective kqueue_changes +syn keyword ngxDirective kqueue_events +syn keyword ngxDirective large_client_header_buffers +syn keyword ngxDirective limit_conn +syn keyword ngxDirective limit_conn_log_level +syn keyword ngxDirective limit_rate +syn keyword ngxDirective limit_rate_after +syn keyword ngxDirective limit_req +syn keyword ngxDirective limit_req_log_level +syn keyword ngxDirective limit_req_zone +syn keyword ngxDirective limit_zone +syn keyword ngxDirective lingering_time +syn keyword ngxDirective lingering_timeout +syn keyword ngxDirective lock_file +syn keyword ngxDirective log_format +syn keyword ngxDirective log_not_found +syn keyword ngxDirective log_subrequest +syn keyword ngxDirective map_hash_bucket_size +syn keyword ngxDirective map_hash_max_size +syn keyword ngxDirective master_process +syn keyword ngxDirective memcached_bind +syn keyword ngxDirective memcached_buffer_size +syn keyword ngxDirective memcached_connect_timeout +syn keyword ngxDirective memcached_next_upstream +syn keyword ngxDirective memcached_read_timeout +syn keyword ngxDirective memcached_send_timeout +syn keyword ngxDirective memcached_upstream_fail_timeout +syn keyword ngxDirective memcached_upstream_max_fails +syn keyword ngxDirective merge_slashes +syn keyword ngxDirective min_delete_depth +syn keyword ngxDirective modern_browser +syn keyword ngxDirective modern_browser_value +syn keyword ngxDirective msie_padding +syn keyword ngxDirective msie_refresh +syn keyword ngxDirective multi_accept +syn keyword ngxDirective open_file_cache +syn keyword ngxDirective open_file_cache_errors +syn keyword ngxDirective open_file_cache_events +syn keyword ngxDirective open_file_cache_min_uses +syn keyword ngxDirective open_file_cache_valid +syn keyword ngxDirective open_log_file_cache +syn keyword ngxDirective output_buffers +syn keyword ngxDirective override_charset +syn keyword ngxDirective perl +syn keyword ngxDirective perl_modules +syn keyword ngxDirective perl_require +syn keyword ngxDirective perl_set +syn keyword ngxDirective pid +syn keyword ngxDirective pop3_auth +syn keyword ngxDirective pop3_capabilities +syn keyword ngxDirective port_in_redirect +syn keyword ngxDirective postpone_gzipping +syn keyword ngxDirective postpone_output +syn keyword ngxDirective protocol +syn keyword ngxDirective proxy +syn keyword ngxDirective proxy_bind +syn keyword ngxDirective proxy_buffer +syn keyword ngxDirective proxy_buffer_size +syn keyword ngxDirective proxy_buffering +syn keyword ngxDirective proxy_buffers +syn keyword ngxDirective proxy_busy_buffers_size +syn keyword ngxDirective proxy_cache +syn keyword ngxDirective proxy_cache_key +syn keyword ngxDirective proxy_cache_methods +syn keyword ngxDirective proxy_cache_min_uses +syn keyword ngxDirective proxy_cache_path +syn keyword ngxDirective proxy_cache_use_stale +syn keyword ngxDirective proxy_cache_valid +syn keyword ngxDirective proxy_connect_timeout +syn keyword ngxDirective proxy_headers_hash_bucket_size +syn keyword ngxDirective proxy_headers_hash_max_size +syn keyword ngxDirective proxy_hide_header +syn keyword ngxDirective proxy_ignore_client_abort +syn keyword ngxDirective proxy_ignore_headers +syn keyword ngxDirective proxy_intercept_errors +syn keyword ngxDirective proxy_max_temp_file_size +syn keyword ngxDirective proxy_method +syn keyword ngxDirective proxy_next_upstream +syn keyword ngxDirective proxy_pass_error_message +syn keyword ngxDirective proxy_pass_header +syn keyword ngxDirective proxy_pass_request_body +syn keyword ngxDirective proxy_pass_request_headers +syn keyword ngxDirective proxy_read_timeout +syn keyword ngxDirective proxy_redirect +syn keyword ngxDirective proxy_send_lowat +syn keyword ngxDirective proxy_send_timeout +syn keyword ngxDirective proxy_set_body +syn keyword ngxDirective proxy_set_header +syn keyword ngxDirective proxy_ssl_session_reuse +syn keyword ngxDirective proxy_store +syn keyword ngxDirective proxy_store_access +syn keyword ngxDirective proxy_temp_file_write_size +syn keyword ngxDirective proxy_temp_path +syn keyword ngxDirective proxy_timeout +syn keyword ngxDirective proxy_upstream_fail_timeout +syn keyword ngxDirective proxy_upstream_max_fails +syn keyword ngxDirective random_index +syn keyword ngxDirective read_ahead +syn keyword ngxDirective real_ip_header +syn keyword ngxDirective recursive_error_pages +syn keyword ngxDirective request_pool_size +syn keyword ngxDirective reset_timedout_connection +syn keyword ngxDirective resolver +syn keyword ngxDirective resolver_timeout +syn keyword ngxDirective rewrite_log +syn keyword ngxDirective rtsig_overflow_events +syn keyword ngxDirective rtsig_overflow_test +syn keyword ngxDirective rtsig_overflow_threshold +syn keyword ngxDirective rtsig_signo +syn keyword ngxDirective satisfy +syn keyword ngxDirective secure_link_secret +syn keyword ngxDirective send_lowat +syn keyword ngxDirective send_timeout +syn keyword ngxDirective sendfile +syn keyword ngxDirective sendfile_max_chunk +syn keyword ngxDirective server_name_in_redirect +syn keyword ngxDirective server_names_hash_bucket_size +syn keyword ngxDirective server_names_hash_max_size +syn keyword ngxDirective server_tokens +syn keyword ngxDirective set_real_ip_from +syn keyword ngxDirective smtp_auth +syn keyword ngxDirective smtp_capabilities +syn keyword ngxDirective smtp_client_buffer +syn keyword ngxDirective smtp_greeting_delay +syn keyword ngxDirective so_keepalive +syn keyword ngxDirective source_charset +syn keyword ngxDirective ssi +syn keyword ngxDirective ssi_ignore_recycled_buffers +syn keyword ngxDirective ssi_min_file_chunk +syn keyword ngxDirective ssi_silent_errors +syn keyword ngxDirective ssi_types +syn keyword ngxDirective ssi_value_length +syn keyword ngxDirective ssl +syn keyword ngxDirective ssl_certificate +syn keyword ngxDirective ssl_certificate_key +syn keyword ngxDirective ssl_ciphers +syn keyword ngxDirective ssl_client_certificate +syn keyword ngxDirective ssl_crl +syn keyword ngxDirective ssl_dhparam +syn keyword ngxDirective ssl_engine +syn keyword ngxDirective ssl_prefer_server_ciphers +syn keyword ngxDirective ssl_protocols +syn keyword ngxDirective ssl_session_cache +syn keyword ngxDirective ssl_session_timeout +syn keyword ngxDirective ssl_verify_client +syn keyword ngxDirective ssl_verify_depth +syn keyword ngxDirective starttls +syn keyword ngxDirective stub_status +syn keyword ngxDirective sub_filter +syn keyword ngxDirective sub_filter_once +syn keyword ngxDirective sub_filter_types +syn keyword ngxDirective tcp_nodelay +syn keyword ngxDirective tcp_nopush +syn keyword ngxDirective thread_stack_size +syn keyword ngxDirective timeout +syn keyword ngxDirective timer_resolution +syn keyword ngxDirective types_hash_bucket_size +syn keyword ngxDirective types_hash_max_size +syn keyword ngxDirective underscores_in_headers +syn keyword ngxDirective uninitialized_variable_warn +syn keyword ngxDirective use +syn keyword ngxDirective user +syn keyword ngxDirective userid +syn keyword ngxDirective userid_domain +syn keyword ngxDirective userid_expires +syn keyword ngxDirective userid_mark +syn keyword ngxDirective userid_name +syn keyword ngxDirective userid_p3p +syn keyword ngxDirective userid_path +syn keyword ngxDirective userid_service +syn keyword ngxDirective valid_referers +syn keyword ngxDirective variables_hash_bucket_size +syn keyword ngxDirective variables_hash_max_size +syn keyword ngxDirective worker_connections +syn keyword ngxDirective worker_cpu_affinity +syn keyword ngxDirective worker_priority +syn keyword ngxDirective worker_processes +syn keyword ngxDirective worker_rlimit_core +syn keyword ngxDirective worker_rlimit_nofile +syn keyword ngxDirective worker_rlimit_sigpending +syn keyword ngxDirective worker_threads +syn keyword ngxDirective working_directory +syn keyword ngxDirective xclient +syn keyword ngxDirective xml_entities +syn keyword ngxDirective xslt_stylesheet +syn keyword ngxDirective xslt_types + +" 3rd party module list: +" http://wiki.nginx.org/Nginx3rdPartyModules + +" Accept Language Module +" Parses the Accept-Language header and gives the most suitable locale from a list of supported locales. +syn keyword ngxDirectiveThirdParty set_from_accept_language + +" Access Key Module +" Denies access unless the request URL contains an access key. +syn keyword ngxDirectiveThirdParty accesskey +syn keyword ngxDirectiveThirdParty accesskey_arg +syn keyword ngxDirectiveThirdParty accesskey_hashmethod +syn keyword ngxDirectiveThirdParty accesskey_signature + +" Auth PAM Module +" HTTP Basic Authentication using PAM. +syn keyword ngxDirectiveThirdParty auth_pam +syn keyword ngxDirectiveThirdParty auth_pam_service_name + +" Cache Purge Module +" Module adding ability to purge content from FastCGI and proxy caches. +syn keyword ngxDirectiveThirdParty fastcgi_cache_purge +syn keyword ngxDirectiveThirdParty proxy_cache_purge + +" Chunkin Module +" HTTP 1.1 chunked-encoding request body support for Nginx. +syn keyword ngxDirectiveThirdParty chunkin +syn keyword ngxDirectiveThirdParty chunkin_keepalive +syn keyword ngxDirectiveThirdParty chunkin_max_chunks_per_buf +syn keyword ngxDirectiveThirdParty chunkin_resume + +" Circle GIF Module +" Generates simple circle images with the colors and size specified in the URL. +syn keyword ngxDirectiveThirdParty circle_gif +syn keyword ngxDirectiveThirdParty circle_gif_max_radius +syn keyword ngxDirectiveThirdParty circle_gif_min_radius +syn keyword ngxDirectiveThirdParty circle_gif_step_radius + +" Drizzle Module +" Make nginx talk directly to mysql, drizzle, and sqlite3 by libdrizzle. +syn keyword ngxDirectiveThirdParty drizzle_connect_timeout +syn keyword ngxDirectiveThirdParty drizzle_dbname +syn keyword ngxDirectiveThirdParty drizzle_keepalive +syn keyword ngxDirectiveThirdParty drizzle_module_header +syn keyword ngxDirectiveThirdParty drizzle_pass +syn keyword ngxDirectiveThirdParty drizzle_query +syn keyword ngxDirectiveThirdParty drizzle_recv_cols_timeout +syn keyword ngxDirectiveThirdParty drizzle_recv_rows_timeout +syn keyword ngxDirectiveThirdParty drizzle_send_query_timeout +syn keyword ngxDirectiveThirdParty drizzle_server + +" Echo Module +" Brings 'echo', 'sleep', 'time', 'exec' and more shell-style goodies to Nginx config file. +syn keyword ngxDirectiveThirdParty echo +syn keyword ngxDirectiveThirdParty echo_after_body +syn keyword ngxDirectiveThirdParty echo_before_body +syn keyword ngxDirectiveThirdParty echo_blocking_sleep +syn keyword ngxDirectiveThirdParty echo_duplicate +syn keyword ngxDirectiveThirdParty echo_end +syn keyword ngxDirectiveThirdParty echo_exec +syn keyword ngxDirectiveThirdParty echo_flush +syn keyword ngxDirectiveThirdParty echo_foreach_split +syn keyword ngxDirectiveThirdParty echo_location +syn keyword ngxDirectiveThirdParty echo_location_async +syn keyword ngxDirectiveThirdParty echo_read_request_body +syn keyword ngxDirectiveThirdParty echo_request_body +syn keyword ngxDirectiveThirdParty echo_reset_timer +syn keyword ngxDirectiveThirdParty echo_sleep +syn keyword ngxDirectiveThirdParty echo_subrequest +syn keyword ngxDirectiveThirdParty echo_subrequest_async + +" Events Module +" Privides options for start/stop events. +syn keyword ngxDirectiveThirdParty on_start +syn keyword ngxDirectiveThirdParty on_stop + +" EY Balancer Module +" Adds a request queue to Nginx that allows the limiting of concurrent requests passed to the upstream. +syn keyword ngxDirectiveThirdParty max_connections +syn keyword ngxDirectiveThirdParty max_connections_max_queue_length +syn keyword ngxDirectiveThirdParty max_connections_queue_timeout + +" Fancy Indexes Module +" Like the built-in autoindex module, but fancier. +syn keyword ngxDirectiveThirdParty fancyindex +syn keyword ngxDirectiveThirdParty fancyindex_exact_size +syn keyword ngxDirectiveThirdParty fancyindex_footer +syn keyword ngxDirectiveThirdParty fancyindex_header +syn keyword ngxDirectiveThirdParty fancyindex_localtime +syn keyword ngxDirectiveThirdParty fancyindex_readme +syn keyword ngxDirectiveThirdParty fancyindex_readme_mode + +" GeoIP Module (DEPRECATED) +" Country code lookups via the MaxMind GeoIP API. +syn keyword ngxDirectiveThirdParty geoip_country_file + +" Headers More Module +" Set and clear input and output headers...more than "add"! +syn keyword ngxDirectiveThirdParty more_clear_headers +syn keyword ngxDirectiveThirdParty more_clear_input_headers +syn keyword ngxDirectiveThirdParty more_set_headers +syn keyword ngxDirectiveThirdParty more_set_input_headers + +" HTTP Push Module +" Turn Nginx into an adept long-polling HTTP Push (Comet) server. +syn keyword ngxDirectiveThirdParty push_buffer_size +syn keyword ngxDirectiveThirdParty push_listener +syn keyword ngxDirectiveThirdParty push_message_timeout +syn keyword ngxDirectiveThirdParty push_queue_messages +syn keyword ngxDirectiveThirdParty push_sender + +" HTTP Redis Module > +" Redis support.> +syn keyword ngxDirectiveThirdParty redis_bind +syn keyword ngxDirectiveThirdParty redis_buffer_size +syn keyword ngxDirectiveThirdParty redis_connect_timeout +syn keyword ngxDirectiveThirdParty redis_next_upstream +syn keyword ngxDirectiveThirdParty redis_pass +syn keyword ngxDirectiveThirdParty redis_read_timeout +syn keyword ngxDirectiveThirdParty redis_send_timeout + +" HTTP JavaScript Module +" Embedding SpiderMonkey. Nearly full port on Perl module. +syn keyword ngxDirectiveThirdParty js +syn keyword ngxDirectiveThirdParty js_filter +syn keyword ngxDirectiveThirdParty js_filter_types +syn keyword ngxDirectiveThirdParty js_load +syn keyword ngxDirectiveThirdParty js_maxmem +syn keyword ngxDirectiveThirdParty js_require +syn keyword ngxDirectiveThirdParty js_set +syn keyword ngxDirectiveThirdParty js_utf8 + +" Log Request Speed +" Log the time it took to process each request. +syn keyword ngxDirectiveThirdParty log_request_speed_filter +syn keyword ngxDirectiveThirdParty log_request_speed_filter_timeout + +" Memc Module +" An extended version of the standard memcached module that supports set, add, delete, and many more memcached commands. +syn keyword ngxDirectiveThirdParty memc_buffer_size +syn keyword ngxDirectiveThirdParty memc_cmds_allowed +syn keyword ngxDirectiveThirdParty memc_connect_timeout +syn keyword ngxDirectiveThirdParty memc_flags_to_last_modified +syn keyword ngxDirectiveThirdParty memc_next_upstream +syn keyword ngxDirectiveThirdParty memc_pass +syn keyword ngxDirectiveThirdParty memc_read_timeout +syn keyword ngxDirectiveThirdParty memc_send_timeout +syn keyword ngxDirectiveThirdParty memc_upstream_fail_timeout +syn keyword ngxDirectiveThirdParty memc_upstream_max_fails + +" Mogilefs Module +" Implements a MogileFS client, provides a replace to the Perlbal reverse proxy of the original MogileFS. +syn keyword ngxDirectiveThirdParty mogilefs_connect_timeout +syn keyword ngxDirectiveThirdParty mogilefs_domain +syn keyword ngxDirectiveThirdParty mogilefs_methods +syn keyword ngxDirectiveThirdParty mogilefs_noverify +syn keyword ngxDirectiveThirdParty mogilefs_pass +syn keyword ngxDirectiveThirdParty mogilefs_read_timeout +syn keyword ngxDirectiveThirdParty mogilefs_send_timeout +syn keyword ngxDirectiveThirdParty mogilefs_tracker + +" MP4 Streaming Lite Module +" Will seek to a certain time within H.264/MP4 files when provided with a 'start' parameter in the URL. +syn keyword ngxDirectiveThirdParty mp4 + +" Nginx Notice Module +" Serve static file to POST requests. +syn keyword ngxDirectiveThirdParty notice +syn keyword ngxDirectiveThirdParty notice_type + +" Phusion Passenger +" Easy and robust deployment of Ruby on Rails application on Apache and Nginx webservers. +syn keyword ngxDirectiveThirdParty passenger_base_uri +syn keyword ngxDirectiveThirdParty passenger_default_user +syn keyword ngxDirectiveThirdParty passenger_enabled +syn keyword ngxDirectiveThirdParty passenger_log_level +syn keyword ngxDirectiveThirdParty passenger_max_instances_per_app +syn keyword ngxDirectiveThirdParty passenger_max_pool_size +syn keyword ngxDirectiveThirdParty passenger_pool_idle_time +syn keyword ngxDirectiveThirdParty passenger_root +syn keyword ngxDirectiveThirdParty passenger_ruby +syn keyword ngxDirectiveThirdParty passenger_use_global_queue +syn keyword ngxDirectiveThirdParty passenger_user_switching +syn keyword ngxDirectiveThirdParty rack_env +syn keyword ngxDirectiveThirdParty rails_app_spawner_idle_time +syn keyword ngxDirectiveThirdParty rails_env +syn keyword ngxDirectiveThirdParty rails_framework_spawner_idle_time +syn keyword ngxDirectiveThirdParty rails_spawn_method + +" RDS JSON Module +" Help ngx_drizzle and other DBD modules emit JSON data. +syn keyword ngxDirectiveThirdParty rds_json +syn keyword ngxDirectiveThirdParty rds_json_content_type +syn keyword ngxDirectiveThirdParty rds_json_format +syn keyword ngxDirectiveThirdParty rds_json_ret + +" RRD Graph Module +" This module provides an HTTP interface to RRDtool's graphing facilities. +syn keyword ngxDirectiveThirdParty rrd_graph +syn keyword ngxDirectiveThirdParty rrd_graph_root + +" Secure Download +" Create expiring links. +syn keyword ngxDirectiveThirdParty secure_download +syn keyword ngxDirectiveThirdParty secure_download_fail_location +syn keyword ngxDirectiveThirdParty secure_download_path_mode +syn keyword ngxDirectiveThirdParty secure_download_secret + +" SlowFS Cache Module +" Module adding ability to cache static files. +syn keyword ngxDirectiveThirdParty slowfs_big_file_size +syn keyword ngxDirectiveThirdParty slowfs_cache +syn keyword ngxDirectiveThirdParty slowfs_cache_key +syn keyword ngxDirectiveThirdParty slowfs_cache_min_uses +syn keyword ngxDirectiveThirdParty slowfs_cache_path +syn keyword ngxDirectiveThirdParty slowfs_cache_purge +syn keyword ngxDirectiveThirdParty slowfs_cache_valid +syn keyword ngxDirectiveThirdParty slowfs_temp_path + +" Strip Module +" Whitespace remover. +syn keyword ngxDirectiveThirdParty strip + +" Substitutions Module +" A filter module which can do both regular expression and fixed string substitutions on response bodies. +syn keyword ngxDirectiveThirdParty subs_filter +syn keyword ngxDirectiveThirdParty subs_filter_types + +" Supervisord Module +" Module providing nginx with API to communicate with supervisord and manage (start/stop) backends on-demand. +syn keyword ngxDirectiveThirdParty supervisord +syn keyword ngxDirectiveThirdParty supervisord_inherit_backend_status +syn keyword ngxDirectiveThirdParty supervisord_name +syn keyword ngxDirectiveThirdParty supervisord_start +syn keyword ngxDirectiveThirdParty supervisord_stop + +" Upload Module +" Parses multipart/form-data allowing arbitrary handling of uploaded files. +syn keyword ngxDirectiveThirdParty upload_aggregate_form_field +syn keyword ngxDirectiveThirdParty upload_buffer_size +syn keyword ngxDirectiveThirdParty upload_cleanup +syn keyword ngxDirectiveThirdParty upload_limit_rate +syn keyword ngxDirectiveThirdParty upload_max_file_size +syn keyword ngxDirectiveThirdParty upload_max_output_body_len +syn keyword ngxDirectiveThirdParty upload_max_part_header_len +syn keyword ngxDirectiveThirdParty upload_pass +syn keyword ngxDirectiveThirdParty upload_pass_args +syn keyword ngxDirectiveThirdParty upload_pass_form_field +syn keyword ngxDirectiveThirdParty upload_set_form_field +syn keyword ngxDirectiveThirdParty upload_store +syn keyword ngxDirectiveThirdParty upload_store_access + +" Upload Progress Module +" Tracks and reports upload progress. +syn keyword ngxDirectiveThirdParty report_uploads +syn keyword ngxDirectiveThirdParty track_uploads +syn keyword ngxDirectiveThirdParty upload_progress +syn keyword ngxDirectiveThirdParty upload_progress_content_type +syn keyword ngxDirectiveThirdParty upload_progress_header +syn keyword ngxDirectiveThirdParty upload_progress_json_output +syn keyword ngxDirectiveThirdParty upload_progress_template + +" Upstream Fair Balancer +" Sends an incoming request to the least-busy backend server, rather than distributing requests round-robin. +syn keyword ngxDirectiveThirdParty fair +syn keyword ngxDirectiveThirdParty upstream_fair_shm_size + +" Upstream Consistent Hash +" Select backend based on Consistent hash ring. +syn keyword ngxDirectiveThirdParty consistent_hash + +" Upstream Hash Module +" Provides simple upstream load distribution by hashing a configurable variable. +syn keyword ngxDirectiveThirdParty hash +syn keyword ngxDirectiveThirdParty hash_again + +" XSS Module +" Native support for cross-site scripting (XSS) in an nginx. +syn keyword ngxDirectiveThirdParty xss_callback_arg +syn keyword ngxDirectiveThirdParty xss_get +syn keyword ngxDirectiveThirdParty xss_input_types +syn keyword ngxDirectiveThirdParty xss_output_type + +" highlight + +hi link ngxComment Comment +hi link ngxVariable Identifier +hi link ngxVariableBlock Identifier +hi link ngxVariableString PreProc +hi link ngxBlock Normal +hi link ngxString String + +hi link ngxBoolean Boolean +hi link ngxDirectiveBlock Statement +hi link ngxDirectiveImportant Type +hi link ngxDirectiveControl Keyword +hi link ngxDirectiveError Constant +hi link ngxDirectiveDeprecated Error +hi link ngxDirective Identifier +hi link ngxDirectiveThirdParty Special + +let b:current_syntax = "nginx" diff --git a/sources_non_forked/snipmate-snippets/.gitignore b/sources_non_forked/snipmate-snippets/.gitignore new file mode 100644 index 00000000..da39d981 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/.gitignore @@ -0,0 +1,16 @@ +*~ +.DS_Store + +*.log +*.tmp +*.swp +*.old +*.bkp +*.zip +*.rar +*.arj +*.[t]gz +*.[t]bz2 + +tmp/ +log/ diff --git a/sources_non_forked/snipmate-snippets/README.md b/sources_non_forked/snipmate-snippets/README.md deleted file mode 100644 index f1f8bac9..00000000 --- a/sources_non_forked/snipmate-snippets/README.md +++ /dev/null @@ -1,47 +0,0 @@ -Snipmate Snippets -================= - -This repository contains snippets files for various programming languages for -the famous [snipMate][1] plugin for vim. This repository is -community-maintained and many people have contributed snippet files and other -improvements already. - -[vim-snipmate][1] was originally started by [Michael Sanders][2] who has now -unfortunately abandoned the project. [Rok Garbas][3] is now maintaining a -[fork][4] of the project in hopes of improving the existing code base. - -Language maintainers --------------------- - -No one can really be proficient in all programming languages. If you would like -to maintain snippets for a language, please get in touch. - -* Python - [honza](http://github.com/honza) -* Javascript - [honza](http://github.com/honza) -* HTML Django - [honza](http://github.com/honza) -* Markdown - [honza](http://github.com/honza) -* Ruby - [taq](http://github.com/taq) -* PHP - [chrisyue](http://github.com/chrisyue) - -Contributing notes ------------------- - -Until further work is done on `vim-snipmate`, please don't add folding markers -into snippets. - -Authors -------- - -For a list of authors, please see the `AUTHORS` files. - -License -------- - -Just as the original snipMate plugin, all the snippets are licensed under the -terms of the MIT license. - - -[1]: http://github.com/garbas/vim-snipmate -[2]: http://github.com/msanders -[3]: http://github.com/garbas -[4]: http://github.com/garbas/vim-snipmate diff --git a/sources_non_forked/snipmate-snippets/Rakefile b/sources_non_forked/snipmate-snippets/Rakefile new file mode 100644 index 00000000..15cece2f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/Rakefile @@ -0,0 +1,24 @@ +#require 'fileutils' +#include FileUtils + +namespace :snippets_dir do + task :find do + vim_dir = File.join(ENV['VIMFILES'] || ENV['HOME'] || ENV['USERPROFILE'], RUBY_PLATFORM =~ /mswin|msys|mingw32/ ? "vimfiles" : ".vim") + pathogen_dir = File.join(vim_dir, "bundle") + @snippets_dir = File.directory?(pathogen_dir) ? File.join(pathogen_dir, "snipmate", "snippets") : File.join(vim_dir, "snippets") + end + + desc "Purge the contents of the vim snippets directory" + task :purge => ["snippets_dir:find"] do + rm_rf @snippets_dir, :verbose => true if File.directory? @snippets_dir + mkdir @snippets_dir, :verbose => true + end +end + +desc "Copy the snippets directories into ~/.vim/snippets" +task :deploy_local => ["snippets_dir:purge"] do + Dir.foreach(".") do |f| + cp_r f, @snippets_dir, :verbose => true if File.directory?(f) && f =~ /^[^\.]/ + end + cp "support_functions.vim", @snippets_dir, :verbose => true +end diff --git a/sources_non_forked/snipmate-snippets/_/date/date + time.snippet b/sources_non_forked/snipmate-snippets/_/date/date + time.snippet new file mode 100644 index 00000000..c6a0e433 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/_/date/date + time.snippet @@ -0,0 +1 @@ +`strftime("%Y-%m-%d %H:%M:%S")` diff --git a/sources_non_forked/snipmate-snippets/_/date/date.snippet b/sources_non_forked/snipmate-snippets/_/date/date.snippet new file mode 100644 index 00000000..5d89951b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/_/date/date.snippet @@ -0,0 +1 @@ +`strftime("%Y-%m-%d")` diff --git a/sources_non_forked/snipmate-snippets/_/lorem.snippet b/sources_non_forked/snipmate-snippets/_/lorem.snippet new file mode 100644 index 00000000..cee7a927 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/_/lorem.snippet @@ -0,0 +1 @@ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. diff --git a/sources_non_forked/snipmate-snippets/_/modeline.snippet b/sources_non_forked/snipmate-snippets/_/modeline.snippet new file mode 100644 index 00000000..bf0dfa3b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/_/modeline.snippet @@ -0,0 +1 @@ +`Snippet_Modeline()` diff --git a/sources_non_forked/snipmate-snippets/ant/skel/basic.snippet b/sources_non_forked/snipmate-snippets/ant/skel/basic.snippet new file mode 100644 index 00000000..276cf7db --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ant/skel/basic.snippet @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sources_non_forked/snipmate-snippets/c/cl.snippet b/sources_non_forked/snipmate-snippets/c/cl.snippet new file mode 100644 index 00000000..81962872 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/cl.snippet @@ -0,0 +1,7 @@ +class ${1:`Filename('$1_t', 'name')`} { + public: + $1 (${2:arguments}); + virtual ~$1 (); + private: + ${3:/* data */} +}; diff --git a/sources_non_forked/snipmate-snippets/c/def.snippet b/sources_non_forked/snipmate-snippets/c/def.snippet new file mode 100644 index 00000000..35f73310 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/def.snippet @@ -0,0 +1,3 @@ +#ifndef $1 +#define ${1:SYMBOL} ${2:value} +#endif${3} diff --git a/sources_non_forked/snipmate-snippets/c/do.snippet b/sources_non_forked/snipmate-snippets/c/do.snippet new file mode 100644 index 00000000..9435f159 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/do.snippet @@ -0,0 +1,3 @@ +do { + ${2:/* code */} +} while (${1:/* condition */}); diff --git a/sources_non_forked/snipmate-snippets/c/el.snippet b/sources_non_forked/snipmate-snippets/c/el.snippet new file mode 100644 index 00000000..5966669a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/el.snippet @@ -0,0 +1,3 @@ +else { + ${1} +} diff --git a/sources_non_forked/snipmate-snippets/c/for.snippet b/sources_non_forked/snipmate-snippets/c/for.snippet new file mode 100644 index 00000000..58d6c36a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/for.snippet @@ -0,0 +1,3 @@ +for (${2:i} = 0; $2 < ${1:count}; $2${3:++}) { + ${4:/* code */} +} diff --git a/sources_non_forked/snipmate-snippets/c/forr.snippet b/sources_non_forked/snipmate-snippets/c/forr.snippet new file mode 100644 index 00000000..ea5b430b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/forr.snippet @@ -0,0 +1,3 @@ +for (${1:i} = 0; ${2:$1 < 5}; $1${3:++}) { + ${4:/* code */} +} diff --git a/sources_non_forked/snipmate-snippets/c/fpf.snippet b/sources_non_forked/snipmate-snippets/c/fpf.snippet new file mode 100644 index 00000000..53aed564 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/fpf.snippet @@ -0,0 +1 @@ +fprintf(${1:stderr}, "${2:%s}\n"${3});${4} diff --git a/sources_non_forked/snipmate-snippets/c/fun.snippet b/sources_non_forked/snipmate-snippets/c/fun.snippet new file mode 100644 index 00000000..b9d7663c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/fun.snippet @@ -0,0 +1,4 @@ +${1:void} ${2:function_name} (${3}) +{ + ${4:/* code */} +} diff --git a/sources_non_forked/snipmate-snippets/c/if.snippet b/sources_non_forked/snipmate-snippets/c/if.snippet new file mode 100644 index 00000000..df32c281 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/if.snippet @@ -0,0 +1,3 @@ +if (${1:/* condition */}) { + ${2:/* code */} +} diff --git a/sources_non_forked/snipmate-snippets/c/inc/inc.snippet b/sources_non_forked/snipmate-snippets/c/inc/inc.snippet new file mode 100644 index 00000000..302edffd --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/inc/inc.snippet @@ -0,0 +1 @@ +#include "${1:`Filename("$1.h")`}"${2} diff --git a/sources_non_forked/snipmate-snippets/c/inc/inc_global.snippet b/sources_non_forked/snipmate-snippets/c/inc/inc_global.snippet new file mode 100644 index 00000000..cf049935 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/inc/inc_global.snippet @@ -0,0 +1 @@ +#include <${1:stdio}.h>${2} diff --git a/sources_non_forked/snipmate-snippets/c/main.snippet b/sources_non_forked/snipmate-snippets/c/main.snippet new file mode 100644 index 00000000..bbfd8bfb --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/main.snippet @@ -0,0 +1,5 @@ +int main (int argc, char const* argv[]) +{ + ${1:/* code */} + return 0; +} diff --git a/sources_non_forked/snipmate-snippets/c/map.snippet b/sources_non_forked/snipmate-snippets/c/map.snippet new file mode 100644 index 00000000..59c4205b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/map.snippet @@ -0,0 +1 @@ +std::map<${1:key}, ${2:value}> map${3}; diff --git a/sources_non_forked/snipmate-snippets/c/ns.snippet b/sources_non_forked/snipmate-snippets/c/ns.snippet new file mode 100644 index 00000000..d9b0b337 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/ns.snippet @@ -0,0 +1,3 @@ +namespace ${1:`Filename('', 'my')`} { + ${2} +} /* $1 */ diff --git a/sources_non_forked/snipmate-snippets/c/once.snippet b/sources_non_forked/snipmate-snippets/c/once.snippet new file mode 100644 index 00000000..7b70667f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/once.snippet @@ -0,0 +1,6 @@ +#ifndef ${1:`toupper(Filename('', 'UNTITLED').'_'.system("/usr/bin/ruby -e 'print (rand * 2821109907455).round.to_s(36)'"))`} +#define $1 + +${2} + +#endif /* end of include guard: $1 */ diff --git a/sources_non_forked/snipmate-snippets/c/pr.snippet b/sources_non_forked/snipmate-snippets/c/pr.snippet new file mode 100644 index 00000000..0dd78dc6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/pr.snippet @@ -0,0 +1 @@ +printf("${1:%s}\n"${2});${3} diff --git a/sources_non_forked/snipmate-snippets/c/readfile.snippet b/sources_non_forked/snipmate-snippets/c/readfile.snippet new file mode 100644 index 00000000..9aaf9c36 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/readfile.snippet @@ -0,0 +1,7 @@ +std::vector v; +if (FILE *${2:fp} = fopen(${1:"filename"}, "r")) { + char buf[1024]; + while (size_t len = fread(buf, 1, sizeof(buf), $2)) + v.insert(v.end(), buf, buf + len); + fclose($2); +}${3} diff --git a/sources_non_forked/snipmate-snippets/c/st.snippet b/sources_non_forked/snipmate-snippets/c/st.snippet new file mode 100644 index 00000000..95b798ae --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/st.snippet @@ -0,0 +1,3 @@ +struct ${1:`Filename('$1_t', 'name')`} { + ${2:/* data */} +}${3: /* optional variable list */};${4} diff --git a/sources_non_forked/snipmate-snippets/c/t.snippet b/sources_non_forked/snipmate-snippets/c/t.snippet new file mode 100644 index 00000000..dbc2f2be --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/t.snippet @@ -0,0 +1 @@ +${1:/* condition */} ? ${2:a} : ${3:b}' diff --git a/sources_non_forked/snipmate-snippets/c/td.snippet b/sources_non_forked/snipmate-snippets/c/td.snippet new file mode 100644 index 00000000..61b147a2 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/td.snippet @@ -0,0 +1 @@ +typedef ${1:int} ${2:MyCustomType}; diff --git a/sources_non_forked/snipmate-snippets/c/tds.snippet b/sources_non_forked/snipmate-snippets/c/tds.snippet new file mode 100644 index 00000000..fea80d2a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/tds.snippet @@ -0,0 +1,3 @@ +typedef struct { + ${2:/* data */} +} ${1:`Filename('$1_t', 'name')`}; diff --git a/sources_non_forked/snipmate-snippets/c/vector.snippet b/sources_non_forked/snipmate-snippets/c/vector.snippet new file mode 100644 index 00000000..f26dc223 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/vector.snippet @@ -0,0 +1 @@ +std::vector<${1:char}> v${2}; diff --git a/sources_non_forked/snipmate-snippets/c/wh.snippet b/sources_non_forked/snipmate-snippets/c/wh.snippet new file mode 100644 index 00000000..318ca590 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/c/wh.snippet @@ -0,0 +1,3 @@ +while (${1:/* condition */}) { + ${2:/* code */} +} diff --git a/sources_non_forked/snipmate-snippets/css/#.snippet b/sources_non_forked/snipmate-snippets/css/#.snippet new file mode 100644 index 00000000..5a926818 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/#.snippet @@ -0,0 +1,3 @@ +#${1:id} { + ${2} +} diff --git a/sources_non_forked/snipmate-snippets/css/background/all.snippet b/sources_non_forked/snipmate-snippets/css/background/all.snippet new file mode 100644 index 00000000..5e94d2c2 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/background/all.snippet @@ -0,0 +1 @@ +background:${6: #${1:DDD}} url($2) ${3:repeat/repeat-x/repeat-y/no-repeat} ${4:scroll/fixed} ${5:top left/top center/top right/center left/center center/center right/bottom left/bottom center/bottom right/x-% y-%/x-pos y-pos};$0 diff --git a/sources_non_forked/snipmate-snippets/css/background/attachment.snippet b/sources_non_forked/snipmate-snippets/css/background/attachment.snippet new file mode 100644 index 00000000..cb0c8f81 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/background/attachment.snippet @@ -0,0 +1 @@ +background-attachment: ${1:scroll/fixed};$0 diff --git a/sources_non_forked/snipmate-snippets/css/background/color.snippet b/sources_non_forked/snipmate-snippets/css/background/color.snippet new file mode 100644 index 00000000..ebf4bc70 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/background/color.snippet @@ -0,0 +1 @@ +background-color: #${1:DDD};$0 diff --git a/sources_non_forked/snipmate-snippets/css/background/color_name.snippet b/sources_non_forked/snipmate-snippets/css/background/color_name.snippet new file mode 100644 index 00000000..c736f990 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/background/color_name.snippet @@ -0,0 +1 @@ +background-color: ${1:red};$0 diff --git a/sources_non_forked/snipmate-snippets/css/background/color_rgb.snippet b/sources_non_forked/snipmate-snippets/css/background/color_rgb.snippet new file mode 100644 index 00000000..a818f86e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/background/color_rgb.snippet @@ -0,0 +1 @@ +background-color: rgb(${1:255},${2:255},${3:255});$0 diff --git a/sources_non_forked/snipmate-snippets/css/background/color_transparent.snippet b/sources_non_forked/snipmate-snippets/css/background/color_transparent.snippet new file mode 100644 index 00000000..d4ecdd13 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/background/color_transparent.snippet @@ -0,0 +1 @@ +background-color: transparent;$0 diff --git a/sources_non_forked/snipmate-snippets/css/background/image_none.snippet b/sources_non_forked/snipmate-snippets/css/background/image_none.snippet new file mode 100644 index 00000000..1112ab7d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/background/image_none.snippet @@ -0,0 +1 @@ +background-image: none;$0 diff --git a/sources_non_forked/snipmate-snippets/css/background/image_url.snippet b/sources_non_forked/snipmate-snippets/css/background/image_url.snippet new file mode 100644 index 00000000..83bee3e8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/background/image_url.snippet @@ -0,0 +1 @@ +background-image: url($1);$0 diff --git a/sources_non_forked/snipmate-snippets/css/background/position.snippet b/sources_non_forked/snipmate-snippets/css/background/position.snippet new file mode 100644 index 00000000..ccdcb692 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/background/position.snippet @@ -0,0 +1 @@ +background-position: ${1:top left/top center/top right/center left/center center/center right/bottom left/bottom center/bottom right/x-% y-%/x-pos y-pos};$0 diff --git a/sources_non_forked/snipmate-snippets/css/background/repeat.snippet b/sources_non_forked/snipmate-snippets/css/background/repeat.snippet new file mode 100644 index 00000000..5c6ce160 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/background/repeat.snippet @@ -0,0 +1 @@ +background-repeat: ${1:repeat/repeat-x/repeat-y/no-repeat};$0 diff --git a/sources_non_forked/snipmate-snippets/css/border/basic.snippet b/sources_non_forked/snipmate-snippets/css/border/basic.snippet new file mode 100644 index 00000000..bb6adc0d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/border/basic.snippet @@ -0,0 +1 @@ +border: ${1:1px} ${2:solid} #${3:999};$0 diff --git a/sources_non_forked/snipmate-snippets/css/border/color.snippet b/sources_non_forked/snipmate-snippets/css/border/color.snippet new file mode 100644 index 00000000..b3e7721a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/border/color.snippet @@ -0,0 +1 @@ +border-color: ${1:999};$0 diff --git a/sources_non_forked/snipmate-snippets/css/border/style.snippet b/sources_non_forked/snipmate-snippets/css/border/style.snippet new file mode 100644 index 00000000..0dac5f13 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/border/style.snippet @@ -0,0 +1 @@ +border-style: ${1:none/hidden/dotted/dashed/solid/double/groove/ridge/inset/outset};$0 diff --git a/sources_non_forked/snipmate-snippets/css/border/width.snippet b/sources_non_forked/snipmate-snippets/css/border/width.snippet new file mode 100644 index 00000000..7c5fba05 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/border/width.snippet @@ -0,0 +1 @@ +border-width: ${1:1px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/borderb/basic.snippet b/sources_non_forked/snipmate-snippets/css/borderb/basic.snippet new file mode 100644 index 00000000..e0b7c21d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/borderb/basic.snippet @@ -0,0 +1 @@ +border-bottom: ${1:1}px ${2:solid} #${3:999};$0 diff --git a/sources_non_forked/snipmate-snippets/css/borderb/color.snippet b/sources_non_forked/snipmate-snippets/css/borderb/color.snippet new file mode 100644 index 00000000..d980e498 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/borderb/color.snippet @@ -0,0 +1 @@ +border-bottom-color: #${1:999};$0 diff --git a/sources_non_forked/snipmate-snippets/css/borderb/style.snippet b/sources_non_forked/snipmate-snippets/css/borderb/style.snippet new file mode 100644 index 00000000..24617c61 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/borderb/style.snippet @@ -0,0 +1 @@ +border-bottom-style: ${1:none/hidden/dotted/dashed/solid/double/groove/ridge/inset/outset};$0 diff --git a/sources_non_forked/snipmate-snippets/css/borderb/width.snippet b/sources_non_forked/snipmate-snippets/css/borderb/width.snippet new file mode 100644 index 00000000..2689cd56 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/borderb/width.snippet @@ -0,0 +1 @@ +border-bottom-width: ${1:1}px ${2:solid} #${3:999};$0 diff --git a/sources_non_forked/snipmate-snippets/css/borderl/basic.snippet b/sources_non_forked/snipmate-snippets/css/borderl/basic.snippet new file mode 100644 index 00000000..dd4dd2ab --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/borderl/basic.snippet @@ -0,0 +1 @@ +border-left: ${1:1}px ${2:solid} #${3:999};$0 diff --git a/sources_non_forked/snipmate-snippets/css/borderl/color.snippet b/sources_non_forked/snipmate-snippets/css/borderl/color.snippet new file mode 100644 index 00000000..68afecb1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/borderl/color.snippet @@ -0,0 +1 @@ +border-left-color: #${1:999};$0 diff --git a/sources_non_forked/snipmate-snippets/css/borderl/style.snippet b/sources_non_forked/snipmate-snippets/css/borderl/style.snippet new file mode 100644 index 00000000..074cbfa8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/borderl/style.snippet @@ -0,0 +1 @@ +border-left-style: ${1:none/hidden/dotted/dashed/solid/double/groove/ridge/inset/outset};$0 diff --git a/sources_non_forked/snipmate-snippets/css/borderl/width.snippet b/sources_non_forked/snipmate-snippets/css/borderl/width.snippet new file mode 100644 index 00000000..1e2acefc --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/borderl/width.snippet @@ -0,0 +1 @@ +border-left-width: ${1:1}px ${2:solid} #${3:999};$0 diff --git a/sources_non_forked/snipmate-snippets/css/borderr/basic.snippet b/sources_non_forked/snipmate-snippets/css/borderr/basic.snippet new file mode 100644 index 00000000..a0a3e4bf --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/borderr/basic.snippet @@ -0,0 +1 @@ +border-right: ${1:1}px ${2:solid} #${3:999};$0 diff --git a/sources_non_forked/snipmate-snippets/css/borderr/color.snippet b/sources_non_forked/snipmate-snippets/css/borderr/color.snippet new file mode 100644 index 00000000..320acccd --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/borderr/color.snippet @@ -0,0 +1 @@ +border-right-color: #${1:999};$0 diff --git a/sources_non_forked/snipmate-snippets/css/borderr/style.snippet b/sources_non_forked/snipmate-snippets/css/borderr/style.snippet new file mode 100644 index 00000000..8b03f66a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/borderr/style.snippet @@ -0,0 +1 @@ +border-right-style: ${1:none/hidden/dotted/dashed/solid/double/groove/ridge/inset/outset};$0 diff --git a/sources_non_forked/snipmate-snippets/css/borderr/width.snippet b/sources_non_forked/snipmate-snippets/css/borderr/width.snippet new file mode 100644 index 00000000..9df04266 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/borderr/width.snippet @@ -0,0 +1 @@ +border-right-width: ${1:1}px ${2:solid} #${3:999};$0 diff --git a/sources_non_forked/snipmate-snippets/css/bordert/basic.snippet b/sources_non_forked/snipmate-snippets/css/bordert/basic.snippet new file mode 100644 index 00000000..e2334480 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/bordert/basic.snippet @@ -0,0 +1 @@ +border-top: ${1:1}px ${2:solid} #${3:999};$0 diff --git a/sources_non_forked/snipmate-snippets/css/bordert/color.snippet b/sources_non_forked/snipmate-snippets/css/bordert/color.snippet new file mode 100644 index 00000000..1a79fb44 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/bordert/color.snippet @@ -0,0 +1 @@ +border-top-color: #${1:999};$0 diff --git a/sources_non_forked/snipmate-snippets/css/bordert/style.snippet b/sources_non_forked/snipmate-snippets/css/bordert/style.snippet new file mode 100644 index 00000000..d6ae011b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/bordert/style.snippet @@ -0,0 +1 @@ +border-top-style: ${1:none/hidden/dotted/dashed/solid/double/groove/ridge/inset/outset};$0 diff --git a/sources_non_forked/snipmate-snippets/css/bordert/width.snippet b/sources_non_forked/snipmate-snippets/css/bordert/width.snippet new file mode 100644 index 00000000..5faaef19 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/bordert/width.snippet @@ -0,0 +1 @@ +border-top-width: ${1:1}px ${2:solid} #${3:999};$0 diff --git a/sources_non_forked/snipmate-snippets/css/cl.snippet b/sources_non_forked/snipmate-snippets/css/cl.snippet new file mode 100644 index 00000000..a13d1209 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/cl.snippet @@ -0,0 +1,3 @@ +.${1:class} { + ${2:color: pink;} +} diff --git a/sources_non_forked/snipmate-snippets/css/clear.snippet b/sources_non_forked/snipmate-snippets/css/clear.snippet new file mode 100644 index 00000000..16b3930a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/clear.snippet @@ -0,0 +1 @@ +clear: ${1:left/right/both/none};$0 diff --git a/sources_non_forked/snipmate-snippets/css/color.snippet b/sources_non_forked/snipmate-snippets/css/color.snippet new file mode 100644 index 00000000..3d2728af --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/color.snippet @@ -0,0 +1 @@ +color: #${1:DDD};$0 diff --git a/sources_non_forked/snipmate-snippets/css/colorn.snippet b/sources_non_forked/snipmate-snippets/css/colorn.snippet new file mode 100644 index 00000000..52da6c9a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/colorn.snippet @@ -0,0 +1 @@ +color: ${1:red};$0 diff --git a/sources_non_forked/snipmate-snippets/css/colorr.snippet b/sources_non_forked/snipmate-snippets/css/colorr.snippet new file mode 100644 index 00000000..4204aadd --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/colorr.snippet @@ -0,0 +1 @@ +color: rgb(${1:255},${2:255},${3:255});$0 diff --git a/sources_non_forked/snipmate-snippets/css/cursor.snippet b/sources_non_forked/snipmate-snippets/css/cursor.snippet new file mode 100644 index 00000000..c2e45c71 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/cursor.snippet @@ -0,0 +1 @@ +cursor: ${1:default/auto/crosshair/pointer/move/*-resize/text/wait/help};$0 diff --git a/sources_non_forked/snipmate-snippets/css/cursuru.snippet b/sources_non_forked/snipmate-snippets/css/cursuru.snippet new file mode 100644 index 00000000..35b1ef22 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/cursuru.snippet @@ -0,0 +1 @@ +cursor: url($1);$0 diff --git a/sources_non_forked/snipmate-snippets/css/direction.snippet b/sources_non_forked/snipmate-snippets/css/direction.snippet new file mode 100644 index 00000000..e0a495a4 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/direction.snippet @@ -0,0 +1 @@ +direction: ${1:ltr|rtl};$0 diff --git a/sources_non_forked/snipmate-snippets/css/display/block.snippet b/sources_non_forked/snipmate-snippets/css/display/block.snippet new file mode 100644 index 00000000..d35d1c2d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/display/block.snippet @@ -0,0 +1 @@ +display: block;$0 diff --git a/sources_non_forked/snipmate-snippets/css/display/common.snippet b/sources_non_forked/snipmate-snippets/css/display/common.snippet new file mode 100644 index 00000000..38100a8c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/display/common.snippet @@ -0,0 +1 @@ +display: ${1:none/inline/block/list-item/run-in/compact/marker};$0 diff --git a/sources_non_forked/snipmate-snippets/css/display/inline.snippet b/sources_non_forked/snipmate-snippets/css/display/inline.snippet new file mode 100644 index 00000000..1969678e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/display/inline.snippet @@ -0,0 +1 @@ +display: inline;$0 diff --git a/sources_non_forked/snipmate-snippets/css/display/table.snippet b/sources_non_forked/snipmate-snippets/css/display/table.snippet new file mode 100644 index 00000000..eeb4da0f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/display/table.snippet @@ -0,0 +1 @@ +display: ${1:table/inline-table/table-row-group/table-header-group/table-footer-group/table-row/table-column-group/table-column/table-cell/table-caption};$0 diff --git a/sources_non_forked/snipmate-snippets/css/float.snippet b/sources_non_forked/snipmate-snippets/css/float.snippet new file mode 100644 index 00000000..b43a23c3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/float.snippet @@ -0,0 +1 @@ +float: ${1:left/right/none};$0 diff --git a/sources_non_forked/snipmate-snippets/css/font/all.snippet b/sources_non_forked/snipmate-snippets/css/font/all.snippet new file mode 100644 index 00000000..30900a18 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/font/all.snippet @@ -0,0 +1 @@ +font: ${1:normal/italic/oblique} ${2:normal/small-caps} ${3:normal/bold} ${4:1em/1.5em} ${5:Arial}, ${6:sans-}serif;$0 diff --git a/sources_non_forked/snipmate-snippets/css/font/family.snippet b/sources_non_forked/snipmate-snippets/css/font/family.snippet new file mode 100644 index 00000000..b48c3f6a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/font/family.snippet @@ -0,0 +1 @@ +font-family: ${1:Arial, "MS Trebuchet"}, ${2:sans-}serif;$0 diff --git a/sources_non_forked/snipmate-snippets/css/font/size.snippet b/sources_non_forked/snipmate-snippets/css/font/size.snippet new file mode 100644 index 00000000..4a43b045 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/font/size.snippet @@ -0,0 +1 @@ +font-size: ${1:100%};$0 diff --git a/sources_non_forked/snipmate-snippets/css/font/size_font.snippet b/sources_non_forked/snipmate-snippets/css/font/size_font.snippet new file mode 100644 index 00000000..185b6150 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/font/size_font.snippet @@ -0,0 +1 @@ +font: ${1:75%} ${2:"Lucida Grande", "Trebuchet MS", Verdana,} ${3:sans-}serif;$0 diff --git a/sources_non_forked/snipmate-snippets/css/font/style.snippet b/sources_non_forked/snipmate-snippets/css/font/style.snippet new file mode 100644 index 00000000..94b6e1d3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/font/style.snippet @@ -0,0 +1 @@ +font-style: ${1:normal/italic/oblique};$0 diff --git a/sources_non_forked/snipmate-snippets/css/font/variant.snippet b/sources_non_forked/snipmate-snippets/css/font/variant.snippet new file mode 100644 index 00000000..f0aa67fd --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/font/variant.snippet @@ -0,0 +1 @@ +font-variant: ${1:normal/small-caps};$0 diff --git a/sources_non_forked/snipmate-snippets/css/font/weight.snippet b/sources_non_forked/snipmate-snippets/css/font/weight.snippet new file mode 100644 index 00000000..c355c88a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/font/weight.snippet @@ -0,0 +1 @@ +font-weight: ${1:normal/bold};$0 diff --git a/sources_non_forked/snipmate-snippets/css/i.snippet b/sources_non_forked/snipmate-snippets/css/i.snippet new file mode 100644 index 00000000..5ca99ef8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/i.snippet @@ -0,0 +1 @@ +${1:!important} diff --git a/sources_non_forked/snipmate-snippets/css/letter.snippet b/sources_non_forked/snipmate-snippets/css/letter.snippet new file mode 100644 index 00000000..53f64a1e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/letter.snippet @@ -0,0 +1 @@ +letter-spacing: ${1}${2:em/px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/letterem.snippet b/sources_non_forked/snipmate-snippets/css/letterem.snippet new file mode 100644 index 00000000..4d81aa34 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/letterem.snippet @@ -0,0 +1 @@ +letter-spacing: $1em;$0 diff --git a/sources_non_forked/snipmate-snippets/css/letterpx.snippet b/sources_non_forked/snipmate-snippets/css/letterpx.snippet new file mode 100644 index 00000000..d6d3fee7 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/letterpx.snippet @@ -0,0 +1 @@ +letter-spacing: $1px;$0 diff --git a/sources_non_forked/snipmate-snippets/css/list-style/image.snippet b/sources_non_forked/snipmate-snippets/css/list-style/image.snippet new file mode 100644 index 00000000..f6f0bc88 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/list-style/image.snippet @@ -0,0 +1 @@ +list-style-image: url($1);$0 diff --git a/sources_non_forked/snipmate-snippets/css/list-style/position.snippet b/sources_non_forked/snipmate-snippets/css/list-style/position.snippet new file mode 100644 index 00000000..904f45d5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/list-style/position.snippet @@ -0,0 +1 @@ +list-style-position: ${1:inside/outside};$0 diff --git a/sources_non_forked/snipmate-snippets/css/list-style/type_asian.snippet b/sources_non_forked/snipmate-snippets/css/list-style/type_asian.snippet new file mode 100644 index 00000000..220cf075 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/list-style/type_asian.snippet @@ -0,0 +1 @@ +list-style-type: ${1:cjk-ideographic/hiragana/katakana/hiragana-iroha/katakana-iroha};$0 diff --git a/sources_non_forked/snipmate-snippets/css/list-style/type_marker.snippet b/sources_non_forked/snipmate-snippets/css/list-style/type_marker.snippet new file mode 100644 index 00000000..5c9350a6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/list-style/type_marker.snippet @@ -0,0 +1 @@ +list-style-type: ${1:none/disc/circle/square};$0 diff --git a/sources_non_forked/snipmate-snippets/css/list-style/type_numeric.snippet b/sources_non_forked/snipmate-snippets/css/list-style/type_numeric.snippet new file mode 100644 index 00000000..05efdcea --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/list-style/type_numeric.snippet @@ -0,0 +1 @@ +list-style-type: ${1:decimal/decimal-leading-zero/zero};$0 diff --git a/sources_non_forked/snipmate-snippets/css/list-style/type_other.snippet b/sources_non_forked/snipmate-snippets/css/list-style/type_other.snippet new file mode 100644 index 00000000..0e987a97 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/list-style/type_other.snippet @@ -0,0 +1 @@ +list-style-type: ${1:hebrew/armenian/georgian};$0 diff --git a/sources_non_forked/snipmate-snippets/css/list-style/type_position_image.snippet b/sources_non_forked/snipmate-snippets/css/list-style/type_position_image.snippet new file mode 100644 index 00000000..8d7397b3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/list-style/type_position_image.snippet @@ -0,0 +1 @@ +list-style: ${1:none/disc/circle/square/decimal/zero} ${2:inside/outside} url($3);$0 diff --git a/sources_non_forked/snipmate-snippets/css/list-style/type_roman_alpha_greek.snippet b/sources_non_forked/snipmate-snippets/css/list-style/type_roman_alpha_greek.snippet new file mode 100644 index 00000000..7a6a762e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/list-style/type_roman_alpha_greek.snippet @@ -0,0 +1 @@ +list-style-type: ${1:lower-roman/upper-roman/lower-alpha/upper-alpha/lower-greek/lower-latin/upper-latin};$0 diff --git a/sources_non_forked/snipmate-snippets/css/margin.snippet b/sources_non_forked/snipmate-snippets/css/margin.snippet new file mode 100644 index 00000000..06d3fa93 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/margin.snippet @@ -0,0 +1 @@ +margin: ${1:20px} ${2:0px} ${3:40px} ${4:0px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/marginb.snippet b/sources_non_forked/snipmate-snippets/css/marginb.snippet new file mode 100644 index 00000000..abb7f41c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/marginb.snippet @@ -0,0 +1 @@ +margin-bottom: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/marginl.snippet b/sources_non_forked/snipmate-snippets/css/marginl.snippet new file mode 100644 index 00000000..5ecc61b1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/marginl.snippet @@ -0,0 +1 @@ +margin-left: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/margino/T_R_B_L.snippet b/sources_non_forked/snipmate-snippets/css/margino/T_R_B_L.snippet new file mode 100644 index 00000000..06d3fa93 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/margino/T_R_B_L.snippet @@ -0,0 +1 @@ +margin: ${1:20px} ${2:0px} ${3:40px} ${4:0px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/margino/V_H.snippet b/sources_non_forked/snipmate-snippets/css/margino/V_H.snippet new file mode 100644 index 00000000..e3427971 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/margino/V_H.snippet @@ -0,0 +1 @@ +margin: ${1:20px} ${2:0px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/margino/all.snippet b/sources_non_forked/snipmate-snippets/css/margino/all.snippet new file mode 100644 index 00000000..1be5f95b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/margino/all.snippet @@ -0,0 +1 @@ +margin: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/margino/bottom.snippet b/sources_non_forked/snipmate-snippets/css/margino/bottom.snippet new file mode 100644 index 00000000..abb7f41c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/margino/bottom.snippet @@ -0,0 +1 @@ +margin-bottom: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/margino/left.snippet b/sources_non_forked/snipmate-snippets/css/margino/left.snippet new file mode 100644 index 00000000..5ecc61b1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/margino/left.snippet @@ -0,0 +1 @@ +margin-left: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/margino/right.snippet b/sources_non_forked/snipmate-snippets/css/margino/right.snippet new file mode 100644 index 00000000..d600636a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/margino/right.snippet @@ -0,0 +1 @@ +margin-right: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/margino/top.snippet b/sources_non_forked/snipmate-snippets/css/margino/top.snippet new file mode 100644 index 00000000..c2bc40fe --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/margino/top.snippet @@ -0,0 +1 @@ +margin-top: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/marginr.snippet b/sources_non_forked/snipmate-snippets/css/marginr.snippet new file mode 100644 index 00000000..d600636a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/marginr.snippet @@ -0,0 +1 @@ +margin-right: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/margint.snippet b/sources_non_forked/snipmate-snippets/css/margint.snippet new file mode 100644 index 00000000..c2bc40fe --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/margint.snippet @@ -0,0 +1 @@ +margin-top: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/marker/offset_auto.snippet b/sources_non_forked/snipmate-snippets/css/marker/offset_auto.snippet new file mode 100644 index 00000000..f4c107af --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/marker/offset_auto.snippet @@ -0,0 +1 @@ +marker-offset: auto;$0 diff --git a/sources_non_forked/snipmate-snippets/css/marker/offset_length.snippet b/sources_non_forked/snipmate-snippets/css/marker/offset_length.snippet new file mode 100644 index 00000000..864e7501 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/marker/offset_length.snippet @@ -0,0 +1 @@ +marker-offset: ${1:10px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/opacity.snippet b/sources_non_forked/snipmate-snippets/css/opacity.snippet new file mode 100644 index 00000000..de7d62b8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/opacity.snippet @@ -0,0 +1,3 @@ +opacity: ${1:0.5};${100: +}-moz-opacity: ${1:0.5};${100: +}filter:alpha(opacity=${2:${1/(1?)0?\.(.*)/$1$2/}${1/^\d*\.\d\d+$|^\d*$|(^\d\.\d$)/(?1:0)/}});$0 diff --git a/sources_non_forked/snipmate-snippets/css/overflow.snippet b/sources_non_forked/snipmate-snippets/css/overflow.snippet new file mode 100644 index 00000000..3caac03a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/overflow.snippet @@ -0,0 +1 @@ +overflow: ${1:visible/hidden/scroll/auto};$0 diff --git a/sources_non_forked/snipmate-snippets/css/padding.snippet b/sources_non_forked/snipmate-snippets/css/padding.snippet new file mode 100644 index 00000000..db2a3ef2 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/padding.snippet @@ -0,0 +1 @@ +padding: ${1:20px} ${2:0px} ${3:40px} ${4:0px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/paddingb.snippet b/sources_non_forked/snipmate-snippets/css/paddingb.snippet new file mode 100644 index 00000000..66ad6be8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/paddingb.snippet @@ -0,0 +1 @@ +padding-bottom: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/paddingl.snippet b/sources_non_forked/snipmate-snippets/css/paddingl.snippet new file mode 100644 index 00000000..0853f499 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/paddingl.snippet @@ -0,0 +1 @@ +padding-left: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/paddingo/T_R_B_L.snippet b/sources_non_forked/snipmate-snippets/css/paddingo/T_R_B_L.snippet new file mode 100644 index 00000000..db2a3ef2 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/paddingo/T_R_B_L.snippet @@ -0,0 +1 @@ +padding: ${1:20px} ${2:0px} ${3:40px} ${4:0px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/paddingo/V_H.snippet b/sources_non_forked/snipmate-snippets/css/paddingo/V_H.snippet new file mode 100644 index 00000000..0b92d8eb --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/paddingo/V_H.snippet @@ -0,0 +1 @@ +padding: ${1:20px} ${2:0px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/paddingo/all.snippet b/sources_non_forked/snipmate-snippets/css/paddingo/all.snippet new file mode 100644 index 00000000..6d38bf79 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/paddingo/all.snippet @@ -0,0 +1 @@ +padding: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/paddingo/bottom.snippet b/sources_non_forked/snipmate-snippets/css/paddingo/bottom.snippet new file mode 100644 index 00000000..66ad6be8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/paddingo/bottom.snippet @@ -0,0 +1 @@ +padding-bottom: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/paddingo/left.snippet b/sources_non_forked/snipmate-snippets/css/paddingo/left.snippet new file mode 100644 index 00000000..0853f499 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/paddingo/left.snippet @@ -0,0 +1 @@ +padding-left: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/paddingo/right.snippet b/sources_non_forked/snipmate-snippets/css/paddingo/right.snippet new file mode 100644 index 00000000..91a4c80e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/paddingo/right.snippet @@ -0,0 +1 @@ +padding-right: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/paddingo/top.snippet b/sources_non_forked/snipmate-snippets/css/paddingo/top.snippet new file mode 100644 index 00000000..9ba63357 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/paddingo/top.snippet @@ -0,0 +1 @@ +padding-top: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/paddingr.snippet b/sources_non_forked/snipmate-snippets/css/paddingr.snippet new file mode 100644 index 00000000..91a4c80e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/paddingr.snippet @@ -0,0 +1 @@ +padding-right: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/paddingt.snippet b/sources_non_forked/snipmate-snippets/css/paddingt.snippet new file mode 100644 index 00000000..9ba63357 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/paddingt.snippet @@ -0,0 +1 @@ +padding-top: ${1:20px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/position.snippet b/sources_non_forked/snipmate-snippets/css/position.snippet new file mode 100644 index 00000000..2643aaec --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/position.snippet @@ -0,0 +1 @@ +position: ${1:static/relative/absolute/fixed};$0 diff --git a/sources_non_forked/snipmate-snippets/css/scrollbar.snippet b/sources_non_forked/snipmate-snippets/css/scrollbar.snippet new file mode 100644 index 00000000..f0172496 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/scrollbar.snippet @@ -0,0 +1,8 @@ +scrollbar-base-color: ${1:#CCCCCC};${2: +scrollbar-arrow-color: ${3:#000000}; +scrollbar-track-color: ${4:#999999}; +scrollbar-3dlight-color: ${5:#EEEEEE}; +scrollbar-highlight-color: ${6:#FFFFFF}; +scrollbar-face-color: ${7:#CCCCCC}; +scrollbar-shadow-color: ${9:#999999}; +scrollbar-darkshadow-color: ${8:#666666};} diff --git a/sources_non_forked/snipmate-snippets/css/tag.snippet b/sources_non_forked/snipmate-snippets/css/tag.snippet new file mode 100644 index 00000000..765269c5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/tag.snippet @@ -0,0 +1,3 @@ +${1:tag} { + ${2:color: pink;} +} diff --git a/sources_non_forked/snipmate-snippets/css/text/align.snippet b/sources_non_forked/snipmate-snippets/css/text/align.snippet new file mode 100644 index 00000000..c3a4db3d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/text/align.snippet @@ -0,0 +1 @@ +text-align: ${1:left/right/center/justify};$0 diff --git a/sources_non_forked/snipmate-snippets/css/text/decoration.snippet b/sources_non_forked/snipmate-snippets/css/text/decoration.snippet new file mode 100644 index 00000000..1af58ee1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/text/decoration.snippet @@ -0,0 +1 @@ +text-decoration: ${1:none/underline/overline/line-through/blink};$0 diff --git a/sources_non_forked/snipmate-snippets/css/text/indent.snippet b/sources_non_forked/snipmate-snippets/css/text/indent.snippet new file mode 100644 index 00000000..2dac54b8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/text/indent.snippet @@ -0,0 +1 @@ +text-indent: ${1:10}px;$0 diff --git a/sources_non_forked/snipmate-snippets/css/text/shadow_hex.snippet b/sources_non_forked/snipmate-snippets/css/text/shadow_hex.snippet new file mode 100644 index 00000000..f6559e43 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/text/shadow_hex.snippet @@ -0,0 +1 @@ +text-shadow: #${1:DDD} ${2:10px} ${3:10px} ${4:2px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/text/shadow_none.snippet b/sources_non_forked/snipmate-snippets/css/text/shadow_none.snippet new file mode 100644 index 00000000..57a9eb36 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/text/shadow_none.snippet @@ -0,0 +1 @@ +text-shadow: none;$0 diff --git a/sources_non_forked/snipmate-snippets/css/text/shadow_rgb.snippet b/sources_non_forked/snipmate-snippets/css/text/shadow_rgb.snippet new file mode 100644 index 00000000..9b5eacbd --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/text/shadow_rgb.snippet @@ -0,0 +1 @@ +text-shadow: rgb(${1:255},${2:255},${3:255}) ${4:10px} ${5:10px} ${6:2px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/text/transform.snippet b/sources_non_forked/snipmate-snippets/css/text/transform.snippet new file mode 100644 index 00000000..e5cec4cd --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/text/transform.snippet @@ -0,0 +1 @@ +text-transform: ${1:capitalize/uppercase/lowercase};$0 diff --git a/sources_non_forked/snipmate-snippets/css/text/transform_none.snippet b/sources_non_forked/snipmate-snippets/css/text/transform_none.snippet new file mode 100644 index 00000000..86180476 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/text/transform_none.snippet @@ -0,0 +1 @@ +text-transform: none;$0 diff --git a/sources_non_forked/snipmate-snippets/css/vertical.snippet b/sources_non_forked/snipmate-snippets/css/vertical.snippet new file mode 100644 index 00000000..5f76ac1a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/vertical.snippet @@ -0,0 +1 @@ +vertical-align: ${1:baseline/sub/super/top/text-top/middle/bottom/text-bottom/length/%};$0 diff --git a/sources_non_forked/snipmate-snippets/css/visibility.snippet b/sources_non_forked/snipmate-snippets/css/visibility.snippet new file mode 100644 index 00000000..5f76ac1a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/visibility.snippet @@ -0,0 +1 @@ +vertical-align: ${1:baseline/sub/super/top/text-top/middle/bottom/text-bottom/length/%};$0 diff --git a/sources_non_forked/snipmate-snippets/css/white.snippet b/sources_non_forked/snipmate-snippets/css/white.snippet new file mode 100644 index 00000000..066260af --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/white.snippet @@ -0,0 +1 @@ +white-space: ${1:normal/pre/nowrap};$0 diff --git a/sources_non_forked/snipmate-snippets/css/word/spacing_length.snippet b/sources_non_forked/snipmate-snippets/css/word/spacing_length.snippet new file mode 100644 index 00000000..647ea3eb --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/word/spacing_length.snippet @@ -0,0 +1 @@ +word-spacing: ${1:10px};$0 diff --git a/sources_non_forked/snipmate-snippets/css/word/spacing_normal.snippet b/sources_non_forked/snipmate-snippets/css/word/spacing_normal.snippet new file mode 100644 index 00000000..94615515 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/word/spacing_normal.snippet @@ -0,0 +1 @@ +word-spacing: normal;$0 diff --git a/sources_non_forked/snipmate-snippets/css/z.snippet b/sources_non_forked/snipmate-snippets/css/z.snippet new file mode 100644 index 00000000..fd19d5f6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/css/z.snippet @@ -0,0 +1 @@ +z-index: $1;$0 diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/conf.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/conf.snippet new file mode 100644 index 00000000..bf4aff3d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/conf.snippet @@ -0,0 +1,3 @@ +<% content_for :${1:yield_label_in_layout} do -%> + ${2} +<% end -%> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/cs.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/cs.snippet new file mode 100644 index 00000000..f8fa9097 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/cs.snippet @@ -0,0 +1 @@ +<%= collection_select <+object+>, <+method+>, <+collection+>, <+value_method+>, <+text_method+><+, <+[options]+>, <+[html_options]+>+> %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/ct.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/ct.snippet new file mode 100644 index 00000000..c31743e4 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/ct.snippet @@ -0,0 +1 @@ +<%= content_tag '${1:DIV}', ${2:content}${3:,options} -%> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/end.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/end.snippet new file mode 100644 index 00000000..4c79184d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/end.snippet @@ -0,0 +1 @@ +<% end -%> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/ff.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/ff.snippet new file mode 100644 index 00000000..bb12f6d7 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/ff.snippet @@ -0,0 +1,3 @@ +<% form_for @${1:model} do |f| -%> + ${2} +<% end -%> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/ffcb.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/ffcb.snippet new file mode 100644 index 00000000..46feff86 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/ffcb.snippet @@ -0,0 +1 @@ +<%= ${1:f}.check_box :${2:attribute} %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/ffe.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/ffe.snippet new file mode 100644 index 00000000..bafdc111 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/ffe.snippet @@ -0,0 +1,5 @@ +<% error_messages_for :${1:model} -%> + +<% form_for @${2:model} do |f| -%> + ${3} +<% end -%> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/ffff.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/ffff.snippet new file mode 100644 index 00000000..7db85a21 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/ffff.snippet @@ -0,0 +1 @@ +<%= ${1:f}.file_field :${2:attribute} %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/ffhf.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/ffhf.snippet new file mode 100644 index 00000000..81f9dec6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/ffhf.snippet @@ -0,0 +1 @@ +<%= ${1:f}.hidden_field :${2:attribute} %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/ffl.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/ffl.snippet new file mode 100644 index 00000000..c0bdcee1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/ffl.snippet @@ -0,0 +1 @@ +<%= ${1:f}.label :${2:attribute}, '${3:$2}' %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/ffpf.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/ffpf.snippet new file mode 100644 index 00000000..3b579a36 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/ffpf.snippet @@ -0,0 +1 @@ +<%= ${1:f}.password_field :${2:attribute} %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/ffrb.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/ffrb.snippet new file mode 100644 index 00000000..d63f0a54 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/ffrb.snippet @@ -0,0 +1 @@ +<%= ${1:f}.radio_button :${2:attribute}, :${3:tag_value} %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/ffs.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/ffs.snippet new file mode 100644 index 00000000..d0851db9 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/ffs.snippet @@ -0,0 +1 @@ +<%= ${1:f}.submit "${2:submit}" %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/ffta.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/ffta.snippet new file mode 100644 index 00000000..9057483e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/ffta.snippet @@ -0,0 +1 @@ +<%= ${1:f}.text_area :${2:attribute} %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/fftf.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/fftf.snippet new file mode 100644 index 00000000..83d1add5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/fftf.snippet @@ -0,0 +1 @@ +<%= ${1:f}.text_field :${2:attribute} %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/fields.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/fields.snippet new file mode 100644 index 00000000..e936bd33 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/fields.snippet @@ -0,0 +1,3 @@ +<% fields_for :${1:model}, @$1 do |${2:f}| -%> + ${3} +<% end -%> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/for.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/for.snippet new file mode 100644 index 00000000..30da5608 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/for.snippet @@ -0,0 +1,3 @@ +<% for ${2:item} in ${1:list} -%> + ${3} +<% end -%> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/ft.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/ft.snippet new file mode 100644 index 00000000..5ff2f439 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/ft.snippet @@ -0,0 +1,3 @@ +<% form_tag(<+:action => "<+update+>"+><+, {:<+class+> => "<+form+>"}+>) do -%> + <++> +<% end -%> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/i18.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/i18.snippet new file mode 100644 index 00000000..2a30fae0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/i18.snippet @@ -0,0 +1 @@ +I18n.t('${1:type.key}')${2} diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/it.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/it.snippet new file mode 100644 index 00000000..e15196e4 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/it.snippet @@ -0,0 +1 @@ +<%= image_tag "${1}"${2} %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/jit.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/jit.snippet new file mode 100644 index 00000000..e05213a0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/jit.snippet @@ -0,0 +1 @@ +<%= javascript_include_tag <+:all+><+, :cache => <+true+>+> %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/jsit.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/jsit.snippet new file mode 100644 index 00000000..187e9ab3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/jsit.snippet @@ -0,0 +1 @@ +<%= javascript_include_tag "${1}" %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/lia.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/lia.snippet new file mode 100644 index 00000000..2732e6e0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/lia.snippet @@ -0,0 +1 @@ +<%= link_to "${1:link text}", :action => "${2:index}" %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/liai.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/liai.snippet new file mode 100644 index 00000000..30b703ce --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/liai.snippet @@ -0,0 +1 @@ +<%= link_to "<+link text+>", :action => "<+edit+>", :id => <+@<+item+>+> %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/lic.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/lic.snippet new file mode 100644 index 00000000..f8d5b953 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/lic.snippet @@ -0,0 +1 @@ +<%= link_to "${1:link text}", :controller => "${2:items}" %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/lica.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/lica.snippet new file mode 100644 index 00000000..d9aae5f1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/lica.snippet @@ -0,0 +1 @@ +<%= link_to "${1:link text}", :controller => "${2:items}", :action => "${3:index}" %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/licai.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/licai.snippet new file mode 100644 index 00000000..79f7ee0b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/licai.snippet @@ -0,0 +1 @@ +<%= link_to "<+link text+>", :controller => "<+items+>", :action => "<+edit+>", :id => <+@<+item+>+> %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/lim.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/lim.snippet new file mode 100644 index 00000000..7c1e04d9 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/lim.snippet @@ -0,0 +1 @@ +<%= link_to <+model+>.<+name+>, <+<+model+>_path(<+model+>)+> %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/linp.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/linp.snippet new file mode 100644 index 00000000..939ecc76 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/linp.snippet @@ -0,0 +1 @@ +<%= link_to <+"<+link text+>"+>, <+<+parent+>_<+child+>_path(<+@+><+parent+>, <+@+><+child+>)+> %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/linpp.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/linpp.snippet new file mode 100644 index 00000000..a5eacfec --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/linpp.snippet @@ -0,0 +1 @@ +<%= link_to <+"<+link text+>"+>, <+<+parent+>_<+child+>_path(<+@+><+parent+>)+> %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/lip.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/lip.snippet new file mode 100644 index 00000000..d09eb1f7 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/lip.snippet @@ -0,0 +1 @@ +<%= link_to <+"<+link text+>"+>, <+<+model+>_path(<+@+><+instance+>)+> %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/lipp.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/lipp.snippet new file mode 100644 index 00000000..56a653e1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/lipp.snippet @@ -0,0 +1 @@ +<%= link_to <+"<+link text+>"+>, <+<+model+>s_path+> %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/lt.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/lt.snippet new file mode 100644 index 00000000..b6c9a5bf --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/lt.snippet @@ -0,0 +1 @@ +<%= link_to "${1:name}", ${2:dest} %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/ofcfs.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/ofcfs.snippet new file mode 100644 index 00000000..264de82a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/ofcfs.snippet @@ -0,0 +1 @@ +<%= options_from_collection_for_select <+collection+>, <+value_method+>, <+text_method+><+, <+[selected_value]+>+> %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/rf.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/rf.snippet new file mode 100644 index 00000000..16067e97 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/rf.snippet @@ -0,0 +1 @@ +<%= render :file => "${1:file}"${2} %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/rp.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/rp.snippet new file mode 100644 index 00000000..706a4cb3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/rp.snippet @@ -0,0 +1 @@ +<%= render :partial => "${1:file}"${2} %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/rt.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/rt.snippet new file mode 100644 index 00000000..75a8f931 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/rt.snippet @@ -0,0 +1 @@ +<%= render :template => "${1:file}"${2} %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/slt.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/slt.snippet new file mode 100644 index 00000000..dae49dc8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/slt.snippet @@ -0,0 +1 @@ +<%= stylesheet_link_tag <+:all+><+, :cache => <+true+>+> %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/sslt.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/sslt.snippet new file mode 100644 index 00000000..1fd0f68e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/sslt.snippet @@ -0,0 +1 @@ +<%= stylesheet_link_tag "${1}" %> diff --git a/sources_non_forked/snipmate-snippets/eruby-rails/st.snippet b/sources_non_forked/snipmate-snippets/eruby-rails/st.snippet new file mode 100644 index 00000000..a6538f98 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby-rails/st.snippet @@ -0,0 +1 @@ +<%= submit_tag "<+Save changes+>"<+, :id => "<+submit+>"+><+, :name => "<+submit+>"+><+, :class => "<+form_name+>"+><+, :disabled => <+false+>+><+, :disable_with => "<+Please wait+>"+> %> diff --git a/sources_non_forked/snipmate-snippets/eruby/if.snippet b/sources_non_forked/snipmate-snippets/eruby/if.snippet new file mode 100644 index 00000000..cc6d87cf --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby/if.snippet @@ -0,0 +1,3 @@ +<% if ${1:condition} %> + ${2} +<% end %> diff --git a/sources_non_forked/snipmate-snippets/eruby/ife.snippet b/sources_non_forked/snipmate-snippets/eruby/ife.snippet new file mode 100644 index 00000000..fff2996e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby/ife.snippet @@ -0,0 +1,4 @@ +<% if ${1} %> + ${2} +<% else %> +<% end %> diff --git a/sources_non_forked/snipmate-snippets/eruby/unless.snippet b/sources_non_forked/snipmate-snippets/eruby/unless.snippet new file mode 100644 index 00000000..4e7e3d7e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby/unless.snippet @@ -0,0 +1,3 @@ +<% unless ${1} %> + ${2} +<% end %> diff --git a/sources_non_forked/snipmate-snippets/eruby/unlesse.snippet b/sources_non_forked/snipmate-snippets/eruby/unlesse.snippet new file mode 100644 index 00000000..6f447394 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/eruby/unlesse.snippet @@ -0,0 +1,4 @@ +<% unless ${1} %> + ${2} +<% else %> +<% end %> diff --git a/sources_non_forked/snipmate-snippets/haml/conf.snippet b/sources_non_forked/snipmate-snippets/haml/conf.snippet new file mode 100644 index 00000000..a4723cd8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/conf.snippet @@ -0,0 +1,3 @@ +-content_for :${1:yield_label_in_layout} do + ${2} + diff --git a/sources_non_forked/snipmate-snippets/haml/cs.snippet b/sources_non_forked/snipmate-snippets/haml/cs.snippet new file mode 100644 index 00000000..8dfa8d46 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/cs.snippet @@ -0,0 +1 @@ +=collection_select :${1:object}, :${2:method}, :${3:collection}, :${4:value_method}, :${5:text_method} ${6:, [options]} ${7:, [html_options]} diff --git a/sources_non_forked/snipmate-snippets/haml/ff.snippet b/sources_non_forked/snipmate-snippets/haml/ff.snippet new file mode 100644 index 00000000..aeb7fbe9 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/ff.snippet @@ -0,0 +1,2 @@ +-form_for @${1:model} do |f| + ${2} diff --git a/sources_non_forked/snipmate-snippets/haml/ffcb.snippet b/sources_non_forked/snipmate-snippets/haml/ffcb.snippet new file mode 100644 index 00000000..b042ca9f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/ffcb.snippet @@ -0,0 +1 @@ +=f.check_box :${1:attribute} diff --git a/sources_non_forked/snipmate-snippets/haml/ffe.snippet b/sources_non_forked/snipmate-snippets/haml/ffe.snippet new file mode 100644 index 00000000..633bca1e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/ffe.snippet @@ -0,0 +1,4 @@ +=error_messages_for :${1:model} + +-form_for @${2:model} do |f| + ${3} diff --git a/sources_non_forked/snipmate-snippets/haml/ffff.snippet b/sources_non_forked/snipmate-snippets/haml/ffff.snippet new file mode 100644 index 00000000..fb86c2f5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/ffff.snippet @@ -0,0 +1 @@ +=f.file_field :${1:attribute} diff --git a/sources_non_forked/snipmate-snippets/haml/ffhf.snippet b/sources_non_forked/snipmate-snippets/haml/ffhf.snippet new file mode 100644 index 00000000..06cd91e9 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/ffhf.snippet @@ -0,0 +1 @@ +=f.hidden_field :${1:attribute} diff --git a/sources_non_forked/snipmate-snippets/haml/ffl.snippet b/sources_non_forked/snipmate-snippets/haml/ffl.snippet new file mode 100644 index 00000000..c51d49e3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/ffl.snippet @@ -0,0 +1 @@ +=f.label :${1:attribute} diff --git a/sources_non_forked/snipmate-snippets/haml/ffpf.snippet b/sources_non_forked/snipmate-snippets/haml/ffpf.snippet new file mode 100644 index 00000000..f200dc45 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/ffpf.snippet @@ -0,0 +1 @@ +=f.password_field :${1:attribute} diff --git a/sources_non_forked/snipmate-snippets/haml/ffrb.snippet b/sources_non_forked/snipmate-snippets/haml/ffrb.snippet new file mode 100644 index 00000000..a6c3ffe6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/ffrb.snippet @@ -0,0 +1 @@ +=f.radio_button :${1:attribute}, :${2:tag_value} diff --git a/sources_non_forked/snipmate-snippets/haml/ffs.snippet b/sources_non_forked/snipmate-snippets/haml/ffs.snippet new file mode 100644 index 00000000..8489ac46 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/ffs.snippet @@ -0,0 +1 @@ +=f.submit "<+Submit+>"<+, :disable_with => '<+Submitting+>'+> diff --git a/sources_non_forked/snipmate-snippets/haml/ffta.snippet b/sources_non_forked/snipmate-snippets/haml/ffta.snippet new file mode 100644 index 00000000..df891241 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/ffta.snippet @@ -0,0 +1 @@ +=f.text_area :${1:attribute} diff --git a/sources_non_forked/snipmate-snippets/haml/fftf.snippet b/sources_non_forked/snipmate-snippets/haml/fftf.snippet new file mode 100644 index 00000000..80b4bd9a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/fftf.snippet @@ -0,0 +1 @@ +=f.text_field :${1:attribute} diff --git a/sources_non_forked/snipmate-snippets/haml/fields.snippet b/sources_non_forked/snipmate-snippets/haml/fields.snippet new file mode 100644 index 00000000..e9c9b200 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/fields.snippet @@ -0,0 +1,2 @@ +-fields_for :${1:model}, @$1 do |${2:f}| + ${3} diff --git a/sources_non_forked/snipmate-snippets/haml/for.snippet b/sources_non_forked/snipmate-snippets/haml/for.snippet new file mode 100644 index 00000000..40de6487 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/for.snippet @@ -0,0 +1,6 @@ +-if !${1:list}.blank? + -for ${2:item} in $1 + ${3} +-else + ${4} + diff --git a/sources_non_forked/snipmate-snippets/haml/ft.snippet b/sources_non_forked/snipmate-snippets/haml/ft.snippet new file mode 100644 index 00000000..5a051d93 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/ft.snippet @@ -0,0 +1,2 @@ +-form_tag(<+:action => "<+update+>"+><+, {:<+class+> => "<+form+>"}+>) do + <++> diff --git a/sources_non_forked/snipmate-snippets/haml/if.snippet b/sources_non_forked/snipmate-snippets/haml/if.snippet new file mode 100644 index 00000000..d1e38b7f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/if.snippet @@ -0,0 +1,2 @@ +-if ${1} + ${2} diff --git a/sources_non_forked/snipmate-snippets/haml/ife.snippet b/sources_non_forked/snipmate-snippets/haml/ife.snippet new file mode 100644 index 00000000..b8d12d8d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/ife.snippet @@ -0,0 +1,4 @@ +-if ${1} + ${2} +-else + diff --git a/sources_non_forked/snipmate-snippets/haml/it.snippet b/sources_non_forked/snipmate-snippets/haml/it.snippet new file mode 100644 index 00000000..9e15a59c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/it.snippet @@ -0,0 +1 @@ +=image_tag "${1}" diff --git a/sources_non_forked/snipmate-snippets/haml/jit.snippet b/sources_non_forked/snipmate-snippets/haml/jit.snippet new file mode 100644 index 00000000..af6edd24 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/jit.snippet @@ -0,0 +1 @@ +=javascript_include_tag <+:all+><+, :cache => <+true+>+> diff --git a/sources_non_forked/snipmate-snippets/haml/jsit.snippet b/sources_non_forked/snipmate-snippets/haml/jsit.snippet new file mode 100644 index 00000000..ea4d2fda --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/jsit.snippet @@ -0,0 +1 @@ +=javascript_include_tag "${1}" diff --git a/sources_non_forked/snipmate-snippets/haml/lia.snippet b/sources_non_forked/snipmate-snippets/haml/lia.snippet new file mode 100644 index 00000000..9fa23dfc --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/lia.snippet @@ -0,0 +1 @@ +=link_to "${1:link text}", :action => "${2:index}" diff --git a/sources_non_forked/snipmate-snippets/haml/liai.snippet b/sources_non_forked/snipmate-snippets/haml/liai.snippet new file mode 100644 index 00000000..bd4f8510 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/liai.snippet @@ -0,0 +1 @@ +=link_to "<+link text+>", :action => "<+edit+>", :id => <+@<+item+>+> diff --git a/sources_non_forked/snipmate-snippets/haml/lic.snippet b/sources_non_forked/snipmate-snippets/haml/lic.snippet new file mode 100644 index 00000000..9c642265 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/lic.snippet @@ -0,0 +1 @@ +=link_to "${1:link text}", :controller => "${2:items}" diff --git a/sources_non_forked/snipmate-snippets/haml/lica.snippet b/sources_non_forked/snipmate-snippets/haml/lica.snippet new file mode 100644 index 00000000..67e9bc0c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/lica.snippet @@ -0,0 +1 @@ +=link_to "${1:link text}", :controller => "${2:items}", :action => "${3:index}" diff --git a/sources_non_forked/snipmate-snippets/haml/licai.snippet b/sources_non_forked/snipmate-snippets/haml/licai.snippet new file mode 100644 index 00000000..58b65837 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/licai.snippet @@ -0,0 +1 @@ +=link_to "<+link text+>", :controller => "<+items+>", :action => "<+edit+>", :id => <+@<+item+>+> diff --git a/sources_non_forked/snipmate-snippets/haml/lim.snippet b/sources_non_forked/snipmate-snippets/haml/lim.snippet new file mode 100644 index 00000000..25821e4d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/lim.snippet @@ -0,0 +1 @@ +=link_to <+model+>.<+name+>, <+<+model+>_path(<+model+>)+> diff --git a/sources_non_forked/snipmate-snippets/haml/linp.snippet b/sources_non_forked/snipmate-snippets/haml/linp.snippet new file mode 100644 index 00000000..4fdfab6c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/linp.snippet @@ -0,0 +1 @@ +=link_to <+"<+link text+>"+>, <+<+parent+>_<+child+>_path(<+@+><+parent+>, <+@+><+child+>)+> diff --git a/sources_non_forked/snipmate-snippets/haml/linpp.snippet b/sources_non_forked/snipmate-snippets/haml/linpp.snippet new file mode 100644 index 00000000..0f987725 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/linpp.snippet @@ -0,0 +1 @@ +=link_to <+"<+link text+>"+>, <+<+parent+>_<+child+>_path(<+@+><+parent+>)+> diff --git a/sources_non_forked/snipmate-snippets/haml/lip.snippet b/sources_non_forked/snipmate-snippets/haml/lip.snippet new file mode 100644 index 00000000..d882c5df --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/lip.snippet @@ -0,0 +1 @@ +=link_to <+"<+link text+>"+>, <+<+model+>_path(<+@+><+instance+>)+> diff --git a/sources_non_forked/snipmate-snippets/haml/lipp.snippet b/sources_non_forked/snipmate-snippets/haml/lipp.snippet new file mode 100644 index 00000000..7484b24b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/lipp.snippet @@ -0,0 +1 @@ +=link_to <+"<+link text+>"+>, <+<+model+>s_path+> diff --git a/sources_non_forked/snipmate-snippets/haml/lt.snippet b/sources_non_forked/snipmate-snippets/haml/lt.snippet new file mode 100644 index 00000000..d66cd763 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/lt.snippet @@ -0,0 +1 @@ +=link_to "${1}", ${2:dest} diff --git a/sources_non_forked/snipmate-snippets/haml/ofcfs.snippet b/sources_non_forked/snipmate-snippets/haml/ofcfs.snippet new file mode 100644 index 00000000..7d607129 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/ofcfs.snippet @@ -0,0 +1 @@ +=options_from_collection_for_select <+collection+>, <+value_method+>, <+text_method+><+, <+[selected_value]+>+> diff --git a/sources_non_forked/snipmate-snippets/haml/rf.snippet b/sources_non_forked/snipmate-snippets/haml/rf.snippet new file mode 100644 index 00000000..5758eb43 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/rf.snippet @@ -0,0 +1 @@ +=render :file => "${1:file}"${2} diff --git a/sources_non_forked/snipmate-snippets/haml/rp.snippet b/sources_non_forked/snipmate-snippets/haml/rp.snippet new file mode 100644 index 00000000..038225eb --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/rp.snippet @@ -0,0 +1 @@ +=render :partial => "${1:file}"${2} diff --git a/sources_non_forked/snipmate-snippets/haml/rt.snippet b/sources_non_forked/snipmate-snippets/haml/rt.snippet new file mode 100644 index 00000000..5d3d2ffa --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/rt.snippet @@ -0,0 +1 @@ +=render :template => "${1:file}"${2} diff --git a/sources_non_forked/snipmate-snippets/haml/slt.snippet b/sources_non_forked/snipmate-snippets/haml/slt.snippet new file mode 100644 index 00000000..294405ac --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/slt.snippet @@ -0,0 +1 @@ +=stylesheet_link_tag <+:all+><+, :cache => <+true+>+> diff --git a/sources_non_forked/snipmate-snippets/haml/sslt.snippet b/sources_non_forked/snipmate-snippets/haml/sslt.snippet new file mode 100644 index 00000000..1597d2f8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/sslt.snippet @@ -0,0 +1 @@ +=stylesheet_link_tag "${1}" diff --git a/sources_non_forked/snipmate-snippets/haml/st.snippet b/sources_non_forked/snipmate-snippets/haml/st.snippet new file mode 100644 index 00000000..60a889ea --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/st.snippet @@ -0,0 +1 @@ +=submit_tag "<+Save changes+>"<+, :id => "<+submit+>"+><+, :name => "<+submit+>"+><+, :class => "<+form_name+>"+><+, :disabled => <+false+>+><+, :disable_with => "<+Please wait+>"+> diff --git a/sources_non_forked/snipmate-snippets/haml/unless.snippet b/sources_non_forked/snipmate-snippets/haml/unless.snippet new file mode 100644 index 00000000..2e521039 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/unless.snippet @@ -0,0 +1,3 @@ +-unless ${1} + ${2} + diff --git a/sources_non_forked/snipmate-snippets/haml/unlesse.snippet b/sources_non_forked/snipmate-snippets/haml/unlesse.snippet new file mode 100644 index 00000000..b8d12d8d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/haml/unlesse.snippet @@ -0,0 +1,4 @@ +-if ${1} + ${2} +-else + diff --git a/sources_non_forked/snipmate-snippets/html/base.snippet b/sources_non_forked/snipmate-snippets/html/base.snippet new file mode 100644 index 00000000..0e273e23 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/base.snippet @@ -0,0 +1 @@ +/> diff --git a/sources_non_forked/snipmate-snippets/html/body.snippet b/sources_non_forked/snipmate-snippets/html/body.snippet new file mode 100644 index 00000000..692403d3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/body.snippet @@ -0,0 +1,3 @@ + + ${2} + diff --git a/sources_non_forked/snipmate-snippets/html/div.snippet b/sources_non_forked/snipmate-snippets/html/div.snippet new file mode 100644 index 00000000..1ee10bf6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/div.snippet @@ -0,0 +1,3 @@ +
            + ${2} +
            diff --git a/sources_non_forked/snipmate-snippets/html/doctype.snippet b/sources_non_forked/snipmate-snippets/html/doctype.snippet new file mode 100644 index 00000000..8d98d406 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/doctype.snippet @@ -0,0 +1 @@ +${1} diff --git a/sources_non_forked/snipmate-snippets/html/form.snippet b/sources_non_forked/snipmate-snippets/html/form.snippet new file mode 100644 index 00000000..6fa8a22d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/form.snippet @@ -0,0 +1,5 @@ +
            + ${3} + +

            +
            diff --git a/sources_non_forked/snipmate-snippets/html/h1.snippet b/sources_non_forked/snipmate-snippets/html/h1.snippet new file mode 100644 index 00000000..21e88b80 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/h1.snippet @@ -0,0 +1 @@ +

            ${2}

            diff --git a/sources_non_forked/snipmate-snippets/html/head.snippet b/sources_non_forked/snipmate-snippets/html/head.snippet new file mode 100644 index 00000000..81af7f88 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/head.snippet @@ -0,0 +1,5 @@ + + + ${1:Page Title} + ${2} + diff --git a/sources_non_forked/snipmate-snippets/html/href.snippet b/sources_non_forked/snipmate-snippets/html/href.snippet new file mode 100644 index 00000000..0b744a04 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/href.snippet @@ -0,0 +1 @@ +${2} diff --git a/sources_non_forked/snipmate-snippets/html/ifie.snippet b/sources_non_forked/snipmate-snippets/html/ifie.snippet new file mode 100644 index 00000000..abb68f50 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/ifie.snippet @@ -0,0 +1 @@ +${3} diff --git a/sources_non_forked/snipmate-snippets/html/img.snippet b/sources_non_forked/snipmate-snippets/html/img.snippet new file mode 100644 index 00000000..ba32a242 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/img.snippet @@ -0,0 +1 @@ + diff --git a/sources_non_forked/snipmate-snippets/html/input.snippet b/sources_non_forked/snipmate-snippets/html/input.snippet new file mode 100644 index 00000000..a8814b28 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/input.snippet @@ -0,0 +1 @@ +${5} diff --git a/sources_non_forked/snipmate-snippets/html/inputl.snippet b/sources_non_forked/snipmate-snippets/html/inputl.snippet new file mode 100644 index 00000000..4efe9945 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/inputl.snippet @@ -0,0 +1,2 @@ + +${7} diff --git a/sources_non_forked/snipmate-snippets/html/label.snippet b/sources_non_forked/snipmate-snippets/html/label.snippet new file mode 100644 index 00000000..c32b6f74 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/label.snippet @@ -0,0 +1 @@ + diff --git a/sources_non_forked/snipmate-snippets/html/link.snippet b/sources_non_forked/snipmate-snippets/html/link.snippet new file mode 100644 index 00000000..42dd1c6b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/link.snippet @@ -0,0 +1 @@ +${5} diff --git a/sources_non_forked/snipmate-snippets/html/mailto.snippet b/sources_non_forked/snipmate-snippets/html/mailto.snippet new file mode 100644 index 00000000..2538ab0f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/mailto.snippet @@ -0,0 +1 @@ +<+email me+> diff --git a/sources_non_forked/snipmate-snippets/html/meta.snippet b/sources_non_forked/snipmate-snippets/html/meta.snippet new file mode 100644 index 00000000..e0319b09 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/meta.snippet @@ -0,0 +1 @@ + diff --git a/sources_non_forked/snipmate-snippets/html/option.snippet b/sources_non_forked/snipmate-snippets/html/option.snippet new file mode 100644 index 00000000..b7383d0e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/option.snippet @@ -0,0 +1 @@ + diff --git a/sources_non_forked/snipmate-snippets/html/script/include_script.snippet b/sources_non_forked/snipmate-snippets/html/script/include_script.snippet new file mode 100644 index 00000000..dd35e4be --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/script/include_script.snippet @@ -0,0 +1 @@ +${2} diff --git a/sources_non_forked/snipmate-snippets/html/script/inline_script.snippet b/sources_non_forked/snipmate-snippets/html/script/inline_script.snippet new file mode 100644 index 00000000..35e078b3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/script/inline_script.snippet @@ -0,0 +1,5 @@ + diff --git a/sources_non_forked/snipmate-snippets/html/select.snippet b/sources_non_forked/snipmate-snippets/html/select.snippet new file mode 100644 index 00000000..252e3f77 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/select.snippet @@ -0,0 +1,3 @@ + diff --git a/sources_non_forked/snipmate-snippets/html/skel/basic.snippet b/sources_non_forked/snipmate-snippets/html/skel/basic.snippet new file mode 100644 index 00000000..61ec2444 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/skel/basic.snippet @@ -0,0 +1,13 @@ + + + + + ${1:Page Title} + + + + + ${2} + + diff --git a/sources_non_forked/snipmate-snippets/html/skel/basic_with_meta.snippet b/sources_non_forked/snipmate-snippets/html/skel/basic_with_meta.snippet new file mode 100644 index 00000000..b6de9f8d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/skel/basic_with_meta.snippet @@ -0,0 +1,15 @@ + + + + + ${1:Page Title} + + + + + + + ${2} + + diff --git a/sources_non_forked/snipmate-snippets/html/style.snippet b/sources_non_forked/snipmate-snippets/html/style.snippet new file mode 100644 index 00000000..26ae0fe9 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/style.snippet @@ -0,0 +1,3 @@ + diff --git a/sources_non_forked/snipmate-snippets/html/t.snippet b/sources_non_forked/snipmate-snippets/html/t.snippet new file mode 100644 index 00000000..ef504276 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/t.snippet @@ -0,0 +1,3 @@ +<${1:div}${2}> + ${3} +${4} diff --git a/sources_non_forked/snipmate-snippets/html/table/basic.snippet b/sources_non_forked/snipmate-snippets/html/table/basic.snippet new file mode 100644 index 00000000..2100d13d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/table/basic.snippet @@ -0,0 +1,3 @@ + + ${2} +
            diff --git a/sources_non_forked/snipmate-snippets/html/table/hardcore.snippet b/sources_non_forked/snipmate-snippets/html/table/hardcore.snippet new file mode 100644 index 00000000..35fa01ae --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/table/hardcore.snippet @@ -0,0 +1,9 @@ ++>> + + <++> + + + + + + diff --git a/sources_non_forked/snipmate-snippets/html/textarea.snippet b/sources_non_forked/snipmate-snippets/html/textarea.snippet new file mode 100644 index 00000000..0b3fb84b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/html/textarea.snippet @@ -0,0 +1 @@ + diff --git a/sources_non_forked/snipmate-snippets/java/class/basic+constructor+main.snippet b/sources_non_forked/snipmate-snippets/java/class/basic+constructor+main.snippet new file mode 100644 index 00000000..3bd770e2 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/java/class/basic+constructor+main.snippet @@ -0,0 +1,17 @@ +/** + * class $2 + * @author ${4:`g:snips_author`} + */ +${1:public} class ${2:`Snippet_JavaClassNameFromFilename()`}${3} { + + /** + * Constructor for $2 + */ + public $2(${4}) { + ${5} + } + + public static void main(String args[]) { + } + +} diff --git a/sources_non_forked/snipmate-snippets/java/class/basic+constructor.snippet b/sources_non_forked/snipmate-snippets/java/class/basic+constructor.snippet new file mode 100644 index 00000000..05eabefa --- /dev/null +++ b/sources_non_forked/snipmate-snippets/java/class/basic+constructor.snippet @@ -0,0 +1,14 @@ +/** + * class $2 + * @author ${4:`g:snips_author`} + */ +${1:public} class ${2:`Snippet_JavaClassNameFromFilename()`}${3} { + + /** + * Constructor for $2 + */ + public $2(${5}){ + ${6} + } + +} diff --git a/sources_non_forked/snipmate-snippets/java/class/basic.snippet b/sources_non_forked/snipmate-snippets/java/class/basic.snippet new file mode 100644 index 00000000..05eabefa --- /dev/null +++ b/sources_non_forked/snipmate-snippets/java/class/basic.snippet @@ -0,0 +1,14 @@ +/** + * class $2 + * @author ${4:`g:snips_author`} + */ +${1:public} class ${2:`Snippet_JavaClassNameFromFilename()`}${3} { + + /** + * Constructor for $2 + */ + public $2(${5}){ + ${6} + } + +} diff --git a/sources_non_forked/snipmate-snippets/java/for.snippet b/sources_non_forked/snipmate-snippets/java/for.snippet new file mode 100644 index 00000000..70a41086 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/java/for.snippet @@ -0,0 +1,3 @@ +for(${1:int i=0}; ${2:condition}; ${3:i++}){ + ${4} +} diff --git a/sources_non_forked/snipmate-snippets/java/gs.snippet b/sources_non_forked/snipmate-snippets/java/gs.snippet new file mode 100644 index 00000000..954a9a09 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/java/gs.snippet @@ -0,0 +1,9 @@ +//getter for $3 +public ${2:variable_type} get${1:VariableName}() { + return ${3:variableName}; +} + +//setter for $3 +public void set$1($2 $3) { + this.$3 = $3; +}${4} diff --git a/sources_non_forked/snipmate-snippets/java/if.snippet b/sources_non_forked/snipmate-snippets/java/if.snippet new file mode 100644 index 00000000..b9d1c5c3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/java/if.snippet @@ -0,0 +1,3 @@ +if(${1}){ + ${2} +} diff --git a/sources_non_forked/snipmate-snippets/java/ife.snippet b/sources_non_forked/snipmate-snippets/java/ife.snippet new file mode 100644 index 00000000..a7e43d09 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/java/ife.snippet @@ -0,0 +1,4 @@ +if(${1}){ + ${2} +}else{ +} diff --git a/sources_non_forked/snipmate-snippets/java/log.snippet b/sources_non_forked/snipmate-snippets/java/log.snippet new file mode 100644 index 00000000..abb7c7d6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/java/log.snippet @@ -0,0 +1 @@ +System.${1:out}.println(${2}); diff --git a/sources_non_forked/snipmate-snippets/java/m.snippet b/sources_non_forked/snipmate-snippets/java/m.snippet new file mode 100644 index 00000000..67bf3fb0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/java/m.snippet @@ -0,0 +1,8 @@ +/** + * ${7:Method Description} + * ${5} + * @return ${6} + */ +${1:public} ${2:void} ${3:methodName}(${4}) { + ${8} +} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/add.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/add.snippet new file mode 100644 index 00000000..3bf9756d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/add.snippet @@ -0,0 +1 @@ +${1:obj}.add('${2:selector expression}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/addClass.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/addClass.snippet new file mode 100644 index 00000000..68007744 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/addClass.snippet @@ -0,0 +1 @@ +${1:obj}.addClass('${2:class name}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/after.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/after.snippet new file mode 100644 index 00000000..34d1956d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/after.snippet @@ -0,0 +1 @@ +${1:obj}.after('${2:Some text and bold!}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/ajax.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/ajax.snippet new file mode 100644 index 00000000..5453a257 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/ajax.snippet @@ -0,0 +1,18 @@ +$.ajax({ + url: "${1:mydomain.com/url}", + type: "${2:POST}", + dataType: "${3:xml/html/script/json}", + data: $.param( $("${4:Element or Expression}") ), + + complete: function() { + ${5://called when complete} + }, + + success: function() { + ${6://called when successful} + }, + + error: function() { + ${7://called when there is an error} + }, +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxerror.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxerror.snippet new file mode 100644 index 00000000..0f8ccdaf --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxerror.snippet @@ -0,0 +1,4 @@ +.ajaxError(function(${1:request, settings}) { + ${2://stuff to do when an AJAX call returns an error}; +}); +${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxget.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxget.snippet new file mode 100644 index 00000000..1489859a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxget.snippet @@ -0,0 +1,3 @@ +$.get('${1:/test/ajax-test.xml}', function(xml){ + ${2:alert( ("title",xml).text() ) //optional stuff to do after get;} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxgetif.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxgetif.snippet new file mode 100644 index 00000000..0f4d1ef0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxgetif.snippet @@ -0,0 +1,3 @@ +$.getIfModified('${1:/test/test.cgi}', function(data){ + ${2:alert( "Data loaded: " + data ) //optional stuff to do after get;} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxpost.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxpost.snippet new file mode 100644 index 00000000..f62bf102 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxpost.snippet @@ -0,0 +1,5 @@ +$.post('<+/path/to/file.cgi+>',{ + <+<+param1+>: "<+value1+>", <+param2+>: "<+value2+>"+>}, + function(){ + <+//stuff to do after event occurs;+> +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxsend.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxsend.snippet new file mode 100644 index 00000000..4b74cd98 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxsend.snippet @@ -0,0 +1,4 @@ +.ajaxSend(function(${1:request, settings}) { + ${2://stuff to do when an AJAX call returns an error}; +}); +${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxsetup.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxsetup.snippet new file mode 100644 index 00000000..c5b4ad02 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxsetup.snippet @@ -0,0 +1,18 @@ +$.ajaxSetup({ + url: "${1:mydomain.com/url}", + type: "${2:POST}", + dataType: "${3:xml/html/script/json}", + data: $.param( $("${4:Element or Expression}") ), + + complete: function() { + ${5://called when complete} + }, + + success: function() { + ${6://called when successful} + }, + + error: function() { + ${7://called when there is an error} + }, +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxstart.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxstart.snippet new file mode 100644 index 00000000..3caafd58 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxstart.snippet @@ -0,0 +1,4 @@ +$.ajaxStart(function() { + ${1://stuff to do when an AJAX call is started and no other AJAX calls are in progress}; +}); +${2} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxstop.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxstop.snippet new file mode 100644 index 00000000..6088a9f5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxstop.snippet @@ -0,0 +1,4 @@ +$.ajaxStop(function() { + ${1://stuff to do when an AJAX call is started and no other AJAX calls are in progress}; +}); +${2} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxsuccess.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxsuccess.snippet new file mode 100644 index 00000000..ba2247dc --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/ajaxsuccess.snippet @@ -0,0 +1,4 @@ +$.ajaxSuccess(function() { + ${1://stuff to do when an AJAX call is started and no other AJAX calls are in progress}; +}); +${2} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/animate.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/animate.snippet new file mode 100644 index 00000000..19135327 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/animate.snippet @@ -0,0 +1 @@ +${1:obj}.animate({${2:param1: value1, param2: value2}}, ${3:speed})${4} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/append.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/append.snippet new file mode 100644 index 00000000..bc4ff4d3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/append.snippet @@ -0,0 +1 @@ +${1:obj}.append('${2:Some text and bold!}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/appendTo.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/appendTo.snippet new file mode 100644 index 00000000..97883710 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/appendTo.snippet @@ -0,0 +1 @@ +${1:obj}.appendTo('${2:selector expression}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/attr.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/attr.snippet new file mode 100644 index 00000000..fb7e2f42 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/attr.snippet @@ -0,0 +1 @@ +${1:obj}.attr('${2:attribute}', '${3:value}')${4} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/attrm.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/attrm.snippet new file mode 100644 index 00000000..15685512 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/attrm.snippet @@ -0,0 +1 @@ +${1:obj}.attr({'${2:attr1}': '${3:value1}', '${4:attr2}': '${5:value2}'})${6} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/before.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/before.snippet new file mode 100644 index 00000000..e12c4aed --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/before.snippet @@ -0,0 +1 @@ +${1:obj}.before('${2:Some text and bold!}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/bind.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/bind.snippet new file mode 100644 index 00000000..dda284d9 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/bind.snippet @@ -0,0 +1,3 @@ +${1:obj}.bind('${2:event name}', function(${3:event}) { + ${4:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/blur.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/blur.snippet new file mode 100644 index 00000000..674623db --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/blur.snippet @@ -0,0 +1,3 @@ +${1:obj}.blur(function() { + ${2:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/change.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/change.snippet new file mode 100644 index 00000000..184f8a99 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/change.snippet @@ -0,0 +1,3 @@ +${1:obj}.change(function() { + ${2:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/children.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/children.snippet new file mode 100644 index 00000000..2db688b1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/children.snippet @@ -0,0 +1 @@ +${1:obj}.children('${2:selector expression}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/click.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/click.snippet new file mode 100644 index 00000000..d17a047e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/click.snippet @@ -0,0 +1,3 @@ +${1:obj}.click(function() { + ${2:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/clone.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/clone.snippet new file mode 100644 index 00000000..83b0b421 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/clone.snippet @@ -0,0 +1 @@ +${1:obj}.clone()${2} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/contains.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/contains.snippet new file mode 100644 index 00000000..2a073948 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/contains.snippet @@ -0,0 +1 @@ +${1:obj}.contains('${2:text to find}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/css.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/css.snippet new file mode 100644 index 00000000..408199eb --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/css.snippet @@ -0,0 +1 @@ +${1:obj}.css('${2:attribute}', '${3:value}')${4} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/cssm.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/cssm.snippet new file mode 100644 index 00000000..7eebe1e4 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/cssm.snippet @@ -0,0 +1 @@ +${1:obj}.css({${2:attribute1}: '${3:value1}', ${4:attribute2}: '${5:value2}'})${6} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/dblclick.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/dblclick.snippet new file mode 100644 index 00000000..4b2d6b2a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/dblclick.snippet @@ -0,0 +1,3 @@ +${1:obj}.dblclick(function() { + ${2:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/each.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/each.snippet new file mode 100644 index 00000000..05beed2e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/each.snippet @@ -0,0 +1,3 @@ +${1:obj}.each(function(index) { + ${2:this.innerHTML = this + " is the element, " + index + " is the position";} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/el.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/el.snippet new file mode 100644 index 00000000..d2065238 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/el.snippet @@ -0,0 +1 @@ +$('${1}')${2:} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/eltrim.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/eltrim.snippet new file mode 100644 index 00000000..9cc0d692 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/eltrim.snippet @@ -0,0 +1 @@ +$.trim('${1:string}')${2} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/end.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/end.snippet new file mode 100644 index 00000000..293102c4 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/end.snippet @@ -0,0 +1 @@ +${1:obj}.end()${2} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/error.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/error.snippet new file mode 100644 index 00000000..23b0e650 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/error.snippet @@ -0,0 +1,3 @@ +${1:obj}.error(function() { + ${2:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/fadein.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/fadein.snippet new file mode 100644 index 00000000..549d8464 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/fadein.snippet @@ -0,0 +1 @@ +${1:obj}.fadeIn('${2:slow/400/fast}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/fadeinc.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/fadeinc.snippet new file mode 100644 index 00000000..9090853e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/fadeinc.snippet @@ -0,0 +1,3 @@ +${1:obj}.fadeIn('slow/400/fast', function() { + ${2://Stuff to do *after* the animation takes place}; +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/fadeout.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/fadeout.snippet new file mode 100644 index 00000000..24d6c763 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/fadeout.snippet @@ -0,0 +1 @@ +${1:obj}.fadeOut('${2:slow/400/fast}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/fadeoutc.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/fadeoutc.snippet new file mode 100644 index 00000000..76d54571 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/fadeoutc.snippet @@ -0,0 +1,3 @@ +${1:obj}.fadeOut('slow/400/fast', function() { + ${2://Stuff to do *after* the animation takes place}; +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/fadeto.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/fadeto.snippet new file mode 100644 index 00000000..b0e584aa --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/fadeto.snippet @@ -0,0 +1 @@ +${1:obj}.fadeTo('${2:slow/400/fast}', ${3:0.5})${4} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/fadetoc.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/fadetoc.snippet new file mode 100644 index 00000000..17243b4c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/fadetoc.snippet @@ -0,0 +1,3 @@ +${1:obj}.fadeTo('slow/400/fast', ${2:0.5}, function() { + ${3://Stuff to do *after* the animation takes place}; +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/filter.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/filter.snippet new file mode 100644 index 00000000..d33fdf2b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/filter.snippet @@ -0,0 +1 @@ +${1:obj}.filter('${2:selector expression}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/find.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/find.snippet new file mode 100644 index 00000000..1791e912 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/find.snippet @@ -0,0 +1 @@ +${1:obj}.find('${2:selector expression}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/focus.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/focus.snippet new file mode 100644 index 00000000..3b1b5719 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/focus.snippet @@ -0,0 +1,3 @@ +${1:obj}.focus(function() { + ${2:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/get.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/get.snippet new file mode 100644 index 00000000..4374c183 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/get.snippet @@ -0,0 +1 @@ +${1:obj}.get(${2:element index})${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/getjson.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/getjson.snippet new file mode 100644 index 00000000..518d676d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/getjson.snippet @@ -0,0 +1,5 @@ +$.getJSON('<+/path/to/file.cgi+>',{ + <+<+param1+>: "<+value1+>", <+param2+>: "<+value2+>"+>}, + function(json){ + <+//stuff to do after event occurs;+> +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/getscript.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/getscript.snippet new file mode 100644 index 00000000..0b62d90b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/getscript.snippet @@ -0,0 +1,3 @@ +$.getScript('${1:somescript.js}', function(){ + ${2://optional stuff to do after getScript;} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/height.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/height.snippet new file mode 100644 index 00000000..1515d5c6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/height.snippet @@ -0,0 +1 @@ +${1:obj}.height(${2:integer})${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/hide.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/hide.snippet new file mode 100644 index 00000000..c8071cbc --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/hide.snippet @@ -0,0 +1 @@ +${1:obj}.hide('${2:slow/400/fast}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/hidec.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/hidec.snippet new file mode 100644 index 00000000..62f2280a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/hidec.snippet @@ -0,0 +1,3 @@ +${1:obj}.hide('${2:slow/400/fast}', function() { + ${3://Stuff to do *after* the animation takes place} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/hover.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/hover.snippet new file mode 100644 index 00000000..d8468c1a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/hover.snippet @@ -0,0 +1,5 @@ +${1:obj}.hover(function() { + ${2:// Stuff to do when the mouse enters the element;} +}, function() { + ${3:// Stuff to do when the mouse leaves the element;} +});${4} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/html.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/html.snippet new file mode 100644 index 00000000..0c5a25e1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/html.snippet @@ -0,0 +1 @@ +${1:obj}.html('${2:Some text and bold!}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/insertAfter.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/insertAfter.snippet new file mode 100644 index 00000000..66c389eb --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/insertAfter.snippet @@ -0,0 +1 @@ +${1:obj}.insertAfter('${2:selector expression}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/insertBefore.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/insertBefore.snippet new file mode 100644 index 00000000..e7090d4d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/insertBefore.snippet @@ -0,0 +1 @@ +${1:obj}.insertBefore('${2:selector expression}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/is.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/is.snippet new file mode 100644 index 00000000..28eefb02 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/is.snippet @@ -0,0 +1 @@ +${1:obj}.is('${2:selector expression}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/load.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/load.snippet new file mode 100644 index 00000000..1f09fbc9 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/load.snippet @@ -0,0 +1,3 @@ +${1:obj}.load(function() { + ${2:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/loadf.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/loadf.snippet new file mode 100644 index 00000000..2e7d9c8b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/loadf.snippet @@ -0,0 +1,3 @@ +<+obj+>.load('<+/path/to/file.htm+>', { <+<+param1+>: "<+value1+>", <+param2+>: "<+value2+>"+> }, function() { + <+// Stuff to do after the page is loaded+> +}); \ No newline at end of file diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/loadif.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/loadif.snippet new file mode 100644 index 00000000..fe45d05a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/loadif.snippet @@ -0,0 +1,3 @@ +<+obj+>.loadIfModified('<+/path/to/file.htm+>', { <+<+param1+>: "<+value1+>", <+param2+>: "<+value2+>"+> }, function() { + <+// Stuff to do after the page is loaded+> +}); \ No newline at end of file diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/mdown.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/mdown.snippet new file mode 100644 index 00000000..3be70e1b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/mdown.snippet @@ -0,0 +1,3 @@ +${1:obj}.mousedown(function() { + ${2:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/mmove.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/mmove.snippet new file mode 100644 index 00000000..eb7ac052 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/mmove.snippet @@ -0,0 +1,3 @@ +${1:obj}.mousemove(function() { + ${2:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/mout.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/mout.snippet new file mode 100644 index 00000000..f2142756 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/mout.snippet @@ -0,0 +1,3 @@ +${1:obj}.mouseout(function() { + ${2:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/mover.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/mover.snippet new file mode 100644 index 00000000..f1eb19cc --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/mover.snippet @@ -0,0 +1,3 @@ +${1:obj}.mouseover(function() { + ${2:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/mup.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/mup.snippet new file mode 100644 index 00000000..04fb36a3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/mup.snippet @@ -0,0 +1,3 @@ +${1:obj}.mouseup(function() { + ${2:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/next.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/next.snippet new file mode 100644 index 00000000..b6a65281 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/next.snippet @@ -0,0 +1 @@ +${1:obj}.next('${2:selector expression}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/not.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/not.snippet new file mode 100644 index 00000000..c6a217f6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/not.snippet @@ -0,0 +1 @@ +${1:obj}.not('${2:selector expression}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/one.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/one.snippet new file mode 100644 index 00000000..cacdbfb5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/one.snippet @@ -0,0 +1,3 @@ +${1:obj}.one('${2:event name}', function(${3:event}) { + ${4:// Act on the event once} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/parent.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/parent.snippet new file mode 100644 index 00000000..0490f05a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/parent.snippet @@ -0,0 +1 @@ +${1:obj}.parent('${2:selector expression}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/parents.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/parents.snippet new file mode 100644 index 00000000..fb0bd131 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/parents.snippet @@ -0,0 +1 @@ +${1:obj}.parents('${2:selector expression}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/prepend.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/prepend.snippet new file mode 100644 index 00000000..bc41d48f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/prepend.snippet @@ -0,0 +1 @@ +${1:obj}.prepend('${2:Some text and bold!}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/prependto.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/prependto.snippet new file mode 100644 index 00000000..e4406957 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/prependto.snippet @@ -0,0 +1 @@ +${1:obj}.prependTo('${2:selector expression}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/prev.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/prev.snippet new file mode 100644 index 00000000..b7aba645 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/prev.snippet @@ -0,0 +1 @@ +${1:obj}.prev('${2:selector expression}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/ready.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/ready.snippet new file mode 100644 index 00000000..d0005318 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/ready.snippet @@ -0,0 +1,3 @@ +$(document).ready(function() { + ${1:// Stuff to do as soon as the DOM is ready;} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/remove.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/remove.snippet new file mode 100644 index 00000000..4c976a17 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/remove.snippet @@ -0,0 +1 @@ +${1:obj}.remove()${2} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/removeattr.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/removeattr.snippet new file mode 100644 index 00000000..267d584a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/removeattr.snippet @@ -0,0 +1 @@ +${1:obj}.removeAttr('${2:attribute name}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/removeclass.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/removeclass.snippet new file mode 100644 index 00000000..f5538030 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/removeclass.snippet @@ -0,0 +1 @@ +${1:obj}.removeClass('${2:class name}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/reset.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/reset.snippet new file mode 100644 index 00000000..777af958 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/reset.snippet @@ -0,0 +1,3 @@ +${1:obj}.reset(function() { + ${2:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/resize.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/resize.snippet new file mode 100644 index 00000000..b46ac0a0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/resize.snippet @@ -0,0 +1,3 @@ +${1:obj}.resize(function() { + ${2:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/scroll.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/scroll.snippet new file mode 100644 index 00000000..7a512442 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/scroll.snippet @@ -0,0 +1,3 @@ +${1:obj}.scroll(function() { + ${2:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/sdown.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/sdown.snippet new file mode 100644 index 00000000..b39840e9 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/sdown.snippet @@ -0,0 +1 @@ +${1:obj}.slideDown('${2:slow/400/fast}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/sdownc.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/sdownc.snippet new file mode 100644 index 00000000..3404b783 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/sdownc.snippet @@ -0,0 +1,3 @@ +${1:obj}.slideDown('${2:slow/400/fast}', function() { + ${3://Stuff to do *after* the animation takes place}; +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/sdupc.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/sdupc.snippet new file mode 100644 index 00000000..873c6657 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/sdupc.snippet @@ -0,0 +1,3 @@ +${1:obj}.slideUp('${2:slow/400/fast}', function() { + ${3://Stuff to do *after* the animation takes place}; +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/select.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/select.snippet new file mode 100644 index 00000000..986437ed --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/select.snippet @@ -0,0 +1,3 @@ +${1:obj}.select(function() { + ${2:// Act on the event} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/show.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/show.snippet new file mode 100644 index 00000000..31819b1e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/show.snippet @@ -0,0 +1 @@ +${1:obj}.show('${2:slow/400/fast}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/showc.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/showc.snippet new file mode 100644 index 00000000..6dc5bacc --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/showc.snippet @@ -0,0 +1,3 @@ +${1:obj}.show('${2:slow/400/fast}', function() { + ${3://Stuff to do *after* the animation takes place} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/sib.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/sib.snippet new file mode 100644 index 00000000..014f1f79 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/sib.snippet @@ -0,0 +1 @@ +${1:obj}.siblings('${2:selector expression}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/size.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/size.snippet new file mode 100644 index 00000000..1ba15439 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/size.snippet @@ -0,0 +1 @@ +${1:obj}.size()${2} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/stoggle.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/stoggle.snippet new file mode 100644 index 00000000..daba37d2 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/stoggle.snippet @@ -0,0 +1 @@ +${1:obj}.slideToggle('${2:slow/400/fast}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/submit.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/submit.snippet new file mode 100644 index 00000000..ae98d83e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/submit.snippet @@ -0,0 +1,3 @@ +${1:obj}.submit(function() { + ${2:// Act on the event once} +}); diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/sup.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/sup.snippet new file mode 100644 index 00000000..d844a68e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/sup.snippet @@ -0,0 +1 @@ +${1:obj}.slideUp('${2:slow/400/fast}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/text.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/text.snippet new file mode 100644 index 00000000..5f667c07 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/text.snippet @@ -0,0 +1 @@ +${1:obj}.text(${2:'some text'})${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/this.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/this.snippet new file mode 100644 index 00000000..b3cee8d3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/this.snippet @@ -0,0 +1 @@ +$(this)${1} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/tog.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/tog.snippet new file mode 100644 index 00000000..54f5f17a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/tog.snippet @@ -0,0 +1,6 @@ +${1:obj}.toggle(function() { + ${2:// Stuff to do every *odd* time the element is clicked;} +}, function() { + ${3:// Stuff to do every *even* time the element is clicked;} +}); +${4} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/togclass.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/togclass.snippet new file mode 100644 index 00000000..023a4b7d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/togclass.snippet @@ -0,0 +1 @@ +${1:obj}.toggleClass('${2:class name}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/togsh.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/togsh.snippet new file mode 100644 index 00000000..265a62d0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/togsh.snippet @@ -0,0 +1 @@ +${1:obj}.toggle('${2:slow/400/fast}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/trig.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/trig.snippet new file mode 100644 index 00000000..f7105e08 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/trig.snippet @@ -0,0 +1 @@ +${1:obj}.trigger('${2:event name}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/unbind.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/unbind.snippet new file mode 100644 index 00000000..0fe423d5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/unbind.snippet @@ -0,0 +1 @@ +${1:obj}.unbind('${2:event name}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/val.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/val.snippet new file mode 100644 index 00000000..cafe0b0b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/val.snippet @@ -0,0 +1 @@ +${1:obj}.val('${2:text}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/width.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/width.snippet new file mode 100644 index 00000000..415631c6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/width.snippet @@ -0,0 +1 @@ +${1:obj}.width(${2:integer})${3} diff --git a/sources_non_forked/snipmate-snippets/javascript-jquery/wrap.snippet b/sources_non_forked/snipmate-snippets/javascript-jquery/wrap.snippet new file mode 100644 index 00000000..55df53ff --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript-jquery/wrap.snippet @@ -0,0 +1 @@ +${1:obj}.wrap('${2:<div class="extra-wrapper"></div>}')${3} diff --git a/sources_non_forked/snipmate-snippets/javascript/anon.snippet b/sources_non_forked/snipmate-snippets/javascript/anon.snippet new file mode 100644 index 00000000..d486c430 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript/anon.snippet @@ -0,0 +1 @@ +function(${1}) { ${2} }; diff --git a/sources_non_forked/snipmate-snippets/javascript/for.snippet b/sources_non_forked/snipmate-snippets/javascript/for.snippet new file mode 100644 index 00000000..3933153f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript/for.snippet @@ -0,0 +1,3 @@ +for (var <+i+>=0; <+i+> < <+<+Things+>.length+>; <+i+>++) { +<+<+Things+>[<+i+>]+> +}; diff --git a/sources_non_forked/snipmate-snippets/javascript/fun.snippet b/sources_non_forked/snipmate-snippets/javascript/fun.snippet new file mode 100644 index 00000000..064b9593 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript/fun.snippet @@ -0,0 +1,3 @@ +function ${1:function_name} (${2:argument}) { + ${3:// body} +} diff --git a/sources_non_forked/snipmate-snippets/javascript/if.snippet b/sources_non_forked/snipmate-snippets/javascript/if.snippet new file mode 100644 index 00000000..931b9f17 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript/if.snippet @@ -0,0 +1 @@ +if (${1:true}) { ${2} }; diff --git a/sources_non_forked/snipmate-snippets/javascript/ife.snippet b/sources_non_forked/snipmate-snippets/javascript/ife.snippet new file mode 100644 index 00000000..6b172d07 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript/ife.snippet @@ -0,0 +1,4 @@ +if (${1:true}) { + ${2} +} else { +}; diff --git a/sources_non_forked/snipmate-snippets/javascript/log.snippet b/sources_non_forked/snipmate-snippets/javascript/log.snippet new file mode 100644 index 00000000..b4cf84fe --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript/log.snippet @@ -0,0 +1 @@ +console.log(${1}); diff --git a/sources_non_forked/snipmate-snippets/javascript/met.snippet b/sources_non_forked/snipmate-snippets/javascript/met.snippet new file mode 100644 index 00000000..1c30d617 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript/met.snippet @@ -0,0 +1,3 @@ +${1:method_name}: function(${2:attribute}){ + ${3} +}${4:, } diff --git a/sources_non_forked/snipmate-snippets/javascript/proto.snippet b/sources_non_forked/snipmate-snippets/javascript/proto.snippet new file mode 100644 index 00000000..37cd6d49 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript/proto.snippet @@ -0,0 +1,3 @@ +${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) { + ${4:// body} +}; diff --git a/sources_non_forked/snipmate-snippets/javascript/timeout.snippet b/sources_non_forked/snipmate-snippets/javascript/timeout.snippet new file mode 100644 index 00000000..6ea2842c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/javascript/timeout.snippet @@ -0,0 +1 @@ +setTimeout(function() { ${1} }, ${2:10}); diff --git a/sources_non_forked/snipmate-snippets/objc/I.snippet b/sources_non_forked/snipmate-snippets/objc/I.snippet new file mode 100644 index 00000000..0032f65f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/I.snippet @@ -0,0 +1,6 @@ ++ (void) initialize +{ + [[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWIthObjectsAndKeys: + ${1}@"value", @"key", + nil]]; +} diff --git a/sources_non_forked/snipmate-snippets/objc/Imp.snippet b/sources_non_forked/snipmate-snippets/objc/Imp.snippet new file mode 100644 index 00000000..91724d3f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/Imp.snippet @@ -0,0 +1 @@ +#import "${1:`Filename()`.h}"${2} diff --git a/sources_non_forked/snipmate-snippets/objc/alloc.snippet b/sources_non_forked/snipmate-snippets/objc/alloc.snippet new file mode 100644 index 00000000..e4d15993 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/alloc.snippet @@ -0,0 +1 @@ +[[${1:foo} alloc] init]${2};${3} diff --git a/sources_non_forked/snipmate-snippets/objc/array.snippet b/sources_non_forked/snipmate-snippets/objc/array.snippet new file mode 100644 index 00000000..45d3ef01 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/array.snippet @@ -0,0 +1 @@ +NSMutableArray *${1:array} = [NSMutable array];${2} diff --git a/sources_non_forked/snipmate-snippets/objc/bez.snippet b/sources_non_forked/snipmate-snippets/objc/bez.snippet new file mode 100644 index 00000000..493aff69 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/bez.snippet @@ -0,0 +1 @@ +NSBezierPath *${1:path} = [NSBezierPath bezierPath];${2} diff --git a/sources_non_forked/snipmate-snippets/objc/cat.snippet b/sources_non_forked/snipmate-snippets/objc/cat.snippet new file mode 100644 index 00000000..fd57aae3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/cat.snippet @@ -0,0 +1,6 @@ +@interface ${1:NSObject} (${2:Category}) +@end + +@implementation $1 ($2) +${3} +@end diff --git a/sources_non_forked/snipmate-snippets/objc/cati.snippet b/sources_non_forked/snipmate-snippets/objc/cati.snippet new file mode 100644 index 00000000..d2852600 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/cati.snippet @@ -0,0 +1,3 @@ +@interface ${1:NSObject} (${2:Category}) +${3} +@end diff --git a/sources_non_forked/snipmate-snippets/objc/cli.snippet b/sources_non_forked/snipmate-snippets/objc/cli.snippet new file mode 100644 index 00000000..fa896224 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/cli.snippet @@ -0,0 +1,5 @@ +@interface ${1:ClassName} : ${2:NSObject} +{${3} +} +${4} +@end diff --git a/sources_non_forked/snipmate-snippets/objc/dict.snippet b/sources_non_forked/snipmate-snippets/objc/dict.snippet new file mode 100644 index 00000000..8b2d7e90 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/dict.snippet @@ -0,0 +1 @@ +NSMutableDictionary *${1:dict} = [NSMutableDictionary dictionary];${2} diff --git a/sources_non_forked/snipmate-snippets/objc/forarray.snippet b/sources_non_forked/snipmate-snippets/objc/forarray.snippet new file mode 100644 index 00000000..d32215d0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/forarray.snippet @@ -0,0 +1,7 @@ +unsigned int ${1:object}Count = [${2:array} count]; + +for (unsigned int index = 0; index < $1Count; index++) +{ + ${3:id} $1 = [$2 $1AtIndex:index]; + ${4} +} diff --git a/sources_non_forked/snipmate-snippets/objc/log.snippet b/sources_non_forked/snipmate-snippets/objc/log.snippet new file mode 100644 index 00000000..69f9c067 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/log.snippet @@ -0,0 +1 @@ +NSLog(@"${1}"${2});${3} diff --git a/sources_non_forked/snipmate-snippets/objc/m/class method.snippet b/sources_non_forked/snipmate-snippets/objc/m/class method.snippet new file mode 100644 index 00000000..191ee160 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/m/class method.snippet @@ -0,0 +1,4 @@ ++ (${1:id}) ${2:method} +{${3} + return nil; +} diff --git a/sources_non_forked/snipmate-snippets/objc/m/method.snippet b/sources_non_forked/snipmate-snippets/objc/m/method.snippet new file mode 100644 index 00000000..9f7390e2 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/m/method.snippet @@ -0,0 +1,4 @@ +- (${1:id}) ${2:method} +{${3} + ${4:return nil;} +} diff --git a/sources_non_forked/snipmate-snippets/objc/objacc.snippet b/sources_non_forked/snipmate-snippets/objc/objacc.snippet new file mode 100644 index 00000000..840ebfd0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/objacc.snippet @@ -0,0 +1,11 @@ +- (${1:id})${2:thing} +{ + return $2; +} + +- (void) set$2:($1) +{ + $1 old$2 = $2; + $2 = [aValue retain]; + [old$2 release]; +} diff --git a/sources_non_forked/snipmate-snippets/objc/objc.snippet b/sources_non_forked/snipmate-snippets/objc/objc.snippet new file mode 100644 index 00000000..d6671487 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/objc.snippet @@ -0,0 +1,14 @@ +@interface ${1:`Filename('', 'object')`} : ${2:NSObject} +{ +} +@end + +@implementation $1 +- (id) init +{ + if (self = [super init]) + {${3} + } + return self +} +@end diff --git a/sources_non_forked/snipmate-snippets/objc/prop.snippet b/sources_non_forked/snipmate-snippets/objc/prop.snippet new file mode 100644 index 00000000..d77495a6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/prop.snippet @@ -0,0 +1 @@ +@property (${1:retain}) ${2:NSSomeClass} *${3:$2};${4} diff --git a/sources_non_forked/snipmate-snippets/objc/rel.snippet b/sources_non_forked/snipmate-snippets/objc/rel.snippet new file mode 100644 index 00000000..5dea04dd --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/rel.snippet @@ -0,0 +1 @@ +[${1:foo} release];${2} diff --git a/sources_non_forked/snipmate-snippets/objc/ret.snippet b/sources_non_forked/snipmate-snippets/objc/ret.snippet new file mode 100644 index 00000000..ee8eba46 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/ret.snippet @@ -0,0 +1 @@ +[${1:foo} retain];${2} diff --git a/sources_non_forked/snipmate-snippets/objc/sel.snippet b/sources_non_forked/snipmate-snippets/objc/sel.snippet new file mode 100644 index 00000000..4d4996d1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/sel.snippet @@ -0,0 +1 @@ +@selector(${1:method}:)${2} diff --git a/sources_non_forked/snipmate-snippets/objc/sm.snippet b/sources_non_forked/snipmate-snippets/objc/sm.snippet new file mode 100644 index 00000000..af139a90 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/sm.snippet @@ -0,0 +1,5 @@ +- (${1:id}) ${2:method}:(${3:id})${4:anArgument} +{ + $1 res = [super $2:$4];${5} + return res; +} diff --git a/sources_non_forked/snipmate-snippets/objc/syn.snippet b/sources_non_forked/snipmate-snippets/objc/syn.snippet new file mode 100644 index 00000000..eef7581c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/objc/syn.snippet @@ -0,0 +1 @@ +@synthesize ${1:NSSomeClass};${2} diff --git a/sources_non_forked/snipmate-snippets/php/array.snippet b/sources_non_forked/snipmate-snippets/php/array.snippet new file mode 100644 index 00000000..922542e0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/array.snippet @@ -0,0 +1 @@ +$${1:arrayName} = array('${2}' => ${3});${4} diff --git a/sources_non_forked/snipmate-snippets/php/case.snippet b/sources_non_forked/snipmate-snippets/php/case.snippet new file mode 100644 index 00000000..8f9e4daf --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/case.snippet @@ -0,0 +1,3 @@ +case '${1:value}': + ${2:// code...} + break;${3} diff --git a/sources_non_forked/snipmate-snippets/php/class.snippet b/sources_non_forked/snipmate-snippets/php/class.snippet new file mode 100644 index 00000000..4929a955 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/class.snippet @@ -0,0 +1,11 @@ +/** + * ${1} + */ +class ${2:ClassName} +{ + ${3} + function ${4:__construct}(${5:argument}) + { + ${6:// code...} + } +} diff --git a/sources_non_forked/snipmate-snippets/php/classe.snippet b/sources_non_forked/snipmate-snippets/php/classe.snippet new file mode 100644 index 00000000..2f2b0bc3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/classe.snippet @@ -0,0 +1,12 @@ +/** + * ${1} + */ +class ${2:ClassName} extends ${3:AnotherClass} +{ + ${4} + function ${5:__construct}(${6:argument}) + { + ${7:// code...} + } +} + diff --git a/sources_non_forked/snipmate-snippets/php/def.snippet b/sources_non_forked/snipmate-snippets/php/def.snippet new file mode 100644 index 00000000..df0f5ebd --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/def.snippet @@ -0,0 +1 @@ +define('${1}'${2});${3} diff --git a/sources_non_forked/snipmate-snippets/php/defd.snippet b/sources_non_forked/snipmate-snippets/php/defd.snippet new file mode 100644 index 00000000..6758cdad --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/defd.snippet @@ -0,0 +1 @@ +${1}defined('${2}')${3} diff --git a/sources_non_forked/snipmate-snippets/php/do.snippet b/sources_non_forked/snipmate-snippets/php/do.snippet new file mode 100644 index 00000000..e7dd5b06 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/do.snippet @@ -0,0 +1,3 @@ +do { + ${2:// code... } +} while (${1:/* condition */});" diff --git a/sources_non_forked/snipmate-snippets/php/doc_cp.snippet b/sources_non_forked/snipmate-snippets/php/doc_cp.snippet new file mode 100644 index 00000000..d6d1b3fc --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/doc_cp.snippet @@ -0,0 +1,6 @@ +/** + * ${1:undocumented class} + * + * @package ${2:default} + * @author ${3:`g:snips_author`} + **/${4} diff --git a/sources_non_forked/snipmate-snippets/php/doc_f.snippet b/sources_non_forked/snipmate-snippets/php/doc_f.snippet new file mode 100644 index 00000000..a9adbb07 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/doc_f.snippet @@ -0,0 +1,8 @@ +/** + * $2 + * @return ${4:void} + * @author ${5:`g:snips_author`} + **/ +${1:public }function ${2:someFunc}(${3}) +{${6} +} diff --git a/sources_non_forked/snipmate-snippets/php/doc_h.snippet b/sources_non_forked/snipmate-snippets/php/doc_h.snippet new file mode 100644 index 00000000..a0c12e01 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/doc_h.snippet @@ -0,0 +1,10 @@ +/** + * ${1} + * + * @author ${2:`g:snips_author`} + * @version ${3:$Id$} + * @copyright ${4:$2}, `strftime('%d %B, %Y')` + * @package ${5:default} + **/ +/** + * Define DocBlock *// diff --git a/sources_non_forked/snipmate-snippets/php/doc_i.snippet b/sources_non_forked/snipmate-snippets/php/doc_i.snippet new file mode 100644 index 00000000..e62eab72 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/doc_i.snippet @@ -0,0 +1,8 @@ +/** + * $1 + * @package ${2:default} + * @author ${3:`g:snips_author`} + **/ +interface ${1:someClass} +{${4} +} // END interface $1" diff --git a/sources_non_forked/snipmate-snippets/php/ec.snippet b/sources_non_forked/snipmate-snippets/php/ec.snippet new file mode 100644 index 00000000..489d759b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/ec.snippet @@ -0,0 +1 @@ +echo "${1:string}"${2}; diff --git a/sources_non_forked/snipmate-snippets/php/else.snippet b/sources_non_forked/snipmate-snippets/php/else.snippet new file mode 100644 index 00000000..b910e982 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/else.snippet @@ -0,0 +1,3 @@ +else { + ${1:// code...} +} diff --git a/sources_non_forked/snipmate-snippets/php/elseif.snippet b/sources_non_forked/snipmate-snippets/php/elseif.snippet new file mode 100644 index 00000000..a57dec80 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/elseif.snippet @@ -0,0 +1,3 @@ +elseif (${1:/* condition */}) { + ${2:// code...} +} diff --git a/sources_non_forked/snipmate-snippets/php/for.snippet b/sources_non_forked/snipmate-snippets/php/for.snippet new file mode 100644 index 00000000..e9bc52aa --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/for.snippet @@ -0,0 +1,3 @@ +for ($${2:i} = 0; $$2 < ${1:count}; $$2${3:++}) { + ${4:// code...} +} diff --git a/sources_non_forked/snipmate-snippets/php/foreach.snippet b/sources_non_forked/snipmate-snippets/php/foreach.snippet new file mode 100644 index 00000000..5fe47e5b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/foreach.snippet @@ -0,0 +1,3 @@ +foreach ($${1:variable} as $${2:key}){ + ${3:// code...} +} diff --git a/sources_non_forked/snipmate-snippets/php/foreachk.snippet b/sources_non_forked/snipmate-snippets/php/foreachk.snippet new file mode 100644 index 00000000..f78d57ae --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/foreachk.snippet @@ -0,0 +1,3 @@ +foreach ($${1:variable} as $${2:key} => $${3:value}){ + ${4:// code...} +} diff --git a/sources_non_forked/snipmate-snippets/php/fun.snippet b/sources_non_forked/snipmate-snippets/php/fun.snippet new file mode 100644 index 00000000..0f5d3534 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/fun.snippet @@ -0,0 +1,4 @@ +${1:public }function ${2:FunctionName}(${3}) +{ + ${4:// code...} +} diff --git a/sources_non_forked/snipmate-snippets/php/get.snippet b/sources_non_forked/snipmate-snippets/php/get.snippet new file mode 100644 index 00000000..af32e0a5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/get.snippet @@ -0,0 +1 @@ +$_GET['${1}']${2} diff --git a/sources_non_forked/snipmate-snippets/php/globals.snippet b/sources_non_forked/snipmate-snippets/php/globals.snippet new file mode 100644 index 00000000..6f5b04f3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/globals.snippet @@ -0,0 +1 @@ +$GLOBALS['${1:variable}']${2: = }${3:something}${4:;}${5} diff --git a/sources_non_forked/snipmate-snippets/php/if.snippet b/sources_non_forked/snipmate-snippets/php/if.snippet new file mode 100644 index 00000000..69ac0bd6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/if.snippet @@ -0,0 +1,3 @@ +if (${1:/* condition */}) { + ${2:// code...} +} diff --git a/sources_non_forked/snipmate-snippets/php/ife.snippet b/sources_non_forked/snipmate-snippets/php/ife.snippet new file mode 100644 index 00000000..b8621c1b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/ife.snippet @@ -0,0 +1,4 @@ +if (${1:/* condition */}) { + ${2:// code...} +} else { +} diff --git a/sources_non_forked/snipmate-snippets/php/inc.snippet b/sources_non_forked/snipmate-snippets/php/inc.snippet new file mode 100644 index 00000000..8df3966c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/inc.snippet @@ -0,0 +1 @@ +include '${1:file}';${2} diff --git a/sources_non_forked/snipmate-snippets/php/inc1.snippet b/sources_non_forked/snipmate-snippets/php/inc1.snippet new file mode 100644 index 00000000..ba262818 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/inc1.snippet @@ -0,0 +1 @@ +include_once '${1:file}';${2} diff --git a/sources_non_forked/snipmate-snippets/php/log.snippet b/sources_non_forked/snipmate-snippets/php/log.snippet new file mode 100644 index 00000000..2b8dcc4b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/log.snippet @@ -0,0 +1 @@ +error_log(var_export(${1}, true));${2} diff --git a/sources_non_forked/snipmate-snippets/php/php.snippet b/sources_non_forked/snipmate-snippets/php/php.snippet new file mode 100644 index 00000000..ed2ed1ce --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/php.snippet @@ -0,0 +1,3 @@ + diff --git a/sources_non_forked/snipmate-snippets/php/post.snippet b/sources_non_forked/snipmate-snippets/php/post.snippet new file mode 100644 index 00000000..2de7aa5f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/post.snippet @@ -0,0 +1 @@ +$_POST['${1}']${2} diff --git a/sources_non_forked/snipmate-snippets/php/req.snippet b/sources_non_forked/snipmate-snippets/php/req.snippet new file mode 100644 index 00000000..c03ea36f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/req.snippet @@ -0,0 +1 @@ +require '${1:file}';${2} diff --git a/sources_non_forked/snipmate-snippets/php/req1.snippet b/sources_non_forked/snipmate-snippets/php/req1.snippet new file mode 100644 index 00000000..e909c3bc --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/req1.snippet @@ -0,0 +1 @@ +require_once '${1:file}';${2} diff --git a/sources_non_forked/snipmate-snippets/php/request.snippet b/sources_non_forked/snipmate-snippets/php/request.snippet new file mode 100644 index 00000000..9a839b1b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/request.snippet @@ -0,0 +1 @@ +$_REQUEST['${1}']${2} diff --git a/sources_non_forked/snipmate-snippets/php/session.snippet b/sources_non_forked/snipmate-snippets/php/session.snippet new file mode 100644 index 00000000..5e3e11b9 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/session.snippet @@ -0,0 +1 @@ +$_SESSION['${1}']${2} diff --git a/sources_non_forked/snipmate-snippets/php/switch.snippet b/sources_non_forked/snipmate-snippets/php/switch.snippet new file mode 100644 index 00000000..7fc47c63 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/switch.snippet @@ -0,0 +1,9 @@ +switch ($${1:variable}) { + case '${2:value}': + ${3:// code...} + break; + ${5} + default: + ${4:// code...} + break; +} diff --git a/sources_non_forked/snipmate-snippets/php/t.snippet b/sources_non_forked/snipmate-snippets/php/t.snippet new file mode 100644 index 00000000..e8deae52 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/t.snippet @@ -0,0 +1 @@ +$${1:retVal} = (${2:condition}) ? ${3:a} : ${4:b};${5} diff --git a/sources_non_forked/snipmate-snippets/php/try.snippet b/sources_non_forked/snipmate-snippets/php/try.snippet new file mode 100644 index 00000000..66a7f651 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/try.snippet @@ -0,0 +1,6 @@ +try { + ${1:// code...} +} catch (${2:Exception} $e) { + ${3:// code...} +} + diff --git a/sources_non_forked/snipmate-snippets/php/var.snippet b/sources_non_forked/snipmate-snippets/php/var.snippet new file mode 100644 index 00000000..1f8cd08e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/var.snippet @@ -0,0 +1 @@ +var_export(${1});${2} diff --git a/sources_non_forked/snipmate-snippets/php/wh.snippet b/sources_non_forked/snipmate-snippets/php/wh.snippet new file mode 100644 index 00000000..36ae0ffc --- /dev/null +++ b/sources_non_forked/snipmate-snippets/php/wh.snippet @@ -0,0 +1,3 @@ +while (${1:/* condition */}) { + ${2:// code...} +} diff --git a/sources_non_forked/snipmate-snippets/po/msg.snippet b/sources_non_forked/snipmate-snippets/po/msg.snippet new file mode 100644 index 00000000..2ad6638a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/po/msg.snippet @@ -0,0 +1,2 @@ +msgid "${1}" +msgstr "${2}"${3} diff --git a/sources_non_forked/snipmate-snippets/python/class.snippet b/sources_non_forked/snipmate-snippets/python/class.snippet new file mode 100644 index 00000000..d9e2b8e8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/python/class.snippet @@ -0,0 +1,2 @@ +class ${1:``Snippet_PythonClassNameFromFilename()``}(${2:data}): +${3} diff --git a/sources_non_forked/snipmate-snippets/python/def.snippet b/sources_non_forked/snipmate-snippets/python/def.snippet new file mode 100644 index 00000000..c7cc9d38 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/python/def.snippet @@ -0,0 +1,2 @@ +def ${1:name}(${2:data}): +${3} diff --git a/sources_non_forked/snipmate-snippets/python/for.snippet b/sources_non_forked/snipmate-snippets/python/for.snippet new file mode 100644 index 00000000..fb69c05f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/python/for.snippet @@ -0,0 +1,3 @@ +for ${1:var} in ${2:type}: +${3:pass} +${4} diff --git a/sources_non_forked/snipmate-snippets/python/from.snippet b/sources_non_forked/snipmate-snippets/python/from.snippet new file mode 100644 index 00000000..98d0d825 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/python/from.snippet @@ -0,0 +1,2 @@ +from ${1:module} import ${2:name} +${3} diff --git a/sources_non_forked/snipmate-snippets/python/get.snippet b/sources_non_forked/snipmate-snippets/python/get.snippet new file mode 100644 index 00000000..bc0bf63d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/python/get.snippet @@ -0,0 +1,3 @@ +def get_${1:name}(self): +return self._$1 +${2} diff --git a/sources_non_forked/snipmate-snippets/python/ifmain.snippet b/sources_non_forked/snipmate-snippets/python/ifmain.snippet new file mode 100644 index 00000000..f6e7a262 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/python/ifmain.snippet @@ -0,0 +1,2 @@ +if __name__ == '__main__': +${1} diff --git a/sources_non_forked/snipmate-snippets/python/import.snippet b/sources_non_forked/snipmate-snippets/python/import.snippet new file mode 100644 index 00000000..58c9acdc --- /dev/null +++ b/sources_non_forked/snipmate-snippets/python/import.snippet @@ -0,0 +1,2 @@ +import ${1:module} +${2} diff --git a/sources_non_forked/snipmate-snippets/python/init.snippet b/sources_non_forked/snipmate-snippets/python/init.snippet new file mode 100644 index 00000000..c1a4f0fa --- /dev/null +++ b/sources_non_forked/snipmate-snippets/python/init.snippet @@ -0,0 +1,2 @@ +def __init__(self, ${1:args}): +${2} diff --git a/sources_non_forked/snipmate-snippets/python/set.snippet b/sources_non_forked/snipmate-snippets/python/set.snippet new file mode 100644 index 00000000..6ab0b5aa --- /dev/null +++ b/sources_non_forked/snipmate-snippets/python/set.snippet @@ -0,0 +1 @@ +def set_${1:name}(self, ${2:value}): diff --git a/sources_non_forked/snipmate-snippets/python/try.snippet b/sources_non_forked/snipmate-snippets/python/try.snippet new file mode 100644 index 00000000..fd5f6e59 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/python/try.snippet @@ -0,0 +1,4 @@ +try: +${1} +except ${2:Exception} +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-factorygirl/fac.snippet b/sources_non_forked/snipmate-snippets/ruby-factorygirl/fac.snippet new file mode 100644 index 00000000..05cc3e8e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-factorygirl/fac.snippet @@ -0,0 +1 @@ +Factory(:${1}, ${2})${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-factorygirl/facb.snippet b/sources_non_forked/snipmate-snippets/ruby-factorygirl/facb.snippet new file mode 100644 index 00000000..299c0335 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-factorygirl/facb.snippet @@ -0,0 +1 @@ +Factory.build(:${1}, ${2})${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-factorygirl/facd.snippet b/sources_non_forked/snipmate-snippets/ruby-factorygirl/facd.snippet new file mode 100644 index 00000000..41d1503c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-factorygirl/facd.snippet @@ -0,0 +1,4 @@ +Factory.define(:${1:model}) do |${2:f}| + ${3} +end +${4} diff --git a/sources_non_forked/snipmate-snippets/ruby-factorygirl/facn.snippet b/sources_non_forked/snipmate-snippets/ruby-factorygirl/facn.snippet new file mode 100644 index 00000000..7232308c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-factorygirl/facn.snippet @@ -0,0 +1 @@ +Factory.next(:${1:sequence-name})${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-factorygirl/facs.snippet b/sources_non_forked/snipmate-snippets/ruby-factorygirl/facs.snippet new file mode 100644 index 00000000..13fd5b9d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-factorygirl/facs.snippet @@ -0,0 +1,4 @@ +Factory.sequence :${1:sequence-name} do |${2:m}| + ${3} +end +${4} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/art.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/art.snippet new file mode 100644 index 00000000..a5a7d34e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/art.snippet @@ -0,0 +1 @@ +assert_redirected_to ${1::action => "${2:index}"} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/artnp.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/artnp.snippet new file mode 100644 index 00000000..2c9bfef0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/artnp.snippet @@ -0,0 +1 @@ +assert_redirected_to <+<+parent+>_<+child+>_path(<+@<+parent+>+>, <+@<+child+>+>)+> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/artnpp.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/artnpp.snippet new file mode 100644 index 00000000..becd79b5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/artnpp.snippet @@ -0,0 +1 @@ +assert_redirected_to <+<+parent+>_<+child+>_path(<+@<+parent+>+>)+> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/artp.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/artp.snippet new file mode 100644 index 00000000..55b9204a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/artp.snippet @@ -0,0 +1 @@ +assert_redirected_to <+<+model+>_path(<+@<+model+>+>)+> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/artpp.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/artpp.snippet new file mode 100644 index 00000000..1d1d203d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/artpp.snippet @@ -0,0 +1 @@ +assert_redirected_to <+<+model+>s_path+> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/asd.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/asd.snippet new file mode 100644 index 00000000..35ab7301 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/asd.snippet @@ -0,0 +1,3 @@ +assert_difference "${1:Model}.${2:count}", $1 do + ${3} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/asnd.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/asnd.snippet new file mode 100644 index 00000000..c5124e04 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/asnd.snippet @@ -0,0 +1,3 @@ +assert_no_difference "${1:Model}.${2:count}" do + ${3} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/asre.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/asre.snippet new file mode 100644 index 00000000..d0ac6b26 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/asre.snippet @@ -0,0 +1 @@ +assert_response :${1:success}, @response.body${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/asrj.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/asrj.snippet new file mode 100644 index 00000000..6ee13f2d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/asrj.snippet @@ -0,0 +1 @@ +assert_rjs :<+replace+>, <+"<+dom id+>"+> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/ass.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/ass.snippet new file mode 100644 index 00000000..4cc696f6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/ass.snippet @@ -0,0 +1 @@ +assert_select '<+path+>'<+, :<+text+> => <+'<+inner_html+>'+>+> <+do<++>+> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/bf.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/bf.snippet new file mode 100644 index 00000000..ad25cc90 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/bf.snippet @@ -0,0 +1 @@ +before_filter :${1:method} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/bt.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/bt.snippet new file mode 100644 index 00000000..b28e1e62 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/bt.snippet @@ -0,0 +1 @@ +belongs_to :${1:association} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/crw.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/crw.snippet new file mode 100644 index 00000000..3b1ab619 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/crw.snippet @@ -0,0 +1 @@ +cattr_accessor :${1:attr_names} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/defcreate.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/defcreate.snippet new file mode 100644 index 00000000..e878d3a6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/defcreate.snippet @@ -0,0 +1,14 @@ +def create + @${1:model_class_name} = ${2:ModelClassName}.new(params[:$1]) + + respond_to do |wants| + if @$1.save + flash[:notice] = '$2 was successfully created.' + wants.html { redirect_to(@$1) } + wants.xml { render :xml => @$1, :status => :created, :location => @$1 } + else + wants.html { render :action => "new" } + wants.xml { render :xml => @$1.errors, :status => :unprocessable_entity } + end + end +end${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/defdestroy.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/defdestroy.snippet new file mode 100644 index 00000000..9c340808 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/defdestroy.snippet @@ -0,0 +1,9 @@ +def destroy + @${1:model_class_name} = ${2:ModelClassName}.find(params[:id]) + @$1.destroy + + respond_to do |wants| + wants.html { redirect_to($1s_url) } + wants.xml { head :ok } + end +end${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/defedit.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/defedit.snippet new file mode 100644 index 00000000..0e80dcb8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/defedit.snippet @@ -0,0 +1,3 @@ +def edit + @${1:model_class_name} = ${2:ModelClassName}.find(params[:id]) +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/defindex.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/defindex.snippet new file mode 100644 index 00000000..aa776f9a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/defindex.snippet @@ -0,0 +1,8 @@ +def index + @${1:model_class_name} = ${2:ModelClassName}.all + + respond_to do |wants| + wants.html # index.html.erb + wants.xml { render :xml => @$1s } + end +end${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/defnew.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/defnew.snippet new file mode 100644 index 00000000..0a4762b9 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/defnew.snippet @@ -0,0 +1,8 @@ +def new + @${1:model_class_name} = ${2:ModelClassName}.new + + respond_to do |wants| + wants.html # new.html.erb + wants.xml { render :xml => @$1 } + end +end${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/defshow.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/defshow.snippet new file mode 100644 index 00000000..ba745d52 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/defshow.snippet @@ -0,0 +1,8 @@ +def show + @${1:model_class_name} = ${2:ModelClassName}.find(params[:id]) + + respond_to do |wants| + wants.html # show.html.erb + wants.xml { render :xml => @$1 } + end +end${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/defupdate.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/defupdate.snippet new file mode 100644 index 00000000..0556895c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/defupdate.snippet @@ -0,0 +1,14 @@ +def update + @${1:model_class_name} = ${2:ModelClassName}.find(params[:id]) + + respond_to do |wants| + if @$1.update_attributes(params[:$1]) + flash[:notice] = '$2 was successfully updated.' + wants.html { redirect_to(@$1) } + wants.xml { head :ok } + else + wants.html { render :action => "edit" } + wants.xml { render :xml => @$1.errors, :status => :unprocessable_entity } + end + end +end${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/fina.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/fina.snippet new file mode 100644 index 00000000..af5ec413 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/fina.snippet @@ -0,0 +1 @@ +find(:all<+, :conditions => ['<+<+field+> = ?+>', <+true+>]+>) diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/finf.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/finf.snippet new file mode 100644 index 00000000..24ba2da3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/finf.snippet @@ -0,0 +1 @@ +find(:first<+, :conditions => ['<+<+field+> = ?+>', <+true+>]+>) diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/fini.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/fini.snippet new file mode 100644 index 00000000..96d68a5f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/fini.snippet @@ -0,0 +1 @@ +find(<+id+>) diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/finl.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/finl.snippet new file mode 100644 index 00000000..7ee6efec --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/finl.snippet @@ -0,0 +1 @@ +find(:last<+, :conditions => ['<+<+field+> = ?+>', <+true+>]+>) diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/flash.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/flash.snippet new file mode 100644 index 00000000..2a069307 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/flash.snippet @@ -0,0 +1 @@ +flash[:${1:notice}] = "${2}" diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/habtm.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/habtm.snippet new file mode 100644 index 00000000..1b27396a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/habtm.snippet @@ -0,0 +1 @@ +has_and_belongs_to_many :${1:object}, :join_table => "${2:table_name}", :foreign_key => "${3}_id"${4} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/hm.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/hm.snippet new file mode 100644 index 00000000..9204df56 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/hm.snippet @@ -0,0 +1 @@ +has_many :${1:object} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/hmd.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/hmd.snippet new file mode 100644 index 00000000..6aadd73b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/hmd.snippet @@ -0,0 +1 @@ +has_many :<+object+>s<+, :class_name => "<+object+>", :foreign_key => "<+reference+>_id"+>, :dependent => :destroy<++> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/hmt.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/hmt.snippet new file mode 100644 index 00000000..4128e037 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/hmt.snippet @@ -0,0 +1 @@ +has_many :${1:object}, :through => :${2:object} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/ho.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/ho.snippet new file mode 100644 index 00000000..77e14e7a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/ho.snippet @@ -0,0 +1 @@ +has_one :${1:object} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/i18.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/i18.snippet new file mode 100644 index 00000000..2a30fae0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/i18.snippet @@ -0,0 +1 @@ +I18n.t('${1:type.key}')${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/ist.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/ist.snippet new file mode 100644 index 00000000..d97d4829 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/ist.snippet @@ -0,0 +1 @@ +<%= image_submit_tag("<+agree.png+>"<+<+, :id => "<+id+>"+><+, :name => "<+name+>"+><+, :class => "<+class+>"+><+, :disabled => <+false+>+>+>) %> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/log.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/log.snippet new file mode 100644 index 00000000..53360dd5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/log.snippet @@ -0,0 +1 @@ +RAILS_DEFAULT_LOGGER.${1:debug} ${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/logd.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/logd.snippet new file mode 100644 index 00000000..36236a31 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/logd.snippet @@ -0,0 +1 @@ +logger.debug { "${1:message}" }${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/loge.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/loge.snippet new file mode 100644 index 00000000..4417ad2e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/loge.snippet @@ -0,0 +1 @@ +logger.error { "${1:message}" }${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/logf.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/logf.snippet new file mode 100644 index 00000000..1bd419c8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/logf.snippet @@ -0,0 +1 @@ +logger.fatal { "${1:message}" }${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/logi.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/logi.snippet new file mode 100644 index 00000000..bf508dc1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/logi.snippet @@ -0,0 +1 @@ +logger.info { "${1:message}" }${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/logw.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/logw.snippet new file mode 100644 index 00000000..447f6886 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/logw.snippet @@ -0,0 +1 @@ +logger.warn { "${1:message}" }${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/mac.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/mac.snippet new file mode 100644 index 00000000..548d4af0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/mac.snippet @@ -0,0 +1 @@ +add_column :${1:table}, :${2:column}, :${3:type} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/mapc.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/mapc.snippet new file mode 100644 index 00000000..b14ec4ca --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/mapc.snippet @@ -0,0 +1 @@ +${1:map}.${2:connect} '${3:controller/:action/:id}' diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/mapca.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/mapca.snippet new file mode 100644 index 00000000..9292ffe9 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/mapca.snippet @@ -0,0 +1 @@ +${1:map}.catch_all "*${2:anything}", :controller => "${3:default}", :action => "${4:error}"${5} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/mapr.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/mapr.snippet new file mode 100644 index 00000000..424805b7 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/mapr.snippet @@ -0,0 +1 @@ +${1:map}.resource :${2:resource} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/maprs.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/maprs.snippet new file mode 100644 index 00000000..a18c4df3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/maprs.snippet @@ -0,0 +1 @@ +${1:map}.resources :${2:resource} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/mapwo.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/mapwo.snippet new file mode 100644 index 00000000..b3cf7911 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/mapwo.snippet @@ -0,0 +1,3 @@ +${1:map}.with_options :${2:controller} => '${3:thing}' do |$3| + ${4} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/mbs.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/mbs.snippet new file mode 100644 index 00000000..a3b34bb3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/mbs.snippet @@ -0,0 +1 @@ +before_save :${1:method} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/mcc.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/mcc.snippet new file mode 100644 index 00000000..74dc7af0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/mcc.snippet @@ -0,0 +1 @@ +change_column :${1:table}, :${2:column}, :${3:type} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/mccc.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/mccc.snippet new file mode 100644 index 00000000..2915a37f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/mccc.snippet @@ -0,0 +1 @@ +t.column :${1:title}, :${2:string} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/mcht.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/mcht.snippet new file mode 100644 index 00000000..a71b4731 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/mcht.snippet @@ -0,0 +1,3 @@ +change_table :${1:table_name} do |t| + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/mcol.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/mcol.snippet new file mode 100644 index 00000000..8a5bd1ff --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/mcol.snippet @@ -0,0 +1 @@ +remove_column :${1:table}, :${2:column} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/mct.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/mct.snippet new file mode 100644 index 00000000..8dbe1eab --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/mct.snippet @@ -0,0 +1,3 @@ +create_table :${1:table_name} do |t| + t.column :${2:name}, :${3:type} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/migration.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/migration.snippet new file mode 100644 index 00000000..9f54e0b9 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/migration.snippet @@ -0,0 +1,8 @@ +class ${1:`Snippet_MigrationNameFromFilename()`} < ActiveRecord::Migration + def self.up + ${2} + end + + def self.down + end +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/mp.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/mp.snippet new file mode 100644 index 00000000..1264a595 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/mp.snippet @@ -0,0 +1 @@ +map(&:${1:id}) diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/mrc.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/mrc.snippet new file mode 100644 index 00000000..aaeba258 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/mrc.snippet @@ -0,0 +1 @@ +remove_column :${1:column} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/mrmc.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/mrmc.snippet new file mode 100644 index 00000000..8a5bd1ff --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/mrmc.snippet @@ -0,0 +1 @@ +remove_column :${1:table}, :${2:column} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/mrnc.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/mrnc.snippet new file mode 100644 index 00000000..6e167210 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/mrnc.snippet @@ -0,0 +1 @@ +rename_column :${1:table}, :${2:old}, :${3:new} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/mrw.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/mrw.snippet new file mode 100644 index 00000000..9ef0f8fe --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/mrw.snippet @@ -0,0 +1 @@ +mattr_accessor :${1:attr_names} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/nc.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/nc.snippet new file mode 100644 index 00000000..cfc42ca4 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/nc.snippet @@ -0,0 +1 @@ +named_scope :<+name+><+, :joins => :<+table+>+>, :conditions => <+['<+<+field+> = ?+>', <+true+>]+> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/ncl.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/ncl.snippet new file mode 100644 index 00000000..c420ef2f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/ncl.snippet @@ -0,0 +1 @@ +named_scope :<+name+>, lambda { |<+param+>| { :conditions => <+['<+<+field+> = ?+>', <+param+>]+> } } diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/pa.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/pa.snippet new file mode 100644 index 00000000..14fa54fb --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/pa.snippet @@ -0,0 +1 @@ +params[:${1:id}]${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/ra.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/ra.snippet new file mode 100644 index 00000000..56a9bbf6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/ra.snippet @@ -0,0 +1 @@ +render :action => "${1:action}" diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/ral.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/ral.snippet new file mode 100644 index 00000000..0a0b202d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/ral.snippet @@ -0,0 +1 @@ +render :action => "${1:action}", :layout => "${2:layoutname}" diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rest.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rest.snippet new file mode 100644 index 00000000..7938f9d6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rest.snippet @@ -0,0 +1,3 @@ +respond_to do |wants| + wants.${1:html} <+{ <++> }+> +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rf.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rf.snippet new file mode 100644 index 00000000..76fcdb1d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rf.snippet @@ -0,0 +1 @@ +render :file => "${1:filepath}" diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rfu.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rfu.snippet new file mode 100644 index 00000000..c0bb72bf --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rfu.snippet @@ -0,0 +1 @@ +render :file => "${1:filepath}", :use_full_path => ${2:false} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/ri.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/ri.snippet new file mode 100644 index 00000000..17a04048 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/ri.snippet @@ -0,0 +1 @@ +render :inline => "<+<%= 'hello' %>+>" diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/ril.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/ril.snippet new file mode 100644 index 00000000..b1801aa4 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/ril.snippet @@ -0,0 +1 @@ +render :inline => "${1:<%= 'hello' %>}", :locals => { ${2::name} => "${3:value}"${4} } diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rit.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rit.snippet new file mode 100644 index 00000000..b3cd8343 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rit.snippet @@ -0,0 +1 @@ +render :inline => "${1:<%= 'hello' %>}", :type => ${2::rxml} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rjson.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rjson.snippet new file mode 100644 index 00000000..fece1fcc --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rjson.snippet @@ -0,0 +1 @@ +render :json => ${1:text to render} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rl.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rl.snippet new file mode 100644 index 00000000..53e8340a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rl.snippet @@ -0,0 +1 @@ +render :layout => "${1:layoutname}" diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rn.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rn.snippet new file mode 100644 index 00000000..6c6b0fec --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rn.snippet @@ -0,0 +1 @@ +render :nothing => ${1:true} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rns.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rns.snippet new file mode 100644 index 00000000..d1a581f8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rns.snippet @@ -0,0 +1 @@ +render :nothing => ${1:true}, :status => ${2:401} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rp.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rp.snippet new file mode 100644 index 00000000..0c5daa25 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rp.snippet @@ -0,0 +1 @@ +render :partial => "${1:item}" diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rpc.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rpc.snippet new file mode 100644 index 00000000..570644b5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rpc.snippet @@ -0,0 +1 @@ +render :partial => "<+item+>", :collection => <+@<+item+>s+> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rpl.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rpl.snippet new file mode 100644 index 00000000..6981fbc3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rpl.snippet @@ -0,0 +1 @@ +render :partial => "<+item+>", :locals => { :<+item+> => <+@<+item+>+><++> } diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rpo.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rpo.snippet new file mode 100644 index 00000000..bab9da96 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rpo.snippet @@ -0,0 +1 @@ +render :partial => "<+item+>", :object => <+@<+item+>+> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rps.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rps.snippet new file mode 100644 index 00000000..aef4c494 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rps.snippet @@ -0,0 +1 @@ +render :partial => "${1:item}", :status => ${2:500} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rt.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rt.snippet new file mode 100644 index 00000000..c464879c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rt.snippet @@ -0,0 +1 @@ +render :text => "${1:text to render}" diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rtl.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rtl.snippet new file mode 100644 index 00000000..fc78bf14 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rtl.snippet @@ -0,0 +1 @@ +render :text => "${1:text to render}", :layout => "${2:layoutname}" diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rtlt.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rtlt.snippet new file mode 100644 index 00000000..69618be0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rtlt.snippet @@ -0,0 +1 @@ +render :text => "${1:text to render}", :layout => ${2:true} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rts.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rts.snippet new file mode 100644 index 00000000..04fe409d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rts.snippet @@ -0,0 +1 @@ +render :text => "${1:text to render}", :status => ${2:401} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/ru.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/ru.snippet new file mode 100644 index 00000000..3a2d1ed0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/ru.snippet @@ -0,0 +1,3 @@ +render :update do |${1:page}| + $1.${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/rxml.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/rxml.snippet new file mode 100644 index 00000000..e4e721a0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/rxml.snippet @@ -0,0 +1 @@ +render :xml => ${1:text to render} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/sha1.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/sha1.snippet new file mode 100644 index 00000000..19847471 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/sha1.snippet @@ -0,0 +1 @@ +Digest::SHA1.hexdigest(${1:string}) diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/sweeper.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/sweeper.snippet new file mode 100644 index 00000000..659aeb0d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/sweeper.snippet @@ -0,0 +1,15 @@ +class ${1:ModelClassName}Sweeper < ActionController::Caching::Sweeper + observe $1 + + def after_save(${2:model_class_name}) + expire_cache($2) + end + + def after_destroy($2) + expire_cache($2) + end + + def expire_cache($2) + expire_page + end +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tcb.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tcb.snippet new file mode 100644 index 00000000..021740df --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tcb.snippet @@ -0,0 +1,2 @@ +t.boolean :${1:title} +${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tcbi.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tcbi.snippet new file mode 100644 index 00000000..3e6d3c9c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tcbi.snippet @@ -0,0 +1,2 @@ +t.binary :<+title+><+, :limit => <+2+>.megabytes+> +<++> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tcd.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tcd.snippet new file mode 100644 index 00000000..0932f2c1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tcd.snippet @@ -0,0 +1,2 @@ +t.decimal :<+title+><+<+, :precision => <+10+>+><+, :scale => <+2+>+>+> +<++> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tcda.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tcda.snippet new file mode 100644 index 00000000..b716e8b0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tcda.snippet @@ -0,0 +1,2 @@ +t.date :${1:title} +${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tcdt.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tcdt.snippet new file mode 100644 index 00000000..d060532e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tcdt.snippet @@ -0,0 +1,2 @@ +t.datetime :${1:title} +${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tcf.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tcf.snippet new file mode 100644 index 00000000..f09f7904 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tcf.snippet @@ -0,0 +1,2 @@ +t.float :${1:title} +${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tch.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tch.snippet new file mode 100644 index 00000000..bcce7271 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tch.snippet @@ -0,0 +1,2 @@ +t.change :<+name+><+, :<+string+><+, :<+limit+> => <+80+>+>+> +<++> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tci.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tci.snippet new file mode 100644 index 00000000..7cb011ca --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tci.snippet @@ -0,0 +1,2 @@ +t.integer :${1:title} +${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tcl.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tcl.snippet new file mode 100644 index 00000000..ffa359f5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tcl.snippet @@ -0,0 +1,2 @@ +t.integer :lock_version, :null => false, :default => 0 +${1} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tcr.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tcr.snippet new file mode 100644 index 00000000..2b421dd7 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tcr.snippet @@ -0,0 +1,2 @@ +t.references :<+taggable+><+, :polymorphic => <+{ :default => '<+Photo+>' }+>+> +<++> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tcs.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tcs.snippet new file mode 100644 index 00000000..a7b8473b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tcs.snippet @@ -0,0 +1,2 @@ +t.string :${1:title} +${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tct.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tct.snippet new file mode 100644 index 00000000..f28518f4 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tct.snippet @@ -0,0 +1,2 @@ +t.text :${1:title} +${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tcti.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tcti.snippet new file mode 100644 index 00000000..0006c819 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tcti.snippet @@ -0,0 +1,2 @@ +t.time :${1:title} +${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tcts.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tcts.snippet new file mode 100644 index 00000000..e46e844c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tcts.snippet @@ -0,0 +1,2 @@ +t.timestamp :${1:title} +${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tctss.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tctss.snippet new file mode 100644 index 00000000..f009ee62 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tctss.snippet @@ -0,0 +1,2 @@ +t.timestamps +${1} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/trc.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/trc.snippet new file mode 100644 index 00000000..2d6250ab --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/trc.snippet @@ -0,0 +1 @@ +t.remove :${1:column} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tre.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tre.snippet new file mode 100644 index 00000000..8f70788c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tre.snippet @@ -0,0 +1,2 @@ +t.rename :<+old_column_name+>, :<+new_column_name+> +<++> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/tref.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/tref.snippet new file mode 100644 index 00000000..12867868 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/tref.snippet @@ -0,0 +1 @@ +t.references :${1:model} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/va.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/va.snippet new file mode 100644 index 00000000..064bb7b2 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/va.snippet @@ -0,0 +1 @@ +validates_associated :${1:attribute} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/vao.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/vao.snippet new file mode 100644 index 00000000..4c6c98b6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/vao.snippet @@ -0,0 +1 @@ +validates_acceptance_of :${1:terms} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/vc.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/vc.snippet new file mode 100644 index 00000000..0aa1a75d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/vc.snippet @@ -0,0 +1 @@ +validates_confirmation_of :${1:attribute} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/ve.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/ve.snippet new file mode 100644 index 00000000..b6a4c4d5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/ve.snippet @@ -0,0 +1 @@ +validates_exclusion_of :${1:attribute}, :in => ${2:%w( mov avi )} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/vf.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/vf.snippet new file mode 100644 index 00000000..adc142c7 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/vf.snippet @@ -0,0 +1 @@ +validates_format_of :${1:attribute}, :with => /${2:regex}/ diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/vi.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/vi.snippet new file mode 100644 index 00000000..8ba16d2e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/vi.snippet @@ -0,0 +1 @@ +validates_inclusion_of :${1:attribute}, :in => %w(${2: mov avi }) diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/vl.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/vl.snippet new file mode 100644 index 00000000..71d802bd --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/vl.snippet @@ -0,0 +1 @@ +validates_length_of :${1:attribute}, :within => ${2:3}..${3:20} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/vn.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/vn.snippet new file mode 100644 index 00000000..34bfaa72 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/vn.snippet @@ -0,0 +1 @@ +validates_numericality_of :${1:attribute} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/vpo.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/vpo.snippet new file mode 100644 index 00000000..c8fdff9c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/vpo.snippet @@ -0,0 +1 @@ +validates_presence_of :${1:attribute} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/vu.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/vu.snippet new file mode 100644 index 00000000..0c06e655 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/vu.snippet @@ -0,0 +1 @@ +validates_uniqueness_of :${1:attribute} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/wants.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/wants.snippet new file mode 100644 index 00000000..909c8d59 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/wants.snippet @@ -0,0 +1 @@ +wants.<+js|xml|html+> <+{ <++> }+> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/xdelete.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/xdelete.snippet new file mode 100644 index 00000000..41184e9e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/xdelete.snippet @@ -0,0 +1 @@ +xhr :delete, :${1:destroy}, :id => ${2:1}${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/xget.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/xget.snippet new file mode 100644 index 00000000..1ae7834e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/xget.snippet @@ -0,0 +1 @@ +xhr :get, :<+show+><+, :id => <+1+>+><++> diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/xpost.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/xpost.snippet new file mode 100644 index 00000000..3681a95f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/xpost.snippet @@ -0,0 +1 @@ +xhr :post, :${1:create}, :${2:object} => { ${3} } diff --git a/sources_non_forked/snipmate-snippets/ruby-rails/xput.snippet b/sources_non_forked/snipmate-snippets/ruby-rails/xput.snippet new file mode 100644 index 00000000..f046f2ea --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rails/xput.snippet @@ -0,0 +1 @@ +xhr :put, :${1:update}, :id => ${2:1}, :${3:object} => { ${4} }${5} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/aft.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/aft.snippet new file mode 100644 index 00000000..528f1b30 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/aft.snippet @@ -0,0 +1,3 @@ +after(${1::each}) do + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/annot.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/annot.snippet new file mode 100644 index 00000000..7199170c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/annot.snippet @@ -0,0 +1 @@ +any_number_of_times diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/anr.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/anr.snippet new file mode 100644 index 00000000..573addd5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/anr.snippet @@ -0,0 +1 @@ +and_return(${1:value}) diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/anra.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/anra.snippet new file mode 100644 index 00000000..ab03deb4 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/anra.snippet @@ -0,0 +1 @@ +and_raise(${1:exception}) diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/anrb.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/anrb.snippet new file mode 100644 index 00000000..e313a512 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/anrb.snippet @@ -0,0 +1 @@ +and_return { ${1} } diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/ant.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/ant.snippet new file mode 100644 index 00000000..d230e92c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/ant.snippet @@ -0,0 +1 @@ +and_throw(${1:sym}) diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/any.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/any.snippet new file mode 100644 index 00000000..34c08d69 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/any.snippet @@ -0,0 +1 @@ +and_yield(${1:values}) diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/atl.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/atl.snippet new file mode 100644 index 00000000..b95128bb --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/atl.snippet @@ -0,0 +1 @@ +at_least(${1:n}).times diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/atm.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/atm.snippet new file mode 100644 index 00000000..fa5c6060 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/atm.snippet @@ -0,0 +1 @@ +at_most(${1:n}).times diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/bef.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/bef.snippet new file mode 100644 index 00000000..f96608c5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/bef.snippet @@ -0,0 +1,3 @@ +before(${1::each}) do + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/conn.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/conn.snippet new file mode 100644 index 00000000..4bd9d239 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/conn.snippet @@ -0,0 +1 @@ +controller_name :${1:controller} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/des.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/des.snippet new file mode 100644 index 00000000..44c75845 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/des.snippet @@ -0,0 +1,3 @@ +describe "${1:subject}" do + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/desc.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/desc.snippet new file mode 100644 index 00000000..6311aa1d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/desc.snippet @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe ${1:`Snippet_RubyClassNameFromFilename()`} do + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/desrc.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/desrc.snippet new file mode 100644 index 00000000..a9c8ac2b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/desrc.snippet @@ -0,0 +1,3 @@ +describe ${1:controller}, "${2:GET|POST|PUT|DELETE} ${3:/some/path}${4}" do + ${5} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/dest.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/dest.snippet new file mode 100644 index 00000000..b3b3e01a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/dest.snippet @@ -0,0 +1,3 @@ +describe ${1:Type} do + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/dests.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/dests.snippet new file mode 100644 index 00000000..89e9372c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/dests.snippet @@ -0,0 +1,3 @@ +describe ${1:Type}, "${2:description}" do + ${3} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/ex.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/ex.snippet new file mode 100644 index 00000000..2e5a4a01 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/ex.snippet @@ -0,0 +1 @@ +exactly(${1:n}).times diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/isbl.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/isbl.snippet new file mode 100644 index 00000000..728223f0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/isbl.snippet @@ -0,0 +1 @@ +it_should_behave_like '${1:do something}' diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/it.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/it.snippet new file mode 100644 index 00000000..8af38db4 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/it.snippet @@ -0,0 +1,3 @@ +it "${1}" do + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/its.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/its.snippet new file mode 100644 index 00000000..963f4041 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/its.snippet @@ -0,0 +1 @@ +it "should ${1:do something}" do${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/mat.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/mat.snippet new file mode 100644 index 00000000..2f047710 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/mat.snippet @@ -0,0 +1,24 @@ +class ${1:ReverseTo} + def initialize(${2:param}) + @$2 = $2 + end + + def matches?(actual) + @actual = actual + # Satisfy expectation here. Return false or raise an error if it's not met. + ${3:@actual.reverse.should == @$2} + true + end + + def failure_message + "expected #{@actual.inspect} to ${4} #{@$2.inspect}, but it didn't" + end + + def negative_failure_message + "expected #{@actual.inspect} not to ${5} #{@$2.inspect}, but it did" + end +end + +def ${6:reverse_to}(${7:expected}) + ${8}.new($7) +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/mm.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/mm.snippet new file mode 100644 index 00000000..b10aa1d5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/mm.snippet @@ -0,0 +1 @@ +mock_model(${1:model})${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/moc.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/moc.snippet new file mode 100644 index 00000000..4ff954f1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/moc.snippet @@ -0,0 +1,2 @@ +${1:var} = mock("${2:mock_name}"${3:, :null_object => true}) +${4} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/mocw.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/mocw.snippet new file mode 100644 index 00000000..09f93e07 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/mocw.snippet @@ -0,0 +1,3 @@ +Spec::Runner.configure do |config| + config.mock_with :${1:mocha|flexmock|rr} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/on.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/on.snippet new file mode 100644 index 00000000..b2d1a776 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/on.snippet @@ -0,0 +1 @@ +once diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/resh.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/resh.snippet new file mode 100644 index 00000000..91cd5b06 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/resh.snippet @@ -0,0 +1 @@ +require File.dirname(__FILE__) + '/../spec_helper' diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/sef.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/sef.snippet new file mode 100644 index 00000000..89d34116 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/sef.snippet @@ -0,0 +1,3 @@ +shared_examples_for "${1:do something}" do + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/sh.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/sh.snippet new file mode 100644 index 00000000..67530e9d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/sh.snippet @@ -0,0 +1,2 @@ +${1:target}.should == ${2:value} +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shb.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shb.snippet new file mode 100644 index 00000000..b909d9c0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shb.snippet @@ -0,0 +1,2 @@ +${1:target}.should be(${2:result}) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shbc.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shbc.snippet new file mode 100644 index 00000000..9080a3c2 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shbc.snippet @@ -0,0 +1,2 @@ +${1:target}.should be_close(${2:result}, ${3:tolerance}) +${4} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shbio.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shbio.snippet new file mode 100644 index 00000000..98a73893 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shbio.snippet @@ -0,0 +1,2 @@ +${1:target}.should be_instance_of(${2:class}) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shbko.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shbko.snippet new file mode 100644 index 00000000..74bf8520 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shbko.snippet @@ -0,0 +1,2 @@ +${1:target}.should be_a_kind_of(${2:class}) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shbr.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shbr.snippet new file mode 100644 index 00000000..887ef800 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shbr.snippet @@ -0,0 +1,2 @@ +response.should be_redirect +${1} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shbs.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shbs.snippet new file mode 100644 index 00000000..602074b5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shbs.snippet @@ -0,0 +1,2 @@ +response.should be_success +${1} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shc.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shc.snippet new file mode 100644 index 00000000..16206fa1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shc.snippet @@ -0,0 +1,3 @@ +lambda do + ${1} +end.should change(${2:target}, :${3:method}).from(${4:old_value}).to(${5:new_value}).by(${6:change}) diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shdm.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shdm.snippet new file mode 100644 index 00000000..e82d82e7 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shdm.snippet @@ -0,0 +1,2 @@ +${1:target}.should match(/${2:regexp}/) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/she.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/she.snippet new file mode 100644 index 00000000..f896a26e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/she.snippet @@ -0,0 +1,2 @@ +${1:target}.should eql(${2:value}) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/sheq.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/sheq.snippet new file mode 100644 index 00000000..e3c389e6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/sheq.snippet @@ -0,0 +1,2 @@ +${1:target}.should equal(${2:value}) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shh.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shh.snippet new file mode 100644 index 00000000..93189cb8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shh.snippet @@ -0,0 +1,2 @@ +${1:target}.should have(${2:num}).${3:things} +${4} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shhal.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shhal.snippet new file mode 100644 index 00000000..dabe237a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shhal.snippet @@ -0,0 +1,2 @@ +${1:target}.should have_at_least(${2:num}).${3:things} +${4} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shham.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shham.snippet new file mode 100644 index 00000000..7072add1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shham.snippet @@ -0,0 +1,2 @@ +${1:target}.should have_at_most(${2:num}).${3:things} +${4} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shhr.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shhr.snippet new file mode 100644 index 00000000..b8a8997f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shhr.snippet @@ -0,0 +1,2 @@ +${1:target}.should have(${2:n}).records +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shn.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shn.snippet new file mode 100644 index 00000000..b19cbb67 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shn.snippet @@ -0,0 +1,2 @@ +${1:target}.should_not == ${2:value} +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shnb.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shnb.snippet new file mode 100644 index 00000000..a34d62e5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shnb.snippet @@ -0,0 +1,2 @@ +${1:target}.should_not be(${2:result}) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shnbc.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shnbc.snippet new file mode 100644 index 00000000..55ac6d3a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shnbc.snippet @@ -0,0 +1,2 @@ +${1:target}.should_not be_close(${2:result}, ${3:tolerance}) +${4} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shnbio.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shnbio.snippet new file mode 100644 index 00000000..b6f15267 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shnbio.snippet @@ -0,0 +1,2 @@ +${1:target}.should_not be_instance_of(${2:klass}) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shnbko.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shnbko.snippet new file mode 100644 index 00000000..0b0cfc7f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shnbko.snippet @@ -0,0 +1,2 @@ +${1:target}.should_not be_a_kind_of(${2:klass}) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shnbr.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shnbr.snippet new file mode 100644 index 00000000..25519b08 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shnbr.snippet @@ -0,0 +1,2 @@ +response.should_not be_redirect +${1} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shnbs.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shnbs.snippet new file mode 100644 index 00000000..7d35ab20 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shnbs.snippet @@ -0,0 +1,2 @@ +response.should_not be_success +${1} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shnc.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shnc.snippet new file mode 100644 index 00000000..7baead27 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shnc.snippet @@ -0,0 +1,3 @@ +lambda do + ${1} +end.should_not change(${2:target}, :${3:method}) diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shne.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shne.snippet new file mode 100644 index 00000000..68a7451c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shne.snippet @@ -0,0 +1,2 @@ +${1:target}.should_not eql(${2:value}) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shneq.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shneq.snippet new file mode 100644 index 00000000..da4f59b9 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shneq.snippet @@ -0,0 +1,2 @@ + ${1:target}.should_not equal(${2:value}) + ${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shnm.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shnm.snippet new file mode 100644 index 00000000..ee7b6043 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shnm.snippet @@ -0,0 +1,2 @@ +${1:target}.should_not match(/${2:regexp}/) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shnp.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shnp.snippet new file mode 100644 index 00000000..9f1298b7 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shnp.snippet @@ -0,0 +1 @@ +${1:target}.should_not be_${2:predicate} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shnr.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shnr.snippet new file mode 100644 index 00000000..98c0fc08 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shnr.snippet @@ -0,0 +1,2 @@ +${1:mock}.should_not_receive(:${2:message})${3} +${4} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shnre.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shnre.snippet new file mode 100644 index 00000000..fbf9604e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shnre.snippet @@ -0,0 +1,2 @@ +${1:target}.should_not raise_error(${2:error}) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shnredt.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shnredt.snippet new file mode 100644 index 00000000..2afb69cc --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shnredt.snippet @@ -0,0 +1,2 @@ +response.should_not redirect_to(${1:url}) +${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shnrt.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shnrt.snippet new file mode 100644 index 00000000..c2c5f2cb --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shnrt.snippet @@ -0,0 +1,2 @@ +${1:target}.should_not respond_to(:${2:sym}) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shns.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shns.snippet new file mode 100644 index 00000000..b73a71c8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shns.snippet @@ -0,0 +1,2 @@ +${1:target}.should_not satisfy { |${2:obj}| ${3} } +${4} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shnt.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shnt.snippet new file mode 100644 index 00000000..0353376b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shnt.snippet @@ -0,0 +1,2 @@ +lambda { ${1} }.should_not throw_symbol(:${2:symbol}) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shp.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shp.snippet new file mode 100644 index 00000000..9267b612 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shp.snippet @@ -0,0 +1 @@ +${1:target}.should be_${2:predicate} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shr.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shr.snippet new file mode 100644 index 00000000..4effa2c1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shr.snippet @@ -0,0 +1,2 @@ +${1:mock}.should_receive(:${2:message})${3} +${4} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shre.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shre.snippet new file mode 100644 index 00000000..420bbe80 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shre.snippet @@ -0,0 +1,2 @@ +${1:target}.should raise_error(${2:error}) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shredt.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shredt.snippet new file mode 100644 index 00000000..979c1d6e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shredt.snippet @@ -0,0 +1,2 @@ +response.should redirect_to(${1:url}) +${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shrt.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shrt.snippet new file mode 100644 index 00000000..a796ebd2 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shrt.snippet @@ -0,0 +1,2 @@ +${1:target}.should respond_to(:${2:sym}) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shs.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shs.snippet new file mode 100644 index 00000000..08eb9419 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shs.snippet @@ -0,0 +1,2 @@ +${1:target}.should satisfy { |${2:obj}| ${3} } +${4} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/sht.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/sht.snippet new file mode 100644 index 00000000..86f55fa3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/sht.snippet @@ -0,0 +1,2 @@ +${1:target}.should throw_symble(:${2:symbol}) +${3} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/shtemp.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/shtemp.snippet new file mode 100644 index 00000000..9b08c10e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/shtemp.snippet @@ -0,0 +1,2 @@ +response.should render_template(:${1:template}) +${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/tw.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/tw.snippet new file mode 100644 index 00000000..6ebb6d4a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/tw.snippet @@ -0,0 +1 @@ +twice diff --git a/sources_non_forked/snipmate-snippets/ruby-rspec/wia.snippet b/sources_non_forked/snipmate-snippets/ruby-rspec/wia.snippet new file mode 100644 index 00000000..21eda197 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-rspec/wia.snippet @@ -0,0 +1,2 @@ +with(${1:args}) +${2} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/context.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/context.snippet new file mode 100644 index 00000000..0e5a7fd2 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/context.snippet @@ -0,0 +1,5 @@ +context "${1:context}" do + + ${2} + +end diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/samao.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/samao.snippet new file mode 100644 index 00000000..cfd4e59f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/samao.snippet @@ -0,0 +1 @@ +should_allow_mass_assignment_of :${1:field} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/savf.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/savf.snippet new file mode 100644 index 00000000..39cfd6f1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/savf.snippet @@ -0,0 +1 @@ +should_allow_values_for :${1:field}, "${2:value}" diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/sbt.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/sbt.snippet new file mode 100644 index 00000000..90d25c84 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/sbt.snippet @@ -0,0 +1 @@ +should_belong_to :${1:association} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/selal.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/selal.snippet new file mode 100644 index 00000000..2fc48b4a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/selal.snippet @@ -0,0 +1 @@ +should_ensure_length_at_least :${1:field}, ${2:min_length} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/seli.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/seli.snippet new file mode 100644 index 00000000..8bc2bf87 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/seli.snippet @@ -0,0 +1 @@ +should_ensure_length_is :${1:field}, ${2:length} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/selir.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/selir.snippet new file mode 100644 index 00000000..1f0bdc98 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/selir.snippet @@ -0,0 +1 @@ +should_ensure_length_in_range :${1:field}, ${2:start}..${3:end} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/setup.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/setup.snippet new file mode 100644 index 00000000..68b895c1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/setup.snippet @@ -0,0 +1,3 @@ +setup do + ${1} +end diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/sevir.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/sevir.snippet new file mode 100644 index 00000000..195f7484 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/sevir.snippet @@ -0,0 +1 @@ +should_ensure_value_in_range :${1:field}, ${2:start}..${3:end} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/shabtm.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/shabtm.snippet new file mode 100644 index 00000000..03c70e24 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/shabtm.snippet @@ -0,0 +1 @@ +should_have_and_belong_to_many :${1:association} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/shcm.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/shcm.snippet new file mode 100644 index 00000000..6948aea9 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/shcm.snippet @@ -0,0 +1 @@ +should_have_class_methods :${1:method} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/shdc.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/shdc.snippet new file mode 100644 index 00000000..d841d650 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/shdc.snippet @@ -0,0 +1 @@ +should_have_db_columns :${1:field} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/shi.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/shi.snippet new file mode 100644 index 00000000..d6d2b389 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/shi.snippet @@ -0,0 +1 @@ +should_have_indices :${1:field} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/shim.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/shim.snippet new file mode 100644 index 00000000..1f442528 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/shim.snippet @@ -0,0 +1 @@ +should_have_instance_methods :${1:method} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/shm.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/shm.snippet new file mode 100644 index 00000000..8c98c17e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/shm.snippet @@ -0,0 +1 @@ +should_have_many :${1:association} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/sho.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/sho.snippet new file mode 100644 index 00000000..a652b4f5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/sho.snippet @@ -0,0 +1 @@ +should_have_one :${1:association} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/shroa.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/shroa.snippet new file mode 100644 index 00000000..022015df --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/shroa.snippet @@ -0,0 +1 @@ +should_have_read_only_attributes :${1:field} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/snamao.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/snamao.snippet new file mode 100644 index 00000000..236190b5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/snamao.snippet @@ -0,0 +1 @@ +should_not_allow_mass_assignment_of :${1:field} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/snavf.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/snavf.snippet new file mode 100644 index 00000000..029c5bab --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/snavf.snippet @@ -0,0 +1 @@ +should_not_allow_values_for :${1:field}, "${2:value}" diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/svao.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/svao.snippet new file mode 100644 index 00000000..8eccb887 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/svao.snippet @@ -0,0 +1 @@ +should_validate_acceptance_of :${1:field} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/svno.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/svno.snippet new file mode 100644 index 00000000..a90c1cab --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/svno.snippet @@ -0,0 +1 @@ +should_validate_numericality_of :${1:field} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/svpo.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/svpo.snippet new file mode 100644 index 00000000..13598f86 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/svpo.snippet @@ -0,0 +1 @@ +should_validate_presence_of :${1:field} diff --git a/sources_non_forked/snipmate-snippets/ruby-shoulda/svuo.snippet b/sources_non_forked/snipmate-snippets/ruby-shoulda/svuo.snippet new file mode 100644 index 00000000..6e26912d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby-shoulda/svuo.snippet @@ -0,0 +1 @@ +should_validate_uniqueness_of :${1:field}, :scoped_to => ${2:arrayofnames} diff --git a/sources_non_forked/snipmate-snippets/ruby/Md.snippet b/sources_non_forked/snipmate-snippets/ruby/Md.snippet new file mode 100644 index 00000000..1c2c9f10 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/Md.snippet @@ -0,0 +1 @@ +File.open(${1:dump_path}, "wb") { |${2:file}| Marshal.dump(${3:obj}, ${4:$2}) } diff --git a/sources_non_forked/snipmate-snippets/ruby/Ml.snippet b/sources_non_forked/snipmate-snippets/ruby/Ml.snippet new file mode 100644 index 00000000..33c3200c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/Ml.snippet @@ -0,0 +1 @@ +File.open(${1:dump_path}, "rb") { |${2:file}| Marshal.load(${3:$2}) } diff --git a/sources_non_forked/snipmate-snippets/ruby/Pn.snippet b/sources_non_forked/snipmate-snippets/ruby/Pn.snippet new file mode 100644 index 00000000..e2136913 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/Pn.snippet @@ -0,0 +1 @@ +PStore.new(${1}) diff --git a/sources_non_forked/snipmate-snippets/ruby/Yd.snippet b/sources_non_forked/snipmate-snippets/ruby/Yd.snippet new file mode 100644 index 00000000..e667a081 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/Yd.snippet @@ -0,0 +1 @@ +File.open(${1:path_to_yml}, "w") { |${2:file}| YAML.dump(${3:obj}, ${4:$2}) } diff --git a/sources_non_forked/snipmate-snippets/ruby/Yl.snippet b/sources_non_forked/snipmate-snippets/ruby/Yl.snippet new file mode 100644 index 00000000..b37d1bb5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/Yl.snippet @@ -0,0 +1 @@ +File.open(${1:path_to_yml}) { |${2:file}| YAML.load(${3:$2}) } diff --git a/sources_non_forked/snipmate-snippets/ruby/am.snippet b/sources_non_forked/snipmate-snippets/ruby/am.snippet new file mode 100644 index 00000000..91209b9b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/am.snippet @@ -0,0 +1 @@ +alias_method :${1:new_name}, :${2:old_name} diff --git a/sources_non_forked/snipmate-snippets/ruby/as.snippet b/sources_non_forked/snipmate-snippets/ruby/as.snippet new file mode 100644 index 00000000..a8c7f5cb --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/as.snippet @@ -0,0 +1 @@ +assert ${1:test}, "${2:failure_message}" diff --git a/sources_non_forked/snipmate-snippets/ruby/asam.snippet b/sources_non_forked/snipmate-snippets/ruby/asam.snippet new file mode 100644 index 00000000..3c95b31c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asam.snippet @@ -0,0 +1 @@ +assert_alias_method ${1:object}, ${2:alias_name}, ${3:original_name} diff --git a/sources_non_forked/snipmate-snippets/ruby/asb.snippet b/sources_non_forked/snipmate-snippets/ruby/asb.snippet new file mode 100644 index 00000000..ab1eff71 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asb.snippet @@ -0,0 +1 @@ +assert_boolean ${1:actual} diff --git a/sources_non_forked/snipmate-snippets/ruby/asc.snippet b/sources_non_forked/snipmate-snippets/ruby/asc.snippet new file mode 100644 index 00000000..c6badc3e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asc.snippet @@ -0,0 +1 @@ +assert_compare ${1:expected}, ${2:operator}, ${3:actual} diff --git a/sources_non_forked/snipmate-snippets/ruby/ascd.snippet b/sources_non_forked/snipmate-snippets/ruby/ascd.snippet new file mode 100644 index 00000000..bc77908f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/ascd.snippet @@ -0,0 +1 @@ +assert_const_defined ${1:object}, ${2:constant_name} diff --git a/sources_non_forked/snipmate-snippets/ruby/ase.snippet b/sources_non_forked/snipmate-snippets/ruby/ase.snippet new file mode 100644 index 00000000..5f650990 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/ase.snippet @@ -0,0 +1 @@ +assert_equal ${1:expected}, ${2:actual} diff --git a/sources_non_forked/snipmate-snippets/ruby/asem.snippet b/sources_non_forked/snipmate-snippets/ruby/asem.snippet new file mode 100644 index 00000000..46428325 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asem.snippet @@ -0,0 +1 @@ +assert_empty ${1:object} diff --git a/sources_non_forked/snipmate-snippets/ruby/asf.snippet b/sources_non_forked/snipmate-snippets/ruby/asf.snippet new file mode 100644 index 00000000..27ff6da5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asf.snippet @@ -0,0 +1 @@ +assert_false ${1:actual} diff --git a/sources_non_forked/snipmate-snippets/ruby/asfa.snippet b/sources_non_forked/snipmate-snippets/ruby/asfa.snippet new file mode 100644 index 00000000..f45fa53f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asfa.snippet @@ -0,0 +1 @@ +assert_fail_assertion { ${1:block} } diff --git a/sources_non_forked/snipmate-snippets/ruby/asi.snippet b/sources_non_forked/snipmate-snippets/ruby/asi.snippet new file mode 100644 index 00000000..dedf94d2 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asi.snippet @@ -0,0 +1 @@ +assert_include ${1:collection}, ${2:object} diff --git a/sources_non_forked/snipmate-snippets/ruby/asid.snippet b/sources_non_forked/snipmate-snippets/ruby/asid.snippet new file mode 100644 index 00000000..683fb06c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asid.snippet @@ -0,0 +1 @@ +assert_in_delta ${1:expected_float}, ${2:actual_float}, ${3:delta_float} diff --git a/sources_non_forked/snipmate-snippets/ruby/asie.snippet b/sources_non_forked/snipmate-snippets/ruby/asie.snippet new file mode 100644 index 00000000..f13d0a36 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asie.snippet @@ -0,0 +1 @@ +assert_in_epsilon ${1:expected_float}, ${2:actual_float} diff --git a/sources_non_forked/snipmate-snippets/ruby/asio.snippet b/sources_non_forked/snipmate-snippets/ruby/asio.snippet new file mode 100644 index 00000000..56f0ab7e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asio.snippet @@ -0,0 +1 @@ +assert_instance_of ${1:ExpectedClass}, ${2:actual_instance} diff --git a/sources_non_forked/snipmate-snippets/ruby/asko.snippet b/sources_non_forked/snipmate-snippets/ruby/asko.snippet new file mode 100644 index 00000000..555bf138 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asko.snippet @@ -0,0 +1 @@ +assert_kind_of ${1:ExpectedKind}, ${2:actual_instance} diff --git a/sources_non_forked/snipmate-snippets/ruby/asm.snippet b/sources_non_forked/snipmate-snippets/ruby/asm.snippet new file mode 100644 index 00000000..9860b4cf --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asm.snippet @@ -0,0 +1 @@ +assert_match /${1:expected_pattern}/, ${2:actual_string} diff --git a/sources_non_forked/snipmate-snippets/ruby/asn.snippet b/sources_non_forked/snipmate-snippets/ruby/asn.snippet new file mode 100644 index 00000000..36a2898e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asn.snippet @@ -0,0 +1 @@ +assert_nil ${1:instance} diff --git a/sources_non_forked/snipmate-snippets/ruby/asncd.snippet b/sources_non_forked/snipmate-snippets/ruby/asncd.snippet new file mode 100644 index 00000000..b4dcd735 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asncd.snippet @@ -0,0 +1 @@ +assert_not_const_defined ${1:object}, ${2:constant_name} diff --git a/sources_non_forked/snipmate-snippets/ruby/asne.snippet b/sources_non_forked/snipmate-snippets/ruby/asne.snippet new file mode 100644 index 00000000..91db286a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asne.snippet @@ -0,0 +1 @@ +assert_not_equal ${1:unexpected}, ${2:actual} diff --git a/sources_non_forked/snipmate-snippets/ruby/asnem.snippet b/sources_non_forked/snipmate-snippets/ruby/asnem.snippet new file mode 100644 index 00000000..43d07728 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asnem.snippet @@ -0,0 +1 @@ +assert_not_empty ${1:object} diff --git a/sources_non_forked/snipmate-snippets/ruby/asni.snippet b/sources_non_forked/snipmate-snippets/ruby/asni.snippet new file mode 100644 index 00000000..d450d9ea --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asni.snippet @@ -0,0 +1 @@ +assert_not_include ${1:collection}, ${2:object} diff --git a/sources_non_forked/snipmate-snippets/ruby/asnid.snippet b/sources_non_forked/snipmate-snippets/ruby/asnid.snippet new file mode 100644 index 00000000..23e039ad --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asnid.snippet @@ -0,0 +1 @@ +assert_not_in_delta ${1:expected_float}, ${2:actual_float} diff --git a/sources_non_forked/snipmate-snippets/ruby/asnie.snippet b/sources_non_forked/snipmate-snippets/ruby/asnie.snippet new file mode 100644 index 00000000..25eb7515 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asnie.snippet @@ -0,0 +1 @@ +assert_not_in_epsilon ${1:expected_float}, ${2:actual_float} diff --git a/sources_non_forked/snipmate-snippets/ruby/asnm.snippet b/sources_non_forked/snipmate-snippets/ruby/asnm.snippet new file mode 100644 index 00000000..95dbf247 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asnm.snippet @@ -0,0 +1 @@ +assert_no_match /${1:unexpected_pattern}/, ${2:actual_string} diff --git a/sources_non_forked/snipmate-snippets/ruby/asnn.snippet b/sources_non_forked/snipmate-snippets/ruby/asnn.snippet new file mode 100644 index 00000000..9227bc8a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asnn.snippet @@ -0,0 +1 @@ +assert_not_nil ${1:instance} diff --git a/sources_non_forked/snipmate-snippets/ruby/asnp.snippet b/sources_non_forked/snipmate-snippets/ruby/asnp.snippet new file mode 100644 index 00000000..a540f84d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asnp.snippet @@ -0,0 +1 @@ +assert_not_predicate ${1:object}, ${2:predicate} diff --git a/sources_non_forked/snipmate-snippets/ruby/asnr.snippet b/sources_non_forked/snipmate-snippets/ruby/asnr.snippet new file mode 100644 index 00000000..fc9a8204 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asnr.snippet @@ -0,0 +1 @@ +assert_nothing_raised { ${1:block} } diff --git a/sources_non_forked/snipmate-snippets/ruby/asnrt.snippet b/sources_non_forked/snipmate-snippets/ruby/asnrt.snippet new file mode 100644 index 00000000..fb063d28 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asnrt.snippet @@ -0,0 +1 @@ +assert_not_respond_to ${1:object}, ${2:method} diff --git a/sources_non_forked/snipmate-snippets/ruby/asns.snippet b/sources_non_forked/snipmate-snippets/ruby/asns.snippet new file mode 100644 index 00000000..509e467a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asns.snippet @@ -0,0 +1 @@ +assert_not_same ${1:unexpected}, ${2:actual} diff --git a/sources_non_forked/snipmate-snippets/ruby/asnse.snippet b/sources_non_forked/snipmate-snippets/ruby/asnse.snippet new file mode 100644 index 00000000..befde129 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asnse.snippet @@ -0,0 +1 @@ +assert_not_send ${1:send_array} diff --git a/sources_non_forked/snipmate-snippets/ruby/asnt.snippet b/sources_non_forked/snipmate-snippets/ruby/asnt.snippet new file mode 100644 index 00000000..cb633c22 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asnt.snippet @@ -0,0 +1 @@ +assert_nothing_thrown { ${1} } diff --git a/sources_non_forked/snipmate-snippets/ruby/aso.snippet b/sources_non_forked/snipmate-snippets/ruby/aso.snippet new file mode 100644 index 00000000..5b7faf64 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/aso.snippet @@ -0,0 +1 @@ +assert_operator ${1:left}, :${2:operator}, ${3:right} diff --git a/sources_non_forked/snipmate-snippets/ruby/asp.snippet b/sources_non_forked/snipmate-snippets/ruby/asp.snippet new file mode 100644 index 00000000..c23fd3f6 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asp.snippet @@ -0,0 +1 @@ +assert_predicate ${1:object}, ${2:predicate} diff --git a/sources_non_forked/snipmate-snippets/ruby/aspe.snippet b/sources_non_forked/snipmate-snippets/ruby/aspe.snippet new file mode 100644 index 00000000..3a3eed4f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/aspe.snippet @@ -0,0 +1 @@ +assert_path_exist ${1:path} diff --git a/sources_non_forked/snipmate-snippets/ruby/aspne.snippet b/sources_non_forked/snipmate-snippets/ruby/aspne.snippet new file mode 100644 index 00000000..f7a8873a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/aspne.snippet @@ -0,0 +1 @@ +assert_path_not_exist ${1:path} diff --git a/sources_non_forked/snipmate-snippets/ruby/asr.snippet b/sources_non_forked/snipmate-snippets/ruby/asr.snippet new file mode 100644 index 00000000..834038d5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asr.snippet @@ -0,0 +1 @@ +assert_raise(${1:Exception}) { ${2} } diff --git a/sources_non_forked/snipmate-snippets/ruby/asrko.snippet b/sources_non_forked/snipmate-snippets/ruby/asrko.snippet new file mode 100644 index 00000000..f82820ed --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asrko.snippet @@ -0,0 +1 @@ +assert_raise_kind_of(${1:kinds...}) { ${2:block} } diff --git a/sources_non_forked/snipmate-snippets/ruby/asrm.snippet b/sources_non_forked/snipmate-snippets/ruby/asrm.snippet new file mode 100644 index 00000000..f62f208b --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asrm.snippet @@ -0,0 +1 @@ +assert_raise_message ${1:expected_message} diff --git a/sources_non_forked/snipmate-snippets/ruby/asrt.snippet b/sources_non_forked/snipmate-snippets/ruby/asrt.snippet new file mode 100644 index 00000000..ca8e84b7 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asrt.snippet @@ -0,0 +1 @@ +assert_respond_to ${1:object}, :${2:method} diff --git a/sources_non_forked/snipmate-snippets/ruby/asse.snippet b/sources_non_forked/snipmate-snippets/ruby/asse.snippet new file mode 100644 index 00000000..4fb9ef9a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/asse.snippet @@ -0,0 +1 @@ +assert_send ${1:send_array} diff --git a/sources_non_forked/snipmate-snippets/ruby/ast.snippet b/sources_non_forked/snipmate-snippets/ruby/ast.snippet new file mode 100644 index 00000000..8962cfb7 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/ast.snippet @@ -0,0 +1 @@ +assert_throws(:${1:expected}) { ${2} } diff --git a/sources_non_forked/snipmate-snippets/ruby/astr.snippet b/sources_non_forked/snipmate-snippets/ruby/astr.snippet new file mode 100644 index 00000000..b9d14f6e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/astr.snippet @@ -0,0 +1 @@ +assert_true ${1:actual} diff --git a/sources_non_forked/snipmate-snippets/ruby/bm.snippet b/sources_non_forked/snipmate-snippets/ruby/bm.snippet new file mode 100644 index 00000000..681c5621 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/bm.snippet @@ -0,0 +1,4 @@ +TESTS = ${1:10_000} +Benchmark.bmbm do |results| + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/case.snippet b/sources_non_forked/snipmate-snippets/ruby/case.snippet new file mode 100644 index 00000000..085a45db --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/case.snippet @@ -0,0 +1,5 @@ +case ${1} +when ${2} +else + ${3} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/class.snippet b/sources_non_forked/snipmate-snippets/ruby/class.snippet new file mode 100644 index 00000000..cb396704 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/class.snippet @@ -0,0 +1,3 @@ +class ${1:`Snippet_RubyClassNameFromFilename()`}${2} + ${3} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/classe.snippet b/sources_non_forked/snipmate-snippets/ruby/classe.snippet new file mode 100644 index 00000000..f683c688 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/classe.snippet @@ -0,0 +1 @@ +class ${1:ErrorClassName} < ${2:StandardError}; end${3} diff --git a/sources_non_forked/snipmate-snippets/ruby/def.snippet b/sources_non_forked/snipmate-snippets/ruby/def.snippet new file mode 100644 index 00000000..ad9bc8cf --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/def.snippet @@ -0,0 +1,3 @@ +def ${1:name} + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/defi.snippet b/sources_non_forked/snipmate-snippets/ruby/defi.snippet new file mode 100644 index 00000000..12c354c8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/defi.snippet @@ -0,0 +1,3 @@ +def initialize${1} + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/defmm.snippet b/sources_non_forked/snipmate-snippets/ruby/defmm.snippet new file mode 100644 index 00000000..e3b263a8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/defmm.snippet @@ -0,0 +1,3 @@ +def method_missing(meth, *args, &blk) + ${1} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/defs.snippet b/sources_non_forked/snipmate-snippets/ruby/defs.snippet new file mode 100644 index 00000000..837733f2 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/defs.snippet @@ -0,0 +1,3 @@ +def self.${1:class_method_name} + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/deft.snippet b/sources_non_forked/snipmate-snippets/ruby/deft.snippet new file mode 100644 index 00000000..9c2adbff --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/deft.snippet @@ -0,0 +1,3 @@ +def test_${1:case_name} + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/detect.snippet b/sources_non_forked/snipmate-snippets/ruby/detect.snippet new file mode 100644 index 00000000..5fc24aaa --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/detect.snippet @@ -0,0 +1 @@ +detect { |${1:element}| ${2:body} } diff --git a/sources_non_forked/snipmate-snippets/ruby/detecto.snippet b/sources_non_forked/snipmate-snippets/ruby/detecto.snippet new file mode 100644 index 00000000..904b2a67 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/detecto.snippet @@ -0,0 +1,3 @@ +detect do |${1:element}| + ${2:body} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/dglob.snippet b/sources_non_forked/snipmate-snippets/ruby/dglob.snippet new file mode 100644 index 00000000..ca326ade --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/dglob.snippet @@ -0,0 +1 @@ +Dir.glob(${1:"<+dir}"+>) { |${2:file}| ${3} } diff --git a/sources_non_forked/snipmate-snippets/ruby/do.snippet b/sources_non_forked/snipmate-snippets/ruby/do.snippet new file mode 100644 index 00000000..596c11a9 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/do.snippet @@ -0,0 +1,3 @@ +do + ${1} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/dop.snippet b/sources_non_forked/snipmate-snippets/ruby/dop.snippet new file mode 100644 index 00000000..9bf1898a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/dop.snippet @@ -0,0 +1,3 @@ +do |${1:param}| + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/ea.snippet b/sources_non_forked/snipmate-snippets/ruby/ea.snippet new file mode 100644 index 00000000..5f7edec0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/ea.snippet @@ -0,0 +1 @@ +each { |${1:element}| ${2:body} } diff --git a/sources_non_forked/snipmate-snippets/ruby/each.snippet b/sources_non_forked/snipmate-snippets/ruby/each.snippet new file mode 100644 index 00000000..5f7edec0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/each.snippet @@ -0,0 +1 @@ +each { |${1:element}| ${2:body} } diff --git a/sources_non_forked/snipmate-snippets/ruby/each_with_index.snippet b/sources_non_forked/snipmate-snippets/ruby/each_with_index.snippet new file mode 100644 index 00000000..f4d3ef11 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/each_with_index.snippet @@ -0,0 +1 @@ +each_with_index { |${1:element},${2:i}| ${3:} } diff --git a/sources_non_forked/snipmate-snippets/ruby/each_with_indexo.snippet b/sources_non_forked/snipmate-snippets/ruby/each_with_indexo.snippet new file mode 100644 index 00000000..e4fb7080 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/each_with_indexo.snippet @@ -0,0 +1,4 @@ +each_with_index do |${1:element},${2:i}| + ${3:body} +end + diff --git a/sources_non_forked/snipmate-snippets/ruby/eacho.snippet b/sources_non_forked/snipmate-snippets/ruby/eacho.snippet new file mode 100644 index 00000000..7c133426 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/eacho.snippet @@ -0,0 +1,3 @@ +each do |${1:element}| + ${2:body} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/eado.snippet b/sources_non_forked/snipmate-snippets/ruby/eado.snippet new file mode 100644 index 00000000..7c133426 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/eado.snippet @@ -0,0 +1,3 @@ +each do |${1:element}| + ${2:body} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/eawi.snippet b/sources_non_forked/snipmate-snippets/ruby/eawi.snippet new file mode 100644 index 00000000..f4d3ef11 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/eawi.snippet @@ -0,0 +1 @@ +each_with_index { |${1:element},${2:i}| ${3:} } diff --git a/sources_non_forked/snipmate-snippets/ruby/eawido.snippet b/sources_non_forked/snipmate-snippets/ruby/eawido.snippet new file mode 100644 index 00000000..e4fb7080 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/eawido.snippet @@ -0,0 +1,4 @@ +each_with_index do |${1:element},${2:i}| + ${3:body} +end + diff --git a/sources_non_forked/snipmate-snippets/ruby/elsif.snippet b/sources_non_forked/snipmate-snippets/ruby/elsif.snippet new file mode 100644 index 00000000..84d8134e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/elsif.snippet @@ -0,0 +1,2 @@ +elsif ${1:condition} + ${2} diff --git a/sources_non_forked/snipmate-snippets/ruby/fileeach.snippet b/sources_non_forked/snipmate-snippets/ruby/fileeach.snippet new file mode 100644 index 00000000..5076ef1a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/fileeach.snippet @@ -0,0 +1 @@ +File.foreach(${1:"<+path}"+>) { |${2:line}| ${3} } diff --git a/sources_non_forked/snipmate-snippets/ruby/fopen.snippet b/sources_non_forked/snipmate-snippets/ruby/fopen.snippet new file mode 100644 index 00000000..b630bfeb --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/fopen.snippet @@ -0,0 +1 @@ +File.open(${1:path}, "${2:rwab}") { |${3:file}| ${4} } diff --git a/sources_non_forked/snipmate-snippets/ruby/fread.snippet b/sources_non_forked/snipmate-snippets/ruby/fread.snippet new file mode 100644 index 00000000..d9e6074c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/fread.snippet @@ -0,0 +1 @@ +File.read(${1}) diff --git a/sources_non_forked/snipmate-snippets/ruby/http_get.snippet b/sources_non_forked/snipmate-snippets/ruby/http_get.snippet new file mode 100644 index 00000000..cba6d589 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/http_get.snippet @@ -0,0 +1,2 @@ +require 'net/http' +res = Net::HTTP.get URI.parse('${1:url}') diff --git a/sources_non_forked/snipmate-snippets/ruby/http_post.snippet b/sources_non_forked/snipmate-snippets/ruby/http_post.snippet new file mode 100644 index 00000000..3b2036ad --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/http_post.snippet @@ -0,0 +1,2 @@ +require 'net/http' +res = Net::HTTP.post_form URI.parse('${1:url}')${2:, params} diff --git a/sources_non_forked/snipmate-snippets/ruby/if.snippet b/sources_non_forked/snipmate-snippets/ruby/if.snippet new file mode 100644 index 00000000..b2d1e39e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/if.snippet @@ -0,0 +1,3 @@ +if ${1:condition} + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/ife.snippet b/sources_non_forked/snipmate-snippets/ruby/ife.snippet new file mode 100644 index 00000000..2a7468df --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/ife.snippet @@ -0,0 +1,4 @@ +if ${1:condition} + ${2} +else +end diff --git a/sources_non_forked/snipmate-snippets/ruby/inj.snippet b/sources_non_forked/snipmate-snippets/ruby/inj.snippet new file mode 100644 index 00000000..90dea0d8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/inj.snippet @@ -0,0 +1 @@ +inject(${1:init}) { |${2:total}, ${3:next}| ${4:body} } diff --git a/sources_non_forked/snipmate-snippets/ruby/injdo.snippet b/sources_non_forked/snipmate-snippets/ruby/injdo.snippet new file mode 100644 index 00000000..d3235e90 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/injdo.snippet @@ -0,0 +1,3 @@ +inject(${1:init}) do |${2:total}, ${3:next}| + ${4:body} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/inject.snippet b/sources_non_forked/snipmate-snippets/ruby/inject.snippet new file mode 100644 index 00000000..78ad721d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/inject.snippet @@ -0,0 +1 @@ +inject { |${1:total},${2:next}| ${3:body} } diff --git a/sources_non_forked/snipmate-snippets/ruby/injecto.snippet b/sources_non_forked/snipmate-snippets/ruby/injecto.snippet new file mode 100644 index 00000000..1631033d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/injecto.snippet @@ -0,0 +1,3 @@ +inject do |${1:total},${2:next}| + ${3:body} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/ip.snippet b/sources_non_forked/snipmate-snippets/ruby/ip.snippet new file mode 100644 index 00000000..91769768 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/ip.snippet @@ -0,0 +1 @@ +ip_addr = request.env['REMOTE_ADDR'] diff --git a/sources_non_forked/snipmate-snippets/ruby/map.snippet b/sources_non_forked/snipmate-snippets/ruby/map.snippet new file mode 100644 index 00000000..b3e7719f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/map.snippet @@ -0,0 +1 @@ +map { |${1:element}| ${2:body} } diff --git a/sources_non_forked/snipmate-snippets/ruby/mapdo.snippet b/sources_non_forked/snipmate-snippets/ruby/mapdo.snippet new file mode 100644 index 00000000..316e7c7c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/mapdo.snippet @@ -0,0 +1,3 @@ +map do |${1:element}| + ${2:body} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/mapo.snippet b/sources_non_forked/snipmate-snippets/ruby/mapo.snippet new file mode 100644 index 00000000..316e7c7c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/mapo.snippet @@ -0,0 +1,3 @@ +map do |${1:element}| + ${2:body} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/mod.snippet b/sources_non_forked/snipmate-snippets/ruby/mod.snippet new file mode 100644 index 00000000..457fd615 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/mod.snippet @@ -0,0 +1,3 @@ +module ${1:`Snippet_RubyClassNameFromFilename()`} + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/module.snippet b/sources_non_forked/snipmate-snippets/ruby/module.snippet new file mode 100644 index 00000000..78e025a1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/module.snippet @@ -0,0 +1,14 @@ +module ${1:`Snippet_RubyClassNameFromFilename()`} + module ClassMethods + ${2} + end + + module InstanceMethods + + end + + def self.included(receiver) + receiver.extend ClassMethods + receiver.send :include, InstanceMethods + end +end diff --git a/sources_non_forked/snipmate-snippets/ruby/nam.snippet b/sources_non_forked/snipmate-snippets/ruby/nam.snippet new file mode 100644 index 00000000..19b90a76 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/nam.snippet @@ -0,0 +1,3 @@ +namespace :${1:namespace} do + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/ope.snippet b/sources_non_forked/snipmate-snippets/ruby/ope.snippet new file mode 100644 index 00000000..cfe92471 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/ope.snippet @@ -0,0 +1 @@ +open(${1:path}, "${2:rwab}") { |${3:io}| ${4} } diff --git a/sources_non_forked/snipmate-snippets/ruby/pathhere.snippet b/sources_non_forked/snipmate-snippets/ruby/pathhere.snippet new file mode 100644 index 00000000..f4ed9440 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/pathhere.snippet @@ -0,0 +1 @@ +File.join(File.dirname(__FILE__), *%w[${1:rel_path_here}]) diff --git a/sources_non_forked/snipmate-snippets/ruby/r.snippet b/sources_non_forked/snipmate-snippets/ruby/r.snippet new file mode 100644 index 00000000..f232fc94 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/r.snippet @@ -0,0 +1 @@ +attr_reader :${1:attr_names} diff --git a/sources_non_forked/snipmate-snippets/ruby/reject.snippet b/sources_non_forked/snipmate-snippets/ruby/reject.snippet new file mode 100644 index 00000000..07d2787f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/reject.snippet @@ -0,0 +1 @@ +reject { |${1:element}| ${2:body} } diff --git a/sources_non_forked/snipmate-snippets/ruby/rejecto.snippet b/sources_non_forked/snipmate-snippets/ruby/rejecto.snippet new file mode 100644 index 00000000..e906bd7e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/rejecto.snippet @@ -0,0 +1,3 @@ +reject do |${1:element}| + ${2:body} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/rep.snippet b/sources_non_forked/snipmate-snippets/ruby/rep.snippet new file mode 100644 index 00000000..04b77b0d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/rep.snippet @@ -0,0 +1 @@ +results.report("${1:name}:") { TESTS.times { ${2} } } diff --git a/sources_non_forked/snipmate-snippets/ruby/rw.snippet b/sources_non_forked/snipmate-snippets/ruby/rw.snippet new file mode 100644 index 00000000..1862da33 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/rw.snippet @@ -0,0 +1 @@ +attr_accessor :${1:attr_names} diff --git a/sources_non_forked/snipmate-snippets/ruby/select.snippet b/sources_non_forked/snipmate-snippets/ruby/select.snippet new file mode 100644 index 00000000..8ab228cc --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/select.snippet @@ -0,0 +1 @@ +select { |${1:element}| ${2:body} } diff --git a/sources_non_forked/snipmate-snippets/ruby/selecto.snippet b/sources_non_forked/snipmate-snippets/ruby/selecto.snippet new file mode 100644 index 00000000..a22a6505 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/selecto.snippet @@ -0,0 +1,3 @@ +select do |${1:element}| + ${2:body} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/sinc.snippet b/sources_non_forked/snipmate-snippets/ruby/sinc.snippet new file mode 100644 index 00000000..20e2c4c9 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/sinc.snippet @@ -0,0 +1 @@ +class << self; self end diff --git a/sources_non_forked/snipmate-snippets/ruby/sort.snippet b/sources_non_forked/snipmate-snippets/ruby/sort.snippet new file mode 100644 index 00000000..08a67c1a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/sort.snippet @@ -0,0 +1 @@ +sort { |${1:x},${2:y}| ${3:body} } diff --git a/sources_non_forked/snipmate-snippets/ruby/sorto.snippet b/sources_non_forked/snipmate-snippets/ruby/sorto.snippet new file mode 100644 index 00000000..76c38e40 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/sorto.snippet @@ -0,0 +1,3 @@ +sort do |${1:x},${2:y}| + ${3:body} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/tas.snippet b/sources_non_forked/snipmate-snippets/ruby/tas.snippet new file mode 100644 index 00000000..d949a6b5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/tas.snippet @@ -0,0 +1,4 @@ +desc "${1:Task description}" +task :${2:task_name}${3: => [:dependent, :tasks]} do + ${4} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/task.snippet b/sources_non_forked/snipmate-snippets/ruby/task.snippet new file mode 100644 index 00000000..d949a6b5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/task.snippet @@ -0,0 +1,4 @@ +desc "${1:Task description}" +task :${2:task_name}${3: => [:dependent, :tasks]} do + ${4} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/tc.snippet b/sources_non_forked/snipmate-snippets/ruby/tc.snippet new file mode 100644 index 00000000..3e28f61a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/tc.snippet @@ -0,0 +1,9 @@ +require "test/unit" + +require "${1:library_file_name}" + +class Test${2:`Snippet_RubyClassNameFromFilename()`} < Test::Unit::TestCase + def test_${3:case_name} + ${4} + end +end diff --git a/sources_non_forked/snipmate-snippets/ruby/unless.snippet b/sources_non_forked/snipmate-snippets/ruby/unless.snippet new file mode 100644 index 00000000..3495d2ba --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/unless.snippet @@ -0,0 +1,3 @@ +unless ${1:condition} + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/unlesse.snippet b/sources_non_forked/snipmate-snippets/ruby/unlesse.snippet new file mode 100644 index 00000000..d190b45e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/unlesse.snippet @@ -0,0 +1,4 @@ +unless ${1:condition} + ${2} +else +end diff --git a/sources_non_forked/snipmate-snippets/ruby/w.snippet b/sources_non_forked/snipmate-snippets/ruby/w.snippet new file mode 100644 index 00000000..0650e955 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/w.snippet @@ -0,0 +1 @@ +attr_writer :${1:attr_names} diff --git a/sources_non_forked/snipmate-snippets/ruby/while.snippet b/sources_non_forked/snipmate-snippets/ruby/while.snippet new file mode 100644 index 00000000..6e878fa3 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/while.snippet @@ -0,0 +1,3 @@ +while ${1:condition} + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/xmlr.snippet b/sources_non_forked/snipmate-snippets/ruby/xmlr.snippet new file mode 100644 index 00000000..eeb35802 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/xmlr.snippet @@ -0,0 +1 @@ +REXML::Document.new(File.read(${1:path})) diff --git a/sources_non_forked/snipmate-snippets/ruby/xpa.snippet b/sources_non_forked/snipmate-snippets/ruby/xpa.snippet new file mode 100644 index 00000000..5bff9508 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/xpa.snippet @@ -0,0 +1,3 @@ +elements.each(${1}) do |${2:node}| + ${3} +end diff --git a/sources_non_forked/snipmate-snippets/ruby/zip.snippet b/sources_non_forked/snipmate-snippets/ruby/zip.snippet new file mode 100644 index 00000000..b2c831ab --- /dev/null +++ b/sources_non_forked/snipmate-snippets/ruby/zip.snippet @@ -0,0 +1 @@ +zip(${1:enums}) { |${2:row}| ${3} } diff --git a/sources_non_forked/snipmate-snippets/sinatra/get.snippet b/sources_non_forked/snipmate-snippets/sinatra/get.snippet new file mode 100644 index 00000000..08f3fd5a --- /dev/null +++ b/sources_non_forked/snipmate-snippets/sinatra/get.snippet @@ -0,0 +1,3 @@ +get '${1:/}' do + ${2} +end diff --git a/sources_non_forked/snipmate-snippets/snippets/cpp.snippets b/sources_non_forked/snipmate-snippets/snippets/cpp.snippets deleted file mode 100644 index c177a15b..00000000 --- a/sources_non_forked/snipmate-snippets/snippets/cpp.snippets +++ /dev/null @@ -1,66 +0,0 @@ -# Read File Into Vector -snippet readfile - std::vector v; - if (FILE *${2:fp} = fopen(${1:"filename"}, "r")) { - char buf[1024]; - while (size_t len = fread(buf, 1, sizeof(buf), $2)) - v.insert(v.end(), buf, buf + len); - fclose($2); - }${3} - -# std::map -snippet map - std::map<${1:key}, ${2:value}> ${3}; - -# std::vector -snippet vector - std::vector<${1:char}> ${2}; - -# Namespace -snippet ns - namespace ${1:`Filename('', 'my')`} { - ${2} - } /* namespace $1 */ - -# Class -snippet class - class ${1:`Filename('$1', 'name')`} - { - public: - $1(${2}); - ~$1(); - - private: - ${3:/* data */} - }; - -snippet fori - for (int ${2:i} = 0; $2 < ${1:count}; $2${3:++}) { - ${4:/* code */} - } - -# auto iterator -snippet itera - for (auto ${1:i} = $1.begin(); $1 != $1.end(); ++$1) { - ${2:std::cout << *$1 << std::endl;} - } - -# iterator -snippet iter - for (${1:std::vector}<${2:type}>::${3:const_iterator} ${4:i} = ${5:container}.begin(); $4 != $5.end(); ++$4) { - ${6} - } - -# member function implementations -snippet mfun - ${4:void} ${1:`Filename('$1', 'ClassName')`}::${2:memberFunction}(${3}) { - ${5:return}; - } -snippet scout - std::cout << ${1} << std::endl; -snippet cout - cout << ${1} << endl; -snippet scin - std::cin >> ${1}; -snippet cin - cin >> ${1}; diff --git a/sources_non_forked/snipmate-snippets/snippets/sh.snippets b/sources_non_forked/snipmate-snippets/snippets/sh.snippets deleted file mode 100644 index 508056c8..00000000 --- a/sources_non_forked/snipmate-snippets/snippets/sh.snippets +++ /dev/null @@ -1,43 +0,0 @@ -# Shebang. Executing bash via /usr/bin/env makes scripts more portable. -snippet #! - #!/usr/bin/env bash - -snippet if - if [[ ${1:condition} ]]; then - ${2:#statements} - fi -snippet elif - elif [[ ${1:condition} ]]; then - ${2:#statements} -snippet for - for (( ${2:i} = 0; $2 < ${1:count}; $2++ )); do - ${3:#statements} - done -snippet fori - for ${1:needle} in ${2:haystack} ; do - ${3:#statements} - done -snippet wh - while [[ ${1:condition} ]]; do - ${2:#statements} - done -snippet until - until [[ ${1:condition} ]]; do - ${2:#statements} - done -snippet case - case ${1:word} in - ${2:pattern}) - ${3};; - esac -snippet go - while getopts '${1:o}' ${2:opts} - do - case $$2 in - ${3:o0}) - ${4:#staments};; - esac - done -# Set SCRIPT_DIR variable to directory script is located. -snippet sdir - SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" diff --git a/sources_non_forked/snipmate-snippets/sshconfig/host.snippet b/sources_non_forked/snipmate-snippets/sshconfig/host.snippet new file mode 100644 index 00000000..5992a2d0 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/sshconfig/host.snippet @@ -0,0 +1,3 @@ +Host ${1:name} + Hostname ${2:example.com} + User ${3:username} diff --git a/sources_non_forked/snipmate-snippets/support_functions.vim b/sources_non_forked/snipmate-snippets/support_functions.vim new file mode 100644 index 00000000..a09e81da --- /dev/null +++ b/sources_non_forked/snipmate-snippets/support_functions.vim @@ -0,0 +1,115 @@ +"ruby {{{1 +function! Snippet_RubyClassNameFromFilename(...) + let name = expand("%:t:r") + if len(name) == 0 + if a:0 == 0 + let name = 'MyClass' + else + let name = a:1 + endif + endif + return Snippet_Camelcase(substitute(name, '_spec$', '', '')) +endfunction + +function! Snippet_MigrationNameFromFilename(...) + let name = substitute(expand("%:t:r"), '^.\{-}_', '', '') + if len(name) == 0 + if a:0 == 0 + let name = 'MyClass' + else + let name = a:1 + endif + endif + return Snippet_Camelcase(name) +endfunction + + +"python {{{1 +function! Snippet_PythonClassNameFromFilename(...) + let name = expand("%:t:r") + if len(name) == 0 + if a:0 == 0 + let name = 'MyClass' + else + let name = a:1 + endif + endif + return Snippet_Camelcase(name) +endfunction + +"php {{{1 +function! Snippet_PHPClassNameFromFilename(...) + let name = expand("%:t:r:r") + if len(name) == 0 + if a:0 == 0 + let name = 'MyClass' + else + let name = a:1 + endif + endif + return name +endfunction + +"java {{{1 +function! Snippet_JavaClassNameFromFilename(...) + let name = expand("%:t:r") + if len(name) == 0 + if a:0 == 0 + let name = 'MyClass' + else + let name = a:1 + endif + endif + return name +endfunction + +function! Snippet_JavaInstanceVarType(name) + let oldview = winsaveview() + if searchdecl(a:name) == 0 + normal! B + let old_reg = @" + normal! yaW + let type = @" + let @" = old_reg + call winrestview(oldview) + let type = substitute(type, '\s\+$', '', '') + + "searchdecl treats 'return foo;' as a declaration of foo + if type != 'return' + return type + endif + endif + return "<+type+>" +endfunction + + +"global {{{1 +function! s:start_comment() + return substitute(&commentstring, '^\([^ ]*\)\s*%s\(.*\)$', '\1', '') +endfunction + +function! s:end_comment() + return substitute(&commentstring, '^.*%s\(.*\)$', '\1', '') +endfunction + +function! Snippet_Modeline() + return s:start_comment() . " vim: set ${1:settings}:" . s:end_comment() +endfunction + +function! Snippet_Camelcase(s) + "upcase the first letter + let toReturn = substitute(a:s, '^\(.\)', '\=toupper(submatch(1))', '') + "turn all '_x' into 'X' + return substitute(toReturn, '_\(.\)', '\=toupper(submatch(1))', 'g') +endfunction + +function! Snippet_Underscore(s) + "down the first letter + let toReturn = substitute(a:s, '^\(.\)', '\=tolower(submatch(1))', '') + "turn all 'X' into '_x' + return substitute(toReturn, '\([A-Z]\)', '\=tolower("_".submatch(1))', 'g') +endfunction + + +" modeline {{{1 +" vim: set fdm=marker: diff --git a/sources_non_forked/snipmate-snippets/vim/au.snippet b/sources_non_forked/snipmate-snippets/vim/au.snippet new file mode 100644 index 00000000..d59720a5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/vim/au.snippet @@ -0,0 +1 @@ +autocmd ${1:events} ${2:pattern} ${3:command} diff --git a/sources_non_forked/snipmate-snippets/vim/com.snippet b/sources_non_forked/snipmate-snippets/vim/com.snippet new file mode 100644 index 00000000..b8eeb5b4 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/vim/com.snippet @@ -0,0 +1 @@ +command! -nargs=${1:number_of_args} ${2:other_params} ${2:name} ${2:command} diff --git a/sources_non_forked/snipmate-snippets/vim/func.snippet b/sources_non_forked/snipmate-snippets/vim/func.snippet new file mode 100644 index 00000000..8591a835 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/vim/func.snippet @@ -0,0 +1,8 @@ +"Function: $1 +"Desc: ${3:description} +" +"Arguments: +"${4} +function! ${1:name}(${2}) + ${5} +endfunction diff --git a/sources_non_forked/snipmate-snippets/vim/if.snippet b/sources_non_forked/snipmate-snippets/vim/if.snippet new file mode 100644 index 00000000..336e7a00 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/vim/if.snippet @@ -0,0 +1,3 @@ +if ${1} + ${2} +endif diff --git a/sources_non_forked/snipmate-snippets/vim/ife.snippet b/sources_non_forked/snipmate-snippets/vim/ife.snippet new file mode 100644 index 00000000..c5d16939 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/vim/ife.snippet @@ -0,0 +1,4 @@ +if ${1} + ${2} +else +endif diff --git a/sources_non_forked/snipmate-snippets/vim/log.snippet b/sources_non_forked/snipmate-snippets/vim/log.snippet new file mode 100644 index 00000000..5a867549 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/vim/log.snippet @@ -0,0 +1 @@ +echomsg ${1} diff --git a/sources_non_forked/snipmate-snippets/vim/try.snippet b/sources_non_forked/snipmate-snippets/vim/try.snippet new file mode 100644 index 00000000..cd4c0e72 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/vim/try.snippet @@ -0,0 +1,4 @@ +try + ${2} +catch /${1}/ +endtry diff --git a/sources_non_forked/snipmate-snippets/xslt/call.snippet b/sources_non_forked/snipmate-snippets/xslt/call.snippet new file mode 100644 index 00000000..2fe4f9d1 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/xslt/call.snippet @@ -0,0 +1,3 @@ + + ${2} + diff --git a/sources_non_forked/snipmate-snippets/xslt/choose.snippet b/sources_non_forked/snipmate-snippets/xslt/choose.snippet new file mode 100644 index 00000000..1a877543 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/xslt/choose.snippet @@ -0,0 +1,7 @@ + + + ${2} + + + + diff --git a/sources_non_forked/snipmate-snippets/xslt/mat.snippet b/sources_non_forked/snipmate-snippets/xslt/mat.snippet new file mode 100644 index 00000000..a566e0ec --- /dev/null +++ b/sources_non_forked/snipmate-snippets/xslt/mat.snippet @@ -0,0 +1,3 @@ + + ${2} + diff --git a/sources_non_forked/snipmate-snippets/xslt/out.snippet b/sources_non_forked/snipmate-snippets/xslt/out.snippet new file mode 100644 index 00000000..88e70c21 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/xslt/out.snippet @@ -0,0 +1 @@ + diff --git a/sources_non_forked/snipmate-snippets/xslt/param.snippet b/sources_non_forked/snipmate-snippets/xslt/param.snippet new file mode 100644 index 00000000..f4f9a504 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/xslt/param.snippet @@ -0,0 +1 @@ + diff --git a/sources_non_forked/snipmate-snippets/xslt/sty.snippet b/sources_non_forked/snipmate-snippets/xslt/sty.snippet new file mode 100644 index 00000000..f6751c74 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/xslt/sty.snippet @@ -0,0 +1,3 @@ + + ${1} + diff --git a/sources_non_forked/snipmate-snippets/xslt/tem.snippet b/sources_non_forked/snipmate-snippets/xslt/tem.snippet new file mode 100644 index 00000000..bcd86d6d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/xslt/tem.snippet @@ -0,0 +1,3 @@ + + ${2} + diff --git a/sources_non_forked/snipmate-snippets/xslt/value.snippet b/sources_non_forked/snipmate-snippets/xslt/value.snippet new file mode 100644 index 00000000..9128cc6d --- /dev/null +++ b/sources_non_forked/snipmate-snippets/xslt/value.snippet @@ -0,0 +1 @@ + diff --git a/sources_non_forked/snipmate-snippets/xslt/var.snippet b/sources_non_forked/snipmate-snippets/xslt/var.snippet new file mode 100644 index 00000000..d21b77c8 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/xslt/var.snippet @@ -0,0 +1,3 @@ + + ${2} + diff --git a/sources_non_forked/snipmate-snippets/xslt/wparam.snippet b/sources_non_forked/snipmate-snippets/xslt/wparam.snippet new file mode 100644 index 00000000..2284b71c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/xslt/wparam.snippet @@ -0,0 +1 @@ + diff --git a/sources_non_forked/snipmate-snippets/xslt/xdec.snippet b/sources_non_forked/snipmate-snippets/xslt/xdec.snippet new file mode 100644 index 00000000..f1e44209 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/xslt/xdec.snippet @@ -0,0 +1,2 @@ + + ${2} diff --git a/sources_non_forked/snipmate-snippets/zend/assert.snippet b/sources_non_forked/snipmate-snippets/zend/assert.snippet new file mode 100644 index 00000000..ca928f25 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/zend/assert.snippet @@ -0,0 +1 @@ +$this->assertTrue(${1:somevar}, '${2:sometext}'); diff --git a/sources_non_forked/snipmate-snippets/zend/boolcol.snippet b/sources_non_forked/snipmate-snippets/zend/boolcol.snippet new file mode 100644 index 00000000..715fe19c --- /dev/null +++ b/sources_non_forked/snipmate-snippets/zend/boolcol.snippet @@ -0,0 +1 @@ +$this->hasColumn('${1:active}', '${2:boolean}', ${3:1}, array('default' => '${4:1}','notnull' => true)); diff --git a/sources_non_forked/snipmate-snippets/zend/clac.snippet b/sources_non_forked/snipmate-snippets/zend/clac.snippet new file mode 100644 index 00000000..80972a11 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/zend/clac.snippet @@ -0,0 +1,20 @@ +_flashMessenger->addMessage("${1}", '${2:error}'); diff --git a/sources_non_forked/snipmate-snippets/zend/getconf.snippet b/sources_non_forked/snipmate-snippets/zend/getconf.snippet new file mode 100644 index 00000000..10f2b202 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/zend/getconf.snippet @@ -0,0 +1 @@ +$${1:conf} = Zend_Registry::get('${2:config}')->${3:general}; diff --git a/sources_non_forked/snipmate-snippets/zend/input.snippet b/sources_non_forked/snipmate-snippets/zend/input.snippet new file mode 100644 index 00000000..3c4ed27e --- /dev/null +++ b/sources_non_forked/snipmate-snippets/zend/input.snippet @@ -0,0 +1,4 @@ +formInput(array( 'type' => '${1:hidden}', + 'name' => '${2}', + 'value' => ${3:}, + 'id' => '${4:}' )); ?> diff --git a/sources_non_forked/snipmate-snippets/zend/inputarr.snippet b/sources_non_forked/snipmate-snippets/zend/inputarr.snippet new file mode 100644 index 00000000..8e97bee5 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/zend/inputarr.snippet @@ -0,0 +1,6 @@ +formInput(array( 'type' => '${1:dropdown}', + 'name' => '${2}', + 'label' => '${3:}', + 'errors' => ${4:}, + 'value' => ${5:}, + 'valueList' => ${6:} )); ?> diff --git a/sources_non_forked/snipmate-snippets/zend/intcol.snippet b/sources_non_forked/snipmate-snippets/zend/intcol.snippet new file mode 100644 index 00000000..caacaa61 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/zend/intcol.snippet @@ -0,0 +1 @@ +$this->hasColumn('${1:id}', '${2:integer}', ${3:11}, array(${4:'notnull' => true)}); diff --git a/sources_non_forked/snipmate-snippets/zend/lib.snippet b/sources_non_forked/snipmate-snippets/zend/lib.snippet new file mode 100644 index 00000000..683e22ef --- /dev/null +++ b/sources_non_forked/snipmate-snippets/zend/lib.snippet @@ -0,0 +1,5 @@ +hasColumn('id', 'integer', 4, array('notnull' => true, + 'primary' => true, + 'autoincrement' => true)); + ${3} + } + +} diff --git a/sources_non_forked/snipmate-snippets/zend/navi.snippet b/sources_non_forked/snipmate-snippets/zend/navi.snippet new file mode 100644 index 00000000..2724ff9f --- /dev/null +++ b/sources_non_forked/snipmate-snippets/zend/navi.snippet @@ -0,0 +1 @@ +$this->view->navigationActive = array('topnavi' => '${1:home}','subnavi' => '${2:index}'); diff --git a/sources_non_forked/snipmate-snippets/zend/route.snippet b/sources_non_forked/snipmate-snippets/zend/route.snippet new file mode 100644 index 00000000..cdf834b2 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/zend/route.snippet @@ -0,0 +1 @@ +$this->_redirector->gotoRoute(array('controller' => '${1}', 'action' => '${2:index}', 'id' => '${3:}'), '${4:admin_action}'); diff --git a/sources_non_forked/snipmate-snippets/zend/rp.snippet b/sources_non_forked/snipmate-snippets/zend/rp.snippet new file mode 100644 index 00000000..b5dcd1ff --- /dev/null +++ b/sources_non_forked/snipmate-snippets/zend/rp.snippet @@ -0,0 +1,2 @@ +partial('${1:somefile}.phtml', + array(${2}))?> diff --git a/sources_non_forked/snipmate-snippets/zend/strcol.snippet b/sources_non_forked/snipmate-snippets/zend/strcol.snippet new file mode 100644 index 00000000..98d3cf34 --- /dev/null +++ b/sources_non_forked/snipmate-snippets/zend/strcol.snippet @@ -0,0 +1 @@ +$this->hasColumn('${1:title}', '${2:string}', ${3:255}, array(${4:'notnull' => true})); diff --git a/sources_non_forked/taglist.vim/README b/sources_non_forked/taglist.vim/README new file mode 100644 index 00000000..56bf86fb --- /dev/null +++ b/sources_non_forked/taglist.vim/README @@ -0,0 +1,18 @@ +This is a mirror of http://www.vim.org/scripts/script.php?script_id=273 + +The "Tag List" plugin is a source code browser plugin for Vim and +provides an overview of the structure of source code files and allows +you to efficiently browse through source code files for different +programming languages. You can visit the taglist plugin home page for +more information: + + http://vim-taglist.sourceforge.net + +You can subscribe to the taglist mailing list to post your questions +or suggestions for improvement or to report bugs. Visit the following +page for subscribing to the mailing list: + + http://groups.yahoo.com/group/taglist/ + +For more information about using this plugin, after installing the +taglist plugin, use the ":help taglist" command. diff --git a/sources_non_forked/taglist.vim/doc/taglist.txt b/sources_non_forked/taglist.vim/doc/taglist.txt new file mode 100644 index 00000000..6a62b396 --- /dev/null +++ b/sources_non_forked/taglist.vim/doc/taglist.txt @@ -0,0 +1,1501 @@ +*taglist.txt* Plugin for browsing source code + +Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) +For Vim version 6.0 and above +Last change: 2007 May 24 + +1. Overview |taglist-intro| +2. Taglist on the internet |taglist-internet| +3. Requirements |taglist-requirements| +4. Installation |taglist-install| +5. Usage |taglist-using| +6. Options |taglist-options| +7. Commands |taglist-commands| +8. Global functions |taglist-functions| +9. Extending |taglist-extend| +10. FAQ |taglist-faq| +11. License |taglist-license| +12. Todo |taglist-todo| + +============================================================================== + *taglist-intro* +1. Overview~ + +The "Tag List" plugin is a source code browser plugin for Vim. This plugin +allows you to efficiently browse through source code files for different +programming languages. The "Tag List" plugin provides the following features: + + * Displays the tags (functions, classes, structures, variables, etc.) + defined in a file in a vertically or horizontally split Vim window. + * In GUI Vim, optionally displays the tags in the Tags drop-down menu and + in the popup menu. + * Automatically updates the taglist window as you switch between + files/buffers. As you open new files, the tags defined in the new files + are added to the existing file list and the tags defined in all the + files are displayed grouped by the filename. + * When a tag name is selected from the taglist window, positions the + cursor at the definition of the tag in the source file. + * Automatically highlights the current tag name. + * Groups the tags by their type and displays them in a foldable tree. + * Can display the prototype and scope of a tag. + * Can optionally display the tag prototype instead of the tag name in the + taglist window. + * The tag list can be sorted either by name or by chronological order. + * Supports the following language files: Assembly, ASP, Awk, Beta, C, + C++, C#, Cobol, Eiffel, Erlang, Fortran, HTML, Java, Javascript, Lisp, + Lua, Make, Pascal, Perl, PHP, Python, Rexx, Ruby, Scheme, Shell, Slang, + SML, Sql, TCL, Verilog, Vim and Yacc. + * Can be easily extended to support new languages. Support for + existing languages can be modified easily. + * Provides functions to display the current tag name in the Vim status + line or the window title bar. + * The list of tags and files in the taglist can be saved and + restored across Vim sessions. + * Provides commands to get the name and prototype of the current tag. + * Runs in both console/terminal and GUI versions of Vim. + * Works with the winmanager plugin. Using the winmanager plugin, you + can use Vim plugins like the file explorer, buffer explorer and the + taglist plugin at the same time like an IDE. + * Can be used in both Unix and MS-Windows systems. + +============================================================================== + *taglist-internet* +2. Taglist on the internet~ + +The home page of the taglist plugin is at: +> + http://vim-taglist.sourceforge.net/ +< +You can subscribe to the taglist mailing list to post your questions or +suggestions for improvement or to send bug reports. Visit the following page +for subscribing to the mailing list: +> + http://groups.yahoo.com/group/taglist +< +============================================================================== + *taglist-requirements* +3. Requirements~ + +The taglist plugin requires the following: + + * Vim version 6.0 and above + * Exuberant ctags 5.0 and above + +The taglist plugin will work on all the platforms where the exuberant ctags +utility and Vim are supported (this includes MS-Windows and Unix based +systems). + +The taglist plugin relies on the exuberant ctags utility to dynamically +generate the tag listing. The exuberant ctags utility must be installed in +your system to use this plugin. The exuberant ctags utility is shipped with +most of the Linux distributions. You can download the exuberant ctags utility +from +> + http://ctags.sourceforge.net +< +The taglist plugin doesn't use or create a tags file and there is no need to +create a tags file to use this plugin. The taglist plugin will not work with +the GNU ctags or the Unix ctags utility. + +This plugin relies on the Vim "filetype" detection mechanism to determine the +type of the current file. You have to turn on the Vim filetype detection by +adding the following line to your .vimrc file: +> + filetype on +< +The taglist plugin will not work if you run Vim in the restricted mode (using +the -Z command-line argument). + +The taglist plugin uses the Vim system() function to invoke the exuberant +ctags utility. If Vim is compiled without the system() function then you +cannot use the taglist plugin. Some of the Linux distributions (Suse) compile +Vim without the system() function for security reasons. + +============================================================================== + *taglist-install* +4. Installation~ + +1. Download the taglist.zip file and unzip the files to the $HOME/.vim or the + $HOME/vimfiles or the $VIM/vimfiles directory. After this step, you should + have the following two files (the directory structure should be preserved): + + plugin/taglist.vim - main taglist plugin file + doc/taglist.txt - documentation (help) file + + Refer to the |add-plugin|and |'runtimepath'| Vim help pages for more + details about installing Vim plugins. +2. Change to the $HOME/.vim/doc or $HOME/vimfiles/doc or $VIM/vimfiles/doc + directory, start Vim and run the ":helptags ." command to process the + taglist help file. Without this step, you cannot jump to the taglist help + topics. +3. If the exuberant ctags utility is not present in one of the directories in + the PATH environment variable, then set the 'Tlist_Ctags_Cmd' variable to + point to the location of the exuberant ctags utility (not to the directory) + in the .vimrc file. +4. If you are running a terminal/console version of Vim and the terminal + doesn't support changing the window width then set the + 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file. +5. Restart Vim. +6. You can now use the ":TlistToggle" command to open/close the taglist + window. You can use the ":help taglist" command to get more information + about using the taglist plugin. + +To uninstall the taglist plugin, remove the plugin/taglist.vim and +doc/taglist.txt files from the $HOME/.vim or $HOME/vimfiles directory. + +============================================================================== + *taglist-using* +5. Usage~ + +The taglist plugin can be used in several different ways. + +1. You can keep the taglist window open during the entire editing session. On + opening the taglist window, the tags defined in all the files in the Vim + buffer list will be displayed in the taglist window. As you edit files, the + tags defined in them will be added to the taglist window. You can select a + tag from the taglist window and jump to it. The current tag will be + highlighted in the taglist window. You can close the taglist window when + you no longer need the window. +2. You can configure the taglist plugin to process the tags defined in all the + edited files always. In this configuration, even if the taglist window is + closed and the taglist menu is not displayed, the taglist plugin will + processes the tags defined in newly edited files. You can then open the + taglist window only when you need to select a tag and then automatically + close the taglist window after selecting the tag. +3. You can configure the taglist plugin to display only the tags defined in + the current file in the taglist window. By default, the taglist plugin + displays the tags defined in all the files in the Vim buffer list. As you + switch between files, the taglist window will be refreshed to display only + the tags defined in the current file. +4. In GUI Vim, you can use the Tags pull-down and popup menu created by the + taglist plugin to display the tags defined in the current file and select a + tag to jump to it. You can use the menu without opening the taglist window. + By default, the Tags menu is disabled. +5. You can configure the taglist plugin to display the name of the current tag + in the Vim window status line or in the Vim window title bar. For this to + work without the taglist window or menu, you need to configure the taglist + plugin to process the tags defined in a file always. +6. You can save the tags defined in multiple files to a taglist session file + and load it when needed. You can also configure the taglist plugin to not + update the taglist window when editing new files. You can then manually add + files to the taglist window. + +Opening the taglist window~ +You can open the taglist window using the ":TlistOpen" or the ":TlistToggle" +commands. The ":TlistOpen" command opens the taglist window and jumps to it. +The ":TlistToggle" command opens or closes (toggle) the taglist window and the +cursor remains in the current window. If the 'Tlist_GainFocus_On_ToggleOpen' +variable is set to 1, then the ":TlistToggle" command opens the taglist window +and moves the cursor to the taglist window. + +You can map a key to invoke these commands. For example, the following command +creates a normal mode mapping for the key to toggle the taglist window. +> + nnoremap :TlistToggle +< +Add the above mapping to your ~/.vimrc or $HOME/_vimrc file. + +To automatically open the taglist window on Vim startup, set the +'Tlist_Auto_Open' variable to 1. + +You can also open the taglist window on startup using the following command +line: +> + $ vim +TlistOpen +< +Closing the taglist window~ +You can close the taglist window from the taglist window by pressing 'q' or +using the Vim ":q" command. You can also use any of the Vim window commands to +close the taglist window. Invoking the ":TlistToggle" command when the taglist +window is opened, closes the taglist window. You can also use the +":TlistClose" command to close the taglist window. + +To automatically close the taglist window when a tag or file is selected, you +can set the 'Tlist_Close_On_Select' variable to 1. To exit Vim when only the +taglist window is present, set the 'Tlist_Exit_OnlyWindow' variable to 1. + +Jumping to a tag or a file~ +You can select a tag in the taglist window either by pressing the key +or by double clicking the tag name using the mouse. To jump to a tag on a +single mouse click set the 'Tlist_Use_SingleClick' variable to 1. + +If the selected file is already opened in a window, then the cursor is moved +to that window. If the file is not currently opened in a window then the file +is opened in the window used by the taglist plugin to show the previously +selected file. If there are no usable windows, then the file is opened in a +new window. The file is not opened in special windows like the quickfix +window, preview window and windows containing buffer with the 'buftype' option +set. + +To jump to the tag in a new window, press the 'o' key. To open the file in the +previous window (Ctrl-W_p) use the 'P' key. You can press the 'p' key to jump +to the tag but still keep the cursor in the taglist window (preview). + +To open the selected file in a tab, use the 't' key. If the file is already +present in a tab then the cursor is moved to that tab otherwise the file is +opened in a new tab. To jump to a tag in a new tab press Ctrl-t. The taglist +window is automatically opened in the newly created tab. + +Instead of jumping to a tag, you can open a file by pressing the key +or by double clicking the file name using the mouse. + +In the taglist window, you can use the [[ or key to jump to the +beginning of the previous file. You can use the ]] or key to jump to the +beginning of the next file. When you reach the first or last file, the search +wraps around and the jumps to the next/previous file. + +Highlighting the current tag~ +The taglist plugin automatically highlights the name of the current tag in the +taglist window. The Vim |CursorHold| autocmd event is used for this. If the +current tag name is not visible in the taglist window, then the taglist window +contents are scrolled to make that tag name visible. You can also use the +":TlistHighlightTag" command to force the highlighting of the current tag. + +The tag name is highlighted if no activity is performed for |'updatetime'| +milliseconds. The default value for this Vim option is 4 seconds. To avoid +unexpected problems, you should not set the |'updatetime'| option to a very +low value. + +To disable the automatic highlighting of the current tag name in the taglist +window, set the 'Tlist_Auto_Highlight_Tag' variable to zero. + +When entering a Vim buffer/window, the taglist plugin automatically highlights +the current tag in that buffer/window. If you like to disable the automatic +highlighting of the current tag when entering a buffer, set the +'Tlist_Highlight_Tag_On_BufEnter' variable to zero. + +Adding files to the taglist~ +When the taglist window is opened, all the files in the Vim buffer list are +processed and the supported files are added to the taglist. When you edit a +file in Vim, the taglist plugin automatically processes this file and adds it +to the taglist. If you close the taglist window, the tag information in the +taglist is retained. + +To process files even when the taglist window is not open, set the +'Tlist_Process_File_Always' variable to 1. + +You can manually add multiple files to the taglist without opening them using +the ":TlistAddFiles" and the ":TlistAddFilesRecursive" commands. + +For example, to add all the C files in the /my/project/dir directory to the +taglist, you can use the following command: +> + :TlistAddFiles /my/project/dir/*.c +< +Note that when adding several files with a large number of tags or a large +number of files, it will take several seconds to several minutes for the +taglist plugin to process all the files. You should not interrupt the taglist +plugin by pressing . + +You can recursively add multiple files from a directory tree using the +":TlistAddFilesRecursive" command: +> + :TlistAddFilesRecursive /my/project/dir *.c +< +This command takes two arguments. The first argument specifies the directory +from which to recursively add the files. The second optional argument +specifies the wildcard matching pattern for selecting the files to add. The +default pattern is * and all the files are added. + +Displaying tags for only one file~ +The taglist window displays the tags for all the files in the Vim buffer list +and all the manually added files. To display the tags for only the current +active buffer, set the 'Tlist_Show_One_File' variable to 1. + +Removing files from the taglist~ +You can remove a file from the taglist window, by pressing the 'd' key when the +cursor is on one of the tags listed for the file in the taglist window. The +removed file will no longer be displayed in the taglist window in the current +Vim session. To again display the tags for the file, open the file in a Vim +window and then use the ":TlistUpdate" command or use ":TlistAddFiles" command +to add the file to the taglist. + +When a buffer is removed from the Vim buffer list using the ":bdelete" or the +":bwipeout" command, the taglist is updated to remove the stored information +for this buffer. + +Updating the tags displayed for a file~ +The taglist plugin keeps track of the modification time of a file. When the +modification time changes (the file is modified), the taglist plugin +automatically updates the tags listed for that file. The modification time of +a file is checked when you enter a window containing that file or when you +load that file. + +You can also update or refresh the tags displayed for a file by pressing the +"u" key in the taglist window. If an existing file is modified, after the file +is saved, the taglist plugin automatically updates the tags displayed for the +file. + +You can also use the ":TlistUpdate" command to update the tags for the current +buffer after you made some changes to it. You should save the modified buffer +before you update the taglist window. Otherwise the listed tags will not +include the new tags created in the buffer. + +If you have deleted the tags displayed for a file in the taglist window using +the 'd' key, you can again display the tags for that file using the +":TlistUpdate" command. + +Controlling the taglist updates~ +To disable the automatic processing of new files or modified files, you can +set the 'Tlist_Auto_Update' variable to zero. When this variable is set to +zero, the taglist is updated only when you use the ":TlistUpdate" command or +the ":TlistAddFiles" or the ":TlistAddFilesRecursive" commands. You can use +this option to control which files are added to the taglist. + +You can use the ":TlistLock" command to lock the taglist contents. After this +command is executed, new files are not automatically added to the taglist. +When the taglist is locked, you can use the ":TlistUpdate" command to add the +current file or the ":TlistAddFiles" or ":TlistAddFilesRecursive" commands to +add new files to the taglist. To unlock the taglist, use the ":TlistUnlock" +command. + +Displaying the tag prototype~ +To display the prototype of the tag under the cursor in the taglist window, +press the space bar. If you place the cursor on a tag name in the taglist +window, then the tag prototype is displayed at the Vim status line after +|'updatetime'| milliseconds. The default value for the |'updatetime'| Vim +option is 4 seconds. + +You can get the name and prototype of a tag without opening the taglist window +and the taglist menu using the ":TlistShowTag" and the ":TlistShowPrototype" +commands. These commands will work only if the current file is already present +in the taglist. To use these commands without opening the taglist window, set +the 'Tlist_Process_File_Always' variable to 1. + +You can use the ":TlistShowTag" command to display the name of the tag at or +before the specified line number in the specified file. If the file name and +line number are not supplied, then this command will display the name of the +current tag. For example, +> + :TlistShowTag + :TlistShowTag myfile.java 100 +< +You can use the ":TlistShowPrototype" command to display the prototype of the +tag at or before the specified line number in the specified file. If the file +name and the line number are not supplied, then this command will display the +prototype of the current tag. For example, +> + :TlistShowPrototype + :TlistShowPrototype myfile.c 50 +< +In the taglist window, when the mouse is moved over a tag name, the tag +prototype is displayed in a balloon. This works only in GUI versions where +balloon evaluation is supported. + +Taglist window contents~ +The taglist window contains the tags defined in various files in the taglist +grouped by the filename and by the tag type (variable, function, class, etc.). +For tags with scope information (like class members, structures inside +structures, etc.), the scope information is displayed in square brackets "[]" +after the tag name. + +The contents of the taglist buffer/window are managed by the taglist plugin. +The |'filetype'| for the taglist buffer is set to 'taglist'. The Vim +|'modifiable'| option is turned off for the taglist buffer. You should not +manually edit the taglist buffer, by setting the |'modifiable'| flag. If you +manually edit the taglist buffer contents, then the taglist plugin will be out +of sync with the taglist buffer contents and the plugin will no longer work +correctly. To redisplay the taglist buffer contents again, close the taglist +window and reopen it. + +Opening and closing the tag and file tree~ +In the taglist window, the tag names are displayed as a foldable tree using +the Vim folding support. You can collapse the tree using the '-' key or using +the Vim |zc| fold command. You can open the tree using the '+' key or using +the Vim |zo| fold command. You can open all the folds using the '*' key or +using the Vim |zR| fold command. You can also use the mouse to open/close the +folds. You can close all the folds using the '=' key. You should not manually +create or delete the folds in the taglist window. + +To automatically close the fold for the inactive files/buffers and open only +the fold for the current buffer in the taglist window, set the +'Tlist_File_Fold_Auto_Close' variable to 1. + +Sorting the tags for a file~ +The tags displayed in the taglist window can be sorted either by their name or +by their chronological order. The default sorting method is by the order in +which the tags appear in a file. You can change the default sort method by +setting the 'Tlist_Sort_Type' variable to either "name" or "order". You can +sort the tags by their name by pressing the "s" key in the taglist window. You +can again sort the tags by their chronological order using the "s" key. Each +file in the taglist window can be sorted using different order. + +Zooming in and out of the taglist window~ +You can press the 'x' key in the taglist window to maximize the taglist +window width/height. The window will be maximized to the maximum possible +width/height without closing the other existing windows. You can again press +'x' to restore the taglist window to the default width/height. + + *taglist-session* +Taglist Session~ +A taglist session refers to the group of files and their tags stored in the +taglist in a Vim session. + +You can save and restore a taglist session (and all the displayed tags) using +the ":TlistSessionSave" and ":TlistSessionLoad" commands. + +To save the information about the tags and files in the taglist to a file, use +the ":TlistSessionSave" command and specify the filename: +> + :TlistSessionSave +< +To load a saved taglist session, use the ":TlistSessionLoad" command: > + + :TlistSessionLoad +< +When you load a taglist session file, the tags stored in the file will be +added to the tags already stored in the taglist. + +The taglist session feature can be used to save the tags for large files or a +group of frequently used files (like a project). By using the taglist session +file, you can minimize the amount to time it takes to load/refresh the taglist +for multiple files. + +You can create more than one taglist session file for multiple groups of +files. + +Displaying the tag name in the Vim status line or the window title bar~ +You can use the Tlist_Get_Tagname_By_Line() function provided by the taglist +plugin to display the current tag name in the Vim status line or the window +title bar. Similarly, you can use the Tlist_Get_Tag_Prototype_By_Line() +function to display the current tag prototype in the Vim status line or the +window title bar. + +For example, the following command can be used to display the current tag name +in the status line: +> + :set statusline=%<%f%=%([%{Tlist_Get_Tagname_By_Line()}]%) +< +The following command can be used to display the current tag name in the +window title bar: +> + :set title titlestring=%<%f\ %([%{Tlist_Get_Tagname_By_Line()}]%) +< +Note that the current tag name can be displayed only after the file is +processed by the taglist plugin. For this, you have to either set the +'Tlist_Process_File_Always' variable to 1 or open the taglist window or use +the taglist menu. For more information about configuring the Vim status line, +refer to the documentation for the Vim |'statusline'| option. + +Changing the taglist window highlighting~ +The following Vim highlight groups are defined and used to highlight the +various entities in the taglist window: + + TagListTagName - Used for tag names + TagListTagScope - Used for tag scope + TagListTitle - Used for tag titles + TagListComment - Used for comments + TagListFileName - Used for filenames + +By default, these highlight groups are linked to the standard Vim highlight +groups. If you want to change the colors used for these highlight groups, +prefix the highlight group name with 'My' and define it in your .vimrc or +.gvimrc file: MyTagListTagName, MyTagListTagScope, MyTagListTitle, +MyTagListComment and MyTagListFileName. For example, to change the colors +used for tag names, you can use the following command: +> + :highlight MyTagListTagName guifg=blue ctermfg=blue +< +Controlling the taglist window~ +To use a horizontally split taglist window, instead of a vertically split +window, set the 'Tlist_Use_Horiz_Window' variable to 1. + +To use a vertically split taglist window on the rightmost side of the Vim +window, set the 'Tlist_Use_Right_Window' variable to 1. + +You can specify the width of the vertically split taglist window, by setting +the 'Tlist_WinWidth' variable. You can specify the height of the horizontally +split taglist window, by setting the 'Tlist_WinHeight' variable. + +When opening a vertically split taglist window, the Vim window width is +increased to accommodate the new taglist window. When the taglist window is +closed, the Vim window is reduced. To disable this, set the +'Tlist_Inc_Winwidth' variable to zero. + +To reduce the number of empty lines in the taglist window, set the +'Tlist_Compact_Format' variable to 1. + +To not display the Vim fold column in the taglist window, set the +'Tlist_Enable_Fold_Column' variable to zero. + +To display the tag prototypes instead of the tag names in the taglist window, +set the 'Tlist_Display_Prototype' variable to 1. + +To not display the scope of the tags next to the tag names, set the +'Tlist_Display_Tag_Scope' variable to zero. + + *taglist-keys* +Taglist window key list~ +The following table lists the description of the keys that can be used +in the taglist window. + + Key Description~ + + Jump to the location where the tag under cursor is + defined. + o Jump to the location where the tag under cursor is + defined in a new window. + P Jump to the tag in the previous (Ctrl-W_p) window. + p Display the tag definition in the file window and + keep the cursor in the taglist window itself. + t Jump to the tag in a new tab. If the file is already + opened in a tab, move to that tab. + Ctrl-t Jump to the tag in a new tab. + Display the prototype of the tag under the cursor. + For file names, display the full path to the file, + file type and the number of tags. For tag types, display the + tag type and the number of tags. + u Update the tags listed in the taglist window + s Change the sort order of the tags (by name or by order) + d Remove the tags for the file under the cursor + x Zoom-in or Zoom-out the taglist window + + Open a fold + - Close a fold + * Open all folds + = Close all folds + [[ Jump to the beginning of the previous file + Jump to the beginning of the previous file + ]] Jump to the beginning of the next file + Jump to the beginning of the next file + q Close the taglist window + Display help + +The above keys will work in both the normal mode and the insert mode. + + *taglist-menu* +Taglist menu~ +When using GUI Vim, the taglist plugin can display the tags defined in the +current file in the drop-down menu and the popup menu. By default, this +feature is turned off. To turn on this feature, set the 'Tlist_Show_Menu' +variable to 1. + +You can jump to a tag by selecting the tag name from the menu. You can use the +taglist menu independent of the taglist window i.e. you don't need to open the +taglist window to get the taglist menu. + +When you switch between files/buffers, the taglist menu is automatically +updated to display the tags defined in the current file/buffer. + +The tags are grouped by their type (variables, functions, classes, methods, +etc.) and displayed as a separate sub-menu for each type. If all the tags +defined in a file are of the same type (e.g. functions), then the sub-menu is +not used. + +If the number of items in a tag type submenu exceeds the value specified by +the 'Tlist_Max_Submenu_Items' variable, then the submenu will be split into +multiple submenus. The default setting for 'Tlist_Max_Submenu_Items' is 25. +The first and last tag names in the submenu are used to form the submenu name. +The menu items are prefixed by alpha-numeric characters for easy selection by +keyboard. + +If the popup menu support is enabled (the |'mousemodel'| option contains +"popup"), then the tags menu is added to the popup menu. You can access +the popup menu by right clicking on the GUI window. + +You can regenerate the tags menu by selecting the 'Tags->Refresh menu' entry. +You can sort the tags listed in the menu either by name or by order by +selecting the 'Tags->Sort menu by->Name/Order' menu entry. + +You can tear-off the Tags menu and keep it on the side of the Vim window +for quickly locating the tags. + +Using the taglist plugin with the winmanager plugin~ +You can use the taglist plugin with the winmanager plugin. This will allow you +to use the file explorer, buffer explorer and the taglist plugin at the same +time in different windows. To use the taglist plugin with the winmanager +plugin, set 'TagList' in the 'winManagerWindowLayout' variable. For example, +to use the file explorer plugin and the taglist plugin at the same time, use +the following setting: > + + let winManagerWindowLayout = 'FileExplorer|TagList' +< +Getting help~ +If you have installed the taglist help file (this file), then you can use the +Vim ":help taglist-" command to get help on the various taglist +topics. + +You can press the key in the taglist window to display the help +information about using the taglist window. If you again press the key, +the help information is removed from the taglist window. + + *taglist-debug* +Debugging the taglist plugin~ +You can use the ":TlistDebug" command to enable logging of the debug messages +from the taglist plugin. To display the logged debug messages, you can use the +":TlistMessages" command. To disable the logging of the debug messages, use +the ":TlistUndebug" command. + +You can specify a file name to the ":TlistDebug" command to log the debug +messages to a file. Otherwise, the debug messages are stored in a script-local +variable. In the later case, to minimize memory usage, only the last 3000 +characters from the debug messages are stored. + +============================================================================== + *taglist-options* +6. Options~ + +A number of Vim variables control the behavior of the taglist plugin. These +variables are initialized to a default value. By changing these variables you +can change the behavior of the taglist plugin. You need to change these +settings only if you want to change the behavior of the taglist plugin. You +should use the |:let| command in your .vimrc file to change the setting of any +of these variables. + +The configurable taglist variables are listed below. For a detailed +description of these variables refer to the text below this table. + +|'Tlist_Auto_Highlight_Tag'| Automatically highlight the current tag in the + taglist. +|'Tlist_Auto_Open'| Open the taglist window when Vim starts. +|'Tlist_Auto_Update'| Automatically update the taglist to include + newly edited files. +|'Tlist_Close_On_Select'| Close the taglist window when a file or tag is + selected. +|'Tlist_Compact_Format'| Remove extra information and blank lines from + the taglist window. +|'Tlist_Ctags_Cmd'| Specifies the path to the ctags utility. +|'Tlist_Display_Prototype'| Show prototypes and not tags in the taglist + window. +|'Tlist_Display_Tag_Scope'| Show tag scope next to the tag name. +|'Tlist_Enable_Fold_Column'| Show the fold indicator column in the taglist + window. +|'Tlist_Exit_OnlyWindow'| Close Vim if the taglist is the only window. +|'Tlist_File_Fold_Auto_Close'| Close tag folds for inactive buffers. +|'Tlist_GainFocus_On_ToggleOpen'| + Jump to taglist window on open. +|'Tlist_Highlight_Tag_On_BufEnter'| + On entering a buffer, automatically highlight + the current tag. +|'Tlist_Inc_Winwidth'| Increase the Vim window width to accommodate + the taglist window. +|'Tlist_Max_Submenu_Items'| Maximum number of items in a tags sub-menu. +|'Tlist_Max_Tag_Length'| Maximum tag length used in a tag menu entry. +|'Tlist_Process_File_Always'| Process files even when the taglist window is + closed. +|'Tlist_Show_Menu'| Display the tags menu. +|'Tlist_Show_One_File'| Show tags for the current buffer only. +|'Tlist_Sort_Type'| Sort method used for arranging the tags. +|'Tlist_Use_Horiz_Window'| Use a horizontally split window for the + taglist window. +|'Tlist_Use_Right_Window'| Place the taglist window on the right side. +|'Tlist_Use_SingleClick'| Single click on a tag jumps to it. +|'Tlist_WinHeight'| Horizontally split taglist window height. +|'Tlist_WinWidth'| Vertically split taglist window width. + + *'Tlist_Auto_Highlight_Tag'* +Tlist_Auto_Highlight_Tag~ +The taglist plugin will automatically highlight the current tag in the taglist +window. If you want to disable this, then you can set the +'Tlist_Auto_Highlight_Tag' variable to zero. Note that even though the current +tag highlighting is disabled, the tags for a new file will still be added to +the taglist window. +> + let Tlist_Auto_Highlight_Tag = 0 +< +With the above variable set to 1, you can use the ":TlistHighlightTag" command +to highlight the current tag. + + *'Tlist_Auto_Open'* +Tlist_Auto_Open~ +To automatically open the taglist window, when you start Vim, you can set the +'Tlist_Auto_Open' variable to 1. By default, this variable is set to zero and +the taglist window will not be opened automatically on Vim startup. +> + let Tlist_Auto_Open = 1 +< +The taglist window is opened only when a supported type of file is opened on +Vim startup. For example, if you open text files, then the taglist window will +not be opened. + + *'Tlist_Auto_Update'* +Tlist_Auto_Update~ +When a new file is edited, the tags defined in the file are automatically +processed and added to the taglist. To stop adding new files to the taglist, +set the 'Tlist_Auto_Update' variable to zero. By default, this variable is set +to 1. +> + let Tlist_Auto_Update = 0 +< +With the above variable set to 1, you can use the ":TlistUpdate" command to +add the tags defined in the current file to the taglist. + + *'Tlist_Close_On_Select'* +Tlist_Close_On_Select~ +If you want to close the taglist window when a file or tag is selected, then +set the 'Tlist_Close_On_Select' variable to 1. By default, this variable is +set zero and when you select a tag or file from the taglist window, the window +is not closed. +> + let Tlist_Close_On_Select = 1 +< + *'Tlist_Compact_Format'* +Tlist_Compact_Format~ +By default, empty lines are used to separate different tag types displayed for +a file and the tags displayed for different files in the taglist window. If +you want to display as many tags as possible in the taglist window, you can +set the 'Tlist_Compact_Format' variable to 1 to get a compact display. +> + let Tlist_Compact_Format = 1 +< + *'Tlist_Ctags_Cmd'* +Tlist_Ctags_Cmd~ +The 'Tlist_Ctags_Cmd' variable specifies the location (path) of the exuberant +ctags utility. If exuberant ctags is present in any one of the directories in +the PATH environment variable, then there is no need to set this variable. + +The exuberant ctags tool can be installed under different names. When the +taglist plugin starts up, if the 'Tlist_Ctags_Cmd' variable is not set, it +checks for the names exuberant-ctags, exctags, ctags, ctags.exe and tags in +the PATH environment variable. If any one of the named executable is found, +then the Tlist_Ctags_Cmd variable is set to that name. + +If exuberant ctags is not present in one of the directories specified in the +PATH environment variable, then set this variable to point to the location of +the ctags utility in your system. Note that this variable should point to the +fully qualified exuberant ctags location and NOT to the directory in which +exuberant ctags is installed. If the exuberant ctags tool is not found in +either PATH or in the specified location, then the taglist plugin will not be +loaded. Examples: +> + let Tlist_Ctags_Cmd = 'd:\tools\ctags.exe' + let Tlist_Ctags_Cmd = '/usr/local/bin/ctags' +< + *'Tlist_Display_Prototype'* +Tlist_Display_Prototype~ +By default, only the tag name will be displayed in the taglist window. If you +like to see tag prototypes instead of names, set the 'Tlist_Display_Prototype' +variable to 1. By default, this variable is set to zero and only tag names +will be displayed. +> + let Tlist_Display_Prototype = 1 +< + *'Tlist_Display_Tag_Scope'* +Tlist_Display_Tag_Scope~ +By default, the scope of a tag (like a C++ class) will be displayed in +square brackets next to the tag name. If you don't want the tag scopes +to be displayed, then set the 'Tlist_Display_Tag_Scope' to zero. By default, +this variable is set to 1 and the tag scopes will be displayed. +> + let Tlist_Display_Tag_Scope = 0 +< + *'Tlist_Enable_Fold_Column'* +Tlist_Enable_Fold_Column~ +By default, the Vim fold column is enabled and displayed in the taglist +window. If you wish to disable this (for example, when you are working with a +narrow Vim window or terminal), you can set the 'Tlist_Enable_Fold_Column' +variable to zero. +> + let Tlist_Enable_Fold_Column = 1 +< + *'Tlist_Exit_OnlyWindow'* +Tlist_Exit_OnlyWindow~ +If you want to exit Vim if only the taglist window is currently opened, then +set the 'Tlist_Exit_OnlyWindow' variable to 1. By default, this variable is +set to zero and the Vim instance will not be closed if only the taglist window +is present. +> + let Tlist_Exit_OnlyWindow = 1 +< + *'Tlist_File_Fold_Auto_Close'* +Tlist_File_Fold_Auto_Close~ +By default, the tags tree displayed in the taglist window for all the files is +opened. You can close/fold the tags tree for the files manually. To +automatically close the tags tree for inactive files, you can set the +'Tlist_File_Fold_Auto_Close' variable to 1. When this variable is set to 1, +the tags tree for the current buffer is automatically opened and for all the +other buffers is closed. +> + let Tlist_File_Fold_Auto_Close = 1 +< + *'Tlist_GainFocus_On_ToggleOpen'* +Tlist_GainFocus_On_ToggleOpen~ +When the taglist window is opened using the ':TlistToggle' command, this +option controls whether the cursor is moved to the taglist window or remains +in the current window. By default, this option is set to 0 and the cursor +remains in the current window. When this variable is set to 1, the cursor +moves to the taglist window after opening the taglist window. +> + let Tlist_GainFocus_On_ToggleOpen = 1 +< + *'Tlist_Highlight_Tag_On_BufEnter'* +Tlist_Highlight_Tag_On_BufEnter~ +When you enter a Vim buffer/window, the current tag in that buffer/window is +automatically highlighted in the taglist window. If the current tag name is +not visible in the taglist window, then the taglist window contents are +scrolled to make that tag name visible. If you like to disable the automatic +highlighting of the current tag when entering a buffer, you can set the +'Tlist_Highlight_Tag_On_BufEnter' variable to zero. The default setting for +this variable is 1. +> + let Tlist_Highlight_Tag_On_BufEnter = 0 +< + *'Tlist_Inc_Winwidth'* +Tlist_Inc_Winwidth~ +By default, when the width of the window is less than 100 and a new taglist +window is opened vertically, then the window width is increased by the value +set in the 'Tlist_WinWidth' variable to accommodate the new window. The value +of this variable is used only if you are using a vertically split taglist +window. + +If your terminal doesn't support changing the window width from Vim (older +version of xterm running in a Unix system) or if you see any weird problems in +the screen due to the change in the window width or if you prefer not to +adjust the window width then set the 'Tlist_Inc_Winwidth' variable to zero. +CAUTION: If you are using the MS-Windows version of Vim in a MS-DOS command +window then you must set this variable to zero, otherwise the system may hang +due to a Vim limitation (explained in :help win32-problems) +> + let Tlist_Inc_Winwidth = 0 +< + *'Tlist_Max_Submenu_Items'* +Tlist_Max_Submenu_Items~ +If a file contains too many tags of a particular type (function, variable, +class, etc.), greater than that specified by the 'Tlist_Max_Submenu_Items' +variable, then the menu for that tag type will be split into multiple +sub-menus. The default setting for the 'Tlist_Max_Submenu_Items' variable is +25. This can be changed by setting the 'Tlist_Max_Submenu_Items' variable: +> + let Tlist_Max_Submenu_Items = 20 +< +The name of the submenu is formed using the names of the first and the last +tag entries in that submenu. + + *'Tlist_Max_Tag_Length'* +Tlist_Max_Tag_Length~ +Only the first 'Tlist_Max_Tag_Length' characters from the tag names will be +used to form the tag type submenu name. The default value for this variable is +10. Change the 'Tlist_Max_Tag_Length' setting if you want to include more or +less characters: +> + let Tlist_Max_Tag_Length = 10 +< + *'Tlist_Process_File_Always'* +Tlist_Process_File_Always~ +By default, the taglist plugin will generate and process the tags defined in +the newly opened files only when the taglist window is opened or when the +taglist menu is enabled. When the taglist window is closed, the taglist plugin +will stop processing the tags for newly opened files. + +You can set the 'Tlist_Process_File_Always' variable to 1 to generate the list +of tags for new files even when the taglist window is closed and the taglist +menu is disabled. +> + let Tlist_Process_File_Always = 1 +< +To use the ":TlistShowTag" and the ":TlistShowPrototype" commands without the +taglist window and the taglist menu, you should set this variable to 1. + + *'Tlist_Show_Menu'* +Tlist_Show_Menu~ +When using GUI Vim, you can display the tags defined in the current file in a +menu named "Tags". By default, this feature is turned off. To turn on this +feature, set the 'Tlist_Show_Menu' variable to 1: +> + let Tlist_Show_Menu = 1 +< + *'Tlist_Show_One_File'* +Tlist_Show_One_File~ +By default, the taglist plugin will display the tags defined in all the loaded +buffers in the taglist window. If you prefer to display the tags defined only +in the current buffer, then you can set the 'Tlist_Show_One_File' to 1. When +this variable is set to 1, as you switch between buffers, the taglist window +will be refreshed to display the tags for the current buffer and the tags for +the previous buffer will be removed. +> + let Tlist_Show_One_File = 1 +< + *'Tlist_Sort_Type'* +Tlist_Sort_Type~ +The 'Tlist_Sort_Type' variable specifies the sort order for the tags in the +taglist window. The tags can be sorted either alphabetically by their name or +by the order of their appearance in the file (chronological order). By +default, the tag names will be listed by the order in which they are defined +in the file. You can change the sort type (from name to order or from order to +name) by pressing the "s" key in the taglist window. You can also change the +default sort order by setting 'Tlist_Sort_Type' to "name" or "order": +> + let Tlist_Sort_Type = "name" +< + *'Tlist_Use_Horiz_Window'* +Tlist_Use_Horiz_Window~ +Be default, the tag names are displayed in a vertically split window. If you +prefer a horizontally split window, then set the 'Tlist_Use_Horiz_Window' +variable to 1. If you are running MS-Windows version of Vim in a MS-DOS +command window, then you should use a horizontally split window instead of a +vertically split window. Also, if you are using an older version of xterm in a +Unix system that doesn't support changing the xterm window width, you should +use a horizontally split window. +> + let Tlist_Use_Horiz_Window = 1 +< + *'Tlist_Use_Right_Window'* +Tlist_Use_Right_Window~ +By default, the vertically split taglist window will appear on the left hand +side. If you prefer to open the window on the right hand side, you can set the +'Tlist_Use_Right_Window' variable to 1: +> + let Tlist_Use_Right_Window = 1 +< + *'Tlist_Use_SingleClick'* +Tlist_Use_SingleClick~ +By default, when you double click on the tag name using the left mouse +button, the cursor will be positioned at the definition of the tag. You +can set the 'Tlist_Use_SingleClick' variable to 1 to jump to a tag when +you single click on the tag name using the mouse. By default this variable +is set to zero. +> + let Tlist_Use_SingleClick = 1 +< +Due to a bug in Vim, if you set 'Tlist_Use_SingleClick' to 1 and try to resize +the taglist window using the mouse, then Vim will crash. This problem is fixed +in Vim 6.3 and above. In the meantime, instead of resizing the taglist window +using the mouse, you can use normal Vim window resizing commands to resize the +taglist window. + + *'Tlist_WinHeight'* +Tlist_WinHeight~ +The default height of the horizontally split taglist window is 10. This can be +changed by modifying the 'Tlist_WinHeight' variable: +> + let Tlist_WinHeight = 20 +< +The |'winfixheight'| option is set for the taglist window, to maintain the +height of the taglist window, when new Vim windows are opened and existing +windows are closed. + + *'Tlist_WinWidth'* +Tlist_WinWidth~ +The default width of the vertically split taglist window is 30. This can be +changed by modifying the 'Tlist_WinWidth' variable: +> + let Tlist_WinWidth = 20 +< +Note that the value of the |'winwidth'| option setting determines the minimum +width of the current window. If you set the 'Tlist_WinWidth' variable to a +value less than that of the |'winwidth'| option setting, then Vim will use the +value of the |'winwidth'| option. + +When new Vim windows are opened and existing windows are closed, the taglist +plugin will try to maintain the width of the taglist window to the size +specified by the 'Tlist_WinWidth' variable. + +============================================================================== + *taglist-commands* +7. Commands~ + +The taglist plugin provides the following ex-mode commands: + +|:TlistAddFiles| Add multiple files to the taglist. +|:TlistAddFilesRecursive| + Add files recursively to the taglist. +|:TlistClose| Close the taglist window. +|:TlistDebug| Start logging of taglist debug messages. +|:TlistLock| Stop adding new files to the taglist. +|:TlistMessages| Display the logged taglist plugin debug messages. +|:TlistOpen| Open and jump to the taglist window. +|:TlistSessionSave| Save the information about files and tags in the + taglist to a session file. +|:TlistSessionLoad| Load the information about files and tags stored + in a session file to taglist. +|:TlistShowPrototype| Display the prototype of the tag at or before the + specified line number. +|:TlistShowTag| Display the name of the tag defined at or before the + specified line number. +|:TlistHighlightTag| Highlight the current tag in the taglist window. +|:TlistToggle| Open or close (toggle) the taglist window. +|:TlistUndebug| Stop logging of taglist debug messages. +|:TlistUnlock| Start adding new files to the taglist. +|:TlistUpdate| Update the tags for the current buffer. + + *:TlistAddFiles* +:TlistAddFiles {file(s)} [file(s) ...] + Add one or more specified files to the taglist. You can + specify multiple filenames using wildcards. To specify a + file name with space character, you should escape the space + character with a backslash. + Examples: +> + :TlistAddFiles *.c *.cpp + :TlistAddFiles file1.html file2.html +< + If you specify a large number of files, then it will take some + time for the taglist plugin to process all of them. The + specified files will not be edited in a Vim window and will + not be added to the Vim buffer list. + + *:TlistAddFilesRecursive* +:TlistAddFilesRecursive {directory} [ {pattern} ] + Add files matching {pattern} recursively from the specified + {directory} to the taglist. If {pattern} is not specified, + then '*' is assumed. To specify the current directory, use "." + for {directory}. To specify a directory name with space + character, you should escape the space character with a + backslash. + Examples: +> + :TlistAddFilesRecursive myproject *.java + :TlistAddFilesRecursive smallproject +< + If large number of files are present in the specified + directory tree, then it will take some time for the taglist + plugin to process all of them. + + *:TlistClose* +:TlistClose Close the taglist window. This command can be used from any + one of the Vim windows. + + *:TlistDebug* +:TlistDebug [filename] + Start logging of debug messages from the taglist plugin. + If {filename} is specified, then the debug messages are stored + in the specified file. Otherwise, the debug messages are + stored in a script local variable. If the file {filename} is + already present, then it is overwritten. + + *:TlistLock* +:TlistLock + Lock the taglist and don't process new files. After this + command is executed, newly edited files will not be added to + the taglist. + + *:TlistMessages* +:TlistMessages + Display the logged debug messages from the taglist plugin + in a window. This command works only when logging to a + script-local variable. + + *:TlistOpen* +:TlistOpen Open and jump to the taglist window. Creates the taglist + window, if the window is not opened currently. After executing + this command, the cursor is moved to the taglist window. When + the taglist window is opened for the first time, all the files + in the buffer list are processed and the tags defined in them + are displayed in the taglist window. + + *:TlistSessionSave* +:TlistSessionSave {filename} + Saves the information about files and tags in the taglist to + the specified file. This command can be used to save and + restore the taglist contents across Vim sessions. + + *:TlistSessionLoad* +:TlistSessionLoad {filename} + Load the information about files and tags stored in the + specified session file to the taglist. + + *:TlistShowPrototype* +:TlistShowPrototype [filename] [linenumber] + Display the prototype of the tag at or before the specified + line number. If the file name and the line number are not + specified, then the current file name and line number are + used. A tag spans multiple lines starting from the line where + it is defined to the line before the next tag. This command + displays the prototype for the tag for any line number in this + range. + + *:TlistShowTag* +:TlistShowTag [filename] [linenumber] + Display the name of the tag defined at or before the specified + line number. If the file name and the line number are not + specified, then the current file name and line number are + used. A tag spans multiple lines starting from the line where + it is defined to the line before the next tag. This command + displays the tag name for any line number in this range. + + *:TlistHighlightTag* +:TlistHighlightTag + Highlight the current tag in the taglist window. By default, + the taglist plugin periodically updates the taglist window to + highlight the current tag. This command can be used to force + the taglist plugin to highlight the current tag. + + *:TlistToggle* +:TlistToggle Open or close (toggle) the taglist window. Opens the taglist + window, if the window is not opened currently. Closes the + taglist window, if the taglist window is already opened. When + the taglist window is opened for the first time, all the files + in the buffer list are processed and the tags are displayed in + the taglist window. After executing this command, the cursor + is not moved from the current window to the taglist window. + + *:TlistUndebug* +:TlistUndebug + Stop logging of debug messages from the taglist plugin. + + *:TlistUnlock* +:TlistUnlock + Unlock the taglist and start processing newly edited files. + + *:TlistUpdate* +:TlistUpdate Update the tags information for the current buffer. This + command can be used to re-process the current file/buffer and + get the tags information. As the taglist plugin uses the file + saved in the disk (instead of the file displayed in a Vim + buffer), you should save a modified buffer before you update + the taglist. Otherwise the listed tags will not include the + new tags created in the buffer. You can use this command even + when the taglist window is not opened. + +============================================================================== + *taglist-functions* +8. Global functions~ + +The taglist plugin provides several global functions that can be used from +other Vim plugins to interact with the taglist plugin. These functions are +described below. + +|Tlist_Update_File_Tags()| Update the tags for the specified file +|Tlist_Get_Tag_Prototype_By_Line()| Return the prototype of the tag at or + before the specified line number in the + specified file. +|Tlist_Get_Tagname_By_Line()| Return the name of the tag at or + before the specified line number in + the specified file. +|Tlist_Set_App()| Set the name of the application + controlling the taglist window. + + *Tlist_Update_File_Tags()* +Tlist_Update_File_Tags({filename}, {filetype}) + Update the tags for the file {filename}. The second argument + specifies the Vim filetype for the file. If the taglist plugin + has not processed the file previously, then the exuberant + ctags tool is invoked to generate the tags for the file. + + *Tlist_Get_Tag_Prototype_By_Line()* +Tlist_Get_Tag_Prototype_By_Line([{filename}, {linenumber}]) + Return the prototype of the tag at or before the specified + line number in the specified file. If the filename and line + number are not specified, then the current buffer name and the + current line number are used. + + *Tlist_Get_Tagname_By_Line()* +Tlist_Get_Tagname_By_Line([{filename}, {linenumber}]) + Return the name of the tag at or before the specified line + number in the specified file. If the filename and line number + are not specified, then the current buffer name and the + current line number are used. + + *Tlist_Set_App()* +Tlist_Set_App({appname}) + Set the name of the plugin that controls the taglist plugin + window and buffer. This can be used to integrate the taglist + plugin with other Vim plugins. + + For example, the winmanager plugin and the Cream package use + this function and specify the appname as "winmanager" and + "cream" respectively. + + By default, the taglist plugin is a stand-alone plugin and + controls the taglist window and buffer. If the taglist window + is controlled by an external plugin, then the appname should + be set appropriately. + +============================================================================== + *taglist-extend* +9. Extending~ + +The taglist plugin supports all the languages supported by the exuberant ctags +tool, which includes the following languages: Assembly, ASP, Awk, Beta, C, +C++, C#, Cobol, Eiffel, Erlang, Fortran, HTML, Java, Javascript, Lisp, Lua, +Make, Pascal, Perl, PHP, Python, Rexx, Ruby, Scheme, Shell, Slang, SML, Sql, +TCL, Verilog, Vim and Yacc. + +You can extend the taglist plugin to add support for new languages and also +modify the support for the above listed languages. + +You should NOT make modifications to the taglist plugin script file to add +support for new languages. You will lose these changes when you upgrade to the +next version of the taglist plugin. Instead you should follow the below +described instructions to extend the taglist plugin. + +You can extend the taglist plugin by setting variables in the .vimrc or _vimrc +file. The name of these variables depends on the language name and is +described below. + +Modifying support for an existing language~ +To modify the support for an already supported language, you have to set the +tlist_xxx_settings variable in the ~/.vimrc or $HOME/_vimrc file. Replace xxx +with the Vim filetype name for the language file. For example, to modify the +support for the perl language files, you have to set the tlist_perl_settings +variable. To modify the support for java files, you have to set the +tlist_java_settings variable. + +To determine the filetype name used by Vim for a file, use the following +command in the buffer containing the file: + + :set filetype + +The above command will display the Vim filetype for the current buffer. + +The format of the value set in the tlist_xxx_settings variable is + + ;flag1:name1;flag2:name2;flag3:name3 + +The different fields in the value are separated by the ';' character. + +The first field 'language_name' is the name used by exuberant ctags to refer +to this language file. This name can be different from the file type name used +by Vim. For example, for C++, the language name used by ctags is 'c++' but the +filetype name used by Vim is 'cpp'. To get the list of language names +supported by exuberant ctags, use the following command: + + $ ctags --list-maps=all + +The remaining fields follow the format "flag:name". The sub-field 'flag' is +the language specific flag used by exuberant ctags to generate the +corresponding tags. For example, for the C language, to list only the +functions, the 'f' flag is used. To get the list of flags supported by +exuberant ctags for the various languages use the following command: + + $ ctags --list-kinds=all + +The sub-field 'name' specifies the title text to use for displaying the tags +of a particular type. For example, 'name' can be set to 'functions'. This +field can be set to any text string name. + +For example, to list only the classes and functions defined in a C++ language +file, add the following line to your .vimrc file: + + let tlist_cpp_settings = 'c++;c:class;f:function' + +In the above setting, 'cpp' is the Vim filetype name and 'c++' is the name +used by the exuberant ctags tool. 'c' and 'f' are the flags passed to +exuberant ctags to list C++ classes and functions and 'class' is the title +used for the class tags and 'function' is the title used for the function tags +in the taglist window. + +For example, to display only functions defined in a C file and to use "My +Functions" as the title for the function tags, use + + let tlist_c_settings = 'c;f:My Functions' + +When you set the tlist_xxx_settings variable, you will override the default +setting used by the taglist plugin for the 'xxx' language. You cannot add to +the default options used by the taglist plugin for a particular file type. To +add to the options used by the taglist plugin for a language, copy the option +values from the taglist plugin file to your .vimrc file and modify it. + +Adding support for a new language~ +If you want to add support for a new language to the taglist plugin, you need +to first extend the exuberant ctags tool. For more information about extending +exuberant ctags, visit the following page: + + http://ctags.sourceforge.net/EXTENDING.html + +To add support for a new language, set the tlist_xxx_settings variable in the +~/.vimrc file appropriately as described above. Replace 'xxx' in the variable +name with the Vim filetype name for the new language. + +For example, to extend the taglist plugin to support the latex language, you +can use the following line (assuming, you have already extended exuberant +ctags to support the latex language): + + let tlist_tex_settings='latex;b:bibitem;c:command;l:label' + +With the above line, when you edit files of filetype "tex" in Vim, the taglist +plugin will invoke the exuberant ctags tool passing the "latex" filetype and +the flags b, c and l to generate the tags. The text heading 'bibitem', +'command' and 'label' will be used in the taglist window for the tags which +are generated for the flags b, c and l respectively. + +============================================================================== + *taglist-faq* +10. Frequently Asked Questions~ + +Q. The taglist plugin doesn't work. The taglist window is empty and the tags + defined in a file are not displayed. +A. Are you using Vim version 6.0 and above? The taglist plugin relies on the + features supported by Vim version 6.0 and above. You can use the following + command to get the Vim version: +> + $ vim --version +< + Are you using exuberant ctags version 5.0 and above? The taglist plugin + relies on the features supported by exuberant ctags and will not work with + GNU ctags or the Unix ctags utility. You can use the following command to + determine whether the ctags installed in your system is exuberant ctags: +> + $ ctags --version +< + Is exuberant ctags present in one of the directories in your PATH? If not, + you need to set the Tlist_Ctags_Cmd variable to point to the location of + exuberant ctags. Use the following Vim command to verify that this is setup + correctly: +> + :echo system(Tlist_Ctags_Cmd . ' --version') +< + The above command should display the version information for exuberant + ctags. + + Did you turn on the Vim filetype detection? The taglist plugin relies on + the filetype detected by Vim and passes the filetype to the exuberant ctags + utility to parse the tags. Check the output of the following Vim command: +> + :filetype +< + The output of the above command should contain "filetype detection:ON". + To turn on the filetype detection, add the following line to the .vimrc or + _vimrc file: +> + filetype on +< + Is your version of Vim compiled with the support for the system() function? + The following Vim command should display 1: +> + :echo exists('*system') +< + In some Linux distributions (particularly Suse Linux), the default Vim + installation is built without the support for the system() function. The + taglist plugin uses the system() function to invoke the exuberant ctags + utility. You need to rebuild Vim after enabling the support for the + system() function. If you use the default build options, the system() + function will be supported. + + Do you have the |'shellslash'| option set? You can try disabling the + |'shellslash'| option. When the taglist plugin invokes the exuberant ctags + utility with the path to the file, if the incorrect slashes are used, then + you will see errors. + + Check the shell related Vim options values using the following command: +> + :set shell? shellcmdflag? shellpipe? + :set shellquote? shellredir? shellxquote? +< + If these options are set in your .vimrc or _vimrc file, try removing those + lines. + + Are you using a Unix shell in a MS-Windows environment? For example, + the Unix shell from the MKS-toolkit. Do you have the SHELL environment + set to point to this shell? You can try resetting the SHELL environment + variable. + + If you are using a Unix shell on MS-Windows, you should try to use + exuberant ctags that is compiled for Unix-like environments so that + exuberant ctags will understand path names with forward slash characters. + + Is your filetype supported by the exuberant ctags utility? The file types + supported by the exuberant ctags utility are listed in the ctags help. If a + file type is not supported, you have to extend exuberant ctags. You can use + the following command to list the filetypes supported by exuberant ctags: +> + ctags --list-languages +< + Run the following command from the shell prompt and check whether the tags + defined in your file are listed in the output from exuberant ctags: +> + ctags -f - --format=2 --excmd=pattern --fields=nks +< + If you see your tags in the output from the above command, then the + exuberant ctags utility is properly parsing your file. + + Do you have the .ctags or _ctags or the ctags.cnf file in your home + directory for specifying default options or for extending exuberant ctags? + If you do have this file, check the options in this file and make sure + these options are not interfering with the operation of the taglist plugin. + + If you are using MS-Windows, check the value of the TEMP and TMP + environment variables. If these environment variables are set to a path + with space characters in the name, then try using the DOS 8.3 short name + for the path or set them to a path without the space characters in the + name. For example, if the temporary directory name is "C:\Documents and + Settings\xyz\Local Settings\Temp", then try setting the TEMP variable to + the following: +> + set TEMP=C:\DOCUMEN~1\xyz\LOCALS~1\Temp +< + If exuberant ctags is installed in a directory with space characters in the + name, then try adding the directory to the PATH environment variable or try + setting the 'Tlist_Ctags_Cmd' variable to the shortest path name to ctags + or try copying the exuberant ctags to a path without space characters in + the name. For example, if exuberant ctags is installed in the directory + "C:\Program Files\Ctags", then try setting the 'Tlist_Ctags_Cmd' variable + as below: +> + let Tlist_Ctags_Cmd='C:\Progra~1\Ctags\ctags.exe' +< + If you are using a cygwin compiled version of exuberant ctags on MS-Windows, + make sure that either you have the cygwin compiled sort utility installed + and available in your PATH or compile exuberant ctags with internal sort + support. Otherwise, when exuberant ctags sorts the tags output by invoking + the sort utility, it may end up invoking the MS-Windows version of + sort.exe, thereby resulting in failure. + +Q. When I try to open the taglist window, I am seeing the following error + message. How do I fix this problem? + + Taglist: Failed to generate tags for /my/path/to/file + ctags: illegal option -- -^@usage: ctags [-BFadtuwvx] [-f tagsfile] file ... + +A. The taglist plugin will work only with the exuberant ctags tool. You + cannot use the GNU ctags or the Unix ctags program with the taglist plugin. + You will see an error message similar to the one shown above, if you try + use a non-exuberant ctags program with Vim. To fix this problem, either add + the exuberant ctags tool location to the PATH environment variable or set + the 'Tlist_Ctags_Cmd' variable. + +Q. A file has more than one tag with the same name. When I select a tag name + from the taglist window, the cursor is positioned at the incorrect tag + location. +A. The taglist plugin uses the search pattern generated by the exuberant ctags + utility to position the cursor at the location of a tag definition. If a + file has more than one tag with the same name and same prototype, then the + search pattern will be the same. In this case, when searching for the tag + pattern, the cursor may be positioned at the incorrect location. + +Q. I have made some modifications to my file and introduced new + functions/classes/variables. I have not yet saved my file. The taglist + plugin is not displaying the new tags when I update the taglist window. +A. The exuberant ctags utility will process only files that are present in the + disk. To list the tags defined in a file, you have to save the file and + then update the taglist window. + +Q. I have created a ctags file using the exuberant ctags utility for my source + tree. How do I configure the taglist plugin to use this tags file? +A. The taglist plugin doesn't use a tags file stored in disk. For every opened + file, the taglist plugin invokes the exuberant ctags utility to get the + list of tags dynamically. The Vim system() function is used to invoke + exuberant ctags and get the ctags output. This function internally uses a + temporary file to store the output. This file is deleted after the output + from the command is read. So you will never see the file that contains the + output of exuberant ctags. + +Q. When I set the |'updatetime'| option to a low value (less than 1000) and if + I keep pressing a key with the taglist window open, the current buffer + contents are changed. Why is this? +A. The taglist plugin uses the |CursorHold| autocmd to highlight the current + tag. The CursorHold autocmd triggers for every |'updatetime'| milliseconds. + If the |'updatetime'| option is set to a low value, then the CursorHold + autocmd will be triggered frequently. As the taglist plugin changes + the focus to the taglist window to highlight the current tag, this could + interfere with the key movement resulting in changing the contents of + the current buffer. The workaround for this problem is to not set the + |'updatetime'| option to a low value. + +============================================================================== + *taglist-license* +11. License~ +Permission is hereby granted to use and distribute the taglist plugin, with or +without modifications, provided that this copyright notice is copied with it. +Like anything else that's free, taglist.vim is provided *as is* and comes with +no warranty of any kind, either expressed or implied. In no event will the +copyright holder be liable for any damamges resulting from the use of this +software. + +============================================================================== + *taglist-todo* +12. Todo~ + +1. Group tags according to the scope and display them. For example, + group all the tags belonging to a C++/Java class +2. Support for displaying tags in a modified (not-yet-saved) file. +3. Automatically open the taglist window only for selected filetypes. + For other filetypes, close the taglist window. +4. When using the shell from the MKS toolkit, the taglist plugin + doesn't work. +5. The taglist plugin doesn't work with files edited remotely using the + netrw plugin. The exuberant ctags utility cannot process files over + scp/rcp/ftp, etc. + +============================================================================== + +vim:tw=78:ts=8:noet:ft=help: diff --git a/sources_non_forked/taglist.vim/doc/tags b/sources_non_forked/taglist.vim/doc/tags new file mode 100644 index 00000000..83e80ba1 --- /dev/null +++ b/sources_non_forked/taglist.vim/doc/tags @@ -0,0 +1,62 @@ +'Tlist_Auto_Highlight_Tag' taglist.txt /*'Tlist_Auto_Highlight_Tag'* +'Tlist_Auto_Open' taglist.txt /*'Tlist_Auto_Open'* +'Tlist_Auto_Update' taglist.txt /*'Tlist_Auto_Update'* +'Tlist_Close_On_Select' taglist.txt /*'Tlist_Close_On_Select'* +'Tlist_Compact_Format' taglist.txt /*'Tlist_Compact_Format'* +'Tlist_Ctags_Cmd' taglist.txt /*'Tlist_Ctags_Cmd'* +'Tlist_Display_Prototype' taglist.txt /*'Tlist_Display_Prototype'* +'Tlist_Display_Tag_Scope' taglist.txt /*'Tlist_Display_Tag_Scope'* +'Tlist_Enable_Fold_Column' taglist.txt /*'Tlist_Enable_Fold_Column'* +'Tlist_Exit_OnlyWindow' taglist.txt /*'Tlist_Exit_OnlyWindow'* +'Tlist_File_Fold_Auto_Close' taglist.txt /*'Tlist_File_Fold_Auto_Close'* +'Tlist_GainFocus_On_ToggleOpen' taglist.txt /*'Tlist_GainFocus_On_ToggleOpen'* +'Tlist_Highlight_Tag_On_BufEnter' taglist.txt /*'Tlist_Highlight_Tag_On_BufEnter'* +'Tlist_Inc_Winwidth' taglist.txt /*'Tlist_Inc_Winwidth'* +'Tlist_Max_Submenu_Items' taglist.txt /*'Tlist_Max_Submenu_Items'* +'Tlist_Max_Tag_Length' taglist.txt /*'Tlist_Max_Tag_Length'* +'Tlist_Process_File_Always' taglist.txt /*'Tlist_Process_File_Always'* +'Tlist_Show_Menu' taglist.txt /*'Tlist_Show_Menu'* +'Tlist_Show_One_File' taglist.txt /*'Tlist_Show_One_File'* +'Tlist_Sort_Type' taglist.txt /*'Tlist_Sort_Type'* +'Tlist_Use_Horiz_Window' taglist.txt /*'Tlist_Use_Horiz_Window'* +'Tlist_Use_Right_Window' taglist.txt /*'Tlist_Use_Right_Window'* +'Tlist_Use_SingleClick' taglist.txt /*'Tlist_Use_SingleClick'* +'Tlist_WinHeight' taglist.txt /*'Tlist_WinHeight'* +'Tlist_WinWidth' taglist.txt /*'Tlist_WinWidth'* +:TlistAddFiles taglist.txt /*:TlistAddFiles* +:TlistAddFilesRecursive taglist.txt /*:TlistAddFilesRecursive* +:TlistClose taglist.txt /*:TlistClose* +:TlistDebug taglist.txt /*:TlistDebug* +:TlistHighlightTag taglist.txt /*:TlistHighlightTag* +:TlistLock taglist.txt /*:TlistLock* +:TlistMessages taglist.txt /*:TlistMessages* +:TlistOpen taglist.txt /*:TlistOpen* +:TlistSessionLoad taglist.txt /*:TlistSessionLoad* +:TlistSessionSave taglist.txt /*:TlistSessionSave* +:TlistShowPrototype taglist.txt /*:TlistShowPrototype* +:TlistShowTag taglist.txt /*:TlistShowTag* +:TlistToggle taglist.txt /*:TlistToggle* +:TlistUndebug taglist.txt /*:TlistUndebug* +:TlistUnlock taglist.txt /*:TlistUnlock* +:TlistUpdate taglist.txt /*:TlistUpdate* +Tlist_Get_Tag_Prototype_By_Line() taglist.txt /*Tlist_Get_Tag_Prototype_By_Line()* +Tlist_Get_Tagname_By_Line() taglist.txt /*Tlist_Get_Tagname_By_Line()* +Tlist_Set_App() taglist.txt /*Tlist_Set_App()* +Tlist_Update_File_Tags() taglist.txt /*Tlist_Update_File_Tags()* +taglist-commands taglist.txt /*taglist-commands* +taglist-debug taglist.txt /*taglist-debug* +taglist-extend taglist.txt /*taglist-extend* +taglist-faq taglist.txt /*taglist-faq* +taglist-functions taglist.txt /*taglist-functions* +taglist-install taglist.txt /*taglist-install* +taglist-internet taglist.txt /*taglist-internet* +taglist-intro taglist.txt /*taglist-intro* +taglist-keys taglist.txt /*taglist-keys* +taglist-license taglist.txt /*taglist-license* +taglist-menu taglist.txt /*taglist-menu* +taglist-options taglist.txt /*taglist-options* +taglist-requirements taglist.txt /*taglist-requirements* +taglist-session taglist.txt /*taglist-session* +taglist-todo taglist.txt /*taglist-todo* +taglist-using taglist.txt /*taglist-using* +taglist.txt taglist.txt /*taglist.txt* diff --git a/sources_non_forked/taglist.vim/plugin/taglist.vim b/sources_non_forked/taglist.vim/plugin/taglist.vim new file mode 100644 index 00000000..59901f64 --- /dev/null +++ b/sources_non_forked/taglist.vim/plugin/taglist.vim @@ -0,0 +1,4546 @@ +" File: taglist.vim +" Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) +" Version: 4.5 +" Last Modified: September 21, 2007 +" Copyright: Copyright (C) 2002-2007 Yegappan Lakshmanan +" Permission is hereby granted to use and distribute this code, +" with or without modifications, provided that this copyright +" notice is copied with it. Like anything else that's free, +" taglist.vim is provided *as is* and comes with no warranty of any +" kind, either expressed or implied. In no event will the copyright +" holder be liable for any damamges resulting from the use of this +" software. +" +" The "Tag List" plugin is a source code browser plugin for Vim and provides +" an overview of the structure of the programming language files and allows +" you to efficiently browse through source code files for different +" programming languages. You can visit the taglist plugin home page for more +" information: +" +" http://vim-taglist.sourceforge.net +" +" You can subscribe to the taglist mailing list to post your questions +" or suggestions for improvement or to report bugs. Visit the following +" page for subscribing to the mailing list: +" +" http://groups.yahoo.com/group/taglist/ +" +" For more information about using this plugin, after installing the +" taglist plugin, use the ":help taglist" command. +" +" Installation +" ------------ +" 1. Download the taglist.zip file and unzip the files to the $HOME/.vim +" or the $HOME/vimfiles or the $VIM/vimfiles directory. This should +" unzip the following two files (the directory structure should be +" preserved): +" +" plugin/taglist.vim - main taglist plugin file +" doc/taglist.txt - documentation (help) file +" +" Refer to the 'add-plugin', 'add-global-plugin' and 'runtimepath' +" Vim help pages for more details about installing Vim plugins. +" 2. Change to the $HOME/.vim/doc or $HOME/vimfiles/doc or +" $VIM/vimfiles/doc directory, start Vim and run the ":helptags ." +" command to process the taglist help file. +" 3. If the exuberant ctags utility is not present in your PATH, then set the +" Tlist_Ctags_Cmd variable to point to the location of the exuberant ctags +" utility (not to the directory) in the .vimrc file. +" 4. If you are running a terminal/console version of Vim and the +" terminal doesn't support changing the window width then set the +" 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file. +" 5. Restart Vim. +" 6. You can now use the ":TlistToggle" command to open/close the taglist +" window. You can use the ":help taglist" command to get more +" information about using the taglist plugin. +" +" ****************** Do not modify after this line ************************ + +" Line continuation used here +let s:cpo_save = &cpo +set cpo&vim + +if !exists('loaded_taglist') + " First time loading the taglist plugin + " + " To speed up the loading of Vim, the taglist plugin uses autoload + " mechanism to load the taglist functions. + " Only define the configuration variables, user commands and some + " auto-commands and finish sourcing the file + + " The taglist plugin requires the built-in Vim system() function. If this + " function is not available, then don't load the plugin. + if !exists('*system') + echomsg 'Taglist: Vim system() built-in function is not available. ' . + \ 'Plugin is not loaded.' + let loaded_taglist = 'no' + let &cpo = s:cpo_save + finish + endif + + " Location of the exuberant ctags tool + if !exists('Tlist_Ctags_Cmd') + if executable('exuberant-ctags') + " On Debian Linux, exuberant ctags is installed + " as exuberant-ctags + let Tlist_Ctags_Cmd = 'exuberant-ctags' + elseif executable('exctags') + " On Free-BSD, exuberant ctags is installed as exctags + let Tlist_Ctags_Cmd = 'exctags' + elseif executable('ctags') + let Tlist_Ctags_Cmd = 'ctags' + elseif executable('ctags.exe') + let Tlist_Ctags_Cmd = 'ctags.exe' + elseif executable('tags') + let Tlist_Ctags_Cmd = 'tags' + else + echomsg 'Taglist: Exuberant ctags (http://ctags.sf.net) ' . + \ 'not found in PATH. Plugin is not loaded.' + " Skip loading the plugin + let loaded_taglist = 'no' + let &cpo = s:cpo_save + finish + endif + endif + + + " Automatically open the taglist window on Vim startup + if !exists('Tlist_Auto_Open') + let Tlist_Auto_Open = 0 + endif + + " When the taglist window is toggle opened, move the cursor to the + " taglist window + if !exists('Tlist_GainFocus_On_ToggleOpen') + let Tlist_GainFocus_On_ToggleOpen = 0 + endif + + " Process files even when the taglist window is not open + if !exists('Tlist_Process_File_Always') + let Tlist_Process_File_Always = 0 + endif + + if !exists('Tlist_Show_Menu') + let Tlist_Show_Menu = 0 + endif + + " Tag listing sort type - 'name' or 'order' + if !exists('Tlist_Sort_Type') + let Tlist_Sort_Type = 'order' + endif + + " Tag listing window split (horizontal/vertical) control + if !exists('Tlist_Use_Horiz_Window') + let Tlist_Use_Horiz_Window = 0 + endif + + " Open the vertically split taglist window on the left or on the right + " side. This setting is relevant only if Tlist_Use_Horiz_Window is set to + " zero (i.e. only for vertically split windows) + if !exists('Tlist_Use_Right_Window') + let Tlist_Use_Right_Window = 0 + endif + + " Increase Vim window width to display vertically split taglist window. + " For MS-Windows version of Vim running in a MS-DOS window, this must be + " set to 0 otherwise the system may hang due to a Vim limitation. + if !exists('Tlist_Inc_Winwidth') + if (has('win16') || has('win95')) && !has('gui_running') + let Tlist_Inc_Winwidth = 0 + else + let Tlist_Inc_Winwidth = 1 + endif + endif + + " Vertically split taglist window width setting + if !exists('Tlist_WinWidth') + let Tlist_WinWidth = 30 + endif + + " Horizontally split taglist window height setting + if !exists('Tlist_WinHeight') + let Tlist_WinHeight = 10 + endif + + " Display tag prototypes or tag names in the taglist window + if !exists('Tlist_Display_Prototype') + let Tlist_Display_Prototype = 0 + endif + + " Display tag scopes in the taglist window + if !exists('Tlist_Display_Tag_Scope') + let Tlist_Display_Tag_Scope = 1 + endif + + " Use single left mouse click to jump to a tag. By default this is disabled. + " Only double click using the mouse will be processed. + if !exists('Tlist_Use_SingleClick') + let Tlist_Use_SingleClick = 0 + endif + + " Control whether additional help is displayed as part of the taglist or + " not. Also, controls whether empty lines are used to separate the tag + " tree. + if !exists('Tlist_Compact_Format') + let Tlist_Compact_Format = 0 + endif + + " Exit Vim if only the taglist window is currently open. By default, this is + " set to zero. + if !exists('Tlist_Exit_OnlyWindow') + let Tlist_Exit_OnlyWindow = 0 + endif + + " Automatically close the folds for the non-active files in the taglist + " window + if !exists('Tlist_File_Fold_Auto_Close') + let Tlist_File_Fold_Auto_Close = 0 + endif + + " Close the taglist window when a tag is selected + if !exists('Tlist_Close_On_Select') + let Tlist_Close_On_Select = 0 + endif + + " Automatically update the taglist window to display tags for newly + " edited files + if !exists('Tlist_Auto_Update') + let Tlist_Auto_Update = 1 + endif + + " Automatically highlight the current tag + if !exists('Tlist_Auto_Highlight_Tag') + let Tlist_Auto_Highlight_Tag = 1 + endif + + " Automatically highlight the current tag on entering a buffer + if !exists('Tlist_Highlight_Tag_On_BufEnter') + let Tlist_Highlight_Tag_On_BufEnter = 1 + endif + + " Enable fold column to display the folding for the tag tree + if !exists('Tlist_Enable_Fold_Column') + let Tlist_Enable_Fold_Column = 1 + endif + + " Display the tags for only one file in the taglist window + if !exists('Tlist_Show_One_File') + let Tlist_Show_One_File = 0 + endif + + if !exists('Tlist_Max_Submenu_Items') + let Tlist_Max_Submenu_Items = 20 + endif + + if !exists('Tlist_Max_Tag_Length') + let Tlist_Max_Tag_Length = 10 + endif + + " Do not change the name of the taglist title variable. The winmanager + " plugin relies on this name to determine the title for the taglist + " plugin. + let TagList_title = "__Tag_List__" + + " Taglist debug messages + let s:tlist_msg = '' + + " Define the taglist autocommand to automatically open the taglist window + " on Vim startup + if g:Tlist_Auto_Open + autocmd VimEnter * nested call s:Tlist_Window_Check_Auto_Open() + endif + + " Refresh the taglist + if g:Tlist_Process_File_Always + autocmd BufEnter * call s:Tlist_Refresh() + endif + + if g:Tlist_Show_Menu + autocmd GUIEnter * call s:Tlist_Menu_Init() + endif + + " When the taglist buffer is created when loading a Vim session file, + " the taglist buffer needs to be initialized. The BufFilePost event + " is used to handle this case. + autocmd BufFilePost __Tag_List__ call s:Tlist_Vim_Session_Load() + + " Define the user commands to manage the taglist window + command! -nargs=0 -bar TlistToggle call s:Tlist_Window_Toggle() + command! -nargs=0 -bar TlistOpen call s:Tlist_Window_Open() + " For backwards compatiblity define the Tlist command + command! -nargs=0 -bar Tlist TlistToggle + command! -nargs=+ -complete=file TlistAddFiles + \ call s:Tlist_Add_Files() + command! -nargs=+ -complete=dir TlistAddFilesRecursive + \ call s:Tlist_Add_Files_Recursive() + command! -nargs=0 -bar TlistClose call s:Tlist_Window_Close() + command! -nargs=0 -bar TlistUpdate call s:Tlist_Update_Current_File() + command! -nargs=0 -bar TlistHighlightTag call s:Tlist_Window_Highlight_Tag( + \ fnamemodify(bufname('%'), ':p'), line('.'), 2, 1) + " For backwards compatiblity define the TlistSync command + command! -nargs=0 -bar TlistSync TlistHighlightTag + command! -nargs=* -complete=buffer TlistShowPrototype + \ echo Tlist_Get_Tag_Prototype_By_Line() + command! -nargs=* -complete=buffer TlistShowTag + \ echo Tlist_Get_Tagname_By_Line() + command! -nargs=* -complete=file TlistSessionLoad + \ call s:Tlist_Session_Load() + command! -nargs=* -complete=file TlistSessionSave + \ call s:Tlist_Session_Save() + command! -bar TlistLock let Tlist_Auto_Update=0 + command! -bar TlistUnlock let Tlist_Auto_Update=1 + + " Commands for enabling/disabling debug and to display debug messages + command! -nargs=? -complete=file -bar TlistDebug + \ call s:Tlist_Debug_Enable() + command! -nargs=0 -bar TlistUndebug call s:Tlist_Debug_Disable() + command! -nargs=0 -bar TlistMessages call s:Tlist_Debug_Show() + + " Define autocommands to autoload the taglist plugin when needed. + + " Trick to get the current script ID + map xx xx + let s:tlist_sid = substitute(maparg('xx'), '\(\d\+_\)xx$', + \ '\1', '') + unmap xx + + exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_* source ' . + \ escape(expand(''), ' ') + exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Window_* source ' . + \ escape(expand(''), ' ') + exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Menu_* source ' . + \ escape(expand(''), ' ') + exe 'autocmd FuncUndefined Tlist_* source ' . + \ escape(expand(''), ' ') + exe 'autocmd FuncUndefined TagList_* source ' . + \ escape(expand(''), ' ') + + let loaded_taglist = 'fast_load_done' + + if g:Tlist_Show_Menu && has('gui_running') + call s:Tlist_Menu_Init() + endif + + " restore 'cpo' + let &cpo = s:cpo_save + finish +endif + +if !exists('s:tlist_sid') + " Two or more versions of taglist plugin are installed. Don't + " load this version of the plugin. + finish +endif + +unlet! s:tlist_sid + +if loaded_taglist != 'fast_load_done' + " restore 'cpo' + let &cpo = s:cpo_save + finish +endif + +" Taglist plugin functionality is available +let loaded_taglist = 'available' + +"------------------- end of user configurable options -------------------- + +" Default language specific settings for supported file types and tag types +" +" Variable name format: +" +" s:tlist_def_{vim_ftype}_settings +" +" vim_ftype - Filetype detected by Vim +" +" Value format: +" +" ;:;:;... +" +" ctags_ftype - File type supported by exuberant ctags +" flag - Flag supported by exuberant ctags to generate a tag type +" name - Name of the tag type used in the taglist window to display the +" tags of this type +" + +" assembly language +let s:tlist_def_asm_settings = 'asm;d:define;l:label;m:macro;t:type' + +" aspperl language +let s:tlist_def_aspperl_settings = 'asp;f:function;s:sub;v:variable' + +" aspvbs language +let s:tlist_def_aspvbs_settings = 'asp;f:function;s:sub;v:variable' + +" awk language +let s:tlist_def_awk_settings = 'awk;f:function' + +" beta language +let s:tlist_def_beta_settings = 'beta;f:fragment;s:slot;v:pattern' + +" c language +let s:tlist_def_c_settings = 'c;d:macro;g:enum;s:struct;u:union;t:typedef;' . + \ 'v:variable;f:function' + +" c++ language +let s:tlist_def_cpp_settings = 'c++;n:namespace;v:variable;d:macro;t:typedef;' . + \ 'c:class;g:enum;s:struct;u:union;f:function' + +" c# language +let s:tlist_def_cs_settings = 'c#;d:macro;t:typedef;n:namespace;c:class;' . + \ 'E:event;g:enum;s:struct;i:interface;' . + \ 'p:properties;m:method' + +" cobol language +let s:tlist_def_cobol_settings = 'cobol;d:data;f:file;g:group;p:paragraph;' . + \ 'P:program;s:section' + +" eiffel language +let s:tlist_def_eiffel_settings = 'eiffel;c:class;f:feature' + +" erlang language +let s:tlist_def_erlang_settings = 'erlang;d:macro;r:record;m:module;f:function' + +" expect (same as tcl) language +let s:tlist_def_expect_settings = 'tcl;c:class;f:method;p:procedure' + +" fortran language +let s:tlist_def_fortran_settings = 'fortran;p:program;b:block data;' . + \ 'c:common;e:entry;i:interface;k:type;l:label;m:module;' . + \ 'n:namelist;t:derived;v:variable;f:function;s:subroutine' + +" HTML language +let s:tlist_def_html_settings = 'html;a:anchor;f:javascript function' + +" java language +let s:tlist_def_java_settings = 'java;p:package;c:class;i:interface;' . + \ 'f:field;m:method' + +" javascript language +let s:tlist_def_javascript_settings = 'javascript;f:function' + +" lisp language +let s:tlist_def_lisp_settings = 'lisp;f:function' + +" lua language +let s:tlist_def_lua_settings = 'lua;f:function' + +" makefiles +let s:tlist_def_make_settings = 'make;m:macro' + +" pascal language +let s:tlist_def_pascal_settings = 'pascal;f:function;p:procedure' + +" perl language +let s:tlist_def_perl_settings = 'perl;c:constant;l:label;p:package;s:subroutine' + +" php language +let s:tlist_def_php_settings = 'php;c:class;d:constant;v:variable;f:function' + +" python language +let s:tlist_def_python_settings = 'python;c:class;m:member;f:function' + +" rexx language +let s:tlist_def_rexx_settings = 'rexx;s:subroutine' + +" ruby language +let s:tlist_def_ruby_settings = 'ruby;c:class;f:method;F:function;' . + \ 'm:singleton method' + +" scheme language +let s:tlist_def_scheme_settings = 'scheme;s:set;f:function' + +" shell language +let s:tlist_def_sh_settings = 'sh;f:function' + +" C shell language +let s:tlist_def_csh_settings = 'sh;f:function' + +" Z shell language +let s:tlist_def_zsh_settings = 'sh;f:function' + +" slang language +let s:tlist_def_slang_settings = 'slang;n:namespace;f:function' + +" sml language +let s:tlist_def_sml_settings = 'sml;e:exception;c:functor;s:signature;' . + \ 'r:structure;t:type;v:value;f:function' + +" sql language +let s:tlist_def_sql_settings = 'sql;c:cursor;F:field;P:package;r:record;' . + \ 's:subtype;t:table;T:trigger;v:variable;f:function;p:procedure' + +" tcl language +let s:tlist_def_tcl_settings = 'tcl;c:class;f:method;m:method;p:procedure' + +" vera language +let s:tlist_def_vera_settings = 'vera;c:class;d:macro;e:enumerator;' . + \ 'f:function;g:enum;m:member;p:program;' . + \ 'P:prototype;t:task;T:typedef;v:variable;' . + \ 'x:externvar' + +"verilog language +let s:tlist_def_verilog_settings = 'verilog;m:module;c:constant;P:parameter;' . + \ 'e:event;r:register;t:task;w:write;p:port;v:variable;f:function' + +" vim language +let s:tlist_def_vim_settings = 'vim;a:autocmds;v:variable;f:function' + +" yacc language +let s:tlist_def_yacc_settings = 'yacc;l:label' + +"------------------- end of language specific options -------------------- + +" Vim window size is changed by the taglist plugin or not +let s:tlist_winsize_chgd = -1 +" Taglist window is maximized or not +let s:tlist_win_maximized = 0 +" Name of files in the taglist +let s:tlist_file_names='' +" Number of files in the taglist +let s:tlist_file_count = 0 +" Number of filetypes supported by taglist +let s:tlist_ftype_count = 0 +" Is taglist part of other plugins like winmanager or cream? +let s:tlist_app_name = "none" +" Are we displaying brief help text +let s:tlist_brief_help = 1 +" List of files removed on user request +let s:tlist_removed_flist = "" +" Index of current file displayed in the taglist window +let s:tlist_cur_file_idx = -1 +" Taglist menu is empty or not +let s:tlist_menu_empty = 1 + +" An autocommand is used to refresh the taglist window when entering any +" buffer. We don't want to refresh the taglist window if we are entering the +" file window from one of the taglist functions. The 'Tlist_Skip_Refresh' +" variable is used to skip the refresh of the taglist window and is set +" and cleared appropriately. +let s:Tlist_Skip_Refresh = 0 + +" Tlist_Window_Display_Help() +function! s:Tlist_Window_Display_Help() + if s:tlist_app_name == "winmanager" + " To handle a bug in the winmanager plugin, add a space at the + " last line + call setline('$', ' ') + endif + + if s:tlist_brief_help + " Add the brief help + call append(0, '" Press to display help text') + else + " Add the extensive help + call append(0, '" : Jump to tag definition') + call append(1, '" o : Jump to tag definition in new window') + call append(2, '" p : Preview the tag definition') + call append(3, '" : Display tag prototype') + call append(4, '" u : Update tag list') + call append(5, '" s : Select sort field') + call append(6, '" d : Remove file from taglist') + call append(7, '" x : Zoom-out/Zoom-in taglist window') + call append(8, '" + : Open a fold') + call append(9, '" - : Close a fold') + call append(10, '" * : Open all folds') + call append(11, '" = : Close all folds') + call append(12, '" [[ : Move to the start of previous file') + call append(13, '" ]] : Move to the start of next file') + call append(14, '" q : Close the taglist window') + call append(15, '" : Remove help text') + endif +endfunction + +" Tlist_Window_Toggle_Help_Text() +" Toggle taglist plugin help text between the full version and the brief +" version +function! s:Tlist_Window_Toggle_Help_Text() + if g:Tlist_Compact_Format + " In compact display mode, do not display help + return + endif + + " Include the empty line displayed after the help text + let brief_help_size = 1 + let full_help_size = 16 + + setlocal modifiable + + " Set report option to a huge value to prevent informational messages + " while deleting the lines + let old_report = &report + set report=99999 + + " Remove the currently highlighted tag. Otherwise, the help text + " might be highlighted by mistake + match none + + " Toggle between brief and full help text + if s:tlist_brief_help + let s:tlist_brief_help = 0 + + " Remove the previous help + exe '1,' . brief_help_size . ' delete _' + + " Adjust the start/end line numbers for the files + call s:Tlist_Window_Update_Line_Offsets(0, 1, full_help_size - brief_help_size) + else + let s:tlist_brief_help = 1 + + " Remove the previous help + exe '1,' . full_help_size . ' delete _' + + " Adjust the start/end line numbers for the files + call s:Tlist_Window_Update_Line_Offsets(0, 0, full_help_size - brief_help_size) + endif + + call s:Tlist_Window_Display_Help() + + " Restore the report option + let &report = old_report + + setlocal nomodifiable +endfunction + +" Taglist debug support +let s:tlist_debug = 0 + +" File for storing the debug messages +let s:tlist_debug_file = '' + +" Tlist_Debug_Enable +" Enable logging of taglist debug messages. +function! s:Tlist_Debug_Enable(...) + let s:tlist_debug = 1 + + " Check whether a valid file name is supplied. + if a:1 != '' + let s:tlist_debug_file = fnamemodify(a:1, ':p') + + " Empty the log file + exe 'redir! > ' . s:tlist_debug_file + redir END + + " Check whether the log file is present/created + if !filewritable(s:tlist_debug_file) + call s:Tlist_Warning_Msg('Taglist: Unable to create log file ' + \ . s:tlist_debug_file) + let s:tlist_debug_file = '' + endif + endif +endfunction + +" Tlist_Debug_Disable +" Disable logging of taglist debug messages. +function! s:Tlist_Debug_Disable(...) + let s:tlist_debug = 0 + let s:tlist_debug_file = '' +endfunction + +" Tlist_Debug_Show +" Display the taglist debug messages in a new window +function! s:Tlist_Debug_Show() + if s:tlist_msg == '' + call s:Tlist_Warning_Msg('Taglist: No debug messages') + return + endif + + " Open a new window to display the taglist debug messages + new taglist_debug.txt + " Delete all the lines (if the buffer already exists) + silent! %delete _ + " Add the messages + silent! put =s:tlist_msg + " Move the cursor to the first line + normal! gg +endfunction + +" Tlist_Log_Msg +" Log the supplied debug message along with the time +function! s:Tlist_Log_Msg(msg) + if s:tlist_debug + if s:tlist_debug_file != '' + exe 'redir >> ' . s:tlist_debug_file + silent echon strftime('%H:%M:%S') . ': ' . a:msg . "\n" + redir END + else + " Log the message into a variable + " Retain only the last 3000 characters + let len = strlen(s:tlist_msg) + if len > 3000 + let s:tlist_msg = strpart(s:tlist_msg, len - 3000) + endif + let s:tlist_msg = s:tlist_msg . strftime('%H:%M:%S') . ': ' . + \ a:msg . "\n" + endif + endif +endfunction + +" Tlist_Warning_Msg() +" Display a message using WarningMsg highlight group +function! s:Tlist_Warning_Msg(msg) + echohl WarningMsg + echomsg a:msg + echohl None +endfunction + +" Last returned file index for file name lookup. +" Used to speed up file lookup +let s:tlist_file_name_idx_cache = -1 + +" Tlist_Get_File_Index() +" Return the index of the specified filename +function! s:Tlist_Get_File_Index(fname) + if s:tlist_file_count == 0 || a:fname == '' + return -1 + endif + + " If the new filename is same as the last accessed filename, then + " return that index + if s:tlist_file_name_idx_cache != -1 && + \ s:tlist_file_name_idx_cache < s:tlist_file_count + if s:tlist_{s:tlist_file_name_idx_cache}_filename == a:fname + " Same as the last accessed file + return s:tlist_file_name_idx_cache + endif + endif + + " First, check whether the filename is present + let s_fname = a:fname . "\n" + let i = stridx(s:tlist_file_names, s_fname) + if i == -1 + let s:tlist_file_name_idx_cache = -1 + return -1 + endif + + " Second, compute the file name index + let nl_txt = substitute(strpart(s:tlist_file_names, 0, i), "[^\n]", '', 'g') + let s:tlist_file_name_idx_cache = strlen(nl_txt) + return s:tlist_file_name_idx_cache +endfunction + +" Last returned file index for line number lookup. +" Used to speed up file lookup +let s:tlist_file_lnum_idx_cache = -1 + +" Tlist_Window_Get_File_Index_By_Linenum() +" Return the index of the filename present in the specified line number +" Line number refers to the line number in the taglist window +function! s:Tlist_Window_Get_File_Index_By_Linenum(lnum) + call s:Tlist_Log_Msg('Tlist_Window_Get_File_Index_By_Linenum (' . a:lnum . ')') + + " First try to see whether the new line number is within the range + " of the last returned file + if s:tlist_file_lnum_idx_cache != -1 && + \ s:tlist_file_lnum_idx_cache < s:tlist_file_count + if a:lnum >= s:tlist_{s:tlist_file_lnum_idx_cache}_start && + \ a:lnum <= s:tlist_{s:tlist_file_lnum_idx_cache}_end + return s:tlist_file_lnum_idx_cache + endif + endif + + let fidx = -1 + + if g:Tlist_Show_One_File + " Displaying only one file in the taglist window. Check whether + " the line is within the tags displayed for that file + if s:tlist_cur_file_idx != -1 + if a:lnum >= s:tlist_{s:tlist_cur_file_idx}_start + \ && a:lnum <= s:tlist_{s:tlist_cur_file_idx}_end + let fidx = s:tlist_cur_file_idx + endif + + endif + else + " Do a binary search in the taglist + let left = 0 + let right = s:tlist_file_count - 1 + + while left < right + let mid = (left + right) / 2 + + if a:lnum >= s:tlist_{mid}_start && a:lnum <= s:tlist_{mid}_end + let s:tlist_file_lnum_idx_cache = mid + return mid + endif + + if a:lnum < s:tlist_{mid}_start + let right = mid - 1 + else + let left = mid + 1 + endif + endwhile + + if left >= 0 && left < s:tlist_file_count + \ && a:lnum >= s:tlist_{left}_start + \ && a:lnum <= s:tlist_{left}_end + let fidx = left + endif + endif + + let s:tlist_file_lnum_idx_cache = fidx + + return fidx +endfunction + +" Tlist_Exe_Cmd_No_Acmds +" Execute the specified Ex command after disabling autocommands +function! s:Tlist_Exe_Cmd_No_Acmds(cmd) + let old_eventignore = &eventignore + set eventignore=all + exe a:cmd + let &eventignore = old_eventignore +endfunction + +" Tlist_Skip_File() +" Check whether tag listing is supported for the specified file +function! s:Tlist_Skip_File(filename, ftype) + " Skip buffers with no names and buffers with filetype not set + if a:filename == '' || a:ftype == '' + return 1 + endif + + " Skip files which are not supported by exuberant ctags + " First check whether default settings for this filetype are available. + " If it is not available, then check whether user specified settings are + " available. If both are not available, then don't list the tags for this + " filetype + let var = 's:tlist_def_' . a:ftype . '_settings' + if !exists(var) + let var = 'g:tlist_' . a:ftype . '_settings' + if !exists(var) + return 1 + endif + endif + + " Skip files which are not readable or files which are not yet stored + " to the disk + if !filereadable(a:filename) + return 1 + endif + + return 0 +endfunction + +" Tlist_User_Removed_File +" Returns 1 if a file is removed by a user from the taglist +function! s:Tlist_User_Removed_File(filename) + return stridx(s:tlist_removed_flist, a:filename . "\n") != -1 +endfunction + +" Tlist_Update_Remove_List +" Update the list of user removed files from the taglist +" add == 1, add the file to the removed list +" add == 0, delete the file from the removed list +function! s:Tlist_Update_Remove_List(filename, add) + if a:add + let s:tlist_removed_flist = s:tlist_removed_flist . a:filename . "\n" + else + let idx = stridx(s:tlist_removed_flist, a:filename . "\n") + let text_before = strpart(s:tlist_removed_flist, 0, idx) + let rem_text = strpart(s:tlist_removed_flist, idx) + let next_idx = stridx(rem_text, "\n") + let text_after = strpart(rem_text, next_idx + 1) + + let s:tlist_removed_flist = text_before . text_after + endif +endfunction + +" Tlist_FileType_Init +" Initialize the ctags arguments and tag variable for the specified +" file type +function! s:Tlist_FileType_Init(ftype) + call s:Tlist_Log_Msg('Tlist_FileType_Init (' . a:ftype . ')') + " If the user didn't specify any settings, then use the default + " ctags args. Otherwise, use the settings specified by the user + let var = 'g:tlist_' . a:ftype . '_settings' + if exists(var) + " User specified ctags arguments + let settings = {var} . ';' + else + " Default ctags arguments + let var = 's:tlist_def_' . a:ftype . '_settings' + if !exists(var) + " No default settings for this file type. This filetype is + " not supported + return 0 + endif + let settings = s:tlist_def_{a:ftype}_settings . ';' + endif + + let msg = 'Taglist: Invalid ctags option setting - ' . settings + + " Format of the option that specifies the filetype and ctags arugments: + " + " ;flag1:name1;flag2:name2;flag3:name3 + " + + " Extract the file type to pass to ctags. This may be different from the + " file type detected by Vim + let pos = stridx(settings, ';') + if pos == -1 + call s:Tlist_Warning_Msg(msg) + return 0 + endif + let ctags_ftype = strpart(settings, 0, pos) + if ctags_ftype == '' + call s:Tlist_Warning_Msg(msg) + return 0 + endif + " Make sure a valid filetype is supplied. If the user didn't specify a + " valid filetype, then the ctags option settings may be treated as the + " filetype + if ctags_ftype =~ ':' + call s:Tlist_Warning_Msg(msg) + return 0 + endif + + " Remove the file type from settings + let settings = strpart(settings, pos + 1) + if settings == '' + call s:Tlist_Warning_Msg(msg) + return 0 + endif + + " Process all the specified ctags flags. The format is + " flag1:name1;flag2:name2;flag3:name3 + let ctags_flags = '' + let cnt = 0 + while settings != '' + " Extract the flag + let pos = stridx(settings, ':') + if pos == -1 + call s:Tlist_Warning_Msg(msg) + return 0 + endif + let flag = strpart(settings, 0, pos) + if flag == '' + call s:Tlist_Warning_Msg(msg) + return 0 + endif + " Remove the flag from settings + let settings = strpart(settings, pos + 1) + + " Extract the tag type name + let pos = stridx(settings, ';') + if pos == -1 + call s:Tlist_Warning_Msg(msg) + return 0 + endif + let name = strpart(settings, 0, pos) + if name == '' + call s:Tlist_Warning_Msg(msg) + return 0 + endif + let settings = strpart(settings, pos + 1) + + let cnt = cnt + 1 + + let s:tlist_{a:ftype}_{cnt}_name = flag + let s:tlist_{a:ftype}_{cnt}_fullname = name + let ctags_flags = ctags_flags . flag + endwhile + + let s:tlist_{a:ftype}_ctags_args = '--language-force=' . ctags_ftype . + \ ' --' . ctags_ftype . '-types=' . ctags_flags + let s:tlist_{a:ftype}_count = cnt + let s:tlist_{a:ftype}_ctags_flags = ctags_flags + + " Save the filetype name + let s:tlist_ftype_{s:tlist_ftype_count}_name = a:ftype + let s:tlist_ftype_count = s:tlist_ftype_count + 1 + + return 1 +endfunction + +" Tlist_Detect_Filetype +" Determine the filetype for the specified file using the filetypedetect +" autocmd. +function! s:Tlist_Detect_Filetype(fname) + " Ignore the filetype autocommands + let old_eventignore = &eventignore + set eventignore=FileType + + " Save the 'filetype', as this will be changed temporarily + let old_filetype = &filetype + + " Run the filetypedetect group of autocommands to determine + " the filetype + exe 'doautocmd filetypedetect BufRead ' . a:fname + + " Save the detected filetype + let ftype = &filetype + + " Restore the previous state + let &filetype = old_filetype + let &eventignore = old_eventignore + + return ftype +endfunction + +" Tlist_Get_Buffer_Filetype +" Get the filetype for the specified buffer +function! s:Tlist_Get_Buffer_Filetype(bnum) + let buf_ft = getbufvar(a:bnum, '&filetype') + + if bufloaded(a:bnum) + " For loaded buffers, the 'filetype' is already determined + return buf_ft + endif + + " For unloaded buffers, if the 'filetype' option is set, return it + if buf_ft != '' + return buf_ft + endif + + " Skip non-existent buffers + if !bufexists(a:bnum) + return '' + endif + + " For buffers whose filetype is not yet determined, try to determine + " the filetype + let bname = bufname(a:bnum) + + return s:Tlist_Detect_Filetype(bname) +endfunction + +" Tlist_Discard_TagInfo +" Discard the stored tag information for a file +function! s:Tlist_Discard_TagInfo(fidx) + call s:Tlist_Log_Msg('Tlist_Discard_TagInfo (' . + \ s:tlist_{a:fidx}_filename . ')') + let ftype = s:tlist_{a:fidx}_filetype + + " Discard information about the tags defined in the file + let i = 1 + while i <= s:tlist_{a:fidx}_tag_count + let fidx_i = 's:tlist_' . a:fidx . '_' . i + unlet! {fidx_i}_tag + unlet! {fidx_i}_tag_name + unlet! {fidx_i}_tag_type + unlet! {fidx_i}_ttype_idx + unlet! {fidx_i}_tag_proto + unlet! {fidx_i}_tag_searchpat + unlet! {fidx_i}_tag_linenum + let i = i + 1 + endwhile + + let s:tlist_{a:fidx}_tag_count = 0 + + " Discard information about tag type groups + let i = 1 + while i <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{i}_name + if s:tlist_{a:fidx}_{ttype} != '' + let fidx_ttype = 's:tlist_' . a:fidx . '_' . ttype + let {fidx_ttype} = '' + let {fidx_ttype}_offset = 0 + let cnt = {fidx_ttype}_count + let {fidx_ttype}_count = 0 + let j = 1 + while j <= cnt + unlet! {fidx_ttype}_{j} + let j = j + 1 + endwhile + endif + let i = i + 1 + endwhile + + " Discard the stored menu command also + let s:tlist_{a:fidx}_menu_cmd = '' +endfunction + +" Tlist_Window_Update_Line_Offsets +" Update the line offsets for tags for files starting from start_idx +" and displayed in the taglist window by the specified offset +function! s:Tlist_Window_Update_Line_Offsets(start_idx, increment, offset) + let i = a:start_idx + + while i < s:tlist_file_count + if s:tlist_{i}_visible + " Update the start/end line number only if the file is visible + if a:increment + let s:tlist_{i}_start = s:tlist_{i}_start + a:offset + let s:tlist_{i}_end = s:tlist_{i}_end + a:offset + else + let s:tlist_{i}_start = s:tlist_{i}_start - a:offset + let s:tlist_{i}_end = s:tlist_{i}_end - a:offset + endif + endif + let i = i + 1 + endwhile +endfunction + +" Tlist_Discard_FileInfo +" Discard the stored information for a file +function! s:Tlist_Discard_FileInfo(fidx) + call s:Tlist_Log_Msg('Tlist_Discard_FileInfo (' . + \ s:tlist_{a:fidx}_filename . ')') + call s:Tlist_Discard_TagInfo(a:fidx) + + let ftype = s:tlist_{a:fidx}_filetype + + let i = 1 + while i <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{i}_name + unlet! s:tlist_{a:fidx}_{ttype} + unlet! s:tlist_{a:fidx}_{ttype}_offset + unlet! s:tlist_{a:fidx}_{ttype}_count + let i = i + 1 + endwhile + + unlet! s:tlist_{a:fidx}_filename + unlet! s:tlist_{a:fidx}_sort_type + unlet! s:tlist_{a:fidx}_filetype + unlet! s:tlist_{a:fidx}_mtime + unlet! s:tlist_{a:fidx}_start + unlet! s:tlist_{a:fidx}_end + unlet! s:tlist_{a:fidx}_valid + unlet! s:tlist_{a:fidx}_visible + unlet! s:tlist_{a:fidx}_tag_count + unlet! s:tlist_{a:fidx}_menu_cmd +endfunction + +" Tlist_Window_Remove_File_From_Display +" Remove the specified file from display +function! s:Tlist_Window_Remove_File_From_Display(fidx) + call s:Tlist_Log_Msg('Tlist_Window_Remove_File_From_Display (' . + \ s:tlist_{a:fidx}_filename . ')') + " If the file is not visible then no need to remove it + if !s:tlist_{a:fidx}_visible + return + endif + + " Remove the tags displayed for the specified file from the window + let start = s:tlist_{a:fidx}_start + " Include the empty line after the last line also + if g:Tlist_Compact_Format + let end = s:tlist_{a:fidx}_end + else + let end = s:tlist_{a:fidx}_end + 1 + endif + + setlocal modifiable + exe 'silent! ' . start . ',' . end . 'delete _' + setlocal nomodifiable + + " Correct the start and end line offsets for all the files following + " this file, as the tags for this file are removed + call s:Tlist_Window_Update_Line_Offsets(a:fidx + 1, 0, end - start + 1) +endfunction + +" Tlist_Remove_File +" Remove the file under the cursor or the specified file index +" user_request - User requested to remove the file from taglist +function! s:Tlist_Remove_File(file_idx, user_request) + let fidx = a:file_idx + + if fidx == -1 + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) + if fidx == -1 + return + endif + endif + call s:Tlist_Log_Msg('Tlist_Remove_File (' . + \ s:tlist_{fidx}_filename . ', ' . a:user_request . ')') + + let save_winnr = winnr() + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + " Taglist window is open, remove the file from display + + if save_winnr != winnum + let old_eventignore = &eventignore + set eventignore=all + exe winnum . 'wincmd w' + endif + + call s:Tlist_Window_Remove_File_From_Display(fidx) + + if save_winnr != winnum + exe save_winnr . 'wincmd w' + let &eventignore = old_eventignore + endif + endif + + let fname = s:tlist_{fidx}_filename + + if a:user_request + " As the user requested to remove the file from taglist, + " add it to the removed list + call s:Tlist_Update_Remove_List(fname, 1) + endif + + " Remove the file name from the taglist list of filenames + let idx = stridx(s:tlist_file_names, fname . "\n") + let text_before = strpart(s:tlist_file_names, 0, idx) + let rem_text = strpart(s:tlist_file_names, idx) + let next_idx = stridx(rem_text, "\n") + let text_after = strpart(rem_text, next_idx + 1) + let s:tlist_file_names = text_before . text_after + + call s:Tlist_Discard_FileInfo(fidx) + + " Shift all the file variables by one index + let i = fidx + 1 + + while i < s:tlist_file_count + let j = i - 1 + + let s:tlist_{j}_filename = s:tlist_{i}_filename + let s:tlist_{j}_sort_type = s:tlist_{i}_sort_type + let s:tlist_{j}_filetype = s:tlist_{i}_filetype + let s:tlist_{j}_mtime = s:tlist_{i}_mtime + let s:tlist_{j}_start = s:tlist_{i}_start + let s:tlist_{j}_end = s:tlist_{i}_end + let s:tlist_{j}_valid = s:tlist_{i}_valid + let s:tlist_{j}_visible = s:tlist_{i}_visible + let s:tlist_{j}_tag_count = s:tlist_{i}_tag_count + let s:tlist_{j}_menu_cmd = s:tlist_{i}_menu_cmd + + let k = 1 + while k <= s:tlist_{j}_tag_count + let s:tlist_{j}_{k}_tag = s:tlist_{i}_{k}_tag + let s:tlist_{j}_{k}_tag_name = s:tlist_{i}_{k}_tag_name + let s:tlist_{j}_{k}_tag_type = s:Tlist_Get_Tag_Type_By_Tag(i, k) + let s:tlist_{j}_{k}_ttype_idx = s:tlist_{i}_{k}_ttype_idx + let s:tlist_{j}_{k}_tag_proto = s:Tlist_Get_Tag_Prototype(i, k) + let s:tlist_{j}_{k}_tag_searchpat = s:Tlist_Get_Tag_SearchPat(i, k) + let s:tlist_{j}_{k}_tag_linenum = s:Tlist_Get_Tag_Linenum(i, k) + let k = k + 1 + endwhile + + let ftype = s:tlist_{i}_filetype + + let k = 1 + while k <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{k}_name + let s:tlist_{j}_{ttype} = s:tlist_{i}_{ttype} + let s:tlist_{j}_{ttype}_offset = s:tlist_{i}_{ttype}_offset + let s:tlist_{j}_{ttype}_count = s:tlist_{i}_{ttype}_count + if s:tlist_{j}_{ttype} != '' + let l = 1 + while l <= s:tlist_{j}_{ttype}_count + let s:tlist_{j}_{ttype}_{l} = s:tlist_{i}_{ttype}_{l} + let l = l + 1 + endwhile + endif + let k = k + 1 + endwhile + + " As the file and tag information is copied to the new index, + " discard the previous information + call s:Tlist_Discard_FileInfo(i) + + let i = i + 1 + endwhile + + " Reduce the number of files displayed + let s:tlist_file_count = s:tlist_file_count - 1 + + if g:Tlist_Show_One_File + " If the tags for only one file is displayed and if we just + " now removed that file, then invalidate the current file idx + if s:tlist_cur_file_idx == fidx + let s:tlist_cur_file_idx = -1 + endif + endif +endfunction + +" Tlist_Window_Goto_Window +" Goto the taglist window +function! s:Tlist_Window_Goto_Window() + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + if winnr() != winnum + call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') + endif + endif +endfunction + +" Tlist_Window_Create +" Create a new taglist window. If it is already open, jump to it +function! s:Tlist_Window_Create() + call s:Tlist_Log_Msg('Tlist_Window_Create()') + " If the window is open, jump to it + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + " Jump to the existing window + if winnr() != winnum + exe winnum . 'wincmd w' + endif + return + endif + + " If used with winmanager don't open windows. Winmanager will handle + " the window/buffer management + if s:tlist_app_name == "winmanager" + return + endif + + " Create a new window. If user prefers a horizontal window, then open + " a horizontally split window. Otherwise open a vertically split + " window + if g:Tlist_Use_Horiz_Window + " Open a horizontally split window + let win_dir = 'botright' + " Horizontal window height + let win_size = g:Tlist_WinHeight + else + if s:tlist_winsize_chgd == -1 + " Open a vertically split window. Increase the window size, if + " needed, to accomodate the new window + if g:Tlist_Inc_Winwidth && + \ &columns < (80 + g:Tlist_WinWidth) + " Save the original window position + let s:tlist_pre_winx = getwinposx() + let s:tlist_pre_winy = getwinposy() + + " one extra column is needed to include the vertical split + let &columns= &columns + g:Tlist_WinWidth + 1 + + let s:tlist_winsize_chgd = 1 + else + let s:tlist_winsize_chgd = 0 + endif + endif + + if g:Tlist_Use_Right_Window + " Open the window at the rightmost place + let win_dir = 'botright vertical' + else + " Open the window at the leftmost place + let win_dir = 'topleft vertical' + endif + let win_size = g:Tlist_WinWidth + endif + + " If the tag listing temporary buffer already exists, then reuse it. + " Otherwise create a new buffer + let bufnum = bufnr(g:TagList_title) + if bufnum == -1 + " Create a new buffer + let wcmd = g:TagList_title + else + " Edit the existing buffer + let wcmd = '+buffer' . bufnum + endif + + " Create the taglist window + exe 'silent! ' . win_dir . ' ' . win_size . 'split ' . wcmd + + " Save the new window position + let s:tlist_winx = getwinposx() + let s:tlist_winy = getwinposy() + + " Initialize the taglist window + call s:Tlist_Window_Init() +endfunction + +" Tlist_Window_Zoom +" Zoom (maximize/minimize) the taglist window +function! s:Tlist_Window_Zoom() + if s:tlist_win_maximized + " Restore the window back to the previous size + if g:Tlist_Use_Horiz_Window + exe 'resize ' . g:Tlist_WinHeight + else + exe 'vert resize ' . g:Tlist_WinWidth + endif + let s:tlist_win_maximized = 0 + else + " Set the window size to the maximum possible without closing other + " windows + if g:Tlist_Use_Horiz_Window + resize + else + vert resize + endif + let s:tlist_win_maximized = 1 + endif +endfunction + +" Tlist_Ballon_Expr +" When the mouse cursor is over a tag in the taglist window, display the +" tag prototype (balloon) +function! Tlist_Ballon_Expr() + " Get the file index + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(v:beval_lnum) + if fidx == -1 + return '' + endif + + " Get the tag output line for the current tag + let tidx = s:Tlist_Window_Get_Tag_Index(fidx, v:beval_lnum) + if tidx == 0 + return '' + endif + + " Get the tag search pattern and display it + return s:Tlist_Get_Tag_Prototype(fidx, tidx) +endfunction + +" Tlist_Window_Check_Width +" Check the width of the taglist window. For horizontally split windows, the +" 'winfixheight' option is used to fix the height of the window. For +" vertically split windows, Vim doesn't support the 'winfixwidth' option. So +" need to handle window width changes from this function. +function! s:Tlist_Window_Check_Width() + let tlist_winnr = bufwinnr(g:TagList_title) + if tlist_winnr == -1 + return + endif + + let width = winwidth(tlist_winnr) + if width != g:Tlist_WinWidth + call s:Tlist_Log_Msg("Tlist_Window_Check_Width: Changing window " . + \ "width from " . width . " to " . g:Tlist_WinWidth) + let save_winnr = winnr() + if save_winnr != tlist_winnr + call s:Tlist_Exe_Cmd_No_Acmds(tlist_winnr . 'wincmd w') + endif + exe 'vert resize ' . g:Tlist_WinWidth + if save_winnr != tlist_winnr + call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + endif + endif +endfunction + +" Tlist_Window_Exit_Only_Window +" If the 'Tlist_Exit_OnlyWindow' option is set, then exit Vim if only the +" taglist window is present. +function! s:Tlist_Window_Exit_Only_Window() + " Before quitting Vim, delete the taglist buffer so that + " the '0 mark is correctly set to the previous buffer. + if v:version < 700 + if winbufnr(2) == -1 + bdelete + quit + endif + else + if winbufnr(2) == -1 + if tabpagenr('$') == 1 + " Only one tag page is present + bdelete + quit + else + " More than one tab page is present. Close only the current + " tab page + close + endif + endif + endif +endfunction + +" Tlist_Window_Init +" Set the default options for the taglist window +function! s:Tlist_Window_Init() + call s:Tlist_Log_Msg('Tlist_Window_Init()') + + " The 'readonly' option should not be set for the taglist buffer. + " If Vim is started as "view/gview" or if the ":view" command is + " used, then the 'readonly' option is set for all the buffers. + " Unset it for the taglist buffer + setlocal noreadonly + + " Set the taglist buffer filetype to taglist + setlocal filetype=taglist + + " Define taglist window element highlighting + syntax match TagListComment '^" .*' + syntax match TagListFileName '^[^" ].*$' + syntax match TagListTitle '^ \S.*$' + syntax match TagListTagScope '\s\[.\{-\}\]$' + + " Define the highlighting only if colors are supported + if has('gui_running') || &t_Co > 2 + " Colors to highlight various taglist window elements + " If user defined highlighting group exists, then use them. + " Otherwise, use default highlight groups. + if hlexists('MyTagListTagName') + highlight link TagListTagName MyTagListTagName + else + highlight default link TagListTagName Search + endif + " Colors to highlight comments and titles + if hlexists('MyTagListComment') + highlight link TagListComment MyTagListComment + else + highlight clear TagListComment + highlight default link TagListComment Comment + endif + if hlexists('MyTagListTitle') + highlight link TagListTitle MyTagListTitle + else + highlight clear TagListTitle + highlight default link TagListTitle Title + endif + if hlexists('MyTagListFileName') + highlight link TagListFileName MyTagListFileName + else + highlight clear TagListFileName + highlight default TagListFileName guibg=Grey ctermbg=darkgray + \ guifg=white ctermfg=white + endif + if hlexists('MyTagListTagScope') + highlight link TagListTagScope MyTagListTagScope + else + highlight clear TagListTagScope + highlight default link TagListTagScope Identifier + endif + else + highlight default TagListTagName term=reverse cterm=reverse + endif + + " Folding related settings + setlocal foldenable + setlocal foldminlines=0 + setlocal foldmethod=manual + setlocal foldlevel=9999 + if g:Tlist_Enable_Fold_Column + setlocal foldcolumn=3 + else + setlocal foldcolumn=0 + endif + setlocal foldtext=v:folddashes.getline(v:foldstart) + + if s:tlist_app_name != "winmanager" + " Mark buffer as scratch + silent! setlocal buftype=nofile + if s:tlist_app_name == "none" + silent! setlocal bufhidden=delete + endif + silent! setlocal noswapfile + " Due to a bug in Vim 6.0, the winbufnr() function fails for unlisted + " buffers. So if the taglist buffer is unlisted, multiple taglist + " windows will be opened. This bug is fixed in Vim 6.1 and above + if v:version >= 601 + silent! setlocal nobuflisted + endif + endif + + silent! setlocal nowrap + + " If the 'number' option is set in the source window, it will affect the + " taglist window. So forcefully disable 'number' option for the taglist + " window + silent! setlocal nonumber + + " Use fixed height when horizontally split window is used + if g:Tlist_Use_Horiz_Window + if v:version >= 602 + set winfixheight + endif + endif + if !g:Tlist_Use_Horiz_Window && v:version >= 700 + set winfixwidth + endif + + " Setup balloon evaluation to display tag prototype + if v:version >= 700 && has('balloon_eval') + setlocal balloonexpr=Tlist_Ballon_Expr() + set ballooneval + endif + + " Setup the cpoptions properly for the maps to work + let old_cpoptions = &cpoptions + set cpoptions&vim + + " Create buffer local mappings for jumping to the tags and sorting the list + nnoremap + \ :call Tlist_Window_Jump_To_Tag('useopen') + nnoremap o + \ :call Tlist_Window_Jump_To_Tag('newwin') + nnoremap p + \ :call Tlist_Window_Jump_To_Tag('preview') + nnoremap P + \ :call Tlist_Window_Jump_To_Tag('prevwin') + if v:version >= 700 + nnoremap t + \ :call Tlist_Window_Jump_To_Tag('checktab') + nnoremap + \ :call Tlist_Window_Jump_To_Tag('newtab') + endif + nnoremap <2-LeftMouse> + \ :call Tlist_Window_Jump_To_Tag('useopen') + nnoremap s + \ :call Tlist_Change_Sort('cmd', 'toggle', '') + nnoremap + :silent! foldopen + nnoremap - :silent! foldclose + nnoremap * :silent! %foldopen! + nnoremap = :silent! %foldclose + nnoremap :silent! foldopen + nnoremap :silent! foldclose + nnoremap :silent! %foldopen! + nnoremap :call Tlist_Window_Show_Info() + nnoremap u :call Tlist_Window_Update_File() + nnoremap d :call Tlist_Remove_File(-1, 1) + nnoremap x :call Tlist_Window_Zoom() + nnoremap [[ :call Tlist_Window_Move_To_File(-1) + nnoremap :call Tlist_Window_Move_To_File(-1) + nnoremap ]] :call Tlist_Window_Move_To_File(1) + nnoremap :call Tlist_Window_Move_To_File(1) + nnoremap :call Tlist_Window_Toggle_Help_Text() + nnoremap q :close + + " Insert mode mappings + inoremap + \ :call Tlist_Window_Jump_To_Tag('useopen') + " Windows needs return + inoremap + \ :call Tlist_Window_Jump_To_Tag('useopen') + inoremap o + \ :call Tlist_Window_Jump_To_Tag('newwin') + inoremap p + \ :call Tlist_Window_Jump_To_Tag('preview') + inoremap P + \ :call Tlist_Window_Jump_To_Tag('prevwin') + if v:version >= 700 + inoremap t + \ :call Tlist_Window_Jump_To_Tag('checktab') + inoremap + \ :call Tlist_Window_Jump_To_Tag('newtab') + endif + inoremap <2-LeftMouse> + \ :call Tlist_Window_Jump_To_Tag('useopen') + inoremap s + \ :call Tlist_Change_Sort('cmd', 'toggle', '') + inoremap + :silent! foldopen + inoremap - :silent! foldclose + inoremap * :silent! %foldopen! + inoremap = :silent! %foldclose + inoremap :silent! foldopen + inoremap :silent! foldclose + inoremap :silent! %foldopen! + inoremap :call + \ Tlist_Window_Show_Info() + inoremap u + \ :call Tlist_Window_Update_File() + inoremap d :call Tlist_Remove_File(-1, 1) + inoremap x :call Tlist_Window_Zoom() + inoremap [[ :call Tlist_Window_Move_To_File(-1) + inoremap :call Tlist_Window_Move_To_File(-1) + inoremap ]] :call Tlist_Window_Move_To_File(1) + inoremap :call Tlist_Window_Move_To_File(1) + inoremap :call Tlist_Window_Toggle_Help_Text() + inoremap q :close + + " Map single left mouse click if the user wants this functionality + if g:Tlist_Use_SingleClick == 1 + " Contributed by Bindu Wavell + " attempt to perform single click mapping, it would be much + " nicer if we could nnoremap ... however vim does + " not fire the when you use the mouse + " to enter a buffer. + let clickmap = ':if bufname("%") =~ "__Tag_List__" ' . + \ 'call Tlist_Window_Jump_To_Tag("useopen") ' . + \ ' endif ' + if maparg('', 'n') == '' + " no mapping for leftmouse + exe ':nnoremap ' . clickmap + else + " we have a mapping + let mapcmd = ':nnoremap ' + let mapcmd = mapcmd . substitute(substitute( + \ maparg('', 'n'), '|', '', 'g'), + \ '\c^', '', '') + let mapcmd = mapcmd . clickmap + exe mapcmd + endif + endif + + " Define the taglist autocommands + augroup TagListAutoCmds + autocmd! + " Display the tag prototype for the tag under the cursor. + autocmd CursorHold __Tag_List__ call s:Tlist_Window_Show_Info() + " Highlight the current tag periodically + autocmd CursorHold * silent call s:Tlist_Window_Highlight_Tag( + \ fnamemodify(bufname('%'), ':p'), line('.'), 1, 0) + + " Adjust the Vim window width when taglist window is closed + autocmd BufUnload __Tag_List__ call s:Tlist_Post_Close_Cleanup() + " Close the fold for this buffer when leaving the buffer + if g:Tlist_File_Fold_Auto_Close + autocmd BufEnter * silent + \ call s:Tlist_Window_Open_File_Fold(expand('')) + endif + " Exit Vim itself if only the taglist window is present (optional) + if g:Tlist_Exit_OnlyWindow + autocmd BufEnter __Tag_List__ nested + \ call s:Tlist_Window_Exit_Only_Window() + endif + if s:tlist_app_name != "winmanager" && + \ !g:Tlist_Process_File_Always && + \ (!has('gui_running') || !g:Tlist_Show_Menu) + " Auto refresh the taglist window + autocmd BufEnter * call s:Tlist_Refresh() + endif + + if !g:Tlist_Use_Horiz_Window + if v:version < 700 + autocmd WinEnter * call s:Tlist_Window_Check_Width() + endif + endif + if v:version >= 700 + autocmd TabEnter * silent call s:Tlist_Refresh_Folds() + endif + augroup end + + " Restore the previous cpoptions settings + let &cpoptions = old_cpoptions +endfunction + +" Tlist_Window_Refresh +" Display the tags for all the files in the taglist window +function! s:Tlist_Window_Refresh() + call s:Tlist_Log_Msg('Tlist_Window_Refresh()') + " Set report option to a huge value to prevent informational messages + " while deleting the lines + let old_report = &report + set report=99999 + + " Mark the buffer as modifiable + setlocal modifiable + + " Delete the contents of the buffer to the black-hole register + silent! %delete _ + + " As we have cleared the taglist window, mark all the files + " as not visible + let i = 0 + while i < s:tlist_file_count + let s:tlist_{i}_visible = 0 + let i = i + 1 + endwhile + + if g:Tlist_Compact_Format == 0 + " Display help in non-compact mode + call s:Tlist_Window_Display_Help() + endif + + " Mark the buffer as not modifiable + setlocal nomodifiable + + " Restore the report option + let &report = old_report + + " If the tags for only one file should be displayed in the taglist + " window, then no need to add the tags here. The bufenter autocommand + " will add the tags for that file. + if g:Tlist_Show_One_File + return + endif + + " List all the tags for the previously processed files + " Do this only if taglist is configured to display tags for more than + " one file. Otherwise, when Tlist_Show_One_File is configured, + " tags for the wrong file will be displayed. + let i = 0 + while i < s:tlist_file_count + call s:Tlist_Window_Refresh_File(s:tlist_{i}_filename, + \ s:tlist_{i}_filetype) + let i = i + 1 + endwhile + + if g:Tlist_Auto_Update + " Add and list the tags for all buffers in the Vim buffer list + let i = 1 + let last_bufnum = bufnr('$') + while i <= last_bufnum + if buflisted(i) + let fname = fnamemodify(bufname(i), ':p') + let ftype = s:Tlist_Get_Buffer_Filetype(i) + " If the file doesn't support tag listing, skip it + if !s:Tlist_Skip_File(fname, ftype) + call s:Tlist_Window_Refresh_File(fname, ftype) + endif + endif + let i = i + 1 + endwhile + endif + + " If Tlist_File_Fold_Auto_Close option is set, then close all the folds + if g:Tlist_File_Fold_Auto_Close + " Close all the folds + silent! %foldclose + endif + + " Move the cursor to the top of the taglist window + normal! gg +endfunction + +" Tlist_Post_Close_Cleanup() +" Close the taglist window and adjust the Vim window width +function! s:Tlist_Post_Close_Cleanup() + call s:Tlist_Log_Msg('Tlist_Post_Close_Cleanup()') + " Mark all the files as not visible + let i = 0 + while i < s:tlist_file_count + let s:tlist_{i}_visible = 0 + let i = i + 1 + endwhile + + " Remove the taglist autocommands + silent! autocmd! TagListAutoCmds + + " Clear all the highlights + match none + + silent! syntax clear TagListTitle + silent! syntax clear TagListComment + silent! syntax clear TagListTagScope + + " Remove the left mouse click mapping if it was setup initially + if g:Tlist_Use_SingleClick + if hasmapto('') + nunmap + endif + endif + + if s:tlist_app_name != "winmanager" + if g:Tlist_Use_Horiz_Window || g:Tlist_Inc_Winwidth == 0 || + \ s:tlist_winsize_chgd != 1 || + \ &columns < (80 + g:Tlist_WinWidth) + " No need to adjust window width if using horizontally split taglist + " window or if columns is less than 101 or if the user chose not to + " adjust the window width + else + " If the user didn't manually move the window, then restore the window + " position to the pre-taglist position + if s:tlist_pre_winx != -1 && s:tlist_pre_winy != -1 && + \ getwinposx() == s:tlist_winx && + \ getwinposy() == s:tlist_winy + exe 'winpos ' . s:tlist_pre_winx . ' ' . s:tlist_pre_winy + endif + + " Adjust the Vim window width + let &columns= &columns - (g:Tlist_WinWidth + 1) + endif + endif + + let s:tlist_winsize_chgd = -1 + + " Reset taglist state variables + if s:tlist_app_name == "winmanager" + let s:tlist_app_name = "none" + endif + let s:tlist_window_initialized = 0 +endfunction + +" Tlist_Window_Refresh_File() +" List the tags defined in the specified file in a Vim window +function! s:Tlist_Window_Refresh_File(filename, ftype) + call s:Tlist_Log_Msg('Tlist_Window_Refresh_File (' . a:filename . ')') + " First check whether the file already exists + let fidx = s:Tlist_Get_File_Index(a:filename) + if fidx != -1 + let file_listed = 1 + else + let file_listed = 0 + endif + + if !file_listed + " Check whether this file is removed based on user request + " If it is, then don't display the tags for this file + if s:Tlist_User_Removed_File(a:filename) + return + endif + endif + + if file_listed && s:tlist_{fidx}_visible + " Check whether the file tags are currently valid + if s:tlist_{fidx}_valid + " Goto the first line in the file + exe s:tlist_{fidx}_start + + " If the line is inside a fold, open the fold + if foldclosed('.') != -1 + exe "silent! " . s:tlist_{fidx}_start . "," . + \ s:tlist_{fidx}_end . "foldopen!" + endif + return + endif + + " Discard and remove the tags for this file from display + call s:Tlist_Discard_TagInfo(fidx) + call s:Tlist_Window_Remove_File_From_Display(fidx) + endif + + " Process and generate a list of tags defined in the file + if !file_listed || !s:tlist_{fidx}_valid + let ret_fidx = s:Tlist_Process_File(a:filename, a:ftype) + if ret_fidx == -1 + return + endif + let fidx = ret_fidx + endif + + " Set report option to a huge value to prevent informational messages + " while adding lines to the taglist window + let old_report = &report + set report=99999 + + if g:Tlist_Show_One_File + " Remove the previous file + if s:tlist_cur_file_idx != -1 + call s:Tlist_Window_Remove_File_From_Display(s:tlist_cur_file_idx) + let s:tlist_{s:tlist_cur_file_idx}_visible = 0 + let s:tlist_{s:tlist_cur_file_idx}_start = 0 + let s:tlist_{s:tlist_cur_file_idx}_end = 0 + endif + let s:tlist_cur_file_idx = fidx + endif + + " Mark the buffer as modifiable + setlocal modifiable + + " Add new files to the end of the window. For existing files, add them at + " the same line where they were previously present. If the file is not + " visible, then add it at the end + if s:tlist_{fidx}_start == 0 || !s:tlist_{fidx}_visible + if g:Tlist_Compact_Format + let s:tlist_{fidx}_start = line('$') + else + let s:tlist_{fidx}_start = line('$') + 1 + endif + endif + + let s:tlist_{fidx}_visible = 1 + + " Goto the line where this file should be placed + if g:Tlist_Compact_Format + exe s:tlist_{fidx}_start + else + exe s:tlist_{fidx}_start - 1 + endif + + let txt = fnamemodify(s:tlist_{fidx}_filename, ':t') . ' (' . + \ fnamemodify(s:tlist_{fidx}_filename, ':p:h') . ')' + if g:Tlist_Compact_Format == 0 + silent! put =txt + else + silent! put! =txt + " Move to the next line + exe line('.') + 1 + endif + let file_start = s:tlist_{fidx}_start + + " Add the tag names grouped by tag type to the buffer with a title + let i = 1 + let ttype_cnt = s:tlist_{a:ftype}_count + while i <= ttype_cnt + let ttype = s:tlist_{a:ftype}_{i}_name + " Add the tag type only if there are tags for that type + let fidx_ttype = 's:tlist_' . fidx . '_' . ttype + let ttype_txt = {fidx_ttype} + if ttype_txt != '' + let txt = ' ' . s:tlist_{a:ftype}_{i}_fullname + if g:Tlist_Compact_Format == 0 + let ttype_start_lnum = line('.') + 1 + silent! put =txt + else + let ttype_start_lnum = line('.') + silent! put! =txt + endif + silent! put =ttype_txt + + let {fidx_ttype}_offset = ttype_start_lnum - file_start + + " create a fold for this tag type + let fold_start = ttype_start_lnum + let fold_end = fold_start + {fidx_ttype}_count + exe fold_start . ',' . fold_end . 'fold' + + " Adjust the cursor position + if g:Tlist_Compact_Format == 0 + exe ttype_start_lnum + {fidx_ttype}_count + else + exe ttype_start_lnum + {fidx_ttype}_count + 1 + endif + + if g:Tlist_Compact_Format == 0 + " Separate the tag types by a empty line + silent! put ='' + endif + endif + let i = i + 1 + endwhile + + if s:tlist_{fidx}_tag_count == 0 + if g:Tlist_Compact_Format == 0 + silent! put ='' + endif + endif + + let s:tlist_{fidx}_end = line('.') - 1 + + " Create a fold for the entire file + exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'fold' + exe 'silent! ' . s:tlist_{fidx}_start . ',' . + \ s:tlist_{fidx}_end . 'foldopen!' + + " Goto the starting line for this file, + exe s:tlist_{fidx}_start + + if s:tlist_app_name == "winmanager" + " To handle a bug in the winmanager plugin, add a space at the + " last line + call setline('$', ' ') + endif + + " Mark the buffer as not modifiable + setlocal nomodifiable + + " Restore the report option + let &report = old_report + + " Update the start and end line numbers for all the files following this + " file + let start = s:tlist_{fidx}_start + " include the empty line after the last line + if g:Tlist_Compact_Format + let end = s:tlist_{fidx}_end + else + let end = s:tlist_{fidx}_end + 1 + endif + call s:Tlist_Window_Update_Line_Offsets(fidx + 1, 1, end - start + 1) + + " Now that we have updated the taglist window, update the tags + " menu (if present) + if g:Tlist_Show_Menu + call s:Tlist_Menu_Update_File(1) + endif +endfunction + +" Tlist_Init_File +" Initialize the variables for a new file +function! s:Tlist_Init_File(filename, ftype) + call s:Tlist_Log_Msg('Tlist_Init_File (' . a:filename . ')') + " Add new files at the end of the list + let fidx = s:tlist_file_count + let s:tlist_file_count = s:tlist_file_count + 1 + " Add the new file name to the taglist list of file names + let s:tlist_file_names = s:tlist_file_names . a:filename . "\n" + + " Initialize the file variables + let s:tlist_{fidx}_filename = a:filename + let s:tlist_{fidx}_sort_type = g:Tlist_Sort_Type + let s:tlist_{fidx}_filetype = a:ftype + let s:tlist_{fidx}_mtime = -1 + let s:tlist_{fidx}_start = 0 + let s:tlist_{fidx}_end = 0 + let s:tlist_{fidx}_valid = 0 + let s:tlist_{fidx}_visible = 0 + let s:tlist_{fidx}_tag_count = 0 + let s:tlist_{fidx}_menu_cmd = '' + + " Initialize the tag type variables + let i = 1 + while i <= s:tlist_{a:ftype}_count + let ttype = s:tlist_{a:ftype}_{i}_name + let s:tlist_{fidx}_{ttype} = '' + let s:tlist_{fidx}_{ttype}_offset = 0 + let s:tlist_{fidx}_{ttype}_count = 0 + let i = i + 1 + endwhile + + return fidx +endfunction + +" Tlist_Get_Tag_Type_By_Tag +" Return the tag type for the specified tag index +function! s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) + let ttype_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_type' + + " Already parsed and have the tag name + if exists(ttype_var) + return {ttype_var} + endif + + let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag + let {ttype_var} = s:Tlist_Extract_Tagtype(tag_line) + + return {ttype_var} +endfunction + +" Tlist_Get_Tag_Prototype +function! s:Tlist_Get_Tag_Prototype(fidx, tidx) + let tproto_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_proto' + + " Already parsed and have the tag prototype + if exists(tproto_var) + return {tproto_var} + endif + + " Parse and extract the tag prototype + let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag + let start = stridx(tag_line, '/^') + 2 + let end = stridx(tag_line, '/;"' . "\t") + if tag_line[end - 1] == '$' + let end = end -1 + endif + let tag_proto = strpart(tag_line, start, end - start) + let {tproto_var} = substitute(tag_proto, '\s*', '', '') + + return {tproto_var} +endfunction + +" Tlist_Get_Tag_SearchPat +function! s:Tlist_Get_Tag_SearchPat(fidx, tidx) + let tpat_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_searchpat' + + " Already parsed and have the tag search pattern + if exists(tpat_var) + return {tpat_var} + endif + + " Parse and extract the tag search pattern + let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag + let start = stridx(tag_line, '/^') + 2 + let end = stridx(tag_line, '/;"' . "\t") + if tag_line[end - 1] == '$' + let end = end -1 + endif + let {tpat_var} = '\V\^' . strpart(tag_line, start, end - start) . + \ (tag_line[end] == '$' ? '\$' : '') + + return {tpat_var} +endfunction + +" Tlist_Get_Tag_Linenum +" Return the tag line number, given the tag index +function! s:Tlist_Get_Tag_Linenum(fidx, tidx) + let tline_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_linenum' + + " Already parsed and have the tag line number + if exists(tline_var) + return {tline_var} + endif + + " Parse and extract the tag line number + let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag + let start = strridx(tag_line, 'line:') + 5 + let end = strridx(tag_line, "\t") + if end < start + let {tline_var} = strpart(tag_line, start) + 0 + else + let {tline_var} = strpart(tag_line, start, end - start) + 0 + endif + + return {tline_var} +endfunction + +" Tlist_Parse_Tagline +" Parse a tag line from the ctags output. Separate the tag output based on the +" tag type and store it in the tag type variable. +" The format of each line in the ctags output is: +" +" tag_namefile_nameex_cmd;"extension_fields +" +function! s:Tlist_Parse_Tagline(tag_line) + if a:tag_line == '' + " Skip empty lines + return + endif + + " Extract the tag type + let ttype = s:Tlist_Extract_Tagtype(a:tag_line) + + " Make sure the tag type is a valid and supported one + if ttype == '' || stridx(s:ctags_flags, ttype) == -1 + " Line is not in proper tags format or Tag type is not supported + return + endif + + " Update the total tag count + let s:tidx = s:tidx + 1 + + " The following variables are used to optimize this code. Vim is slow in + " using curly brace names. To reduce the amount of processing needed, the + " curly brace variables are pre-processed here + let fidx_tidx = 's:tlist_' . s:fidx . '_' . s:tidx + let fidx_ttype = 's:tlist_' . s:fidx . '_' . ttype + + " Update the count of this tag type + let ttype_idx = {fidx_ttype}_count + 1 + let {fidx_ttype}_count = ttype_idx + + " Store the ctags output for this tag + let {fidx_tidx}_tag = a:tag_line + + " Store the tag index and the tag type index (back pointers) + let {fidx_ttype}_{ttype_idx} = s:tidx + let {fidx_tidx}_ttype_idx = ttype_idx + + " Extract the tag name + let tag_name = strpart(a:tag_line, 0, stridx(a:tag_line, "\t")) + + " Extract the tag scope/prototype + if g:Tlist_Display_Prototype + let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(s:fidx, s:tidx) + else + let ttxt = ' ' . tag_name + + " Add the tag scope, if it is available and is configured. Tag + " scope is the last field after the 'line:\t' field + if g:Tlist_Display_Tag_Scope + let tag_scope = s:Tlist_Extract_Tag_Scope(a:tag_line) + if tag_scope != '' + let ttxt = ttxt . ' [' . tag_scope . ']' + endif + endif + endif + + " Add this tag to the tag type variable + let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" + + " Save the tag name + let {fidx_tidx}_tag_name = tag_name +endfunction + +" Tlist_Process_File +" Get the list of tags defined in the specified file and store them +" in Vim variables. Returns the file index where the tags are stored. +function! s:Tlist_Process_File(filename, ftype) + call s:Tlist_Log_Msg('Tlist_Process_File (' . a:filename . ', ' . + \ a:ftype . ')') + " Check whether this file is supported + if s:Tlist_Skip_File(a:filename, a:ftype) + return -1 + endif + + " If the tag types for this filetype are not yet created, then create + " them now + let var = 's:tlist_' . a:ftype . '_count' + if !exists(var) + if s:Tlist_FileType_Init(a:ftype) == 0 + return -1 + endif + endif + + " If this file is already processed, then use the cached values + let fidx = s:Tlist_Get_File_Index(a:filename) + if fidx == -1 + " First time, this file is loaded + let fidx = s:Tlist_Init_File(a:filename, a:ftype) + else + " File was previously processed. Discard the tag information + call s:Tlist_Discard_TagInfo(fidx) + endif + + let s:tlist_{fidx}_valid = 1 + + " Exuberant ctags arguments to generate a tag list + let ctags_args = ' -f - --format=2 --excmd=pattern --fields=nks ' + + " Form the ctags argument depending on the sort type + if s:tlist_{fidx}_sort_type == 'name' + let ctags_args = ctags_args . '--sort=yes' + else + let ctags_args = ctags_args . '--sort=no' + endif + + " Add the filetype specific arguments + let ctags_args = ctags_args . ' ' . s:tlist_{a:ftype}_ctags_args + + " Ctags command to produce output with regexp for locating the tags + let ctags_cmd = g:Tlist_Ctags_Cmd . ctags_args + let ctags_cmd = ctags_cmd . ' "' . a:filename . '"' + + if &shellxquote == '"' + " Double-quotes within double-quotes will not work in the + " command-line.If the 'shellxquote' option is set to double-quotes, + " then escape the double-quotes in the ctags command-line. + let ctags_cmd = escape(ctags_cmd, '"') + endif + + " In Windows 95, if not using cygwin, disable the 'shellslash' + " option. Otherwise, this will cause problems when running the + " ctags command. + if has('win95') && !has('win32unix') + let old_shellslash = &shellslash + set noshellslash + endif + + if has('win32') && !has('win32unix') && !has('win95') + \ && (&shell =~ 'cmd.exe') + " Windows does not correctly deal with commands that have more than 1 + " set of double quotes. It will strip them all resulting in: + " 'C:\Program' is not recognized as an internal or external command + " operable program or batch file. To work around this, place the + " command inside a batch file and call the batch file. + " Do this only on Win2K, WinXP and above. + " Contributed by: David Fishburn. + let s:taglist_tempfile = fnamemodify(tempname(), ':h') . + \ '\taglist.cmd' + exe 'redir! > ' . s:taglist_tempfile + silent echo ctags_cmd + redir END + + call s:Tlist_Log_Msg('Cmd inside batch file: ' . ctags_cmd) + let ctags_cmd = '"' . s:taglist_tempfile . '"' + endif + + call s:Tlist_Log_Msg('Cmd: ' . ctags_cmd) + + " Run ctags and get the tag list + let cmd_output = system(ctags_cmd) + + " Restore the value of the 'shellslash' option. + if has('win95') && !has('win32unix') + let &shellslash = old_shellslash + endif + + if exists('s:taglist_tempfile') + " Delete the temporary cmd file created on MS-Windows + call delete(s:taglist_tempfile) + endif + + " Handle errors + if v:shell_error + let msg = "Taglist: Failed to generate tags for " . a:filename + call s:Tlist_Warning_Msg(msg) + if cmd_output != '' + call s:Tlist_Warning_Msg(cmd_output) + endif + return fidx + endif + + " Store the modification time for the file + let s:tlist_{fidx}_mtime = getftime(a:filename) + + " No tags for current file + if cmd_output == '' + call s:Tlist_Log_Msg('No tags defined in ' . a:filename) + return fidx + endif + + call s:Tlist_Log_Msg('Generated tags information for ' . a:filename) + + if v:version > 601 + " The following script local variables are used by the + " Tlist_Parse_Tagline() function. + let s:ctags_flags = s:tlist_{a:ftype}_ctags_flags + let s:fidx = fidx + let s:tidx = 0 + + " Process the ctags output one line at a time. The substitute() + " command is used to parse the tag lines instead of using the + " matchstr()/stridx()/strpart() functions for performance reason + call substitute(cmd_output, "\\([^\n]\\+\\)\n", + \ '\=s:Tlist_Parse_Tagline(submatch(1))', 'g') + + " Save the number of tags for this file + let s:tlist_{fidx}_tag_count = s:tidx + + " The following script local variables are no longer needed + unlet! s:ctags_flags + unlet! s:tidx + unlet! s:fidx + else + " Due to a bug in Vim earlier than version 6.1, + " we cannot use substitute() to parse the ctags output. + " Instead the slow str*() functions are used + let ctags_flags = s:tlist_{a:ftype}_ctags_flags + let tidx = 0 + + while cmd_output != '' + " Extract one line at a time + let idx = stridx(cmd_output, "\n") + let one_line = strpart(cmd_output, 0, idx) + " Remove the line from the tags output + let cmd_output = strpart(cmd_output, idx + 1) + + if one_line == '' + " Line is not in proper tags format + continue + endif + + " Extract the tag type + let ttype = s:Tlist_Extract_Tagtype(one_line) + + " Make sure the tag type is a valid and supported one + if ttype == '' || stridx(ctags_flags, ttype) == -1 + " Line is not in proper tags format or Tag type is not + " supported + continue + endif + + " Update the total tag count + let tidx = tidx + 1 + + " The following variables are used to optimize this code. Vim is + " slow in using curly brace names. To reduce the amount of + " processing needed, the curly brace variables are pre-processed + " here + let fidx_tidx = 's:tlist_' . fidx . '_' . tidx + let fidx_ttype = 's:tlist_' . fidx . '_' . ttype + + " Update the count of this tag type + let ttype_idx = {fidx_ttype}_count + 1 + let {fidx_ttype}_count = ttype_idx + + " Store the ctags output for this tag + let {fidx_tidx}_tag = one_line + + " Store the tag index and the tag type index (back pointers) + let {fidx_ttype}_{ttype_idx} = tidx + let {fidx_tidx}_ttype_idx = ttype_idx + + " Extract the tag name + let tag_name = strpart(one_line, 0, stridx(one_line, "\t")) + + " Extract the tag scope/prototype + if g:Tlist_Display_Prototype + let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(fidx, tidx) + else + let ttxt = ' ' . tag_name + + " Add the tag scope, if it is available and is configured. Tag + " scope is the last field after the 'line:\t' field + if g:Tlist_Display_Tag_Scope + let tag_scope = s:Tlist_Extract_Tag_Scope(one_line) + if tag_scope != '' + let ttxt = ttxt . ' [' . tag_scope . ']' + endif + endif + endif + + " Add this tag to the tag type variable + let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" + + " Save the tag name + let {fidx_tidx}_tag_name = tag_name + endwhile + + " Save the number of tags for this file + let s:tlist_{fidx}_tag_count = tidx + endif + + call s:Tlist_Log_Msg('Processed ' . s:tlist_{fidx}_tag_count . + \ ' tags in ' . a:filename) + + return fidx +endfunction + +" Tlist_Update_File +" Update the tags for a file (if needed) +function! Tlist_Update_File(filename, ftype) + call s:Tlist_Log_Msg('Tlist_Update_File (' . a:filename . ')') + " If the file doesn't support tag listing, skip it + if s:Tlist_Skip_File(a:filename, a:ftype) + return + endif + + " Convert the file name to a full path + let fname = fnamemodify(a:filename, ':p') + + " First check whether the file already exists + let fidx = s:Tlist_Get_File_Index(fname) + + if fidx != -1 && s:tlist_{fidx}_valid + " File exists and the tags are valid + " Check whether the file was modified after the last tags update + " If it is modified, then update the tags + if s:tlist_{fidx}_mtime == getftime(fname) + return + endif + else + " If the tags were removed previously based on a user request, + " as we are going to update the tags (based on the user request), + " remove the filename from the deleted list + call s:Tlist_Update_Remove_List(fname, 0) + endif + + " If the taglist window is opened, update it + let winnum = bufwinnr(g:TagList_title) + if winnum == -1 + " Taglist window is not present. Just update the taglist + " and return + call s:Tlist_Process_File(fname, a:ftype) + else + if g:Tlist_Show_One_File && s:tlist_cur_file_idx != -1 + " If tags for only one file are displayed and we are not + " updating the tags for that file, then no need to + " refresh the taglist window. Otherwise, the taglist + " window should be updated. + if s:tlist_{s:tlist_cur_file_idx}_filename != fname + call s:Tlist_Process_File(fname, a:ftype) + return + endif + endif + + " Save the current window number + let save_winnr = winnr() + + " Goto the taglist window + call s:Tlist_Window_Goto_Window() + + " Save the cursor position + let save_line = line('.') + let save_col = col('.') + + " Update the taglist window + call s:Tlist_Window_Refresh_File(fname, a:ftype) + + " Restore the cursor position + if v:version >= 601 + call cursor(save_line, save_col) + else + exe save_line + exe 'normal! ' . save_col . '|' + endif + + if winnr() != save_winnr + " Go back to the original window + call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') + endif + endif + + " Update the taglist menu + if g:Tlist_Show_Menu + call s:Tlist_Menu_Update_File(1) + endif +endfunction + +" Tlist_Window_Close +" Close the taglist window +function! s:Tlist_Window_Close() + call s:Tlist_Log_Msg('Tlist_Window_Close()') + " Make sure the taglist window exists + let winnum = bufwinnr(g:TagList_title) + if winnum == -1 + call s:Tlist_Warning_Msg('Error: Taglist window is not open') + return + endif + + if winnr() == winnum + " Already in the taglist window. Close it and return + if winbufnr(2) != -1 + " If a window other than the taglist window is open, + " then only close the taglist window. + close + endif + else + " Goto the taglist window, close it and then come back to the + " original window + let curbufnr = bufnr('%') + exe winnum . 'wincmd w' + close + " Need to jump back to the original window only if we are not + " already in that window + let winnum = bufwinnr(curbufnr) + if winnr() != winnum + exe winnum . 'wincmd w' + endif + endif +endfunction + +" Tlist_Window_Mark_File_Window +" Mark the current window as the file window to use when jumping to a tag. +" Only if the current window is a non-plugin, non-preview and non-taglist +" window +function! s:Tlist_Window_Mark_File_Window() + if getbufvar('%', '&buftype') == '' && !&previewwindow + let w:tlist_file_window = "yes" + endif +endfunction + +" Tlist_Window_Open +" Open and refresh the taglist window +function! s:Tlist_Window_Open() + call s:Tlist_Log_Msg('Tlist_Window_Open()') + " If the window is open, jump to it + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + " Jump to the existing window + if winnr() != winnum + exe winnum . 'wincmd w' + endif + return + endif + + if s:tlist_app_name == "winmanager" + " Taglist plugin is no longer part of the winmanager app + let s:tlist_app_name = "none" + endif + + " Get the filename and filetype for the specified buffer + let curbuf_name = fnamemodify(bufname('%'), ':p') + let curbuf_ftype = s:Tlist_Get_Buffer_Filetype('%') + let cur_lnum = line('.') + + " Mark the current window as the desired window to open a file when a tag + " is selected. + call s:Tlist_Window_Mark_File_Window() + + " Open the taglist window + call s:Tlist_Window_Create() + + call s:Tlist_Window_Refresh() + + if g:Tlist_Show_One_File + " Add only the current buffer and file + " + " If the file doesn't support tag listing, skip it + if !s:Tlist_Skip_File(curbuf_name, curbuf_ftype) + call s:Tlist_Window_Refresh_File(curbuf_name, curbuf_ftype) + endif + endif + + if g:Tlist_File_Fold_Auto_Close + " Open the fold for the current file, as all the folds in + " the taglist window are closed + let fidx = s:Tlist_Get_File_Index(curbuf_name) + if fidx != -1 + exe "silent! " . s:tlist_{fidx}_start . "," . + \ s:tlist_{fidx}_end . "foldopen!" + endif + endif + + " Highlight the current tag + call s:Tlist_Window_Highlight_Tag(curbuf_name, cur_lnum, 1, 1) +endfunction + +" Tlist_Window_Toggle() +" Open or close a taglist window +function! s:Tlist_Window_Toggle() + call s:Tlist_Log_Msg('Tlist_Window_Toggle()') + " If taglist window is open then close it. + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + call s:Tlist_Window_Close() + return + endif + + call s:Tlist_Window_Open() + + " Go back to the original window, if Tlist_GainFocus_On_ToggleOpen is not + " set + if !g:Tlist_GainFocus_On_ToggleOpen + call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + endif + + " Update the taglist menu + if g:Tlist_Show_Menu + call s:Tlist_Menu_Update_File(0) + endif +endfunction + +" Tlist_Process_Filelist +" Process multiple files. Each filename is separated by "\n" +" Returns the number of processed files +function! s:Tlist_Process_Filelist(file_names) + let flist = a:file_names + + " Enable lazy screen updates + let old_lazyredraw = &lazyredraw + set lazyredraw + + " Keep track of the number of processed files + let fcnt = 0 + + " Process one file at a time + while flist != '' + let nl_idx = stridx(flist, "\n") + let one_file = strpart(flist, 0, nl_idx) + + " Remove the filename from the list + let flist = strpart(flist, nl_idx + 1) + + if one_file == '' + continue + endif + + " Skip directories + if isdirectory(one_file) + continue + endif + + let ftype = s:Tlist_Detect_Filetype(one_file) + + echon "\r " + echon "\rProcessing tags for " . fnamemodify(one_file, ':p:t') + + let fcnt = fcnt + 1 + + call Tlist_Update_File(one_file, ftype) + endwhile + + " Clear the displayed informational messages + echon "\r " + + " Restore the previous state + let &lazyredraw = old_lazyredraw + + return fcnt +endfunction + +" Tlist_Process_Dir +" Process the files in a directory matching the specified pattern +function! s:Tlist_Process_Dir(dir_name, pat) + let flist = glob(a:dir_name . '/' . a:pat) . "\n" + + let fcnt = s:Tlist_Process_Filelist(flist) + + let len = strlen(a:dir_name) + if a:dir_name[len - 1] == '\' || a:dir_name[len - 1] == '/' + let glob_expr = a:dir_name . '*' + else + let glob_expr = a:dir_name . '/*' + endif + let all_files = glob(glob_expr) . "\n" + + while all_files != '' + let nl_idx = stridx(all_files, "\n") + let one_file = strpart(all_files, 0, nl_idx) + + let all_files = strpart(all_files, nl_idx + 1) + if one_file == '' + continue + endif + + " Skip non-directory names + if !isdirectory(one_file) + continue + endif + + echon "\r " + echon "\rProcessing files in directory " . fnamemodify(one_file, ':t') + let fcnt = fcnt + s:Tlist_Process_Dir(one_file, a:pat) + endwhile + + return fcnt +endfunction + +" Tlist_Add_Files_Recursive +" Add files recursively from a directory +function! s:Tlist_Add_Files_Recursive(dir, ...) + let dir_name = fnamemodify(a:dir, ':p') + if !isdirectory(dir_name) + call s:Tlist_Warning_Msg('Error: ' . dir_name . ' is not a directory') + return + endif + + if a:0 == 1 + " User specified file pattern + let pat = a:1 + else + " Default file pattern + let pat = '*' + endif + + echon "\r " + echon "\rProcessing files in directory " . fnamemodify(dir_name, ':t') + let fcnt = s:Tlist_Process_Dir(dir_name, pat) + + echon "\rAdded " . fcnt . " files to the taglist" +endfunction + +" Tlist_Add_Files +" Add the specified list of files to the taglist +function! s:Tlist_Add_Files(...) + let flist = '' + let i = 1 + + " Get all the files matching the file patterns supplied as argument + while i <= a:0 + let flist = flist . glob(a:{i}) . "\n" + let i = i + 1 + endwhile + + if flist == '' + call s:Tlist_Warning_Msg('Error: No matching files are found') + return + endif + + let fcnt = s:Tlist_Process_Filelist(flist) + echon "\rAdded " . fcnt . " files to the taglist" +endfunction + +" Tlist_Extract_Tagtype +" Extract the tag type from the tag text +function! s:Tlist_Extract_Tagtype(tag_line) + " The tag type is after the tag prototype field. The prototype field + " ends with the /;"\t string. We add 4 at the end to skip the characters + " in this special string.. + let start = strridx(a:tag_line, '/;"' . "\t") + 4 + let end = strridx(a:tag_line, 'line:') - 1 + let ttype = strpart(a:tag_line, start, end - start) + + return ttype +endfunction + +" Tlist_Extract_Tag_Scope +" Extract the tag scope from the tag text +function! s:Tlist_Extract_Tag_Scope(tag_line) + let start = strridx(a:tag_line, 'line:') + let end = strridx(a:tag_line, "\t") + if end <= start + return '' + endif + + let tag_scope = strpart(a:tag_line, end + 1) + let tag_scope = strpart(tag_scope, stridx(tag_scope, ':') + 1) + + return tag_scope +endfunction + +" Tlist_Refresh() +" Refresh the taglist +function! s:Tlist_Refresh() + call s:Tlist_Log_Msg('Tlist_Refresh (Skip_Refresh = ' . + \ s:Tlist_Skip_Refresh . ', ' . bufname('%') . ')') + " If we are entering the buffer from one of the taglist functions, then + " no need to refresh the taglist window again. + if s:Tlist_Skip_Refresh + " We still need to update the taglist menu + if g:Tlist_Show_Menu + call s:Tlist_Menu_Update_File(0) + endif + return + endif + + " If part of the winmanager plugin and not configured to process + " tags always and not configured to display the tags menu, then return + if (s:tlist_app_name == 'winmanager') && !g:Tlist_Process_File_Always + \ && !g:Tlist_Show_Menu + return + endif + + " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help + if &buftype != '' + return + endif + + let filename = fnamemodify(bufname('%'), ':p') + let ftype = s:Tlist_Get_Buffer_Filetype('%') + + " If the file doesn't support tag listing, skip it + if s:Tlist_Skip_File(filename, ftype) + return + endif + + let tlist_win = bufwinnr(g:TagList_title) + + " If the taglist window is not opened and not configured to process + " tags always and not displaying the tags menu, then return + if tlist_win == -1 && !g:Tlist_Process_File_Always && !g:Tlist_Show_Menu + return + endif + + let fidx = s:Tlist_Get_File_Index(filename) + if fidx == -1 + " Check whether this file is removed based on user request + " If it is, then don't display the tags for this file + if s:Tlist_User_Removed_File(filename) + return + endif + + " If the taglist should not be auto updated, then return + if !g:Tlist_Auto_Update + return + endif + endif + + let cur_lnum = line('.') + + if fidx == -1 + " Update the tags for the file + let fidx = s:Tlist_Process_File(filename, ftype) + else + let mtime = getftime(filename) + if s:tlist_{fidx}_mtime != mtime + " Invalidate the tags listed for this file + let s:tlist_{fidx}_valid = 0 + + " Update the taglist and the window + call Tlist_Update_File(filename, ftype) + + " Store the new file modification time + let s:tlist_{fidx}_mtime = mtime + endif + endif + + " Update the taglist window + if tlist_win != -1 + " Disable screen updates + let old_lazyredraw = &lazyredraw + set nolazyredraw + + " Save the current window number + let save_winnr = winnr() + + " Goto the taglist window + call s:Tlist_Window_Goto_Window() + + if !g:Tlist_Auto_Highlight_Tag || !g:Tlist_Highlight_Tag_On_BufEnter + " Save the cursor position + let save_line = line('.') + let save_col = col('.') + endif + + " Update the taglist window + call s:Tlist_Window_Refresh_File(filename, ftype) + + " Open the fold for the file + exe "silent! " . s:tlist_{fidx}_start . "," . + \ s:tlist_{fidx}_end . "foldopen!" + + if g:Tlist_Highlight_Tag_On_BufEnter && g:Tlist_Auto_Highlight_Tag + if g:Tlist_Show_One_File && s:tlist_cur_file_idx != fidx + " If displaying tags for only one file in the taglist + " window and about to display the tags for a new file, + " then center the current tag line for the new file + let center_tag_line = 1 + else + let center_tag_line = 0 + endif + + " Highlight the current tag + call s:Tlist_Window_Highlight_Tag(filename, cur_lnum, 1, center_tag_line) + else + " Restore the cursor position + if v:version >= 601 + call cursor(save_line, save_col) + else + exe save_line + exe 'normal! ' . save_col . '|' + endif + endif + + " Jump back to the original window + if save_winnr != winnr() + call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') + endif + + " Restore screen updates + let &lazyredraw = old_lazyredraw + endif + + " Update the taglist menu + if g:Tlist_Show_Menu + call s:Tlist_Menu_Update_File(0) + endif +endfunction + +" Tlist_Change_Sort() +" Change the sort order of the tag listing +" caller == 'cmd', command used in the taglist window +" caller == 'menu', taglist menu +" action == 'toggle', toggle sort from name to order and vice versa +" action == 'set', set the sort order to sort_type +function! s:Tlist_Change_Sort(caller, action, sort_type) + call s:Tlist_Log_Msg('Tlist_Change_Sort (caller = ' . a:caller . + \ ', action = ' . a:action . ', sort_type = ' . a:sort_type . ')') + if a:caller == 'cmd' + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) + if fidx == -1 + return + endif + + " Remove the previous highlighting + match none + elseif a:caller == 'menu' + let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) + if fidx == -1 + return + endif + endif + + if a:action == 'toggle' + let sort_type = s:tlist_{fidx}_sort_type + + " Toggle the sort order from 'name' to 'order' and vice versa + if sort_type == 'name' + let s:tlist_{fidx}_sort_type = 'order' + else + let s:tlist_{fidx}_sort_type = 'name' + endif + else + let s:tlist_{fidx}_sort_type = a:sort_type + endif + + " Invalidate the tags listed for this file + let s:tlist_{fidx}_valid = 0 + + if a:caller == 'cmd' + " Save the current line for later restoration + let curline = '\V\^' . getline('.') . '\$' + + call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, + \ s:tlist_{fidx}_filetype) + + exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' + + " Go back to the cursor line before the tag list is sorted + call search(curline, 'w') + + call s:Tlist_Menu_Update_File(1) + else + call s:Tlist_Menu_Remove_File() + + call s:Tlist_Refresh() + endif +endfunction + +" Tlist_Update_Current_File() +" Update taglist for the current buffer by regenerating the tag list +" Contributed by WEN Guopeng. +function! s:Tlist_Update_Current_File() + call s:Tlist_Log_Msg('Tlist_Update_Current_File()') + if winnr() == bufwinnr(g:TagList_title) + " In the taglist window. Update the current file + call s:Tlist_Window_Update_File() + else + " Not in the taglist window. Update the current buffer + let filename = fnamemodify(bufname('%'), ':p') + let fidx = s:Tlist_Get_File_Index(filename) + if fidx != -1 + let s:tlist_{fidx}_valid = 0 + endif + let ft = s:Tlist_Get_Buffer_Filetype('%') + call Tlist_Update_File(filename, ft) + endif +endfunction + +" Tlist_Window_Update_File() +" Update the tags displayed in the taglist window +function! s:Tlist_Window_Update_File() + call s:Tlist_Log_Msg('Tlist_Window_Update_File()') + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) + if fidx == -1 + return + endif + + " Remove the previous highlighting + match none + + " Save the current line for later restoration + let curline = '\V\^' . getline('.') . '\$' + + let s:tlist_{fidx}_valid = 0 + + " Update the taglist window + call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, + \ s:tlist_{fidx}_filetype) + + exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' + + " Go back to the tag line before the list is updated + call search(curline, 'w') +endfunction + +" Tlist_Window_Get_Tag_Type_By_Linenum() +" Return the tag type index for the specified line in the taglist window +function! s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum) + let ftype = s:tlist_{a:fidx}_filetype + + " Determine to which tag type the current line number belongs to using the + " tag type start line number and the number of tags in a tag type + let i = 1 + while i <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{i}_name + let start_lnum = + \ s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset + let end = start_lnum + s:tlist_{a:fidx}_{ttype}_count + if a:lnum >= start_lnum && a:lnum <= end + break + endif + let i = i + 1 + endwhile + + " Current line doesn't belong to any of the displayed tag types + if i > s:tlist_{ftype}_count + return '' + endif + + return ttype +endfunction + +" Tlist_Window_Get_Tag_Index() +" Return the tag index for the specified line in the taglist window +function! s:Tlist_Window_Get_Tag_Index(fidx, lnum) + let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(a:fidx, a:lnum) + + " Current line doesn't belong to any of the displayed tag types + if ttype == '' + return 0 + endif + + " Compute the index into the displayed tags for the tag type + let ttype_lnum = s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset + let tidx = a:lnum - ttype_lnum + if tidx == 0 + return 0 + endif + + " Get the corresponding tag line and return it + return s:tlist_{a:fidx}_{ttype}_{tidx} +endfunction + +" Tlist_Window_Highlight_Line +" Highlight the current line +function! s:Tlist_Window_Highlight_Line() + " Clear previously selected name + match none + + " Highlight the current line + if g:Tlist_Display_Prototype == 0 + let pat = '/\%' . line('.') . 'l\s\+\zs.*/' + else + let pat = '/\%' . line('.') . 'l.*/' + endif + + exe 'match TagListTagName ' . pat +endfunction + +" Tlist_Window_Open_File +" Open the specified file in either a new window or an existing window +" and place the cursor at the specified tag pattern +function! s:Tlist_Window_Open_File(win_ctrl, filename, tagpat) + call s:Tlist_Log_Msg('Tlist_Window_Open_File (' . a:filename . ',' . + \ a:win_ctrl . ')') + let prev_Tlist_Skip_Refresh = s:Tlist_Skip_Refresh + let s:Tlist_Skip_Refresh = 1 + + if s:tlist_app_name == "winmanager" + " Let the winmanager edit the file + call WinManagerFileEdit(a:filename, a:win_ctrl == 'newwin') + else + + if a:win_ctrl == 'newtab' + " Create a new tab + exe 'tabnew ' . escape(a:filename, ' ') + " Open the taglist window in the new tab + call s:Tlist_Window_Open() + endif + + if a:win_ctrl == 'checktab' + " Check whether the file is present in any of the tabs. + " If the file is present in the current tab, then use the + " current tab. + if bufwinnr(a:filename) != -1 + let file_present_in_tab = 1 + let i = tabpagenr() + else + let i = 1 + let bnum = bufnr(a:filename) + let file_present_in_tab = 0 + while i <= tabpagenr('$') + if index(tabpagebuflist(i), bnum) != -1 + let file_present_in_tab = 1 + break + endif + let i += 1 + endwhile + endif + + if file_present_in_tab + " Goto the tab containing the file + exe 'tabnext ' . i + else + " Open a new tab + exe 'tabnew ' . escape(a:filename, ' ') + + " Open the taglist window + call s:Tlist_Window_Open() + endif + endif + + let winnum = -1 + if a:win_ctrl == 'prevwin' + " Open the file in the previous window, if it is usable + let cur_win = winnr() + wincmd p + if &buftype == '' && !&previewwindow + exe "edit " . escape(a:filename, ' ') + let winnum = winnr() + else + " Previous window is not usable + exe cur_win . 'wincmd w' + endif + endif + + " Goto the window containing the file. If the window is not there, open a + " new window + if winnum == -1 + let winnum = bufwinnr(a:filename) + endif + + if winnum == -1 + " Locate the previously used window for opening a file + let fwin_num = 0 + let first_usable_win = 0 + + let i = 1 + let bnum = winbufnr(i) + while bnum != -1 + if getwinvar(i, 'tlist_file_window') == 'yes' + let fwin_num = i + break + endif + if first_usable_win == 0 && + \ getbufvar(bnum, '&buftype') == '' && + \ !getwinvar(i, '&previewwindow') + " First non-taglist, non-plugin and non-preview window + let first_usable_win = i + endif + let i = i + 1 + let bnum = winbufnr(i) + endwhile + + " If a previously used window is not found, then use the first + " non-taglist window + if fwin_num == 0 + let fwin_num = first_usable_win + endif + + if fwin_num != 0 + " Jump to the file window + exe fwin_num . "wincmd w" + + " If the user asked to jump to the tag in a new window, then split + " the existing window into two. + if a:win_ctrl == 'newwin' + split + endif + exe "edit " . escape(a:filename, ' ') + else + " Open a new window + if g:Tlist_Use_Horiz_Window + exe 'leftabove split ' . escape(a:filename, ' ') + else + if winbufnr(2) == -1 + " Only the taglist window is present + if g:Tlist_Use_Right_Window + exe 'leftabove vertical split ' . + \ escape(a:filename, ' ') + else + exe 'rightbelow vertical split ' . + \ escape(a:filename, ' ') + endif + + " Go to the taglist window to change the window size to + " the user configured value + call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + if g:Tlist_Use_Horiz_Window + exe 'resize ' . g:Tlist_WinHeight + else + exe 'vertical resize ' . g:Tlist_WinWidth + endif + " Go back to the file window + call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + else + " A plugin or help window is also present + wincmd w + exe 'leftabove split ' . escape(a:filename, ' ') + endif + endif + endif + " Mark the window, so that it can be reused. + call s:Tlist_Window_Mark_File_Window() + else + if v:version >= 700 + " If the file is opened in more than one window, then check + " whether the last accessed window has the selected file. + " If it does, then use that window. + let lastwin_bufnum = winbufnr(winnr('#')) + if bufnr(a:filename) == lastwin_bufnum + let winnum = winnr('#') + endif + endif + exe winnum . 'wincmd w' + + " If the user asked to jump to the tag in a new window, then split the + " existing window into two. + if a:win_ctrl == 'newwin' + split + endif + endif + endif + + " Jump to the tag + if a:tagpat != '' + " Add the current cursor position to the jump list, so that user can + " jump back using the ' and ` marks. + mark ' + silent call search(a:tagpat, 'w') + + " Bring the line to the middle of the window + normal! z. + + " If the line is inside a fold, open the fold + if foldclosed('.') != -1 + .foldopen + endif + endif + + " If the user selects to preview the tag then jump back to the + " taglist window + if a:win_ctrl == 'preview' + " Go back to the taglist window + let winnum = bufwinnr(g:TagList_title) + exe winnum . 'wincmd w' + else + " If the user has selected to close the taglist window, when a + " tag is selected, close the taglist window + if g:Tlist_Close_On_Select + call s:Tlist_Window_Goto_Window() + close + + " Go back to the window displaying the selected file + let wnum = bufwinnr(a:filename) + if wnum != -1 && wnum != winnr() + call s:Tlist_Exe_Cmd_No_Acmds(wnum . 'wincmd w') + endif + endif + endif + + let s:Tlist_Skip_Refresh = prev_Tlist_Skip_Refresh +endfunction + +" Tlist_Window_Jump_To_Tag() +" Jump to the location of the current tag +" win_ctrl == useopen - Reuse the existing file window +" win_ctrl == newwin - Open a new window +" win_ctrl == preview - Preview the tag +" win_ctrl == prevwin - Open in previous window +" win_ctrl == newtab - Open in new tab +function! s:Tlist_Window_Jump_To_Tag(win_ctrl) + call s:Tlist_Log_Msg('Tlist_Window_Jump_To_Tag(' . a:win_ctrl . ')') + " Do not process comment lines and empty lines + let curline = getline('.') + if curline =~ '^\s*$' || curline[0] == '"' + return + endif + + " If inside a closed fold, then use the first line of the fold + " and jump to the file. + let lnum = foldclosed('.') + if lnum == -1 + " Jump to the selected tag or file + let lnum = line('.') + else + " Open the closed fold + .foldopen! + endif + + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum) + if fidx == -1 + return + endif + + " Get the tag output for the current tag + let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum) + if tidx != 0 + let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, tidx) + + " Highlight the tagline + call s:Tlist_Window_Highlight_Line() + else + " Selected a line which is not a tag name. Just edit the file + let tagpat = '' + endif + + call s:Tlist_Window_Open_File(a:win_ctrl, s:tlist_{fidx}_filename, tagpat) +endfunction + +" Tlist_Window_Show_Info() +" Display information about the entry under the cursor +function! s:Tlist_Window_Show_Info() + call s:Tlist_Log_Msg('Tlist_Window_Show_Info()') + + " Clear the previously displayed line + echo + + " Do not process comment lines and empty lines + let curline = getline('.') + if curline =~ '^\s*$' || curline[0] == '"' + return + endif + + " If inside a fold, then don't display the prototype + if foldclosed('.') != -1 + return + endif + + let lnum = line('.') + + " Get the file index + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum) + if fidx == -1 + return + endif + + if lnum == s:tlist_{fidx}_start + " Cursor is on a file name + let fname = s:tlist_{fidx}_filename + if strlen(fname) > 50 + let fname = fnamemodify(fname, ':t') + endif + echo fname . ', Filetype=' . s:tlist_{fidx}_filetype . + \ ', Tag count=' . s:tlist_{fidx}_tag_count + return + endif + + " Get the tag output line for the current tag + let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum) + if tidx == 0 + " Cursor is on a tag type + let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum) + if ttype == '' + return + endif + + let ttype_name = '' + + let ftype = s:tlist_{fidx}_filetype + let i = 1 + while i <= s:tlist_{ftype}_count + if ttype == s:tlist_{ftype}_{i}_name + let ttype_name = s:tlist_{ftype}_{i}_fullname + break + endif + let i = i + 1 + endwhile + + echo 'Tag type=' . ttype_name . + \ ', Tag count=' . s:tlist_{fidx}_{ttype}_count + return + endif + + " Get the tag search pattern and display it + echo s:Tlist_Get_Tag_Prototype(fidx, tidx) +endfunction + +" Tlist_Find_Nearest_Tag_Idx +" Find the tag idx nearest to the supplied line number +" Returns -1, if a tag couldn't be found for the specified line number +function! s:Tlist_Find_Nearest_Tag_Idx(fidx, linenum) + let sort_type = s:tlist_{a:fidx}_sort_type + + let left = 1 + let right = s:tlist_{a:fidx}_tag_count + + if sort_type == 'order' + " Tags sorted by order, use a binary search. + " The idea behind this function is taken from the ctags.vim script (by + " Alexey Marinichev) available at the Vim online website. + + " If the current line is the less than the first tag, then no need to + " search + let first_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, 1) + + if a:linenum < first_lnum + return -1 + endif + + while left < right + let middle = (right + left + 1) / 2 + let middle_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, middle) + + if middle_lnum == a:linenum + let left = middle + break + endif + + if middle_lnum > a:linenum + let right = middle - 1 + else + let left = middle + endif + endwhile + else + " Tags sorted by name, use a linear search. (contributed by Dave + " Eggum). + " Look for a tag with a line number less than or equal to the supplied + " line number. If multiple tags are found, then use the tag with the + " line number closest to the supplied line number. IOW, use the tag + " with the highest line number. + let closest_lnum = 0 + let final_left = 0 + while left <= right + let lnum = s:Tlist_Get_Tag_Linenum(a:fidx, left) + + if lnum < a:linenum && lnum > closest_lnum + let closest_lnum = lnum + let final_left = left + elseif lnum == a:linenum + let closest_lnum = lnum + let final_left = left + break + else + let left = left + 1 + endif + endwhile + if closest_lnum == 0 + return -1 + endif + if left >= right + let left = final_left + endif + endif + + return left +endfunction + +" Tlist_Window_Highlight_Tag() +" Highlight the current tag +" cntx == 1, Called by the taglist plugin itself +" cntx == 2, Forced by the user through the TlistHighlightTag command +" center = 1, move the tag line to the center of the taglist window +function! s:Tlist_Window_Highlight_Tag(filename, cur_lnum, cntx, center) + " Highlight the current tag only if the user configured the + " taglist plugin to do so or if the user explictly invoked the + " command to highlight the current tag. + if !g:Tlist_Auto_Highlight_Tag && a:cntx == 1 + return + endif + + if a:filename == '' + return + endif + + " Make sure the taglist window is present + let winnum = bufwinnr(g:TagList_title) + if winnum == -1 + call s:Tlist_Warning_Msg('Error: Taglist window is not open') + return + endif + + let fidx = s:Tlist_Get_File_Index(a:filename) + if fidx == -1 + return + endif + + " If the file is currently not displayed in the taglist window, then retrn + if !s:tlist_{fidx}_visible + return + endif + + " If there are no tags for this file, then no need to proceed further + if s:tlist_{fidx}_tag_count == 0 + return + endif + + " Ignore all autocommands + let old_ei = &eventignore + set eventignore=all + + " Save the original window number + let org_winnr = winnr() + + if org_winnr == winnum + let in_taglist_window = 1 + else + let in_taglist_window = 0 + endif + + " Go to the taglist window + if !in_taglist_window + exe winnum . 'wincmd w' + endif + + " Clear previously selected name + match none + + let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, a:cur_lnum) + if tidx == -1 + " Make sure the current tag line is visible in the taglist window. + " Calling the winline() function makes the line visible. Don't know + " of a better way to achieve this. + let lnum = line('.') + + if lnum < s:tlist_{fidx}_start || lnum > s:tlist_{fidx}_end + " Move the cursor to the beginning of the file + exe s:tlist_{fidx}_start + endif + + if foldclosed('.') != -1 + .foldopen + endif + + call winline() + + if !in_taglist_window + exe org_winnr . 'wincmd w' + endif + + " Restore the autocommands + let &eventignore = old_ei + return + endif + + " Extract the tag type + let ttype = s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) + + " Compute the line number + " Start of file + Start of tag type + offset + let lnum = s:tlist_{fidx}_start + s:tlist_{fidx}_{ttype}_offset + + \ s:tlist_{fidx}_{tidx}_ttype_idx + + " Goto the line containing the tag + exe lnum + + " Open the fold + if foldclosed('.') != -1 + .foldopen + endif + + if a:center + " Move the tag line to the center of the taglist window + normal! z. + else + " Make sure the current tag line is visible in the taglist window. + " Calling the winline() function makes the line visible. Don't know + " of a better way to achieve this. + call winline() + endif + + " Highlight the tag name + call s:Tlist_Window_Highlight_Line() + + " Go back to the original window + if !in_taglist_window + exe org_winnr . 'wincmd w' + endif + + " Restore the autocommands + let &eventignore = old_ei + return +endfunction + +" Tlist_Get_Tag_Prototype_By_Line +" Get the prototype for the tag on or before the specified line number in the +" current buffer +function! Tlist_Get_Tag_Prototype_By_Line(...) + if a:0 == 0 + " Arguments are not supplied. Use the current buffer name + " and line number + let filename = bufname('%') + let linenr = line('.') + elseif a:0 == 2 + " Filename and line number are specified + let filename = a:1 + let linenr = a:2 + if linenr !~ '\d\+' + " Invalid line number + return "" + endif + else + " Sufficient arguments are not supplied + let msg = 'Usage: Tlist_Get_Tag_Prototype_By_Line ' . + \ '' + call s:Tlist_Warning_Msg(msg) + return "" + endif + + " Expand the file to a fully qualified name + let filename = fnamemodify(filename, ':p') + if filename == '' + return "" + endif + + let fidx = s:Tlist_Get_File_Index(filename) + if fidx == -1 + return "" + endif + + " If there are no tags for this file, then no need to proceed further + if s:tlist_{fidx}_tag_count == 0 + return "" + endif + + " Get the tag text using the line number + let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) + if tidx == -1 + return "" + endif + + return s:Tlist_Get_Tag_Prototype(fidx, tidx) +endfunction + +" Tlist_Get_Tagname_By_Line +" Get the tag name on or before the specified line number in the +" current buffer +function! Tlist_Get_Tagname_By_Line(...) + if a:0 == 0 + " Arguments are not supplied. Use the current buffer name + " and line number + let filename = bufname('%') + let linenr = line('.') + elseif a:0 == 2 + " Filename and line number are specified + let filename = a:1 + let linenr = a:2 + if linenr !~ '\d\+' + " Invalid line number + return "" + endif + else + " Sufficient arguments are not supplied + let msg = 'Usage: Tlist_Get_Tagname_By_Line ' + call s:Tlist_Warning_Msg(msg) + return "" + endif + + " Make sure the current file has a name + let filename = fnamemodify(filename, ':p') + if filename == '' + return "" + endif + + let fidx = s:Tlist_Get_File_Index(filename) + if fidx == -1 + return "" + endif + + " If there are no tags for this file, then no need to proceed further + if s:tlist_{fidx}_tag_count == 0 + return "" + endif + + " Get the tag name using the line number + let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) + if tidx == -1 + return "" + endif + + return s:tlist_{fidx}_{tidx}_tag_name +endfunction + +" Tlist_Window_Move_To_File +" Move the cursor to the beginning of the current file or the next file +" or the previous file in the taglist window +" dir == -1, move to start of current or previous function +" dir == 1, move to start of next function +function! s:Tlist_Window_Move_To_File(dir) + if foldlevel('.') == 0 + " Cursor is on a non-folded line (it is not in any of the files) + " Move it to a folded line + if a:dir == -1 + normal! zk + else + " While moving down to the start of the next fold, + " no need to do go to the start of the next file. + normal! zj + return + endif + endif + + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) + if fidx == -1 + return + endif + + let cur_lnum = line('.') + + if a:dir == -1 + if cur_lnum > s:tlist_{fidx}_start + " Move to the beginning of the current file + exe s:tlist_{fidx}_start + return + endif + + if fidx != 0 + " Move to the beginning of the previous file + let fidx = fidx - 1 + else + " Cursor is at the first file, wrap around to the last file + let fidx = s:tlist_file_count - 1 + endif + + exe s:tlist_{fidx}_start + return + else + " Move to the beginning of the next file + let fidx = fidx + 1 + + if fidx >= s:tlist_file_count + " Cursor is at the last file, wrap around to the first file + let fidx = 0 + endif + + if s:tlist_{fidx}_start != 0 + exe s:tlist_{fidx}_start + endif + return + endif +endfunction + +" Tlist_Session_Load +" Load a taglist session (information about all the displayed files +" and the tags) from the specified file +function! s:Tlist_Session_Load(...) + if a:0 == 0 || a:1 == '' + call s:Tlist_Warning_Msg('Usage: TlistSessionLoad ') + return + endif + + let sessionfile = a:1 + + if !filereadable(sessionfile) + let msg = 'Taglist: Error - Unable to open file ' . sessionfile + call s:Tlist_Warning_Msg(msg) + return + endif + + " Mark the current window as the file window + call s:Tlist_Window_Mark_File_Window() + + " Source the session file + exe 'source ' . sessionfile + + let new_file_count = g:tlist_file_count + unlet! g:tlist_file_count + + let i = 0 + while i < new_file_count + let ftype = g:tlist_{i}_filetype + unlet! g:tlist_{i}_filetype + + if !exists('s:tlist_' . ftype . '_count') + if s:Tlist_FileType_Init(ftype) == 0 + let i = i + 1 + continue + endif + endif + + let fname = g:tlist_{i}_filename + unlet! g:tlist_{i}_filename + + let fidx = s:Tlist_Get_File_Index(fname) + if fidx != -1 + let s:tlist_{fidx}_visible = 0 + let i = i + 1 + continue + else + " As we are loading the tags from the session file, if this + " file was previously deleted by the user, now we need to + " add it back. So remove the file from the deleted list. + call s:Tlist_Update_Remove_List(fname, 0) + endif + + let fidx = s:Tlist_Init_File(fname, ftype) + + let s:tlist_{fidx}_filename = fname + + let s:tlist_{fidx}_sort_type = g:tlist_{i}_sort_type + unlet! g:tlist_{i}_sort_type + + let s:tlist_{fidx}_filetype = ftype + let s:tlist_{fidx}_mtime = getftime(fname) + + let s:tlist_{fidx}_start = 0 + let s:tlist_{fidx}_end = 0 + + let s:tlist_{fidx}_valid = 1 + + let s:tlist_{fidx}_tag_count = g:tlist_{i}_tag_count + unlet! g:tlist_{i}_tag_count + + let j = 1 + while j <= s:tlist_{fidx}_tag_count + let s:tlist_{fidx}_{j}_tag = g:tlist_{i}_{j}_tag + let s:tlist_{fidx}_{j}_tag_name = g:tlist_{i}_{j}_tag_name + let s:tlist_{fidx}_{j}_ttype_idx = g:tlist_{i}_{j}_ttype_idx + unlet! g:tlist_{i}_{j}_tag + unlet! g:tlist_{i}_{j}_tag_name + unlet! g:tlist_{i}_{j}_ttype_idx + let j = j + 1 + endwhile + + let j = 1 + while j <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{j}_name + + if exists('g:tlist_' . i . '_' . ttype) + let s:tlist_{fidx}_{ttype} = g:tlist_{i}_{ttype} + unlet! g:tlist_{i}_{ttype} + let s:tlist_{fidx}_{ttype}_offset = 0 + let s:tlist_{fidx}_{ttype}_count = g:tlist_{i}_{ttype}_count + unlet! g:tlist_{i}_{ttype}_count + + let k = 1 + while k <= s:tlist_{fidx}_{ttype}_count + let s:tlist_{fidx}_{ttype}_{k} = g:tlist_{i}_{ttype}_{k} + unlet! g:tlist_{i}_{ttype}_{k} + let k = k + 1 + endwhile + else + let s:tlist_{fidx}_{ttype} = '' + let s:tlist_{fidx}_{ttype}_offset = 0 + let s:tlist_{fidx}_{ttype}_count = 0 + endif + + let j = j + 1 + endwhile + + let i = i + 1 + endwhile + + " If the taglist window is open, then update it + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + let save_winnr = winnr() + + " Goto the taglist window + call s:Tlist_Window_Goto_Window() + + " Refresh the taglist window + call s:Tlist_Window_Refresh() + + " Go back to the original window + if save_winnr != winnr() + call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + endif + endif +endfunction + +" Tlist_Session_Save +" Save a taglist session (information about all the displayed files +" and the tags) into the specified file +function! s:Tlist_Session_Save(...) + if a:0 == 0 || a:1 == '' + call s:Tlist_Warning_Msg('Usage: TlistSessionSave ') + return + endif + + let sessionfile = a:1 + + if s:tlist_file_count == 0 + " There is nothing to save + call s:Tlist_Warning_Msg('Warning: Taglist is empty. Nothing to save.') + return + endif + + if filereadable(sessionfile) + let ans = input('Do you want to overwrite ' . sessionfile . ' (Y/N)?') + if ans !=? 'y' + return + endif + + echo "\n" + endif + + let old_verbose = &verbose + set verbose&vim + + exe 'redir! > ' . sessionfile + + silent! echo '" Taglist session file. This file is auto-generated.' + silent! echo '" File information' + silent! echo 'let tlist_file_count = ' . s:tlist_file_count + + let i = 0 + + while i < s:tlist_file_count + " Store information about the file + silent! echo 'let tlist_' . i . "_filename = '" . + \ s:tlist_{i}_filename . "'" + silent! echo 'let tlist_' . i . '_sort_type = "' . + \ s:tlist_{i}_sort_type . '"' + silent! echo 'let tlist_' . i . '_filetype = "' . + \ s:tlist_{i}_filetype . '"' + silent! echo 'let tlist_' . i . '_tag_count = ' . + \ s:tlist_{i}_tag_count + " Store information about all the tags + let j = 1 + while j <= s:tlist_{i}_tag_count + let txt = escape(s:tlist_{i}_{j}_tag, '"\\') + silent! echo 'let tlist_' . i . '_' . j . '_tag = "' . txt . '"' + silent! echo 'let tlist_' . i . '_' . j . '_tag_name = "' . + \ s:tlist_{i}_{j}_tag_name . '"' + silent! echo 'let tlist_' . i . '_' . j . '_ttype_idx' . ' = ' . + \ s:tlist_{i}_{j}_ttype_idx + let j = j + 1 + endwhile + + " Store information about all the tags grouped by their type + let ftype = s:tlist_{i}_filetype + let j = 1 + while j <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{j}_name + if s:tlist_{i}_{ttype}_count != 0 + let txt = escape(s:tlist_{i}_{ttype}, '"\') + let txt = substitute(txt, "\n", "\\\\n", 'g') + silent! echo 'let tlist_' . i . '_' . ttype . ' = "' . + \ txt . '"' + silent! echo 'let tlist_' . i . '_' . ttype . '_count = ' . + \ s:tlist_{i}_{ttype}_count + let k = 1 + while k <= s:tlist_{i}_{ttype}_count + silent! echo 'let tlist_' . i . '_' . ttype . '_' . k . + \ ' = ' . s:tlist_{i}_{ttype}_{k} + let k = k + 1 + endwhile + endif + let j = j + 1 + endwhile + + silent! echo + + let i = i + 1 + endwhile + + redir END + + let &verbose = old_verbose +endfunction + +" Tlist_Buffer_Removed +" A buffer is removed from the Vim buffer list. Remove the tags defined +" for that file +function! s:Tlist_Buffer_Removed(filename) + call s:Tlist_Log_Msg('Tlist_Buffer_Removed (' . a:filename . ')') + + " Make sure a valid filename is supplied + if a:filename == '' + return + endif + + " Get tag list index of the specified file + let fidx = s:Tlist_Get_File_Index(a:filename) + if fidx == -1 + " File not present in the taglist + return + endif + + " Remove the file from the list + call s:Tlist_Remove_File(fidx, 0) +endfunction + +" When a buffer is deleted, remove the file from the taglist +autocmd BufDelete * silent call s:Tlist_Buffer_Removed(expand(':p')) + +" Tlist_Window_Open_File_Fold +" Open the fold for the specified file and close the fold for all the +" other files +function! s:Tlist_Window_Open_File_Fold(acmd_bufnr) + call s:Tlist_Log_Msg('Tlist_Window_Open_File_Fold (' . a:acmd_bufnr . ')') + + " Make sure the taglist window is present + let winnum = bufwinnr(g:TagList_title) + if winnum == -1 + call s:Tlist_Warning_Msg('Taglist: Error - Taglist window is not open') + return + endif + + " Save the original window number + let org_winnr = winnr() + if org_winnr == winnum + let in_taglist_window = 1 + else + let in_taglist_window = 0 + endif + + if in_taglist_window + " When entering the taglist window, no need to update the folds + return + endif + + " Go to the taglist window + if !in_taglist_window + call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') + endif + + " Close all the folds + silent! %foldclose + + " Get tag list index of the specified file + let fname = fnamemodify(bufname(a:acmd_bufnr + 0), ':p') + if filereadable(fname) + let fidx = s:Tlist_Get_File_Index(fname) + if fidx != -1 + " Open the fold for the file + exe "silent! " . s:tlist_{fidx}_start . "," . + \ s:tlist_{fidx}_end . "foldopen" + endif + endif + + " Go back to the original window + if !in_taglist_window + call s:Tlist_Exe_Cmd_No_Acmds(org_winnr . 'wincmd w') + endif +endfunction + +" Tlist_Window_Check_Auto_Open +" Open the taglist window automatically on Vim startup. +" Open the window only when files present in any of the Vim windows support +" tags. +function! s:Tlist_Window_Check_Auto_Open() + let open_window = 0 + + let i = 1 + let buf_num = winbufnr(i) + while buf_num != -1 + let filename = fnamemodify(bufname(buf_num), ':p') + let ft = s:Tlist_Get_Buffer_Filetype(buf_num) + if !s:Tlist_Skip_File(filename, ft) + let open_window = 1 + break + endif + let i = i + 1 + let buf_num = winbufnr(i) + endwhile + + if open_window + call s:Tlist_Window_Toggle() + endif +endfunction + +" Tlist_Refresh_Folds +" Remove and create the folds for all the files displayed in the taglist +" window. Used after entering a tab. If this is not done, then the folds +" are not properly created for taglist windows displayed in multiple tabs. +function! s:Tlist_Refresh_Folds() + let winnum = bufwinnr(g:TagList_title) + if winnum == -1 + return + endif + + let save_wnum = winnr() + exe winnum . 'wincmd w' + + " First remove all the existing folds + normal! zE + + " Create the folds for each in the tag list + let fidx = 0 + while fidx < s:tlist_file_count + let ftype = s:tlist_{fidx}_filetype + + " Create the folds for each tag type in a file + let j = 1 + while j <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{j}_name + if s:tlist_{fidx}_{ttype}_count + let s = s:tlist_{fidx}_start + s:tlist_{fidx}_{ttype}_offset + let e = s + s:tlist_{fidx}_{ttype}_count + exe s . ',' . e . 'fold' + endif + let j = j + 1 + endwhile + + exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'fold' + exe 'silent! ' . s:tlist_{fidx}_start . ',' . + \ s:tlist_{fidx}_end . 'foldopen!' + let fidx = fidx + 1 + endwhile + + exe save_wnum . 'wincmd w' +endfunction + +function! s:Tlist_Menu_Add_Base_Menu() + call s:Tlist_Log_Msg('Adding the base menu') + + " Add the menu + anoremenu T&ags.Refresh\ menu :call Tlist_Menu_Refresh() + anoremenu T&ags.Sort\ menu\ by.Name + \ :call Tlist_Change_Sort('menu', 'set', 'name') + anoremenu T&ags.Sort\ menu\ by.Order + \ :call Tlist_Change_Sort('menu', 'set', 'order') + anoremenu T&ags.-SEP1- : + + if &mousemodel =~ 'popup' + anoremenu PopUp.T&ags.Refresh\ menu + \ :call Tlist_Menu_Refresh() + anoremenu PopUp.T&ags.Sort\ menu\ by.Name + \ :call Tlist_Change_Sort('menu', 'set', 'name') + anoremenu PopUp.T&ags.Sort\ menu\ by.Order + \ :call Tlist_Change_Sort('menu', 'set', 'order') + anoremenu PopUp.T&ags.-SEP1- : + endif +endfunction + +let s:menu_char_prefix = + \ '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + +" Tlist_Menu_Get_Tag_Type_Cmd +" Get the menu command for the specified tag type +" fidx - File type index +" ftype - File Type +" add_ttype_name - To add or not to add the tag type name to the menu entries +" ttype_idx - Tag type index +function! s:Tlist_Menu_Get_Tag_Type_Cmd(fidx, ftype, add_ttype_name, ttype_idx) + " Curly brace variable name optimization + let ftype_ttype_idx = a:ftype . '_' . a:ttype_idx + + let ttype = s:tlist_{ftype_ttype_idx}_name + if a:add_ttype_name + " If the tag type name contains space characters, escape it. This + " will be used to create the menu entries. + let ttype_fullname = escape(s:tlist_{ftype_ttype_idx}_fullname, ' ') + endif + + " Curly brace variable name optimization + let fidx_ttype = a:fidx . '_' . ttype + + " Number of tag entries for this tag type + let tcnt = s:tlist_{fidx_ttype}_count + if tcnt == 0 " No entries for this tag type + return '' + endif + + let mcmd = '' + + " Create the menu items for the tags. + " Depending on the number of tags of this type, split the menu into + " multiple sub-menus, if needed. + if tcnt > g:Tlist_Max_Submenu_Items + let j = 1 + while j <= tcnt + let final_index = j + g:Tlist_Max_Submenu_Items - 1 + if final_index > tcnt + let final_index = tcnt + endif + + " Extract the first and last tag name and form the + " sub-menu name + let tidx = s:tlist_{fidx_ttype}_{j} + let first_tag = s:tlist_{a:fidx}_{tidx}_tag_name + + let tidx = s:tlist_{fidx_ttype}_{final_index} + let last_tag = s:tlist_{a:fidx}_{tidx}_tag_name + + " Truncate the names, if they are greater than the + " max length + let first_tag = strpart(first_tag, 0, g:Tlist_Max_Tag_Length) + let last_tag = strpart(last_tag, 0, g:Tlist_Max_Tag_Length) + + " Form the menu command prefix + let m_prefix = 'anoremenu T\&ags.' + if a:add_ttype_name + let m_prefix = m_prefix . ttype_fullname . '.' + endif + let m_prefix = m_prefix . first_tag . '\.\.\.' . last_tag . '.' + + " Character prefix used to number the menu items (hotkey) + let m_prefix_idx = 0 + + while j <= final_index + let tidx = s:tlist_{fidx_ttype}_{j} + + let tname = s:tlist_{a:fidx}_{tidx}_tag_name + + let mcmd = mcmd . m_prefix . '\&' . + \ s:menu_char_prefix[m_prefix_idx] . '\.' . + \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . + \ tidx . ')|' + + let m_prefix_idx = m_prefix_idx + 1 + let j = j + 1 + endwhile + endwhile + else + " Character prefix used to number the menu items (hotkey) + let m_prefix_idx = 0 + + let m_prefix = 'anoremenu T\&ags.' + if a:add_ttype_name + let m_prefix = m_prefix . ttype_fullname . '.' + endif + let j = 1 + while j <= tcnt + let tidx = s:tlist_{fidx_ttype}_{j} + + let tname = s:tlist_{a:fidx}_{tidx}_tag_name + + let mcmd = mcmd . m_prefix . '\&' . + \ s:menu_char_prefix[m_prefix_idx] . '\.' . + \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . tidx + \ . ')|' + + let m_prefix_idx = m_prefix_idx + 1 + let j = j + 1 + endwhile + endif + + return mcmd +endfunction + +" Update the taglist menu with the tags for the specified file +function! s:Tlist_Menu_File_Refresh(fidx) + call s:Tlist_Log_Msg('Refreshing the tag menu for ' . s:tlist_{a:fidx}_filename) + " The 'B' flag is needed in the 'cpoptions' option + let old_cpoptions = &cpoptions + set cpoptions&vim + + exe s:tlist_{a:fidx}_menu_cmd + + " Update the popup menu (if enabled) + if &mousemodel =~ 'popup' + let cmd = substitute(s:tlist_{a:fidx}_menu_cmd, ' T\\&ags\.', + \ ' PopUp.T\\\&ags.', "g") + exe cmd + endif + + " The taglist menu is not empty now + let s:tlist_menu_empty = 0 + + " Restore the 'cpoptions' settings + let &cpoptions = old_cpoptions +endfunction + +" Tlist_Menu_Update_File +" Add the taglist menu +function! s:Tlist_Menu_Update_File(clear_menu) + if !has('gui_running') + " Not running in GUI mode + return + endif + + call s:Tlist_Log_Msg('Updating the tag menu, clear_menu = ' . a:clear_menu) + + " Remove the tags menu + if a:clear_menu + call s:Tlist_Menu_Remove_File() + + endif + + " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help + if &buftype != '' + return + endif + + let filename = fnamemodify(bufname('%'), ':p') + let ftype = s:Tlist_Get_Buffer_Filetype('%') + + " If the file doesn't support tag listing, skip it + if s:Tlist_Skip_File(filename, ftype) + return + endif + + let fidx = s:Tlist_Get_File_Index(filename) + if fidx == -1 || !s:tlist_{fidx}_valid + " Check whether this file is removed based on user request + " If it is, then don't display the tags for this file + if s:Tlist_User_Removed_File(filename) + return + endif + + " Process the tags for the file + let fidx = s:Tlist_Process_File(filename, ftype) + if fidx == -1 + return + endif + endif + + let fname = escape(fnamemodify(bufname('%'), ':t'), '.') + if fname != '' + exe 'anoremenu T&ags.' . fname . ' ' + anoremenu T&ags.-SEP2- : + endif + + if !s:tlist_{fidx}_tag_count + return + endif + + if s:tlist_{fidx}_menu_cmd != '' + " Update the menu with the cached command + call s:Tlist_Menu_File_Refresh(fidx) + + return + endif + + " We are going to add entries to the tags menu, so the menu won't be + " empty + let s:tlist_menu_empty = 0 + + let cmd = '' + + " Determine whether the tag type name needs to be added to the menu + " If more than one tag type is present in the taglisting for a file, + " then the tag type name needs to be present + let add_ttype_name = -1 + let i = 1 + while i <= s:tlist_{ftype}_count && add_ttype_name < 1 + let ttype = s:tlist_{ftype}_{i}_name + if s:tlist_{fidx}_{ttype}_count + let add_ttype_name = add_ttype_name + 1 + endif + let i = i + 1 + endwhile + + " Process the tags by the tag type and get the menu command + let i = 1 + while i <= s:tlist_{ftype}_count + let mcmd = s:Tlist_Menu_Get_Tag_Type_Cmd(fidx, ftype, add_ttype_name, i) + if mcmd != '' + let cmd = cmd . mcmd + endif + + let i = i + 1 + endwhile + + " Cache the menu command for reuse + let s:tlist_{fidx}_menu_cmd = cmd + + " Update the menu + call s:Tlist_Menu_File_Refresh(fidx) +endfunction + +" Tlist_Menu_Remove_File +" Remove the tags displayed in the tags menu +function! s:Tlist_Menu_Remove_File() + if !has('gui_running') || s:tlist_menu_empty + return + endif + + call s:Tlist_Log_Msg('Removing the tags menu for a file') + + " Cleanup the Tags menu + silent! unmenu T&ags + if &mousemodel =~ 'popup' + silent! unmenu PopUp.T&ags + endif + + " Add a dummy menu item to retain teared off menu + noremenu T&ags.Dummy l + + silent! unmenu! T&ags + if &mousemodel =~ 'popup' + silent! unmenu! PopUp.T&ags + endif + + call s:Tlist_Menu_Add_Base_Menu() + + " Remove the dummy menu item + unmenu T&ags.Dummy + + let s:tlist_menu_empty = 1 +endfunction + +" Tlist_Menu_Refresh +" Refresh the taglist menu +function! s:Tlist_Menu_Refresh() + call s:Tlist_Log_Msg('Refreshing the tags menu') + let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) + if fidx != -1 + " Invalidate the cached menu command + let s:tlist_{fidx}_menu_cmd = '' + endif + + " Update the taglist, menu and window + call s:Tlist_Update_Current_File() +endfunction + +" Tlist_Menu_Jump_To_Tag +" Jump to the selected tag +function! s:Tlist_Menu_Jump_To_Tag(tidx) + let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) + if fidx == -1 + return + endif + + let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, a:tidx) + if tagpat == '' + return + endif + + " Add the current cursor position to the jump list, so that user can + " jump back using the ' and ` marks. + mark ' + + silent call search(tagpat, 'w') + + " Bring the line to the middle of the window + normal! z. + + " If the line is inside a fold, open the fold + if foldclosed('.') != -1 + .foldopen + endif +endfunction + +" Tlist_Menu_Init +" Initialize the taglist menu +function! s:Tlist_Menu_Init() + call s:Tlist_Menu_Add_Base_Menu() + + " Automatically add the tags defined in the current file to the menu + augroup TagListMenuCmds + autocmd! + + if !g:Tlist_Process_File_Always + autocmd BufEnter * call s:Tlist_Refresh() + endif + autocmd BufLeave * call s:Tlist_Menu_Remove_File() + augroup end + + call s:Tlist_Menu_Update_File(0) +endfunction + +" Tlist_Vim_Session_Load +" Initialize the taglist window/buffer, which is created when loading +" a Vim session file. +function! s:Tlist_Vim_Session_Load() + call s:Tlist_Log_Msg('Tlist_Vim_Session_Load') + + " Initialize the taglist window + call s:Tlist_Window_Init() + + " Refresh the taglist window + call s:Tlist_Window_Refresh() +endfunction + +" Tlist_Set_App +" Set the name of the external plugin/application to which taglist +" belongs. +" Taglist plugin is part of another plugin like cream or winmanager. +function! Tlist_Set_App(name) + if a:name == "" + return + endif + + let s:tlist_app_name = a:name +endfunction + +" Winmanager integration + +" Initialization required for integration with winmanager +function! TagList_Start() + " If current buffer is not taglist buffer, then don't proceed + if bufname('%') != '__Tag_List__' + return + endif + + call Tlist_Set_App('winmanager') + + " Get the current filename from the winmanager plugin + let bufnum = WinManagerGetLastEditedFile() + if bufnum != -1 + let filename = fnamemodify(bufname(bufnum), ':p') + let ftype = s:Tlist_Get_Buffer_Filetype(bufnum) + endif + + " Initialize the taglist window, if it is not already initialized + if !exists('s:tlist_window_initialized') || !s:tlist_window_initialized + call s:Tlist_Window_Init() + call s:Tlist_Window_Refresh() + let s:tlist_window_initialized = 1 + endif + + " Update the taglist window + if bufnum != -1 + if !s:Tlist_Skip_File(filename, ftype) && g:Tlist_Auto_Update + call s:Tlist_Window_Refresh_File(filename, ftype) + endif + endif +endfunction + +function! TagList_IsValid() + return 0 +endfunction + +function! TagList_WrapUp() + return 0 +endfunction + +" restore 'cpo' +let &cpo = s:cpo_save +unlet s:cpo_save + diff --git a/sources_non_forked/taglist/doc/taglist.txt b/sources_non_forked/taglist/doc/taglist.txt new file mode 100755 index 00000000..6a62b396 --- /dev/null +++ b/sources_non_forked/taglist/doc/taglist.txt @@ -0,0 +1,1501 @@ +*taglist.txt* Plugin for browsing source code + +Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) +For Vim version 6.0 and above +Last change: 2007 May 24 + +1. Overview |taglist-intro| +2. Taglist on the internet |taglist-internet| +3. Requirements |taglist-requirements| +4. Installation |taglist-install| +5. Usage |taglist-using| +6. Options |taglist-options| +7. Commands |taglist-commands| +8. Global functions |taglist-functions| +9. Extending |taglist-extend| +10. FAQ |taglist-faq| +11. License |taglist-license| +12. Todo |taglist-todo| + +============================================================================== + *taglist-intro* +1. Overview~ + +The "Tag List" plugin is a source code browser plugin for Vim. This plugin +allows you to efficiently browse through source code files for different +programming languages. The "Tag List" plugin provides the following features: + + * Displays the tags (functions, classes, structures, variables, etc.) + defined in a file in a vertically or horizontally split Vim window. + * In GUI Vim, optionally displays the tags in the Tags drop-down menu and + in the popup menu. + * Automatically updates the taglist window as you switch between + files/buffers. As you open new files, the tags defined in the new files + are added to the existing file list and the tags defined in all the + files are displayed grouped by the filename. + * When a tag name is selected from the taglist window, positions the + cursor at the definition of the tag in the source file. + * Automatically highlights the current tag name. + * Groups the tags by their type and displays them in a foldable tree. + * Can display the prototype and scope of a tag. + * Can optionally display the tag prototype instead of the tag name in the + taglist window. + * The tag list can be sorted either by name or by chronological order. + * Supports the following language files: Assembly, ASP, Awk, Beta, C, + C++, C#, Cobol, Eiffel, Erlang, Fortran, HTML, Java, Javascript, Lisp, + Lua, Make, Pascal, Perl, PHP, Python, Rexx, Ruby, Scheme, Shell, Slang, + SML, Sql, TCL, Verilog, Vim and Yacc. + * Can be easily extended to support new languages. Support for + existing languages can be modified easily. + * Provides functions to display the current tag name in the Vim status + line or the window title bar. + * The list of tags and files in the taglist can be saved and + restored across Vim sessions. + * Provides commands to get the name and prototype of the current tag. + * Runs in both console/terminal and GUI versions of Vim. + * Works with the winmanager plugin. Using the winmanager plugin, you + can use Vim plugins like the file explorer, buffer explorer and the + taglist plugin at the same time like an IDE. + * Can be used in both Unix and MS-Windows systems. + +============================================================================== + *taglist-internet* +2. Taglist on the internet~ + +The home page of the taglist plugin is at: +> + http://vim-taglist.sourceforge.net/ +< +You can subscribe to the taglist mailing list to post your questions or +suggestions for improvement or to send bug reports. Visit the following page +for subscribing to the mailing list: +> + http://groups.yahoo.com/group/taglist +< +============================================================================== + *taglist-requirements* +3. Requirements~ + +The taglist plugin requires the following: + + * Vim version 6.0 and above + * Exuberant ctags 5.0 and above + +The taglist plugin will work on all the platforms where the exuberant ctags +utility and Vim are supported (this includes MS-Windows and Unix based +systems). + +The taglist plugin relies on the exuberant ctags utility to dynamically +generate the tag listing. The exuberant ctags utility must be installed in +your system to use this plugin. The exuberant ctags utility is shipped with +most of the Linux distributions. You can download the exuberant ctags utility +from +> + http://ctags.sourceforge.net +< +The taglist plugin doesn't use or create a tags file and there is no need to +create a tags file to use this plugin. The taglist plugin will not work with +the GNU ctags or the Unix ctags utility. + +This plugin relies on the Vim "filetype" detection mechanism to determine the +type of the current file. You have to turn on the Vim filetype detection by +adding the following line to your .vimrc file: +> + filetype on +< +The taglist plugin will not work if you run Vim in the restricted mode (using +the -Z command-line argument). + +The taglist plugin uses the Vim system() function to invoke the exuberant +ctags utility. If Vim is compiled without the system() function then you +cannot use the taglist plugin. Some of the Linux distributions (Suse) compile +Vim without the system() function for security reasons. + +============================================================================== + *taglist-install* +4. Installation~ + +1. Download the taglist.zip file and unzip the files to the $HOME/.vim or the + $HOME/vimfiles or the $VIM/vimfiles directory. After this step, you should + have the following two files (the directory structure should be preserved): + + plugin/taglist.vim - main taglist plugin file + doc/taglist.txt - documentation (help) file + + Refer to the |add-plugin|and |'runtimepath'| Vim help pages for more + details about installing Vim plugins. +2. Change to the $HOME/.vim/doc or $HOME/vimfiles/doc or $VIM/vimfiles/doc + directory, start Vim and run the ":helptags ." command to process the + taglist help file. Without this step, you cannot jump to the taglist help + topics. +3. If the exuberant ctags utility is not present in one of the directories in + the PATH environment variable, then set the 'Tlist_Ctags_Cmd' variable to + point to the location of the exuberant ctags utility (not to the directory) + in the .vimrc file. +4. If you are running a terminal/console version of Vim and the terminal + doesn't support changing the window width then set the + 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file. +5. Restart Vim. +6. You can now use the ":TlistToggle" command to open/close the taglist + window. You can use the ":help taglist" command to get more information + about using the taglist plugin. + +To uninstall the taglist plugin, remove the plugin/taglist.vim and +doc/taglist.txt files from the $HOME/.vim or $HOME/vimfiles directory. + +============================================================================== + *taglist-using* +5. Usage~ + +The taglist plugin can be used in several different ways. + +1. You can keep the taglist window open during the entire editing session. On + opening the taglist window, the tags defined in all the files in the Vim + buffer list will be displayed in the taglist window. As you edit files, the + tags defined in them will be added to the taglist window. You can select a + tag from the taglist window and jump to it. The current tag will be + highlighted in the taglist window. You can close the taglist window when + you no longer need the window. +2. You can configure the taglist plugin to process the tags defined in all the + edited files always. In this configuration, even if the taglist window is + closed and the taglist menu is not displayed, the taglist plugin will + processes the tags defined in newly edited files. You can then open the + taglist window only when you need to select a tag and then automatically + close the taglist window after selecting the tag. +3. You can configure the taglist plugin to display only the tags defined in + the current file in the taglist window. By default, the taglist plugin + displays the tags defined in all the files in the Vim buffer list. As you + switch between files, the taglist window will be refreshed to display only + the tags defined in the current file. +4. In GUI Vim, you can use the Tags pull-down and popup menu created by the + taglist plugin to display the tags defined in the current file and select a + tag to jump to it. You can use the menu without opening the taglist window. + By default, the Tags menu is disabled. +5. You can configure the taglist plugin to display the name of the current tag + in the Vim window status line or in the Vim window title bar. For this to + work without the taglist window or menu, you need to configure the taglist + plugin to process the tags defined in a file always. +6. You can save the tags defined in multiple files to a taglist session file + and load it when needed. You can also configure the taglist plugin to not + update the taglist window when editing new files. You can then manually add + files to the taglist window. + +Opening the taglist window~ +You can open the taglist window using the ":TlistOpen" or the ":TlistToggle" +commands. The ":TlistOpen" command opens the taglist window and jumps to it. +The ":TlistToggle" command opens or closes (toggle) the taglist window and the +cursor remains in the current window. If the 'Tlist_GainFocus_On_ToggleOpen' +variable is set to 1, then the ":TlistToggle" command opens the taglist window +and moves the cursor to the taglist window. + +You can map a key to invoke these commands. For example, the following command +creates a normal mode mapping for the key to toggle the taglist window. +> + nnoremap :TlistToggle +< +Add the above mapping to your ~/.vimrc or $HOME/_vimrc file. + +To automatically open the taglist window on Vim startup, set the +'Tlist_Auto_Open' variable to 1. + +You can also open the taglist window on startup using the following command +line: +> + $ vim +TlistOpen +< +Closing the taglist window~ +You can close the taglist window from the taglist window by pressing 'q' or +using the Vim ":q" command. You can also use any of the Vim window commands to +close the taglist window. Invoking the ":TlistToggle" command when the taglist +window is opened, closes the taglist window. You can also use the +":TlistClose" command to close the taglist window. + +To automatically close the taglist window when a tag or file is selected, you +can set the 'Tlist_Close_On_Select' variable to 1. To exit Vim when only the +taglist window is present, set the 'Tlist_Exit_OnlyWindow' variable to 1. + +Jumping to a tag or a file~ +You can select a tag in the taglist window either by pressing the key +or by double clicking the tag name using the mouse. To jump to a tag on a +single mouse click set the 'Tlist_Use_SingleClick' variable to 1. + +If the selected file is already opened in a window, then the cursor is moved +to that window. If the file is not currently opened in a window then the file +is opened in the window used by the taglist plugin to show the previously +selected file. If there are no usable windows, then the file is opened in a +new window. The file is not opened in special windows like the quickfix +window, preview window and windows containing buffer with the 'buftype' option +set. + +To jump to the tag in a new window, press the 'o' key. To open the file in the +previous window (Ctrl-W_p) use the 'P' key. You can press the 'p' key to jump +to the tag but still keep the cursor in the taglist window (preview). + +To open the selected file in a tab, use the 't' key. If the file is already +present in a tab then the cursor is moved to that tab otherwise the file is +opened in a new tab. To jump to a tag in a new tab press Ctrl-t. The taglist +window is automatically opened in the newly created tab. + +Instead of jumping to a tag, you can open a file by pressing the key +or by double clicking the file name using the mouse. + +In the taglist window, you can use the [[ or key to jump to the +beginning of the previous file. You can use the ]] or key to jump to the +beginning of the next file. When you reach the first or last file, the search +wraps around and the jumps to the next/previous file. + +Highlighting the current tag~ +The taglist plugin automatically highlights the name of the current tag in the +taglist window. The Vim |CursorHold| autocmd event is used for this. If the +current tag name is not visible in the taglist window, then the taglist window +contents are scrolled to make that tag name visible. You can also use the +":TlistHighlightTag" command to force the highlighting of the current tag. + +The tag name is highlighted if no activity is performed for |'updatetime'| +milliseconds. The default value for this Vim option is 4 seconds. To avoid +unexpected problems, you should not set the |'updatetime'| option to a very +low value. + +To disable the automatic highlighting of the current tag name in the taglist +window, set the 'Tlist_Auto_Highlight_Tag' variable to zero. + +When entering a Vim buffer/window, the taglist plugin automatically highlights +the current tag in that buffer/window. If you like to disable the automatic +highlighting of the current tag when entering a buffer, set the +'Tlist_Highlight_Tag_On_BufEnter' variable to zero. + +Adding files to the taglist~ +When the taglist window is opened, all the files in the Vim buffer list are +processed and the supported files are added to the taglist. When you edit a +file in Vim, the taglist plugin automatically processes this file and adds it +to the taglist. If you close the taglist window, the tag information in the +taglist is retained. + +To process files even when the taglist window is not open, set the +'Tlist_Process_File_Always' variable to 1. + +You can manually add multiple files to the taglist without opening them using +the ":TlistAddFiles" and the ":TlistAddFilesRecursive" commands. + +For example, to add all the C files in the /my/project/dir directory to the +taglist, you can use the following command: +> + :TlistAddFiles /my/project/dir/*.c +< +Note that when adding several files with a large number of tags or a large +number of files, it will take several seconds to several minutes for the +taglist plugin to process all the files. You should not interrupt the taglist +plugin by pressing . + +You can recursively add multiple files from a directory tree using the +":TlistAddFilesRecursive" command: +> + :TlistAddFilesRecursive /my/project/dir *.c +< +This command takes two arguments. The first argument specifies the directory +from which to recursively add the files. The second optional argument +specifies the wildcard matching pattern for selecting the files to add. The +default pattern is * and all the files are added. + +Displaying tags for only one file~ +The taglist window displays the tags for all the files in the Vim buffer list +and all the manually added files. To display the tags for only the current +active buffer, set the 'Tlist_Show_One_File' variable to 1. + +Removing files from the taglist~ +You can remove a file from the taglist window, by pressing the 'd' key when the +cursor is on one of the tags listed for the file in the taglist window. The +removed file will no longer be displayed in the taglist window in the current +Vim session. To again display the tags for the file, open the file in a Vim +window and then use the ":TlistUpdate" command or use ":TlistAddFiles" command +to add the file to the taglist. + +When a buffer is removed from the Vim buffer list using the ":bdelete" or the +":bwipeout" command, the taglist is updated to remove the stored information +for this buffer. + +Updating the tags displayed for a file~ +The taglist plugin keeps track of the modification time of a file. When the +modification time changes (the file is modified), the taglist plugin +automatically updates the tags listed for that file. The modification time of +a file is checked when you enter a window containing that file or when you +load that file. + +You can also update or refresh the tags displayed for a file by pressing the +"u" key in the taglist window. If an existing file is modified, after the file +is saved, the taglist plugin automatically updates the tags displayed for the +file. + +You can also use the ":TlistUpdate" command to update the tags for the current +buffer after you made some changes to it. You should save the modified buffer +before you update the taglist window. Otherwise the listed tags will not +include the new tags created in the buffer. + +If you have deleted the tags displayed for a file in the taglist window using +the 'd' key, you can again display the tags for that file using the +":TlistUpdate" command. + +Controlling the taglist updates~ +To disable the automatic processing of new files or modified files, you can +set the 'Tlist_Auto_Update' variable to zero. When this variable is set to +zero, the taglist is updated only when you use the ":TlistUpdate" command or +the ":TlistAddFiles" or the ":TlistAddFilesRecursive" commands. You can use +this option to control which files are added to the taglist. + +You can use the ":TlistLock" command to lock the taglist contents. After this +command is executed, new files are not automatically added to the taglist. +When the taglist is locked, you can use the ":TlistUpdate" command to add the +current file or the ":TlistAddFiles" or ":TlistAddFilesRecursive" commands to +add new files to the taglist. To unlock the taglist, use the ":TlistUnlock" +command. + +Displaying the tag prototype~ +To display the prototype of the tag under the cursor in the taglist window, +press the space bar. If you place the cursor on a tag name in the taglist +window, then the tag prototype is displayed at the Vim status line after +|'updatetime'| milliseconds. The default value for the |'updatetime'| Vim +option is 4 seconds. + +You can get the name and prototype of a tag without opening the taglist window +and the taglist menu using the ":TlistShowTag" and the ":TlistShowPrototype" +commands. These commands will work only if the current file is already present +in the taglist. To use these commands without opening the taglist window, set +the 'Tlist_Process_File_Always' variable to 1. + +You can use the ":TlistShowTag" command to display the name of the tag at or +before the specified line number in the specified file. If the file name and +line number are not supplied, then this command will display the name of the +current tag. For example, +> + :TlistShowTag + :TlistShowTag myfile.java 100 +< +You can use the ":TlistShowPrototype" command to display the prototype of the +tag at or before the specified line number in the specified file. If the file +name and the line number are not supplied, then this command will display the +prototype of the current tag. For example, +> + :TlistShowPrototype + :TlistShowPrototype myfile.c 50 +< +In the taglist window, when the mouse is moved over a tag name, the tag +prototype is displayed in a balloon. This works only in GUI versions where +balloon evaluation is supported. + +Taglist window contents~ +The taglist window contains the tags defined in various files in the taglist +grouped by the filename and by the tag type (variable, function, class, etc.). +For tags with scope information (like class members, structures inside +structures, etc.), the scope information is displayed in square brackets "[]" +after the tag name. + +The contents of the taglist buffer/window are managed by the taglist plugin. +The |'filetype'| for the taglist buffer is set to 'taglist'. The Vim +|'modifiable'| option is turned off for the taglist buffer. You should not +manually edit the taglist buffer, by setting the |'modifiable'| flag. If you +manually edit the taglist buffer contents, then the taglist plugin will be out +of sync with the taglist buffer contents and the plugin will no longer work +correctly. To redisplay the taglist buffer contents again, close the taglist +window and reopen it. + +Opening and closing the tag and file tree~ +In the taglist window, the tag names are displayed as a foldable tree using +the Vim folding support. You can collapse the tree using the '-' key or using +the Vim |zc| fold command. You can open the tree using the '+' key or using +the Vim |zo| fold command. You can open all the folds using the '*' key or +using the Vim |zR| fold command. You can also use the mouse to open/close the +folds. You can close all the folds using the '=' key. You should not manually +create or delete the folds in the taglist window. + +To automatically close the fold for the inactive files/buffers and open only +the fold for the current buffer in the taglist window, set the +'Tlist_File_Fold_Auto_Close' variable to 1. + +Sorting the tags for a file~ +The tags displayed in the taglist window can be sorted either by their name or +by their chronological order. The default sorting method is by the order in +which the tags appear in a file. You can change the default sort method by +setting the 'Tlist_Sort_Type' variable to either "name" or "order". You can +sort the tags by their name by pressing the "s" key in the taglist window. You +can again sort the tags by their chronological order using the "s" key. Each +file in the taglist window can be sorted using different order. + +Zooming in and out of the taglist window~ +You can press the 'x' key in the taglist window to maximize the taglist +window width/height. The window will be maximized to the maximum possible +width/height without closing the other existing windows. You can again press +'x' to restore the taglist window to the default width/height. + + *taglist-session* +Taglist Session~ +A taglist session refers to the group of files and their tags stored in the +taglist in a Vim session. + +You can save and restore a taglist session (and all the displayed tags) using +the ":TlistSessionSave" and ":TlistSessionLoad" commands. + +To save the information about the tags and files in the taglist to a file, use +the ":TlistSessionSave" command and specify the filename: +> + :TlistSessionSave +< +To load a saved taglist session, use the ":TlistSessionLoad" command: > + + :TlistSessionLoad +< +When you load a taglist session file, the tags stored in the file will be +added to the tags already stored in the taglist. + +The taglist session feature can be used to save the tags for large files or a +group of frequently used files (like a project). By using the taglist session +file, you can minimize the amount to time it takes to load/refresh the taglist +for multiple files. + +You can create more than one taglist session file for multiple groups of +files. + +Displaying the tag name in the Vim status line or the window title bar~ +You can use the Tlist_Get_Tagname_By_Line() function provided by the taglist +plugin to display the current tag name in the Vim status line or the window +title bar. Similarly, you can use the Tlist_Get_Tag_Prototype_By_Line() +function to display the current tag prototype in the Vim status line or the +window title bar. + +For example, the following command can be used to display the current tag name +in the status line: +> + :set statusline=%<%f%=%([%{Tlist_Get_Tagname_By_Line()}]%) +< +The following command can be used to display the current tag name in the +window title bar: +> + :set title titlestring=%<%f\ %([%{Tlist_Get_Tagname_By_Line()}]%) +< +Note that the current tag name can be displayed only after the file is +processed by the taglist plugin. For this, you have to either set the +'Tlist_Process_File_Always' variable to 1 or open the taglist window or use +the taglist menu. For more information about configuring the Vim status line, +refer to the documentation for the Vim |'statusline'| option. + +Changing the taglist window highlighting~ +The following Vim highlight groups are defined and used to highlight the +various entities in the taglist window: + + TagListTagName - Used for tag names + TagListTagScope - Used for tag scope + TagListTitle - Used for tag titles + TagListComment - Used for comments + TagListFileName - Used for filenames + +By default, these highlight groups are linked to the standard Vim highlight +groups. If you want to change the colors used for these highlight groups, +prefix the highlight group name with 'My' and define it in your .vimrc or +.gvimrc file: MyTagListTagName, MyTagListTagScope, MyTagListTitle, +MyTagListComment and MyTagListFileName. For example, to change the colors +used for tag names, you can use the following command: +> + :highlight MyTagListTagName guifg=blue ctermfg=blue +< +Controlling the taglist window~ +To use a horizontally split taglist window, instead of a vertically split +window, set the 'Tlist_Use_Horiz_Window' variable to 1. + +To use a vertically split taglist window on the rightmost side of the Vim +window, set the 'Tlist_Use_Right_Window' variable to 1. + +You can specify the width of the vertically split taglist window, by setting +the 'Tlist_WinWidth' variable. You can specify the height of the horizontally +split taglist window, by setting the 'Tlist_WinHeight' variable. + +When opening a vertically split taglist window, the Vim window width is +increased to accommodate the new taglist window. When the taglist window is +closed, the Vim window is reduced. To disable this, set the +'Tlist_Inc_Winwidth' variable to zero. + +To reduce the number of empty lines in the taglist window, set the +'Tlist_Compact_Format' variable to 1. + +To not display the Vim fold column in the taglist window, set the +'Tlist_Enable_Fold_Column' variable to zero. + +To display the tag prototypes instead of the tag names in the taglist window, +set the 'Tlist_Display_Prototype' variable to 1. + +To not display the scope of the tags next to the tag names, set the +'Tlist_Display_Tag_Scope' variable to zero. + + *taglist-keys* +Taglist window key list~ +The following table lists the description of the keys that can be used +in the taglist window. + + Key Description~ + + Jump to the location where the tag under cursor is + defined. + o Jump to the location where the tag under cursor is + defined in a new window. + P Jump to the tag in the previous (Ctrl-W_p) window. + p Display the tag definition in the file window and + keep the cursor in the taglist window itself. + t Jump to the tag in a new tab. If the file is already + opened in a tab, move to that tab. + Ctrl-t Jump to the tag in a new tab. + Display the prototype of the tag under the cursor. + For file names, display the full path to the file, + file type and the number of tags. For tag types, display the + tag type and the number of tags. + u Update the tags listed in the taglist window + s Change the sort order of the tags (by name or by order) + d Remove the tags for the file under the cursor + x Zoom-in or Zoom-out the taglist window + + Open a fold + - Close a fold + * Open all folds + = Close all folds + [[ Jump to the beginning of the previous file + Jump to the beginning of the previous file + ]] Jump to the beginning of the next file + Jump to the beginning of the next file + q Close the taglist window + Display help + +The above keys will work in both the normal mode and the insert mode. + + *taglist-menu* +Taglist menu~ +When using GUI Vim, the taglist plugin can display the tags defined in the +current file in the drop-down menu and the popup menu. By default, this +feature is turned off. To turn on this feature, set the 'Tlist_Show_Menu' +variable to 1. + +You can jump to a tag by selecting the tag name from the menu. You can use the +taglist menu independent of the taglist window i.e. you don't need to open the +taglist window to get the taglist menu. + +When you switch between files/buffers, the taglist menu is automatically +updated to display the tags defined in the current file/buffer. + +The tags are grouped by their type (variables, functions, classes, methods, +etc.) and displayed as a separate sub-menu for each type. If all the tags +defined in a file are of the same type (e.g. functions), then the sub-menu is +not used. + +If the number of items in a tag type submenu exceeds the value specified by +the 'Tlist_Max_Submenu_Items' variable, then the submenu will be split into +multiple submenus. The default setting for 'Tlist_Max_Submenu_Items' is 25. +The first and last tag names in the submenu are used to form the submenu name. +The menu items are prefixed by alpha-numeric characters for easy selection by +keyboard. + +If the popup menu support is enabled (the |'mousemodel'| option contains +"popup"), then the tags menu is added to the popup menu. You can access +the popup menu by right clicking on the GUI window. + +You can regenerate the tags menu by selecting the 'Tags->Refresh menu' entry. +You can sort the tags listed in the menu either by name or by order by +selecting the 'Tags->Sort menu by->Name/Order' menu entry. + +You can tear-off the Tags menu and keep it on the side of the Vim window +for quickly locating the tags. + +Using the taglist plugin with the winmanager plugin~ +You can use the taglist plugin with the winmanager plugin. This will allow you +to use the file explorer, buffer explorer and the taglist plugin at the same +time in different windows. To use the taglist plugin with the winmanager +plugin, set 'TagList' in the 'winManagerWindowLayout' variable. For example, +to use the file explorer plugin and the taglist plugin at the same time, use +the following setting: > + + let winManagerWindowLayout = 'FileExplorer|TagList' +< +Getting help~ +If you have installed the taglist help file (this file), then you can use the +Vim ":help taglist-" command to get help on the various taglist +topics. + +You can press the key in the taglist window to display the help +information about using the taglist window. If you again press the key, +the help information is removed from the taglist window. + + *taglist-debug* +Debugging the taglist plugin~ +You can use the ":TlistDebug" command to enable logging of the debug messages +from the taglist plugin. To display the logged debug messages, you can use the +":TlistMessages" command. To disable the logging of the debug messages, use +the ":TlistUndebug" command. + +You can specify a file name to the ":TlistDebug" command to log the debug +messages to a file. Otherwise, the debug messages are stored in a script-local +variable. In the later case, to minimize memory usage, only the last 3000 +characters from the debug messages are stored. + +============================================================================== + *taglist-options* +6. Options~ + +A number of Vim variables control the behavior of the taglist plugin. These +variables are initialized to a default value. By changing these variables you +can change the behavior of the taglist plugin. You need to change these +settings only if you want to change the behavior of the taglist plugin. You +should use the |:let| command in your .vimrc file to change the setting of any +of these variables. + +The configurable taglist variables are listed below. For a detailed +description of these variables refer to the text below this table. + +|'Tlist_Auto_Highlight_Tag'| Automatically highlight the current tag in the + taglist. +|'Tlist_Auto_Open'| Open the taglist window when Vim starts. +|'Tlist_Auto_Update'| Automatically update the taglist to include + newly edited files. +|'Tlist_Close_On_Select'| Close the taglist window when a file or tag is + selected. +|'Tlist_Compact_Format'| Remove extra information and blank lines from + the taglist window. +|'Tlist_Ctags_Cmd'| Specifies the path to the ctags utility. +|'Tlist_Display_Prototype'| Show prototypes and not tags in the taglist + window. +|'Tlist_Display_Tag_Scope'| Show tag scope next to the tag name. +|'Tlist_Enable_Fold_Column'| Show the fold indicator column in the taglist + window. +|'Tlist_Exit_OnlyWindow'| Close Vim if the taglist is the only window. +|'Tlist_File_Fold_Auto_Close'| Close tag folds for inactive buffers. +|'Tlist_GainFocus_On_ToggleOpen'| + Jump to taglist window on open. +|'Tlist_Highlight_Tag_On_BufEnter'| + On entering a buffer, automatically highlight + the current tag. +|'Tlist_Inc_Winwidth'| Increase the Vim window width to accommodate + the taglist window. +|'Tlist_Max_Submenu_Items'| Maximum number of items in a tags sub-menu. +|'Tlist_Max_Tag_Length'| Maximum tag length used in a tag menu entry. +|'Tlist_Process_File_Always'| Process files even when the taglist window is + closed. +|'Tlist_Show_Menu'| Display the tags menu. +|'Tlist_Show_One_File'| Show tags for the current buffer only. +|'Tlist_Sort_Type'| Sort method used for arranging the tags. +|'Tlist_Use_Horiz_Window'| Use a horizontally split window for the + taglist window. +|'Tlist_Use_Right_Window'| Place the taglist window on the right side. +|'Tlist_Use_SingleClick'| Single click on a tag jumps to it. +|'Tlist_WinHeight'| Horizontally split taglist window height. +|'Tlist_WinWidth'| Vertically split taglist window width. + + *'Tlist_Auto_Highlight_Tag'* +Tlist_Auto_Highlight_Tag~ +The taglist plugin will automatically highlight the current tag in the taglist +window. If you want to disable this, then you can set the +'Tlist_Auto_Highlight_Tag' variable to zero. Note that even though the current +tag highlighting is disabled, the tags for a new file will still be added to +the taglist window. +> + let Tlist_Auto_Highlight_Tag = 0 +< +With the above variable set to 1, you can use the ":TlistHighlightTag" command +to highlight the current tag. + + *'Tlist_Auto_Open'* +Tlist_Auto_Open~ +To automatically open the taglist window, when you start Vim, you can set the +'Tlist_Auto_Open' variable to 1. By default, this variable is set to zero and +the taglist window will not be opened automatically on Vim startup. +> + let Tlist_Auto_Open = 1 +< +The taglist window is opened only when a supported type of file is opened on +Vim startup. For example, if you open text files, then the taglist window will +not be opened. + + *'Tlist_Auto_Update'* +Tlist_Auto_Update~ +When a new file is edited, the tags defined in the file are automatically +processed and added to the taglist. To stop adding new files to the taglist, +set the 'Tlist_Auto_Update' variable to zero. By default, this variable is set +to 1. +> + let Tlist_Auto_Update = 0 +< +With the above variable set to 1, you can use the ":TlistUpdate" command to +add the tags defined in the current file to the taglist. + + *'Tlist_Close_On_Select'* +Tlist_Close_On_Select~ +If you want to close the taglist window when a file or tag is selected, then +set the 'Tlist_Close_On_Select' variable to 1. By default, this variable is +set zero and when you select a tag or file from the taglist window, the window +is not closed. +> + let Tlist_Close_On_Select = 1 +< + *'Tlist_Compact_Format'* +Tlist_Compact_Format~ +By default, empty lines are used to separate different tag types displayed for +a file and the tags displayed for different files in the taglist window. If +you want to display as many tags as possible in the taglist window, you can +set the 'Tlist_Compact_Format' variable to 1 to get a compact display. +> + let Tlist_Compact_Format = 1 +< + *'Tlist_Ctags_Cmd'* +Tlist_Ctags_Cmd~ +The 'Tlist_Ctags_Cmd' variable specifies the location (path) of the exuberant +ctags utility. If exuberant ctags is present in any one of the directories in +the PATH environment variable, then there is no need to set this variable. + +The exuberant ctags tool can be installed under different names. When the +taglist plugin starts up, if the 'Tlist_Ctags_Cmd' variable is not set, it +checks for the names exuberant-ctags, exctags, ctags, ctags.exe and tags in +the PATH environment variable. If any one of the named executable is found, +then the Tlist_Ctags_Cmd variable is set to that name. + +If exuberant ctags is not present in one of the directories specified in the +PATH environment variable, then set this variable to point to the location of +the ctags utility in your system. Note that this variable should point to the +fully qualified exuberant ctags location and NOT to the directory in which +exuberant ctags is installed. If the exuberant ctags tool is not found in +either PATH or in the specified location, then the taglist plugin will not be +loaded. Examples: +> + let Tlist_Ctags_Cmd = 'd:\tools\ctags.exe' + let Tlist_Ctags_Cmd = '/usr/local/bin/ctags' +< + *'Tlist_Display_Prototype'* +Tlist_Display_Prototype~ +By default, only the tag name will be displayed in the taglist window. If you +like to see tag prototypes instead of names, set the 'Tlist_Display_Prototype' +variable to 1. By default, this variable is set to zero and only tag names +will be displayed. +> + let Tlist_Display_Prototype = 1 +< + *'Tlist_Display_Tag_Scope'* +Tlist_Display_Tag_Scope~ +By default, the scope of a tag (like a C++ class) will be displayed in +square brackets next to the tag name. If you don't want the tag scopes +to be displayed, then set the 'Tlist_Display_Tag_Scope' to zero. By default, +this variable is set to 1 and the tag scopes will be displayed. +> + let Tlist_Display_Tag_Scope = 0 +< + *'Tlist_Enable_Fold_Column'* +Tlist_Enable_Fold_Column~ +By default, the Vim fold column is enabled and displayed in the taglist +window. If you wish to disable this (for example, when you are working with a +narrow Vim window or terminal), you can set the 'Tlist_Enable_Fold_Column' +variable to zero. +> + let Tlist_Enable_Fold_Column = 1 +< + *'Tlist_Exit_OnlyWindow'* +Tlist_Exit_OnlyWindow~ +If you want to exit Vim if only the taglist window is currently opened, then +set the 'Tlist_Exit_OnlyWindow' variable to 1. By default, this variable is +set to zero and the Vim instance will not be closed if only the taglist window +is present. +> + let Tlist_Exit_OnlyWindow = 1 +< + *'Tlist_File_Fold_Auto_Close'* +Tlist_File_Fold_Auto_Close~ +By default, the tags tree displayed in the taglist window for all the files is +opened. You can close/fold the tags tree for the files manually. To +automatically close the tags tree for inactive files, you can set the +'Tlist_File_Fold_Auto_Close' variable to 1. When this variable is set to 1, +the tags tree for the current buffer is automatically opened and for all the +other buffers is closed. +> + let Tlist_File_Fold_Auto_Close = 1 +< + *'Tlist_GainFocus_On_ToggleOpen'* +Tlist_GainFocus_On_ToggleOpen~ +When the taglist window is opened using the ':TlistToggle' command, this +option controls whether the cursor is moved to the taglist window or remains +in the current window. By default, this option is set to 0 and the cursor +remains in the current window. When this variable is set to 1, the cursor +moves to the taglist window after opening the taglist window. +> + let Tlist_GainFocus_On_ToggleOpen = 1 +< + *'Tlist_Highlight_Tag_On_BufEnter'* +Tlist_Highlight_Tag_On_BufEnter~ +When you enter a Vim buffer/window, the current tag in that buffer/window is +automatically highlighted in the taglist window. If the current tag name is +not visible in the taglist window, then the taglist window contents are +scrolled to make that tag name visible. If you like to disable the automatic +highlighting of the current tag when entering a buffer, you can set the +'Tlist_Highlight_Tag_On_BufEnter' variable to zero. The default setting for +this variable is 1. +> + let Tlist_Highlight_Tag_On_BufEnter = 0 +< + *'Tlist_Inc_Winwidth'* +Tlist_Inc_Winwidth~ +By default, when the width of the window is less than 100 and a new taglist +window is opened vertically, then the window width is increased by the value +set in the 'Tlist_WinWidth' variable to accommodate the new window. The value +of this variable is used only if you are using a vertically split taglist +window. + +If your terminal doesn't support changing the window width from Vim (older +version of xterm running in a Unix system) or if you see any weird problems in +the screen due to the change in the window width or if you prefer not to +adjust the window width then set the 'Tlist_Inc_Winwidth' variable to zero. +CAUTION: If you are using the MS-Windows version of Vim in a MS-DOS command +window then you must set this variable to zero, otherwise the system may hang +due to a Vim limitation (explained in :help win32-problems) +> + let Tlist_Inc_Winwidth = 0 +< + *'Tlist_Max_Submenu_Items'* +Tlist_Max_Submenu_Items~ +If a file contains too many tags of a particular type (function, variable, +class, etc.), greater than that specified by the 'Tlist_Max_Submenu_Items' +variable, then the menu for that tag type will be split into multiple +sub-menus. The default setting for the 'Tlist_Max_Submenu_Items' variable is +25. This can be changed by setting the 'Tlist_Max_Submenu_Items' variable: +> + let Tlist_Max_Submenu_Items = 20 +< +The name of the submenu is formed using the names of the first and the last +tag entries in that submenu. + + *'Tlist_Max_Tag_Length'* +Tlist_Max_Tag_Length~ +Only the first 'Tlist_Max_Tag_Length' characters from the tag names will be +used to form the tag type submenu name. The default value for this variable is +10. Change the 'Tlist_Max_Tag_Length' setting if you want to include more or +less characters: +> + let Tlist_Max_Tag_Length = 10 +< + *'Tlist_Process_File_Always'* +Tlist_Process_File_Always~ +By default, the taglist plugin will generate and process the tags defined in +the newly opened files only when the taglist window is opened or when the +taglist menu is enabled. When the taglist window is closed, the taglist plugin +will stop processing the tags for newly opened files. + +You can set the 'Tlist_Process_File_Always' variable to 1 to generate the list +of tags for new files even when the taglist window is closed and the taglist +menu is disabled. +> + let Tlist_Process_File_Always = 1 +< +To use the ":TlistShowTag" and the ":TlistShowPrototype" commands without the +taglist window and the taglist menu, you should set this variable to 1. + + *'Tlist_Show_Menu'* +Tlist_Show_Menu~ +When using GUI Vim, you can display the tags defined in the current file in a +menu named "Tags". By default, this feature is turned off. To turn on this +feature, set the 'Tlist_Show_Menu' variable to 1: +> + let Tlist_Show_Menu = 1 +< + *'Tlist_Show_One_File'* +Tlist_Show_One_File~ +By default, the taglist plugin will display the tags defined in all the loaded +buffers in the taglist window. If you prefer to display the tags defined only +in the current buffer, then you can set the 'Tlist_Show_One_File' to 1. When +this variable is set to 1, as you switch between buffers, the taglist window +will be refreshed to display the tags for the current buffer and the tags for +the previous buffer will be removed. +> + let Tlist_Show_One_File = 1 +< + *'Tlist_Sort_Type'* +Tlist_Sort_Type~ +The 'Tlist_Sort_Type' variable specifies the sort order for the tags in the +taglist window. The tags can be sorted either alphabetically by their name or +by the order of their appearance in the file (chronological order). By +default, the tag names will be listed by the order in which they are defined +in the file. You can change the sort type (from name to order or from order to +name) by pressing the "s" key in the taglist window. You can also change the +default sort order by setting 'Tlist_Sort_Type' to "name" or "order": +> + let Tlist_Sort_Type = "name" +< + *'Tlist_Use_Horiz_Window'* +Tlist_Use_Horiz_Window~ +Be default, the tag names are displayed in a vertically split window. If you +prefer a horizontally split window, then set the 'Tlist_Use_Horiz_Window' +variable to 1. If you are running MS-Windows version of Vim in a MS-DOS +command window, then you should use a horizontally split window instead of a +vertically split window. Also, if you are using an older version of xterm in a +Unix system that doesn't support changing the xterm window width, you should +use a horizontally split window. +> + let Tlist_Use_Horiz_Window = 1 +< + *'Tlist_Use_Right_Window'* +Tlist_Use_Right_Window~ +By default, the vertically split taglist window will appear on the left hand +side. If you prefer to open the window on the right hand side, you can set the +'Tlist_Use_Right_Window' variable to 1: +> + let Tlist_Use_Right_Window = 1 +< + *'Tlist_Use_SingleClick'* +Tlist_Use_SingleClick~ +By default, when you double click on the tag name using the left mouse +button, the cursor will be positioned at the definition of the tag. You +can set the 'Tlist_Use_SingleClick' variable to 1 to jump to a tag when +you single click on the tag name using the mouse. By default this variable +is set to zero. +> + let Tlist_Use_SingleClick = 1 +< +Due to a bug in Vim, if you set 'Tlist_Use_SingleClick' to 1 and try to resize +the taglist window using the mouse, then Vim will crash. This problem is fixed +in Vim 6.3 and above. In the meantime, instead of resizing the taglist window +using the mouse, you can use normal Vim window resizing commands to resize the +taglist window. + + *'Tlist_WinHeight'* +Tlist_WinHeight~ +The default height of the horizontally split taglist window is 10. This can be +changed by modifying the 'Tlist_WinHeight' variable: +> + let Tlist_WinHeight = 20 +< +The |'winfixheight'| option is set for the taglist window, to maintain the +height of the taglist window, when new Vim windows are opened and existing +windows are closed. + + *'Tlist_WinWidth'* +Tlist_WinWidth~ +The default width of the vertically split taglist window is 30. This can be +changed by modifying the 'Tlist_WinWidth' variable: +> + let Tlist_WinWidth = 20 +< +Note that the value of the |'winwidth'| option setting determines the minimum +width of the current window. If you set the 'Tlist_WinWidth' variable to a +value less than that of the |'winwidth'| option setting, then Vim will use the +value of the |'winwidth'| option. + +When new Vim windows are opened and existing windows are closed, the taglist +plugin will try to maintain the width of the taglist window to the size +specified by the 'Tlist_WinWidth' variable. + +============================================================================== + *taglist-commands* +7. Commands~ + +The taglist plugin provides the following ex-mode commands: + +|:TlistAddFiles| Add multiple files to the taglist. +|:TlistAddFilesRecursive| + Add files recursively to the taglist. +|:TlistClose| Close the taglist window. +|:TlistDebug| Start logging of taglist debug messages. +|:TlistLock| Stop adding new files to the taglist. +|:TlistMessages| Display the logged taglist plugin debug messages. +|:TlistOpen| Open and jump to the taglist window. +|:TlistSessionSave| Save the information about files and tags in the + taglist to a session file. +|:TlistSessionLoad| Load the information about files and tags stored + in a session file to taglist. +|:TlistShowPrototype| Display the prototype of the tag at or before the + specified line number. +|:TlistShowTag| Display the name of the tag defined at or before the + specified line number. +|:TlistHighlightTag| Highlight the current tag in the taglist window. +|:TlistToggle| Open or close (toggle) the taglist window. +|:TlistUndebug| Stop logging of taglist debug messages. +|:TlistUnlock| Start adding new files to the taglist. +|:TlistUpdate| Update the tags for the current buffer. + + *:TlistAddFiles* +:TlistAddFiles {file(s)} [file(s) ...] + Add one or more specified files to the taglist. You can + specify multiple filenames using wildcards. To specify a + file name with space character, you should escape the space + character with a backslash. + Examples: +> + :TlistAddFiles *.c *.cpp + :TlistAddFiles file1.html file2.html +< + If you specify a large number of files, then it will take some + time for the taglist plugin to process all of them. The + specified files will not be edited in a Vim window and will + not be added to the Vim buffer list. + + *:TlistAddFilesRecursive* +:TlistAddFilesRecursive {directory} [ {pattern} ] + Add files matching {pattern} recursively from the specified + {directory} to the taglist. If {pattern} is not specified, + then '*' is assumed. To specify the current directory, use "." + for {directory}. To specify a directory name with space + character, you should escape the space character with a + backslash. + Examples: +> + :TlistAddFilesRecursive myproject *.java + :TlistAddFilesRecursive smallproject +< + If large number of files are present in the specified + directory tree, then it will take some time for the taglist + plugin to process all of them. + + *:TlistClose* +:TlistClose Close the taglist window. This command can be used from any + one of the Vim windows. + + *:TlistDebug* +:TlistDebug [filename] + Start logging of debug messages from the taglist plugin. + If {filename} is specified, then the debug messages are stored + in the specified file. Otherwise, the debug messages are + stored in a script local variable. If the file {filename} is + already present, then it is overwritten. + + *:TlistLock* +:TlistLock + Lock the taglist and don't process new files. After this + command is executed, newly edited files will not be added to + the taglist. + + *:TlistMessages* +:TlistMessages + Display the logged debug messages from the taglist plugin + in a window. This command works only when logging to a + script-local variable. + + *:TlistOpen* +:TlistOpen Open and jump to the taglist window. Creates the taglist + window, if the window is not opened currently. After executing + this command, the cursor is moved to the taglist window. When + the taglist window is opened for the first time, all the files + in the buffer list are processed and the tags defined in them + are displayed in the taglist window. + + *:TlistSessionSave* +:TlistSessionSave {filename} + Saves the information about files and tags in the taglist to + the specified file. This command can be used to save and + restore the taglist contents across Vim sessions. + + *:TlistSessionLoad* +:TlistSessionLoad {filename} + Load the information about files and tags stored in the + specified session file to the taglist. + + *:TlistShowPrototype* +:TlistShowPrototype [filename] [linenumber] + Display the prototype of the tag at or before the specified + line number. If the file name and the line number are not + specified, then the current file name and line number are + used. A tag spans multiple lines starting from the line where + it is defined to the line before the next tag. This command + displays the prototype for the tag for any line number in this + range. + + *:TlistShowTag* +:TlistShowTag [filename] [linenumber] + Display the name of the tag defined at or before the specified + line number. If the file name and the line number are not + specified, then the current file name and line number are + used. A tag spans multiple lines starting from the line where + it is defined to the line before the next tag. This command + displays the tag name for any line number in this range. + + *:TlistHighlightTag* +:TlistHighlightTag + Highlight the current tag in the taglist window. By default, + the taglist plugin periodically updates the taglist window to + highlight the current tag. This command can be used to force + the taglist plugin to highlight the current tag. + + *:TlistToggle* +:TlistToggle Open or close (toggle) the taglist window. Opens the taglist + window, if the window is not opened currently. Closes the + taglist window, if the taglist window is already opened. When + the taglist window is opened for the first time, all the files + in the buffer list are processed and the tags are displayed in + the taglist window. After executing this command, the cursor + is not moved from the current window to the taglist window. + + *:TlistUndebug* +:TlistUndebug + Stop logging of debug messages from the taglist plugin. + + *:TlistUnlock* +:TlistUnlock + Unlock the taglist and start processing newly edited files. + + *:TlistUpdate* +:TlistUpdate Update the tags information for the current buffer. This + command can be used to re-process the current file/buffer and + get the tags information. As the taglist plugin uses the file + saved in the disk (instead of the file displayed in a Vim + buffer), you should save a modified buffer before you update + the taglist. Otherwise the listed tags will not include the + new tags created in the buffer. You can use this command even + when the taglist window is not opened. + +============================================================================== + *taglist-functions* +8. Global functions~ + +The taglist plugin provides several global functions that can be used from +other Vim plugins to interact with the taglist plugin. These functions are +described below. + +|Tlist_Update_File_Tags()| Update the tags for the specified file +|Tlist_Get_Tag_Prototype_By_Line()| Return the prototype of the tag at or + before the specified line number in the + specified file. +|Tlist_Get_Tagname_By_Line()| Return the name of the tag at or + before the specified line number in + the specified file. +|Tlist_Set_App()| Set the name of the application + controlling the taglist window. + + *Tlist_Update_File_Tags()* +Tlist_Update_File_Tags({filename}, {filetype}) + Update the tags for the file {filename}. The second argument + specifies the Vim filetype for the file. If the taglist plugin + has not processed the file previously, then the exuberant + ctags tool is invoked to generate the tags for the file. + + *Tlist_Get_Tag_Prototype_By_Line()* +Tlist_Get_Tag_Prototype_By_Line([{filename}, {linenumber}]) + Return the prototype of the tag at or before the specified + line number in the specified file. If the filename and line + number are not specified, then the current buffer name and the + current line number are used. + + *Tlist_Get_Tagname_By_Line()* +Tlist_Get_Tagname_By_Line([{filename}, {linenumber}]) + Return the name of the tag at or before the specified line + number in the specified file. If the filename and line number + are not specified, then the current buffer name and the + current line number are used. + + *Tlist_Set_App()* +Tlist_Set_App({appname}) + Set the name of the plugin that controls the taglist plugin + window and buffer. This can be used to integrate the taglist + plugin with other Vim plugins. + + For example, the winmanager plugin and the Cream package use + this function and specify the appname as "winmanager" and + "cream" respectively. + + By default, the taglist plugin is a stand-alone plugin and + controls the taglist window and buffer. If the taglist window + is controlled by an external plugin, then the appname should + be set appropriately. + +============================================================================== + *taglist-extend* +9. Extending~ + +The taglist plugin supports all the languages supported by the exuberant ctags +tool, which includes the following languages: Assembly, ASP, Awk, Beta, C, +C++, C#, Cobol, Eiffel, Erlang, Fortran, HTML, Java, Javascript, Lisp, Lua, +Make, Pascal, Perl, PHP, Python, Rexx, Ruby, Scheme, Shell, Slang, SML, Sql, +TCL, Verilog, Vim and Yacc. + +You can extend the taglist plugin to add support for new languages and also +modify the support for the above listed languages. + +You should NOT make modifications to the taglist plugin script file to add +support for new languages. You will lose these changes when you upgrade to the +next version of the taglist plugin. Instead you should follow the below +described instructions to extend the taglist plugin. + +You can extend the taglist plugin by setting variables in the .vimrc or _vimrc +file. The name of these variables depends on the language name and is +described below. + +Modifying support for an existing language~ +To modify the support for an already supported language, you have to set the +tlist_xxx_settings variable in the ~/.vimrc or $HOME/_vimrc file. Replace xxx +with the Vim filetype name for the language file. For example, to modify the +support for the perl language files, you have to set the tlist_perl_settings +variable. To modify the support for java files, you have to set the +tlist_java_settings variable. + +To determine the filetype name used by Vim for a file, use the following +command in the buffer containing the file: + + :set filetype + +The above command will display the Vim filetype for the current buffer. + +The format of the value set in the tlist_xxx_settings variable is + + ;flag1:name1;flag2:name2;flag3:name3 + +The different fields in the value are separated by the ';' character. + +The first field 'language_name' is the name used by exuberant ctags to refer +to this language file. This name can be different from the file type name used +by Vim. For example, for C++, the language name used by ctags is 'c++' but the +filetype name used by Vim is 'cpp'. To get the list of language names +supported by exuberant ctags, use the following command: + + $ ctags --list-maps=all + +The remaining fields follow the format "flag:name". The sub-field 'flag' is +the language specific flag used by exuberant ctags to generate the +corresponding tags. For example, for the C language, to list only the +functions, the 'f' flag is used. To get the list of flags supported by +exuberant ctags for the various languages use the following command: + + $ ctags --list-kinds=all + +The sub-field 'name' specifies the title text to use for displaying the tags +of a particular type. For example, 'name' can be set to 'functions'. This +field can be set to any text string name. + +For example, to list only the classes and functions defined in a C++ language +file, add the following line to your .vimrc file: + + let tlist_cpp_settings = 'c++;c:class;f:function' + +In the above setting, 'cpp' is the Vim filetype name and 'c++' is the name +used by the exuberant ctags tool. 'c' and 'f' are the flags passed to +exuberant ctags to list C++ classes and functions and 'class' is the title +used for the class tags and 'function' is the title used for the function tags +in the taglist window. + +For example, to display only functions defined in a C file and to use "My +Functions" as the title for the function tags, use + + let tlist_c_settings = 'c;f:My Functions' + +When you set the tlist_xxx_settings variable, you will override the default +setting used by the taglist plugin for the 'xxx' language. You cannot add to +the default options used by the taglist plugin for a particular file type. To +add to the options used by the taglist plugin for a language, copy the option +values from the taglist plugin file to your .vimrc file and modify it. + +Adding support for a new language~ +If you want to add support for a new language to the taglist plugin, you need +to first extend the exuberant ctags tool. For more information about extending +exuberant ctags, visit the following page: + + http://ctags.sourceforge.net/EXTENDING.html + +To add support for a new language, set the tlist_xxx_settings variable in the +~/.vimrc file appropriately as described above. Replace 'xxx' in the variable +name with the Vim filetype name for the new language. + +For example, to extend the taglist plugin to support the latex language, you +can use the following line (assuming, you have already extended exuberant +ctags to support the latex language): + + let tlist_tex_settings='latex;b:bibitem;c:command;l:label' + +With the above line, when you edit files of filetype "tex" in Vim, the taglist +plugin will invoke the exuberant ctags tool passing the "latex" filetype and +the flags b, c and l to generate the tags. The text heading 'bibitem', +'command' and 'label' will be used in the taglist window for the tags which +are generated for the flags b, c and l respectively. + +============================================================================== + *taglist-faq* +10. Frequently Asked Questions~ + +Q. The taglist plugin doesn't work. The taglist window is empty and the tags + defined in a file are not displayed. +A. Are you using Vim version 6.0 and above? The taglist plugin relies on the + features supported by Vim version 6.0 and above. You can use the following + command to get the Vim version: +> + $ vim --version +< + Are you using exuberant ctags version 5.0 and above? The taglist plugin + relies on the features supported by exuberant ctags and will not work with + GNU ctags or the Unix ctags utility. You can use the following command to + determine whether the ctags installed in your system is exuberant ctags: +> + $ ctags --version +< + Is exuberant ctags present in one of the directories in your PATH? If not, + you need to set the Tlist_Ctags_Cmd variable to point to the location of + exuberant ctags. Use the following Vim command to verify that this is setup + correctly: +> + :echo system(Tlist_Ctags_Cmd . ' --version') +< + The above command should display the version information for exuberant + ctags. + + Did you turn on the Vim filetype detection? The taglist plugin relies on + the filetype detected by Vim and passes the filetype to the exuberant ctags + utility to parse the tags. Check the output of the following Vim command: +> + :filetype +< + The output of the above command should contain "filetype detection:ON". + To turn on the filetype detection, add the following line to the .vimrc or + _vimrc file: +> + filetype on +< + Is your version of Vim compiled with the support for the system() function? + The following Vim command should display 1: +> + :echo exists('*system') +< + In some Linux distributions (particularly Suse Linux), the default Vim + installation is built without the support for the system() function. The + taglist plugin uses the system() function to invoke the exuberant ctags + utility. You need to rebuild Vim after enabling the support for the + system() function. If you use the default build options, the system() + function will be supported. + + Do you have the |'shellslash'| option set? You can try disabling the + |'shellslash'| option. When the taglist plugin invokes the exuberant ctags + utility with the path to the file, if the incorrect slashes are used, then + you will see errors. + + Check the shell related Vim options values using the following command: +> + :set shell? shellcmdflag? shellpipe? + :set shellquote? shellredir? shellxquote? +< + If these options are set in your .vimrc or _vimrc file, try removing those + lines. + + Are you using a Unix shell in a MS-Windows environment? For example, + the Unix shell from the MKS-toolkit. Do you have the SHELL environment + set to point to this shell? You can try resetting the SHELL environment + variable. + + If you are using a Unix shell on MS-Windows, you should try to use + exuberant ctags that is compiled for Unix-like environments so that + exuberant ctags will understand path names with forward slash characters. + + Is your filetype supported by the exuberant ctags utility? The file types + supported by the exuberant ctags utility are listed in the ctags help. If a + file type is not supported, you have to extend exuberant ctags. You can use + the following command to list the filetypes supported by exuberant ctags: +> + ctags --list-languages +< + Run the following command from the shell prompt and check whether the tags + defined in your file are listed in the output from exuberant ctags: +> + ctags -f - --format=2 --excmd=pattern --fields=nks +< + If you see your tags in the output from the above command, then the + exuberant ctags utility is properly parsing your file. + + Do you have the .ctags or _ctags or the ctags.cnf file in your home + directory for specifying default options or for extending exuberant ctags? + If you do have this file, check the options in this file and make sure + these options are not interfering with the operation of the taglist plugin. + + If you are using MS-Windows, check the value of the TEMP and TMP + environment variables. If these environment variables are set to a path + with space characters in the name, then try using the DOS 8.3 short name + for the path or set them to a path without the space characters in the + name. For example, if the temporary directory name is "C:\Documents and + Settings\xyz\Local Settings\Temp", then try setting the TEMP variable to + the following: +> + set TEMP=C:\DOCUMEN~1\xyz\LOCALS~1\Temp +< + If exuberant ctags is installed in a directory with space characters in the + name, then try adding the directory to the PATH environment variable or try + setting the 'Tlist_Ctags_Cmd' variable to the shortest path name to ctags + or try copying the exuberant ctags to a path without space characters in + the name. For example, if exuberant ctags is installed in the directory + "C:\Program Files\Ctags", then try setting the 'Tlist_Ctags_Cmd' variable + as below: +> + let Tlist_Ctags_Cmd='C:\Progra~1\Ctags\ctags.exe' +< + If you are using a cygwin compiled version of exuberant ctags on MS-Windows, + make sure that either you have the cygwin compiled sort utility installed + and available in your PATH or compile exuberant ctags with internal sort + support. Otherwise, when exuberant ctags sorts the tags output by invoking + the sort utility, it may end up invoking the MS-Windows version of + sort.exe, thereby resulting in failure. + +Q. When I try to open the taglist window, I am seeing the following error + message. How do I fix this problem? + + Taglist: Failed to generate tags for /my/path/to/file + ctags: illegal option -- -^@usage: ctags [-BFadtuwvx] [-f tagsfile] file ... + +A. The taglist plugin will work only with the exuberant ctags tool. You + cannot use the GNU ctags or the Unix ctags program with the taglist plugin. + You will see an error message similar to the one shown above, if you try + use a non-exuberant ctags program with Vim. To fix this problem, either add + the exuberant ctags tool location to the PATH environment variable or set + the 'Tlist_Ctags_Cmd' variable. + +Q. A file has more than one tag with the same name. When I select a tag name + from the taglist window, the cursor is positioned at the incorrect tag + location. +A. The taglist plugin uses the search pattern generated by the exuberant ctags + utility to position the cursor at the location of a tag definition. If a + file has more than one tag with the same name and same prototype, then the + search pattern will be the same. In this case, when searching for the tag + pattern, the cursor may be positioned at the incorrect location. + +Q. I have made some modifications to my file and introduced new + functions/classes/variables. I have not yet saved my file. The taglist + plugin is not displaying the new tags when I update the taglist window. +A. The exuberant ctags utility will process only files that are present in the + disk. To list the tags defined in a file, you have to save the file and + then update the taglist window. + +Q. I have created a ctags file using the exuberant ctags utility for my source + tree. How do I configure the taglist plugin to use this tags file? +A. The taglist plugin doesn't use a tags file stored in disk. For every opened + file, the taglist plugin invokes the exuberant ctags utility to get the + list of tags dynamically. The Vim system() function is used to invoke + exuberant ctags and get the ctags output. This function internally uses a + temporary file to store the output. This file is deleted after the output + from the command is read. So you will never see the file that contains the + output of exuberant ctags. + +Q. When I set the |'updatetime'| option to a low value (less than 1000) and if + I keep pressing a key with the taglist window open, the current buffer + contents are changed. Why is this? +A. The taglist plugin uses the |CursorHold| autocmd to highlight the current + tag. The CursorHold autocmd triggers for every |'updatetime'| milliseconds. + If the |'updatetime'| option is set to a low value, then the CursorHold + autocmd will be triggered frequently. As the taglist plugin changes + the focus to the taglist window to highlight the current tag, this could + interfere with the key movement resulting in changing the contents of + the current buffer. The workaround for this problem is to not set the + |'updatetime'| option to a low value. + +============================================================================== + *taglist-license* +11. License~ +Permission is hereby granted to use and distribute the taglist plugin, with or +without modifications, provided that this copyright notice is copied with it. +Like anything else that's free, taglist.vim is provided *as is* and comes with +no warranty of any kind, either expressed or implied. In no event will the +copyright holder be liable for any damamges resulting from the use of this +software. + +============================================================================== + *taglist-todo* +12. Todo~ + +1. Group tags according to the scope and display them. For example, + group all the tags belonging to a C++/Java class +2. Support for displaying tags in a modified (not-yet-saved) file. +3. Automatically open the taglist window only for selected filetypes. + For other filetypes, close the taglist window. +4. When using the shell from the MKS toolkit, the taglist plugin + doesn't work. +5. The taglist plugin doesn't work with files edited remotely using the + netrw plugin. The exuberant ctags utility cannot process files over + scp/rcp/ftp, etc. + +============================================================================== + +vim:tw=78:ts=8:noet:ft=help: diff --git a/sources_non_forked/taglist/doc/tags b/sources_non_forked/taglist/doc/tags new file mode 100644 index 00000000..83e80ba1 --- /dev/null +++ b/sources_non_forked/taglist/doc/tags @@ -0,0 +1,62 @@ +'Tlist_Auto_Highlight_Tag' taglist.txt /*'Tlist_Auto_Highlight_Tag'* +'Tlist_Auto_Open' taglist.txt /*'Tlist_Auto_Open'* +'Tlist_Auto_Update' taglist.txt /*'Tlist_Auto_Update'* +'Tlist_Close_On_Select' taglist.txt /*'Tlist_Close_On_Select'* +'Tlist_Compact_Format' taglist.txt /*'Tlist_Compact_Format'* +'Tlist_Ctags_Cmd' taglist.txt /*'Tlist_Ctags_Cmd'* +'Tlist_Display_Prototype' taglist.txt /*'Tlist_Display_Prototype'* +'Tlist_Display_Tag_Scope' taglist.txt /*'Tlist_Display_Tag_Scope'* +'Tlist_Enable_Fold_Column' taglist.txt /*'Tlist_Enable_Fold_Column'* +'Tlist_Exit_OnlyWindow' taglist.txt /*'Tlist_Exit_OnlyWindow'* +'Tlist_File_Fold_Auto_Close' taglist.txt /*'Tlist_File_Fold_Auto_Close'* +'Tlist_GainFocus_On_ToggleOpen' taglist.txt /*'Tlist_GainFocus_On_ToggleOpen'* +'Tlist_Highlight_Tag_On_BufEnter' taglist.txt /*'Tlist_Highlight_Tag_On_BufEnter'* +'Tlist_Inc_Winwidth' taglist.txt /*'Tlist_Inc_Winwidth'* +'Tlist_Max_Submenu_Items' taglist.txt /*'Tlist_Max_Submenu_Items'* +'Tlist_Max_Tag_Length' taglist.txt /*'Tlist_Max_Tag_Length'* +'Tlist_Process_File_Always' taglist.txt /*'Tlist_Process_File_Always'* +'Tlist_Show_Menu' taglist.txt /*'Tlist_Show_Menu'* +'Tlist_Show_One_File' taglist.txt /*'Tlist_Show_One_File'* +'Tlist_Sort_Type' taglist.txt /*'Tlist_Sort_Type'* +'Tlist_Use_Horiz_Window' taglist.txt /*'Tlist_Use_Horiz_Window'* +'Tlist_Use_Right_Window' taglist.txt /*'Tlist_Use_Right_Window'* +'Tlist_Use_SingleClick' taglist.txt /*'Tlist_Use_SingleClick'* +'Tlist_WinHeight' taglist.txt /*'Tlist_WinHeight'* +'Tlist_WinWidth' taglist.txt /*'Tlist_WinWidth'* +:TlistAddFiles taglist.txt /*:TlistAddFiles* +:TlistAddFilesRecursive taglist.txt /*:TlistAddFilesRecursive* +:TlistClose taglist.txt /*:TlistClose* +:TlistDebug taglist.txt /*:TlistDebug* +:TlistHighlightTag taglist.txt /*:TlistHighlightTag* +:TlistLock taglist.txt /*:TlistLock* +:TlistMessages taglist.txt /*:TlistMessages* +:TlistOpen taglist.txt /*:TlistOpen* +:TlistSessionLoad taglist.txt /*:TlistSessionLoad* +:TlistSessionSave taglist.txt /*:TlistSessionSave* +:TlistShowPrototype taglist.txt /*:TlistShowPrototype* +:TlistShowTag taglist.txt /*:TlistShowTag* +:TlistToggle taglist.txt /*:TlistToggle* +:TlistUndebug taglist.txt /*:TlistUndebug* +:TlistUnlock taglist.txt /*:TlistUnlock* +:TlistUpdate taglist.txt /*:TlistUpdate* +Tlist_Get_Tag_Prototype_By_Line() taglist.txt /*Tlist_Get_Tag_Prototype_By_Line()* +Tlist_Get_Tagname_By_Line() taglist.txt /*Tlist_Get_Tagname_By_Line()* +Tlist_Set_App() taglist.txt /*Tlist_Set_App()* +Tlist_Update_File_Tags() taglist.txt /*Tlist_Update_File_Tags()* +taglist-commands taglist.txt /*taglist-commands* +taglist-debug taglist.txt /*taglist-debug* +taglist-extend taglist.txt /*taglist-extend* +taglist-faq taglist.txt /*taglist-faq* +taglist-functions taglist.txt /*taglist-functions* +taglist-install taglist.txt /*taglist-install* +taglist-internet taglist.txt /*taglist-internet* +taglist-intro taglist.txt /*taglist-intro* +taglist-keys taglist.txt /*taglist-keys* +taglist-license taglist.txt /*taglist-license* +taglist-menu taglist.txt /*taglist-menu* +taglist-options taglist.txt /*taglist-options* +taglist-requirements taglist.txt /*taglist-requirements* +taglist-session taglist.txt /*taglist-session* +taglist-todo taglist.txt /*taglist-todo* +taglist-using taglist.txt /*taglist-using* +taglist.txt taglist.txt /*taglist.txt* diff --git a/sources_non_forked/taglist/plugin/taglist.vim b/sources_non_forked/taglist/plugin/taglist.vim new file mode 100644 index 00000000..59901f64 --- /dev/null +++ b/sources_non_forked/taglist/plugin/taglist.vim @@ -0,0 +1,4546 @@ +" File: taglist.vim +" Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) +" Version: 4.5 +" Last Modified: September 21, 2007 +" Copyright: Copyright (C) 2002-2007 Yegappan Lakshmanan +" Permission is hereby granted to use and distribute this code, +" with or without modifications, provided that this copyright +" notice is copied with it. Like anything else that's free, +" taglist.vim is provided *as is* and comes with no warranty of any +" kind, either expressed or implied. In no event will the copyright +" holder be liable for any damamges resulting from the use of this +" software. +" +" The "Tag List" plugin is a source code browser plugin for Vim and provides +" an overview of the structure of the programming language files and allows +" you to efficiently browse through source code files for different +" programming languages. You can visit the taglist plugin home page for more +" information: +" +" http://vim-taglist.sourceforge.net +" +" You can subscribe to the taglist mailing list to post your questions +" or suggestions for improvement or to report bugs. Visit the following +" page for subscribing to the mailing list: +" +" http://groups.yahoo.com/group/taglist/ +" +" For more information about using this plugin, after installing the +" taglist plugin, use the ":help taglist" command. +" +" Installation +" ------------ +" 1. Download the taglist.zip file and unzip the files to the $HOME/.vim +" or the $HOME/vimfiles or the $VIM/vimfiles directory. This should +" unzip the following two files (the directory structure should be +" preserved): +" +" plugin/taglist.vim - main taglist plugin file +" doc/taglist.txt - documentation (help) file +" +" Refer to the 'add-plugin', 'add-global-plugin' and 'runtimepath' +" Vim help pages for more details about installing Vim plugins. +" 2. Change to the $HOME/.vim/doc or $HOME/vimfiles/doc or +" $VIM/vimfiles/doc directory, start Vim and run the ":helptags ." +" command to process the taglist help file. +" 3. If the exuberant ctags utility is not present in your PATH, then set the +" Tlist_Ctags_Cmd variable to point to the location of the exuberant ctags +" utility (not to the directory) in the .vimrc file. +" 4. If you are running a terminal/console version of Vim and the +" terminal doesn't support changing the window width then set the +" 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file. +" 5. Restart Vim. +" 6. You can now use the ":TlistToggle" command to open/close the taglist +" window. You can use the ":help taglist" command to get more +" information about using the taglist plugin. +" +" ****************** Do not modify after this line ************************ + +" Line continuation used here +let s:cpo_save = &cpo +set cpo&vim + +if !exists('loaded_taglist') + " First time loading the taglist plugin + " + " To speed up the loading of Vim, the taglist plugin uses autoload + " mechanism to load the taglist functions. + " Only define the configuration variables, user commands and some + " auto-commands and finish sourcing the file + + " The taglist plugin requires the built-in Vim system() function. If this + " function is not available, then don't load the plugin. + if !exists('*system') + echomsg 'Taglist: Vim system() built-in function is not available. ' . + \ 'Plugin is not loaded.' + let loaded_taglist = 'no' + let &cpo = s:cpo_save + finish + endif + + " Location of the exuberant ctags tool + if !exists('Tlist_Ctags_Cmd') + if executable('exuberant-ctags') + " On Debian Linux, exuberant ctags is installed + " as exuberant-ctags + let Tlist_Ctags_Cmd = 'exuberant-ctags' + elseif executable('exctags') + " On Free-BSD, exuberant ctags is installed as exctags + let Tlist_Ctags_Cmd = 'exctags' + elseif executable('ctags') + let Tlist_Ctags_Cmd = 'ctags' + elseif executable('ctags.exe') + let Tlist_Ctags_Cmd = 'ctags.exe' + elseif executable('tags') + let Tlist_Ctags_Cmd = 'tags' + else + echomsg 'Taglist: Exuberant ctags (http://ctags.sf.net) ' . + \ 'not found in PATH. Plugin is not loaded.' + " Skip loading the plugin + let loaded_taglist = 'no' + let &cpo = s:cpo_save + finish + endif + endif + + + " Automatically open the taglist window on Vim startup + if !exists('Tlist_Auto_Open') + let Tlist_Auto_Open = 0 + endif + + " When the taglist window is toggle opened, move the cursor to the + " taglist window + if !exists('Tlist_GainFocus_On_ToggleOpen') + let Tlist_GainFocus_On_ToggleOpen = 0 + endif + + " Process files even when the taglist window is not open + if !exists('Tlist_Process_File_Always') + let Tlist_Process_File_Always = 0 + endif + + if !exists('Tlist_Show_Menu') + let Tlist_Show_Menu = 0 + endif + + " Tag listing sort type - 'name' or 'order' + if !exists('Tlist_Sort_Type') + let Tlist_Sort_Type = 'order' + endif + + " Tag listing window split (horizontal/vertical) control + if !exists('Tlist_Use_Horiz_Window') + let Tlist_Use_Horiz_Window = 0 + endif + + " Open the vertically split taglist window on the left or on the right + " side. This setting is relevant only if Tlist_Use_Horiz_Window is set to + " zero (i.e. only for vertically split windows) + if !exists('Tlist_Use_Right_Window') + let Tlist_Use_Right_Window = 0 + endif + + " Increase Vim window width to display vertically split taglist window. + " For MS-Windows version of Vim running in a MS-DOS window, this must be + " set to 0 otherwise the system may hang due to a Vim limitation. + if !exists('Tlist_Inc_Winwidth') + if (has('win16') || has('win95')) && !has('gui_running') + let Tlist_Inc_Winwidth = 0 + else + let Tlist_Inc_Winwidth = 1 + endif + endif + + " Vertically split taglist window width setting + if !exists('Tlist_WinWidth') + let Tlist_WinWidth = 30 + endif + + " Horizontally split taglist window height setting + if !exists('Tlist_WinHeight') + let Tlist_WinHeight = 10 + endif + + " Display tag prototypes or tag names in the taglist window + if !exists('Tlist_Display_Prototype') + let Tlist_Display_Prototype = 0 + endif + + " Display tag scopes in the taglist window + if !exists('Tlist_Display_Tag_Scope') + let Tlist_Display_Tag_Scope = 1 + endif + + " Use single left mouse click to jump to a tag. By default this is disabled. + " Only double click using the mouse will be processed. + if !exists('Tlist_Use_SingleClick') + let Tlist_Use_SingleClick = 0 + endif + + " Control whether additional help is displayed as part of the taglist or + " not. Also, controls whether empty lines are used to separate the tag + " tree. + if !exists('Tlist_Compact_Format') + let Tlist_Compact_Format = 0 + endif + + " Exit Vim if only the taglist window is currently open. By default, this is + " set to zero. + if !exists('Tlist_Exit_OnlyWindow') + let Tlist_Exit_OnlyWindow = 0 + endif + + " Automatically close the folds for the non-active files in the taglist + " window + if !exists('Tlist_File_Fold_Auto_Close') + let Tlist_File_Fold_Auto_Close = 0 + endif + + " Close the taglist window when a tag is selected + if !exists('Tlist_Close_On_Select') + let Tlist_Close_On_Select = 0 + endif + + " Automatically update the taglist window to display tags for newly + " edited files + if !exists('Tlist_Auto_Update') + let Tlist_Auto_Update = 1 + endif + + " Automatically highlight the current tag + if !exists('Tlist_Auto_Highlight_Tag') + let Tlist_Auto_Highlight_Tag = 1 + endif + + " Automatically highlight the current tag on entering a buffer + if !exists('Tlist_Highlight_Tag_On_BufEnter') + let Tlist_Highlight_Tag_On_BufEnter = 1 + endif + + " Enable fold column to display the folding for the tag tree + if !exists('Tlist_Enable_Fold_Column') + let Tlist_Enable_Fold_Column = 1 + endif + + " Display the tags for only one file in the taglist window + if !exists('Tlist_Show_One_File') + let Tlist_Show_One_File = 0 + endif + + if !exists('Tlist_Max_Submenu_Items') + let Tlist_Max_Submenu_Items = 20 + endif + + if !exists('Tlist_Max_Tag_Length') + let Tlist_Max_Tag_Length = 10 + endif + + " Do not change the name of the taglist title variable. The winmanager + " plugin relies on this name to determine the title for the taglist + " plugin. + let TagList_title = "__Tag_List__" + + " Taglist debug messages + let s:tlist_msg = '' + + " Define the taglist autocommand to automatically open the taglist window + " on Vim startup + if g:Tlist_Auto_Open + autocmd VimEnter * nested call s:Tlist_Window_Check_Auto_Open() + endif + + " Refresh the taglist + if g:Tlist_Process_File_Always + autocmd BufEnter * call s:Tlist_Refresh() + endif + + if g:Tlist_Show_Menu + autocmd GUIEnter * call s:Tlist_Menu_Init() + endif + + " When the taglist buffer is created when loading a Vim session file, + " the taglist buffer needs to be initialized. The BufFilePost event + " is used to handle this case. + autocmd BufFilePost __Tag_List__ call s:Tlist_Vim_Session_Load() + + " Define the user commands to manage the taglist window + command! -nargs=0 -bar TlistToggle call s:Tlist_Window_Toggle() + command! -nargs=0 -bar TlistOpen call s:Tlist_Window_Open() + " For backwards compatiblity define the Tlist command + command! -nargs=0 -bar Tlist TlistToggle + command! -nargs=+ -complete=file TlistAddFiles + \ call s:Tlist_Add_Files() + command! -nargs=+ -complete=dir TlistAddFilesRecursive + \ call s:Tlist_Add_Files_Recursive() + command! -nargs=0 -bar TlistClose call s:Tlist_Window_Close() + command! -nargs=0 -bar TlistUpdate call s:Tlist_Update_Current_File() + command! -nargs=0 -bar TlistHighlightTag call s:Tlist_Window_Highlight_Tag( + \ fnamemodify(bufname('%'), ':p'), line('.'), 2, 1) + " For backwards compatiblity define the TlistSync command + command! -nargs=0 -bar TlistSync TlistHighlightTag + command! -nargs=* -complete=buffer TlistShowPrototype + \ echo Tlist_Get_Tag_Prototype_By_Line() + command! -nargs=* -complete=buffer TlistShowTag + \ echo Tlist_Get_Tagname_By_Line() + command! -nargs=* -complete=file TlistSessionLoad + \ call s:Tlist_Session_Load() + command! -nargs=* -complete=file TlistSessionSave + \ call s:Tlist_Session_Save() + command! -bar TlistLock let Tlist_Auto_Update=0 + command! -bar TlistUnlock let Tlist_Auto_Update=1 + + " Commands for enabling/disabling debug and to display debug messages + command! -nargs=? -complete=file -bar TlistDebug + \ call s:Tlist_Debug_Enable() + command! -nargs=0 -bar TlistUndebug call s:Tlist_Debug_Disable() + command! -nargs=0 -bar TlistMessages call s:Tlist_Debug_Show() + + " Define autocommands to autoload the taglist plugin when needed. + + " Trick to get the current script ID + map xx xx + let s:tlist_sid = substitute(maparg('xx'), '\(\d\+_\)xx$', + \ '\1', '') + unmap xx + + exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_* source ' . + \ escape(expand(''), ' ') + exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Window_* source ' . + \ escape(expand(''), ' ') + exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Menu_* source ' . + \ escape(expand(''), ' ') + exe 'autocmd FuncUndefined Tlist_* source ' . + \ escape(expand(''), ' ') + exe 'autocmd FuncUndefined TagList_* source ' . + \ escape(expand(''), ' ') + + let loaded_taglist = 'fast_load_done' + + if g:Tlist_Show_Menu && has('gui_running') + call s:Tlist_Menu_Init() + endif + + " restore 'cpo' + let &cpo = s:cpo_save + finish +endif + +if !exists('s:tlist_sid') + " Two or more versions of taglist plugin are installed. Don't + " load this version of the plugin. + finish +endif + +unlet! s:tlist_sid + +if loaded_taglist != 'fast_load_done' + " restore 'cpo' + let &cpo = s:cpo_save + finish +endif + +" Taglist plugin functionality is available +let loaded_taglist = 'available' + +"------------------- end of user configurable options -------------------- + +" Default language specific settings for supported file types and tag types +" +" Variable name format: +" +" s:tlist_def_{vim_ftype}_settings +" +" vim_ftype - Filetype detected by Vim +" +" Value format: +" +" ;:;:;... +" +" ctags_ftype - File type supported by exuberant ctags +" flag - Flag supported by exuberant ctags to generate a tag type +" name - Name of the tag type used in the taglist window to display the +" tags of this type +" + +" assembly language +let s:tlist_def_asm_settings = 'asm;d:define;l:label;m:macro;t:type' + +" aspperl language +let s:tlist_def_aspperl_settings = 'asp;f:function;s:sub;v:variable' + +" aspvbs language +let s:tlist_def_aspvbs_settings = 'asp;f:function;s:sub;v:variable' + +" awk language +let s:tlist_def_awk_settings = 'awk;f:function' + +" beta language +let s:tlist_def_beta_settings = 'beta;f:fragment;s:slot;v:pattern' + +" c language +let s:tlist_def_c_settings = 'c;d:macro;g:enum;s:struct;u:union;t:typedef;' . + \ 'v:variable;f:function' + +" c++ language +let s:tlist_def_cpp_settings = 'c++;n:namespace;v:variable;d:macro;t:typedef;' . + \ 'c:class;g:enum;s:struct;u:union;f:function' + +" c# language +let s:tlist_def_cs_settings = 'c#;d:macro;t:typedef;n:namespace;c:class;' . + \ 'E:event;g:enum;s:struct;i:interface;' . + \ 'p:properties;m:method' + +" cobol language +let s:tlist_def_cobol_settings = 'cobol;d:data;f:file;g:group;p:paragraph;' . + \ 'P:program;s:section' + +" eiffel language +let s:tlist_def_eiffel_settings = 'eiffel;c:class;f:feature' + +" erlang language +let s:tlist_def_erlang_settings = 'erlang;d:macro;r:record;m:module;f:function' + +" expect (same as tcl) language +let s:tlist_def_expect_settings = 'tcl;c:class;f:method;p:procedure' + +" fortran language +let s:tlist_def_fortran_settings = 'fortran;p:program;b:block data;' . + \ 'c:common;e:entry;i:interface;k:type;l:label;m:module;' . + \ 'n:namelist;t:derived;v:variable;f:function;s:subroutine' + +" HTML language +let s:tlist_def_html_settings = 'html;a:anchor;f:javascript function' + +" java language +let s:tlist_def_java_settings = 'java;p:package;c:class;i:interface;' . + \ 'f:field;m:method' + +" javascript language +let s:tlist_def_javascript_settings = 'javascript;f:function' + +" lisp language +let s:tlist_def_lisp_settings = 'lisp;f:function' + +" lua language +let s:tlist_def_lua_settings = 'lua;f:function' + +" makefiles +let s:tlist_def_make_settings = 'make;m:macro' + +" pascal language +let s:tlist_def_pascal_settings = 'pascal;f:function;p:procedure' + +" perl language +let s:tlist_def_perl_settings = 'perl;c:constant;l:label;p:package;s:subroutine' + +" php language +let s:tlist_def_php_settings = 'php;c:class;d:constant;v:variable;f:function' + +" python language +let s:tlist_def_python_settings = 'python;c:class;m:member;f:function' + +" rexx language +let s:tlist_def_rexx_settings = 'rexx;s:subroutine' + +" ruby language +let s:tlist_def_ruby_settings = 'ruby;c:class;f:method;F:function;' . + \ 'm:singleton method' + +" scheme language +let s:tlist_def_scheme_settings = 'scheme;s:set;f:function' + +" shell language +let s:tlist_def_sh_settings = 'sh;f:function' + +" C shell language +let s:tlist_def_csh_settings = 'sh;f:function' + +" Z shell language +let s:tlist_def_zsh_settings = 'sh;f:function' + +" slang language +let s:tlist_def_slang_settings = 'slang;n:namespace;f:function' + +" sml language +let s:tlist_def_sml_settings = 'sml;e:exception;c:functor;s:signature;' . + \ 'r:structure;t:type;v:value;f:function' + +" sql language +let s:tlist_def_sql_settings = 'sql;c:cursor;F:field;P:package;r:record;' . + \ 's:subtype;t:table;T:trigger;v:variable;f:function;p:procedure' + +" tcl language +let s:tlist_def_tcl_settings = 'tcl;c:class;f:method;m:method;p:procedure' + +" vera language +let s:tlist_def_vera_settings = 'vera;c:class;d:macro;e:enumerator;' . + \ 'f:function;g:enum;m:member;p:program;' . + \ 'P:prototype;t:task;T:typedef;v:variable;' . + \ 'x:externvar' + +"verilog language +let s:tlist_def_verilog_settings = 'verilog;m:module;c:constant;P:parameter;' . + \ 'e:event;r:register;t:task;w:write;p:port;v:variable;f:function' + +" vim language +let s:tlist_def_vim_settings = 'vim;a:autocmds;v:variable;f:function' + +" yacc language +let s:tlist_def_yacc_settings = 'yacc;l:label' + +"------------------- end of language specific options -------------------- + +" Vim window size is changed by the taglist plugin or not +let s:tlist_winsize_chgd = -1 +" Taglist window is maximized or not +let s:tlist_win_maximized = 0 +" Name of files in the taglist +let s:tlist_file_names='' +" Number of files in the taglist +let s:tlist_file_count = 0 +" Number of filetypes supported by taglist +let s:tlist_ftype_count = 0 +" Is taglist part of other plugins like winmanager or cream? +let s:tlist_app_name = "none" +" Are we displaying brief help text +let s:tlist_brief_help = 1 +" List of files removed on user request +let s:tlist_removed_flist = "" +" Index of current file displayed in the taglist window +let s:tlist_cur_file_idx = -1 +" Taglist menu is empty or not +let s:tlist_menu_empty = 1 + +" An autocommand is used to refresh the taglist window when entering any +" buffer. We don't want to refresh the taglist window if we are entering the +" file window from one of the taglist functions. The 'Tlist_Skip_Refresh' +" variable is used to skip the refresh of the taglist window and is set +" and cleared appropriately. +let s:Tlist_Skip_Refresh = 0 + +" Tlist_Window_Display_Help() +function! s:Tlist_Window_Display_Help() + if s:tlist_app_name == "winmanager" + " To handle a bug in the winmanager plugin, add a space at the + " last line + call setline('$', ' ') + endif + + if s:tlist_brief_help + " Add the brief help + call append(0, '" Press to display help text') + else + " Add the extensive help + call append(0, '" : Jump to tag definition') + call append(1, '" o : Jump to tag definition in new window') + call append(2, '" p : Preview the tag definition') + call append(3, '" : Display tag prototype') + call append(4, '" u : Update tag list') + call append(5, '" s : Select sort field') + call append(6, '" d : Remove file from taglist') + call append(7, '" x : Zoom-out/Zoom-in taglist window') + call append(8, '" + : Open a fold') + call append(9, '" - : Close a fold') + call append(10, '" * : Open all folds') + call append(11, '" = : Close all folds') + call append(12, '" [[ : Move to the start of previous file') + call append(13, '" ]] : Move to the start of next file') + call append(14, '" q : Close the taglist window') + call append(15, '" : Remove help text') + endif +endfunction + +" Tlist_Window_Toggle_Help_Text() +" Toggle taglist plugin help text between the full version and the brief +" version +function! s:Tlist_Window_Toggle_Help_Text() + if g:Tlist_Compact_Format + " In compact display mode, do not display help + return + endif + + " Include the empty line displayed after the help text + let brief_help_size = 1 + let full_help_size = 16 + + setlocal modifiable + + " Set report option to a huge value to prevent informational messages + " while deleting the lines + let old_report = &report + set report=99999 + + " Remove the currently highlighted tag. Otherwise, the help text + " might be highlighted by mistake + match none + + " Toggle between brief and full help text + if s:tlist_brief_help + let s:tlist_brief_help = 0 + + " Remove the previous help + exe '1,' . brief_help_size . ' delete _' + + " Adjust the start/end line numbers for the files + call s:Tlist_Window_Update_Line_Offsets(0, 1, full_help_size - brief_help_size) + else + let s:tlist_brief_help = 1 + + " Remove the previous help + exe '1,' . full_help_size . ' delete _' + + " Adjust the start/end line numbers for the files + call s:Tlist_Window_Update_Line_Offsets(0, 0, full_help_size - brief_help_size) + endif + + call s:Tlist_Window_Display_Help() + + " Restore the report option + let &report = old_report + + setlocal nomodifiable +endfunction + +" Taglist debug support +let s:tlist_debug = 0 + +" File for storing the debug messages +let s:tlist_debug_file = '' + +" Tlist_Debug_Enable +" Enable logging of taglist debug messages. +function! s:Tlist_Debug_Enable(...) + let s:tlist_debug = 1 + + " Check whether a valid file name is supplied. + if a:1 != '' + let s:tlist_debug_file = fnamemodify(a:1, ':p') + + " Empty the log file + exe 'redir! > ' . s:tlist_debug_file + redir END + + " Check whether the log file is present/created + if !filewritable(s:tlist_debug_file) + call s:Tlist_Warning_Msg('Taglist: Unable to create log file ' + \ . s:tlist_debug_file) + let s:tlist_debug_file = '' + endif + endif +endfunction + +" Tlist_Debug_Disable +" Disable logging of taglist debug messages. +function! s:Tlist_Debug_Disable(...) + let s:tlist_debug = 0 + let s:tlist_debug_file = '' +endfunction + +" Tlist_Debug_Show +" Display the taglist debug messages in a new window +function! s:Tlist_Debug_Show() + if s:tlist_msg == '' + call s:Tlist_Warning_Msg('Taglist: No debug messages') + return + endif + + " Open a new window to display the taglist debug messages + new taglist_debug.txt + " Delete all the lines (if the buffer already exists) + silent! %delete _ + " Add the messages + silent! put =s:tlist_msg + " Move the cursor to the first line + normal! gg +endfunction + +" Tlist_Log_Msg +" Log the supplied debug message along with the time +function! s:Tlist_Log_Msg(msg) + if s:tlist_debug + if s:tlist_debug_file != '' + exe 'redir >> ' . s:tlist_debug_file + silent echon strftime('%H:%M:%S') . ': ' . a:msg . "\n" + redir END + else + " Log the message into a variable + " Retain only the last 3000 characters + let len = strlen(s:tlist_msg) + if len > 3000 + let s:tlist_msg = strpart(s:tlist_msg, len - 3000) + endif + let s:tlist_msg = s:tlist_msg . strftime('%H:%M:%S') . ': ' . + \ a:msg . "\n" + endif + endif +endfunction + +" Tlist_Warning_Msg() +" Display a message using WarningMsg highlight group +function! s:Tlist_Warning_Msg(msg) + echohl WarningMsg + echomsg a:msg + echohl None +endfunction + +" Last returned file index for file name lookup. +" Used to speed up file lookup +let s:tlist_file_name_idx_cache = -1 + +" Tlist_Get_File_Index() +" Return the index of the specified filename +function! s:Tlist_Get_File_Index(fname) + if s:tlist_file_count == 0 || a:fname == '' + return -1 + endif + + " If the new filename is same as the last accessed filename, then + " return that index + if s:tlist_file_name_idx_cache != -1 && + \ s:tlist_file_name_idx_cache < s:tlist_file_count + if s:tlist_{s:tlist_file_name_idx_cache}_filename == a:fname + " Same as the last accessed file + return s:tlist_file_name_idx_cache + endif + endif + + " First, check whether the filename is present + let s_fname = a:fname . "\n" + let i = stridx(s:tlist_file_names, s_fname) + if i == -1 + let s:tlist_file_name_idx_cache = -1 + return -1 + endif + + " Second, compute the file name index + let nl_txt = substitute(strpart(s:tlist_file_names, 0, i), "[^\n]", '', 'g') + let s:tlist_file_name_idx_cache = strlen(nl_txt) + return s:tlist_file_name_idx_cache +endfunction + +" Last returned file index for line number lookup. +" Used to speed up file lookup +let s:tlist_file_lnum_idx_cache = -1 + +" Tlist_Window_Get_File_Index_By_Linenum() +" Return the index of the filename present in the specified line number +" Line number refers to the line number in the taglist window +function! s:Tlist_Window_Get_File_Index_By_Linenum(lnum) + call s:Tlist_Log_Msg('Tlist_Window_Get_File_Index_By_Linenum (' . a:lnum . ')') + + " First try to see whether the new line number is within the range + " of the last returned file + if s:tlist_file_lnum_idx_cache != -1 && + \ s:tlist_file_lnum_idx_cache < s:tlist_file_count + if a:lnum >= s:tlist_{s:tlist_file_lnum_idx_cache}_start && + \ a:lnum <= s:tlist_{s:tlist_file_lnum_idx_cache}_end + return s:tlist_file_lnum_idx_cache + endif + endif + + let fidx = -1 + + if g:Tlist_Show_One_File + " Displaying only one file in the taglist window. Check whether + " the line is within the tags displayed for that file + if s:tlist_cur_file_idx != -1 + if a:lnum >= s:tlist_{s:tlist_cur_file_idx}_start + \ && a:lnum <= s:tlist_{s:tlist_cur_file_idx}_end + let fidx = s:tlist_cur_file_idx + endif + + endif + else + " Do a binary search in the taglist + let left = 0 + let right = s:tlist_file_count - 1 + + while left < right + let mid = (left + right) / 2 + + if a:lnum >= s:tlist_{mid}_start && a:lnum <= s:tlist_{mid}_end + let s:tlist_file_lnum_idx_cache = mid + return mid + endif + + if a:lnum < s:tlist_{mid}_start + let right = mid - 1 + else + let left = mid + 1 + endif + endwhile + + if left >= 0 && left < s:tlist_file_count + \ && a:lnum >= s:tlist_{left}_start + \ && a:lnum <= s:tlist_{left}_end + let fidx = left + endif + endif + + let s:tlist_file_lnum_idx_cache = fidx + + return fidx +endfunction + +" Tlist_Exe_Cmd_No_Acmds +" Execute the specified Ex command after disabling autocommands +function! s:Tlist_Exe_Cmd_No_Acmds(cmd) + let old_eventignore = &eventignore + set eventignore=all + exe a:cmd + let &eventignore = old_eventignore +endfunction + +" Tlist_Skip_File() +" Check whether tag listing is supported for the specified file +function! s:Tlist_Skip_File(filename, ftype) + " Skip buffers with no names and buffers with filetype not set + if a:filename == '' || a:ftype == '' + return 1 + endif + + " Skip files which are not supported by exuberant ctags + " First check whether default settings for this filetype are available. + " If it is not available, then check whether user specified settings are + " available. If both are not available, then don't list the tags for this + " filetype + let var = 's:tlist_def_' . a:ftype . '_settings' + if !exists(var) + let var = 'g:tlist_' . a:ftype . '_settings' + if !exists(var) + return 1 + endif + endif + + " Skip files which are not readable or files which are not yet stored + " to the disk + if !filereadable(a:filename) + return 1 + endif + + return 0 +endfunction + +" Tlist_User_Removed_File +" Returns 1 if a file is removed by a user from the taglist +function! s:Tlist_User_Removed_File(filename) + return stridx(s:tlist_removed_flist, a:filename . "\n") != -1 +endfunction + +" Tlist_Update_Remove_List +" Update the list of user removed files from the taglist +" add == 1, add the file to the removed list +" add == 0, delete the file from the removed list +function! s:Tlist_Update_Remove_List(filename, add) + if a:add + let s:tlist_removed_flist = s:tlist_removed_flist . a:filename . "\n" + else + let idx = stridx(s:tlist_removed_flist, a:filename . "\n") + let text_before = strpart(s:tlist_removed_flist, 0, idx) + let rem_text = strpart(s:tlist_removed_flist, idx) + let next_idx = stridx(rem_text, "\n") + let text_after = strpart(rem_text, next_idx + 1) + + let s:tlist_removed_flist = text_before . text_after + endif +endfunction + +" Tlist_FileType_Init +" Initialize the ctags arguments and tag variable for the specified +" file type +function! s:Tlist_FileType_Init(ftype) + call s:Tlist_Log_Msg('Tlist_FileType_Init (' . a:ftype . ')') + " If the user didn't specify any settings, then use the default + " ctags args. Otherwise, use the settings specified by the user + let var = 'g:tlist_' . a:ftype . '_settings' + if exists(var) + " User specified ctags arguments + let settings = {var} . ';' + else + " Default ctags arguments + let var = 's:tlist_def_' . a:ftype . '_settings' + if !exists(var) + " No default settings for this file type. This filetype is + " not supported + return 0 + endif + let settings = s:tlist_def_{a:ftype}_settings . ';' + endif + + let msg = 'Taglist: Invalid ctags option setting - ' . settings + + " Format of the option that specifies the filetype and ctags arugments: + " + " ;flag1:name1;flag2:name2;flag3:name3 + " + + " Extract the file type to pass to ctags. This may be different from the + " file type detected by Vim + let pos = stridx(settings, ';') + if pos == -1 + call s:Tlist_Warning_Msg(msg) + return 0 + endif + let ctags_ftype = strpart(settings, 0, pos) + if ctags_ftype == '' + call s:Tlist_Warning_Msg(msg) + return 0 + endif + " Make sure a valid filetype is supplied. If the user didn't specify a + " valid filetype, then the ctags option settings may be treated as the + " filetype + if ctags_ftype =~ ':' + call s:Tlist_Warning_Msg(msg) + return 0 + endif + + " Remove the file type from settings + let settings = strpart(settings, pos + 1) + if settings == '' + call s:Tlist_Warning_Msg(msg) + return 0 + endif + + " Process all the specified ctags flags. The format is + " flag1:name1;flag2:name2;flag3:name3 + let ctags_flags = '' + let cnt = 0 + while settings != '' + " Extract the flag + let pos = stridx(settings, ':') + if pos == -1 + call s:Tlist_Warning_Msg(msg) + return 0 + endif + let flag = strpart(settings, 0, pos) + if flag == '' + call s:Tlist_Warning_Msg(msg) + return 0 + endif + " Remove the flag from settings + let settings = strpart(settings, pos + 1) + + " Extract the tag type name + let pos = stridx(settings, ';') + if pos == -1 + call s:Tlist_Warning_Msg(msg) + return 0 + endif + let name = strpart(settings, 0, pos) + if name == '' + call s:Tlist_Warning_Msg(msg) + return 0 + endif + let settings = strpart(settings, pos + 1) + + let cnt = cnt + 1 + + let s:tlist_{a:ftype}_{cnt}_name = flag + let s:tlist_{a:ftype}_{cnt}_fullname = name + let ctags_flags = ctags_flags . flag + endwhile + + let s:tlist_{a:ftype}_ctags_args = '--language-force=' . ctags_ftype . + \ ' --' . ctags_ftype . '-types=' . ctags_flags + let s:tlist_{a:ftype}_count = cnt + let s:tlist_{a:ftype}_ctags_flags = ctags_flags + + " Save the filetype name + let s:tlist_ftype_{s:tlist_ftype_count}_name = a:ftype + let s:tlist_ftype_count = s:tlist_ftype_count + 1 + + return 1 +endfunction + +" Tlist_Detect_Filetype +" Determine the filetype for the specified file using the filetypedetect +" autocmd. +function! s:Tlist_Detect_Filetype(fname) + " Ignore the filetype autocommands + let old_eventignore = &eventignore + set eventignore=FileType + + " Save the 'filetype', as this will be changed temporarily + let old_filetype = &filetype + + " Run the filetypedetect group of autocommands to determine + " the filetype + exe 'doautocmd filetypedetect BufRead ' . a:fname + + " Save the detected filetype + let ftype = &filetype + + " Restore the previous state + let &filetype = old_filetype + let &eventignore = old_eventignore + + return ftype +endfunction + +" Tlist_Get_Buffer_Filetype +" Get the filetype for the specified buffer +function! s:Tlist_Get_Buffer_Filetype(bnum) + let buf_ft = getbufvar(a:bnum, '&filetype') + + if bufloaded(a:bnum) + " For loaded buffers, the 'filetype' is already determined + return buf_ft + endif + + " For unloaded buffers, if the 'filetype' option is set, return it + if buf_ft != '' + return buf_ft + endif + + " Skip non-existent buffers + if !bufexists(a:bnum) + return '' + endif + + " For buffers whose filetype is not yet determined, try to determine + " the filetype + let bname = bufname(a:bnum) + + return s:Tlist_Detect_Filetype(bname) +endfunction + +" Tlist_Discard_TagInfo +" Discard the stored tag information for a file +function! s:Tlist_Discard_TagInfo(fidx) + call s:Tlist_Log_Msg('Tlist_Discard_TagInfo (' . + \ s:tlist_{a:fidx}_filename . ')') + let ftype = s:tlist_{a:fidx}_filetype + + " Discard information about the tags defined in the file + let i = 1 + while i <= s:tlist_{a:fidx}_tag_count + let fidx_i = 's:tlist_' . a:fidx . '_' . i + unlet! {fidx_i}_tag + unlet! {fidx_i}_tag_name + unlet! {fidx_i}_tag_type + unlet! {fidx_i}_ttype_idx + unlet! {fidx_i}_tag_proto + unlet! {fidx_i}_tag_searchpat + unlet! {fidx_i}_tag_linenum + let i = i + 1 + endwhile + + let s:tlist_{a:fidx}_tag_count = 0 + + " Discard information about tag type groups + let i = 1 + while i <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{i}_name + if s:tlist_{a:fidx}_{ttype} != '' + let fidx_ttype = 's:tlist_' . a:fidx . '_' . ttype + let {fidx_ttype} = '' + let {fidx_ttype}_offset = 0 + let cnt = {fidx_ttype}_count + let {fidx_ttype}_count = 0 + let j = 1 + while j <= cnt + unlet! {fidx_ttype}_{j} + let j = j + 1 + endwhile + endif + let i = i + 1 + endwhile + + " Discard the stored menu command also + let s:tlist_{a:fidx}_menu_cmd = '' +endfunction + +" Tlist_Window_Update_Line_Offsets +" Update the line offsets for tags for files starting from start_idx +" and displayed in the taglist window by the specified offset +function! s:Tlist_Window_Update_Line_Offsets(start_idx, increment, offset) + let i = a:start_idx + + while i < s:tlist_file_count + if s:tlist_{i}_visible + " Update the start/end line number only if the file is visible + if a:increment + let s:tlist_{i}_start = s:tlist_{i}_start + a:offset + let s:tlist_{i}_end = s:tlist_{i}_end + a:offset + else + let s:tlist_{i}_start = s:tlist_{i}_start - a:offset + let s:tlist_{i}_end = s:tlist_{i}_end - a:offset + endif + endif + let i = i + 1 + endwhile +endfunction + +" Tlist_Discard_FileInfo +" Discard the stored information for a file +function! s:Tlist_Discard_FileInfo(fidx) + call s:Tlist_Log_Msg('Tlist_Discard_FileInfo (' . + \ s:tlist_{a:fidx}_filename . ')') + call s:Tlist_Discard_TagInfo(a:fidx) + + let ftype = s:tlist_{a:fidx}_filetype + + let i = 1 + while i <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{i}_name + unlet! s:tlist_{a:fidx}_{ttype} + unlet! s:tlist_{a:fidx}_{ttype}_offset + unlet! s:tlist_{a:fidx}_{ttype}_count + let i = i + 1 + endwhile + + unlet! s:tlist_{a:fidx}_filename + unlet! s:tlist_{a:fidx}_sort_type + unlet! s:tlist_{a:fidx}_filetype + unlet! s:tlist_{a:fidx}_mtime + unlet! s:tlist_{a:fidx}_start + unlet! s:tlist_{a:fidx}_end + unlet! s:tlist_{a:fidx}_valid + unlet! s:tlist_{a:fidx}_visible + unlet! s:tlist_{a:fidx}_tag_count + unlet! s:tlist_{a:fidx}_menu_cmd +endfunction + +" Tlist_Window_Remove_File_From_Display +" Remove the specified file from display +function! s:Tlist_Window_Remove_File_From_Display(fidx) + call s:Tlist_Log_Msg('Tlist_Window_Remove_File_From_Display (' . + \ s:tlist_{a:fidx}_filename . ')') + " If the file is not visible then no need to remove it + if !s:tlist_{a:fidx}_visible + return + endif + + " Remove the tags displayed for the specified file from the window + let start = s:tlist_{a:fidx}_start + " Include the empty line after the last line also + if g:Tlist_Compact_Format + let end = s:tlist_{a:fidx}_end + else + let end = s:tlist_{a:fidx}_end + 1 + endif + + setlocal modifiable + exe 'silent! ' . start . ',' . end . 'delete _' + setlocal nomodifiable + + " Correct the start and end line offsets for all the files following + " this file, as the tags for this file are removed + call s:Tlist_Window_Update_Line_Offsets(a:fidx + 1, 0, end - start + 1) +endfunction + +" Tlist_Remove_File +" Remove the file under the cursor or the specified file index +" user_request - User requested to remove the file from taglist +function! s:Tlist_Remove_File(file_idx, user_request) + let fidx = a:file_idx + + if fidx == -1 + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) + if fidx == -1 + return + endif + endif + call s:Tlist_Log_Msg('Tlist_Remove_File (' . + \ s:tlist_{fidx}_filename . ', ' . a:user_request . ')') + + let save_winnr = winnr() + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + " Taglist window is open, remove the file from display + + if save_winnr != winnum + let old_eventignore = &eventignore + set eventignore=all + exe winnum . 'wincmd w' + endif + + call s:Tlist_Window_Remove_File_From_Display(fidx) + + if save_winnr != winnum + exe save_winnr . 'wincmd w' + let &eventignore = old_eventignore + endif + endif + + let fname = s:tlist_{fidx}_filename + + if a:user_request + " As the user requested to remove the file from taglist, + " add it to the removed list + call s:Tlist_Update_Remove_List(fname, 1) + endif + + " Remove the file name from the taglist list of filenames + let idx = stridx(s:tlist_file_names, fname . "\n") + let text_before = strpart(s:tlist_file_names, 0, idx) + let rem_text = strpart(s:tlist_file_names, idx) + let next_idx = stridx(rem_text, "\n") + let text_after = strpart(rem_text, next_idx + 1) + let s:tlist_file_names = text_before . text_after + + call s:Tlist_Discard_FileInfo(fidx) + + " Shift all the file variables by one index + let i = fidx + 1 + + while i < s:tlist_file_count + let j = i - 1 + + let s:tlist_{j}_filename = s:tlist_{i}_filename + let s:tlist_{j}_sort_type = s:tlist_{i}_sort_type + let s:tlist_{j}_filetype = s:tlist_{i}_filetype + let s:tlist_{j}_mtime = s:tlist_{i}_mtime + let s:tlist_{j}_start = s:tlist_{i}_start + let s:tlist_{j}_end = s:tlist_{i}_end + let s:tlist_{j}_valid = s:tlist_{i}_valid + let s:tlist_{j}_visible = s:tlist_{i}_visible + let s:tlist_{j}_tag_count = s:tlist_{i}_tag_count + let s:tlist_{j}_menu_cmd = s:tlist_{i}_menu_cmd + + let k = 1 + while k <= s:tlist_{j}_tag_count + let s:tlist_{j}_{k}_tag = s:tlist_{i}_{k}_tag + let s:tlist_{j}_{k}_tag_name = s:tlist_{i}_{k}_tag_name + let s:tlist_{j}_{k}_tag_type = s:Tlist_Get_Tag_Type_By_Tag(i, k) + let s:tlist_{j}_{k}_ttype_idx = s:tlist_{i}_{k}_ttype_idx + let s:tlist_{j}_{k}_tag_proto = s:Tlist_Get_Tag_Prototype(i, k) + let s:tlist_{j}_{k}_tag_searchpat = s:Tlist_Get_Tag_SearchPat(i, k) + let s:tlist_{j}_{k}_tag_linenum = s:Tlist_Get_Tag_Linenum(i, k) + let k = k + 1 + endwhile + + let ftype = s:tlist_{i}_filetype + + let k = 1 + while k <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{k}_name + let s:tlist_{j}_{ttype} = s:tlist_{i}_{ttype} + let s:tlist_{j}_{ttype}_offset = s:tlist_{i}_{ttype}_offset + let s:tlist_{j}_{ttype}_count = s:tlist_{i}_{ttype}_count + if s:tlist_{j}_{ttype} != '' + let l = 1 + while l <= s:tlist_{j}_{ttype}_count + let s:tlist_{j}_{ttype}_{l} = s:tlist_{i}_{ttype}_{l} + let l = l + 1 + endwhile + endif + let k = k + 1 + endwhile + + " As the file and tag information is copied to the new index, + " discard the previous information + call s:Tlist_Discard_FileInfo(i) + + let i = i + 1 + endwhile + + " Reduce the number of files displayed + let s:tlist_file_count = s:tlist_file_count - 1 + + if g:Tlist_Show_One_File + " If the tags for only one file is displayed and if we just + " now removed that file, then invalidate the current file idx + if s:tlist_cur_file_idx == fidx + let s:tlist_cur_file_idx = -1 + endif + endif +endfunction + +" Tlist_Window_Goto_Window +" Goto the taglist window +function! s:Tlist_Window_Goto_Window() + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + if winnr() != winnum + call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') + endif + endif +endfunction + +" Tlist_Window_Create +" Create a new taglist window. If it is already open, jump to it +function! s:Tlist_Window_Create() + call s:Tlist_Log_Msg('Tlist_Window_Create()') + " If the window is open, jump to it + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + " Jump to the existing window + if winnr() != winnum + exe winnum . 'wincmd w' + endif + return + endif + + " If used with winmanager don't open windows. Winmanager will handle + " the window/buffer management + if s:tlist_app_name == "winmanager" + return + endif + + " Create a new window. If user prefers a horizontal window, then open + " a horizontally split window. Otherwise open a vertically split + " window + if g:Tlist_Use_Horiz_Window + " Open a horizontally split window + let win_dir = 'botright' + " Horizontal window height + let win_size = g:Tlist_WinHeight + else + if s:tlist_winsize_chgd == -1 + " Open a vertically split window. Increase the window size, if + " needed, to accomodate the new window + if g:Tlist_Inc_Winwidth && + \ &columns < (80 + g:Tlist_WinWidth) + " Save the original window position + let s:tlist_pre_winx = getwinposx() + let s:tlist_pre_winy = getwinposy() + + " one extra column is needed to include the vertical split + let &columns= &columns + g:Tlist_WinWidth + 1 + + let s:tlist_winsize_chgd = 1 + else + let s:tlist_winsize_chgd = 0 + endif + endif + + if g:Tlist_Use_Right_Window + " Open the window at the rightmost place + let win_dir = 'botright vertical' + else + " Open the window at the leftmost place + let win_dir = 'topleft vertical' + endif + let win_size = g:Tlist_WinWidth + endif + + " If the tag listing temporary buffer already exists, then reuse it. + " Otherwise create a new buffer + let bufnum = bufnr(g:TagList_title) + if bufnum == -1 + " Create a new buffer + let wcmd = g:TagList_title + else + " Edit the existing buffer + let wcmd = '+buffer' . bufnum + endif + + " Create the taglist window + exe 'silent! ' . win_dir . ' ' . win_size . 'split ' . wcmd + + " Save the new window position + let s:tlist_winx = getwinposx() + let s:tlist_winy = getwinposy() + + " Initialize the taglist window + call s:Tlist_Window_Init() +endfunction + +" Tlist_Window_Zoom +" Zoom (maximize/minimize) the taglist window +function! s:Tlist_Window_Zoom() + if s:tlist_win_maximized + " Restore the window back to the previous size + if g:Tlist_Use_Horiz_Window + exe 'resize ' . g:Tlist_WinHeight + else + exe 'vert resize ' . g:Tlist_WinWidth + endif + let s:tlist_win_maximized = 0 + else + " Set the window size to the maximum possible without closing other + " windows + if g:Tlist_Use_Horiz_Window + resize + else + vert resize + endif + let s:tlist_win_maximized = 1 + endif +endfunction + +" Tlist_Ballon_Expr +" When the mouse cursor is over a tag in the taglist window, display the +" tag prototype (balloon) +function! Tlist_Ballon_Expr() + " Get the file index + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(v:beval_lnum) + if fidx == -1 + return '' + endif + + " Get the tag output line for the current tag + let tidx = s:Tlist_Window_Get_Tag_Index(fidx, v:beval_lnum) + if tidx == 0 + return '' + endif + + " Get the tag search pattern and display it + return s:Tlist_Get_Tag_Prototype(fidx, tidx) +endfunction + +" Tlist_Window_Check_Width +" Check the width of the taglist window. For horizontally split windows, the +" 'winfixheight' option is used to fix the height of the window. For +" vertically split windows, Vim doesn't support the 'winfixwidth' option. So +" need to handle window width changes from this function. +function! s:Tlist_Window_Check_Width() + let tlist_winnr = bufwinnr(g:TagList_title) + if tlist_winnr == -1 + return + endif + + let width = winwidth(tlist_winnr) + if width != g:Tlist_WinWidth + call s:Tlist_Log_Msg("Tlist_Window_Check_Width: Changing window " . + \ "width from " . width . " to " . g:Tlist_WinWidth) + let save_winnr = winnr() + if save_winnr != tlist_winnr + call s:Tlist_Exe_Cmd_No_Acmds(tlist_winnr . 'wincmd w') + endif + exe 'vert resize ' . g:Tlist_WinWidth + if save_winnr != tlist_winnr + call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + endif + endif +endfunction + +" Tlist_Window_Exit_Only_Window +" If the 'Tlist_Exit_OnlyWindow' option is set, then exit Vim if only the +" taglist window is present. +function! s:Tlist_Window_Exit_Only_Window() + " Before quitting Vim, delete the taglist buffer so that + " the '0 mark is correctly set to the previous buffer. + if v:version < 700 + if winbufnr(2) == -1 + bdelete + quit + endif + else + if winbufnr(2) == -1 + if tabpagenr('$') == 1 + " Only one tag page is present + bdelete + quit + else + " More than one tab page is present. Close only the current + " tab page + close + endif + endif + endif +endfunction + +" Tlist_Window_Init +" Set the default options for the taglist window +function! s:Tlist_Window_Init() + call s:Tlist_Log_Msg('Tlist_Window_Init()') + + " The 'readonly' option should not be set for the taglist buffer. + " If Vim is started as "view/gview" or if the ":view" command is + " used, then the 'readonly' option is set for all the buffers. + " Unset it for the taglist buffer + setlocal noreadonly + + " Set the taglist buffer filetype to taglist + setlocal filetype=taglist + + " Define taglist window element highlighting + syntax match TagListComment '^" .*' + syntax match TagListFileName '^[^" ].*$' + syntax match TagListTitle '^ \S.*$' + syntax match TagListTagScope '\s\[.\{-\}\]$' + + " Define the highlighting only if colors are supported + if has('gui_running') || &t_Co > 2 + " Colors to highlight various taglist window elements + " If user defined highlighting group exists, then use them. + " Otherwise, use default highlight groups. + if hlexists('MyTagListTagName') + highlight link TagListTagName MyTagListTagName + else + highlight default link TagListTagName Search + endif + " Colors to highlight comments and titles + if hlexists('MyTagListComment') + highlight link TagListComment MyTagListComment + else + highlight clear TagListComment + highlight default link TagListComment Comment + endif + if hlexists('MyTagListTitle') + highlight link TagListTitle MyTagListTitle + else + highlight clear TagListTitle + highlight default link TagListTitle Title + endif + if hlexists('MyTagListFileName') + highlight link TagListFileName MyTagListFileName + else + highlight clear TagListFileName + highlight default TagListFileName guibg=Grey ctermbg=darkgray + \ guifg=white ctermfg=white + endif + if hlexists('MyTagListTagScope') + highlight link TagListTagScope MyTagListTagScope + else + highlight clear TagListTagScope + highlight default link TagListTagScope Identifier + endif + else + highlight default TagListTagName term=reverse cterm=reverse + endif + + " Folding related settings + setlocal foldenable + setlocal foldminlines=0 + setlocal foldmethod=manual + setlocal foldlevel=9999 + if g:Tlist_Enable_Fold_Column + setlocal foldcolumn=3 + else + setlocal foldcolumn=0 + endif + setlocal foldtext=v:folddashes.getline(v:foldstart) + + if s:tlist_app_name != "winmanager" + " Mark buffer as scratch + silent! setlocal buftype=nofile + if s:tlist_app_name == "none" + silent! setlocal bufhidden=delete + endif + silent! setlocal noswapfile + " Due to a bug in Vim 6.0, the winbufnr() function fails for unlisted + " buffers. So if the taglist buffer is unlisted, multiple taglist + " windows will be opened. This bug is fixed in Vim 6.1 and above + if v:version >= 601 + silent! setlocal nobuflisted + endif + endif + + silent! setlocal nowrap + + " If the 'number' option is set in the source window, it will affect the + " taglist window. So forcefully disable 'number' option for the taglist + " window + silent! setlocal nonumber + + " Use fixed height when horizontally split window is used + if g:Tlist_Use_Horiz_Window + if v:version >= 602 + set winfixheight + endif + endif + if !g:Tlist_Use_Horiz_Window && v:version >= 700 + set winfixwidth + endif + + " Setup balloon evaluation to display tag prototype + if v:version >= 700 && has('balloon_eval') + setlocal balloonexpr=Tlist_Ballon_Expr() + set ballooneval + endif + + " Setup the cpoptions properly for the maps to work + let old_cpoptions = &cpoptions + set cpoptions&vim + + " Create buffer local mappings for jumping to the tags and sorting the list + nnoremap + \ :call Tlist_Window_Jump_To_Tag('useopen') + nnoremap o + \ :call Tlist_Window_Jump_To_Tag('newwin') + nnoremap p + \ :call Tlist_Window_Jump_To_Tag('preview') + nnoremap P + \ :call Tlist_Window_Jump_To_Tag('prevwin') + if v:version >= 700 + nnoremap t + \ :call Tlist_Window_Jump_To_Tag('checktab') + nnoremap + \ :call Tlist_Window_Jump_To_Tag('newtab') + endif + nnoremap <2-LeftMouse> + \ :call Tlist_Window_Jump_To_Tag('useopen') + nnoremap s + \ :call Tlist_Change_Sort('cmd', 'toggle', '') + nnoremap + :silent! foldopen + nnoremap - :silent! foldclose + nnoremap * :silent! %foldopen! + nnoremap = :silent! %foldclose + nnoremap :silent! foldopen + nnoremap :silent! foldclose + nnoremap :silent! %foldopen! + nnoremap :call Tlist_Window_Show_Info() + nnoremap u :call Tlist_Window_Update_File() + nnoremap d :call Tlist_Remove_File(-1, 1) + nnoremap x :call Tlist_Window_Zoom() + nnoremap [[ :call Tlist_Window_Move_To_File(-1) + nnoremap :call Tlist_Window_Move_To_File(-1) + nnoremap ]] :call Tlist_Window_Move_To_File(1) + nnoremap :call Tlist_Window_Move_To_File(1) + nnoremap :call Tlist_Window_Toggle_Help_Text() + nnoremap q :close + + " Insert mode mappings + inoremap + \ :call Tlist_Window_Jump_To_Tag('useopen') + " Windows needs return + inoremap + \ :call Tlist_Window_Jump_To_Tag('useopen') + inoremap o + \ :call Tlist_Window_Jump_To_Tag('newwin') + inoremap p + \ :call Tlist_Window_Jump_To_Tag('preview') + inoremap P + \ :call Tlist_Window_Jump_To_Tag('prevwin') + if v:version >= 700 + inoremap t + \ :call Tlist_Window_Jump_To_Tag('checktab') + inoremap + \ :call Tlist_Window_Jump_To_Tag('newtab') + endif + inoremap <2-LeftMouse> + \ :call Tlist_Window_Jump_To_Tag('useopen') + inoremap s + \ :call Tlist_Change_Sort('cmd', 'toggle', '') + inoremap + :silent! foldopen + inoremap - :silent! foldclose + inoremap * :silent! %foldopen! + inoremap = :silent! %foldclose + inoremap :silent! foldopen + inoremap :silent! foldclose + inoremap :silent! %foldopen! + inoremap :call + \ Tlist_Window_Show_Info() + inoremap u + \ :call Tlist_Window_Update_File() + inoremap d :call Tlist_Remove_File(-1, 1) + inoremap x :call Tlist_Window_Zoom() + inoremap [[ :call Tlist_Window_Move_To_File(-1) + inoremap :call Tlist_Window_Move_To_File(-1) + inoremap ]] :call Tlist_Window_Move_To_File(1) + inoremap :call Tlist_Window_Move_To_File(1) + inoremap :call Tlist_Window_Toggle_Help_Text() + inoremap q :close + + " Map single left mouse click if the user wants this functionality + if g:Tlist_Use_SingleClick == 1 + " Contributed by Bindu Wavell + " attempt to perform single click mapping, it would be much + " nicer if we could nnoremap ... however vim does + " not fire the when you use the mouse + " to enter a buffer. + let clickmap = ':if bufname("%") =~ "__Tag_List__" ' . + \ 'call Tlist_Window_Jump_To_Tag("useopen") ' . + \ ' endif ' + if maparg('', 'n') == '' + " no mapping for leftmouse + exe ':nnoremap ' . clickmap + else + " we have a mapping + let mapcmd = ':nnoremap ' + let mapcmd = mapcmd . substitute(substitute( + \ maparg('', 'n'), '|', '', 'g'), + \ '\c^', '', '') + let mapcmd = mapcmd . clickmap + exe mapcmd + endif + endif + + " Define the taglist autocommands + augroup TagListAutoCmds + autocmd! + " Display the tag prototype for the tag under the cursor. + autocmd CursorHold __Tag_List__ call s:Tlist_Window_Show_Info() + " Highlight the current tag periodically + autocmd CursorHold * silent call s:Tlist_Window_Highlight_Tag( + \ fnamemodify(bufname('%'), ':p'), line('.'), 1, 0) + + " Adjust the Vim window width when taglist window is closed + autocmd BufUnload __Tag_List__ call s:Tlist_Post_Close_Cleanup() + " Close the fold for this buffer when leaving the buffer + if g:Tlist_File_Fold_Auto_Close + autocmd BufEnter * silent + \ call s:Tlist_Window_Open_File_Fold(expand('')) + endif + " Exit Vim itself if only the taglist window is present (optional) + if g:Tlist_Exit_OnlyWindow + autocmd BufEnter __Tag_List__ nested + \ call s:Tlist_Window_Exit_Only_Window() + endif + if s:tlist_app_name != "winmanager" && + \ !g:Tlist_Process_File_Always && + \ (!has('gui_running') || !g:Tlist_Show_Menu) + " Auto refresh the taglist window + autocmd BufEnter * call s:Tlist_Refresh() + endif + + if !g:Tlist_Use_Horiz_Window + if v:version < 700 + autocmd WinEnter * call s:Tlist_Window_Check_Width() + endif + endif + if v:version >= 700 + autocmd TabEnter * silent call s:Tlist_Refresh_Folds() + endif + augroup end + + " Restore the previous cpoptions settings + let &cpoptions = old_cpoptions +endfunction + +" Tlist_Window_Refresh +" Display the tags for all the files in the taglist window +function! s:Tlist_Window_Refresh() + call s:Tlist_Log_Msg('Tlist_Window_Refresh()') + " Set report option to a huge value to prevent informational messages + " while deleting the lines + let old_report = &report + set report=99999 + + " Mark the buffer as modifiable + setlocal modifiable + + " Delete the contents of the buffer to the black-hole register + silent! %delete _ + + " As we have cleared the taglist window, mark all the files + " as not visible + let i = 0 + while i < s:tlist_file_count + let s:tlist_{i}_visible = 0 + let i = i + 1 + endwhile + + if g:Tlist_Compact_Format == 0 + " Display help in non-compact mode + call s:Tlist_Window_Display_Help() + endif + + " Mark the buffer as not modifiable + setlocal nomodifiable + + " Restore the report option + let &report = old_report + + " If the tags for only one file should be displayed in the taglist + " window, then no need to add the tags here. The bufenter autocommand + " will add the tags for that file. + if g:Tlist_Show_One_File + return + endif + + " List all the tags for the previously processed files + " Do this only if taglist is configured to display tags for more than + " one file. Otherwise, when Tlist_Show_One_File is configured, + " tags for the wrong file will be displayed. + let i = 0 + while i < s:tlist_file_count + call s:Tlist_Window_Refresh_File(s:tlist_{i}_filename, + \ s:tlist_{i}_filetype) + let i = i + 1 + endwhile + + if g:Tlist_Auto_Update + " Add and list the tags for all buffers in the Vim buffer list + let i = 1 + let last_bufnum = bufnr('$') + while i <= last_bufnum + if buflisted(i) + let fname = fnamemodify(bufname(i), ':p') + let ftype = s:Tlist_Get_Buffer_Filetype(i) + " If the file doesn't support tag listing, skip it + if !s:Tlist_Skip_File(fname, ftype) + call s:Tlist_Window_Refresh_File(fname, ftype) + endif + endif + let i = i + 1 + endwhile + endif + + " If Tlist_File_Fold_Auto_Close option is set, then close all the folds + if g:Tlist_File_Fold_Auto_Close + " Close all the folds + silent! %foldclose + endif + + " Move the cursor to the top of the taglist window + normal! gg +endfunction + +" Tlist_Post_Close_Cleanup() +" Close the taglist window and adjust the Vim window width +function! s:Tlist_Post_Close_Cleanup() + call s:Tlist_Log_Msg('Tlist_Post_Close_Cleanup()') + " Mark all the files as not visible + let i = 0 + while i < s:tlist_file_count + let s:tlist_{i}_visible = 0 + let i = i + 1 + endwhile + + " Remove the taglist autocommands + silent! autocmd! TagListAutoCmds + + " Clear all the highlights + match none + + silent! syntax clear TagListTitle + silent! syntax clear TagListComment + silent! syntax clear TagListTagScope + + " Remove the left mouse click mapping if it was setup initially + if g:Tlist_Use_SingleClick + if hasmapto('') + nunmap + endif + endif + + if s:tlist_app_name != "winmanager" + if g:Tlist_Use_Horiz_Window || g:Tlist_Inc_Winwidth == 0 || + \ s:tlist_winsize_chgd != 1 || + \ &columns < (80 + g:Tlist_WinWidth) + " No need to adjust window width if using horizontally split taglist + " window or if columns is less than 101 or if the user chose not to + " adjust the window width + else + " If the user didn't manually move the window, then restore the window + " position to the pre-taglist position + if s:tlist_pre_winx != -1 && s:tlist_pre_winy != -1 && + \ getwinposx() == s:tlist_winx && + \ getwinposy() == s:tlist_winy + exe 'winpos ' . s:tlist_pre_winx . ' ' . s:tlist_pre_winy + endif + + " Adjust the Vim window width + let &columns= &columns - (g:Tlist_WinWidth + 1) + endif + endif + + let s:tlist_winsize_chgd = -1 + + " Reset taglist state variables + if s:tlist_app_name == "winmanager" + let s:tlist_app_name = "none" + endif + let s:tlist_window_initialized = 0 +endfunction + +" Tlist_Window_Refresh_File() +" List the tags defined in the specified file in a Vim window +function! s:Tlist_Window_Refresh_File(filename, ftype) + call s:Tlist_Log_Msg('Tlist_Window_Refresh_File (' . a:filename . ')') + " First check whether the file already exists + let fidx = s:Tlist_Get_File_Index(a:filename) + if fidx != -1 + let file_listed = 1 + else + let file_listed = 0 + endif + + if !file_listed + " Check whether this file is removed based on user request + " If it is, then don't display the tags for this file + if s:Tlist_User_Removed_File(a:filename) + return + endif + endif + + if file_listed && s:tlist_{fidx}_visible + " Check whether the file tags are currently valid + if s:tlist_{fidx}_valid + " Goto the first line in the file + exe s:tlist_{fidx}_start + + " If the line is inside a fold, open the fold + if foldclosed('.') != -1 + exe "silent! " . s:tlist_{fidx}_start . "," . + \ s:tlist_{fidx}_end . "foldopen!" + endif + return + endif + + " Discard and remove the tags for this file from display + call s:Tlist_Discard_TagInfo(fidx) + call s:Tlist_Window_Remove_File_From_Display(fidx) + endif + + " Process and generate a list of tags defined in the file + if !file_listed || !s:tlist_{fidx}_valid + let ret_fidx = s:Tlist_Process_File(a:filename, a:ftype) + if ret_fidx == -1 + return + endif + let fidx = ret_fidx + endif + + " Set report option to a huge value to prevent informational messages + " while adding lines to the taglist window + let old_report = &report + set report=99999 + + if g:Tlist_Show_One_File + " Remove the previous file + if s:tlist_cur_file_idx != -1 + call s:Tlist_Window_Remove_File_From_Display(s:tlist_cur_file_idx) + let s:tlist_{s:tlist_cur_file_idx}_visible = 0 + let s:tlist_{s:tlist_cur_file_idx}_start = 0 + let s:tlist_{s:tlist_cur_file_idx}_end = 0 + endif + let s:tlist_cur_file_idx = fidx + endif + + " Mark the buffer as modifiable + setlocal modifiable + + " Add new files to the end of the window. For existing files, add them at + " the same line where they were previously present. If the file is not + " visible, then add it at the end + if s:tlist_{fidx}_start == 0 || !s:tlist_{fidx}_visible + if g:Tlist_Compact_Format + let s:tlist_{fidx}_start = line('$') + else + let s:tlist_{fidx}_start = line('$') + 1 + endif + endif + + let s:tlist_{fidx}_visible = 1 + + " Goto the line where this file should be placed + if g:Tlist_Compact_Format + exe s:tlist_{fidx}_start + else + exe s:tlist_{fidx}_start - 1 + endif + + let txt = fnamemodify(s:tlist_{fidx}_filename, ':t') . ' (' . + \ fnamemodify(s:tlist_{fidx}_filename, ':p:h') . ')' + if g:Tlist_Compact_Format == 0 + silent! put =txt + else + silent! put! =txt + " Move to the next line + exe line('.') + 1 + endif + let file_start = s:tlist_{fidx}_start + + " Add the tag names grouped by tag type to the buffer with a title + let i = 1 + let ttype_cnt = s:tlist_{a:ftype}_count + while i <= ttype_cnt + let ttype = s:tlist_{a:ftype}_{i}_name + " Add the tag type only if there are tags for that type + let fidx_ttype = 's:tlist_' . fidx . '_' . ttype + let ttype_txt = {fidx_ttype} + if ttype_txt != '' + let txt = ' ' . s:tlist_{a:ftype}_{i}_fullname + if g:Tlist_Compact_Format == 0 + let ttype_start_lnum = line('.') + 1 + silent! put =txt + else + let ttype_start_lnum = line('.') + silent! put! =txt + endif + silent! put =ttype_txt + + let {fidx_ttype}_offset = ttype_start_lnum - file_start + + " create a fold for this tag type + let fold_start = ttype_start_lnum + let fold_end = fold_start + {fidx_ttype}_count + exe fold_start . ',' . fold_end . 'fold' + + " Adjust the cursor position + if g:Tlist_Compact_Format == 0 + exe ttype_start_lnum + {fidx_ttype}_count + else + exe ttype_start_lnum + {fidx_ttype}_count + 1 + endif + + if g:Tlist_Compact_Format == 0 + " Separate the tag types by a empty line + silent! put ='' + endif + endif + let i = i + 1 + endwhile + + if s:tlist_{fidx}_tag_count == 0 + if g:Tlist_Compact_Format == 0 + silent! put ='' + endif + endif + + let s:tlist_{fidx}_end = line('.') - 1 + + " Create a fold for the entire file + exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'fold' + exe 'silent! ' . s:tlist_{fidx}_start . ',' . + \ s:tlist_{fidx}_end . 'foldopen!' + + " Goto the starting line for this file, + exe s:tlist_{fidx}_start + + if s:tlist_app_name == "winmanager" + " To handle a bug in the winmanager plugin, add a space at the + " last line + call setline('$', ' ') + endif + + " Mark the buffer as not modifiable + setlocal nomodifiable + + " Restore the report option + let &report = old_report + + " Update the start and end line numbers for all the files following this + " file + let start = s:tlist_{fidx}_start + " include the empty line after the last line + if g:Tlist_Compact_Format + let end = s:tlist_{fidx}_end + else + let end = s:tlist_{fidx}_end + 1 + endif + call s:Tlist_Window_Update_Line_Offsets(fidx + 1, 1, end - start + 1) + + " Now that we have updated the taglist window, update the tags + " menu (if present) + if g:Tlist_Show_Menu + call s:Tlist_Menu_Update_File(1) + endif +endfunction + +" Tlist_Init_File +" Initialize the variables for a new file +function! s:Tlist_Init_File(filename, ftype) + call s:Tlist_Log_Msg('Tlist_Init_File (' . a:filename . ')') + " Add new files at the end of the list + let fidx = s:tlist_file_count + let s:tlist_file_count = s:tlist_file_count + 1 + " Add the new file name to the taglist list of file names + let s:tlist_file_names = s:tlist_file_names . a:filename . "\n" + + " Initialize the file variables + let s:tlist_{fidx}_filename = a:filename + let s:tlist_{fidx}_sort_type = g:Tlist_Sort_Type + let s:tlist_{fidx}_filetype = a:ftype + let s:tlist_{fidx}_mtime = -1 + let s:tlist_{fidx}_start = 0 + let s:tlist_{fidx}_end = 0 + let s:tlist_{fidx}_valid = 0 + let s:tlist_{fidx}_visible = 0 + let s:tlist_{fidx}_tag_count = 0 + let s:tlist_{fidx}_menu_cmd = '' + + " Initialize the tag type variables + let i = 1 + while i <= s:tlist_{a:ftype}_count + let ttype = s:tlist_{a:ftype}_{i}_name + let s:tlist_{fidx}_{ttype} = '' + let s:tlist_{fidx}_{ttype}_offset = 0 + let s:tlist_{fidx}_{ttype}_count = 0 + let i = i + 1 + endwhile + + return fidx +endfunction + +" Tlist_Get_Tag_Type_By_Tag +" Return the tag type for the specified tag index +function! s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) + let ttype_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_type' + + " Already parsed and have the tag name + if exists(ttype_var) + return {ttype_var} + endif + + let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag + let {ttype_var} = s:Tlist_Extract_Tagtype(tag_line) + + return {ttype_var} +endfunction + +" Tlist_Get_Tag_Prototype +function! s:Tlist_Get_Tag_Prototype(fidx, tidx) + let tproto_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_proto' + + " Already parsed and have the tag prototype + if exists(tproto_var) + return {tproto_var} + endif + + " Parse and extract the tag prototype + let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag + let start = stridx(tag_line, '/^') + 2 + let end = stridx(tag_line, '/;"' . "\t") + if tag_line[end - 1] == '$' + let end = end -1 + endif + let tag_proto = strpart(tag_line, start, end - start) + let {tproto_var} = substitute(tag_proto, '\s*', '', '') + + return {tproto_var} +endfunction + +" Tlist_Get_Tag_SearchPat +function! s:Tlist_Get_Tag_SearchPat(fidx, tidx) + let tpat_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_searchpat' + + " Already parsed and have the tag search pattern + if exists(tpat_var) + return {tpat_var} + endif + + " Parse and extract the tag search pattern + let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag + let start = stridx(tag_line, '/^') + 2 + let end = stridx(tag_line, '/;"' . "\t") + if tag_line[end - 1] == '$' + let end = end -1 + endif + let {tpat_var} = '\V\^' . strpart(tag_line, start, end - start) . + \ (tag_line[end] == '$' ? '\$' : '') + + return {tpat_var} +endfunction + +" Tlist_Get_Tag_Linenum +" Return the tag line number, given the tag index +function! s:Tlist_Get_Tag_Linenum(fidx, tidx) + let tline_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_linenum' + + " Already parsed and have the tag line number + if exists(tline_var) + return {tline_var} + endif + + " Parse and extract the tag line number + let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag + let start = strridx(tag_line, 'line:') + 5 + let end = strridx(tag_line, "\t") + if end < start + let {tline_var} = strpart(tag_line, start) + 0 + else + let {tline_var} = strpart(tag_line, start, end - start) + 0 + endif + + return {tline_var} +endfunction + +" Tlist_Parse_Tagline +" Parse a tag line from the ctags output. Separate the tag output based on the +" tag type and store it in the tag type variable. +" The format of each line in the ctags output is: +" +" tag_namefile_nameex_cmd;"extension_fields +" +function! s:Tlist_Parse_Tagline(tag_line) + if a:tag_line == '' + " Skip empty lines + return + endif + + " Extract the tag type + let ttype = s:Tlist_Extract_Tagtype(a:tag_line) + + " Make sure the tag type is a valid and supported one + if ttype == '' || stridx(s:ctags_flags, ttype) == -1 + " Line is not in proper tags format or Tag type is not supported + return + endif + + " Update the total tag count + let s:tidx = s:tidx + 1 + + " The following variables are used to optimize this code. Vim is slow in + " using curly brace names. To reduce the amount of processing needed, the + " curly brace variables are pre-processed here + let fidx_tidx = 's:tlist_' . s:fidx . '_' . s:tidx + let fidx_ttype = 's:tlist_' . s:fidx . '_' . ttype + + " Update the count of this tag type + let ttype_idx = {fidx_ttype}_count + 1 + let {fidx_ttype}_count = ttype_idx + + " Store the ctags output for this tag + let {fidx_tidx}_tag = a:tag_line + + " Store the tag index and the tag type index (back pointers) + let {fidx_ttype}_{ttype_idx} = s:tidx + let {fidx_tidx}_ttype_idx = ttype_idx + + " Extract the tag name + let tag_name = strpart(a:tag_line, 0, stridx(a:tag_line, "\t")) + + " Extract the tag scope/prototype + if g:Tlist_Display_Prototype + let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(s:fidx, s:tidx) + else + let ttxt = ' ' . tag_name + + " Add the tag scope, if it is available and is configured. Tag + " scope is the last field after the 'line:\t' field + if g:Tlist_Display_Tag_Scope + let tag_scope = s:Tlist_Extract_Tag_Scope(a:tag_line) + if tag_scope != '' + let ttxt = ttxt . ' [' . tag_scope . ']' + endif + endif + endif + + " Add this tag to the tag type variable + let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" + + " Save the tag name + let {fidx_tidx}_tag_name = tag_name +endfunction + +" Tlist_Process_File +" Get the list of tags defined in the specified file and store them +" in Vim variables. Returns the file index where the tags are stored. +function! s:Tlist_Process_File(filename, ftype) + call s:Tlist_Log_Msg('Tlist_Process_File (' . a:filename . ', ' . + \ a:ftype . ')') + " Check whether this file is supported + if s:Tlist_Skip_File(a:filename, a:ftype) + return -1 + endif + + " If the tag types for this filetype are not yet created, then create + " them now + let var = 's:tlist_' . a:ftype . '_count' + if !exists(var) + if s:Tlist_FileType_Init(a:ftype) == 0 + return -1 + endif + endif + + " If this file is already processed, then use the cached values + let fidx = s:Tlist_Get_File_Index(a:filename) + if fidx == -1 + " First time, this file is loaded + let fidx = s:Tlist_Init_File(a:filename, a:ftype) + else + " File was previously processed. Discard the tag information + call s:Tlist_Discard_TagInfo(fidx) + endif + + let s:tlist_{fidx}_valid = 1 + + " Exuberant ctags arguments to generate a tag list + let ctags_args = ' -f - --format=2 --excmd=pattern --fields=nks ' + + " Form the ctags argument depending on the sort type + if s:tlist_{fidx}_sort_type == 'name' + let ctags_args = ctags_args . '--sort=yes' + else + let ctags_args = ctags_args . '--sort=no' + endif + + " Add the filetype specific arguments + let ctags_args = ctags_args . ' ' . s:tlist_{a:ftype}_ctags_args + + " Ctags command to produce output with regexp for locating the tags + let ctags_cmd = g:Tlist_Ctags_Cmd . ctags_args + let ctags_cmd = ctags_cmd . ' "' . a:filename . '"' + + if &shellxquote == '"' + " Double-quotes within double-quotes will not work in the + " command-line.If the 'shellxquote' option is set to double-quotes, + " then escape the double-quotes in the ctags command-line. + let ctags_cmd = escape(ctags_cmd, '"') + endif + + " In Windows 95, if not using cygwin, disable the 'shellslash' + " option. Otherwise, this will cause problems when running the + " ctags command. + if has('win95') && !has('win32unix') + let old_shellslash = &shellslash + set noshellslash + endif + + if has('win32') && !has('win32unix') && !has('win95') + \ && (&shell =~ 'cmd.exe') + " Windows does not correctly deal with commands that have more than 1 + " set of double quotes. It will strip them all resulting in: + " 'C:\Program' is not recognized as an internal or external command + " operable program or batch file. To work around this, place the + " command inside a batch file and call the batch file. + " Do this only on Win2K, WinXP and above. + " Contributed by: David Fishburn. + let s:taglist_tempfile = fnamemodify(tempname(), ':h') . + \ '\taglist.cmd' + exe 'redir! > ' . s:taglist_tempfile + silent echo ctags_cmd + redir END + + call s:Tlist_Log_Msg('Cmd inside batch file: ' . ctags_cmd) + let ctags_cmd = '"' . s:taglist_tempfile . '"' + endif + + call s:Tlist_Log_Msg('Cmd: ' . ctags_cmd) + + " Run ctags and get the tag list + let cmd_output = system(ctags_cmd) + + " Restore the value of the 'shellslash' option. + if has('win95') && !has('win32unix') + let &shellslash = old_shellslash + endif + + if exists('s:taglist_tempfile') + " Delete the temporary cmd file created on MS-Windows + call delete(s:taglist_tempfile) + endif + + " Handle errors + if v:shell_error + let msg = "Taglist: Failed to generate tags for " . a:filename + call s:Tlist_Warning_Msg(msg) + if cmd_output != '' + call s:Tlist_Warning_Msg(cmd_output) + endif + return fidx + endif + + " Store the modification time for the file + let s:tlist_{fidx}_mtime = getftime(a:filename) + + " No tags for current file + if cmd_output == '' + call s:Tlist_Log_Msg('No tags defined in ' . a:filename) + return fidx + endif + + call s:Tlist_Log_Msg('Generated tags information for ' . a:filename) + + if v:version > 601 + " The following script local variables are used by the + " Tlist_Parse_Tagline() function. + let s:ctags_flags = s:tlist_{a:ftype}_ctags_flags + let s:fidx = fidx + let s:tidx = 0 + + " Process the ctags output one line at a time. The substitute() + " command is used to parse the tag lines instead of using the + " matchstr()/stridx()/strpart() functions for performance reason + call substitute(cmd_output, "\\([^\n]\\+\\)\n", + \ '\=s:Tlist_Parse_Tagline(submatch(1))', 'g') + + " Save the number of tags for this file + let s:tlist_{fidx}_tag_count = s:tidx + + " The following script local variables are no longer needed + unlet! s:ctags_flags + unlet! s:tidx + unlet! s:fidx + else + " Due to a bug in Vim earlier than version 6.1, + " we cannot use substitute() to parse the ctags output. + " Instead the slow str*() functions are used + let ctags_flags = s:tlist_{a:ftype}_ctags_flags + let tidx = 0 + + while cmd_output != '' + " Extract one line at a time + let idx = stridx(cmd_output, "\n") + let one_line = strpart(cmd_output, 0, idx) + " Remove the line from the tags output + let cmd_output = strpart(cmd_output, idx + 1) + + if one_line == '' + " Line is not in proper tags format + continue + endif + + " Extract the tag type + let ttype = s:Tlist_Extract_Tagtype(one_line) + + " Make sure the tag type is a valid and supported one + if ttype == '' || stridx(ctags_flags, ttype) == -1 + " Line is not in proper tags format or Tag type is not + " supported + continue + endif + + " Update the total tag count + let tidx = tidx + 1 + + " The following variables are used to optimize this code. Vim is + " slow in using curly brace names. To reduce the amount of + " processing needed, the curly brace variables are pre-processed + " here + let fidx_tidx = 's:tlist_' . fidx . '_' . tidx + let fidx_ttype = 's:tlist_' . fidx . '_' . ttype + + " Update the count of this tag type + let ttype_idx = {fidx_ttype}_count + 1 + let {fidx_ttype}_count = ttype_idx + + " Store the ctags output for this tag + let {fidx_tidx}_tag = one_line + + " Store the tag index and the tag type index (back pointers) + let {fidx_ttype}_{ttype_idx} = tidx + let {fidx_tidx}_ttype_idx = ttype_idx + + " Extract the tag name + let tag_name = strpart(one_line, 0, stridx(one_line, "\t")) + + " Extract the tag scope/prototype + if g:Tlist_Display_Prototype + let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(fidx, tidx) + else + let ttxt = ' ' . tag_name + + " Add the tag scope, if it is available and is configured. Tag + " scope is the last field after the 'line:\t' field + if g:Tlist_Display_Tag_Scope + let tag_scope = s:Tlist_Extract_Tag_Scope(one_line) + if tag_scope != '' + let ttxt = ttxt . ' [' . tag_scope . ']' + endif + endif + endif + + " Add this tag to the tag type variable + let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" + + " Save the tag name + let {fidx_tidx}_tag_name = tag_name + endwhile + + " Save the number of tags for this file + let s:tlist_{fidx}_tag_count = tidx + endif + + call s:Tlist_Log_Msg('Processed ' . s:tlist_{fidx}_tag_count . + \ ' tags in ' . a:filename) + + return fidx +endfunction + +" Tlist_Update_File +" Update the tags for a file (if needed) +function! Tlist_Update_File(filename, ftype) + call s:Tlist_Log_Msg('Tlist_Update_File (' . a:filename . ')') + " If the file doesn't support tag listing, skip it + if s:Tlist_Skip_File(a:filename, a:ftype) + return + endif + + " Convert the file name to a full path + let fname = fnamemodify(a:filename, ':p') + + " First check whether the file already exists + let fidx = s:Tlist_Get_File_Index(fname) + + if fidx != -1 && s:tlist_{fidx}_valid + " File exists and the tags are valid + " Check whether the file was modified after the last tags update + " If it is modified, then update the tags + if s:tlist_{fidx}_mtime == getftime(fname) + return + endif + else + " If the tags were removed previously based on a user request, + " as we are going to update the tags (based on the user request), + " remove the filename from the deleted list + call s:Tlist_Update_Remove_List(fname, 0) + endif + + " If the taglist window is opened, update it + let winnum = bufwinnr(g:TagList_title) + if winnum == -1 + " Taglist window is not present. Just update the taglist + " and return + call s:Tlist_Process_File(fname, a:ftype) + else + if g:Tlist_Show_One_File && s:tlist_cur_file_idx != -1 + " If tags for only one file are displayed and we are not + " updating the tags for that file, then no need to + " refresh the taglist window. Otherwise, the taglist + " window should be updated. + if s:tlist_{s:tlist_cur_file_idx}_filename != fname + call s:Tlist_Process_File(fname, a:ftype) + return + endif + endif + + " Save the current window number + let save_winnr = winnr() + + " Goto the taglist window + call s:Tlist_Window_Goto_Window() + + " Save the cursor position + let save_line = line('.') + let save_col = col('.') + + " Update the taglist window + call s:Tlist_Window_Refresh_File(fname, a:ftype) + + " Restore the cursor position + if v:version >= 601 + call cursor(save_line, save_col) + else + exe save_line + exe 'normal! ' . save_col . '|' + endif + + if winnr() != save_winnr + " Go back to the original window + call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') + endif + endif + + " Update the taglist menu + if g:Tlist_Show_Menu + call s:Tlist_Menu_Update_File(1) + endif +endfunction + +" Tlist_Window_Close +" Close the taglist window +function! s:Tlist_Window_Close() + call s:Tlist_Log_Msg('Tlist_Window_Close()') + " Make sure the taglist window exists + let winnum = bufwinnr(g:TagList_title) + if winnum == -1 + call s:Tlist_Warning_Msg('Error: Taglist window is not open') + return + endif + + if winnr() == winnum + " Already in the taglist window. Close it and return + if winbufnr(2) != -1 + " If a window other than the taglist window is open, + " then only close the taglist window. + close + endif + else + " Goto the taglist window, close it and then come back to the + " original window + let curbufnr = bufnr('%') + exe winnum . 'wincmd w' + close + " Need to jump back to the original window only if we are not + " already in that window + let winnum = bufwinnr(curbufnr) + if winnr() != winnum + exe winnum . 'wincmd w' + endif + endif +endfunction + +" Tlist_Window_Mark_File_Window +" Mark the current window as the file window to use when jumping to a tag. +" Only if the current window is a non-plugin, non-preview and non-taglist +" window +function! s:Tlist_Window_Mark_File_Window() + if getbufvar('%', '&buftype') == '' && !&previewwindow + let w:tlist_file_window = "yes" + endif +endfunction + +" Tlist_Window_Open +" Open and refresh the taglist window +function! s:Tlist_Window_Open() + call s:Tlist_Log_Msg('Tlist_Window_Open()') + " If the window is open, jump to it + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + " Jump to the existing window + if winnr() != winnum + exe winnum . 'wincmd w' + endif + return + endif + + if s:tlist_app_name == "winmanager" + " Taglist plugin is no longer part of the winmanager app + let s:tlist_app_name = "none" + endif + + " Get the filename and filetype for the specified buffer + let curbuf_name = fnamemodify(bufname('%'), ':p') + let curbuf_ftype = s:Tlist_Get_Buffer_Filetype('%') + let cur_lnum = line('.') + + " Mark the current window as the desired window to open a file when a tag + " is selected. + call s:Tlist_Window_Mark_File_Window() + + " Open the taglist window + call s:Tlist_Window_Create() + + call s:Tlist_Window_Refresh() + + if g:Tlist_Show_One_File + " Add only the current buffer and file + " + " If the file doesn't support tag listing, skip it + if !s:Tlist_Skip_File(curbuf_name, curbuf_ftype) + call s:Tlist_Window_Refresh_File(curbuf_name, curbuf_ftype) + endif + endif + + if g:Tlist_File_Fold_Auto_Close + " Open the fold for the current file, as all the folds in + " the taglist window are closed + let fidx = s:Tlist_Get_File_Index(curbuf_name) + if fidx != -1 + exe "silent! " . s:tlist_{fidx}_start . "," . + \ s:tlist_{fidx}_end . "foldopen!" + endif + endif + + " Highlight the current tag + call s:Tlist_Window_Highlight_Tag(curbuf_name, cur_lnum, 1, 1) +endfunction + +" Tlist_Window_Toggle() +" Open or close a taglist window +function! s:Tlist_Window_Toggle() + call s:Tlist_Log_Msg('Tlist_Window_Toggle()') + " If taglist window is open then close it. + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + call s:Tlist_Window_Close() + return + endif + + call s:Tlist_Window_Open() + + " Go back to the original window, if Tlist_GainFocus_On_ToggleOpen is not + " set + if !g:Tlist_GainFocus_On_ToggleOpen + call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + endif + + " Update the taglist menu + if g:Tlist_Show_Menu + call s:Tlist_Menu_Update_File(0) + endif +endfunction + +" Tlist_Process_Filelist +" Process multiple files. Each filename is separated by "\n" +" Returns the number of processed files +function! s:Tlist_Process_Filelist(file_names) + let flist = a:file_names + + " Enable lazy screen updates + let old_lazyredraw = &lazyredraw + set lazyredraw + + " Keep track of the number of processed files + let fcnt = 0 + + " Process one file at a time + while flist != '' + let nl_idx = stridx(flist, "\n") + let one_file = strpart(flist, 0, nl_idx) + + " Remove the filename from the list + let flist = strpart(flist, nl_idx + 1) + + if one_file == '' + continue + endif + + " Skip directories + if isdirectory(one_file) + continue + endif + + let ftype = s:Tlist_Detect_Filetype(one_file) + + echon "\r " + echon "\rProcessing tags for " . fnamemodify(one_file, ':p:t') + + let fcnt = fcnt + 1 + + call Tlist_Update_File(one_file, ftype) + endwhile + + " Clear the displayed informational messages + echon "\r " + + " Restore the previous state + let &lazyredraw = old_lazyredraw + + return fcnt +endfunction + +" Tlist_Process_Dir +" Process the files in a directory matching the specified pattern +function! s:Tlist_Process_Dir(dir_name, pat) + let flist = glob(a:dir_name . '/' . a:pat) . "\n" + + let fcnt = s:Tlist_Process_Filelist(flist) + + let len = strlen(a:dir_name) + if a:dir_name[len - 1] == '\' || a:dir_name[len - 1] == '/' + let glob_expr = a:dir_name . '*' + else + let glob_expr = a:dir_name . '/*' + endif + let all_files = glob(glob_expr) . "\n" + + while all_files != '' + let nl_idx = stridx(all_files, "\n") + let one_file = strpart(all_files, 0, nl_idx) + + let all_files = strpart(all_files, nl_idx + 1) + if one_file == '' + continue + endif + + " Skip non-directory names + if !isdirectory(one_file) + continue + endif + + echon "\r " + echon "\rProcessing files in directory " . fnamemodify(one_file, ':t') + let fcnt = fcnt + s:Tlist_Process_Dir(one_file, a:pat) + endwhile + + return fcnt +endfunction + +" Tlist_Add_Files_Recursive +" Add files recursively from a directory +function! s:Tlist_Add_Files_Recursive(dir, ...) + let dir_name = fnamemodify(a:dir, ':p') + if !isdirectory(dir_name) + call s:Tlist_Warning_Msg('Error: ' . dir_name . ' is not a directory') + return + endif + + if a:0 == 1 + " User specified file pattern + let pat = a:1 + else + " Default file pattern + let pat = '*' + endif + + echon "\r " + echon "\rProcessing files in directory " . fnamemodify(dir_name, ':t') + let fcnt = s:Tlist_Process_Dir(dir_name, pat) + + echon "\rAdded " . fcnt . " files to the taglist" +endfunction + +" Tlist_Add_Files +" Add the specified list of files to the taglist +function! s:Tlist_Add_Files(...) + let flist = '' + let i = 1 + + " Get all the files matching the file patterns supplied as argument + while i <= a:0 + let flist = flist . glob(a:{i}) . "\n" + let i = i + 1 + endwhile + + if flist == '' + call s:Tlist_Warning_Msg('Error: No matching files are found') + return + endif + + let fcnt = s:Tlist_Process_Filelist(flist) + echon "\rAdded " . fcnt . " files to the taglist" +endfunction + +" Tlist_Extract_Tagtype +" Extract the tag type from the tag text +function! s:Tlist_Extract_Tagtype(tag_line) + " The tag type is after the tag prototype field. The prototype field + " ends with the /;"\t string. We add 4 at the end to skip the characters + " in this special string.. + let start = strridx(a:tag_line, '/;"' . "\t") + 4 + let end = strridx(a:tag_line, 'line:') - 1 + let ttype = strpart(a:tag_line, start, end - start) + + return ttype +endfunction + +" Tlist_Extract_Tag_Scope +" Extract the tag scope from the tag text +function! s:Tlist_Extract_Tag_Scope(tag_line) + let start = strridx(a:tag_line, 'line:') + let end = strridx(a:tag_line, "\t") + if end <= start + return '' + endif + + let tag_scope = strpart(a:tag_line, end + 1) + let tag_scope = strpart(tag_scope, stridx(tag_scope, ':') + 1) + + return tag_scope +endfunction + +" Tlist_Refresh() +" Refresh the taglist +function! s:Tlist_Refresh() + call s:Tlist_Log_Msg('Tlist_Refresh (Skip_Refresh = ' . + \ s:Tlist_Skip_Refresh . ', ' . bufname('%') . ')') + " If we are entering the buffer from one of the taglist functions, then + " no need to refresh the taglist window again. + if s:Tlist_Skip_Refresh + " We still need to update the taglist menu + if g:Tlist_Show_Menu + call s:Tlist_Menu_Update_File(0) + endif + return + endif + + " If part of the winmanager plugin and not configured to process + " tags always and not configured to display the tags menu, then return + if (s:tlist_app_name == 'winmanager') && !g:Tlist_Process_File_Always + \ && !g:Tlist_Show_Menu + return + endif + + " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help + if &buftype != '' + return + endif + + let filename = fnamemodify(bufname('%'), ':p') + let ftype = s:Tlist_Get_Buffer_Filetype('%') + + " If the file doesn't support tag listing, skip it + if s:Tlist_Skip_File(filename, ftype) + return + endif + + let tlist_win = bufwinnr(g:TagList_title) + + " If the taglist window is not opened and not configured to process + " tags always and not displaying the tags menu, then return + if tlist_win == -1 && !g:Tlist_Process_File_Always && !g:Tlist_Show_Menu + return + endif + + let fidx = s:Tlist_Get_File_Index(filename) + if fidx == -1 + " Check whether this file is removed based on user request + " If it is, then don't display the tags for this file + if s:Tlist_User_Removed_File(filename) + return + endif + + " If the taglist should not be auto updated, then return + if !g:Tlist_Auto_Update + return + endif + endif + + let cur_lnum = line('.') + + if fidx == -1 + " Update the tags for the file + let fidx = s:Tlist_Process_File(filename, ftype) + else + let mtime = getftime(filename) + if s:tlist_{fidx}_mtime != mtime + " Invalidate the tags listed for this file + let s:tlist_{fidx}_valid = 0 + + " Update the taglist and the window + call Tlist_Update_File(filename, ftype) + + " Store the new file modification time + let s:tlist_{fidx}_mtime = mtime + endif + endif + + " Update the taglist window + if tlist_win != -1 + " Disable screen updates + let old_lazyredraw = &lazyredraw + set nolazyredraw + + " Save the current window number + let save_winnr = winnr() + + " Goto the taglist window + call s:Tlist_Window_Goto_Window() + + if !g:Tlist_Auto_Highlight_Tag || !g:Tlist_Highlight_Tag_On_BufEnter + " Save the cursor position + let save_line = line('.') + let save_col = col('.') + endif + + " Update the taglist window + call s:Tlist_Window_Refresh_File(filename, ftype) + + " Open the fold for the file + exe "silent! " . s:tlist_{fidx}_start . "," . + \ s:tlist_{fidx}_end . "foldopen!" + + if g:Tlist_Highlight_Tag_On_BufEnter && g:Tlist_Auto_Highlight_Tag + if g:Tlist_Show_One_File && s:tlist_cur_file_idx != fidx + " If displaying tags for only one file in the taglist + " window and about to display the tags for a new file, + " then center the current tag line for the new file + let center_tag_line = 1 + else + let center_tag_line = 0 + endif + + " Highlight the current tag + call s:Tlist_Window_Highlight_Tag(filename, cur_lnum, 1, center_tag_line) + else + " Restore the cursor position + if v:version >= 601 + call cursor(save_line, save_col) + else + exe save_line + exe 'normal! ' . save_col . '|' + endif + endif + + " Jump back to the original window + if save_winnr != winnr() + call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') + endif + + " Restore screen updates + let &lazyredraw = old_lazyredraw + endif + + " Update the taglist menu + if g:Tlist_Show_Menu + call s:Tlist_Menu_Update_File(0) + endif +endfunction + +" Tlist_Change_Sort() +" Change the sort order of the tag listing +" caller == 'cmd', command used in the taglist window +" caller == 'menu', taglist menu +" action == 'toggle', toggle sort from name to order and vice versa +" action == 'set', set the sort order to sort_type +function! s:Tlist_Change_Sort(caller, action, sort_type) + call s:Tlist_Log_Msg('Tlist_Change_Sort (caller = ' . a:caller . + \ ', action = ' . a:action . ', sort_type = ' . a:sort_type . ')') + if a:caller == 'cmd' + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) + if fidx == -1 + return + endif + + " Remove the previous highlighting + match none + elseif a:caller == 'menu' + let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) + if fidx == -1 + return + endif + endif + + if a:action == 'toggle' + let sort_type = s:tlist_{fidx}_sort_type + + " Toggle the sort order from 'name' to 'order' and vice versa + if sort_type == 'name' + let s:tlist_{fidx}_sort_type = 'order' + else + let s:tlist_{fidx}_sort_type = 'name' + endif + else + let s:tlist_{fidx}_sort_type = a:sort_type + endif + + " Invalidate the tags listed for this file + let s:tlist_{fidx}_valid = 0 + + if a:caller == 'cmd' + " Save the current line for later restoration + let curline = '\V\^' . getline('.') . '\$' + + call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, + \ s:tlist_{fidx}_filetype) + + exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' + + " Go back to the cursor line before the tag list is sorted + call search(curline, 'w') + + call s:Tlist_Menu_Update_File(1) + else + call s:Tlist_Menu_Remove_File() + + call s:Tlist_Refresh() + endif +endfunction + +" Tlist_Update_Current_File() +" Update taglist for the current buffer by regenerating the tag list +" Contributed by WEN Guopeng. +function! s:Tlist_Update_Current_File() + call s:Tlist_Log_Msg('Tlist_Update_Current_File()') + if winnr() == bufwinnr(g:TagList_title) + " In the taglist window. Update the current file + call s:Tlist_Window_Update_File() + else + " Not in the taglist window. Update the current buffer + let filename = fnamemodify(bufname('%'), ':p') + let fidx = s:Tlist_Get_File_Index(filename) + if fidx != -1 + let s:tlist_{fidx}_valid = 0 + endif + let ft = s:Tlist_Get_Buffer_Filetype('%') + call Tlist_Update_File(filename, ft) + endif +endfunction + +" Tlist_Window_Update_File() +" Update the tags displayed in the taglist window +function! s:Tlist_Window_Update_File() + call s:Tlist_Log_Msg('Tlist_Window_Update_File()') + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) + if fidx == -1 + return + endif + + " Remove the previous highlighting + match none + + " Save the current line for later restoration + let curline = '\V\^' . getline('.') . '\$' + + let s:tlist_{fidx}_valid = 0 + + " Update the taglist window + call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, + \ s:tlist_{fidx}_filetype) + + exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' + + " Go back to the tag line before the list is updated + call search(curline, 'w') +endfunction + +" Tlist_Window_Get_Tag_Type_By_Linenum() +" Return the tag type index for the specified line in the taglist window +function! s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum) + let ftype = s:tlist_{a:fidx}_filetype + + " Determine to which tag type the current line number belongs to using the + " tag type start line number and the number of tags in a tag type + let i = 1 + while i <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{i}_name + let start_lnum = + \ s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset + let end = start_lnum + s:tlist_{a:fidx}_{ttype}_count + if a:lnum >= start_lnum && a:lnum <= end + break + endif + let i = i + 1 + endwhile + + " Current line doesn't belong to any of the displayed tag types + if i > s:tlist_{ftype}_count + return '' + endif + + return ttype +endfunction + +" Tlist_Window_Get_Tag_Index() +" Return the tag index for the specified line in the taglist window +function! s:Tlist_Window_Get_Tag_Index(fidx, lnum) + let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(a:fidx, a:lnum) + + " Current line doesn't belong to any of the displayed tag types + if ttype == '' + return 0 + endif + + " Compute the index into the displayed tags for the tag type + let ttype_lnum = s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset + let tidx = a:lnum - ttype_lnum + if tidx == 0 + return 0 + endif + + " Get the corresponding tag line and return it + return s:tlist_{a:fidx}_{ttype}_{tidx} +endfunction + +" Tlist_Window_Highlight_Line +" Highlight the current line +function! s:Tlist_Window_Highlight_Line() + " Clear previously selected name + match none + + " Highlight the current line + if g:Tlist_Display_Prototype == 0 + let pat = '/\%' . line('.') . 'l\s\+\zs.*/' + else + let pat = '/\%' . line('.') . 'l.*/' + endif + + exe 'match TagListTagName ' . pat +endfunction + +" Tlist_Window_Open_File +" Open the specified file in either a new window or an existing window +" and place the cursor at the specified tag pattern +function! s:Tlist_Window_Open_File(win_ctrl, filename, tagpat) + call s:Tlist_Log_Msg('Tlist_Window_Open_File (' . a:filename . ',' . + \ a:win_ctrl . ')') + let prev_Tlist_Skip_Refresh = s:Tlist_Skip_Refresh + let s:Tlist_Skip_Refresh = 1 + + if s:tlist_app_name == "winmanager" + " Let the winmanager edit the file + call WinManagerFileEdit(a:filename, a:win_ctrl == 'newwin') + else + + if a:win_ctrl == 'newtab' + " Create a new tab + exe 'tabnew ' . escape(a:filename, ' ') + " Open the taglist window in the new tab + call s:Tlist_Window_Open() + endif + + if a:win_ctrl == 'checktab' + " Check whether the file is present in any of the tabs. + " If the file is present in the current tab, then use the + " current tab. + if bufwinnr(a:filename) != -1 + let file_present_in_tab = 1 + let i = tabpagenr() + else + let i = 1 + let bnum = bufnr(a:filename) + let file_present_in_tab = 0 + while i <= tabpagenr('$') + if index(tabpagebuflist(i), bnum) != -1 + let file_present_in_tab = 1 + break + endif + let i += 1 + endwhile + endif + + if file_present_in_tab + " Goto the tab containing the file + exe 'tabnext ' . i + else + " Open a new tab + exe 'tabnew ' . escape(a:filename, ' ') + + " Open the taglist window + call s:Tlist_Window_Open() + endif + endif + + let winnum = -1 + if a:win_ctrl == 'prevwin' + " Open the file in the previous window, if it is usable + let cur_win = winnr() + wincmd p + if &buftype == '' && !&previewwindow + exe "edit " . escape(a:filename, ' ') + let winnum = winnr() + else + " Previous window is not usable + exe cur_win . 'wincmd w' + endif + endif + + " Goto the window containing the file. If the window is not there, open a + " new window + if winnum == -1 + let winnum = bufwinnr(a:filename) + endif + + if winnum == -1 + " Locate the previously used window for opening a file + let fwin_num = 0 + let first_usable_win = 0 + + let i = 1 + let bnum = winbufnr(i) + while bnum != -1 + if getwinvar(i, 'tlist_file_window') == 'yes' + let fwin_num = i + break + endif + if first_usable_win == 0 && + \ getbufvar(bnum, '&buftype') == '' && + \ !getwinvar(i, '&previewwindow') + " First non-taglist, non-plugin and non-preview window + let first_usable_win = i + endif + let i = i + 1 + let bnum = winbufnr(i) + endwhile + + " If a previously used window is not found, then use the first + " non-taglist window + if fwin_num == 0 + let fwin_num = first_usable_win + endif + + if fwin_num != 0 + " Jump to the file window + exe fwin_num . "wincmd w" + + " If the user asked to jump to the tag in a new window, then split + " the existing window into two. + if a:win_ctrl == 'newwin' + split + endif + exe "edit " . escape(a:filename, ' ') + else + " Open a new window + if g:Tlist_Use_Horiz_Window + exe 'leftabove split ' . escape(a:filename, ' ') + else + if winbufnr(2) == -1 + " Only the taglist window is present + if g:Tlist_Use_Right_Window + exe 'leftabove vertical split ' . + \ escape(a:filename, ' ') + else + exe 'rightbelow vertical split ' . + \ escape(a:filename, ' ') + endif + + " Go to the taglist window to change the window size to + " the user configured value + call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + if g:Tlist_Use_Horiz_Window + exe 'resize ' . g:Tlist_WinHeight + else + exe 'vertical resize ' . g:Tlist_WinWidth + endif + " Go back to the file window + call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + else + " A plugin or help window is also present + wincmd w + exe 'leftabove split ' . escape(a:filename, ' ') + endif + endif + endif + " Mark the window, so that it can be reused. + call s:Tlist_Window_Mark_File_Window() + else + if v:version >= 700 + " If the file is opened in more than one window, then check + " whether the last accessed window has the selected file. + " If it does, then use that window. + let lastwin_bufnum = winbufnr(winnr('#')) + if bufnr(a:filename) == lastwin_bufnum + let winnum = winnr('#') + endif + endif + exe winnum . 'wincmd w' + + " If the user asked to jump to the tag in a new window, then split the + " existing window into two. + if a:win_ctrl == 'newwin' + split + endif + endif + endif + + " Jump to the tag + if a:tagpat != '' + " Add the current cursor position to the jump list, so that user can + " jump back using the ' and ` marks. + mark ' + silent call search(a:tagpat, 'w') + + " Bring the line to the middle of the window + normal! z. + + " If the line is inside a fold, open the fold + if foldclosed('.') != -1 + .foldopen + endif + endif + + " If the user selects to preview the tag then jump back to the + " taglist window + if a:win_ctrl == 'preview' + " Go back to the taglist window + let winnum = bufwinnr(g:TagList_title) + exe winnum . 'wincmd w' + else + " If the user has selected to close the taglist window, when a + " tag is selected, close the taglist window + if g:Tlist_Close_On_Select + call s:Tlist_Window_Goto_Window() + close + + " Go back to the window displaying the selected file + let wnum = bufwinnr(a:filename) + if wnum != -1 && wnum != winnr() + call s:Tlist_Exe_Cmd_No_Acmds(wnum . 'wincmd w') + endif + endif + endif + + let s:Tlist_Skip_Refresh = prev_Tlist_Skip_Refresh +endfunction + +" Tlist_Window_Jump_To_Tag() +" Jump to the location of the current tag +" win_ctrl == useopen - Reuse the existing file window +" win_ctrl == newwin - Open a new window +" win_ctrl == preview - Preview the tag +" win_ctrl == prevwin - Open in previous window +" win_ctrl == newtab - Open in new tab +function! s:Tlist_Window_Jump_To_Tag(win_ctrl) + call s:Tlist_Log_Msg('Tlist_Window_Jump_To_Tag(' . a:win_ctrl . ')') + " Do not process comment lines and empty lines + let curline = getline('.') + if curline =~ '^\s*$' || curline[0] == '"' + return + endif + + " If inside a closed fold, then use the first line of the fold + " and jump to the file. + let lnum = foldclosed('.') + if lnum == -1 + " Jump to the selected tag or file + let lnum = line('.') + else + " Open the closed fold + .foldopen! + endif + + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum) + if fidx == -1 + return + endif + + " Get the tag output for the current tag + let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum) + if tidx != 0 + let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, tidx) + + " Highlight the tagline + call s:Tlist_Window_Highlight_Line() + else + " Selected a line which is not a tag name. Just edit the file + let tagpat = '' + endif + + call s:Tlist_Window_Open_File(a:win_ctrl, s:tlist_{fidx}_filename, tagpat) +endfunction + +" Tlist_Window_Show_Info() +" Display information about the entry under the cursor +function! s:Tlist_Window_Show_Info() + call s:Tlist_Log_Msg('Tlist_Window_Show_Info()') + + " Clear the previously displayed line + echo + + " Do not process comment lines and empty lines + let curline = getline('.') + if curline =~ '^\s*$' || curline[0] == '"' + return + endif + + " If inside a fold, then don't display the prototype + if foldclosed('.') != -1 + return + endif + + let lnum = line('.') + + " Get the file index + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum) + if fidx == -1 + return + endif + + if lnum == s:tlist_{fidx}_start + " Cursor is on a file name + let fname = s:tlist_{fidx}_filename + if strlen(fname) > 50 + let fname = fnamemodify(fname, ':t') + endif + echo fname . ', Filetype=' . s:tlist_{fidx}_filetype . + \ ', Tag count=' . s:tlist_{fidx}_tag_count + return + endif + + " Get the tag output line for the current tag + let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum) + if tidx == 0 + " Cursor is on a tag type + let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum) + if ttype == '' + return + endif + + let ttype_name = '' + + let ftype = s:tlist_{fidx}_filetype + let i = 1 + while i <= s:tlist_{ftype}_count + if ttype == s:tlist_{ftype}_{i}_name + let ttype_name = s:tlist_{ftype}_{i}_fullname + break + endif + let i = i + 1 + endwhile + + echo 'Tag type=' . ttype_name . + \ ', Tag count=' . s:tlist_{fidx}_{ttype}_count + return + endif + + " Get the tag search pattern and display it + echo s:Tlist_Get_Tag_Prototype(fidx, tidx) +endfunction + +" Tlist_Find_Nearest_Tag_Idx +" Find the tag idx nearest to the supplied line number +" Returns -1, if a tag couldn't be found for the specified line number +function! s:Tlist_Find_Nearest_Tag_Idx(fidx, linenum) + let sort_type = s:tlist_{a:fidx}_sort_type + + let left = 1 + let right = s:tlist_{a:fidx}_tag_count + + if sort_type == 'order' + " Tags sorted by order, use a binary search. + " The idea behind this function is taken from the ctags.vim script (by + " Alexey Marinichev) available at the Vim online website. + + " If the current line is the less than the first tag, then no need to + " search + let first_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, 1) + + if a:linenum < first_lnum + return -1 + endif + + while left < right + let middle = (right + left + 1) / 2 + let middle_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, middle) + + if middle_lnum == a:linenum + let left = middle + break + endif + + if middle_lnum > a:linenum + let right = middle - 1 + else + let left = middle + endif + endwhile + else + " Tags sorted by name, use a linear search. (contributed by Dave + " Eggum). + " Look for a tag with a line number less than or equal to the supplied + " line number. If multiple tags are found, then use the tag with the + " line number closest to the supplied line number. IOW, use the tag + " with the highest line number. + let closest_lnum = 0 + let final_left = 0 + while left <= right + let lnum = s:Tlist_Get_Tag_Linenum(a:fidx, left) + + if lnum < a:linenum && lnum > closest_lnum + let closest_lnum = lnum + let final_left = left + elseif lnum == a:linenum + let closest_lnum = lnum + let final_left = left + break + else + let left = left + 1 + endif + endwhile + if closest_lnum == 0 + return -1 + endif + if left >= right + let left = final_left + endif + endif + + return left +endfunction + +" Tlist_Window_Highlight_Tag() +" Highlight the current tag +" cntx == 1, Called by the taglist plugin itself +" cntx == 2, Forced by the user through the TlistHighlightTag command +" center = 1, move the tag line to the center of the taglist window +function! s:Tlist_Window_Highlight_Tag(filename, cur_lnum, cntx, center) + " Highlight the current tag only if the user configured the + " taglist plugin to do so or if the user explictly invoked the + " command to highlight the current tag. + if !g:Tlist_Auto_Highlight_Tag && a:cntx == 1 + return + endif + + if a:filename == '' + return + endif + + " Make sure the taglist window is present + let winnum = bufwinnr(g:TagList_title) + if winnum == -1 + call s:Tlist_Warning_Msg('Error: Taglist window is not open') + return + endif + + let fidx = s:Tlist_Get_File_Index(a:filename) + if fidx == -1 + return + endif + + " If the file is currently not displayed in the taglist window, then retrn + if !s:tlist_{fidx}_visible + return + endif + + " If there are no tags for this file, then no need to proceed further + if s:tlist_{fidx}_tag_count == 0 + return + endif + + " Ignore all autocommands + let old_ei = &eventignore + set eventignore=all + + " Save the original window number + let org_winnr = winnr() + + if org_winnr == winnum + let in_taglist_window = 1 + else + let in_taglist_window = 0 + endif + + " Go to the taglist window + if !in_taglist_window + exe winnum . 'wincmd w' + endif + + " Clear previously selected name + match none + + let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, a:cur_lnum) + if tidx == -1 + " Make sure the current tag line is visible in the taglist window. + " Calling the winline() function makes the line visible. Don't know + " of a better way to achieve this. + let lnum = line('.') + + if lnum < s:tlist_{fidx}_start || lnum > s:tlist_{fidx}_end + " Move the cursor to the beginning of the file + exe s:tlist_{fidx}_start + endif + + if foldclosed('.') != -1 + .foldopen + endif + + call winline() + + if !in_taglist_window + exe org_winnr . 'wincmd w' + endif + + " Restore the autocommands + let &eventignore = old_ei + return + endif + + " Extract the tag type + let ttype = s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) + + " Compute the line number + " Start of file + Start of tag type + offset + let lnum = s:tlist_{fidx}_start + s:tlist_{fidx}_{ttype}_offset + + \ s:tlist_{fidx}_{tidx}_ttype_idx + + " Goto the line containing the tag + exe lnum + + " Open the fold + if foldclosed('.') != -1 + .foldopen + endif + + if a:center + " Move the tag line to the center of the taglist window + normal! z. + else + " Make sure the current tag line is visible in the taglist window. + " Calling the winline() function makes the line visible. Don't know + " of a better way to achieve this. + call winline() + endif + + " Highlight the tag name + call s:Tlist_Window_Highlight_Line() + + " Go back to the original window + if !in_taglist_window + exe org_winnr . 'wincmd w' + endif + + " Restore the autocommands + let &eventignore = old_ei + return +endfunction + +" Tlist_Get_Tag_Prototype_By_Line +" Get the prototype for the tag on or before the specified line number in the +" current buffer +function! Tlist_Get_Tag_Prototype_By_Line(...) + if a:0 == 0 + " Arguments are not supplied. Use the current buffer name + " and line number + let filename = bufname('%') + let linenr = line('.') + elseif a:0 == 2 + " Filename and line number are specified + let filename = a:1 + let linenr = a:2 + if linenr !~ '\d\+' + " Invalid line number + return "" + endif + else + " Sufficient arguments are not supplied + let msg = 'Usage: Tlist_Get_Tag_Prototype_By_Line ' . + \ '' + call s:Tlist_Warning_Msg(msg) + return "" + endif + + " Expand the file to a fully qualified name + let filename = fnamemodify(filename, ':p') + if filename == '' + return "" + endif + + let fidx = s:Tlist_Get_File_Index(filename) + if fidx == -1 + return "" + endif + + " If there are no tags for this file, then no need to proceed further + if s:tlist_{fidx}_tag_count == 0 + return "" + endif + + " Get the tag text using the line number + let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) + if tidx == -1 + return "" + endif + + return s:Tlist_Get_Tag_Prototype(fidx, tidx) +endfunction + +" Tlist_Get_Tagname_By_Line +" Get the tag name on or before the specified line number in the +" current buffer +function! Tlist_Get_Tagname_By_Line(...) + if a:0 == 0 + " Arguments are not supplied. Use the current buffer name + " and line number + let filename = bufname('%') + let linenr = line('.') + elseif a:0 == 2 + " Filename and line number are specified + let filename = a:1 + let linenr = a:2 + if linenr !~ '\d\+' + " Invalid line number + return "" + endif + else + " Sufficient arguments are not supplied + let msg = 'Usage: Tlist_Get_Tagname_By_Line ' + call s:Tlist_Warning_Msg(msg) + return "" + endif + + " Make sure the current file has a name + let filename = fnamemodify(filename, ':p') + if filename == '' + return "" + endif + + let fidx = s:Tlist_Get_File_Index(filename) + if fidx == -1 + return "" + endif + + " If there are no tags for this file, then no need to proceed further + if s:tlist_{fidx}_tag_count == 0 + return "" + endif + + " Get the tag name using the line number + let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) + if tidx == -1 + return "" + endif + + return s:tlist_{fidx}_{tidx}_tag_name +endfunction + +" Tlist_Window_Move_To_File +" Move the cursor to the beginning of the current file or the next file +" or the previous file in the taglist window +" dir == -1, move to start of current or previous function +" dir == 1, move to start of next function +function! s:Tlist_Window_Move_To_File(dir) + if foldlevel('.') == 0 + " Cursor is on a non-folded line (it is not in any of the files) + " Move it to a folded line + if a:dir == -1 + normal! zk + else + " While moving down to the start of the next fold, + " no need to do go to the start of the next file. + normal! zj + return + endif + endif + + let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) + if fidx == -1 + return + endif + + let cur_lnum = line('.') + + if a:dir == -1 + if cur_lnum > s:tlist_{fidx}_start + " Move to the beginning of the current file + exe s:tlist_{fidx}_start + return + endif + + if fidx != 0 + " Move to the beginning of the previous file + let fidx = fidx - 1 + else + " Cursor is at the first file, wrap around to the last file + let fidx = s:tlist_file_count - 1 + endif + + exe s:tlist_{fidx}_start + return + else + " Move to the beginning of the next file + let fidx = fidx + 1 + + if fidx >= s:tlist_file_count + " Cursor is at the last file, wrap around to the first file + let fidx = 0 + endif + + if s:tlist_{fidx}_start != 0 + exe s:tlist_{fidx}_start + endif + return + endif +endfunction + +" Tlist_Session_Load +" Load a taglist session (information about all the displayed files +" and the tags) from the specified file +function! s:Tlist_Session_Load(...) + if a:0 == 0 || a:1 == '' + call s:Tlist_Warning_Msg('Usage: TlistSessionLoad ') + return + endif + + let sessionfile = a:1 + + if !filereadable(sessionfile) + let msg = 'Taglist: Error - Unable to open file ' . sessionfile + call s:Tlist_Warning_Msg(msg) + return + endif + + " Mark the current window as the file window + call s:Tlist_Window_Mark_File_Window() + + " Source the session file + exe 'source ' . sessionfile + + let new_file_count = g:tlist_file_count + unlet! g:tlist_file_count + + let i = 0 + while i < new_file_count + let ftype = g:tlist_{i}_filetype + unlet! g:tlist_{i}_filetype + + if !exists('s:tlist_' . ftype . '_count') + if s:Tlist_FileType_Init(ftype) == 0 + let i = i + 1 + continue + endif + endif + + let fname = g:tlist_{i}_filename + unlet! g:tlist_{i}_filename + + let fidx = s:Tlist_Get_File_Index(fname) + if fidx != -1 + let s:tlist_{fidx}_visible = 0 + let i = i + 1 + continue + else + " As we are loading the tags from the session file, if this + " file was previously deleted by the user, now we need to + " add it back. So remove the file from the deleted list. + call s:Tlist_Update_Remove_List(fname, 0) + endif + + let fidx = s:Tlist_Init_File(fname, ftype) + + let s:tlist_{fidx}_filename = fname + + let s:tlist_{fidx}_sort_type = g:tlist_{i}_sort_type + unlet! g:tlist_{i}_sort_type + + let s:tlist_{fidx}_filetype = ftype + let s:tlist_{fidx}_mtime = getftime(fname) + + let s:tlist_{fidx}_start = 0 + let s:tlist_{fidx}_end = 0 + + let s:tlist_{fidx}_valid = 1 + + let s:tlist_{fidx}_tag_count = g:tlist_{i}_tag_count + unlet! g:tlist_{i}_tag_count + + let j = 1 + while j <= s:tlist_{fidx}_tag_count + let s:tlist_{fidx}_{j}_tag = g:tlist_{i}_{j}_tag + let s:tlist_{fidx}_{j}_tag_name = g:tlist_{i}_{j}_tag_name + let s:tlist_{fidx}_{j}_ttype_idx = g:tlist_{i}_{j}_ttype_idx + unlet! g:tlist_{i}_{j}_tag + unlet! g:tlist_{i}_{j}_tag_name + unlet! g:tlist_{i}_{j}_ttype_idx + let j = j + 1 + endwhile + + let j = 1 + while j <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{j}_name + + if exists('g:tlist_' . i . '_' . ttype) + let s:tlist_{fidx}_{ttype} = g:tlist_{i}_{ttype} + unlet! g:tlist_{i}_{ttype} + let s:tlist_{fidx}_{ttype}_offset = 0 + let s:tlist_{fidx}_{ttype}_count = g:tlist_{i}_{ttype}_count + unlet! g:tlist_{i}_{ttype}_count + + let k = 1 + while k <= s:tlist_{fidx}_{ttype}_count + let s:tlist_{fidx}_{ttype}_{k} = g:tlist_{i}_{ttype}_{k} + unlet! g:tlist_{i}_{ttype}_{k} + let k = k + 1 + endwhile + else + let s:tlist_{fidx}_{ttype} = '' + let s:tlist_{fidx}_{ttype}_offset = 0 + let s:tlist_{fidx}_{ttype}_count = 0 + endif + + let j = j + 1 + endwhile + + let i = i + 1 + endwhile + + " If the taglist window is open, then update it + let winnum = bufwinnr(g:TagList_title) + if winnum != -1 + let save_winnr = winnr() + + " Goto the taglist window + call s:Tlist_Window_Goto_Window() + + " Refresh the taglist window + call s:Tlist_Window_Refresh() + + " Go back to the original window + if save_winnr != winnr() + call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') + endif + endif +endfunction + +" Tlist_Session_Save +" Save a taglist session (information about all the displayed files +" and the tags) into the specified file +function! s:Tlist_Session_Save(...) + if a:0 == 0 || a:1 == '' + call s:Tlist_Warning_Msg('Usage: TlistSessionSave ') + return + endif + + let sessionfile = a:1 + + if s:tlist_file_count == 0 + " There is nothing to save + call s:Tlist_Warning_Msg('Warning: Taglist is empty. Nothing to save.') + return + endif + + if filereadable(sessionfile) + let ans = input('Do you want to overwrite ' . sessionfile . ' (Y/N)?') + if ans !=? 'y' + return + endif + + echo "\n" + endif + + let old_verbose = &verbose + set verbose&vim + + exe 'redir! > ' . sessionfile + + silent! echo '" Taglist session file. This file is auto-generated.' + silent! echo '" File information' + silent! echo 'let tlist_file_count = ' . s:tlist_file_count + + let i = 0 + + while i < s:tlist_file_count + " Store information about the file + silent! echo 'let tlist_' . i . "_filename = '" . + \ s:tlist_{i}_filename . "'" + silent! echo 'let tlist_' . i . '_sort_type = "' . + \ s:tlist_{i}_sort_type . '"' + silent! echo 'let tlist_' . i . '_filetype = "' . + \ s:tlist_{i}_filetype . '"' + silent! echo 'let tlist_' . i . '_tag_count = ' . + \ s:tlist_{i}_tag_count + " Store information about all the tags + let j = 1 + while j <= s:tlist_{i}_tag_count + let txt = escape(s:tlist_{i}_{j}_tag, '"\\') + silent! echo 'let tlist_' . i . '_' . j . '_tag = "' . txt . '"' + silent! echo 'let tlist_' . i . '_' . j . '_tag_name = "' . + \ s:tlist_{i}_{j}_tag_name . '"' + silent! echo 'let tlist_' . i . '_' . j . '_ttype_idx' . ' = ' . + \ s:tlist_{i}_{j}_ttype_idx + let j = j + 1 + endwhile + + " Store information about all the tags grouped by their type + let ftype = s:tlist_{i}_filetype + let j = 1 + while j <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{j}_name + if s:tlist_{i}_{ttype}_count != 0 + let txt = escape(s:tlist_{i}_{ttype}, '"\') + let txt = substitute(txt, "\n", "\\\\n", 'g') + silent! echo 'let tlist_' . i . '_' . ttype . ' = "' . + \ txt . '"' + silent! echo 'let tlist_' . i . '_' . ttype . '_count = ' . + \ s:tlist_{i}_{ttype}_count + let k = 1 + while k <= s:tlist_{i}_{ttype}_count + silent! echo 'let tlist_' . i . '_' . ttype . '_' . k . + \ ' = ' . s:tlist_{i}_{ttype}_{k} + let k = k + 1 + endwhile + endif + let j = j + 1 + endwhile + + silent! echo + + let i = i + 1 + endwhile + + redir END + + let &verbose = old_verbose +endfunction + +" Tlist_Buffer_Removed +" A buffer is removed from the Vim buffer list. Remove the tags defined +" for that file +function! s:Tlist_Buffer_Removed(filename) + call s:Tlist_Log_Msg('Tlist_Buffer_Removed (' . a:filename . ')') + + " Make sure a valid filename is supplied + if a:filename == '' + return + endif + + " Get tag list index of the specified file + let fidx = s:Tlist_Get_File_Index(a:filename) + if fidx == -1 + " File not present in the taglist + return + endif + + " Remove the file from the list + call s:Tlist_Remove_File(fidx, 0) +endfunction + +" When a buffer is deleted, remove the file from the taglist +autocmd BufDelete * silent call s:Tlist_Buffer_Removed(expand(':p')) + +" Tlist_Window_Open_File_Fold +" Open the fold for the specified file and close the fold for all the +" other files +function! s:Tlist_Window_Open_File_Fold(acmd_bufnr) + call s:Tlist_Log_Msg('Tlist_Window_Open_File_Fold (' . a:acmd_bufnr . ')') + + " Make sure the taglist window is present + let winnum = bufwinnr(g:TagList_title) + if winnum == -1 + call s:Tlist_Warning_Msg('Taglist: Error - Taglist window is not open') + return + endif + + " Save the original window number + let org_winnr = winnr() + if org_winnr == winnum + let in_taglist_window = 1 + else + let in_taglist_window = 0 + endif + + if in_taglist_window + " When entering the taglist window, no need to update the folds + return + endif + + " Go to the taglist window + if !in_taglist_window + call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') + endif + + " Close all the folds + silent! %foldclose + + " Get tag list index of the specified file + let fname = fnamemodify(bufname(a:acmd_bufnr + 0), ':p') + if filereadable(fname) + let fidx = s:Tlist_Get_File_Index(fname) + if fidx != -1 + " Open the fold for the file + exe "silent! " . s:tlist_{fidx}_start . "," . + \ s:tlist_{fidx}_end . "foldopen" + endif + endif + + " Go back to the original window + if !in_taglist_window + call s:Tlist_Exe_Cmd_No_Acmds(org_winnr . 'wincmd w') + endif +endfunction + +" Tlist_Window_Check_Auto_Open +" Open the taglist window automatically on Vim startup. +" Open the window only when files present in any of the Vim windows support +" tags. +function! s:Tlist_Window_Check_Auto_Open() + let open_window = 0 + + let i = 1 + let buf_num = winbufnr(i) + while buf_num != -1 + let filename = fnamemodify(bufname(buf_num), ':p') + let ft = s:Tlist_Get_Buffer_Filetype(buf_num) + if !s:Tlist_Skip_File(filename, ft) + let open_window = 1 + break + endif + let i = i + 1 + let buf_num = winbufnr(i) + endwhile + + if open_window + call s:Tlist_Window_Toggle() + endif +endfunction + +" Tlist_Refresh_Folds +" Remove and create the folds for all the files displayed in the taglist +" window. Used after entering a tab. If this is not done, then the folds +" are not properly created for taglist windows displayed in multiple tabs. +function! s:Tlist_Refresh_Folds() + let winnum = bufwinnr(g:TagList_title) + if winnum == -1 + return + endif + + let save_wnum = winnr() + exe winnum . 'wincmd w' + + " First remove all the existing folds + normal! zE + + " Create the folds for each in the tag list + let fidx = 0 + while fidx < s:tlist_file_count + let ftype = s:tlist_{fidx}_filetype + + " Create the folds for each tag type in a file + let j = 1 + while j <= s:tlist_{ftype}_count + let ttype = s:tlist_{ftype}_{j}_name + if s:tlist_{fidx}_{ttype}_count + let s = s:tlist_{fidx}_start + s:tlist_{fidx}_{ttype}_offset + let e = s + s:tlist_{fidx}_{ttype}_count + exe s . ',' . e . 'fold' + endif + let j = j + 1 + endwhile + + exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'fold' + exe 'silent! ' . s:tlist_{fidx}_start . ',' . + \ s:tlist_{fidx}_end . 'foldopen!' + let fidx = fidx + 1 + endwhile + + exe save_wnum . 'wincmd w' +endfunction + +function! s:Tlist_Menu_Add_Base_Menu() + call s:Tlist_Log_Msg('Adding the base menu') + + " Add the menu + anoremenu T&ags.Refresh\ menu :call Tlist_Menu_Refresh() + anoremenu T&ags.Sort\ menu\ by.Name + \ :call Tlist_Change_Sort('menu', 'set', 'name') + anoremenu T&ags.Sort\ menu\ by.Order + \ :call Tlist_Change_Sort('menu', 'set', 'order') + anoremenu T&ags.-SEP1- : + + if &mousemodel =~ 'popup' + anoremenu PopUp.T&ags.Refresh\ menu + \ :call Tlist_Menu_Refresh() + anoremenu PopUp.T&ags.Sort\ menu\ by.Name + \ :call Tlist_Change_Sort('menu', 'set', 'name') + anoremenu PopUp.T&ags.Sort\ menu\ by.Order + \ :call Tlist_Change_Sort('menu', 'set', 'order') + anoremenu PopUp.T&ags.-SEP1- : + endif +endfunction + +let s:menu_char_prefix = + \ '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + +" Tlist_Menu_Get_Tag_Type_Cmd +" Get the menu command for the specified tag type +" fidx - File type index +" ftype - File Type +" add_ttype_name - To add or not to add the tag type name to the menu entries +" ttype_idx - Tag type index +function! s:Tlist_Menu_Get_Tag_Type_Cmd(fidx, ftype, add_ttype_name, ttype_idx) + " Curly brace variable name optimization + let ftype_ttype_idx = a:ftype . '_' . a:ttype_idx + + let ttype = s:tlist_{ftype_ttype_idx}_name + if a:add_ttype_name + " If the tag type name contains space characters, escape it. This + " will be used to create the menu entries. + let ttype_fullname = escape(s:tlist_{ftype_ttype_idx}_fullname, ' ') + endif + + " Curly brace variable name optimization + let fidx_ttype = a:fidx . '_' . ttype + + " Number of tag entries for this tag type + let tcnt = s:tlist_{fidx_ttype}_count + if tcnt == 0 " No entries for this tag type + return '' + endif + + let mcmd = '' + + " Create the menu items for the tags. + " Depending on the number of tags of this type, split the menu into + " multiple sub-menus, if needed. + if tcnt > g:Tlist_Max_Submenu_Items + let j = 1 + while j <= tcnt + let final_index = j + g:Tlist_Max_Submenu_Items - 1 + if final_index > tcnt + let final_index = tcnt + endif + + " Extract the first and last tag name and form the + " sub-menu name + let tidx = s:tlist_{fidx_ttype}_{j} + let first_tag = s:tlist_{a:fidx}_{tidx}_tag_name + + let tidx = s:tlist_{fidx_ttype}_{final_index} + let last_tag = s:tlist_{a:fidx}_{tidx}_tag_name + + " Truncate the names, if they are greater than the + " max length + let first_tag = strpart(first_tag, 0, g:Tlist_Max_Tag_Length) + let last_tag = strpart(last_tag, 0, g:Tlist_Max_Tag_Length) + + " Form the menu command prefix + let m_prefix = 'anoremenu T\&ags.' + if a:add_ttype_name + let m_prefix = m_prefix . ttype_fullname . '.' + endif + let m_prefix = m_prefix . first_tag . '\.\.\.' . last_tag . '.' + + " Character prefix used to number the menu items (hotkey) + let m_prefix_idx = 0 + + while j <= final_index + let tidx = s:tlist_{fidx_ttype}_{j} + + let tname = s:tlist_{a:fidx}_{tidx}_tag_name + + let mcmd = mcmd . m_prefix . '\&' . + \ s:menu_char_prefix[m_prefix_idx] . '\.' . + \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . + \ tidx . ')|' + + let m_prefix_idx = m_prefix_idx + 1 + let j = j + 1 + endwhile + endwhile + else + " Character prefix used to number the menu items (hotkey) + let m_prefix_idx = 0 + + let m_prefix = 'anoremenu T\&ags.' + if a:add_ttype_name + let m_prefix = m_prefix . ttype_fullname . '.' + endif + let j = 1 + while j <= tcnt + let tidx = s:tlist_{fidx_ttype}_{j} + + let tname = s:tlist_{a:fidx}_{tidx}_tag_name + + let mcmd = mcmd . m_prefix . '\&' . + \ s:menu_char_prefix[m_prefix_idx] . '\.' . + \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . tidx + \ . ')|' + + let m_prefix_idx = m_prefix_idx + 1 + let j = j + 1 + endwhile + endif + + return mcmd +endfunction + +" Update the taglist menu with the tags for the specified file +function! s:Tlist_Menu_File_Refresh(fidx) + call s:Tlist_Log_Msg('Refreshing the tag menu for ' . s:tlist_{a:fidx}_filename) + " The 'B' flag is needed in the 'cpoptions' option + let old_cpoptions = &cpoptions + set cpoptions&vim + + exe s:tlist_{a:fidx}_menu_cmd + + " Update the popup menu (if enabled) + if &mousemodel =~ 'popup' + let cmd = substitute(s:tlist_{a:fidx}_menu_cmd, ' T\\&ags\.', + \ ' PopUp.T\\\&ags.', "g") + exe cmd + endif + + " The taglist menu is not empty now + let s:tlist_menu_empty = 0 + + " Restore the 'cpoptions' settings + let &cpoptions = old_cpoptions +endfunction + +" Tlist_Menu_Update_File +" Add the taglist menu +function! s:Tlist_Menu_Update_File(clear_menu) + if !has('gui_running') + " Not running in GUI mode + return + endif + + call s:Tlist_Log_Msg('Updating the tag menu, clear_menu = ' . a:clear_menu) + + " Remove the tags menu + if a:clear_menu + call s:Tlist_Menu_Remove_File() + + endif + + " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help + if &buftype != '' + return + endif + + let filename = fnamemodify(bufname('%'), ':p') + let ftype = s:Tlist_Get_Buffer_Filetype('%') + + " If the file doesn't support tag listing, skip it + if s:Tlist_Skip_File(filename, ftype) + return + endif + + let fidx = s:Tlist_Get_File_Index(filename) + if fidx == -1 || !s:tlist_{fidx}_valid + " Check whether this file is removed based on user request + " If it is, then don't display the tags for this file + if s:Tlist_User_Removed_File(filename) + return + endif + + " Process the tags for the file + let fidx = s:Tlist_Process_File(filename, ftype) + if fidx == -1 + return + endif + endif + + let fname = escape(fnamemodify(bufname('%'), ':t'), '.') + if fname != '' + exe 'anoremenu T&ags.' . fname . ' ' + anoremenu T&ags.-SEP2- : + endif + + if !s:tlist_{fidx}_tag_count + return + endif + + if s:tlist_{fidx}_menu_cmd != '' + " Update the menu with the cached command + call s:Tlist_Menu_File_Refresh(fidx) + + return + endif + + " We are going to add entries to the tags menu, so the menu won't be + " empty + let s:tlist_menu_empty = 0 + + let cmd = '' + + " Determine whether the tag type name needs to be added to the menu + " If more than one tag type is present in the taglisting for a file, + " then the tag type name needs to be present + let add_ttype_name = -1 + let i = 1 + while i <= s:tlist_{ftype}_count && add_ttype_name < 1 + let ttype = s:tlist_{ftype}_{i}_name + if s:tlist_{fidx}_{ttype}_count + let add_ttype_name = add_ttype_name + 1 + endif + let i = i + 1 + endwhile + + " Process the tags by the tag type and get the menu command + let i = 1 + while i <= s:tlist_{ftype}_count + let mcmd = s:Tlist_Menu_Get_Tag_Type_Cmd(fidx, ftype, add_ttype_name, i) + if mcmd != '' + let cmd = cmd . mcmd + endif + + let i = i + 1 + endwhile + + " Cache the menu command for reuse + let s:tlist_{fidx}_menu_cmd = cmd + + " Update the menu + call s:Tlist_Menu_File_Refresh(fidx) +endfunction + +" Tlist_Menu_Remove_File +" Remove the tags displayed in the tags menu +function! s:Tlist_Menu_Remove_File() + if !has('gui_running') || s:tlist_menu_empty + return + endif + + call s:Tlist_Log_Msg('Removing the tags menu for a file') + + " Cleanup the Tags menu + silent! unmenu T&ags + if &mousemodel =~ 'popup' + silent! unmenu PopUp.T&ags + endif + + " Add a dummy menu item to retain teared off menu + noremenu T&ags.Dummy l + + silent! unmenu! T&ags + if &mousemodel =~ 'popup' + silent! unmenu! PopUp.T&ags + endif + + call s:Tlist_Menu_Add_Base_Menu() + + " Remove the dummy menu item + unmenu T&ags.Dummy + + let s:tlist_menu_empty = 1 +endfunction + +" Tlist_Menu_Refresh +" Refresh the taglist menu +function! s:Tlist_Menu_Refresh() + call s:Tlist_Log_Msg('Refreshing the tags menu') + let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) + if fidx != -1 + " Invalidate the cached menu command + let s:tlist_{fidx}_menu_cmd = '' + endif + + " Update the taglist, menu and window + call s:Tlist_Update_Current_File() +endfunction + +" Tlist_Menu_Jump_To_Tag +" Jump to the selected tag +function! s:Tlist_Menu_Jump_To_Tag(tidx) + let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) + if fidx == -1 + return + endif + + let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, a:tidx) + if tagpat == '' + return + endif + + " Add the current cursor position to the jump list, so that user can + " jump back using the ' and ` marks. + mark ' + + silent call search(tagpat, 'w') + + " Bring the line to the middle of the window + normal! z. + + " If the line is inside a fold, open the fold + if foldclosed('.') != -1 + .foldopen + endif +endfunction + +" Tlist_Menu_Init +" Initialize the taglist menu +function! s:Tlist_Menu_Init() + call s:Tlist_Menu_Add_Base_Menu() + + " Automatically add the tags defined in the current file to the menu + augroup TagListMenuCmds + autocmd! + + if !g:Tlist_Process_File_Always + autocmd BufEnter * call s:Tlist_Refresh() + endif + autocmd BufLeave * call s:Tlist_Menu_Remove_File() + augroup end + + call s:Tlist_Menu_Update_File(0) +endfunction + +" Tlist_Vim_Session_Load +" Initialize the taglist window/buffer, which is created when loading +" a Vim session file. +function! s:Tlist_Vim_Session_Load() + call s:Tlist_Log_Msg('Tlist_Vim_Session_Load') + + " Initialize the taglist window + call s:Tlist_Window_Init() + + " Refresh the taglist window + call s:Tlist_Window_Refresh() +endfunction + +" Tlist_Set_App +" Set the name of the external plugin/application to which taglist +" belongs. +" Taglist plugin is part of another plugin like cream or winmanager. +function! Tlist_Set_App(name) + if a:name == "" + return + endif + + let s:tlist_app_name = a:name +endfunction + +" Winmanager integration + +" Initialization required for integration with winmanager +function! TagList_Start() + " If current buffer is not taglist buffer, then don't proceed + if bufname('%') != '__Tag_List__' + return + endif + + call Tlist_Set_App('winmanager') + + " Get the current filename from the winmanager plugin + let bufnum = WinManagerGetLastEditedFile() + if bufnum != -1 + let filename = fnamemodify(bufname(bufnum), ':p') + let ftype = s:Tlist_Get_Buffer_Filetype(bufnum) + endif + + " Initialize the taglist window, if it is not already initialized + if !exists('s:tlist_window_initialized') || !s:tlist_window_initialized + call s:Tlist_Window_Init() + call s:Tlist_Window_Refresh() + let s:tlist_window_initialized = 1 + endif + + " Update the taglist window + if bufnum != -1 + if !s:Tlist_Skip_File(filename, ftype) && g:Tlist_Auto_Update + call s:Tlist_Window_Refresh_File(filename, ftype) + endif + endif +endfunction + +function! TagList_IsValid() + return 0 +endfunction + +function! TagList_WrapUp() + return 0 +endfunction + +" restore 'cpo' +let &cpo = s:cpo_save +unlet s:cpo_save + diff --git a/sources_non_forked/tlib/autoload/tlib/Filter_cnf.vim b/sources_non_forked/tlib/autoload/tlib/Filter_cnf.vim index 72a93f94..0abc7067 100644 --- a/sources_non_forked/tlib/autoload/tlib/Filter_cnf.vim +++ b/sources_non_forked/tlib/autoload/tlib/Filter_cnf.vim @@ -3,8 +3,8 @@ " @Website: http://www.vim.org/account/profile.php?user_id=4037 " @License: GPL (see http://www.gnu.org/licenses/gpl.txt) " @Created: 2008-11-25. -" @Last Change: 2010-11-20. -" @Revision: 0.0.79 +" @Last Change: 2012-09-26. +" @Revision: 0.0.90 let s:prototype = tlib#Object#New({'_class': ['Filter_cnf'], 'name': 'cnf'}) "{{{2 let s:prototype.highlight = g:tlib_inputlist_higroup @@ -30,6 +30,14 @@ function! s:prototype.Init(world) dict "{{{3 endf +" :nodoc: +function! s:prototype.Help(world) dict "{{{3 + call a:world.PushHelp( + \ printf('"%s", "%s", "%sWORD"', g:tlib_inputlist_and, g:tlib_inputlist_or, g:tlib_inputlist_not), + \ 'AND, OR, NOT') +endf + + " :nodoc: function! s:prototype.AssessName(world, name) dict "{{{3 let xa = 0 @@ -86,18 +94,22 @@ function! s:prototype.Match(world, text) dict "{{{3 " set smartcase " endif " try + if !empty(a:world.filter_neg) for rx in a:world.filter_neg " TLogVAR rx if a:text =~ rx return 0 endif endfor + endif + if !empty(a:world.filter_pos) for rx in a:world.filter_pos " TLogVAR rx if a:text !~ rx return 0 endif endfor + endif " finally " let &smartcase = sc " let &ignorecase = ic @@ -109,13 +121,14 @@ endf " :nodoc: function! s:prototype.DisplayFilter(filter) dict "{{{3 let filter1 = deepcopy(a:filter) - call map(filter1, '"(". join(reverse(s:Pretty(v:val)), " OR ") .")"') + call map(filter1, '"(". join(reverse(self.Pretty(v:val)), " OR ") .")"') return join(reverse(filter1), ' AND ') endf -function! s:Pretty(filter) "{{{3 - call map(a:filter, 'substitute(v:val, ''\\\.\\{-}'', ''__'', ''g'')') +function! s:prototype.Pretty(filter) dict "{{{3 + " call map(a:filter, 'substitute(v:val, ''\\\.\\{-}'', ''=>'', ''g'')') + call map(a:filter, 'self.CleanFilter(v:val)') return a:filter endf diff --git a/sources_non_forked/tlib/autoload/tlib/Filter_cnfd.vim b/sources_non_forked/tlib/autoload/tlib/Filter_cnfd.vim index 61e3b9c6..b141b733 100644 --- a/sources_non_forked/tlib/autoload/tlib/Filter_cnfd.vim +++ b/sources_non_forked/tlib/autoload/tlib/Filter_cnfd.vim @@ -3,14 +3,14 @@ " @Website: http://www.vim.org/account/profile.php?user_id=4037 " @License: GPL (see http://www.gnu.org/licenses/gpl.txt) " @Created: 2008-11-25. -" @Last Change: 2010-09-15. -" @Revision: 0.0.35 +" @Last Change: 2012-09-20. +" @Revision: 0.0.50 let s:prototype = tlib#Filter_cnf#New({'_class': ['Filter_cnfd'], 'name': 'cnfd'}) "{{{2 let s:prototype.highlight = g:tlib_inputlist_higroup -" The same as |tlib#FilterCNF#New()| but a dot is expanded to '\.\{-}'. +" The same as |tlib#Filter_cnf#New()| but a dot is expanded to '\.\{-}'. " As a consequence, patterns cannot match dots. " The pattern is a '/\V' very no-'/magic' regexp pattern. function! tlib#Filter_cnfd#New(...) "{{{3 @@ -24,6 +24,19 @@ function! s:prototype.Init(world) dict "{{{3 endf +let s:Help = s:prototype.Help + +" :nodoc: +function! s:prototype.Help(world) dict "{{{3 + call call(s:Help, [a:world], self) + if self.name == 'cnfx' + call a:world.PushHelp(g:tlib#Filter_cnfx#expander, 'Any characters') + else + call a:world.PushHelp('.', 'Any characters') + endif +endf + + " :nodoc: function! s:prototype.SetFrontFilter(world, pattern) dict "{{{3 let pattern = substitute(a:pattern, '\.', '\\.\\{-}', 'g') diff --git a/sources_non_forked/tlib/autoload/tlib/Filter_cnfx.vim b/sources_non_forked/tlib/autoload/tlib/Filter_cnfx.vim new file mode 100644 index 00000000..95abdae7 --- /dev/null +++ b/sources_non_forked/tlib/autoload/tlib/Filter_cnfx.vim @@ -0,0 +1,42 @@ +" @Author: Tom Link (mailto:micathom AT gmail com?subject=[vim]) +" @Website: http://www.vim.org/account/profile.php?user_id=4037 +" @License: GPL (see http://www.gnu.org/licenses/gpl.txt) +" @Created: 2008-11-25. +" @Last Change: 2012-09-20. +" @Revision: 0.0.61 + +let s:prototype = tlib#Filter_cnfd#New({'_class': ['Filter_cnfx'], 'name': 'cnfx'}) "{{{2 +let s:prototype.highlight = g:tlib_inputlist_higroup + + +" A character that should be expanded to '\.\{-}'. +TLet g:tlib#Filter_cnfx#expander = '+' + + +" The same as |tlib#Filter_cnfd#New()| but a a customizable character +" |see tlib#Filter_cnfx#expander| is expanded to '\.\{-}'. +" The pattern is a '/\V' very no-'/magic' regexp pattern. +function! tlib#Filter_cnfx#New(...) "{{{3 + let object = s:prototype.New(a:0 >= 1 ? a:1 : {}) + return object +endf + + +" :nodoc: +function! s:prototype.SetFrontFilter(world, pattern) dict "{{{3 + let pattern = substitute(a:pattern, tlib#rx#Escape(g:tlib#Filter_cnfx#expander, 'V'), '\\.\\{-}', 'g') + let a:world.filter[0] = reverse(split(pattern, '\s*|\s*')) + a:world.filter[0][1 : -1] +endf + + +" :nodoc: +function! s:prototype.PushFrontFilter(world, char) dict "{{{3 + let a:world.filter[0][0] .= a:char == char2nr(g:tlib#Filter_cnfx#expander) ? '\.\{-}' : nr2char(a:char) +endf + + +" :nodoc: +function! s:prototype.CleanFilter(filter) dict "{{{3 + return substitute(a:filter, '\\.\\{-}', g:tlib#Filter_cnfx#expander, 'g') +endf + diff --git a/sources_non_forked/tlib/autoload/tlib/Filter_fuzzy.vim b/sources_non_forked/tlib/autoload/tlib/Filter_fuzzy.vim index 2d39b725..39e09844 100644 --- a/sources_non_forked/tlib/autoload/tlib/Filter_fuzzy.vim +++ b/sources_non_forked/tlib/autoload/tlib/Filter_fuzzy.vim @@ -3,15 +3,15 @@ " @Website: http://www.vim.org/account/profile.php?user_id=4037 " @License: GPL (see http://www.gnu.org/licenses/gpl.txt) " @Created: 2008-11-25. -" @Last Change: 2010-09-15. -" @Revision: 0.0.38 +" @Last Change: 2012-09-20. +" @Revision: 0.0.46 let s:prototype = tlib#Filter_cnf#New({'_class': ['Filter_fuzzy'], 'name': 'fuzzy'}) "{{{2 -let s:prototype.highlight = '' +let s:prototype.highlight = g:tlib_inputlist_higroup " Support for "fuzzy" pattern matching in |tlib#input#List()|. -" Characters are interpreted as if connected with '.\{-}'. +" Patterns are interpreted as if characters were connected with '.\{-}'. " " In "fuzzy" mode, the pretty printing of filenames is disabled. function! tlib#Filter_fuzzy#New(...) "{{{3 @@ -23,7 +23,8 @@ endf " :nodoc: function! s:prototype.Init(world) dict "{{{3 " TLogVAR a:world.display_format - function! a:world.Set_display_format(value) dict "{{{3 + " :nodoc: + function! a:world.Set_display_format(value) dict if a:value == 'filename' let self.display_format = '' else @@ -33,6 +34,15 @@ function! s:prototype.Init(world) dict "{{{3 endf +let s:Help = s:prototype.Help + +" :nodoc: +function! s:prototype.Help(world) dict "{{{3 + call call(s:Help, [a:world], self) + call a:world.PushHelp('Patterns are interpreted as if characters were connected with .\{-}') +endf + + " :nodoc: function! s:prototype.DisplayFilter(filter) dict "{{{3 " TLogVAR a:filter diff --git a/sources_non_forked/tlib/autoload/tlib/Filter_seq.vim b/sources_non_forked/tlib/autoload/tlib/Filter_seq.vim deleted file mode 100644 index f5957af0..00000000 --- a/sources_non_forked/tlib/autoload/tlib/Filter_seq.vim +++ /dev/null @@ -1,98 +0,0 @@ -" Filter_seq.vim -" @Author: Tom Link (mailto:micathom AT gmail com?subject=[vim]) -" @Website: http://www.vim.org/account/profile.php?user_id=4037 -" @License: GPL (see http://www.gnu.org/licenses/gpl.txt) -" @Created: 2008-11-25. -" @Last Change: 2010-11-20. -" @Revision: 0.0.30 - -let s:prototype = tlib#Filter_cnf#New({'_class': ['Filter_seq'], 'name': 'seq'}) "{{{2 -let s:prototype.highlight = g:tlib_inputlist_higroup - -" The search pattern for |tlib#input#List()| is interpreted as a -" disjunction of 'magic' regular expressions with the exception of a dot -" ".", which is interpreted as ".\{-}". -" The pattern is a '/magic' regexp pattern. -function! tlib#Filter_seq#New(...) "{{{3 - let object = s:prototype.New(a:0 >= 1 ? a:1 : {}) - return object -endf - - -" :nodoc: -function! s:prototype.Init(world) dict "{{{3 -endf - - -" :nodoc: -function! s:prototype.Match(world, text) dict "{{{3 - " TLogVAR a:text - for rx in a:world.filter_neg - if a:text !~ rx - " TLogDBG "filter_neg ". rx - return 1 - endif - endfor - for rx in a:world.filter_pos - if a:text =~ rx - " TLogDBG "filter_pos ". rx - return 1 - endif - endfor - return 0 -endf - - -" :nodoc: -function! s:prototype.DisplayFilter(filter) dict "{{{3 - let filter1 = deepcopy(a:filter) - call map(filter1, '"(". join(reverse(s:Pretty(v:val)), "_") .")"') - return join(reverse(filter1), ' OR ') -endf - - -function! s:Pretty(filter) "{{{3 - call map(a:filter, 's:prototype.CleanFilter(v:val)') - return a:filter -endf - - -" :nodoc: -function! s:prototype.SetFrontFilter(world, pattern) dict "{{{3 - let a:world.filter[0] = map(reverse(split(a:pattern, '\s*|\s*')), 'join(split(v:val, ''\.''), ''.\{-}'')') + a:world.filter[0][1 : -1] -endf - - -" :nodoc: -function! s:prototype.PushFrontFilter(world, char) dict "{{{3 - let cc = nr2char(a:char) - if cc == '.' - let a:world.filter[0][0] .= '.\{-}' - else - let a:world.filter[0][0] .= nr2char(a:char) - endif -endf - - -" :nodoc: -function! s:prototype.ReduceFrontFilter(world) dict "{{{3 - let flt = a:world.filter[0][0] - if flt =~ '\.\\{-}$' - let a:world.filter[0][0] = flt[0:-6] - else - let a:world.filter[0][0] = flt[0:-2] - endif -endf - - -" :nodoc: -function! s:prototype.FilterRxPrefix() dict "{{{3 - return '' -endf - - -" :nodoc: -function! s:prototype.CleanFilter(filter) dict "{{{3 - return substitute(a:filter, '.\\{-}', '.', 'g') -endf - diff --git a/sources_non_forked/tlib/autoload/tlib/World.vim b/sources_non_forked/tlib/autoload/tlib/World.vim index c38e48b4..296f2d41 100644 --- a/sources_non_forked/tlib/autoload/tlib/World.vim +++ b/sources_non_forked/tlib/autoload/tlib/World.vim @@ -3,8 +3,8 @@ " @Website: http://www.vim.org/account/profile.php?user_id=4037 " @License: GPL (see http://www.gnu.org/licenses/gpl.txt) " @Created: 2007-05-01. -" @Last Change: 2011-04-01. -" @Revision: 0.1.915 +" @Last Change: 2012-10-03. +" @Revision: 0.1.1203 " :filedoc: " A prototype used by |tlib#input#List|. @@ -24,6 +24,7 @@ let s:prototype = tlib#Object#New({ \ 'fileencoding': &fileencoding, \ 'fmt_display': {}, \ 'fmt_filter': {}, + \ 'fmt_options': {}, \ 'filetype': '', \ 'filter': [['']], \ 'filter_format': '', @@ -62,6 +63,7 @@ let s:prototype = tlib#Object#New({ \ 'state': 'display', \ 'state_handlers': [], \ 'sticky': 0, + \ 'temp_prompt': [], \ 'timeout': 0, \ 'timeout_resolution': 2, \ 'type': '', @@ -94,71 +96,115 @@ endf " :nodoc: function! s:prototype.Set_highlight_filename() dict "{{{3 let self.tlib_UseInputListScratch = 'call world.Highlight_filename()' - " \ 'syntax match TLibMarker /\%>'. (1 + eval(g:tlib_inputlist_width_filename)) .'c |.\{-}| / | hi def link TLibMarker Special' - " let self.tlib_UseInputListScratch .= '| syntax match TLibDir /\%>'. (4 + eval(g:tlib_inputlist_width_filename)) .'c\S\{-}[\/].*$/ | hi def link TLibDir Directory' endf -" :nodoc: -function! s:prototype.Highlight_filename() dict "{{{3 - " exec 'syntax match TLibDir /\%>'. (3 + eval(g:tlib_inputlist_width_filename)) .'c \(\S:\)\?[\/].*$/ contained containedin=TLibMarker' - exec 'syntax match TLibDir /\(\a:\|\.\.\..\{-}\)\?[\/][^&<>*|]*$/ contained containedin=TLibMarker' - exec 'syntax match TLibMarker /\%>'. (1 + eval(g:tlib_inputlist_width_filename)) .'c |\( \|[[:alnum:]%*+-]*\)| \S.*$/ contains=TLibDir' - hi def link TLibMarker Special - hi def link TLibDir Directory -endf +if g:tlib#input#format_filename == 'r' + + " :nodoc: + function! s:prototype.Highlight_filename() dict "{{{3 + syntax match TLibDir /\s\+\zs.\{-}[\/]\ze[^\/]\+$/ + hi def link TLibDir Directory + syntax match TLibFilename /[^\/]\+$/ + hi def link TLibFilename Normal + endf + + " :nodoc: + function! s:prototype.FormatFilename(file) dict "{{{3 + if !has_key(self.fmt_options, 'maxlen') + let maxco = &co - len(len(self.base)) - eval(g:tlib#input#filename_padding_r) + let maxfi = max(map(copy(self.base), 'len(v:val)')) + let self.fmt_options.maxlen = min([maxco, maxfi]) + " TLogVAR maxco, maxfi, self.fmt_options.maxlen + endif + let max = self.fmt_options.maxlen + if len(a:file) > max + let filename = '...' . strpart(a:file, len(a:file) - max + 3) + else + let filename = printf('% '. max .'s', a:file) + endif + return filename + endf + +else + + " :nodoc: + function! s:prototype.Highlight_filename() dict "{{{3 + " let self.width_filename = 1 + eval(g:tlib_inputlist_width_filename) + " TLogVAR self.base + let self.width_filename = min([ + \ get(self, 'width_filename', &co), + \ empty(g:tlib#input#filename_max_width) ? &co : eval(g:tlib#input#filename_max_width), + \ max(map(copy(self.base), 'len(fnamemodify(v:val, ":t"))')) + \ ]) + " TLogVAR self.width_filename + exec 'syntax match TLibFilename /[^\/]\+$/ contained containedin=TLibDir' + exec 'syntax match TLibDir /\%>'. (1 + self.width_filename) .'c \(|\|\[[^]]*\]\) \zs\(\(\a:\|\.\.\..\{-}\)\?[\/][^&<>*|]\{-}\)\?[^\/]\+$/ contained containedin=TLibMarker contains=TLibFilename' + exec 'syntax match TLibMarker /\%>'. (1 + self.width_filename) .'c \(|\|\[[^]]*\]\) \S.*$/ contains=TLibDir' + hi def link TLibMarker Special + hi def link TLibDir Directory + hi def link TLibFilename NonText + " :nodoc: + function! self.Highlighter(rx) dict + let rx = '/\c\%>'. (1 + self.width_filename) .'c \(|\|\[[^]]*\]\) .\{-}\zs'. escape(a:rx, '/') .'/' + exec 'match' self.matcher.highlight rx + endf + endf -" :nodoc: -function! s:prototype.FormatFilename(file) dict "{{{3 - let width = eval(g:tlib_inputlist_width_filename) - let split = match(a:file, '[/\\]\zs[^/\\]\+$') - if split == -1 - let fname = '' - let dname = a:file - else - let fname = strpart(a:file, split) - let dname = strpart(a:file, 0, split - 1) - endif - " let fname = fnamemodify(a:file, ":p:t") - " " let fname = fnamemodify(a:file, ":t") - " " if isdirectory(a:file) - " " let fname .='/' - " " endif - " let dname = fnamemodify(a:file, ":h") - " let dname = pathshorten(fnamemodify(a:file, ":h")) - let dnmax = &co - max([width, len(fname)]) - 11 - self.index_width - &fdc - if len(dname) > dnmax - let dname = '...'. strpart(dname, len(dname) - dnmax) - endif - let marker = [] - if g:tlib_inputlist_filename_indicators - let bnr = bufnr(a:file) - " TLogVAR a:file, bnr, self.bufnr - if bnr != -1 - if bnr == self.bufnr - call add(marker, '%') + " :nodoc: + function! s:prototype.FormatFilename(file) dict "{{{3 + let width = self.width_filename + let split = match(a:file, '[/\\]\zs[^/\\]\+$') + if split == -1 + let fname = '' + let dname = a:file + else + let fname = strpart(a:file, split) + " let dname = strpart(a:file, 0, split - 1) + let dname = a:file + endif + if strwidth(fname) > width + let fname = strpart(fname, 0, width - 3) .'...' + endif + let dnmax = &co - max([width, len(fname)]) - 10 - self.index_width - &fdc + if g:tlib_inputlist_filename_indicators + let dnmax -= 2 + endif + if len(dname) > dnmax + let dname = '...'. strpart(dname, len(dname) - dnmax) + endif + let marker = [] + if g:tlib_inputlist_filename_indicators + call insert(marker, '[') + let bnr = bufnr(a:file) + " TLogVAR a:file, bnr, self.bufnr + if bnr != -1 + if bnr == self.bufnr + call add(marker, '%') + else + call add(marker, bnr) + endif + if getbufvar(bnr, '&modified') + call add(marker, '+') + endif + if getbufvar(bnr, '&bufhidden') == 'hide' + call add(marker, 'h') + endif + " if !buflisted(bnr) + " call add(marker, 'u') + " endif else call add(marker, ' ') - " elseif buflisted(a:file) - " if getbufvar(a:file, "&mod") - " call add(marker, '+') - " else - " call add(marker, 'B') - " endif - " elseif bufloaded(a:file) - " call add(marker, 'h') - " else - " call add(marker, 'u') endif + call add(marker, ']') else - call add(marker, ' ') + call add(marker, '|') endif - endif - call insert(marker, '|') - call add(marker, '|') - return printf("%-". eval(g:tlib_inputlist_width_filename) ."s %s %s", fname, join(marker, ''), dname) -endf + return printf("%-". self.width_filename ."s %s %s", fname, join(marker, ''), dname) + endf + +endif " :nodoc: @@ -312,7 +358,11 @@ endf " :nodoc: function! s:prototype.GetBaseIdx0(idx) dict "{{{3 - return self.GetBaseIdx(a:idx) - 1 + let idx0 = self.GetBaseIdx(a:idx) - 1 + if idx0 < 0 + call tlib#notify#Echo('TLIB: Internal Error: GetBaseIdx0: idx0 < 0', 'WarningMsg') + endif + return idx0 endf @@ -416,22 +466,25 @@ function! s:prototype.SetFilter() dict "{{{3 let mrx = self.FilterRxPrefix() . self.filter_options let self.filter_pos = [] let self.filter_neg = [] - " TLogVAR self.filter + " TLogVAR mrx, self.filter for filter in self.filter " TLogVAR filter let rx = join(reverse(filter(copy(filter), '!empty(v:val)')), '\|') - if rx =~ '\u' - let mrx1 = mrx .'\C' - else - let mrx1 = mrx - endif " TLogVAR rx - if rx[0] == g:tlib_inputlist_not - if len(rx) > 1 - call add(self.filter_neg, mrx1 .'\('. rx[1:-1] .'\)') + if !empty(rx) + if rx =~ '\u' + let mrx1 = mrx .'\C' + else + let mrx1 = mrx + endif + " TLogVAR rx + if rx[0] == g:tlib_inputlist_not + if len(rx) > 1 + call add(self.filter_neg, mrx1 .'\('. rx[1:-1] .'\)') + endif + else + call add(self.filter_pos, mrx1 .'\('. rx .'\)') endif - else - call add(self.filter_pos, mrx1 .'\('. rx .'\)') endif endfor " TLogVAR self.filter_pos, self.filter_neg @@ -485,14 +538,22 @@ endf " :nodoc: function! s:prototype.BuildTableList() dict "{{{3 + " let time0 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time0 call self.SetFilter() " TLogVAR self.filter_neg, self.filter_pos if empty(self.filter_pos) && empty(self.filter_neg) let self.table = range(1, len(self.base)) let self.list = copy(self.base) else + " let time1 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time1, time1 - time0 let self.table = filter(range(1, len(self.base)), 'self.MatchBaseIdx(v:val)') + " let time2 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time2, time2 - time0 let self.list = map(copy(self.table), 'self.GetBaseItem(v:val)') + " let time3 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time3, time3 - time0 endif endf @@ -623,25 +684,32 @@ endf " :nodoc: function! s:prototype.UseInputListScratch() dict "{{{3 let scratch = self.UseScratch() - " TLogVAR scratch - syntax match InputlListIndex /^\d\+:/ - syntax match InputlListCursor /^\d\+\* .*$/ contains=InputlListIndex - syntax match InputlListSelected /^\d\+# .*$/ contains=InputlListIndex - hi def link InputlListIndex Constant - hi def link InputlListCursor Search - hi def link InputlListSelected IncSearch - " exec "au BufEnter call tlib#input#Resume(". string(self.name) .")" - setlocal nowrap - " hi def link InputlListIndex Special - " let b:tlibDisplayListMarks = {} - let b:tlibDisplayListMarks = [] - let b:tlibDisplayListWorld = self - call tlib#hook#Run('tlib_UseInputListScratch', self) + if !exists('b:tlib_list_init') + call tlib#autocmdgroup#Init() + autocmd TLib VimResized call feedkeys("\", 't') + let b:tlib_list_init = 1 + endif + if !exists('w:tlib_list_init') + " TLogVAR scratch + syntax match InputlListIndex /^\d\+:/ + syntax match InputlListCursor /^\d\+\* .*$/ contains=InputlListIndex + syntax match InputlListSelected /^\d\+# .*$/ contains=InputlListIndex + hi def link InputlListIndex Constant + hi def link InputlListCursor Search + hi def link InputlListSelected IncSearch + setlocal nowrap + " hi def link InputlListIndex Special + " let b:tlibDisplayListMarks = {} + let b:tlibDisplayListMarks = [] + let b:tlibDisplayListWorld = self + call tlib#hook#Run('tlib_UseInputListScratch', self) + let w:tlib_list_init = 1 + endif return scratch endf -" :def: function! s:prototype.Reset(?initial=0) +" s:prototype.Reset(?initial=0) " :nodoc: function! s:prototype.Reset(...) dict "{{{3 TVarArg ['initial', 0] @@ -687,56 +755,158 @@ function! s:prototype.Retrieve(anyway) dict "{{{3 endf +function! s:FormatHelp(help) "{{{3 + " TLogVAR a:help + let max = [0, 0] + for item in a:help + " TLogVAR item + if type(item) == 3 + let itemlen = map(copy(item), 'strwidth(v:val)') + " TLogVAR itemlen + let max = map(range(2), 'max[v:val] >= itemlen[v:val] ? max[v:val] : itemlen[v:val]') + endif + unlet item + endfor + " TLogVAR max + let cols = float2nr((winwidth(0) - &foldcolumn - 1) / (max[0] + max[1] + 2)) + if cols < 1 + let cols = 1 + endif + let fmt = printf('%%%ds: %%-%ds', max[0], max[1]) + " TLogVAR cols, fmt + let help = [] + let idx = -1 + let maxidx = len(a:help) + while idx < maxidx + let push_item = 0 + let accum = [] + for i in range(cols) + let idx += 1 + if idx >= maxidx + break + endif + let item = a:help[idx] + if type(item) == 3 + call add(accum, item) + else + let push_item = 1 + break + endif + unlet item + endfor + if !empty(accum) + call add(help, s:FormatHelpItem(accum, fmt)) + endif + if push_item + call add(help, a:help[idx]) + endif + endwh + " TLogVAR help + return help +endf + + +function! s:FormatHelpItem(item, fmt) "{{{3 + let args = [join(repeat([a:fmt], len(a:item)), ' ')] + for item in a:item + " TLogVAR item + let args += item + endfor + " TLogVAR args + return call('printf', args) +endf + + +" :nodoc: +function! s:prototype.InitHelp() dict "{{{3 + return [] +endf + + +" :nodoc: +function! s:prototype.PushHelp(...) dict "{{{3 + " TLogVAR a:000 + if a:0 == 1 + if type(a:1) == 3 + let self._help += a:1 + else + call add(self._help, a:1) + endif + elseif a:0 == 2 + call add(self._help, a:000) + else + throw "TLIB: PushHelp: Wrong number of arguments: ". string(a:000) + endif + " TLogVAR helpstring +endf + + " :nodoc: function! s:prototype.DisplayHelp() dict "{{{3 - " \ 'Help:', - let help = [ - \ 'Mouse ... Pick an item Letter ... Filter the list', - \ printf(' ... Pick an item "%s", "%s", %sWORD ... AND, OR, NOT', - \ g:tlib_inputlist_and, g:tlib_inputlist_or, g:tlib_inputlist_not), - \ 'Enter ... Pick the current item , ... Reduce filter', - \ ' ... Reset the display Up/Down ... Next/previous item', - \ ' ... Edit top filter string Page Up/Down ... Scroll', - \ ' ... Abort', - \ ] + let self._help = self.InitHelp() + call self.PushHelp('', self.key_mode == 'default' ? 'Abort' : 'Reset keymap') + call self.PushHelp('Enter, ', 'Pick the current item') + call self.PushHelp('', 'Pick an item') + call self.PushHelp('Mouse', 'L: Pick item, R: Show menu') + call self.PushHelp(', ', 'Reduce filter') + call self.PushHelp(', ', 'Enter command') - if self.allow_suspend - call add(help, - \ ' ... Suspend/Resume ... Switch to origin') + if self.key_mode == 'default' + call self.PushHelp('', 'Reset the display') + call self.PushHelp('Up/Down', 'Next/previous item') + call self.PushHelp('', 'Edit top filter string') + call self.PushHelp('Page Up/Down', 'Scroll') + if self.allow_suspend + call self.PushHelp('', 'Suspend/Resume') + call self.PushHelp('', 'Switch to origin') + endif + if stridx(self.type, 'm') != -1 + call self.PushHelp('', '(Un)Select items') + call self.PushHelp('#, ', '(Un)Select the current item') + call self.PushHelp('', '(Un)Select all items') + " \ ' ... Show only selected', + endif endif - if stridx(self.type, 'm') != -1 - let help += [ - \ '#, ... (Un)Select the current item', - \ ' ... (Un)Select all currently visible items', - \ ' ... (Un)Select items', - \ ] - " \ ' ... Show only selected', - endif - for handler in self.key_handlers + " TLogVAR len(self._help) + call self.matcher.Help(self) + + " TLogVAR self.key_mode + for handler in values(self.key_map[self.key_mode]) + " TLogVAR handler let key = get(handler, 'key_name', '') + " TLogVAR key if !empty(key) let desc = get(handler, 'help', '') - call add(help, printf('%-12s ... %s', key, desc)) + if empty(desc) + let desc = get(handler, 'agent', '') + endif + call self.PushHelp(key, desc) endif endfor - if !empty(self.help_extra) - let help += self.help_extra + + if !has_key(self.key_map[self.key_mode], 'unknown_key') + call self.PushHelp('Letter', 'Filter the list') endif - let help += [ + + if self.key_mode == 'default' && !empty(self.help_extra) + call self.PushHelp(self.help_extra) + endif + + " TLogVAR len(self._help) + call self.PushHelp([ \ '', - \ 'Exact matches and matches at word boundaries is given more weight.', - \ 'Warning: Please don''t resize the window with the mouse.', - \ '', - \ 'Press any key to continue.', - \ ] + \ 'Matches at word boundaries are prioritized.', + \ ]) + let self._help = s:FormatHelp(self._help) + let self.temp_prompt = ['Press any key to continue.', 'Question'] " call tlib#normal#WithRegister('gg"tdG', 't') call tlib#buffer#DeleteRange('1', '$') - call append(0, help) + call append(0, self._help) " call tlib#normal#WithRegister('G"tddgg', 't') call tlib#buffer#DeleteRange('$', '$') 1 - call self.Resize(len(help), 0) + call self.Resize(len(self._help), 0) endf @@ -785,12 +955,13 @@ function! s:prototype.GetResize(size) dict "{{{3 endf -" function! s:prototype.DisplayList(query, ?list) +" function! s:prototype.DisplayList(?query=self.Query(), ?list=[]) " :nodoc: -function! s:prototype.DisplayList(query, ...) dict "{{{3 - " TLogVAR a:query +function! s:prototype.DisplayList(...) dict "{{{3 " TLogVAR self.state - let list = a:0 >= 1 ? a:1 : [] + let query = a:0 >= 1 ? a:1 : self.Query() + let list = a:0 >= 2 ? a:2 : [] + " TLogVAR query, len(list) " TLogDBG 'len(list) = '. len(list) call self.UseScratch() " TLogVAR self.scratch @@ -799,6 +970,7 @@ function! s:prototype.DisplayList(query, ...) dict "{{{3 call self.ScrollToOffset() elseif self.state == 'help' call self.DisplayHelp() + call self.SetStatusline(query) else " TLogVAR query " let ll = len(list) @@ -832,7 +1004,7 @@ function! s:prototype.DisplayList(query, ...) dict "{{{3 call add(b:tlibDisplayListMarks, base_pref) call self.DisplayListMark(x, base_pref, '*') call self.SetOffset() - call self.SetStatusline(a:query) + call self.SetStatusline(query) " TLogVAR self.offset call self.ScrollToOffset() let rx0 = self.GetRx0() @@ -841,7 +1013,11 @@ function! s:prototype.DisplayList(query, ...) dict "{{{3 if empty(rx0) match none elseif self.IsValidFilter() - exec 'match '. self.matcher.highlight .' /\c'. escape(rx0, '/') .'/' + if has_key(self, 'Highlighter') + call self.Highlighter(rx0) + else + exec 'match '. self.matcher.highlight .' /\c'. escape(rx0, '/') .'/' + endif endif endif endif @@ -849,22 +1025,51 @@ function! s:prototype.DisplayList(query, ...) dict "{{{3 endf +" :nodoc: function! s:prototype.SetStatusline(query) dict "{{{3 - let query = a:query - let options = [self.matcher.name] - if self.sticky - call add(options, '#') + " TLogVAR a:query + if !empty(self.temp_prompt) + let echo = get(self.temp_prompt, 0, '') + let hl = get(self.temp_prompt, 1, 'Normal') + let self.temp_prompt = [] + else + let hl = 'Normal' + let query = a:query + let options = [self.matcher.name] + if self.sticky + call add(options, '#') + endif + if self.key_mode != 'default' + call add(options, 'map:'. self.key_mode) + endif + if !empty(options) + let sopts = printf('[%s]', join(options, ', ')) + " let echo = query . repeat(' ', &columns - len(sopts) - len(query) - 20) . sopts + let echo = query . ' ' . sopts + " let query .= '%%='. sopts .' ' + endif + " TLogVAR &l:statusline, query + " let &l:statusline = query endif - if !empty(options) - let sopts = printf('[%s]', join(options, ', ')) - " let echo = query . repeat(' ', &columns - len(sopts) - len(query) - 20) . sopts - let echo = query . ' ' . sopts - " let query .= '%%='. sopts .' ' - endif - " TLogVAR &l:statusline, query - " let &l:statusline = query echo - echo echo + if hl != 'Normal' + exec 'echohl' hl + echo echo + echohl None + else + echo echo + endif +endf + + +" :nodoc: +function! s:prototype.Query() dict "{{{3 + if g:tlib_inputlist_shortmessage + let query = 'Filter: '. self.DisplayFilter() + else + let query = self.query .' (filter: '. self.DisplayFilter() .'; press "?" for help)' + endif + return query endf diff --git a/sources_non_forked/tlib/autoload/tlib/agent.vim b/sources_non_forked/tlib/autoload/tlib/agent.vim index c6a02266..56365c11 100644 --- a/sources_non_forked/tlib/autoload/tlib/agent.vim +++ b/sources_non_forked/tlib/autoload/tlib/agent.vim @@ -3,8 +3,8 @@ " @Website: http://www.vim.org/account/profile.php?user_id=4037 " @License: GPL (see http://www.gnu.org/licenses/gpl.txt) " @Created: 2007-06-24. -" @Last Change: 2010-11-20. -" @Revision: 0.1.185 +" @Last Change: 2012-10-03. +" @Revision: 0.1.208 " :filedoc: @@ -14,11 +14,16 @@ " General {{{1 function! tlib#agent#Exit(world, selected) "{{{3 - call a:world.CloseScratch() - let a:world.state = 'exit empty escape' - let a:world.list = [] - " let a:world.base = [] - call a:world.ResetSelected() + if a:world.key_mode == 'default' + call a:world.CloseScratch() + let a:world.state = 'exit empty escape' + let a:world.list = [] + " let a:world.base = [] + call a:world.ResetSelected() + else + let a:world.key_mode = 'default' + let a:world.state = 'redisplay' + endif return a:world endf @@ -156,17 +161,14 @@ function! tlib#agent#Suspend(world, selected) "{{{3 " TLogDBG bufnr('%') let br = tlib#buffer#Set(a:world.scratch) " TLogVAR br, a:world.bufnr, a:world.scratch - " TLogDBG bufnr('%') + if bufnr('%') != a:world.scratch + echohl WarningMsg + echom "tlib#agent#Suspend: Internal error: Not a scratch buffer:" bufname('%') + echohl NONE + endif + " TLogVAR bufnr('%'), bufname('%'), a:world.scratch call tlib#autocmdgroup#Init() - autocmd TLib InsertEnter,InsertChange call tlib#input#Resume("world", 0) - let b:tlib_suspend = { - \ '': 0, '': 0, '': 0, - \ '': 1, - \ '': 1, '': 0, '': 0, '': 0, - \ '<': 2} - for [m, pick] in items(b:tlib_suspend) - exec 'noremap '. m .' :call tlib#input#Resume("world", '. pick .')' - endfor + exec 'autocmd TLib BufEnter call tlib#input#Resume("world", 0, '. a:world.scratch .')' let b:tlib_world = a:world exec br let a:world.state = 'exit suspend' @@ -373,6 +375,7 @@ function! tlib#agent#ViewFile(world, selected) "{{{3 let cmd1 = 'buffer' endif call tlib#file#With(cmd0, cmd1, a:selected, a:world) + " TLogVAR &filetype exec back let a:world.state = 'display' endif @@ -512,3 +515,49 @@ function! tlib#agent#Wildcard(world, selected) "{{{3 return a:world endf + +function! tlib#agent#Null(world, selected) "{{{3 + let a:world.state = 'redisplay' + return a:world +endf + + +function! tlib#agent#ExecAgentByName(world, selected) "{{{3 + let s:agent_names_world = a:world + let agent_names = {} + for def in values(a:world.key_map[a:world.key_mode]) + if has_key(def, 'help') && !empty(def.help) && has_key(def, 'agent') && !empty(def.agent) + let agent_names[def.help] = def.agent + endif + endfor + let s:agent_names = join(sort(keys(agent_names)), "\n") + let command = input('Command: ', '', 'custom,tlib#agent#CompleteAgentNames') + " TLogVAR command + if !has_key(agent_names, command) + " TLogVAR command + silent! let matches = filter(keys(agent_names), 'v:val =~ command') + " TLogVAR matches + if len(matches) == 1 + let command = matches[0] + endif + endif + if has_key(agent_names, command) + let agent = agent_names[command] + return call(agent, [a:world, a:selected]) + else + if !empty(command) + echohl WarningMsg + echom "Unknown command:" command + echohl NONE + sleep 1 + endif + let a:world.state = 'display' + return a:world + endif +endf + + +function! tlib#agent#CompleteAgentNames(ArgLead, CmdLine, CursorPos) + return s:agent_names +endf + diff --git a/sources_non_forked/tlib/autoload/tlib/buffer.vim b/sources_non_forked/tlib/autoload/tlib/buffer.vim index 3f49fdd6..de151a49 100644 --- a/sources_non_forked/tlib/autoload/tlib/buffer.vim +++ b/sources_non_forked/tlib/autoload/tlib/buffer.vim @@ -3,8 +3,8 @@ " @Website: http://www.vim.org/account/profile.php?user_id=4037 " @License: GPL (see http://www.gnu.org/licenses/gpl.txt) " @Created: 2007-06-30. -" @Last Change: 2010-09-23. -" @Revision: 0.0.334 +" @Last Change: 2012-02-09. +" @Revision: 0.0.351 let s:bmru = [] @@ -351,6 +351,7 @@ function! tlib#buffer#InsertText(text, ...) "{{{3 exec 'norm! '. posshift .'h' endif endif + " TLogDBG getline(lineno) " TLogDBG string(getline(1, '$')) return grow endf diff --git a/sources_non_forked/tlib/autoload/tlib/cache.vim b/sources_non_forked/tlib/autoload/tlib/cache.vim index 2913772b..c480495c 100644 --- a/sources_non_forked/tlib/autoload/tlib/cache.vim +++ b/sources_non_forked/tlib/autoload/tlib/cache.vim @@ -3,8 +3,8 @@ " @Website: http://www.vim.org/account/profile.php?user_id=4037 " @License: GPL (see http://www.gnu.org/licenses/gpl.txt) " @Created: 2007-06-30. -" @Last Change: 2011-03-10. -" @Revision: 0.1.182 +" @Last Change: 2012-05-11. +" @Revision: 0.1.192 " |tlib#cache#Purge()|: Remove cache files older than N days. @@ -24,6 +24,10 @@ TLet g:tlib#cache#script_encoding = &enc " 2 ... Yes TLet g:tlib#cache#run_script = 1 +" If non-nil, don't display a message that files were deleted from the +" cache. +TLet g:tlib#cache#silent = 0 + " A list of regexps that are matched against partial filenames of the " cached files. If a regexp matches, the file won't be removed by " |tlib#cache#Purge()|. @@ -42,10 +46,10 @@ function! tlib#cache#Dir(...) "{{{3 endf -" :def: function! tlib#cache#Filename(type, ?file=%, ?mkdir=0) +" :def: function! tlib#cache#Filename(type, ?file=%, ?mkdir=0, ?dir='') function! tlib#cache#Filename(type, ...) "{{{3 " TLogDBG 'bufname='. bufname('.') - let dir = tlib#cache#Dir() + let dir = a:0 >= 3 && !empty(a:3) ? a:3 : tlib#cache#Dir() if a:0 >= 1 && !empty(a:1) let file = a:1 else @@ -87,70 +91,64 @@ endf function! tlib#cache#Save(cfile, dictionary) "{{{3 - if !empty(a:cfile) - " TLogVAR a:dictionary - call writefile([string(a:dictionary)], a:cfile, 'b') - endif + call tlib#persistent#Save(a:cfile, a:dictionary) endf function! tlib#cache#Get(cfile) "{{{3 call tlib#cache#MaybePurge() - if !empty(a:cfile) && filereadable(a:cfile) - let val = readfile(a:cfile, 'b') - return eval(join(val, "\n")) - else - return {} - endif + return tlib#persistent#Get(a:cfile) endf " Call |tlib#cache#Purge()| if the last purge was done before - " |g:tlib#cache#purge_every_days|. - function! tlib#cache#MaybePurge() "{{{3 - if g:tlib#cache#purge_every_days < 0 - return - endif - let dir = tlib#cache#Dir('g') - let last_purge = tlib#file#Join([dir, '.last_purge']) - let last_purge_exists = filereadable(last_purge) +" |g:tlib#cache#purge_every_days|. +function! tlib#cache#MaybePurge() "{{{3 + if g:tlib#cache#purge_every_days < 0 + return + endif + let dir = tlib#cache#Dir('g') + let last_purge = tlib#file#Join([dir, '.last_purge']) + let last_purge_exists = filereadable(last_purge) + if last_purge_exists + let threshold = localtime() - g:tlib#cache#purge_every_days * g:tlib#date#dayshift + let should_purge = getftime(last_purge) < threshold + else + let should_purge = 0 " should ignore empty dirs, like the tmru one: !empty(glob(tlib#file#Join([dir, '**']))) + endif + if should_purge if last_purge_exists - let threshold = localtime() - g:tlib#cache#purge_every_days * g:tlib#date#dayshift - let should_purge = getftime(last_purge) < threshold + let yn = 'y' else - let should_purge = 0 " should ignore empty dirs, like the tmru one: !empty(glob(tlib#file#Join([dir, '**']))) + let txt = "TLib: The cache directory '". dir ."' should be purged of old files.\nDelete files older than ". g:tlib#cache#purge_days ." days now?" + let yn = tlib#input#Dialog(txt, ['yes', 'no'], 'no') endif - if should_purge - if last_purge_exists - let yn = 'y' - else - let txt = "TLib: The cache directory '". dir ."' should be purged of old files.\nDelete files older than ". g:tlib#cache#purge_days ." days now?" - let yn = tlib#input#Dialog(txt, ['yes', 'no'], 'no') + if yn =~ '^y\%[es]$' + call tlib#cache#Purge() + else + let g:tlib#cache#purge_every_days = -1 + if !last_purge_exists + call s:PurgeTimestamp(dir) endif - if yn =~ '^y\%[es]$' - call tlib#cache#Purge() - else - let g:tlib#cache#purge_every_days = -1 - if !last_purge_exists - call s:PurgeTimestamp(dir) - endif - echohl WarningMsg - echom "TLib: Please run :call tlib#cache#Purge() to clean up ". dir - echohl NONE - endif - elseif !last_purge_exists - call s:PurgeTimestamp(dir) + echohl WarningMsg + echom "TLib: Please run :call tlib#cache#Purge() to clean up ". dir + echohl NONE endif - endf + elseif !last_purge_exists + call s:PurgeTimestamp(dir) + endif +endf " Delete old files. function! tlib#cache#Purge() "{{{3 let threshold = localtime() - g:tlib#cache#purge_days * g:tlib#date#dayshift let dir = tlib#cache#Dir('g') - echohl WarningMsg - echom "TLib: Delete files older than ". g:tlib#cache#purge_days ." days from ". dir - echohl NONE + if !g:tlib#cache#silent + echohl WarningMsg + echom "TLib: Delete files older than ". g:tlib#cache#purge_days ." days from ". dir + echohl NONE + endif let files = tlib#cache#ListFilesInCache() let deldir = [] let newer = [] @@ -169,7 +167,6 @@ function! tlib#cache#Purge() "{{{3 call add(msg, "TLib: Could not delete cache file: ". file) else call add(msg, "TLib: Delete cache file: ". file) - " echo "TLib: Delete cache file: ". file endif else call add(newer, file) @@ -179,7 +176,7 @@ function! tlib#cache#Purge() "{{{3 finally let &more = more endtry - if !empty(msg) + if !empty(msg) && !g:tlib#cache#silent echo join(msg, "\n") endif if !empty(deldir) @@ -206,11 +203,14 @@ function! tlib#cache#Purge() "{{{3 call inputsave() if g:tlib#cache#run_script == 0 echohl WarningMsg - echom "TLib: Please review and execute ". scriptfile + if g:tlib#cache#silent + echom "TLib: Purged cache. Need to run script to delete directories" + endif + echom "TLib: Please review and execute: ". scriptfile echohl NONE else try - let yn = g:tlib#cache#run_script == 2 ? 'y' : tlib#input#Dialog("TLib: Could not delete some directories.\nDirectory removal script: ". scriptfile ."\nRun script to delete directories now?", ['yes', 'no', 'edit'], 'no') + let yn = g:tlib#cache#run_script == 2 ? 'y' : tlib#input#Dialog("TLib: About to delete directories by means of a shell script.\nDirectory removal script: ". scriptfile ."\nRun script to delete directories now?", ['yes', 'no', 'edit'], 'no') if yn =~ '^y\%[es]$' exec 'cd '. fnameescape(dir) exec '! ' &shell shellescape(scriptfile, 1) diff --git a/sources_non_forked/tlib/autoload/tlib/cmd.vim b/sources_non_forked/tlib/autoload/tlib/cmd.vim index ea8cd8e5..478e4bb6 100644 --- a/sources_non_forked/tlib/autoload/tlib/cmd.vim +++ b/sources_non_forked/tlib/autoload/tlib/cmd.vim @@ -3,8 +3,8 @@ " @Website: http://www.vim.org/account/profile.php?user_id=4037 " @License: GPL (see http://www.gnu.org/licenses/gpl.txt) " @Created: 2007-08-23. -" @Last Change: 2011-04-28. -" @Revision: 0.0.31 +" @Last Change: 2012-02-10. +" @Revision: 0.0.35 if &cp || exists("loaded_tlib_cmd_autoload") finish @@ -12,12 +12,18 @@ endif let loaded_tlib_cmd_autoload = 1 +let g:tlib#cmd#last_output = [] + + function! tlib#cmd#OutputAsList(command) "{{{3 + " TLogVAR a:command " let lines = '' redir => lines silent! exec a:command redir END - return split(lines, '\n') + " TLogVAR lines + let g:tlib#cmd#last_output = split(lines, '\n') + return g:tlib#cmd#last_output endf diff --git a/sources_non_forked/tlib/autoload/tlib/file.vim b/sources_non_forked/tlib/autoload/tlib/file.vim index 66673e48..f768abdd 100644 --- a/sources_non_forked/tlib/autoload/tlib/file.vim +++ b/sources_non_forked/tlib/autoload/tlib/file.vim @@ -3,8 +3,8 @@ " @Website: http://www.vim.org/account/profile.php?user_id=4037 " @License: GPL (see http://www.gnu.org/licenses/gpl.txt) " @Created: 2007-06-30. -" @Last Change: 2010-04-03. -" @Revision: 0.0.74 +" @Last Change: 2012-03-23. +" @Revision: 0.0.106 if &cp || exists("loaded_tlib_file_autoload") finish @@ -97,22 +97,34 @@ endf function! tlib#file#With(fcmd, bcmd, files, ...) "{{{3 " TLogVAR a:fcmd, a:bcmd, a:files exec tlib#arg#Let([['world', {}]]) + call tlib#autocmdgroup#Init() + augroup TLibFileRead + autocmd! + augroup END for f in a:files let bn = bufnr('^'.f.'$') " TLogVAR f, bn + let bufloaded = bufloaded(bn) + let ok = 0 + let s:bufread = "" if bn != -1 && buflisted(bn) if !empty(a:bcmd) " TLogDBG a:bcmd .' '. bn exec a:bcmd .' '. bn + let ok = 1 call s:SetScrollBind(world) endif else if filereadable(f) if !empty(a:fcmd) - " TLogDBG a:fcmd .' '. escape(f, '%#\ ') - " exec a:fcmd .' '. escape(f, '%#\ ') - " exec a:fcmd .' '. escape(f, '%# ') - exec a:fcmd .' '. tlib#arg#Ex(f) + " TLogDBG a:fcmd .' '. tlib#arg#Ex(f) + exec 'autocmd TLibFileRead BufRead' escape(f, ' ') 'let s:bufread=expand(":p")' + try + exec a:fcmd .' '. tlib#arg#Ex(f) + finally + exec 'autocmd! TLibFileRead BufRead' + endtry + let ok = 1 call s:SetScrollBind(world) endif else @@ -121,7 +133,14 @@ function! tlib#file#With(fcmd, bcmd, files, ...) "{{{3 echohl NONE endif endif + " TLogVAR ok, bufloaded, &filetype + if empty(s:bufread) && ok && !bufloaded && empty(&filetype) + doautocmd BufRead + endif endfor + augroup! TLibFileRead + unlet! s:bufread + " TLogDBG "done" endf diff --git a/sources_non_forked/tlib/autoload/tlib/input.vim b/sources_non_forked/tlib/autoload/tlib/input.vim index 4b081120..302aca88 100644 --- a/sources_non_forked/tlib/autoload/tlib/input.vim +++ b/sources_non_forked/tlib/autoload/tlib/input.vim @@ -3,14 +3,36 @@ " @Website: http://www.vim.org/account/profile.php?user_id=4037 " @License: GPL (see http://www.gnu.org/licenses/gpl.txt) " @Created: 2007-06-30. -" @Last Change: 2011-03-31. -" @Revision: 0.0.840 +" @Last Change: 2012-10-01. +" @Revision: 0.0.966 " :filedoc: " Input-related, select from a list etc. +" If true, define a popup menu for |tlib#input#List()| and related +" functions. +TLet g:tlib#input#use_popup = has('menu') && (has('gui_gtk') || has('gui_gtk2') || has('gui_win32')) + + +" How to format filenames: +" l ... Show basenames on the left side, separated from the +" directory names +" r ... Show basenames on the right side +TLet g:tlib#input#format_filename = 'l' + + +" If g:tlib#input#format_filename == 'r', how much space should be kept +" free on the right side. +TLet g:tlib#input#filename_padding_r = '&co / 10' + + +" If g:tlib#input#format_filename == 'l', an expression that +" |eval()|uates to the maximum display width of filenames. +TLet g:tlib#input#filename_max_width = '&co / 2' + + " Functions related to tlib#input#List(type, ...) "{{{2 " :def: function! tlib#input#List(type. ?query='', ?list=[], ?handlers=[], ?default="", ?timeout=0) @@ -115,65 +137,39 @@ endf " (an instance of tlib#World as returned by |tlib#World#New|). function! tlib#input#ListW(world, ...) "{{{3 TVarArg 'cmd' - if a:world.pick_last_item >= 1 && stridx(a:world.type, 'e') == -1 && len(a:world.base) <= 1 - return get(a:world.base, 0, a:world.rv) - endif + " let time0 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time0 let world = a:world - let world.filetype = &filetype - let world.fileencoding = &fileencoding - call world.SetMatchMode(tlib#var#Get('tlib_inputlist_match', 'wb')) + if world.pick_last_item >= 1 && stridx(world.type, 'e') == -1 && len(world.base) <= 1 + let rv = get(world.base, 0, world.rv) + if stridx(world.type, 'm') != -1 + return [rv] + else + return rv + endif + endif call s:Init(world, cmd) " TLogVAR world.state, world.sticky, world.initial_index - let key_agents = copy(g:tlib_keyagents_InputList_s) - if stridx(world.type, 'm') != -1 - call extend(key_agents, g:tlib_keyagents_InputList_m, 'force') - endif - if has('menu') - amenu ]TLibInputListPopupMenu.Pick\ selected\ item - amenu ]TLibInputListPopupMenu.Select # - amenu ]TLibInputListPopupMenu.Select\ all - amenu ]TLibInputListPopupMenu.Reset\ list - amenu ]TLibInputListPopupMenu.Cancel - amenu ]TLibInputListPopupMenu.-StandardEntries- : - endif - for handler in world.key_handlers - let k = get(handler, 'key', '') - if !empty(k) - let key_agents[k] = handler.agent - if has('menu') && has_key(handler, 'help') && !empty(handler.help) - exec 'amenu ]TLibInputListPopupMenu.'. escape(handler.help, ' .\') - \ .' '. handler.key_name - let world.has_menu = 1 - endif - endif - endfor " let statusline = &l:statusline " let laststatus = &laststatus let lastsearch = @/ + let scrolloff = &l:scrolloff + let &l:scrolloff = 0 let @/ = '' let dlist = [] " let &laststatus = 2 - let world.initial_display = 1 try while !empty(world.state) && world.state !~ '^exit' && (world.show_empty || !empty(world.base)) " TLogDBG 'while' " TLogVAR world.state + " let time01 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time01, time01 - time0 try - for handler in world.state_handlers - let eh = get(handler, 'state', '') - if !empty(eh) && world.state =~ eh - let ea = get(handler, 'exec', '') - if !empty(ea) - exec ea - else - let agent = get(handler, 'agent', '') - let world = call(agent, [world, world.GetSelectedItems(world.CurrentItem())]) - call s:CheckAgentReturnValue(agent, world) - endif - endif - endfor + call s:RunStateHandlers(world) + " let time02 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time02, time02 - time0 if world.state =~ '\' " TLogDBG 'reset' " call world.Reset(world.state =~ '\') @@ -181,23 +177,21 @@ function! tlib#input#ListW(world, ...) "{{{3 continue endif - let llenw = len(world.base) - winheight(0) + 1 - if world.offset > llenw - let world.offset = llenw - endif - if world.offset < 1 - let world.offset = 1 - endif + call s:SetOffset(world) + " let time02 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time02, time02 - time0 " TLogDBG 1 " TLogVAR world.state if world.state == 'scroll' let world.prefidx = world.offset let world.state = 'redisplay' endif + if world.state =~ '\' let world.sticky = 1 endif + " TLogVAR world.filter " TLogVAR world.sticky if world.state =~ '\' @@ -206,9 +200,15 @@ function! tlib#input#ListW(world, ...) "{{{3 throw 'pick' elseif world.state =~ 'display' if world.state =~ '^display' + " let time03 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time03, time03 - time0 if world.IsValidFilter() + " let time1 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time1, time1 - time0 call world.BuildTableList() + " let time2 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time2, time2 - time0 " TLogDBG 2 " TLogDBG len(world.table) " TLogVAR world.table @@ -223,6 +223,8 @@ function! tlib#input#ListW(world, ...) "{{{3 let dindex = world.index_table let world.index_width = len(max(dindex)) endif + " let time3 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time3, time3 - time0 if world.llen == 0 && !world.show_empty call world.ReduceFilter() let world.offset = 1 @@ -241,6 +243,8 @@ function! tlib#input#ListW(world, ...) "{{{3 let world.last_item = '' endif endif + " let time4 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time4, time4 - time0 " TLogDBG 4 " TLogVAR world.idx, world.llen, world.state " TLogDBG world.FilterIsEmpty() @@ -256,6 +260,8 @@ function! tlib#input#ListW(world, ...) "{{{3 let world.prefidx = 1 endif endif + " let time5 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time5, time5 - time0 " TLogVAR world.initial_index, world.prefidx " TLogDBG 5 " TLogDBG len(world.list) @@ -270,19 +276,30 @@ function! tlib#input#ListW(world, ...) "{{{3 endif " TLogVAR world.prefidx " TLogDBG 6 + " let time6 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time6, time6 - time0 if world.offset_horizontal > 0 call map(dlist, 'v:val[world.offset_horizontal:-1]') endif + " let time7 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time7, time7 - time0 " TLogVAR dindex let dlist = map(range(0, world.llen - 1), 'printf("%0'. world.index_width .'d", dindex[v:val]) .": ". dlist[v:val]') " TLogVAR dlist + " let time8 = str2float(reltimestr(reltime())) " DBG + " TLogVAR time8, time8 - time0 else let dlist = ['Malformed filter'] endif + else + if world.prefidx == 0 + let world.prefidx = 1 + endif endif + " TLogVAR world.idx, world.prefidx " TLogDBG 7 " TLogVAR world.prefidx, world.offset @@ -301,12 +318,7 @@ function! tlib#input#ListW(world, ...) "{{{3 " TLogDBG 8 if world.initial_display || !tlib#char#IsAvailable() " TLogDBG len(dlist) - if g:tlib_inputlist_shortmessage - let query = 'Filter: '. world.DisplayFilter() - else - let query = world.query .' (filter: '. world.DisplayFilter() .'; press "?" for help)' - endif - call world.DisplayList(query, dlist) + call world.DisplayList(world.Query(), dlist) call world.FollowCursor() let world.initial_display = 0 " TLogDBG 9 @@ -320,7 +332,7 @@ function! tlib#input#ListW(world, ...) "{{{3 " if world.state == 'scroll' " let world.prefidx = world.offset " endif - call world.DisplayList('') + call world.DisplayList() if world.state == 'help' let world.state = 'display' else @@ -344,21 +356,31 @@ function! tlib#input#ListW(world, ...) "{{{3 " TLogVAR world.timeout let c = tlib#char#Get(world.timeout, world.timeout_resolution) + " TLogVAR c, has_key(world.key_map[world.key_mode],c) + " TLogDBG string(sort(keys(world.key_map[world.key_mode]))) if world.state != '' " continue - elseif has_key(key_agents, c) + elseif has_key(world.key_map[world.key_mode], c) let sr = @/ silent! let @/ = lastsearch - " TLogVAR c, key_agents[c] - " TLog "Agent: ". string(key_agents[c]) - let world = call(key_agents[c], [world, world.GetSelectedItems(world.CurrentItem())]) + " TLogVAR c, world.key_map[world.key_mode][c] + " TLog "Agent: ". string(world.key_map[world.key_mode][c]) + let handler = world.key_map[world.key_mode][c] + " TLogVAR handler + let world = call(handler.agent, [world, world.GetSelectedItems(world.CurrentItem())]) call s:CheckAgentReturnValue(c, world) silent! let @/ = sr " continue elseif c == 13 throw 'pick' elseif c == 27 - let world.state = 'exit empty' + " TLogVAR c, world.key_mode + if world.key_mode != 'default' + let world.key_mode = 'default' + let world.state = 'redisplay' + else + let world.state = 'exit empty' + endif elseif c == "\" let world.prefidx = world.GetLineIdx(v:mouse_lnum) " let world.offset = world.prefidx @@ -371,12 +393,12 @@ function! tlib#input#ListW(world, ...) "{{{3 endif throw 'pick' elseif c == "\" - if has('menu') + if g:tlib#input#use_popup && world.has_menu " if v:mouse_lnum != line('.') " endif let world.prefidx = world.GetLineIdx(v:mouse_lnum) let world.state = 'redisplay' - call world.DisplayList('') + call world.DisplayList() if line('w$') - v:mouse_lnum < 6 popup ]TLibInputListPopupMenu else @@ -386,6 +408,9 @@ function! tlib#input#ListW(world, ...) "{{{3 let world.state = 'redisplay' endif " TLogVAR world.prefidx, world.state + elseif has_key(world.key_map[world.key_mode], 'unknown_key') + let agent = world.key_map[world.key_mode].unknown_key.agent + let world = call(agent, [world, c]) elseif c >= 32 let world.state = 'display' let numbase = get(world.numeric_chars, c, -99999) @@ -526,8 +551,10 @@ function! tlib#input#ListW(world, ...) "{{{3 " let &l:statusline = statusline " let &laststatus = laststatus silent! let @/ = lastsearch - if has('menu') && world.has_menu + let &l:scrolloff = scrolloff + if g:tlib#input#use_popup && world.has_menu silent! aunmenu ]TLibInputListPopupMenu + let world.has_menu = 0 endif " TLogDBG 'finally 2' @@ -568,6 +595,7 @@ endf function! s:Init(world, cmd) "{{{3 " TLogVAR a:cmd + let a:world.initial_display = 1 if a:cmd =~ '\' let a:world.sticky = 1 endif @@ -582,15 +610,117 @@ function! s:Init(world, cmd) "{{{3 endif elseif !a:world.initialized " TLogVAR a:world.initialized, a:world.win_wnr, a:world.bufnr + let a:world.filetype = &filetype + let a:world.fileencoding = &fileencoding + call a:world.SetMatchMode(tlib#var#Get('tlib_inputlist_match', 'wb')) call a:world.Initialize() + if !has_key(a:world, 'key_mode') + let a:world.key_mode = 'default' + endif + " TLogVAR has_key(a:world,'key_map') + if has_key(a:world, 'key_map') + " TLogVAR has_key(a:world.key_map,a:world.key_mode) + if has_key(a:world.key_map, a:world.key_mode) + let a:world.key_map[a:world.key_mode] = extend( + \ a:world.key_map[a:world.key_mode], + \ copy(g:tlib_keyagents_InputList_s), + \ 'keep') + else + let a:world.key_map[a:world.key_mode] = copy(g:tlib_keyagents_InputList_s) + endif + else + let a:world.key_map = { + \ a:world.key_mode : copy(g:tlib_keyagents_InputList_s) + \ } + endif + if stridx(a:world.type, 'm') != -1 + call extend(a:world.key_map[a:world.key_mode], g:tlib_keyagents_InputList_m, 'force') + endif + for key_mode in keys(a:world.key_map) + let a:world.key_map[key_mode] = map(a:world.key_map[key_mode], 'type(v:val) == 4 ? v:val : {"agent": v:val}') + endfor + if type(a:world.key_handlers) == 3 + call s:ExtendKeyMap(a:world, a:world.key_mode, a:world.key_handlers) + elseif type(a:world.key_handlers) == 4 + for [world_key_mode, world_key_handlers] in items(a:world.key_handlers) + call s:ExtendKeyMap(a:world, world_key_mode, world_key_handlers) + endfor + else + throw "tlib#input#ListW: key_handlers must be either a list or a dictionary" + endif if !empty(a:cmd) let a:world.state .= ' '. a:cmd endif endif + call s:BuildMenu(a:world) " TLogVAR a:world.state, a:world.sticky endf +function! s:ExtendKeyMap(world, key_mode, key_handlers) "{{{3 + for handler in a:key_handlers + let k = get(handler, 'key', '') + if !empty(k) + let a:world.key_map[a:key_mode][k] = handler + endif + endfor +endf + + +function! s:BuildMenu(world) "{{{3 + if g:tlib#input#use_popup + if a:world.has_menu + silent! aunmenu ]TLibInputListPopupMenu + endif + amenu ]TLibInputListPopupMenu.Pick\ selected\ item + amenu ]TLibInputListPopupMenu.Select # + amenu ]TLibInputListPopupMenu.Select\ all + amenu ]TLibInputListPopupMenu.Reset\ list + amenu ]TLibInputListPopupMenu.Cancel + amenu ]TLibInputListPopupMenu.-StandardEntries- : + let a:world.has_menu = 1 + for [key_mode, key_handlers] in items(a:world.key_map) + let keys = sort(keys(key_handlers)) + for key in keys + let handler = key_handlers[key] + let k = get(handler, 'key', '') + if !empty(k) && has_key(handler, 'help') && !empty(handler.help) + if empty(key_mode) || key_mode == 'default' + exec 'amenu ]TLibInputListPopupMenu.'. escape(handler.help, ' .\') + \ .' '. handler.key_name + else + exec 'amenu ]TLibInputListPopupMenu'. + \ '.'. escape(key_mode, ' .\') + \ '.'. escape(handler.help, ' .\') + \ .' '. handler.key_name + endif + endif + endfor + endfor + endif +endf + + +function! s:RunStateHandlers(world) "{{{3 + " Provide the variable "world" in the environment of an "exec" + " handler (ea). + let world = a:world + for handler in a:world.state_handlers + let eh = get(handler, 'state', '') + if !empty(eh) && a:world.state =~ eh + let ea = get(handler, 'exec', '') + if !empty(ea) + exec ea + else + let agent = get(handler, 'agent', '') + let a:world = call(agent, [a:world, a:world.GetSelectedItems(a:world.CurrentItem())]) + call s:CheckAgentReturnValue(agent, a:world) + endif + endif + endfor +endf + + function! s:CheckAgentReturnValue(name, value) "{{{3 if type(a:value) != 4 && !has_key(a:value, 'state') echoerr 'Malformed agent: '. a:name @@ -599,6 +729,17 @@ function! s:CheckAgentReturnValue(name, value) "{{{3 endf +function! s:SetOffset(world) "{{{3 + let llenw = len(a:world.base) - winheight(0) + 1 + if a:world.offset > llenw + let a:world.offset = llenw + endif + if a:world.offset < 1 + let a:world.offset = 1 + endif +endf + + " Functions related to tlib#input#EditList(type, ...) "{{{2 " :def: function! tlib#input#EditList(query, list, ?timeout=0) @@ -622,26 +763,47 @@ function! tlib#input#EditList(query, list, ...) "{{{3 endf -function! tlib#input#Resume(name, pick) "{{{3 +function! tlib#input#Resume(name, pick, bufnr) "{{{3 + " TLogVAR a:name, a:pick echo - if exists('b:tlib_suspend') - for [m, pick] in items(b:tlib_suspend) - exec 'unmap '. m - endfor - unlet b:tlib_suspend + if bufnr('%') != a:bufnr + if g:tlib_debug + echohl WarningMsg + echom "tlib#input#Resume: Internal error: Not in scratch buffer:" bufname('%') + echohl NONE + endif + let br = tlib#buffer#Set(a:bufnr) endif - call tlib#autocmdgroup#Init() - autocmd! TLib InsertEnter,InsertChange - let b:tlib_{a:name}.state = 'display' - " call tlib#input#List('resume '. a:name) - let cmd = 'resume '. a:name - if a:pick >= 1 - let cmd .= ' pick' - if a:pick >= 2 - let cmd .= ' sticky' - end + if !exists('b:tlib_'. a:name) + if g:tlib_debug + echohl WarningMsg + echom "tlib#input#Resume: Internal error: b:tlib_". a:name ." does not exist:" bufname('%') + echohl NONE + redir => varss + silent let b: + redir END + let vars = split(varss, '\n') + call filter(vars, 'v:val =~ "^b:tlib_"') + echom "DEBUG tlib#input#Resume" string(vars) + endif + else + call tlib#autocmdgroup#Init() + autocmd! TLib BufEnter + if b:tlib_{a:name}.state =~ '\' + let b:tlib_{a:name}.state = 'redisplay' + else + let b:tlib_{a:name}.state .= ' redisplay' + endif + " call tlib#input#List('resume '. a:name) + let cmd = 'resume '. a:name + if a:pick >= 1 + let cmd .= ' pick' + if a:pick >= 2 + let cmd .= ' sticky' + end + endif + call tlib#input#ListW(b:tlib_{a:name}, cmd) endif - call tlib#input#ListW(b:tlib_{a:name}, cmd) endf diff --git a/sources_non_forked/tlib/autoload/tlib/notify.vim b/sources_non_forked/tlib/autoload/tlib/notify.vim index c6a19367..cf6a0473 100644 --- a/sources_non_forked/tlib/autoload/tlib/notify.vim +++ b/sources_non_forked/tlib/autoload/tlib/notify.vim @@ -3,16 +3,17 @@ " @Website: http://www.vim.org/account/profile.php?user_id=4037 " @License: GPL (see http://www.gnu.org/licenses/gpl.txt) " @Created: 2008-09-19. -" @Last Change: 2011-03-10. -" @Revision: 0.0.15 +" @Last Change: 2012-01-02. +" @Revision: 0.0.19 let s:save_cpo = &cpo set cpo&vim +" :display: tlib#notify#Echo(text, ?style='') " Print text in the echo area. Temporarily disable 'ruler' and 'showcmd' " in order to prevent |press-enter| messages. -function! tlib#notify#Echo(text, ...) "{{{3 +function! tlib#notify#Echo(text, ...) TVarArg 'style' let ruler = &ruler let showcmd = &showcmd diff --git a/sources_non_forked/tlib/autoload/tlib/persistent.vim b/sources_non_forked/tlib/autoload/tlib/persistent.vim new file mode 100644 index 00000000..a4611a69 --- /dev/null +++ b/sources_non_forked/tlib/autoload/tlib/persistent.vim @@ -0,0 +1,47 @@ +" persistent.vim -- Persistent data +" @Author: Tom Link (mailto:micathom AT gmail com?subject=[vim]) +" @License: GPL (see http://www.gnu.org/licenses/gpl.txt) +" @Created: 2012-05-11. +" @Last Change: 2012-05-11. +" @Revision: 6 + +" The directory for persistent data files. If empty, use +" |tlib#dir#MyRuntime|.'/share'. +TLet g:tlib_persistent = '' + + +" :display: tlib#persistent#Dir(?mode = 'bg') +" Return the full directory name for persistent data files. +function! tlib#persistent#Dir() "{{{3 + TVarArg ['mode', 'bg'] + let dir = tlib#var#Get('tlib_persistent', mode) + if empty(dir) + let dir = tlib#file#Join([tlib#dir#MyRuntime(), 'share']) + endif + return dir +endf + +" :def: function! tlib#persistent#Filename(type, ?file=%, ?mkdir=0) +function! tlib#persistent#Filename(type, ...) "{{{3 + " TLogDBG 'bufname='. bufname('.') + let file = a:0 >= 1 ? a:1 : '' + let mkdir = a:0 >= 2 ? a:2 : 0 + return tlib#cache#Filename(a:type, file, mkdir, tlib#persistent#Dir()) +endf + +function! tlib#persistent#Get(cfile) "{{{3 + if !empty(a:cfile) && filereadable(a:cfile) + let val = readfile(a:cfile, 'b') + return eval(join(val, "\n")) + else + return {} + endif +endf + +function! tlib#persistent#Save(cfile, dictionary) "{{{3 + if !empty(a:cfile) + " TLogVAR a:dictionary + call writefile([string(a:dictionary)], a:cfile, 'b') + endif +endf + diff --git a/sources_non_forked/tlib/autoload/tlib/scratch.vim b/sources_non_forked/tlib/autoload/tlib/scratch.vim index 533bf421..41f935d9 100644 --- a/sources_non_forked/tlib/autoload/tlib/scratch.vim +++ b/sources_non_forked/tlib/autoload/tlib/scratch.vim @@ -3,8 +3,8 @@ " @Website: http://www.vim.org/account/profile.php?user_id=4037 " @License: GPL (see http://www.gnu.org/licenses/gpl.txt) " @Created: 2007-07-18. -" @Last Change: 2011-03-10. -" @Revision: 0.0.166 +" @Last Change: 2012-02-08. +" @Revision: 0.0.167 if &cp || exists("loaded_tlib_scratch_autoload") finish @@ -29,7 +29,7 @@ function! tlib#scratch#UseScratch(...) "{{{3 " TLogDBG bufnr('%') if id =~ '^\d\+$' && bufwinnr(id) != -1 if bufnr('%') != id - exec 'buffer! '. id + exec 'noautocmd buffer! '. id endif " let ft = &ft let ft = '*' @@ -47,29 +47,29 @@ function! tlib#scratch#UseScratch(...) "{{{3 let wn = bufwinnr(bn) if wn != -1 " TLogVAR wn - exec wn .'wincmd w' + exec 'noautocmd' (wn .'wincmd w') else if scratch_split == 1 - let cmd = wpos.' sbuffer! ' + let cmd = wpos.' sbuffer!' elseif scratch_split == -1 - let cmd = wpos.' tab sbuffer! ' + let cmd = wpos.' tab sbuffer!' else - let cmd = 'buffer! ' + let cmd = 'buffer!' endif " TLogVAR cmd - silent exec cmd . bn + silent exec 'noautocmd' cmd bn endif else " TLogVAR id if scratch_split == 1 - let cmd = wpos.' split ' + let cmd = wpos.' split' elseif scratch_split == -1 - let cmd = wpos.' tab split ' + let cmd = wpos.' tab split' else - let cmd = 'edit ' + let cmd = 'edit' endif " TLogVAR cmd - silent exec cmd . escape(id, '%#\ ') + silent exec 'noautocmd' cmd escape(id, '%#\ ') " silent exec 'split '. id endif let ft = get(keyargs, 'scratch_filetype', '') diff --git a/sources_non_forked/tlib/autoload/tlib/tag.vim b/sources_non_forked/tlib/autoload/tlib/tag.vim index 97f4d1ba..64a1715c 100644 --- a/sources_non_forked/tlib/autoload/tlib/tag.vim +++ b/sources_non_forked/tlib/autoload/tlib/tag.vim @@ -3,8 +3,8 @@ " @Website: http://www.vim.org/account/profile.php?user_id=4037 " @License: GPL (see http://www.gnu.org/licenses/gpl.txt) " @Created: 2007-11-01. -" @Last Change: 2011-03-10. -" @Revision: 0.0.53 +" @Last Change: 2011-08-11. +" @Revision: 0.0.56 if &cp || exists("loaded_tlib_tag_autoload") finish @@ -38,6 +38,7 @@ let loaded_tlib_tag_autoload = 1 " < tags from the JDK will be included. function! tlib#tag#Retrieve(rx, ...) "{{{3 TVarArg ['extra_tags', 0] + " TLogVAR a:rx, extra_tags if extra_tags let tags_orig = &l:tags if empty(tags_orig) diff --git a/sources_non_forked/tlib/autoload/tlib/vcs.vim b/sources_non_forked/tlib/autoload/tlib/vcs.vim new file mode 100644 index 00000000..42bb0c25 --- /dev/null +++ b/sources_non_forked/tlib/autoload/tlib/vcs.vim @@ -0,0 +1,155 @@ +" vcs.vim +" @Author: Tom Link (mailto:micathom AT gmail com?subject=[vim]) +" @License: GPL (see http://www.gnu.org/licenses/gpl.txt) +" @Created: 2012-03-08. +" @Last Change: 2012-09-10. +" @Revision: 122 + + +" A dictionarie of supported VCS (currently: git, hg, svn, bzr). +" :display: g:tlib#vcs#def {...} +TLet g:tlib#vcs#def = { + \ 'git': { + \ 'dir': '.git', + \ 'ls': 'git ls-files --full-name %s', + \ 'diff': 'git diff --no-ext-diff -U0 %s' + \ }, + \ 'hg': { + \ 'dir': '.hg', + \ 'diff': 'hg diff -U0 %s', + \ 'ls': 'hg manifest' + \ }, + \ 'svn': { + \ 'dir': '.svn', + \ 'diff': 'svn diff --diff-cmd diff --extensions -U0 %s', + \ }, + \ 'bzr': { + \ 'dir': '.bzr', + \ 'diff': 'bzr diff --diff-options=-U0 %s', + \ } + \ } + + +" A dictionary of custom executables for VCS commands. If the value is +" empty, support for that VCS will be removed. If no key is present, it +" is assumed that the VCS "type" is the name of the executable. +" :display: g:tlib#vcs#executables {...} +TLet g:tlib#vcs#executables = {} + + +" If non-empty, use it as a format string to check whether a VCS is +" installed on your computer. +TLet g:tlib#vcs#check = has('win16') || has('win32') || has('win64') ? '%s.exe' : '%s' + + +if !empty(g:tlib#vcs#check) + for [s:cmd, s:def] in items(g:tlib#vcs#def) + if !has_key(g:tlib#vcs#executables, s:cmd) + let s:cmd1 = printf(g:tlib#vcs#check, s:cmd) + let g:tlib#vcs#executables[s:cmd] = executable(s:cmd1) ? s:cmd1 : '' + endif + endfor +endif + + +function! tlib#vcs#FindVCS(filename) "{{{3 + let type = '' + let dir = '' + " let path = escape(fnamemodify(a:filename, ':p'), ',:') .';' + let filename = fnamemodify(a:filename, isdirectory(a:filename) ? ':p:h' : ':p') + let path = escape(filename, ';') .';' + " TLogVAR a:filename, path + let depth = -1 + for vcs in keys(g:tlib#vcs#def) + let subdir = g:tlib#vcs#def[vcs].dir + let vcsdir = finddir(subdir, path) + " TLogVAR vcs, subdir, vcsdir + if !empty(vcsdir) + let vcsdir_depth = len(split(fnamemodify(vcsdir, ':p'), '\/')) + if vcsdir_depth > depth + let depth = vcsdir_depth + let type = vcs + let dir = vcsdir + " TLogVAR type, depth + endif + endif + endfor + " TLogVAR type, dir + if empty(type) + return ['', ''] + else + return [type, dir] + endif +endf + + +function! s:GetCmd(vcstype, cmd) + let vcsdef = get(g:tlib#vcs#def, a:vcstype, {}) + if has_key(vcsdef, a:cmd) + let cmd = vcsdef[a:cmd] + let bin = get(g:tlib#vcs#executables, a:vcstype, '') + if empty(bin) + let cmd = '' + elseif bin != a:vcstype + " let bin = escape(shellescape(bin), '\') + let bin = escape(bin, '\') + let cmd = substitute(cmd, '^.\{-}\zs'. escape(a:vcstype, '\'), bin, '') + endif + return cmd + else + return '' + endif +endf + + +" :display: tlib#vcs#Ls(?filename=bufname('%'), ?vcs=[type, dir]) +" Return the files under VCS. +function! tlib#vcs#Ls(...) "{{{3 + if a:0 >= 2 + let vcs = a:2 + else + let vcs = tlib#vcs#FindVCS(a:0 >= 1 ? a:1 : bufname('%')) + endif + " TLogVAR vcs + if !empty(vcs) + let [vcstype, vcsdir] = vcs + if has_key(g:tlib#vcs#def, vcstype) + let ls = s:GetCmd(vcstype, 'ls') + " TLogVAR ls + if !empty(ls) + let rootdir = fnamemodify(vcsdir, ':p:h:h') + " TLogVAR vcsdir, rootdir + if ls =~ '%s' + let cmd = printf(ls, shellescape(rootdir)) + else + let cmd = ls + endif + " TLogVAR cmd + let filess = system(cmd) + " TLogVAR filess + let files = split(filess, '\n') + call map(files, 'join([rootdir, v:val], "/")') + return files + endif + endif + endif + return [] +endf + + +" :display: tlib#vcs#Diff(filename, ?vcs=[type, dir]) +" Return the diff for "filename" +function! tlib#vcs#Diff(filename, ...) "{{{3 + let vcs = a:0 >= 1 ? a:1 : tlib#vcs#FindVCS(a:filename) + if !empty(vcs) + let [vcstype, vcsdir] = vcs + let diff = s:GetCmd(vcstype, 'diff') + if !empty(diff) + let cmd = printf(diff, shellescape(fnamemodify(a:filename, ':p'))) + let patch = system(cmd) + return patch + endif + endif + return [] +endf + diff --git a/sources_non_forked/tlib/autoload/tlib/vim.vim b/sources_non_forked/tlib/autoload/tlib/vim.vim index 2ebfd12f..150c4161 100644 --- a/sources_non_forked/tlib/autoload/tlib/vim.vim +++ b/sources_non_forked/tlib/autoload/tlib/vim.vim @@ -3,8 +3,8 @@ " @GIT: http://github.com/tomtom/tlib_vim/ " @License: GPL (see http://www.gnu.org/licenses/gpl.txt) " @Created: 2010-07-19. -" @Last Change: 2010-10-24. -" @Revision: 24 +" @Last Change: 2012-06-08. +" @Revision: 35 let s:restoreframecmd = '' @@ -13,14 +13,22 @@ let s:fullscreen = 0 if has('win16') || has('win32') || has('win64') if !exists('g:tlib#vim#simalt_maximize') + " The alt-key for maximizing the window. + " CAUTION: The value of this paramter depends on your locale and + " maybe the windows version you are running. let g:tlib#vim#simalt_maximize = 'x' "{{{2 endif if !exists('g:tlib#vim#simalt_restore') + " The alt-key for restoring the window. + " CAUTION: The value of this paramter depends on your locale and + " maybe the windows version you are running. let g:tlib#vim#simalt_restore = 'r' "{{{2 endif if !exists('g:tlib#vim#use_vimtweak') + " If true, use the vimtweak.dll for windows. This will enable + " tlib to remove the caption for fullscreen windows. let g:tlib#vim#use_vimtweak = 0 "{{{2 endif @@ -54,6 +62,13 @@ if has('win16') || has('win32') || has('win64') else if !exists('g:tlib#vim#use_wmctrl') + " If true, use wmctrl for X windows to make a window + " maximized/fullscreen. + " + " This is the preferred method for maximizing windows under X + " windows. Some window managers have problem coping with the + " default method of setting 'lines' and 'columns' to a large + " value. let g:tlib#vim#use_wmctrl = executable('wmctrl') "{{{2 endif diff --git a/sources_non_forked/tlib/doc/tags b/sources_non_forked/tlib/doc/tags new file mode 100644 index 00000000..8ca42840 --- /dev/null +++ b/sources_non_forked/tlib/doc/tags @@ -0,0 +1,252 @@ +:TBrowseOutput tlib.txt /*:TBrowseOutput* +:TBrowseScriptnames tlib.txt /*:TBrowseScriptnames* +:TKeyArg tlib.txt /*:TKeyArg* +:TLet tlib.txt /*:TLet* +:TRequire tlib.txt /*:TRequire* +:TScratch tlib.txt /*:TScratch* +:TTimeCommand tlib.txt /*:TTimeCommand* +:TVarArg tlib.txt /*:TVarArg* +g:tlib#Filter_cnfx#expander tlib.txt /*g:tlib#Filter_cnfx#expander* +g:tlib#cache#dont_purge tlib.txt /*g:tlib#cache#dont_purge* +g:tlib#cache#purge_days tlib.txt /*g:tlib#cache#purge_days* +g:tlib#cache#purge_every_days tlib.txt /*g:tlib#cache#purge_every_days* +g:tlib#cache#run_script tlib.txt /*g:tlib#cache#run_script* +g:tlib#cache#script_encoding tlib.txt /*g:tlib#cache#script_encoding* +g:tlib#cache#silent tlib.txt /*g:tlib#cache#silent* +g:tlib#input#filename_max_width tlib.txt /*g:tlib#input#filename_max_width* +g:tlib#input#filename_padding_r tlib.txt /*g:tlib#input#filename_padding_r* +g:tlib#input#format_filename tlib.txt /*g:tlib#input#format_filename* +g:tlib#input#use_popup tlib.txt /*g:tlib#input#use_popup* +g:tlib#vcs#check tlib.txt /*g:tlib#vcs#check* +g:tlib#vcs#def tlib.txt /*g:tlib#vcs#def* +g:tlib#vcs#executables tlib.txt /*g:tlib#vcs#executables* +g:tlib#vim#simalt_maximize tlib.txt /*g:tlib#vim#simalt_maximize* +g:tlib#vim#simalt_restore tlib.txt /*g:tlib#vim#simalt_restore* +g:tlib#vim#use_vimtweak tlib.txt /*g:tlib#vim#use_vimtweak* +g:tlib#vim#use_wmctrl tlib.txt /*g:tlib#vim#use_wmctrl* +g:tlib_cache tlib.txt /*g:tlib_cache* +g:tlib_debug tlib.txt /*g:tlib_debug* +g:tlib_filename_sep tlib.txt /*g:tlib_filename_sep* +g:tlib_handlers_EditList tlib.txt /*g:tlib_handlers_EditList* +g:tlib_inputlist_and tlib.txt /*g:tlib_inputlist_and* +g:tlib_inputlist_filename_indicators tlib.txt /*g:tlib_inputlist_filename_indicators* +g:tlib_inputlist_higroup tlib.txt /*g:tlib_inputlist_higroup* +g:tlib_inputlist_livesearch_threshold tlib.txt /*g:tlib_inputlist_livesearch_threshold* +g:tlib_inputlist_match tlib.txt /*g:tlib_inputlist_match* +g:tlib_inputlist_not tlib.txt /*g:tlib_inputlist_not* +g:tlib_inputlist_or tlib.txt /*g:tlib_inputlist_or* +g:tlib_inputlist_pct tlib.txt /*g:tlib_inputlist_pct* +g:tlib_inputlist_shortmessage tlib.txt /*g:tlib_inputlist_shortmessage* +g:tlib_inputlist_width_filename tlib.txt /*g:tlib_inputlist_width_filename* +g:tlib_keyagents_InputList_m tlib.txt /*g:tlib_keyagents_InputList_m* +g:tlib_keyagents_InputList_s tlib.txt /*g:tlib_keyagents_InputList_s* +g:tlib_numeric_chars tlib.txt /*g:tlib_numeric_chars* +g:tlib_persistent tlib.txt /*g:tlib_persistent* +g:tlib_pick_last_item tlib.txt /*g:tlib_pick_last_item* +g:tlib_scratch_pos tlib.txt /*g:tlib_scratch_pos* +g:tlib_scroll_lines tlib.txt /*g:tlib_scroll_lines* +g:tlib_sortprefs_threshold tlib.txt /*g:tlib_sortprefs_threshold* +g:tlib_tag_substitute tlib.txt /*g:tlib_tag_substitute* +g:tlib_tags_extra tlib.txt /*g:tlib_tags_extra* +g:tlib_viewline_position tlib.txt /*g:tlib_viewline_position* +o_sp tlib.txt /*o_sp* +standard-paragraph tlib.txt /*standard-paragraph* +tlib#Filter_cnf#New() tlib.txt /*tlib#Filter_cnf#New()* +tlib#Filter_cnfd#New() tlib.txt /*tlib#Filter_cnfd#New()* +tlib#Filter_cnfx#New() tlib.txt /*tlib#Filter_cnfx#New()* +tlib#Filter_fuzzy#New() tlib.txt /*tlib#Filter_fuzzy#New()* +tlib#Object#Methods() tlib.txt /*tlib#Object#Methods()* +tlib#Object#New() tlib.txt /*tlib#Object#New()* +tlib#World#New() tlib.txt /*tlib#World#New()* +tlib#agent#AND() tlib.txt /*tlib#agent#AND()* +tlib#agent#CompleteAgentNames() tlib.txt /*tlib#agent#CompleteAgentNames()* +tlib#agent#Copy() tlib.txt /*tlib#agent#Copy()* +tlib#agent#CopyItems() tlib.txt /*tlib#agent#CopyItems()* +tlib#agent#Cut() tlib.txt /*tlib#agent#Cut()* +tlib#agent#Debug() tlib.txt /*tlib#agent#Debug()* +tlib#agent#DeleteItems() tlib.txt /*tlib#agent#DeleteItems()* +tlib#agent#DoAtLine() tlib.txt /*tlib#agent#DoAtLine()* +tlib#agent#Down() tlib.txt /*tlib#agent#Down()* +tlib#agent#DownN() tlib.txt /*tlib#agent#DownN()* +tlib#agent#EditFile() tlib.txt /*tlib#agent#EditFile()* +tlib#agent#EditFileInSplit() tlib.txt /*tlib#agent#EditFileInSplit()* +tlib#agent#EditFileInTab() tlib.txt /*tlib#agent#EditFileInTab()* +tlib#agent#EditFileInVSplit() tlib.txt /*tlib#agent#EditFileInVSplit()* +tlib#agent#EditItem() tlib.txt /*tlib#agent#EditItem()* +tlib#agent#EditReturnValue() tlib.txt /*tlib#agent#EditReturnValue()* +tlib#agent#ExecAgentByName() tlib.txt /*tlib#agent#ExecAgentByName()* +tlib#agent#Exit() tlib.txt /*tlib#agent#Exit()* +tlib#agent#GotoLine() tlib.txt /*tlib#agent#GotoLine()* +tlib#agent#Help() tlib.txt /*tlib#agent#Help()* +tlib#agent#Input() tlib.txt /*tlib#agent#Input()* +tlib#agent#NewItem() tlib.txt /*tlib#agent#NewItem()* +tlib#agent#Null() tlib.txt /*tlib#agent#Null()* +tlib#agent#OR() tlib.txt /*tlib#agent#OR()* +tlib#agent#PageDown() tlib.txt /*tlib#agent#PageDown()* +tlib#agent#PageUp() tlib.txt /*tlib#agent#PageUp()* +tlib#agent#Paste() tlib.txt /*tlib#agent#Paste()* +tlib#agent#PopFilter() tlib.txt /*tlib#agent#PopFilter()* +tlib#agent#PreviewLine() tlib.txt /*tlib#agent#PreviewLine()* +tlib#agent#ReduceFilter() tlib.txt /*tlib#agent#ReduceFilter()* +tlib#agent#Reset() tlib.txt /*tlib#agent#Reset()* +tlib#agent#Select() tlib.txt /*tlib#agent#Select()* +tlib#agent#SelectAll() tlib.txt /*tlib#agent#SelectAll()* +tlib#agent#SelectDown() tlib.txt /*tlib#agent#SelectDown()* +tlib#agent#SelectUp() tlib.txt /*tlib#agent#SelectUp()* +tlib#agent#ShiftLeft() tlib.txt /*tlib#agent#ShiftLeft()* +tlib#agent#ShiftRight() tlib.txt /*tlib#agent#ShiftRight()* +tlib#agent#ShowInfo() tlib.txt /*tlib#agent#ShowInfo()* +tlib#agent#Suspend() tlib.txt /*tlib#agent#Suspend()* +tlib#agent#SuspendToParentWindow() tlib.txt /*tlib#agent#SuspendToParentWindow()* +tlib#agent#ToggleScrollbind() tlib.txt /*tlib#agent#ToggleScrollbind()* +tlib#agent#ToggleStickyList() tlib.txt /*tlib#agent#ToggleStickyList()* +tlib#agent#Up() tlib.txt /*tlib#agent#Up()* +tlib#agent#UpN() tlib.txt /*tlib#agent#UpN()* +tlib#agent#ViewFile() tlib.txt /*tlib#agent#ViewFile()* +tlib#agent#Wildcard() tlib.txt /*tlib#agent#Wildcard()* +tlib#arg#Ex() tlib.txt /*tlib#arg#Ex()* +tlib#arg#Get() tlib.txt /*tlib#arg#Get()* +tlib#arg#Key() tlib.txt /*tlib#arg#Key()* +tlib#arg#Let() tlib.txt /*tlib#arg#Let()* +tlib#arg#StringAsKeyArgs() tlib.txt /*tlib#arg#StringAsKeyArgs()* +tlib#autocmdgroup#Init() tlib.txt /*tlib#autocmdgroup#Init()* +tlib#balloon#Expr() tlib.txt /*tlib#balloon#Expr()* +tlib#balloon#Register() tlib.txt /*tlib#balloon#Register()* +tlib#balloon#Remove() tlib.txt /*tlib#balloon#Remove()* +tlib#buffer#BufDo() tlib.txt /*tlib#buffer#BufDo()* +tlib#buffer#CurrentByte() tlib.txt /*tlib#buffer#CurrentByte()* +tlib#buffer#DeleteRange() tlib.txt /*tlib#buffer#DeleteRange()* +tlib#buffer#DisableMRU() tlib.txt /*tlib#buffer#DisableMRU()* +tlib#buffer#EnableMRU() tlib.txt /*tlib#buffer#EnableMRU()* +tlib#buffer#Eval() tlib.txt /*tlib#buffer#Eval()* +tlib#buffer#GetList() tlib.txt /*tlib#buffer#GetList()* +tlib#buffer#HighlightLine() tlib.txt /*tlib#buffer#HighlightLine()* +tlib#buffer#InsertText() tlib.txt /*tlib#buffer#InsertText()* +tlib#buffer#InsertText0() tlib.txt /*tlib#buffer#InsertText0()* +tlib#buffer#KeepCursorPosition() tlib.txt /*tlib#buffer#KeepCursorPosition()* +tlib#buffer#ReplaceRange() tlib.txt /*tlib#buffer#ReplaceRange()* +tlib#buffer#ScratchEnd() tlib.txt /*tlib#buffer#ScratchEnd()* +tlib#buffer#ScratchStart() tlib.txt /*tlib#buffer#ScratchStart()* +tlib#buffer#Set() tlib.txt /*tlib#buffer#Set()* +tlib#buffer#ViewLine() tlib.txt /*tlib#buffer#ViewLine()* +tlib#cache#Dir() tlib.txt /*tlib#cache#Dir()* +tlib#cache#Filename() tlib.txt /*tlib#cache#Filename()* +tlib#cache#Get() tlib.txt /*tlib#cache#Get()* +tlib#cache#ListFilesInCache() tlib.txt /*tlib#cache#ListFilesInCache()* +tlib#cache#MaybePurge() tlib.txt /*tlib#cache#MaybePurge()* +tlib#cache#Purge() tlib.txt /*tlib#cache#Purge()* +tlib#cache#Save() tlib.txt /*tlib#cache#Save()* +tlib#char#Get() tlib.txt /*tlib#char#Get()* +tlib#char#GetWithTimeout() tlib.txt /*tlib#char#GetWithTimeout()* +tlib#char#IsAvailable() tlib.txt /*tlib#char#IsAvailable()* +tlib#cmd#BrowseOutput() tlib.txt /*tlib#cmd#BrowseOutput()* +tlib#cmd#BrowseOutputWithCallback() tlib.txt /*tlib#cmd#BrowseOutputWithCallback()* +tlib#cmd#DefaultBrowseOutput() tlib.txt /*tlib#cmd#DefaultBrowseOutput()* +tlib#cmd#OutputAsList() tlib.txt /*tlib#cmd#OutputAsList()* +tlib#cmd#ParseScriptname() tlib.txt /*tlib#cmd#ParseScriptname()* +tlib#cmd#Time() tlib.txt /*tlib#cmd#Time()* +tlib#cmd#UseVertical() tlib.txt /*tlib#cmd#UseVertical()* +tlib#comments#Comments() tlib.txt /*tlib#comments#Comments()* +tlib#date#DiffInDays() tlib.txt /*tlib#date#DiffInDays()* +tlib#date#Parse() tlib.txt /*tlib#date#Parse()* +tlib#date#SecondsSince1970() tlib.txt /*tlib#date#SecondsSince1970()* +tlib#dir#CD() tlib.txt /*tlib#dir#CD()* +tlib#dir#CanonicName() tlib.txt /*tlib#dir#CanonicName()* +tlib#dir#Ensure() tlib.txt /*tlib#dir#Ensure()* +tlib#dir#MyRuntime() tlib.txt /*tlib#dir#MyRuntime()* +tlib#dir#PlainName() tlib.txt /*tlib#dir#PlainName()* +tlib#dir#Pop() tlib.txt /*tlib#dir#Pop()* +tlib#dir#Push() tlib.txt /*tlib#dir#Push()* +tlib#eval#FormatValue() tlib.txt /*tlib#eval#FormatValue()* +tlib#file#Join() tlib.txt /*tlib#file#Join()* +tlib#file#Relative() tlib.txt /*tlib#file#Relative()* +tlib#file#Split() tlib.txt /*tlib#file#Split()* +tlib#file#With() tlib.txt /*tlib#file#With()* +tlib#hook#Run() tlib.txt /*tlib#hook#Run()* +tlib#input#CommandSelect() tlib.txt /*tlib#input#CommandSelect()* +tlib#input#Dialog() tlib.txt /*tlib#input#Dialog()* +tlib#input#Edit() tlib.txt /*tlib#input#Edit()* +tlib#input#EditList() tlib.txt /*tlib#input#EditList()* +tlib#input#List() tlib.txt /*tlib#input#List()* +tlib#input#ListD() tlib.txt /*tlib#input#ListD()* +tlib#input#ListW() tlib.txt /*tlib#input#ListW()* +tlib#input#Resume() tlib.txt /*tlib#input#Resume()* +tlib#list#All() tlib.txt /*tlib#list#All()* +tlib#list#Any() tlib.txt /*tlib#list#Any()* +tlib#list#Compact() tlib.txt /*tlib#list#Compact()* +tlib#list#Find() tlib.txt /*tlib#list#Find()* +tlib#list#FindAll() tlib.txt /*tlib#list#FindAll()* +tlib#list#Flatten() tlib.txt /*tlib#list#Flatten()* +tlib#list#Inject() tlib.txt /*tlib#list#Inject()* +tlib#list#Remove() tlib.txt /*tlib#list#Remove()* +tlib#list#RemoveAll() tlib.txt /*tlib#list#RemoveAll()* +tlib#list#Uniq() tlib.txt /*tlib#list#Uniq()* +tlib#list#Zip() tlib.txt /*tlib#list#Zip()* +tlib#map#PumAccept() tlib.txt /*tlib#map#PumAccept()* +tlib#normal#WithRegister() tlib.txt /*tlib#normal#WithRegister()* +tlib#notify#Echo() tlib.txt /*tlib#notify#Echo()* +tlib#notify#TrimMessage() tlib.txt /*tlib#notify#TrimMessage()* +tlib#paragraph#GetMetric() tlib.txt /*tlib#paragraph#GetMetric()* +tlib#paragraph#Move() tlib.txt /*tlib#paragraph#Move()* +tlib#persistent#Dir() tlib.txt /*tlib#persistent#Dir()* +tlib#persistent#Filename() tlib.txt /*tlib#persistent#Filename()* +tlib#persistent#Get() tlib.txt /*tlib#persistent#Get()* +tlib#persistent#Save() tlib.txt /*tlib#persistent#Save()* +tlib#progressbar#Display() tlib.txt /*tlib#progressbar#Display()* +tlib#progressbar#Init() tlib.txt /*tlib#progressbar#Init()* +tlib#progressbar#Restore() tlib.txt /*tlib#progressbar#Restore()* +tlib#rx#Escape() tlib.txt /*tlib#rx#Escape()* +tlib#rx#EscapeReplace() tlib.txt /*tlib#rx#EscapeReplace()* +tlib#rx#Suffixes() tlib.txt /*tlib#rx#Suffixes()* +tlib#scratch#CloseScratch() tlib.txt /*tlib#scratch#CloseScratch()* +tlib#scratch#UseScratch() tlib.txt /*tlib#scratch#UseScratch()* +tlib#signs#ClearAll() tlib.txt /*tlib#signs#ClearAll()* +tlib#signs#ClearBuffer() tlib.txt /*tlib#signs#ClearBuffer()* +tlib#signs#Mark() tlib.txt /*tlib#signs#Mark()* +tlib#string#Chomp() tlib.txt /*tlib#string#Chomp()* +tlib#string#Count() tlib.txt /*tlib#string#Count()* +tlib#string#Format() tlib.txt /*tlib#string#Format()* +tlib#string#Printf1() tlib.txt /*tlib#string#Printf1()* +tlib#string#RemoveBackslashes() tlib.txt /*tlib#string#RemoveBackslashes()* +tlib#string#Strip() tlib.txt /*tlib#string#Strip()* +tlib#string#TrimLeft() tlib.txt /*tlib#string#TrimLeft()* +tlib#string#TrimRight() tlib.txt /*tlib#string#TrimRight()* +tlib#syntax#Collect() tlib.txt /*tlib#syntax#Collect()* +tlib#syntax#Names() tlib.txt /*tlib#syntax#Names()* +tlib#tab#BufMap() tlib.txt /*tlib#tab#BufMap()* +tlib#tab#Set() tlib.txt /*tlib#tab#Set()* +tlib#tab#TabWinNr() tlib.txt /*tlib#tab#TabWinNr()* +tlib#tag#Collect() tlib.txt /*tlib#tag#Collect()* +tlib#tag#Format() tlib.txt /*tlib#tag#Format()* +tlib#tag#Retrieve() tlib.txt /*tlib#tag#Retrieve()* +tlib#textobjects#Init() tlib.txt /*tlib#textobjects#Init()* +tlib#time#Diff() tlib.txt /*tlib#time#Diff()* +tlib#time#DiffMSecs() tlib.txt /*tlib#time#DiffMSecs()* +tlib#time#MSecs() tlib.txt /*tlib#time#MSecs()* +tlib#time#Now() tlib.txt /*tlib#time#Now()* +tlib#type#IsDictionary() tlib.txt /*tlib#type#IsDictionary()* +tlib#type#IsFuncref() tlib.txt /*tlib#type#IsFuncref()* +tlib#type#IsList() tlib.txt /*tlib#type#IsList()* +tlib#type#IsNumber() tlib.txt /*tlib#type#IsNumber()* +tlib#type#IsString() tlib.txt /*tlib#type#IsString()* +tlib#url#Decode() tlib.txt /*tlib#url#Decode()* +tlib#url#DecodeChar() tlib.txt /*tlib#url#DecodeChar()* +tlib#url#Encode() tlib.txt /*tlib#url#Encode()* +tlib#url#EncodeChar() tlib.txt /*tlib#url#EncodeChar()* +tlib#var#EGet() tlib.txt /*tlib#var#EGet()* +tlib#var#Get() tlib.txt /*tlib#var#Get()* +tlib#var#Let() tlib.txt /*tlib#var#Let()* +tlib#var#List() tlib.txt /*tlib#var#List()* +tlib#vcs#Diff() tlib.txt /*tlib#vcs#Diff()* +tlib#vcs#FindVCS() tlib.txt /*tlib#vcs#FindVCS()* +tlib#vcs#Ls() tlib.txt /*tlib#vcs#Ls()* +tlib#vim#Maximize() tlib.txt /*tlib#vim#Maximize()* +tlib#vim#RestoreWindow() tlib.txt /*tlib#vim#RestoreWindow()* +tlib#win#GetLayout() tlib.txt /*tlib#win#GetLayout()* +tlib#win#List() tlib.txt /*tlib#win#List()* +tlib#win#Set() tlib.txt /*tlib#win#Set()* +tlib#win#SetLayout() tlib.txt /*tlib#win#SetLayout()* +tlib#win#Width() tlib.txt /*tlib#win#Width()* +tlib#win#WinDo() tlib.txt /*tlib#win#WinDo()* +tlib.txt tlib.txt /*tlib.txt* +v_sp tlib.txt /*v_sp* diff --git a/sources_non_forked/tlib/doc/tlib.txt b/sources_non_forked/tlib/doc/tlib.txt index def5ed5c..6caa99f5 100644 --- a/sources_non_forked/tlib/doc/tlib.txt +++ b/sources_non_forked/tlib/doc/tlib.txt @@ -61,32 +61,35 @@ Contents~ g:tlib_scroll_lines ..................... |g:tlib_scroll_lines| g:tlib_keyagents_InputList_m ............ |g:tlib_keyagents_InputList_m| g:tlib_handlers_EditList ................ |g:tlib_handlers_EditList| - tlib#autocmdgroup#Init .................. |tlib#autocmdgroup#Init()| - tlib#tab#BufMap ......................... |tlib#tab#BufMap()| - tlib#tab#TabWinNr ....................... |tlib#tab#TabWinNr()| - tlib#tab#Set ............................ |tlib#tab#Set()| - tlib#paragraph#GetMetric ................ |tlib#paragraph#GetMetric()| - tlib#paragraph#Move ..................... |tlib#paragraph#Move()| - tlib#scratch#UseScratch ................. |tlib#scratch#UseScratch()| - tlib#scratch#CloseScratch ............... |tlib#scratch#CloseScratch()| + g:tlib_debug ............................ |g:tlib_debug| + tlib#notify#Echo ........................ |tlib#notify#Echo()| + tlib#notify#TrimMessage ................. |tlib#notify#TrimMessage()| + g:tlib_persistent ....................... |g:tlib_persistent| + tlib#persistent#Dir ..................... |tlib#persistent#Dir()| + tlib#persistent#Filename ................ |tlib#persistent#Filename()| + tlib#persistent#Get ..................... |tlib#persistent#Get()| + tlib#persistent#Save .................... |tlib#persistent#Save()| + g:tlib#vim#simalt_maximize .............. |g:tlib#vim#simalt_maximize| + g:tlib#vim#simalt_restore ............... |g:tlib#vim#simalt_restore| + g:tlib#vim#use_vimtweak ................. |g:tlib#vim#use_vimtweak| + tlib#vim#Maximize ....................... |tlib#vim#Maximize()| + tlib#vim#RestoreWindow .................. |tlib#vim#RestoreWindow()| + g:tlib#vim#use_wmctrl ................... |g:tlib#vim#use_wmctrl| tlib#progressbar#Init ................... |tlib#progressbar#Init()| tlib#progressbar#Display ................ |tlib#progressbar#Display()| tlib#progressbar#Restore ................ |tlib#progressbar#Restore()| - tlib#Object#New ......................... |tlib#Object#New()| - prototype.New - prototype.Inherit - prototype.Extend - prototype.IsA - prototype.IsRelated - prototype.RespondTo - prototype.Super - tlib#Object#Methods ..................... |tlib#Object#Methods()| - tlib#win#Set ............................ |tlib#win#Set()| - tlib#win#GetLayout ...................... |tlib#win#GetLayout()| - tlib#win#SetLayout ...................... |tlib#win#SetLayout()| - tlib#win#List ........................... |tlib#win#List()| - tlib#win#Width .......................... |tlib#win#Width()| - tlib#win#WinDo .......................... |tlib#win#WinDo()| + tlib#eval#FormatValue ................... |tlib#eval#FormatValue()| + tlib#list#Inject ........................ |tlib#list#Inject()| + tlib#list#Compact ....................... |tlib#list#Compact()| + tlib#list#Flatten ....................... |tlib#list#Flatten()| + tlib#list#FindAll ....................... |tlib#list#FindAll()| + tlib#list#Find .......................... |tlib#list#Find()| + tlib#list#Any ........................... |tlib#list#Any()| + tlib#list#All ........................... |tlib#list#All()| + tlib#list#Remove ........................ |tlib#list#Remove()| + tlib#list#RemoveAll ..................... |tlib#list#RemoveAll()| + tlib#list#Zip ........................... |tlib#list#Zip()| + tlib#list#Uniq .......................... |tlib#list#Uniq()| tlib#cmd#OutputAsList ................... |tlib#cmd#OutputAsList()| tlib#cmd#BrowseOutput ................... |tlib#cmd#BrowseOutput()| tlib#cmd#BrowseOutputWithCallback ....... |tlib#cmd#BrowseOutputWithCallback()| @@ -94,89 +97,45 @@ Contents~ tlib#cmd#ParseScriptname ................ |tlib#cmd#ParseScriptname()| tlib#cmd#UseVertical .................... |tlib#cmd#UseVertical()| tlib#cmd#Time ........................... |tlib#cmd#Time()| - tlib#comments#Comments .................. |tlib#comments#Comments()| + tlib#syntax#Collect ..................... |tlib#syntax#Collect()| + tlib#syntax#Names ....................... |tlib#syntax#Names()| + tlib#balloon#Register ................... |tlib#balloon#Register()| + tlib#balloon#Remove ..................... |tlib#balloon#Remove()| + tlib#balloon#Expr ....................... |tlib#balloon#Expr()| + g:tlib#vcs#def .......................... |g:tlib#vcs#def| + g:tlib#vcs#executables .................. |g:tlib#vcs#executables| + g:tlib#vcs#check ........................ |g:tlib#vcs#check| + tlib#vcs#FindVCS ........................ |tlib#vcs#FindVCS()| + tlib#vcs#Ls ............................. |tlib#vcs#Ls()| + tlib#vcs#Diff ........................... |tlib#vcs#Diff()| tlib#char#Get ........................... |tlib#char#Get()| tlib#char#IsAvailable ................... |tlib#char#IsAvailable()| tlib#char#GetWithTimeout ................ |tlib#char#GetWithTimeout()| - tlib#World#New .......................... |tlib#World#New()| - prototype.Reset + tlib#scratch#UseScratch ................. |tlib#scratch#UseScratch()| + tlib#scratch#CloseScratch ............... |tlib#scratch#CloseScratch()| + tlib#autocmdgroup#Init .................. |tlib#autocmdgroup#Init()| + g:tlib#cache#purge_days ................. |g:tlib#cache#purge_days| + g:tlib#cache#purge_every_days ........... |g:tlib#cache#purge_every_days| + g:tlib#cache#script_encoding ............ |g:tlib#cache#script_encoding| + g:tlib#cache#run_script ................. |g:tlib#cache#run_script| + g:tlib#cache#silent ..................... |g:tlib#cache#silent| + g:tlib#cache#dont_purge ................. |g:tlib#cache#dont_purge| + tlib#cache#Dir .......................... |tlib#cache#Dir()| + tlib#cache#Filename ..................... |tlib#cache#Filename()| + tlib#cache#Save ......................... |tlib#cache#Save()| + tlib#cache#Get .......................... |tlib#cache#Get()| + tlib#cache#MaybePurge ................... |tlib#cache#MaybePurge()| + tlib#cache#Purge ........................ |tlib#cache#Purge()| + tlib#cache#ListFilesInCache ............. |tlib#cache#ListFilesInCache()| + tlib#normal#WithRegister ................ |tlib#normal#WithRegister()| tlib#time#MSecs ......................... |tlib#time#MSecs()| tlib#time#Now ........................... |tlib#time#Now()| tlib#time#Diff .......................... |tlib#time#Diff()| tlib#time#DiffMSecs ..................... |tlib#time#DiffMSecs()| - tlib#textobjects#StandardParagraph ...... |standard-paragraph| - tlib#textobjects#Init ................... |tlib#textobjects#Init()| - v_sp .................................... |v_sp| - o_sp .................................... |o_sp| - tlib#Filter_fuzzy#New ................... |tlib#Filter_fuzzy#New()| - tlib#file#Split ......................... |tlib#file#Split()| - tlib#file#Join .......................... |tlib#file#Join()| - tlib#file#Relative ...................... |tlib#file#Relative()| - tlib#file#With .......................... |tlib#file#With()| - tlib#Filter_seq#New ..................... |tlib#Filter_seq#New()| - tlib#date#DiffInDays .................... |tlib#date#DiffInDays()| - tlib#date#Parse ......................... |tlib#date#Parse()| - tlib#date#SecondsSince1970 .............. |tlib#date#SecondsSince1970()| - tlib#balloon#Register ................... |tlib#balloon#Register()| - tlib#balloon#Remove ..................... |tlib#balloon#Remove()| - tlib#balloon#Expr ....................... |tlib#balloon#Expr()| - tlib#buffer#EnableMRU ................... |tlib#buffer#EnableMRU()| - tlib#buffer#DisableMRU .................. |tlib#buffer#DisableMRU()| - tlib#buffer#Set ......................... |tlib#buffer#Set()| - tlib#buffer#Eval ........................ |tlib#buffer#Eval()| - tlib#buffer#GetList ..................... |tlib#buffer#GetList()| - tlib#buffer#ViewLine .................... |tlib#buffer#ViewLine()| - tlib#buffer#HighlightLine ............... |tlib#buffer#HighlightLine()| - tlib#buffer#DeleteRange ................. |tlib#buffer#DeleteRange()| - tlib#buffer#ReplaceRange ................ |tlib#buffer#ReplaceRange()| - tlib#buffer#ScratchStart ................ |tlib#buffer#ScratchStart()| - tlib#buffer#ScratchEnd .................. |tlib#buffer#ScratchEnd()| - tlib#buffer#BufDo ....................... |tlib#buffer#BufDo()| - tlib#buffer#InsertText .................. |tlib#buffer#InsertText()| - tlib#buffer#InsertText0 ................. |tlib#buffer#InsertText0()| - tlib#buffer#CurrentByte ................. |tlib#buffer#CurrentByte()| - tlib#buffer#KeepCursorPosition .......... |tlib#buffer#KeepCursorPosition()| - tlib#Filter_cnfd#New .................... |tlib#Filter_cnfd#New()| - tlib#type#IsNumber ...................... |tlib#type#IsNumber()| - tlib#type#IsString ...................... |tlib#type#IsString()| - tlib#type#IsFuncref ..................... |tlib#type#IsFuncref()| - tlib#type#IsList ........................ |tlib#type#IsList()| - tlib#type#IsDictionary .................. |tlib#type#IsDictionary()| - tlib#syntax#Collect ..................... |tlib#syntax#Collect()| - tlib#syntax#Names ....................... |tlib#syntax#Names()| - g:tlib#vim#simalt_maximize .............. |g:tlib#vim#simalt_maximize| - g:tlib#vim#simalt_restore ............... |g:tlib#vim#simalt_restore| - g:tlib#vim#use_vimtweak ................. |g:tlib#vim#use_vimtweak| - tlib#vim#Maximize ....................... |tlib#vim#Maximize()| - tlib#vim#RestoreWindow .................. |tlib#vim#RestoreWindow()| - g:tlib#vim#use_wmctrl ................... |g:tlib#vim#use_wmctrl| - tlib#hook#Run ........................... |tlib#hook#Run()| - tlib#eval#FormatValue ................... |tlib#eval#FormatValue()| - tlib#arg#Get ............................ |tlib#arg#Get()| - tlib#arg#Let ............................ |tlib#arg#Let()| - tlib#arg#Key ............................ |tlib#arg#Key()| - tlib#arg#StringAsKeyArgs ................ |tlib#arg#StringAsKeyArgs()| - tlib#arg#Ex ............................. |tlib#arg#Ex()| tlib#var#Let ............................ |tlib#var#Let()| tlib#var#EGet ........................... |tlib#var#EGet()| tlib#var#Get ............................ |tlib#var#Get()| tlib#var#List ........................... |tlib#var#List()| - tlib#Filter_cnf#New ..................... |tlib#Filter_cnf#New()| - tlib#rx#Escape .......................... |tlib#rx#Escape()| - tlib#rx#EscapeReplace ................... |tlib#rx#EscapeReplace()| - tlib#rx#Suffixes ........................ |tlib#rx#Suffixes()| - tlib#url#Decode ......................... |tlib#url#Decode()| - tlib#url#DecodeChar ..................... |tlib#url#DecodeChar()| - tlib#url#EncodeChar ..................... |tlib#url#EncodeChar()| - tlib#url#Encode ......................... |tlib#url#Encode()| - tlib#input#List ......................... |tlib#input#List()| - tlib#input#ListD ........................ |tlib#input#ListD()| - tlib#input#ListW ........................ |tlib#input#ListW()| - tlib#input#EditList ..................... |tlib#input#EditList()| - tlib#input#Resume ....................... |tlib#input#Resume()| - tlib#input#CommandSelect ................ |tlib#input#CommandSelect()| - tlib#input#Edit ......................... |tlib#input#Edit()| - tlib#input#Dialog ....................... |tlib#input#Dialog()| tlib#agent#Exit ......................... |tlib#agent#Exit()| tlib#agent#CopyItems .................... |tlib#agent#CopyItems()| tlib#agent#PageUp ....................... |tlib#agent#PageUp()| @@ -220,26 +179,66 @@ Contents~ tlib#agent#GotoLine ..................... |tlib#agent#GotoLine()| tlib#agent#DoAtLine ..................... |tlib#agent#DoAtLine()| tlib#agent#Wildcard ..................... |tlib#agent#Wildcard()| - tlib#tag#Retrieve ....................... |tlib#tag#Retrieve()| - tlib#tag#Collect ........................ |tlib#tag#Collect()| - tlib#tag#Format ......................... |tlib#tag#Format()| + tlib#agent#Null ......................... |tlib#agent#Null()| + tlib#agent#ExecAgentByName .............. |tlib#agent#ExecAgentByName()| + tlib#agent#CompleteAgentNames ........... |tlib#agent#CompleteAgentNames()| + g:tlib#Filter_cnfx#expander ............. |g:tlib#Filter_cnfx#expander| + tlib#Filter_cnfx#New .................... |tlib#Filter_cnfx#New()| + tlib#url#Decode ......................... |tlib#url#Decode()| + tlib#url#DecodeChar ..................... |tlib#url#DecodeChar()| + tlib#url#EncodeChar ..................... |tlib#url#EncodeChar()| + tlib#url#Encode ......................... |tlib#url#Encode()| tlib#signs#ClearAll ..................... |tlib#signs#ClearAll()| tlib#signs#ClearBuffer .................. |tlib#signs#ClearBuffer()| tlib#signs#Mark ......................... |tlib#signs#Mark()| - g:tlib#cache#purge_days ................. |g:tlib#cache#purge_days| - g:tlib#cache#purge_every_days ........... |g:tlib#cache#purge_every_days| - g:tlib#cache#script_encoding ............ |g:tlib#cache#script_encoding| - g:tlib#cache#run_script ................. |g:tlib#cache#run_script| - g:tlib#cache#dont_purge ................. |g:tlib#cache#dont_purge| - tlib#cache#Dir .......................... |tlib#cache#Dir()| - tlib#cache#Filename ..................... |tlib#cache#Filename()| - tlib#cache#Save ......................... |tlib#cache#Save()| - tlib#cache#Get .......................... |tlib#cache#Get()| - tlib#cache#MaybePurge ................... |tlib#cache#MaybePurge()| - tlib#cache#Purge ........................ |tlib#cache#Purge()| - tlib#cache#ListFilesInCache ............. |tlib#cache#ListFilesInCache()| + tlib#rx#Escape .......................... |tlib#rx#Escape()| + tlib#rx#EscapeReplace ................... |tlib#rx#EscapeReplace()| + tlib#rx#Suffixes ........................ |tlib#rx#Suffixes()| + tlib#tag#Retrieve ....................... |tlib#tag#Retrieve()| + tlib#tag#Collect ........................ |tlib#tag#Collect()| + tlib#tag#Format ......................... |tlib#tag#Format()| tlib#map#PumAccept ...................... |tlib#map#PumAccept()| - tlib#normal#WithRegister ................ |tlib#normal#WithRegister()| + tlib#Filter_cnfd#New .................... |tlib#Filter_cnfd#New()| + g:tlib#input#use_popup .................. |g:tlib#input#use_popup| + g:tlib#input#format_filename ............ |g:tlib#input#format_filename| + g:tlib#input#filename_padding_r ......... |g:tlib#input#filename_padding_r| + g:tlib#input#filename_max_width ......... |g:tlib#input#filename_max_width| + tlib#input#List ......................... |tlib#input#List()| + tlib#input#ListD ........................ |tlib#input#ListD()| + tlib#input#ListW ........................ |tlib#input#ListW()| + tlib#input#EditList ..................... |tlib#input#EditList()| + tlib#input#Resume ....................... |tlib#input#Resume()| + tlib#input#CommandSelect ................ |tlib#input#CommandSelect()| + tlib#input#Edit ......................... |tlib#input#Edit()| + tlib#input#Dialog ....................... |tlib#input#Dialog()| + tlib#file#Split ......................... |tlib#file#Split()| + tlib#file#Join .......................... |tlib#file#Join()| + tlib#file#Relative ...................... |tlib#file#Relative()| + tlib#file#With .......................... |tlib#file#With()| + tlib#paragraph#GetMetric ................ |tlib#paragraph#GetMetric()| + tlib#paragraph#Move ..................... |tlib#paragraph#Move()| + tlib#World#New .......................... |tlib#World#New()| + tlib#tab#BufMap ......................... |tlib#tab#BufMap()| + tlib#tab#TabWinNr ....................... |tlib#tab#TabWinNr()| + tlib#tab#Set ............................ |tlib#tab#Set()| + tlib#date#DiffInDays .................... |tlib#date#DiffInDays()| + tlib#date#Parse ......................... |tlib#date#Parse()| + tlib#date#SecondsSince1970 .............. |tlib#date#SecondsSince1970()| + tlib#type#IsNumber ...................... |tlib#type#IsNumber()| + tlib#type#IsString ...................... |tlib#type#IsString()| + tlib#type#IsFuncref ..................... |tlib#type#IsFuncref()| + tlib#type#IsList ........................ |tlib#type#IsList()| + tlib#type#IsDictionary .................. |tlib#type#IsDictionary()| + tlib#Filter_fuzzy#New ................... |tlib#Filter_fuzzy#New()| + tlib#textobjects#StandardParagraph ...... |standard-paragraph| + tlib#textobjects#Init ................... |tlib#textobjects#Init()| + v_sp .................................... |v_sp| + o_sp .................................... |o_sp| + tlib#arg#Get ............................ |tlib#arg#Get()| + tlib#arg#Let ............................ |tlib#arg#Let()| + tlib#arg#Key ............................ |tlib#arg#Key()| + tlib#arg#StringAsKeyArgs ................ |tlib#arg#StringAsKeyArgs()| + tlib#arg#Ex ............................. |tlib#arg#Ex()| tlib#dir#CanonicName .................... |tlib#dir#CanonicName()| tlib#dir#PlainName ...................... |tlib#dir#PlainName()| tlib#dir#Ensure ......................... |tlib#dir#Ensure()| @@ -247,19 +246,41 @@ Contents~ tlib#dir#CD ............................. |tlib#dir#CD()| tlib#dir#Push ........................... |tlib#dir#Push()| tlib#dir#Pop ............................ |tlib#dir#Pop()| - tlib#notify#Echo ........................ |tlib#notify#Echo()| - tlib#notify#TrimMessage ................. |tlib#notify#TrimMessage()| - tlib#list#Inject ........................ |tlib#list#Inject()| - tlib#list#Compact ....................... |tlib#list#Compact()| - tlib#list#Flatten ....................... |tlib#list#Flatten()| - tlib#list#FindAll ....................... |tlib#list#FindAll()| - tlib#list#Find .......................... |tlib#list#Find()| - tlib#list#Any ........................... |tlib#list#Any()| - tlib#list#All ........................... |tlib#list#All()| - tlib#list#Remove ........................ |tlib#list#Remove()| - tlib#list#RemoveAll ..................... |tlib#list#RemoveAll()| - tlib#list#Zip ........................... |tlib#list#Zip()| - tlib#list#Uniq .......................... |tlib#list#Uniq()| + tlib#win#Set ............................ |tlib#win#Set()| + tlib#win#GetLayout ...................... |tlib#win#GetLayout()| + tlib#win#SetLayout ...................... |tlib#win#SetLayout()| + tlib#win#List ........................... |tlib#win#List()| + tlib#win#Width .......................... |tlib#win#Width()| + tlib#win#WinDo .......................... |tlib#win#WinDo()| + tlib#comments#Comments .................. |tlib#comments#Comments()| + tlib#Filter_cnf#New ..................... |tlib#Filter_cnf#New()| + prototype.Pretty + tlib#Object#New ......................... |tlib#Object#New()| + prototype.New + prototype.Inherit + prototype.Extend + prototype.IsA + prototype.IsRelated + prototype.RespondTo + prototype.Super + tlib#Object#Methods ..................... |tlib#Object#Methods()| + tlib#buffer#EnableMRU ................... |tlib#buffer#EnableMRU()| + tlib#buffer#DisableMRU .................. |tlib#buffer#DisableMRU()| + tlib#buffer#Set ......................... |tlib#buffer#Set()| + tlib#buffer#Eval ........................ |tlib#buffer#Eval()| + tlib#buffer#GetList ..................... |tlib#buffer#GetList()| + tlib#buffer#ViewLine .................... |tlib#buffer#ViewLine()| + tlib#buffer#HighlightLine ............... |tlib#buffer#HighlightLine()| + tlib#buffer#DeleteRange ................. |tlib#buffer#DeleteRange()| + tlib#buffer#ReplaceRange ................ |tlib#buffer#ReplaceRange()| + tlib#buffer#ScratchStart ................ |tlib#buffer#ScratchStart()| + tlib#buffer#ScratchEnd .................. |tlib#buffer#ScratchEnd()| + tlib#buffer#BufDo ....................... |tlib#buffer#BufDo()| + tlib#buffer#InsertText .................. |tlib#buffer#InsertText()| + tlib#buffer#InsertText0 ................. |tlib#buffer#InsertText0()| + tlib#buffer#CurrentByte ................. |tlib#buffer#CurrentByte()| + tlib#buffer#KeepCursorPosition .......... |tlib#buffer#KeepCursorPosition()| + tlib#hook#Run ........................... |tlib#hook#Run()| tlib#string#RemoveBackslashes ........... |tlib#string#RemoveBackslashes()| tlib#string#Chomp ....................... |tlib#string#Chomp()| tlib#string#Format ...................... |tlib#string#Format()| @@ -274,9 +295,9 @@ Contents~ plugin/02tlib.vim~ *:TRequire* -TRequire NAME [VERSION [FILE]] +:TRequire NAME [VERSION [FILE]] Make a certain vim file is loaded. - + Conventions: If FILE isn't defined, plugin/NAME.vim is loaded. The file must provide a variable loaded_{NAME} that represents the version number. @@ -325,86 +346,126 @@ TRequire NAME [VERSION [FILE]] < *:TBrowseOutput* -TBrowseOutput COMMAND +:TBrowseOutput COMMAND Ever wondered how to efficiently browse the output of a command without redirecting it to a file? This command takes a command as argument and presents the output via |tlib#input#List()| so that you can easily search for a keyword (e.g. the name of a variable or function) and the like. - + If you press enter, the selected line will be copied to the command line. Press ESC to cancel browsing. - + EXAMPLES: > TBrowseOutput 20verb TeaseTheCulprit < *:TBrowseScriptnames* -TBrowseScriptnames +:TBrowseScriptnames List all sourced script names (the output of ':scriptnames'). - + When you press enter, the selected script will be opened in the current window. Press ESC to cancel. - + EXAMPLES: > TBrowseScriptnames < *:TTimeCommand* -TTimeCommand CMD +:TTimeCommand CMD Time the execution time of CMD. + +Variables~ + *g:tlib_pick_last_item* g:tlib_pick_last_item (default: 1) When 1, automatically select the last remaining item only if the list had only one item to begin with. When 2, automatically select a last remaining item after applying any filters. + See |tlib#input#List()|. *g:tlib_sortprefs_threshold* g:tlib_sortprefs_threshold (default: 200) If a list is bigger than this value, don't try to be smart when selecting an item. Be slightly faster instead. + See |tlib#input#List()|. *g:tlib_scratch_pos* g:tlib_scratch_pos (default: 'botright') Scratch window position. By default the list window is opened on the bottom. Set this variable to 'topleft' or '' to change this behaviour. + See |tlib#input#List()|. *g:tlib_inputlist_pct* g:tlib_inputlist_pct (default: 50) Size of the input list window (in percent) from the main size (of &lines). + See |tlib#input#List()|. *g:tlib_inputlist_width_filename* g:tlib_inputlist_width_filename (default: '&co / 3') Size of filename columns when listing filenames. + See |tlib#input#List()|. *g:tlib_inputlist_higroup* g:tlib_inputlist_higroup (default: 'IncSearch') - The highlight group to use for showing matches in the input list window. + The highlight group to use for showing matches in the input list + window. + See |tlib#input#List()|. *g:tlib_inputlist_livesearch_threshold* g:tlib_inputlist_livesearch_threshold (default: 1000) - If a list contains more items, don't do an incremental "live search", - but use |input()| to query the user for a filter. This is useful on - slower machines or with very long lists. + If a list contains more items, |tlib#input#List()| does not perform an + incremental "live search" but uses |input()| to query the user for a + filter. This is useful on slower machines or with very long lists. *g:tlib_inputlist_filename_indicators* g:tlib_inputlist_filename_indicators (default: 0) - If true, show some indicators about the status of a filename (e.g. - buflisted(), bufloaded() etc.). + If true, |tlib#input#List()| will show some indicators about the + status of a filename (e.g. buflisted(), bufloaded() etc.). This is disabled by default because vim checks also for the file on disk when doing this. *g:tlib_inputlist_match* -g:tlib_inputlist_match (default: 'cnf') - Can be "cnf", "cnfd", "seq", or "fuzzy". See: - cnf :: Match substrings - - |tlib#Filter_cnf#New()| (this is the default method) - - |tlib#Filter_cnfd#New()| - seq :: Match sequences of characters +g:tlib_inputlist_match (default: 'cnfx') + Determine how |tlib#input#List()| and related functions work. + Can be "cnf", "cnfd", "cnfx", "seq", or "fuzzy". See: + cnfx ... Like cnfd but |g:tlib#Filter_cnfx#expander| is interpreted + as a wildcard (this is the default method) + - A plus character ("+") acts as a wildcard as if ".\{-}" (see + |/\{-|) were entered. + - Examples: + - "f+o" matches "fo", "fxo", and "fxxxoo", but doesn't match + "far". + - Otherwise it is a derivate of the cnf method (see below). + - See also |tlib#Filter_cnfx#New()|. + cnfd ... Like cnf but "." is interpreted as a wildcard, i.e. it is + expanded to "\.\{-}" + - A period character (".") acts as a wildcard as if ".\{-}" (see + |/\{-|) were entered. + - Examples: + - "f.o" matches "fo", "fxo", and "fxxxoo", but doesn't match + "far". + - Otherwise it is a derivate of the cnf method (see below). + - See also |tlib#Filter_cnfd#New()|. + cnf .... Match substrings + - A blank creates an AND conjunction, i.e. the next pattern has to + match too. + - A pipe character ("|") creates an OR conjunction, either this or + the next next pattern has to match. + - Patterns are very 'nomagic' |regexp| with a |\V| prefix. + - A pattern starting with "-" makes the filter exclude items + matching that pattern. + - Examples: + - "foo bar" matches items that contain the strings "foo" AND + "bar". + - "foo|bar boo|far" matches items that contain either ("foo" OR + "bar") AND ("boo" OR "far"). + - See also |tlib#Filter_cnf#New()|. + seq .... Match sequences of characters - |tlib#Filter_seq#New()| - fuzzy :: Match fuzzy character sequences + fuzzy .. Match fuzzy character sequences - |tlib#Filter_fuzzy#New()| *g:tlib_inputlist_shortmessage* @@ -464,7 +525,7 @@ g:tlib_keyagents_InputList_s The default key bindings for single-item-select list views. If you want to use , to move the cursor up and down, add these two lines to after/plugin/02tlib.vim: > - + let g:tlib_keyagents_InputList_s[10] = 'tlib#agent#Down' " let g:tlib_keyagents_InputList_s[11] = 'tlib#agent#Up' " < @@ -479,67 +540,90 @@ g:tlib_keyagents_InputList_m *g:tlib_handlers_EditList* g:tlib_handlers_EditList - -======================================================================== -autoload/tlib/autocmdgroup.vim~ - - *tlib#autocmdgroup#Init()* -tlib#autocmdgroup#Init() + *g:tlib_debug* +g:tlib_debug ======================================================================== -autoload/tlib/tab.vim~ +autoload/tlib/notify.vim~ - *tlib#tab#BufMap()* -tlib#tab#BufMap() - Return a dictionary of bufnumbers => [[tabpage, winnr] ...] + *tlib#notify#Echo()* +tlib#notify#Echo(text, ?style='') + Print text in the echo area. Temporarily disable 'ruler' and 'showcmd' + in order to prevent |press-enter| messages. - *tlib#tab#TabWinNr()* -tlib#tab#TabWinNr(buffer) - Find a buffer's window at some tab page. - - *tlib#tab#Set()* -tlib#tab#Set(tabnr) + *tlib#notify#TrimMessage()* +tlib#notify#TrimMessage(message) + Contributed by Erik Falor: + If the line containing the message is too long, echoing it will cause + a 'Hit ENTER' prompt to appear. This function cleans up the line so + that does not happen. + The echoed line is too long if it is wider than the width of the + window, minus cmdline space taken up by the ruler and showcmd + features. ======================================================================== -autoload/tlib/paragraph.vim~ +autoload/tlib/persistent.vim~ - *tlib#paragraph#GetMetric()* -tlib#paragraph#GetMetric() - Return an object describing a |paragraph|. + *g:tlib_persistent* +g:tlib_persistent (default: '') + The directory for persistent data files. If empty, use + |tlib#dir#MyRuntime|.'/share'. - *tlib#paragraph#Move()* -tlib#paragraph#Move(direction, count) - This function can be used with the tinymode plugin to move around - paragraphs. - - Example configuration: > - - call tinymode#EnterMap("para_move", "gp") - call tinymode#ModeMsg("para_move", "Move paragraph: j/k") - call tinymode#Map("para_move", "j", "silent call tlib#paragraph#Move('Down', '[N]')") - call tinymode#Map("para_move", "k", "silent call tlib#paragraph#Move('Up', '[N]')") - call tinymode#ModeArg("para_move", "owncount", 1) -< + *tlib#persistent#Dir()* +tlib#persistent#Dir(?mode = 'bg') + Return the full directory name for persistent data files. + + *tlib#persistent#Filename()* +tlib#persistent#Filename(type, ?file=%, ?mkdir=0) + + *tlib#persistent#Get()* +tlib#persistent#Get(cfile) + + *tlib#persistent#Save()* +tlib#persistent#Save(cfile, dictionary) ======================================================================== -autoload/tlib/scratch.vim~ +autoload/tlib/vim.vim~ - *tlib#scratch#UseScratch()* -tlib#scratch#UseScratch(?keyargs={}) - Display a scratch buffer (a buffer with no file). See :TScratch for an - example. - Return the scratch buffer's number. - Values for keyargs: - scratch_split ... 1: split, 0: window, -1: tab + *g:tlib#vim#simalt_maximize* +g:tlib#vim#simalt_maximize (default: 'x') + The alt-key for maximizing the window. + CAUTION: The value of this paramter depends on your locale and + maybe the windows version you are running. - *tlib#scratch#CloseScratch()* -tlib#scratch#CloseScratch(keyargs, ...) - Close a scratch buffer as defined in keyargs (usually a World). - Return 1 if the scratch buffer is closed (or if it already was - closed). + *g:tlib#vim#simalt_restore* +g:tlib#vim#simalt_restore (default: 'r') + The alt-key for restoring the window. + CAUTION: The value of this paramter depends on your locale and + maybe the windows version you are running. + + *g:tlib#vim#use_vimtweak* +g:tlib#vim#use_vimtweak (default: 0) + If true, use the vimtweak.dll for windows. This will enable + tlib to remove the caption for fullscreen windows. + + *tlib#vim#Maximize()* +tlib#vim#Maximize(fullscreen) + Maximize the window. + You might need to redefine |g:tlib#vim#simalt_maximize| if it doesn't + work for you. + + *tlib#vim#RestoreWindow()* +tlib#vim#RestoreWindow() + Restore the original vimsize after having called |tlib#vim#Maximize()|. + + *g:tlib#vim#use_wmctrl* +g:tlib#vim#use_wmctrl (default: executable('wmctrl')) + If true, use wmctrl for X windows to make a window + maximized/fullscreen. + + This is the preferred method for maximizing windows under X + windows. Some window managers have problem coping with the + default method of setting 'lines' and 'columns' to a large + value. ======================================================================== @@ -567,91 +651,90 @@ tlib#progressbar#Restore() ======================================================================== -autoload/tlib/Object.vim~ -Provides a prototype plus some OO-like methods. +autoload/tlib/eval.vim~ - *tlib#Object#New()* -tlib#Object#New(?fields={}) - This function creates a prototype that provides some kind of - inheritance mechanism and a way to call parent/super methods. - - The usage demonstrated in the following example works best when every - class/prototype is defined in a file of its own. - - The reason for why there is a dedicated constructor function is that - this layout facilitates the use of templates and that methods are - hidden from the user. Other solutions are possible. - - EXAMPLES: > - let s:prototype = tlib#Object#New({ - \ '_class': ['FooBar'], - \ 'foo': 1, - \ 'bar': 2, - \ }) - " Constructor - function! FooBar(...) - let object = s:prototype.New(a:0 >= 1 ? a:1 : {}) - return object - endf - function! s:prototype.babble() { - echo "I think, therefore I am ". (self.foo * self.bar) ." months old." - } - -< This could now be used like this: > - let myfoo = FooBar({'foo': 3}) - call myfoo.babble() - => I think, therefore I am 6 months old. - echo myfoo.IsA('FooBar') - => 1 - echo myfoo.IsA('object') - => 1 - echo myfoo.IsA('Foo') - => 0 - echo myfoo.RespondTo('babble') - => 1 - echo myfoo.RespondTo('speak') - => 0 -< - -prototype.New - -prototype.Inherit - -prototype.Extend - -prototype.IsA - -prototype.IsRelated - -prototype.RespondTo - -prototype.Super - - *tlib#Object#Methods()* -tlib#Object#Methods(object, ...) + *tlib#eval#FormatValue()* +tlib#eval#FormatValue(value, ...) ======================================================================== -autoload/tlib/win.vim~ +autoload/tlib/list.vim~ - *tlib#win#Set()* -tlib#win#Set(winnr) - Return vim code to jump back to the original window. + *tlib#list#Inject()* +tlib#list#Inject(list, initial_value, funcref) + EXAMPLES: > + echo tlib#list#Inject([1,2,3], 0, function('Add') + => 6 +< - *tlib#win#GetLayout()* -tlib#win#GetLayout(?save_view=0) + *tlib#list#Compact()* +tlib#list#Compact(list) + EXAMPLES: > + tlib#list#Compact([0,1,2,3,[], {}, ""]) + => [1,2,3] +< - *tlib#win#SetLayout()* -tlib#win#SetLayout(layout) + *tlib#list#Flatten()* +tlib#list#Flatten(list) + EXAMPLES: > + tlib#list#Flatten([0,[1,2,[3,""]]]) + => [0,1,2,3,""] +< - *tlib#win#List()* -tlib#win#List() + *tlib#list#FindAll()* +tlib#list#FindAll(list, filter, ?process_expr="") + Basically the same as filter() - *tlib#win#Width()* -tlib#win#Width(wnr) + EXAMPLES: > + tlib#list#FindAll([1,2,3], 'v:val >= 2') + => [2, 3] +< - *tlib#win#WinDo()* -tlib#win#WinDo(ex) + *tlib#list#Find()* +tlib#list#Find(list, filter, ?default="", ?process_expr="") + + EXAMPLES: > + tlib#list#Find([1,2,3], 'v:val >= 2') + => 2 +< + + *tlib#list#Any()* +tlib#list#Any(list, expr) + EXAMPLES: > + tlib#list#Any([1,2,3], 'v:val >= 2') + => 1 +< + + *tlib#list#All()* +tlib#list#All(list, expr) + EXAMPLES: > + tlib#list#All([1,2,3], 'v:val >= 2') + => 0 +< + + *tlib#list#Remove()* +tlib#list#Remove(list, element) + EXAMPLES: > + tlib#list#Remove([1,2,1,2], 2) + => [1,1,2] +< + + *tlib#list#RemoveAll()* +tlib#list#RemoveAll(list, element) + EXAMPLES: > + tlib#list#RemoveAll([1,2,1,2], 2) + => [1,1] +< + + *tlib#list#Zip()* +tlib#list#Zip(lists, ?default='') + EXAMPLES: > + tlib#list#Zip([[1,2,3], [4,5,6]]) + => [[1,4], [2,5], [3,6]] +< + + *tlib#list#Uniq()* +tlib#list#Uniq(list, ...) ======================================================================== @@ -669,16 +752,16 @@ tlib#cmd#BrowseOutputWithCallback(callback, command) Execute COMMAND and present its output in a |tlib#input#List()|; when a line is selected, execute the function named as the CALLBACK and pass in that line as an argument. - + The CALLBACK function gives you an opportunity to massage the COMMAND output and possibly act on it in a meaningful way. For example, if COMMAND listed all URIs found in the current buffer, CALLBACK could validate and then open the selected URI in the system's default browser. - + This function is meant to be a tool to help compose the implementations of powerful commands that use |tlib#input#List()| as a common interface. See |TBrowseScriptnames| as an example. - + EXAMPLES: > call tlib#cmd#BrowseOutputWithCallback('tlib#cmd#ParseScriptname', 'scriptnames') < @@ -702,11 +785,56 @@ tlib#cmd#Time(cmd) ======================================================================== -autoload/tlib/comments.vim~ +autoload/tlib/syntax.vim~ - *tlib#comments#Comments()* -tlib#comments#Comments(...) - function! tlib#comments#Comments(?rx='') + *tlib#syntax#Collect()* +tlib#syntax#Collect() + + *tlib#syntax#Names()* +tlib#syntax#Names(?rx='') + + +======================================================================== +autoload/tlib/balloon.vim~ + + *tlib#balloon#Register()* +tlib#balloon#Register(expr) + + *tlib#balloon#Remove()* +tlib#balloon#Remove(expr) + + *tlib#balloon#Expr()* +tlib#balloon#Expr() + + +======================================================================== +autoload/tlib/vcs.vim~ + + *g:tlib#vcs#def* +g:tlib#vcs#def {...} + A dictionarie of supported VCS (currently: git, hg, svn, bzr). + + *g:tlib#vcs#executables* +g:tlib#vcs#executables {...} + A dictionary of custom executables for VCS commands. If the value is + empty, support for that VCS will be removed. If no key is present, it + is assumed that the VCS "type" is the name of the executable. + + *g:tlib#vcs#check* +g:tlib#vcs#check (default: has('win16') || has('win32') || has('win64') ? '%s.exe' : '%s') + If non-empty, use it as a format string to check whether a VCS is + installed on your computer. + + *tlib#vcs#FindVCS()* +tlib#vcs#FindVCS(filename) + + *tlib#vcs#Ls()* +tlib#vcs#Ls(?filename=bufname('%'), ?vcs=[type, dir]) + Return the files under VCS. + + *tlib#vcs#Diff()* +tlib#vcs#Diff(filename, ?vcs=[type, dir]) + Return the diff for "filename" ======================================================================== @@ -715,7 +843,7 @@ autoload/tlib/char.vim~ *tlib#char#Get()* tlib#char#Get(?timeout=0) Get a character. - + EXAMPLES: > echo tlib#char#Get() echo tlib#char#Get(5) @@ -729,14 +857,97 @@ tlib#char#GetWithTimeout(timeout, ...) ======================================================================== -autoload/tlib/World.vim~ -A prototype used by |tlib#input#List|. -Inherits from |tlib#Object#New|. +autoload/tlib/scratch.vim~ - *tlib#World#New()* -tlib#World#New(...) + *tlib#scratch#UseScratch()* +tlib#scratch#UseScratch(?keyargs={}) + Display a scratch buffer (a buffer with no file). See :TScratch for an + example. + Return the scratch buffer's number. + Values for keyargs: + scratch_split ... 1: split, 0: window, -1: tab -prototype.Reset + *tlib#scratch#CloseScratch()* +tlib#scratch#CloseScratch(keyargs, ...) + Close a scratch buffer as defined in keyargs (usually a World). + Return 1 if the scratch buffer is closed (or if it already was + closed). + + +======================================================================== +autoload/tlib/autocmdgroup.vim~ + + *tlib#autocmdgroup#Init()* +tlib#autocmdgroup#Init() + + +======================================================================== +autoload/tlib/cache.vim~ + + *g:tlib#cache#purge_days* +g:tlib#cache#purge_days (default: 31) + |tlib#cache#Purge()|: Remove cache files older than N days. + + *g:tlib#cache#purge_every_days* +g:tlib#cache#purge_every_days (default: 31) + Purge the cache every N days. Disable automatic purging by setting + this value to a negative value. + + *g:tlib#cache#script_encoding* +g:tlib#cache#script_encoding (default: &enc) + The encoding used for the purge-cache script. + Default: 'enc' + + *g:tlib#cache#run_script* +g:tlib#cache#run_script (default: 1) + Whether to run the directory removal script: + 0 ... No + 1 ... Query user + 2 ... Yes + + *g:tlib#cache#silent* +g:tlib#cache#silent (default: 0) + If non-nil, don't display a message that files were deleted from the + cache. + + *g:tlib#cache#dont_purge* +g:tlib#cache#dont_purge (default: ['[\/]\.last_purge$']) + A list of regexps that are matched against partial filenames of the + cached files. If a regexp matches, the file won't be removed by + |tlib#cache#Purge()|. + + *tlib#cache#Dir()* +tlib#cache#Dir(?mode = 'bg') + The default cache directory. + + *tlib#cache#Filename()* +tlib#cache#Filename(type, ?file=%, ?mkdir=0, ?dir='') + + *tlib#cache#Save()* +tlib#cache#Save(cfile, dictionary) + + *tlib#cache#Get()* +tlib#cache#Get(cfile) + + *tlib#cache#MaybePurge()* +tlib#cache#MaybePurge() + Call |tlib#cache#Purge()| if the last purge was done before + |g:tlib#cache#purge_every_days|. + + *tlib#cache#Purge()* +tlib#cache#Purge() + Delete old files. + + *tlib#cache#ListFilesInCache()* +tlib#cache#ListFilesInCache(...) + + +======================================================================== +autoload/tlib/normal.vim~ + + *tlib#normal#WithRegister()* +tlib#normal#WithRegister(cmd, ?register='t', ?norm_cmd='norm!') + Execute a normal command while maintaining all registers. ======================================================================== @@ -755,305 +966,6 @@ tlib#time#Diff(a, b, ...) tlib#time#DiffMSecs(a, b, ...) -======================================================================== -autoload/tlib/textobjects.vim~ - - *standard-paragraph* -tlib#textobjects#StandardParagraph() - Select a "Standard Paragraph", i.e. a text block followed by blank - lines. Other than |ap|, the last paragraph in a document is handled - just the same. - - The |text-object| can be accessed as "sp". Example: > - - vsp ... select the current standard paragraph - -< Return 1, if the paragraph is the last one in the document. - - *tlib#textobjects#Init()* -tlib#textobjects#Init() - - *v_sp* -v_sp ... :call tlib#textobjects#StandardParagraph() - sp ... Standard paragraph (for use as |text-objects|). - - *o_sp* -o_sp ... :normal Vsp - - -======================================================================== -autoload/tlib/Filter_fuzzy.vim~ - - *tlib#Filter_fuzzy#New()* -tlib#Filter_fuzzy#New(...) - Support for "fuzzy" pattern matching in |tlib#input#List()|. - Characters are interpreted as if connected with '.\{-}'. - - In "fuzzy" mode, the pretty printing of filenames is disabled. - - - TLogVAR a:world.display_format - - -======================================================================== -autoload/tlib/file.vim~ - - *tlib#file#Split()* -tlib#file#Split(filename) - EXAMPLES: > - tlib#file#Split('foo/bar/filename.txt') - => ['foo', 'bar', 'filename.txt'] -< - - *tlib#file#Join()* -tlib#file#Join(filename_parts, ?strip_slashes=0) - EXAMPLES: > - tlib#file#Join(['foo', 'bar', 'filename.txt']) - => 'foo/bar/filename.txt' -< - - *tlib#file#Relative()* -tlib#file#Relative(filename, basedir) - EXAMPLES: > - tlib#file#Relative('foo/bar/filename.txt', 'foo') - => 'bar/filename.txt' -< - - *tlib#file#With()* -tlib#file#With(fcmd, bcmd, files, ?world={}) - - -======================================================================== -autoload/tlib/Filter_seq.vim~ - - *tlib#Filter_seq#New()* -tlib#Filter_seq#New(...) - The search pattern for |tlib#input#List()| is interpreted as a - disjunction of 'magic' regular expressions with the exception of a dot - ".", which is interpreted as ".\{-}". - The pattern is a '/magic' regexp pattern. - - -======================================================================== -autoload/tlib/date.vim~ - - *tlib#date#DiffInDays()* -tlib#date#DiffInDays(date1, ?date2=localtime(), ?allow_zero=0) - - *tlib#date#Parse()* -tlib#date#Parse(date, ?allow_zero=0) "{{{3 - - *tlib#date#SecondsSince1970()* -tlib#date#SecondsSince1970(date, ...) - tlib#date#SecondsSince1970(date, ?daysshift=0, ?allow_zero=0) - - -======================================================================== -autoload/tlib/balloon.vim~ - - *tlib#balloon#Register()* -tlib#balloon#Register(expr) - - *tlib#balloon#Remove()* -tlib#balloon#Remove(expr) - - *tlib#balloon#Expr()* -tlib#balloon#Expr() - - -======================================================================== -autoload/tlib/buffer.vim~ - - *tlib#buffer#EnableMRU()* -tlib#buffer#EnableMRU() - - *tlib#buffer#DisableMRU()* -tlib#buffer#DisableMRU() - - *tlib#buffer#Set()* -tlib#buffer#Set(buffer) - Set the buffer to buffer and return a command as string that can be - evaluated by |:execute| in order to restore the original view. - - *tlib#buffer#Eval()* -tlib#buffer#Eval(buffer, code) - Evaluate CODE in BUFFER. - - EXAMPLES: > - call tlib#buffer#Eval('foo.txt', 'echo b:bar') -< - - *tlib#buffer#GetList()* -tlib#buffer#GetList(?show_hidden=0, ?show_number=0, " ?order='bufnr') - Possible values for the "order" argument: - bufnr :: Default behaviour - mru :: Sort buffers according to most recent use - basename :: Sort by the file's basename (last component) - - NOTE: MRU order works on second invocation only. If you want to always - use MRU order, call tlib#buffer#EnableMRU() in your ~/.vimrc file. - - *tlib#buffer#ViewLine()* -tlib#buffer#ViewLine(line, ?position='z') - line is either a number or a string that begins with a number. - For possible values for position see |scroll-cursor|. - See also |g:tlib_viewline_position|. - - *tlib#buffer#HighlightLine()* -tlib#buffer#HighlightLine(...) - - *tlib#buffer#DeleteRange()* -tlib#buffer#DeleteRange(line1, line2) - Delete the lines in the current buffer. Wrapper for |:delete|. - - *tlib#buffer#ReplaceRange()* -tlib#buffer#ReplaceRange(line1, line2, lines) - Replace a range of lines. - - *tlib#buffer#ScratchStart()* -tlib#buffer#ScratchStart() - Initialize some scratch area at the bottom of the current buffer. - - *tlib#buffer#ScratchEnd()* -tlib#buffer#ScratchEnd() - Remove the in-buffer scratch area. - - *tlib#buffer#BufDo()* -tlib#buffer#BufDo(exec) - Run exec on all buffers via bufdo and return to the original buffer. - - *tlib#buffer#InsertText()* -tlib#buffer#InsertText(text, keyargs) - Keyargs: - 'shift': 0|N - 'col': col('.')|N - 'lineno': line('.')|N - 'indent': 0|1 - 'pos': 'e'|'s' ... Where to locate the cursor (somewhat like s and e in {offset}) - Insert text (a string) in the buffer. - - *tlib#buffer#InsertText0()* -tlib#buffer#InsertText0(text, ...) - - *tlib#buffer#CurrentByte()* -tlib#buffer#CurrentByte() - - *tlib#buffer#KeepCursorPosition()* -tlib#buffer#KeepCursorPosition(cmd) - Evaluate cmd while maintaining the cursor position and jump registers. - - -======================================================================== -autoload/tlib/Filter_cnfd.vim~ - - *tlib#Filter_cnfd#New()* -tlib#Filter_cnfd#New(...) - The same as |tlib#FilterCNF#New()| but a dot is expanded to '\.\{-}'. - As a consequence, patterns cannot match dots. - The pattern is a '/\V' very no-'/magic' regexp pattern. - - -======================================================================== -autoload/tlib/type.vim~ - - *tlib#type#IsNumber()* -tlib#type#IsNumber(expr) - - *tlib#type#IsString()* -tlib#type#IsString(expr) - - *tlib#type#IsFuncref()* -tlib#type#IsFuncref(expr) - - *tlib#type#IsList()* -tlib#type#IsList(expr) - - *tlib#type#IsDictionary()* -tlib#type#IsDictionary(expr) - - -======================================================================== -autoload/tlib/syntax.vim~ - - *tlib#syntax#Collect()* -tlib#syntax#Collect() - - *tlib#syntax#Names()* -tlib#syntax#Names(?rx='') - - -======================================================================== -autoload/tlib/vim.vim~ - - *g:tlib#vim#simalt_maximize* -g:tlib#vim#simalt_maximize (default: 'x') - - *g:tlib#vim#simalt_restore* -g:tlib#vim#simalt_restore (default: 'r') - - *g:tlib#vim#use_vimtweak* -g:tlib#vim#use_vimtweak (default: 0) - - *tlib#vim#Maximize()* -tlib#vim#Maximize(fullscreen) - Maximize the window. - You might need to redefine |g:tlib#vim#simalt_maximize| if it doesn't - work for you. - - *tlib#vim#RestoreWindow()* -tlib#vim#RestoreWindow() - Restore the original vimsize after having called |tlib#vim#Maximize()|. - - *g:tlib#vim#use_wmctrl* -g:tlib#vim#use_wmctrl (default: executable('wmctrl')) - - -======================================================================== -autoload/tlib/hook.vim~ - - *tlib#hook#Run()* -tlib#hook#Run(hook, ?dict={}) - Execute dict[hook], w:{hook}, b:{hook}, or g:{hook} if existent. - - -======================================================================== -autoload/tlib/eval.vim~ - - *tlib#eval#FormatValue()* -tlib#eval#FormatValue(value, ...) - - -======================================================================== -autoload/tlib/arg.vim~ - - *tlib#arg#Get()* -tlib#arg#Get(n, var, ?default="", ?test='') - Set a positional argument from a variable argument list. - See tlib#string#RemoveBackslashes() for an example. - - *tlib#arg#Let()* -tlib#arg#Let(list, ?default='') - Set a positional arguments from a variable argument list. - See tlib#input#List() for an example. - - *tlib#arg#Key()* -tlib#arg#Key(dict, list, ?default='') - See |:TKeyArg|. - - *tlib#arg#StringAsKeyArgs()* -tlib#arg#StringAsKeyArgs(string, ?keys=[], ?evaluate=0) - - *tlib#arg#Ex()* -tlib#arg#Ex(arg, ?chars='%#! ') - Escape some characters in a string. - - Use |fnamescape()| if available. - - EXAMPLES: > - exec 'edit '. tlib#arg#Ex('foo%#bar.txt') -< - - ======================================================================== autoload/tlib/var.vim~ @@ -1061,7 +973,7 @@ autoload/tlib/var.vim~ tlib#var#Let(name, val) Define a variable called NAME if yet undefined. You can also use the :TLLet command. - + EXAMPLES: > exec tlib#var#Let('g:foo', 1) TLet g:foo = 1 @@ -1070,7 +982,7 @@ tlib#var#Let(name, val) *tlib#var#EGet()* tlib#var#EGet(var, namespace, ?default='') Retrieve a variable by searching several namespaces. - + EXAMPLES: > let g:foo = 1 let b:foo = 2 @@ -1083,7 +995,7 @@ tlib#var#EGet(var, namespace, ?default='') *tlib#var#Get()* tlib#var#Get(var, namespace, ?default='') Retrieve a variable by searching several namespaces. - + EXAMPLES: > let g:foo = 1 let b:foo = 2 @@ -1100,151 +1012,6 @@ tlib#var#List(rx, ?prefix='') echo tlib#var#List('tlib_', 'g:') -======================================================================== -autoload/tlib/Filter_cnf.vim~ - - *tlib#Filter_cnf#New()* -tlib#Filter_cnf#New(...) - The search pattern for |tlib#input#List()| is in conjunctive normal - form: (P1 OR P2 ...) AND (P3 OR P4 ...) ... - The pattern is a '/\V' very no-'/magic' regexp pattern. - - Pressing joins two patterns with AND. - Pressing | joins two patterns with OR. - I.e. In order to get "lala AND (foo OR bar)", you type - "lala foo|bar". - - This is also the base class for other filters. - - -======================================================================== -autoload/tlib/rx.vim~ - - *tlib#rx#Escape()* -tlib#rx#Escape(text, ?magic='m') - magic can be one of: m, M, v, V - See :help 'magic' - - *tlib#rx#EscapeReplace()* -tlib#rx#EscapeReplace(text, ?magic='m') - Escape return |sub-replace-special|. - - *tlib#rx#Suffixes()* -tlib#rx#Suffixes(...) - - -======================================================================== -autoload/tlib/url.vim~ - - *tlib#url#Decode()* -tlib#url#Decode(url) - Decode an encoded URL. - - *tlib#url#DecodeChar()* -tlib#url#DecodeChar(char) - Decode a single character. - - *tlib#url#EncodeChar()* -tlib#url#EncodeChar(char) - Encode a single character. - - *tlib#url#Encode()* -tlib#url#Encode(url, ...) - Encode an URL. - - -======================================================================== -autoload/tlib/input.vim~ -Input-related, select from a list etc. - - *tlib#input#List()* -tlib#input#List(type. ?query='', ?list=[], ?handlers=[], ?default="", ?timeout=0) - Select a single or multiple items from a list. Return either the list - of selected elements or its indexes. - - By default, typing numbers will select an item by its index. See - |g:tlib_numeric_chars| to find out how to change this. - - The item is automatically selected if the numbers typed equals the - number of digits of the list length. I.e. if a list contains 20 items, - typing 1 will first highlight item 1 but it won't select/use it - because 1 is an ambiguous input in this context. If you press enter, - the first item will be selected. If you press another digit (e.g. 0), - item 10 will be selected. Another way to select item 1 would be to - type 01. If the list contains only 9 items, typing 1 would select the - first item right away. - - type can be: - s ... Return one selected element - si ... Return the index of the selected element - m ... Return a list of selected elements - mi ... Return a list of indexes - - Several pattern matching styles are supported. See - |g:tlib_inputlist_match|. - - EXAMPLES: > - echo tlib#input#List('s', 'Select one item', [100,200,300]) - echo tlib#input#List('si', 'Select one item', [100,200,300]) - echo tlib#input#List('m', 'Select one or more item(s)', [100,200,300]) - echo tlib#input#List('mi', 'Select one or more item(s)', [100,200,300]) - -< See ../samples/tlib/input/tlib_input_list.vim (move the cursor over - the filename and press gf) for a more elaborated example. - - *tlib#input#ListD()* -tlib#input#ListD(dict) - A wrapper for |tlib#input#ListW()| that builds |tlib#World#New| from - dict. - - *tlib#input#ListW()* -tlib#input#ListW(world, ?command='') - The second argument (command) is meant for internal use only. - The same as |tlib#input#List| but the arguments are packed into world - (an instance of tlib#World as returned by |tlib#World#New|). - - *tlib#input#EditList()* -tlib#input#EditList(query, list, ?timeout=0) - Edit a list. - - EXAMPLES: > - echo tlib#input#EditList('Edit:', [100,200,300]) -< - - *tlib#input#Resume()* -tlib#input#Resume(name, pick) - - *tlib#input#CommandSelect()* -tlib#input#CommandSelect(command, ?keyargs={}) - Take a command, view the output, and let the user select an item from - its output. - - EXAMPLE: > - command! TMarks exec 'norm! `'. matchstr(tlib#input#CommandSelect('marks'), '^ \+\zs.') - command! TAbbrevs exec 'norm i'. matchstr(tlib#input#CommandSelect('abbrev'), '^\S\+\s\+\zs\S\+') -< - - *tlib#input#Edit()* -tlib#input#Edit(name, value, callback, ?cb_args=[]) - - Edit a value (asynchronously) in a scratch buffer. Use name for - identification. Call callback when done (or on cancel). - In the scratch buffer: - Press or to enter the new value, c to cancel - editing. - EXAMPLES: > - fun! FooContinue(success, text) - if a:success - let b:var = a:text - endif - endf - call tlib#input#Edit('foo', b:var, 'FooContinue') -< - - *tlib#input#Dialog()* -tlib#input#Dialog(text, options, default) - - ======================================================================== autoload/tlib/agent.vim~ Various agents for use as key handlers in tlib#input#List() @@ -1388,6 +1155,86 @@ tlib#agent#DoAtLine(world, selected) *tlib#agent#Wildcard()* tlib#agent#Wildcard(world, selected) + *tlib#agent#Null()* +tlib#agent#Null(world, selected) + + *tlib#agent#ExecAgentByName()* +tlib#agent#ExecAgentByName(world, selected) + + *tlib#agent#CompleteAgentNames()* +tlib#agent#CompleteAgentNames(ArgLead, CmdLine, CursorPos) + + +======================================================================== +autoload/tlib/Filter_cnfx.vim~ + + *g:tlib#Filter_cnfx#expander* +g:tlib#Filter_cnfx#expander (default: '+') + A character that should be expanded to '\.\{-}'. + + *tlib#Filter_cnfx#New()* +tlib#Filter_cnfx#New(...) + The same as |tlib#Filter_cnfd#New()| but a a customizable character + |see tlib#Filter_cnfx#expander| is expanded to '\.\{-}'. + The pattern is a '/\V' very no-'/magic' regexp pattern. + + +======================================================================== +autoload/tlib/url.vim~ + + *tlib#url#Decode()* +tlib#url#Decode(url) + Decode an encoded URL. + + *tlib#url#DecodeChar()* +tlib#url#DecodeChar(char) + Decode a single character. + + *tlib#url#EncodeChar()* +tlib#url#EncodeChar(char) + Encode a single character. + + *tlib#url#Encode()* +tlib#url#Encode(url, ...) + Encode an URL. + + +======================================================================== +autoload/tlib/signs.vim~ + + *tlib#signs#ClearAll()* +tlib#signs#ClearAll(sign) + Clear all signs with name SIGN. + + *tlib#signs#ClearBuffer()* +tlib#signs#ClearBuffer(sign, bufnr) + Clear all signs with name SIGN in buffer BUFNR. + + *tlib#signs#Mark()* +tlib#signs#Mark(sign, list) + Add signs for all locations in LIST. LIST must adhere with the + quickfix list format (see |getqflist()|; only the fields lnum and + bufnr are required). + + list:: a quickfix or location list + sign:: a sign defined with |:sign-define| + + +======================================================================== +autoload/tlib/rx.vim~ + + *tlib#rx#Escape()* +tlib#rx#Escape(text, ?magic='m') + magic can be one of: m, M, v, V + See :help 'magic' + + *tlib#rx#EscapeReplace()* +tlib#rx#EscapeReplace(text, ?magic='m') + Escape return |sub-replace-special|. + + *tlib#rx#Suffixes()* +tlib#rx#Suffixes(...) + ======================================================================== autoload/tlib/tag.vim~ @@ -1397,7 +1244,7 @@ tlib#tag#Retrieve(rx, ?extra_tags=0) Get all tags matching rx. Basically, this function simply calls |taglist()|, but when extra_tags is true, the list of the tag files (see 'tags') is temporarily expanded with |g:tlib_tags_extra|. - + Example use: If you want to include tags for, eg, JDK, normal tags use can become slow. You could proceed as follows: @@ -1429,83 +1276,6 @@ tlib#tag#Collect(constraints, ?use_extra=1, ?match_front=1) tlib#tag#Format(tag) -======================================================================== -autoload/tlib/signs.vim~ - - *tlib#signs#ClearAll()* -tlib#signs#ClearAll(sign) - Clear all signs with name SIGN. - - *tlib#signs#ClearBuffer()* -tlib#signs#ClearBuffer(sign, bufnr) - Clear all signs with name SIGN in buffer BUFNR. - - *tlib#signs#Mark()* -tlib#signs#Mark(sign, list) - Add signs for all locations in LIST. LIST must adhere with the - quickfix list format (see |getqflist()|; only the fields lnum and - bufnr are required). - - list:: a quickfix or location list - sign:: a sign defined with |:sign-define| - - -======================================================================== -autoload/tlib/cache.vim~ - - *g:tlib#cache#purge_days* -g:tlib#cache#purge_days (default: 31) - |tlib#cache#Purge()|: Remove cache files older than N days. - - *g:tlib#cache#purge_every_days* -g:tlib#cache#purge_every_days (default: 31) - Purge the cache every N days. Disable automatic purging by setting - this value to a negative value. - - *g:tlib#cache#script_encoding* -g:tlib#cache#script_encoding (default: &enc) - The encoding used for the purge-cache script. - Default: 'enc' - - *g:tlib#cache#run_script* -g:tlib#cache#run_script (default: 1) - Whether to run the directory removal script: - 0 ... No - 1 ... Query user - 2 ... Yes - - *g:tlib#cache#dont_purge* -g:tlib#cache#dont_purge (default: ['[\/]\.last_purge$']) - A list of regexps that are matched against partial filenames of the - cached files. If a regexp matches, the file won't be removed by - |tlib#cache#Purge()|. - - *tlib#cache#Dir()* -tlib#cache#Dir(?mode = 'bg') - The default cache directory. - - *tlib#cache#Filename()* -tlib#cache#Filename(type, ?file=%, ?mkdir=0) - - *tlib#cache#Save()* -tlib#cache#Save(cfile, dictionary) - - *tlib#cache#Get()* -tlib#cache#Get(cfile) - - *tlib#cache#MaybePurge()* -tlib#cache#MaybePurge() - Call |tlib#cache#Purge()| if the last purge was done before - |g:tlib#cache#purge_every_days|. - - *tlib#cache#Purge()* -tlib#cache#Purge() - Delete old files. - - *tlib#cache#ListFilesInCache()* -tlib#cache#ListFilesInCache(...) - - ======================================================================== autoload/tlib/map.vim~ @@ -1518,11 +1288,302 @@ tlib#map#PumAccept(key) ======================================================================== -autoload/tlib/normal.vim~ +autoload/tlib/Filter_cnfd.vim~ - *tlib#normal#WithRegister()* -tlib#normal#WithRegister(cmd, ?register='t', ?norm_cmd='norm!') - Execute a normal command while maintaining all registers. + *tlib#Filter_cnfd#New()* +tlib#Filter_cnfd#New(...) + The same as |tlib#Filter_cnf#New()| but a dot is expanded to '\.\{-}'. + As a consequence, patterns cannot match dots. + The pattern is a '/\V' very no-'/magic' regexp pattern. + + +======================================================================== +autoload/tlib/input.vim~ +Input-related, select from a list etc. + + *g:tlib#input#use_popup* +g:tlib#input#use_popup (default: has('menu') && (has('gui_gtk') || has('gui_gtk2') || has('gui_win32'))) + If true, define a popup menu for |tlib#input#List()| and related + functions. + + *g:tlib#input#format_filename* +g:tlib#input#format_filename (default: 'l') + How to format filenames: + l ... Show basenames on the left side, separated from the + directory names + r ... Show basenames on the right side + + *g:tlib#input#filename_padding_r* +g:tlib#input#filename_padding_r (default: '&co / 10') + If g:tlib#input#format_filename == 'r', how much space should be kept + free on the right side. + + *g:tlib#input#filename_max_width* +g:tlib#input#filename_max_width (default: '&co / 2') + If g:tlib#input#format_filename == 'l', an expression that + |eval()|uates to the maximum display width of filenames. + + *tlib#input#List()* +tlib#input#List(type. ?query='', ?list=[], ?handlers=[], ?default="", ?timeout=0) + Select a single or multiple items from a list. Return either the list + of selected elements or its indexes. + + By default, typing numbers will select an item by its index. See + |g:tlib_numeric_chars| to find out how to change this. + + The item is automatically selected if the numbers typed equals the + number of digits of the list length. I.e. if a list contains 20 items, + typing 1 will first highlight item 1 but it won't select/use it + because 1 is an ambiguous input in this context. If you press enter, + the first item will be selected. If you press another digit (e.g. 0), + item 10 will be selected. Another way to select item 1 would be to + type 01. If the list contains only 9 items, typing 1 would select the + first item right away. + + type can be: + s ... Return one selected element + si ... Return the index of the selected element + m ... Return a list of selected elements + mi ... Return a list of indexes + + Several pattern matching styles are supported. See + |g:tlib_inputlist_match|. + + EXAMPLES: > + echo tlib#input#List('s', 'Select one item', [100,200,300]) + echo tlib#input#List('si', 'Select one item', [100,200,300]) + echo tlib#input#List('m', 'Select one or more item(s)', [100,200,300]) + echo tlib#input#List('mi', 'Select one or more item(s)', [100,200,300]) + +< See ../samples/tlib/input/tlib_input_list.vim (move the cursor over + the filename and press gf) for a more elaborated example. + + *tlib#input#ListD()* +tlib#input#ListD(dict) + A wrapper for |tlib#input#ListW()| that builds |tlib#World#New| from + dict. + + *tlib#input#ListW()* +tlib#input#ListW(world, ?command='') + The second argument (command) is meant for internal use only. + The same as |tlib#input#List| but the arguments are packed into world + (an instance of tlib#World as returned by |tlib#World#New|). + + *tlib#input#EditList()* +tlib#input#EditList(query, list, ?timeout=0) + Edit a list. + + EXAMPLES: > + echo tlib#input#EditList('Edit:', [100,200,300]) +< + + *tlib#input#Resume()* +tlib#input#Resume(name, pick, bufnr) + + *tlib#input#CommandSelect()* +tlib#input#CommandSelect(command, ?keyargs={}) + Take a command, view the output, and let the user select an item from + its output. + + EXAMPLE: > + command! TMarks exec 'norm! `'. matchstr(tlib#input#CommandSelect('marks'), '^ \+\zs.') + command! TAbbrevs exec 'norm i'. matchstr(tlib#input#CommandSelect('abbrev'), '^\S\+\s\+\zs\S\+') +< + + *tlib#input#Edit()* +tlib#input#Edit(name, value, callback, ?cb_args=[]) + + Edit a value (asynchronously) in a scratch buffer. Use name for + identification. Call callback when done (or on cancel). + In the scratch buffer: + Press or to enter the new value, c to cancel + editing. + EXAMPLES: > + fun! FooContinue(success, text) + if a:success + let b:var = a:text + endif + endf + call tlib#input#Edit('foo', b:var, 'FooContinue') +< + + *tlib#input#Dialog()* +tlib#input#Dialog(text, options, default) + + +======================================================================== +autoload/tlib/file.vim~ + + *tlib#file#Split()* +tlib#file#Split(filename) + EXAMPLES: > + tlib#file#Split('foo/bar/filename.txt') + => ['foo', 'bar', 'filename.txt'] +< + + *tlib#file#Join()* +tlib#file#Join(filename_parts, ?strip_slashes=0) + EXAMPLES: > + tlib#file#Join(['foo', 'bar', 'filename.txt']) + => 'foo/bar/filename.txt' +< + + *tlib#file#Relative()* +tlib#file#Relative(filename, basedir) + EXAMPLES: > + tlib#file#Relative('foo/bar/filename.txt', 'foo') + => 'bar/filename.txt' +< + + *tlib#file#With()* +tlib#file#With(fcmd, bcmd, files, ?world={}) + + +======================================================================== +autoload/tlib/paragraph.vim~ + + *tlib#paragraph#GetMetric()* +tlib#paragraph#GetMetric() + Return an object describing a |paragraph|. + + *tlib#paragraph#Move()* +tlib#paragraph#Move(direction, count) + This function can be used with the tinymode plugin to move around + paragraphs. + + Example configuration: > + + call tinymode#EnterMap("para_move", "gp") + call tinymode#ModeMsg("para_move", "Move paragraph: j/k") + call tinymode#Map("para_move", "j", "silent call tlib#paragraph#Move('Down', '[N]')") + call tinymode#Map("para_move", "k", "silent call tlib#paragraph#Move('Up', '[N]')") + call tinymode#ModeArg("para_move", "owncount", 1) +< + + +======================================================================== +autoload/tlib/World.vim~ +A prototype used by |tlib#input#List|. +Inherits from |tlib#Object#New|. + + *tlib#World#New()* +tlib#World#New(...) + + +======================================================================== +autoload/tlib/tab.vim~ + + *tlib#tab#BufMap()* +tlib#tab#BufMap() + Return a dictionary of bufnumbers => [[tabpage, winnr] ...] + + *tlib#tab#TabWinNr()* +tlib#tab#TabWinNr(buffer) + Find a buffer's window at some tab page. + + *tlib#tab#Set()* +tlib#tab#Set(tabnr) + + +======================================================================== +autoload/tlib/date.vim~ + + *tlib#date#DiffInDays()* +tlib#date#DiffInDays(date1, ?date2=localtime(), ?allow_zero=0) + + *tlib#date#Parse()* +tlib#date#Parse(date, ?allow_zero=0) "{{{3 + + *tlib#date#SecondsSince1970()* +tlib#date#SecondsSince1970(date, ...) + tlib#date#SecondsSince1970(date, ?daysshift=0, ?allow_zero=0) + + +======================================================================== +autoload/tlib/type.vim~ + + *tlib#type#IsNumber()* +tlib#type#IsNumber(expr) + + *tlib#type#IsString()* +tlib#type#IsString(expr) + + *tlib#type#IsFuncref()* +tlib#type#IsFuncref(expr) + + *tlib#type#IsList()* +tlib#type#IsList(expr) + + *tlib#type#IsDictionary()* +tlib#type#IsDictionary(expr) + + +======================================================================== +autoload/tlib/Filter_fuzzy.vim~ + + *tlib#Filter_fuzzy#New()* +tlib#Filter_fuzzy#New(...) + Support for "fuzzy" pattern matching in |tlib#input#List()|. + Patterns are interpreted as if characters were connected with '.\{-}'. + + In "fuzzy" mode, the pretty printing of filenames is disabled. + + +======================================================================== +autoload/tlib/textobjects.vim~ + + *standard-paragraph* +tlib#textobjects#StandardParagraph() + Select a "Standard Paragraph", i.e. a text block followed by blank + lines. Other than |ap|, the last paragraph in a document is handled + just the same. + + The |text-object| can be accessed as "sp". Example: > + + vsp ... select the current standard paragraph + +< Return 1, if the paragraph is the last one in the document. + + *tlib#textobjects#Init()* +tlib#textobjects#Init() + + *v_sp* +v_sp ... :call tlib#textobjects#StandardParagraph() + sp ... Standard paragraph (for use as |text-objects|). + + *o_sp* +o_sp ... :normal Vsp + + +======================================================================== +autoload/tlib/arg.vim~ + + *tlib#arg#Get()* +tlib#arg#Get(n, var, ?default="", ?test='') + Set a positional argument from a variable argument list. + See tlib#string#RemoveBackslashes() for an example. + + *tlib#arg#Let()* +tlib#arg#Let(list, ?default='') + Set a positional arguments from a variable argument list. + See tlib#input#List() for an example. + + *tlib#arg#Key()* +tlib#arg#Key(dict, list, ?default='') + See |:TKeyArg|. + + *tlib#arg#StringAsKeyArgs()* +tlib#arg#StringAsKeyArgs(string, ?keys=[], ?evaluate=0) + + *tlib#arg#Ex()* +tlib#arg#Ex(arg, ?chars='%#! ') + Escape some characters in a string. + + Use |fnamescape()| if available. + + EXAMPLES: > + exec 'edit '. tlib#arg#Ex('foo%#bar.txt') +< ======================================================================== @@ -1561,102 +1622,208 @@ tlib#dir#Pop() ======================================================================== -autoload/tlib/notify.vim~ +autoload/tlib/win.vim~ - *tlib#notify#Echo()* -tlib#notify#Echo(text, ...) - Print text in the echo area. Temporarily disable 'ruler' and 'showcmd' - in order to prevent |press-enter| messages. + *tlib#win#Set()* +tlib#win#Set(winnr) + Return vim code to jump back to the original window. - *tlib#notify#TrimMessage()* -tlib#notify#TrimMessage(message) - Contributed by Erik Falor: - If the line containing the message is too long, echoing it will cause - a 'Hit ENTER' prompt to appear. This function cleans up the line so - that does not happen. - The echoed line is too long if it is wider than the width of the - window, minus cmdline space taken up by the ruler and showcmd - features. + *tlib#win#GetLayout()* +tlib#win#GetLayout(?save_view=0) + + *tlib#win#SetLayout()* +tlib#win#SetLayout(layout) + + *tlib#win#List()* +tlib#win#List() + + *tlib#win#Width()* +tlib#win#Width(wnr) + + *tlib#win#WinDo()* +tlib#win#WinDo(ex) ======================================================================== -autoload/tlib/list.vim~ +autoload/tlib/comments.vim~ + + *tlib#comments#Comments()* +tlib#comments#Comments(...) + function! tlib#comments#Comments(?rx='') + + +======================================================================== +autoload/tlib/Filter_cnf.vim~ + + *tlib#Filter_cnf#New()* +tlib#Filter_cnf#New(...) + The search pattern for |tlib#input#List()| is in conjunctive normal + form: (P1 OR P2 ...) AND (P3 OR P4 ...) ... + The pattern is a '/\V' very no-'/magic' regexp pattern. + + Pressing joins two patterns with AND. + Pressing | joins two patterns with OR. + I.e. In order to get "lala AND (foo OR bar)", you type + "lala foo|bar". + + This is also the base class for other filters. + +prototype.Pretty + + +======================================================================== +autoload/tlib/Object.vim~ +Provides a prototype plus some OO-like methods. + + *tlib#Object#New()* +tlib#Object#New(?fields={}) + This function creates a prototype that provides some kind of + inheritance mechanism and a way to call parent/super methods. + + The usage demonstrated in the following example works best when every + class/prototype is defined in a file of its own. + + The reason for why there is a dedicated constructor function is that + this layout facilitates the use of templates and that methods are + hidden from the user. Other solutions are possible. - *tlib#list#Inject()* -tlib#list#Inject(list, initial_value, funcref) EXAMPLES: > - echo tlib#list#Inject([1,2,3], 0, function('Add') - => 6 + let s:prototype = tlib#Object#New({ + \ '_class': ['FooBar'], + \ 'foo': 1, + \ 'bar': 2, + \ }) + " Constructor + function! FooBar(...) + let object = s:prototype.New(a:0 >= 1 ? a:1 : {}) + return object + endf + function! s:prototype.babble() { + echo "I think, therefore I am ". (self.foo * self.bar) ." months old." + } + +< This could now be used like this: > + let myfoo = FooBar({'foo': 3}) + call myfoo.babble() + => I think, therefore I am 6 months old. + echo myfoo.IsA('FooBar') + => 1 + echo myfoo.IsA('object') + => 1 + echo myfoo.IsA('Foo') + => 0 + echo myfoo.RespondTo('babble') + => 1 + echo myfoo.RespondTo('speak') + => 0 < - *tlib#list#Compact()* -tlib#list#Compact(list) +prototype.New + +prototype.Inherit + +prototype.Extend + +prototype.IsA + +prototype.IsRelated + +prototype.RespondTo + +prototype.Super + + *tlib#Object#Methods()* +tlib#Object#Methods(object, ...) + + +======================================================================== +autoload/tlib/buffer.vim~ + + *tlib#buffer#EnableMRU()* +tlib#buffer#EnableMRU() + + *tlib#buffer#DisableMRU()* +tlib#buffer#DisableMRU() + + *tlib#buffer#Set()* +tlib#buffer#Set(buffer) + Set the buffer to buffer and return a command as string that can be + evaluated by |:execute| in order to restore the original view. + + *tlib#buffer#Eval()* +tlib#buffer#Eval(buffer, code) + Evaluate CODE in BUFFER. + EXAMPLES: > - tlib#list#Compact([0,1,2,3,[], {}, ""]) - => [1,2,3] + call tlib#buffer#Eval('foo.txt', 'echo b:bar') < - *tlib#list#Flatten()* -tlib#list#Flatten(list) - EXAMPLES: > - tlib#list#Flatten([0,[1,2,[3,""]]]) - => [0,1,2,3,""] -< + *tlib#buffer#GetList()* +tlib#buffer#GetList(?show_hidden=0, ?show_number=0, " ?order='bufnr') + Possible values for the "order" argument: + bufnr :: Default behaviour + mru :: Sort buffers according to most recent use + basename :: Sort by the file's basename (last component) - *tlib#list#FindAll()* -tlib#list#FindAll(list, filter, ?process_expr="") - Basically the same as filter() - - EXAMPLES: > - tlib#list#FindAll([1,2,3], 'v:val >= 2') - => [2, 3] -< + NOTE: MRU order works on second invocation only. If you want to always + use MRU order, call tlib#buffer#EnableMRU() in your ~/.vimrc file. - *tlib#list#Find()* -tlib#list#Find(list, filter, ?default="", ?process_expr="") - - EXAMPLES: > - tlib#list#Find([1,2,3], 'v:val >= 2') - => 2 -< + *tlib#buffer#ViewLine()* +tlib#buffer#ViewLine(line, ?position='z') + line is either a number or a string that begins with a number. + For possible values for position see |scroll-cursor|. + See also |g:tlib_viewline_position|. - *tlib#list#Any()* -tlib#list#Any(list, expr) - EXAMPLES: > - tlib#list#Any([1,2,3], 'v:val >= 2') - => 1 -< + *tlib#buffer#HighlightLine()* +tlib#buffer#HighlightLine(...) - *tlib#list#All()* -tlib#list#All(list, expr) - EXAMPLES: > - tlib#list#All([1,2,3], 'v:val >= 2') - => 0 -< + *tlib#buffer#DeleteRange()* +tlib#buffer#DeleteRange(line1, line2) + Delete the lines in the current buffer. Wrapper for |:delete|. - *tlib#list#Remove()* -tlib#list#Remove(list, element) - EXAMPLES: > - tlib#list#Remove([1,2,1,2], 2) - => [1,1,2] -< + *tlib#buffer#ReplaceRange()* +tlib#buffer#ReplaceRange(line1, line2, lines) + Replace a range of lines. - *tlib#list#RemoveAll()* -tlib#list#RemoveAll(list, element) - EXAMPLES: > - tlib#list#RemoveAll([1,2,1,2], 2) - => [1,1] -< + *tlib#buffer#ScratchStart()* +tlib#buffer#ScratchStart() + Initialize some scratch area at the bottom of the current buffer. - *tlib#list#Zip()* -tlib#list#Zip(lists, ?default='') - EXAMPLES: > - tlib#list#Zip([[1,2,3], [4,5,6]]) - => [[1,4], [2,5], [3,6]] -< + *tlib#buffer#ScratchEnd()* +tlib#buffer#ScratchEnd() + Remove the in-buffer scratch area. - *tlib#list#Uniq()* -tlib#list#Uniq(list, ...) + *tlib#buffer#BufDo()* +tlib#buffer#BufDo(exec) + Run exec on all buffers via bufdo and return to the original buffer. + + *tlib#buffer#InsertText()* +tlib#buffer#InsertText(text, keyargs) + Keyargs: + 'shift': 0|N + 'col': col('.')|N + 'lineno': line('.')|N + 'indent': 0|1 + 'pos': 'e'|'s' ... Where to locate the cursor (somewhat like s and e in {offset}) + Insert text (a string) in the buffer. + + *tlib#buffer#InsertText0()* +tlib#buffer#InsertText0(text, ...) + + *tlib#buffer#CurrentByte()* +tlib#buffer#CurrentByte() + + *tlib#buffer#KeepCursorPosition()* +tlib#buffer#KeepCursorPosition(cmd) + Evaluate cmd while maintaining the cursor position and jump registers. + + +======================================================================== +autoload/tlib/hook.vim~ + + *tlib#hook#Run()* +tlib#hook#Run(hook, ?dict={}) + Execute dict[hook], w:{hook}, b:{hook}, or g:{hook} if existent. ======================================================================== diff --git a/sources_non_forked/tlib/plugin/02tlib.vim b/sources_non_forked/tlib/plugin/02tlib.vim index f9cfe0b1..126db40a 100644 --- a/sources_non_forked/tlib/plugin/02tlib.vim +++ b/sources_non_forked/tlib/plugin/02tlib.vim @@ -3,8 +3,8 @@ " @Website: http://www.vim.org/account/profile.php?user_id=4037 " @License: GPL (see http://www.gnu.org/licenses/gpl.txt) " @Created: 2007-04-10. -" @Last Change: 2011-04-28. -" @Revision: 672 +" @Last Change: 2012-10-03. +" @Revision: 725 " GetLatestVimScripts: 1863 1 tlib.vim if &cp || exists("loaded_tlib") @@ -14,7 +14,7 @@ if v:version < 700 "{{{2 echoerr "tlib requires Vim >= 7" finish endif -let loaded_tlib = 41 +let loaded_tlib = 102 let s:save_cpo = &cpo set cpo&vim @@ -26,7 +26,7 @@ set cpo&vim " Commands~ {{{1 -" :display: TRequire NAME [VERSION [FILE]] +" :display: :TRequire NAME [VERSION [FILE]] " Make a certain vim file is loaded. " " Conventions: If FILE isn't defined, plugin/NAME.vim is loaded. The @@ -84,7 +84,7 @@ command! -nargs=+ TVarArg exec tlib#arg#Let([]) command! -nargs=+ TKeyArg exec tlib#arg#Key([]) -" :display: TBrowseOutput COMMAND +" :display: :TBrowseOutput COMMAND " Ever wondered how to efficiently browse the output of a command " without redirecting it to a file? This command takes a command as " argument and presents the output via |tlib#input#List()| so that you @@ -98,7 +98,7 @@ command! -nargs=+ TKeyArg exec tlib#arg#Key([]) " TBrowseOutput 20verb TeaseTheCulprit command! -nargs=1 -complete=command TBrowseOutput call tlib#cmd#BrowseOutput() -" :display: TBrowseScriptnames +" :display: :TBrowseScriptnames " List all sourced script names (the output of ':scriptnames'). " " When you press enter, the selected script will be opened in the current @@ -109,58 +109,96 @@ command! -nargs=1 -complete=command TBrowseOutput call tlib#cmd#BrowseOutput() +" :doc: " Variables~ {{{1 " When 1, automatically select the last remaining item only if the list " had only one item to begin with. " When 2, automatically select a last remaining item after applying " any filters. +" See |tlib#input#List()|. TLet g:tlib_pick_last_item = 1 " If a list is bigger than this value, don't try to be smart when " selecting an item. Be slightly faster instead. +" See |tlib#input#List()|. TLet g:tlib_sortprefs_threshold = 200 " Scratch window position. By default the list window is opened on the " bottom. Set this variable to 'topleft' or '' to change this behaviour. +" See |tlib#input#List()|. TLet g:tlib_scratch_pos = 'botright' " Size of the input list window (in percent) from the main size (of &lines). +" See |tlib#input#List()|. TLet g:tlib_inputlist_pct = 50 " Size of filename columns when listing filenames. +" See |tlib#input#List()|. TLet g:tlib_inputlist_width_filename = '&co / 3' " TLet g:tlib_inputlist_width_filename = 25 -" The highlight group to use for showing matches in the input list window. +" The highlight group to use for showing matches in the input list +" window. +" See |tlib#input#List()|. TLet g:tlib_inputlist_higroup = 'IncSearch' -" If a list contains more items, don't do an incremental "live search", -" but use |input()| to query the user for a filter. This is useful on -" slower machines or with very long lists. +" If a list contains more items, |tlib#input#List()| does not perform an +" incremental "live search" but uses |input()| to query the user for a +" filter. This is useful on slower machines or with very long lists. TLet g:tlib_inputlist_livesearch_threshold = 1000 -" If true, show some indicators about the status of a filename (e.g. -" buflisted(), bufloaded() etc.). +" If true, |tlib#input#List()| will show some indicators about the +" status of a filename (e.g. buflisted(), bufloaded() etc.). " This is disabled by default because vim checks also for the file on " disk when doing this. TLet g:tlib_inputlist_filename_indicators = 0 -" Can be "cnf", "cnfd", "seq", or "fuzzy". See: -" cnf :: Match substrings -" - |tlib#Filter_cnf#New()| (this is the default method) -" - |tlib#Filter_cnfd#New()| -" seq :: Match sequences of characters +" Determine how |tlib#input#List()| and related functions work. +" Can be "cnf", "cnfd", "cnfx", "seq", or "fuzzy". See: +" cnfx ... Like cnfd but |g:tlib#Filter_cnfx#expander| is interpreted +" as a wildcard (this is the default method) +" - A plus character ("+") acts as a wildcard as if ".\{-}" (see +" |/\{-|) were entered. +" - Examples: +" - "f+o" matches "fo", "fxo", and "fxxxoo", but doesn't match +" "far". +" - Otherwise it is a derivate of the cnf method (see below). +" - See also |tlib#Filter_cnfx#New()|. +" cnfd ... Like cnf but "." is interpreted as a wildcard, i.e. it is +" expanded to "\.\{-}" +" - A period character (".") acts as a wildcard as if ".\{-}" (see +" |/\{-|) were entered. +" - Examples: +" - "f.o" matches "fo", "fxo", and "fxxxoo", but doesn't match +" "far". +" - Otherwise it is a derivate of the cnf method (see below). +" - See also |tlib#Filter_cnfd#New()|. +" cnf .... Match substrings +" - A blank creates an AND conjunction, i.e. the next pattern has to +" match too. +" - A pipe character ("|") creates an OR conjunction, either this or +" the next next pattern has to match. +" - Patterns are very 'nomagic' |regexp| with a |\V| prefix. +" - A pattern starting with "-" makes the filter exclude items +" matching that pattern. +" - Examples: +" - "foo bar" matches items that contain the strings "foo" AND +" "bar". +" - "foo|bar boo|far" matches items that contain either ("foo" OR +" "bar") AND ("boo" OR "far"). +" - See also |tlib#Filter_cnf#New()|. +" seq .... Match sequences of characters " - |tlib#Filter_seq#New()| -" fuzzy :: Match fuzzy character sequences +" fuzzy .. Match fuzzy character sequences " - |tlib#Filter_fuzzy#New()| -TLet g:tlib_inputlist_match = 'cnf' +TLet g:tlib_inputlist_match = 'cnfx' " If not null, display only a short info about the filter. TLet g:tlib_inputlist_shortmessage = 0 @@ -265,6 +303,8 @@ TLet g:tlib_keyagents_InputList_s = { \ 15: 'tlib#agent#SuspendToParentWindow', \ 63: 'tlib#agent#Help', \ "\": 'tlib#agent#Help', + \ "\": 'tlib#agent#ExecAgentByName', + \ "\": 'tlib#agent#ExecAgentByName', \ "\": 'tlib#agent#ReduceFilter', \ "\": 'tlib#agent#ReduceFilter', \ "\": 'tlib#agent#PopFilter', @@ -306,13 +346,8 @@ TLet g:tlib_handlers_EditList = [ \ ]}, \ ] - - -" " TEST: -" TRequire tselectbuffer 6 -" echo loaded_tselectbuffer - - +" :nodefault: +TLet g:tlib_debug = 0 let &cpo = s:save_cpo unlet s:save_cpo diff --git a/sources_non_forked/vim-addon-mw-utils/autoload/tovl/scratch_buffer.vim b/sources_non_forked/vim-addon-mw-utils/autoload/tovl/scratch_buffer.vim new file mode 100644 index 00000000..217dca11 --- /dev/null +++ b/sources_non_forked/vim-addon-mw-utils/autoload/tovl/scratch_buffer.vim @@ -0,0 +1,103 @@ +" old code + +augroup TOVLWrite +augroup end + +" =========== scratch buffer ========================================= +" a scratch buffer is a temporary buffer where the user can enter some text +" It can be used to get commit messages, edit configuration options and so on + +function! tovl#scratch_buffer#KeepIntactLineNr() + let i = 0 + while getline(i)!= b:keepIntact && i < line('$') + let i = i+1 + endwhile + if i > line('$') + return -1 + else + return i + endif +endfunction + +" opens a buffer and runs an action when the buffer is written +" keys: +" name : the name of the buffer +" onWrite : will be called on write +" onWrite is responsible for setlocal nomodified to indicate that +" saving has been successful +" help : callback returning additional information lines +" getContent : callback returning lines +" cmds : extra commands to be run (optional) +" (maybe you prefer adding them the default way afer the +" ScratchBuffer call. They'll be rerun on GetContents +" sp_cmd : the command to use to create the new buffer. Defaults to :e +" buftype : ... +" modifiable : 1 / 0 defaults to 1 +function! tovl#scratch_buffer#ScratchBuffer(opts) + let a:opts['name'] = get(a:opts,'name', 'strach_buffer_without_name') + exec get(a:opts, 'sp_cmd', 'e').' '.escape(a:opts['name'],' ') + let b:settings = a:opts + let b:settings['modifiable'] = get(a:opts,'modifiable', 1) + setlocal buftype=acwrite + command! -buffer -nargs=0 Help call tovl#scratch_buffer#Help() + + " setup write notification + au TOVLWrite BufWriteCmd call tovl#scratch_buffer#Write() + + if has_key(a:opts,'getContent') + command! -buffer -nargs=0 GetContents call tovl#scratch_buffer#GetContents() + GetContents + if !b:settings['modifiable'] + setlocal nomodifiable + endif + endif + "let u=&undolevels + "setlocal undolevels=-1 + "exec 'setlocal undolevels='.u + + " mark buffer as not modified + setlocal nomodified + + au BufReadCmd GetContents + + " run addittional commands + for cmd in get(a:opts,'cmds',[]) + exec cmd + endfor + silent echo get(a:opts,'echo_help', "type :Help for help") +endfunction + +" =========== utility functions ====================================== + +function! tovl#scratch_buffer#Write() + if has_key(b:settings, 'onWrite') + call funcref#Call(b:settings['onWrite']) + else + echo "don't know how to write. Option hasn't been passed" + endif +endfunction + +function! tovl#scratch_buffer#GetContents() + setlocal modifiable + " empty buffer + %g!//d + call append(0, funcref#Call(b:settings['getContent'])) + if !b:settings['modifiable'] + setlocal nomodifiable + endif + for cmd in get(b:settings,'cmds',[]) + exec cmd + endfor +endfunction + +function! tovl#scratch_buffer#Help() + let help = ["use :e! to reload contents, ZZ or :w(q) to write and quit" + \ ,"" + \ ,"Help for this scratch buffer:" + \ ,"=======================================================","",""] + \ + funcref#Call(get(b:settings, 'help', [])) + call tovl#scratch_buffer#ScratchBuffer({ + \ 'name' : "return Help of ".b:settings['name'], + \ 'getContent' : help + \ }) +endfunction diff --git a/sources_non_forked/vim-addon-mw-utils/autoload/tovl/ui/filter_list.vim b/sources_non_forked/vim-addon-mw-utils/autoload/tovl/ui/filter_list.vim new file mode 100644 index 00000000..74b2ab49 --- /dev/null +++ b/sources_non_forked/vim-addon-mw-utils/autoload/tovl/ui/filter_list.vim @@ -0,0 +1,473 @@ +" OLD CODE ! +" I should contribute the multiple filter feature to tlib + +" filter list displays a list of items +" you can white / black filter them by regular expressions (similar to the +" tlib TToC command +" However you can edit the filters afterwards and select the cols which should +" be shown + +fun! tovl#ui#filter_list#ListTest() + call tovl#ui#filter_list#ListView({ + \ 'aligned' : 1, + \ 'Continuation' : funcref#Function('echo string(ARGS[0])'), + \ 'items' : [ {"aa" : "a\nAAAAAAAAAAA", 'bb' : "bbbbbbbbbbbbb\nB" }, + \ {"aa" : "2a\n2AAAAAAAAAAAA", "bb" : "2 bbbbbbbbbbbbb\n2B"}, + \ {"aa" : "XXX", "bb" : "YY"} ], + \ }) + +endfun + +fun! s:Intersection(a, b) + return filter(copy(a:a), 'index(a:b, v:val) >= 0') +endf + +fun! tovl#ui#filter_list#ListTestGotoLineCurrentBuf() + let nr=1 + let lines = [] + for l in getline(0,line('$')) + call add(lines, {'nr': nr, 'line' :l}) + let nr = nr +1 + endfor + call tovl#ui#filter_list#ListView({ + \ 'aligned' : 0, + \ 'keys' : ['nr','line'], + \ 'number' : 1, + \ 'selectByIdOrFilter' : 1, + \ 'Continuation' : funcref#Function('exec ARGS[0]["nr"]'), + \ 'items' : lines, + \ }) +endfun + +" opens a new filtered list +" keys of opts parameters: +" Continuation: This function will be called with the selected items +" items: { key : (string or dict) } +" items willl be modified. use copy(youritems) as argument to prevent +" this. An item is either a string or a dict +" (eg {'file' : .., 'line': ... , 'msg' : .. ) +" keys: list of keys to be shown (optional) +" filter: list of inital filters which must be applied +" contains [ { filter: .. , keep : .. }, ] see FilterItems() below +" aligned: default 0 +" sp_cmd: the command to be used to create the new buffer (default ':e') +" init : 0 / 1 (default 1): wether to show the view right now +" number: 0 /1 (default 1): number items ? +" selectByIdOrFilter: 1: start in getchar() loop so that the user can select +" the item even faster +" auto: only do this if all items fit on screen +" (recommend) +" cmds: extra cmds to be run +" cursorAt : at which item to put the cursor? +" +" If you don't like the default view you can override UpdateDisplay +" +" Usage examples of this list control: +" - db results +" - replacement of the quickfix window +" - select a buffer etc +fun! tovl#ui#filter_list#ListView(opts) + " ActivateAddons theonevimlib + let d = {} + let d.items = a:opts.items + let d.cursorAt = get(a:opts, 'cursorAt', 0) + let d.aligned = get(a:opts, 'aligned', 0) + let d.sep = ' ' + let d.filter = get(a:opts, 'filter', []) + " using sp because of bd! (FIXME) + let d.sp_cmd = get(a:opts, 'sp_cmd', 'sp') + let d.allKeys = {} + let d.closeOnContinuation = get(a:opts,'closeOnContinuation',1) + " don't recommend OnSingleMatch, use OnSingleMatchCR instead + let d.continueOnSingleMatch = get(a:opts, 'continueOnSingleMatch',0) + let d.continueOnSingleMatchCR = get(a:opts, 'continueOnSingleMatchCR',1) + let d.selectByIdOrFilter = get(a:opts, 'selectByIdOrFilter', 0) + let d.linesToItems = {} + let d.number = get(a:opts, 'number', 1) + let d.cmds = get(a:opts, 'cmds', []) + let d.syn_cmds = get(a:opts, 'syn_cmds', []) + + if has_key(a:opts,'keys') | let d.keys = a:opts.keys | endif + if has_key(a:opts,'Continuation') | let d.Continuation = a:opts.Continuation | endif + + " cache already filtered items in case we want to view really long results + " contains [ { filter : { regex: .. , keep : .. } , items : .. , cursorAt :}, + " { filter : { ... } , items: .. , cursorAt : } + let d.cached = [] + " id of buffer + let d.buffer = -1 + let d.modeText = '' + + fun d.HelpText() + return [ "you've entered the the help of the powerful filtered view buffer", + \ "", + \ "type f to start filtering items by regex", + \ "type F to start dropping items by regex", + \ "k / K will ask you for the key to apply the filter to first", + \ "apply the filter by and press again to select item", + \ "", + \ "use :ShowAppliedFilters to list active filters", + \ "use :ToggleAlignment to toggle alignment", + \ "", + \ "TODO: Implement sorting, implement interface to change keys (displayed columns)" + \ ] + endfun + + " create new scratch buffer + " preprocess items calculating line count and maxwidth for all items + fun d.NewBufferAndInit() + let self.bufferId = bufnr(bufname('%')) + for idx in range(0,len(self.items)-1) + if type(self.items[idx]) != 4 + " no dict yet, make it one + let self.items[idx] = {'string_line' : self.items[idx]} + endif + let new = {} + for [k,v] in items(self.items[idx]) + let lines = split(v,"\n") + let self.items[idx][k] = { 'text' : v, 'rows' : len(lines), 'cols' : max(map(copy(lines),'len(v:val)')), 'lines' : lines } + let self.allKeys[k] = 1 + unlet k v + endfor + endfor + call tovl#scratch_buffer#ScratchBuffer({ + \ 'help' : funcref#Function(self.HelpText,{ 'self' : self }), + \ 'sp_cmd' : self.sp_cmd, + \ 'cmds' : self.cmds + \ }) + " I assume we have some kind of formatting anyway. Thus breaking lines is bad! + set nowrap + setlocal cursorline + let b:filtered_view = self + command! -buffer -nargs=0 ToggleAlignment call b:filtered_view.ToggleAlignment() + command! -buffer -nargs=0 ShowAppliedFilters call b:filtered_view.ShowAppliedFilters() + command! -buffer -nargs=0 RemoveFilters call b:filtered_view.RemoveFilters() + noremap f :call b:filtered_view.FilterFromKeyboard(1,'') + " noremap f :call b:filtered_view.FilterFromKeyboard(1) + noremap F :call b:filtered_view.FilterFromKeyboard(0,'') + if has_key(self,'Continuation') + nnoremap :call b:filtered_view.Continue() + endif + "noremap k + "noremap K + + let [items, cursorAt] = self.FilteredItems() + " len(items) is an approximation because one item can have multiple + " lines.. However adding the lines first to check takes too much time + if self.selectByIdOrFilter == 1 || (self.selectByIdOrFilter == 'auto' && winheight('%') > len(items) ) + call self.SelectByIdOrFilter() + else + " user should choose how to proceed + call self.UpdateDisplay() + endif + endfun + + " user interface + fun d.ToggleAlignment() + let self.aligned = !self.aligned + call self.UpdateDisplay() + endfun + fun d.ShowAppliedFilters() + for i in self.filter | echo string(i) | endfor + endfun + fun d.RemoveFilters() + let self.filter = [] + call self.UpdateDisplay() + endfun + fun d.Continue() + let item = self.CurrentItem() + call self.DoContinue(item) + endfun + fun d.DoContinue(v) + if self.closeOnContinuation | bw! | endif + call funcref#Call(self.Continuation,[a:v]) + endfun + + fun d.MapToOriginal(v) + if has_key(a:v, 'string_line') + return a:v.string_line.text + else + let d = {} + for [k,v] in items(a:v) + let d[k] = v.text + unlet k v + endfor + return d + endif + endfun + + fun d.CurrentItem() + let idx=line('.')-len(self.headerLines) + while idx >= 0 + if has_key(self.linesToItems, idx) + return self.MapToOriginal(self.FilteredItems()[0][self.linesToItems[idx]]) + else + let idx = idx -1 + endif + endwhile + throw "internal error, couldn't determine selected item!" + endfun + + " updates the filter cache and returns the final filtered items + fun d.FilteredItems() + " update cache + let idx = 0 + let [items, cursorAt] = [self.items, self.cursorAt] + for idx in range(0, len(self.filter)-1) + if idx +1 > len(self.cached) || self.cached[idx]['filter'] != self.filter[idx] + let self.cached = self.cached[:idx-1] + let [items, cursorAt] = self.FilterItem(copy(items), self.filter[idx], cursorAt) + call add(self.cached, { 'cursorAt' : cursorAt, 'items' : items, 'filter' : self.filter[idx]}) + else + let ci = self.cached[idx] + let [items, cursorAt] = [ci['items'], ci['cursorAt']] + endif + endfor + return [items, cursorAt] + endfun + + " calling this will return a set of lines which are expected to be the new + " buffer contents. The self.linesToItems dict is updated + fun d.UpdateDisplay() + + if empty(self.filter) + let self.statusline= 'no filter applied, :Help for help' + else + let self.statusline = len(self.filter).' '.string(self.filter[-1]) + endif + + let self.linesToItems = {} + let [items, cursorAt] = self.FilteredItems() + "let num_width = printf('%.0f', trunc(log10(len(items))+1)) + let num_width = 4 + if self.aligned + " get column width.. (probably will not work with unicde characters.. I + " don't have a better solution) + let maxlens={} + for i in items + for [k,v] in items(i) + if get(maxlens,k,0) < v.cols + let maxlens[k] = v.cols + endif + endfor + endfor + endif + + " format lines + let self.headerLines = [self.modeText] + let lines = copy(self.headerLines) + let lines_count = 0 + if self.number + let fmt_startA = '%'.num_width.'s)' + let fmt_startB = '%'.num_width.'s' + else + let fmt_startA = '' | let fmt_startB = '' + endif + let cursorAtLine = 1 " sane default + for idx in range(0,len(items)-1) + let self.linesToItems[lines_count + 1] = idx + let i = items[idx] + let keys = has_key(self,'keys') + \ ? s:Intersection(self.keys, keys(i)) + \ : keys(i) + let fmt = '' + let args = [i] + let cols = [] + for k in keys + let fmt .= self.sep.'%-'.(self.aligned ? maxlens[k] : i[k]['cols']).'s' + call add(cols, i[k]) + endfor + for row in range(0, max([1] + map(copy(cols),'v:val["rows"]'))-1) + let fmt_args = row == 0 ? [fmt_startA.fmt] : [fmt_startB.fmt] + if self.number + call add(fmt_args, row == 0 ? idx : '') + endif + for c in cols + call add(fmt_args, c.rows <= row ? '' : c.lines[row]) + endfor + call add(lines, call('printf', fmt_args)) + let lines_count += 1 + endfor + if idx == cursorAt + let cursorAtLine = lines_count + endif + endfor + " update stauts line to show last applied filter + " disabled cause it causes trouble on :wincmd w + " setlocal statusline=%!b:filtered_view.statusline + + " syntax + syn clear + for s in self.syn_cmds | exec s | endfor + let id = 0 + " highlight filter regex in buffer as well + let syn_ids = [ 'Underlined', 'Todo', 'Error', 'Type', 'Statement' ] + for f in self.filter + if !f.keep || !has_key(f, 'regex') | continue | endif + if f.regex != '' + try + exec 'syn match '.syn_ids[id % len(syn_ids)].' '.string(f.regex) + catch /.*/ + " ignore errors such as \ without following characters. Thus just + " ignore and wait for the next character + endtry + endif + let id = id +1 + endfor + if len(lines) > winheight('%') + call extend(lines, self.headerLines) + endif + normal ggdG + call append(0, lines) + " place cursor + exec (cursorAtLine+1) + " move cursor into the middle of the window + normal zz + endf + + " filter = keys : + " filter = string to be executed containing Val + " keep = 1 keep on match + " = 0 drop on match + " key (optional) + " cursorAt: at which item to put the cursor + " if that item is deleted it will be placed at the item above + " optional: key of dict if dict + fun d.FilterItem(items, filter, cursorAt) + let filter = 'Val =~ '.string(a:filter.regex) + let keep = a:filter.keep + let cursorAt = a:cursorAt + + for idx in reverse(range(0, len(a:items)-1)) + let i = a:items[idx] + if has_key(a:filter,'key') + let key = a:filter.key + if has_key(i, key) + " key given, only filter by this column + let Val = i[key]['text'] + exec 'let any = '.filter + else + let any = 0 + endif + else + let any = 0 + " no key given, try all + for x in values(i) + let Val = x['text'] + exec 'let any = '.filter + if any | break | endif + endfor + endif + if any != keep + call remove(a:items, idx) + if idx <= cursorAt + let cursorAt = cursorAt -1 + endif + endif + endfor + return [a:items, cursorAt] + endfun + + " if the user enters a number select by index else start filtering.. + fun d.SelectByIdOrFilter() + let idx='' + let items = self.FilteredItems()[0] + try + let self.modeText = '[0-9]* : select by index| : escape getchar() loop, any char: start filtering' + call self.UpdateDisplay() | redraw + while 1 + let c=getchar() + if index([13,10],c) >= 0 + return self.DoContinue(self.MapToOriginal(items[idx])) + elseif index([27], c) >=0 + " esc, abort + return + else + if type(c) == 0 + let c = nr2char(c) + endif + if c == "\" || index(map(range(0,10),'v:val.""'),c) >= 0 + if c == "\" + let idx = idx[:-2] + else + let idx .= c + endif + if idx < len(items) && idx.'0' > len(items) || idx == 0 && len(items) < 10 + " only match + return self.DoContinue(self.MapToOriginal(items[idx])) + endif + else + return self.FilterFromKeyboard(1,c) + endif + endif + endwhile + finally + let self.modeText = '' + endtry + endfun + + " gets a regular expresion filter by keybaord and updates the display while + " you're typing. The regex ist shown in the statusline + fun d.FilterFromKeyboard(keep, start, ...) + let self.modeText = 'press ESC to exit getchar() loop' + call self.UpdateDisplay() | redraw + + try + let key_text = a:0 > 0 ? 'key : '.a:1 : '' + let filter_bak = self.filter + let filter = copy(self.filter) + let start = a:start + let filter_new = '' + while 1 + if start != '' + " use c= last char to force updating display etc + let filter_new = start[:-2] + let c = start[-1:] + let start = '' + else + let c=getchar() + endif + if index([13,10],c) >= 0 + " c-j or return, accept new filter + let items = self.FilteredItems() + if len(items) == 1 && has_key(self, 'Continuation') && self.continueOnSingleMatchCR + call self.DoContinue(self.MapToOriginal(items[0])) + endif + return + elseif index([27], c) >=0 + " esc, abort + let self.filter = filter_bak + call self.UpdateDisplay() + return + else + if type(c) == 0 + let c = nr2char(c) + endif + if c == "\" + let filter_new = filter_new[:-2] + else + let filter_new .= c + endif + let d = {'keep' : a:keep, 'regex' : filter_new } + if a:0 > 0 + let d['key'] = a:1 + endif + let self.filter = copy(filter_bak) + call add(self.filter, d) + let items = self.FilteredItems() + if len(items) == 1 && has_key(self, 'Continuation') && self.continueOnSingleMatch + call self.DoContinue(self.MapToOriginal(items[0])) + return + endif + call self.UpdateDisplay() | redraw + endif + endwhile + finally + let self.modeText = '' + endtry + endfun + + if get(a:opts,'init',1) + call d.NewBufferAndInit() + endif +endfun diff --git a/sources_non_forked/vim-coffee-script/Readme.md b/sources_non_forked/vim-coffee-script/Readme.md index 1f8b75f9..664b9835 100644 --- a/sources_non_forked/vim-coffee-script/Readme.md +++ b/sources_non_forked/vim-coffee-script/Readme.md @@ -1,11 +1,10 @@ This project adds [CoffeeScript] support to the vim editor. It handles syntax, -indenting, compiling, and more. Also included is an [eco] syntax and support for -CoffeeScript in Haml and HTML. +indenting, compiling, and more. Also included is support for CoffeeScript in +Haml and HTML. ![Screenshot](http://i.imgur.com/eUBvm.png) [CoffeeScript]: http://jashkenas.github.com/coffee-script/ -[eco]: https://github.com/sstephenson/eco ### Install from a Zipball diff --git a/sources_non_forked/vim-coffee-script/compiler/coffee.vim b/sources_non_forked/vim-coffee-script/compiler/coffee.vim index 03c69e0c..8def0bfc 100644 --- a/sources_non_forked/vim-coffee-script/compiler/coffee.vim +++ b/sources_non_forked/vim-coffee-script/compiler/coffee.vim @@ -3,11 +3,20 @@ " URL: http://github.com/kchmck/vim-coffee-script " License: WTFPL +" All this is needed to support compiling filenames with spaces, quotes, and +" such. The filename is escaped and embedded into the `makeprg` setting. +" +" Because of this, `makeprg` must be updated on every file rename. And because +" of that, `CompilerSet` can't be used because it doesn't exist when the +" rename autocmd is ran. So, we have to do some checks to see whether `compiler` +" was called locally or globally, and respect that in the rest of the script. + if exists('current_compiler') finish +else + let current_compiler = 'coffee' endif -let current_compiler = 'coffee' " Pattern to check if coffee is the compiler let s:pat = '^' . current_compiler @@ -16,21 +25,12 @@ if !exists('coffee_compiler') let coffee_compiler = 'coffee' endif -if exists('coffee_make_compiler') - echohl WarningMsg - echom '`coffee_make_compiler` is deprecated: use `coffee_compiler` instead' - echohl None - - let coffee_compiler = coffee_make_compiler -endif - " Extra options passed to CoffeeMake if !exists('coffee_make_options') let coffee_make_options = '' endif -" Get a `makeprg` for the current filename. This is needed to support filenames -" with spaces and quotes, but also not break generic `make`. +" Get a `makeprg` for the current filename. function! s:GetMakePrg() return g:coffee_compiler . ' -c ' . g:coffee_make_options . ' $* ' \ . fnameescape(expand('%')) diff --git a/sources_non_forked/vim-coffee-script/ftdetect/coffee.vim b/sources_non_forked/vim-coffee-script/ftdetect/coffee.vim index 59e154b1..50569298 100644 --- a/sources_non_forked/vim-coffee-script/ftdetect/coffee.vim +++ b/sources_non_forked/vim-coffee-script/ftdetect/coffee.vim @@ -6,7 +6,7 @@ autocmd BufNewFile,BufRead *.coffee set filetype=coffee autocmd BufNewFile,BufRead *Cakefile set filetype=coffee autocmd BufNewFile,BufRead *.coffeekup,*.ck set filetype=coffee -autocmd BufNewFile,BufRead *.ck set filetype=coffee +autocmd BufNewFile,BufRead *._coffee set filetype=coffee function! s:DetectCoffee() if getline(1) =~ '^#!.*\' diff --git a/sources_non_forked/vim-coffee-script/syntax/coffee.vim b/sources_non_forked/vim-coffee-script/syntax/coffee.vim old mode 100755 new mode 100644 diff --git a/sources_non_forked/vim-indent-object/.gitignore b/sources_non_forked/vim-indent-object/.gitignore new file mode 100644 index 00000000..1b19a79f --- /dev/null +++ b/sources_non_forked/vim-indent-object/.gitignore @@ -0,0 +1,2 @@ +tags + diff --git a/sources_non_forked/vim-indent-object/doc/indent-object.txt b/sources_non_forked/vim-indent-object/doc/indent-object.txt new file mode 100644 index 00000000..5b581020 --- /dev/null +++ b/sources_non_forked/vim-indent-object/doc/indent-object.txt @@ -0,0 +1,120 @@ +*indent-object.txt* Text objects based on indent levels. + + Copyright (c) 2010 Michael Smith + +Indent Text Objects + +INTRODUCTION |idntobj-introduction| +TEXT OBJECTS |idntobj-objects| +BLANK LINES |idntobj-blanklines| +ABOUT |idntobj-about| + + +============================================================================== +INTRODUCTION *idntobj-introduction* + +Vim text objects provide a convenient way to select and operate on various +types of objects. These objects include regions surrounded by various types of +brackets and various parts of language (ie sentences, paragraphs, etc). + +This plugin defines a new text object, based on indentation levels. This is +very useful in languages such as Python, in which the syntax defines scope in +terms of indentation. Using the objects defined in this plugin, an entire if +structure can be quickly selected, for example. + + +============================================================================== +TEXT OBJECTS *ai* *ii* *aI* *iI* *idntobj-objects* + +This plugin defines two new text objects. These are very similar - they differ +only in whether they include the line below the block or not. + + Key Mapping Description ~ +> + ai (A)n (I)ndentation level and line above. + ii (I)nner (I)ndentation level (no line above). + aI (A)n (I)ndentation level and lines above/below. + iI (I)nner (I)ndentation level (no lines above/below). +< + +Note that the iI mapping is mostly included simply for completeness, it is +effectively a synonym for ii. + +Just like regular text objects, these mappings can be used either with +operators expecting a motion, such as 'd' or 'c', as well as in visual mode. +In visual mode the mapping can be repeated, which has the effect of +iteratively increasing the scope of indentation block selected. Specifying a +count can be used to achieve the same effect. + +The difference between |ai| and |aI| is that |ai| includes the line +immediately above the indentation block, whereas aI includes not only that, +but also the line below. Which of these is most useful largely depends on the +structure of the language being edited. + +For example, when editing the Python code, |ai| is generally more useful, as +the line above the indentation block is usually related to it. For example, in +the following code (* is used to indicate the cursor position): +> + if foo > 3: + log("foo is big") * + foo = 3 + do_something_else() +< +the if clause is logically related to the code block, whereas the function +call below is not. It is unlikely we would want to select the line below when +we are interested in the if block. + +However, in other languages, such as Vim scripts, control structures are +usually terminated with something like 'endif'. Therefore, in this example: +> + if foo > 3 + echo "foo is big" * + let foo = 3 + endif + call do_something_else() +< +we would more likely want to include the endif when we select the if +structure. + + +============================================================================== +BLANK LINES *idntobj-blanklines* + +When scanning code blocks, the plugin usually ignores blank lines. There is an +exception to this, however, when the block being selected is not indented. In +this case if blank lines are ignored, then the entire file would be selected. +Instead when code at the top level is being indented blank lines are +considered to delimit the block. + + +============================================================================== +ABOUT *idntobj-about* + +vim-indent-object was written by Michael Smith . The +project repository is kept at: + +http://github.com/michaeljsmith/vim-indent-object + +Any feedback or criticism is welcome, and can be mailed to the author at the +above email address. Alternatively issues can be raised on the project +website. + +Licence: + +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/sources_non_forked/vim-indent-object/plugin/indent-object.vim b/sources_non_forked/vim-indent-object/plugin/indent-object.vim new file mode 100644 index 00000000..afb8edd2 --- /dev/null +++ b/sources_non_forked/vim-indent-object/plugin/indent-object.vim @@ -0,0 +1,224 @@ +"-------------------------------------------------------------------------------- +" +" Copyright (c) 2010 Michael Smith +" +" http://github.com/michaeljsmith/vim-indent-object +" +" 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. +" +"-------------------------------------------------------------------------------- + +" Mappings excluding line below. +onoremap ai :cal HandleTextObjectMapping(0, 0, 0, [line("."), line("."), col("."), col(".")]) +onoremap ii :cal HandleTextObjectMapping(1, 0, 0, [line("."), line("."), col("."), col(".")]) +vnoremap ai :cal HandleTextObjectMapping(0, 0, 1, [line("'<"), line("'>"), col("'<"), col("'>")])gv +vnoremap ii :cal HandleTextObjectMapping(1, 0, 1, [line("'<"), line("'>"), col("'<"), col("'>")])gv + +" Mappings including line below. +onoremap aI :cal HandleTextObjectMapping(0, 1, 0, [line("."), line("."), col("."), col(".")]) +onoremap iI :cal HandleTextObjectMapping(1, 1, 0, [line("."), line("."), col("."), col(".")]) +vnoremap aI :cal HandleTextObjectMapping(0, 1, 1, [line("'<"), line("'>"), col("'<"), col("'>")])gv +vnoremap iI :cal HandleTextObjectMapping(1, 1, 1, [line("'<"), line("'>"), col("'<"), col("'>")])gv + +let s:l0 = -1 +let s:l1 = -1 +let s:c0 = -1 +let s:c1 = -1 + +function! TextObject(inner, incbelow, vis, range, count) + + " Record the current state of the visual region. + let vismode = "V" + + " Detect if this is a completely new visual selction session. + let new_vis = 0 + let new_vis = new_vis || s:l0 != a:range[0] + let new_vis = new_vis || s:l1 != a:range[1] + let new_vis = new_vis || s:c0 != a:range[2] + let new_vis = new_vis || s:c1 != a:range[3] + + let s:l0 = a:range[0] + let s:l1 = a:range[1] + let s:c0 = a:range[2] + let s:c1 = a:range[3] + + " Repeatedly increase the scope of the selection. + let itr_cnt = 0 + let cnt = a:count + while cnt > 0 + + " Look for the minimum indentation in the current visual region. + let l = s:l0 + let idnt_invalid = 1000 + let idnt = idnt_invalid + while l <= s:l1 + if !(getline(l) =~ "^\\s*$") + let idnt = min([idnt, indent(l)]) + endif + let l += 1 + endwhile + + " Keep track of where the range should be expanded to. + let l_1 = s:l0 + let l_1o = l_1 + let l2 = s:l1 + let l2o = l2 + + " If we are highlighting only blank lines, we may not have found a + " valid indent. In this case we need to look for the next and previous + " non blank lines and check which of those has the largest indent. + if idnt == idnt_invalid + let idnt = 0 + let pnb = prevnonblank(s:l0) + if pnb + let idnt = max([idnt, indent(pnb)]) + let l_1 = pnb + endif + let nnb = nextnonblank(s:l0) + if nnb + let idnt = max([idnt, indent(nnb)]) + endif + + " If we are in whitespace at the beginning of a block, skip over + " it when we are selecting the range. Similarly, if we are in + " whitespace at the end, ignore it. + if idnt > indent(pnb) + let l_1 = nnb + endif + if idnt > indent(nnb) + let l2 = pnb + endif + endif + + " Search backward for the first line with less indent than the target + " indent (skipping blank lines). + let blnk = getline(l_1) =~ "^\\s*$" + while l_1 > 0 && ((idnt == 0 && !blnk) || (idnt != 0 && (blnk || indent(l_1) >= idnt))) + if !blnk || !a:inner + let l_1o = l_1 + endif + let l_1 -= 1 + let blnk = getline(l_1) =~ "^\\s*$" + endwhile + + " Search forward for the first line with more indent than the target + " indent (skipping blank lines). + let line_cnt = line("$") + let blnk = getline(l2) =~ "^\\s*$" + while l2 <= line_cnt && ((idnt == 0 && !blnk) || (idnt != 0 && (blnk || indent(l2) >= idnt))) + if !blnk || !a:inner + let l2o = l2 + endif + let l2 += 1 + let blnk = getline(l2) =~ "^\\s*$" + endwhile + + " Determine which of these extensions to include. Include neither if + " we are selecting an 'inner' object. Exclude the bottom unless are + " told to include it. + let idnt2 = max([indent(l_1), indent(l2)]) + if indent(l_1) < idnt2 || a:inner + let l_1 = l_1o + endif + if indent(l2) < idnt2 || a:inner || !a:incbelow + let l2 = l2o + endif + let l_1 = max([l_1, 1]) + let l2 = min([l2, line("$")]) + + " Extend the columns to the start and end. + " If inner is selected, set the final cursor pos to the start + " of the text in the line. + let c_1 = 1 + if a:inner + let c_1 = match(getline(l_1), "\\c\\S") + 1 + endif + let c2 = len(getline(l2)) + if !a:inner + let c2 += 1 + endif + + " Make sure there's no change if we haven't really made a + " significant change in linewise mode - this makes sure that + " we can iteratively increase selection in linewise mode. + if itr_cnt == 0 && vismode ==# 'V' && s:l0 == l_1 && s:l1 == l2 + let c_1 = s:c0 + let c2 = s:c1 + endif + + " Check whether the visual region has changed. + let chg = 0 + let chg = chg || s:l0 != l_1 + let chg = chg || s:l1 != l2 + let chg = chg || s:c0 != c_1 + let chg = chg || s:c1 != c2 + + if vismode ==# 'V' && new_vis + let chg = 1 + endif + + " Update the vars. + let s:l0 = l_1 + let s:l1 = l2 + let s:c0 = c_1 + let s:c1 = c2 + + " If there was no change, then don't decrement the count (it didn't + " count because it didn't do anything). + if chg + let cnt = cnt - 1 + else + " Since this didn't work, push the selection back one char. This + " will have the effect of getting the enclosing block. Do it at + " the beginning rather than the end - the beginning is very likely + " to be only one indentation level different. + if s:l0 == 0 + return + endif + let s:l0 -= 1 + let s:c0 = len(getline(s:l0)) + endif + + let itr_cnt += 1 + + endwhile + + " Apply the range we have found. Make sure to use the current visual mode. + call cursor(s:l0, s:c0) + exe "normal! " . vismode + call cursor(s:l1, s:c1) + normal! o + + " Update these static variables - we need to keep these up-to-date between + " invocations because it's the only way we can detect whether it's a new + " visual mode. We need to know if it's a new visual mode because otherwise + " if there's a single line block in visual line mode and we select it with + " "V", we can't tell whether it's already been selected using Vii. + exe "normal! \" + let s:l0 = line("'<") + let s:l1 = line("'>") + let s:c0 = col("'<") + let s:c1 = col("'>") + normal gv + +endfunction + +function! HandleTextObjectMapping(inner, incbelow, vis, range) + call TextObject(a:inner, a:incbelow, a:vis, a:range, v:count1) +endfunction diff --git a/sources_non_forked/vim-less/ftplugin/less.vim b/sources_non_forked/vim-less/ftplugin/less.vim index d7d22156..b6eaf6a3 100644 --- a/sources_non_forked/vim-less/ftplugin/less.vim +++ b/sources_non_forked/vim-less/ftplugin/less.vim @@ -12,11 +12,13 @@ let b:did_ftplugin = 1 let b:undo_ftplugin = "setl cms< def< inc< inex< ofu< sua<" +setlocal iskeyword+=- setlocal commentstring=//\ %s setlocal define=^\\s*\\%(@mixin\\\|=\\) setlocal includeexpr=substitute(v:fname,'\\%(.*/\\\|^\\)\\zs','_','') setlocal omnifunc=csscomplete#CompleteCSS setlocal suffixesadd=.less +setlocal comments=s1:/*,mb:*,ex:*/ let &l:include = '^\s*@import\s\+\%(url(\)\=["'']\=' diff --git a/sources_non_forked/vim-less/syntax/less.vim b/sources_non_forked/vim-less/syntax/less.vim index 3c9e9529..fa5a247e 100644 --- a/sources_non_forked/vim-less/syntax/less.vim +++ b/sources_non_forked/vim-less/syntax/less.vim @@ -9,9 +9,9 @@ runtime! after/syntax/css/*.vim syn case ignore -syn region lessDefinition transparent matchgroup=cssBraces start='{' end='}' contains=css.*Attr,css.*Prop,cssComment,cssValue.*,cssColor,cssTagName,cssPseudoClass,cssUrl,cssImportant,cssError,cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,lessDefinition,lessComment,lessClassChar,lessVariable,lessMixinChar,lessAmpersandChar,lessFunction,@cssColors fold +syn region lessDefinition transparent matchgroup=cssBraces start='{' end='}' contains=css.*Attr,css.*Prop,cssComment,cssValue.*,cssColor,cssTagName,cssPseudoClass,cssUrl,cssImportant,cssError,cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,lessDefinition,lessComment,lessClassChar,lessVariable,lessMixinChar,lessAmpersandChar,lessFunction,lessNestedSelector,@cssColors fold -syn match lessVariable "@[[:alnum:]_-]\+" contained +syn match lessVariable "@[[:alnum:]_-]\+" contained syn match lessVariable "@[[:alnum:]_-]\+" nextgroup=lessVariableAssignment skipwhite syn match lessVariableAssignment ":" contained nextgroup=lessVariableValue skipwhite syn match lessVariableValue ".*;"me=e-1 contained contains=lessVariable,lessOperator,lessDefault,cssValue.*,@cssColors "me=e-1 means that the last char of the pattern is not highlighted @@ -21,13 +21,33 @@ syn match lessOperator "-" contained syn match lessOperator "/" contained syn match lessOperator "*" contained +syn match lessNestedSelector "[^/]* {"me=e-1 contained contains=cssTagName,cssAttributeSelector,lessAmpersandChar,lessVariable,lessMixinChar,lessFunction,lessNestedProperty +syn match lessNestedProperty "[[:alnum:]]\+:"me=e-1 contained + syn match lessDefault "!default" contained syn match lessMixinChar "\.[[:alnum:]_-]\@=" contained nextgroup=lessClass syn match lessAmpersandChar "&" contained nextgroup=lessClass,cssPseudoClass syn match lessClass "[[:alnum:]_-]\+" contained -syn keyword lessFunction lighten darken saturate desaturate fadein fadeout spin hue saturation lightness containedin=cssDefinition contained +" functions {{{ + +" string functions +syn keyword lessFunction escape e % containedin=cssDefinition contained +" misc functions +syn keyword lessFunction color unit containedin=cssDefinition contained +" math functions +syn keyword lessFunction ceil floor percentage round containedin=cssDefinition contained +" color definition +syn keyword lessFunction rgb rgba argb hsl hsla hsv hsva containedin=cssDefinition contained +" color channel information +syn keyword lessFunction hue saturation lightness red green blue alpha luma containedin=cssDefinition contained +" color operations +syn keyword lessFunction saturate desaturate lighten darken fadein fadeout fade spin mix greyscale contrast containedin=cssDefinition contained +" color blending +syn keyword lessFunction multiply screen overlay softlight hardlight difference exclusion average negation containedin=cssDefinition contained + +" }}} syn match lessComment "//.*$" contains=@Spell @@ -38,7 +58,7 @@ hi def link lessComment Comment hi def link lessFunction Function hi def link lessMixinChar Special hi def link lessAmpersandChar Special +hi def link lessNestedProperty Type hi def link lessClass PreProc let b:current_syntax = "less" - diff --git a/sources_non_forked/vim-markdown/syntax/markdown.vim b/sources_non_forked/vim-markdown/syntax/markdown.vim index bc1563bc..aad30095 100644 --- a/sources_non_forked/vim-markdown/syntax/markdown.vim +++ b/sources_non_forked/vim-markdown/syntax/markdown.vim @@ -7,39 +7,55 @@ if exists("b:current_syntax") finish endif +if !exists('main_syntax') + let main_syntax = 'markdown' +endif + runtime! syntax/html.vim unlet! b:current_syntax +if !exists('g:markdown_fenced_languages') + let g:markdown_fenced_languages = [] +endif +for s:type in map(copy(g:markdown_fenced_languages),'matchstr(v:val,"[^=]*$")') + if s:type =~ '\.' + let b:{matchstr(s:type,'[^.]*')}_subtype = matchstr(s:type,'\.\zs.*') + endif + exe 'syn include @markdownHighlight'.substitute(s:type,'\.','','g').' syntax/'.matchstr(s:type,'[^.]*').'.vim' + unlet! b:current_syntax +endfor +unlet! s:type + syn sync minlines=10 syn case ignore -syn match markdownValid '[<>]\S\@!' +syn match markdownValid '[<>]\c[a-z/$!]\@!' syn match markdownValid '&\%(#\=\w*;\)\@!' -syn match markdownLineStart "^[<@]\@!" nextgroup=@markdownBlock +syn match markdownLineStart "^[<@]\@!" nextgroup=@markdownBlock,htmlSpecialChar syn cluster markdownBlock contains=markdownH1,markdownH2,markdownH3,markdownH4,markdownH5,markdownH6,markdownBlockquote,markdownListMarker,markdownOrderedListMarker,markdownCodeBlock,markdownRule syn cluster markdownInline contains=markdownLineBreak,markdownLinkText,markdownItalic,markdownBold,markdownCode,markdownEscape,@htmlTop,markdownError -syn match markdownH1 "^.\+\n=\+$" contained contains=@markdownInline,markdownHeadingRule -syn match markdownH2 "^.\+\n-\+$" contained contains=@markdownInline,markdownHeadingRule +syn match markdownH1 "^.\+\n=\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink +syn match markdownH2 "^.\+\n-\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink syn match markdownHeadingRule "^[=-]\+$" contained -syn region markdownH1 matchgroup=markdownHeadingDelimiter start="##\@!" end="#*\s*$" keepend oneline contains=@markdownInline contained -syn region markdownH2 matchgroup=markdownHeadingDelimiter start="###\@!" end="#*\s*$" keepend oneline contains=@markdownInline contained -syn region markdownH3 matchgroup=markdownHeadingDelimiter start="####\@!" end="#*\s*$" keepend oneline contains=@markdownInline contained -syn region markdownH4 matchgroup=markdownHeadingDelimiter start="#####\@!" end="#*\s*$" keepend oneline contains=@markdownInline contained -syn region markdownH5 matchgroup=markdownHeadingDelimiter start="######\@!" end="#*\s*$" keepend oneline contains=@markdownInline contained -syn region markdownH6 matchgroup=markdownHeadingDelimiter start="#######\@!" end="#*\s*$" keepend oneline contains=@markdownInline contained +syn region markdownH1 matchgroup=markdownHeadingDelimiter start="##\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained +syn region markdownH2 matchgroup=markdownHeadingDelimiter start="###\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained +syn region markdownH3 matchgroup=markdownHeadingDelimiter start="####\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained +syn region markdownH4 matchgroup=markdownHeadingDelimiter start="#####\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained +syn region markdownH5 matchgroup=markdownHeadingDelimiter start="######\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained +syn region markdownH6 matchgroup=markdownHeadingDelimiter start="#######\@!" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained -syn match markdownBlockquote ">\s" contained nextgroup=@markdownBlock +syn match markdownBlockquote ">\%(\s\|$\)" contained nextgroup=@markdownBlock syn region markdownCodeBlock start=" \|\t" end="$" contained " TODO: real nesting syn match markdownListMarker "\%(\t\| \{0,4\}\)[-*+]\%(\s\+\S\)\@=" contained -syn match markdownOrderedListMarker "\%(\t\| \{0,4}\)\<\d\+\.\%(\s*\S\)\@=" contained +syn match markdownOrderedListMarker "\%(\t\| \{0,4}\)\<\d\+\.\%(\s\+\S\)\@=" contained syn match markdownRule "\* *\* *\*[ *]*$" contained syn match markdownRule "- *- *-[ -]*$" contained @@ -66,7 +82,14 @@ syn region markdownBoldItalic start="\S\@<=\*\*\*\|\*\*\*\S\@=" end="\S\@<=\*\*\ syn region markdownBoldItalic start="\S\@<=___\|___\S\@=" end="\S\@<=___\|___\S\@=" keepend contains=markdownLineStart syn region markdownCode matchgroup=markdownCodeDelimiter start="`" end="`" keepend contains=markdownLineStart syn region markdownCode matchgroup=markdownCodeDelimiter start="`` \=" end=" \=``" keepend contains=markdownLineStart -syn region markdownCode matchgroup=markdownCodeDelimiter start="^\s*\zs```\s*.*$" end="^```\ze\s*$" keepend +syn region markdownCode matchgroup=markdownCodeDelimiter start="^\s*```.*$" end="^\s*```\ze\s*$" keepend + +if main_syntax ==# 'markdown' + for s:type in g:markdown_fenced_languages + exe 'syn region markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' matchgroup=markdownCodeDelimiter start="^\s*```'.matchstr(s:type,'[^=]*').'\>.*$" end="^\s*```\ze\s*$" keepend contains=@markdownHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\.','','g') + endfor + unlet! s:type +endif syn match markdownEscape "\\[][\\`*_{}()#+.!-]" syn match markdownError "\w\@<=_\w\@=" diff --git a/sources_non_forked/vim-powerline/.gitignore b/sources_non_forked/vim-powerline/.gitignore deleted file mode 100644 index 4d6ed1d8..00000000 --- a/sources_non_forked/vim-powerline/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -doc/tags -*.cache diff --git a/sources_non_forked/vim-powerline/README.md b/sources_non_forked/vim-powerline/README.md new file mode 100644 index 00000000..e69de29b diff --git a/sources_non_forked/vim-powerline/README.rst b/sources_non_forked/vim-powerline/README.rst deleted file mode 100644 index 72cd84f2..00000000 --- a/sources_non_forked/vim-powerline/README.rst +++ /dev/null @@ -1,107 +0,0 @@ -================= -Powerline for vim -================= - -:Author: Kim Silkebækken (kim.silkebaekken+vim@gmail.com) -:Source: https://github.com/Lokaltog/vim-powerline -:Version: β - -Introduction ------------- - -Powerline is a utility plugin which allows you to create better-looking, -more functional vim statuslines. See the screenshots below for -a demonstration of the plugin's capabilities. - -It's recommended that you install the plugin using Pathogen_ or Vundle_. -After the plugin is installed update your help tags and see ``:help -Powerline`` for instructions on how to enable and configure the plugin. - -See the `Troubleshooting`_ section below if you're having any issues with -the plugin or the font patcher. - -**Note:** You need a patched font to be able to use the symbols in the -statusline. An experimental Python/fontforge-based font patcher is included -in the ``fontpatcher`` directory. See ``fontpatcher/README.rst`` for usage -instructions. - -.. _Pathogen: https://github.com/tpope/vim-pathogen -.. _Vundle: https://github.com/gmarik/vundle - -Screenshots ------------ - -.. image:: http://i.imgur.com/MsuIB.png - -Troubleshooting ---------------- - -I can't see the fancy symbols, what's wrong? - Make sure that you have ``let g:Powerline_symbols = 'fancy'`` in your - ``vimrc`` file. The settings may be loaded too late if you have this in - ``gvimrc``, so always put this in your ``vimrc``. - - Clear the cache using ``:PowerlineClearCache`` and restart vim. - - Make sure that you've configured gvim or your terminal emulator to use - a patched font. - - Make sure that vim is compiled with the ``--with-features=big`` flag. - -The fancy symbols look a bit blurry or "off"! - Make sure that you have patched all variants of your font (i.e. both the - regular and the bold font files). - -I'm unable to patch my font, what should I do? - Font patching is only known to work on most Linux and OS X machines. If - you have followed the instructions in the fontpatcher README and still - have problems, please submit an issue on GitHub. - - You can download some community-contributed patched fonts from the - `Powerline wiki`_ if you don't want to mess around with the font - patcher. - -The Syntastic/Fugitive statusline flags don't work! - These flags should work without any configuration. If you installed - either plugin after Powerline, you'll have to clear the cache using - ``:PowerlineClearCache`` and restart vim. - -The colors are weird in the default OS X Terminal app! - The default OS X Terminal app is known to have some issues with the - Powerline colors. Please use another terminal emulator. iTerm2 should - work fine. - - The arrows may have the wrong colors if you have changed the "minimum - contrast" slider in the color tab of your OS X settings. - -The statusline has strange characters like ``^B`` in it! - Please add ``set encoding=utf-8`` to your ``vimrc``. - - You may also need to set your ``LANG`` and ``LC_*`` environment - variables to a UTF-8 locale (e.g. ``LANG=en_US.utf8``). Consult your - Linux distro's documentation for information about setting these - variables correctly. - -The statusline has a lot of ``^`` or underline characters in it! - You need to configure the ``fillchars`` setting to disable statusline - fillchars (see ``:h fillchars`` for details). Add this to your - ``vimrc`` to solve this issue:: - - set fillchars+=stl:\ ,stlnc:\ - -The statusline is hidden/only appears in split windows! - Make sure that you have ``set laststatus=2`` in your ``vimrc``. - -I'm using tmux and Powerline looks like crap, what's wrong? - You need to tell tmux that it has 256-color capabilities. Add this to - your ``.tmux.conf`` to solve this issue:: - - set -g default-terminal "screen-256color" - - If you use iTerm2, make sure that you have enabled the setting 'Set - locale variables automatically' in Profiles > Terminal > Environment. - -If you have any other issues and you can't find the answer in the docs, -please submit an issue on GitHub. - -.. _`Powerline wiki`: https://github.com/Lokaltog/vim-powerline/wiki/Patched-fonts diff --git a/sources_non_forked/vim-powerline/autoload/Pl.vim b/sources_non_forked/vim-powerline/autoload/Pl.vim deleted file mode 100644 index c933030d..00000000 --- a/sources_non_forked/vim-powerline/autoload/Pl.vim +++ /dev/null @@ -1,183 +0,0 @@ -" Powerline - The ultimate statusline utility -" -" Author: Kim Silkebækken -" Source repository: https://github.com/Lokaltog/vim-powerline - -" Script variables {{{ - let g:Pl#OLD_STL = '' - let g:Pl#THEME = [] - let g:Pl#THEME_CALLBACKS = [] - let g:Pl#HL = [] - - " Cache revision, this must be incremented whenever the cache format is changed - let s:CACHE_REVISION = 7 -" }}} -" Script initialization {{{ - function! Pl#LoadCache() " {{{ - if filereadable(g:Powerline_cache_file) && g:Powerline_cache_enabled - exec 'source' escape(g:Powerline_cache_file, ' \') - - if ! exists('g:Powerline_cache_revision') || g:Powerline_cache_revision != s:CACHE_REVISION - " Cache revision differs, cache is invalid - unlet! g:Powerline_cache_revision - - return 0 - endif - - " Create highlighting groups - for hi_cmd in g:Pl#HL - exec hi_cmd - endfor - - " Run theme callbacks - for callback in g:Pl#THEME_CALLBACKS - " Substitute {{NEWLINE}} with newlines (strings must be - " stored without newlines characters to avoid vim errors) - exec substitute(callback[0], "{{NEWLINE}}", "\n", 'g') - exec substitute(callback[1], "{{NEWLINE}}", "\n", 'g') - endfor - - return 1 - endif - - return 0 - endfunction " }}} - function! Pl#ClearCache() " {{{ - if filereadable(g:Powerline_cache_file) - " Delete the cache file - call delete(g:Powerline_cache_file) - endif - - echo 'Powerline cache cleared. Please restart vim for the changes to take effect.' - endfunction " }}} - function! Pl#ReloadColorscheme() " {{{ - call Pl#ClearCache() - - " The colorscheme and theme files must be manually sourced because - " vim won't reload previously autoloaded files - " - " This is a bit hackish, but it works - unlet! g:Powerline#Colorschemes#{g:Powerline_colorscheme}#colorscheme - exec "source" split(globpath(&rtp, 'autoload/Powerline/Colorschemes/'. g:Powerline_colorscheme .'.vim', 1), '\n')[0] - - unlet! g:Powerline#Themes#{g:Powerline_theme}#theme - exec "source" split(globpath(&rtp, 'autoload/Powerline/Themes/'. g:Powerline_theme .'.vim', 1), '\n')[0] - - let g:Pl#THEME = [] - - call Pl#Load() - endfunction " }}} - function! Pl#Load() " {{{ - if empty(g:Pl#OLD_STL) - " Store old statusline - let g:Pl#OLD_STL = &statusline - endif - - if ! Pl#LoadCache() - try - " Autoload the theme dict first - let raw_theme = g:Powerline#Themes#{g:Powerline_theme}#theme - catch - echom 'Invalid Powerline theme! Please check your theme and colorscheme settings.' - - return - endtry - - " Create list with parsed statuslines - for buffer_statusline in raw_theme - unlet! mode_statuslines - let mode_statuslines = Pl#Parser#GetStatusline(buffer_statusline.segments) - - if ! empty(buffer_statusline.callback) - " The callback function passes its arguments on to - " Pl#StatuslineCallback along with the normal/current mode - " statusline. - let s:cb_func = "function! PowerlineStatuslineCallback_". buffer_statusline.callback[1] ."(...)\n" - let s:cb_func .= "return Pl#StatuslineCallback(". string(mode_statuslines['n']) .", a:000)\n" - let s:cb_func .= "endfunction" - - " The callback expression should be used to initialize any - " variables that will use the callback function. The - " expression requires a %s which will be replaced by the - " callback function name. - let s:cb_expr = printf(buffer_statusline.callback[2], 'PowerlineStatuslineCallback_'. buffer_statusline.callback[1]) - - exec s:cb_func - exec s:cb_expr - - " Newlines must be substituted with another character - " because vim doesn't like newlines in strings - call add(g:Pl#THEME_CALLBACKS, [substitute(s:cb_func, "\n", "{{NEWLINE}}", 'g'), substitute(s:cb_expr, "\n", "{{NEWLINE}}", 'g')]) - - unlet! s:cb_func s:cb_expr - - continue - endif - - " Store the statuslines for matching specific buffers - call add(g:Pl#THEME, { - \ 'matches': buffer_statusline.matches, - \ 'mode_statuslines': mode_statuslines - \ }) - endfor - - if ! g:Powerline_cache_enabled - " Don't cache anything if caching is disabled or cache file isn't writeable - return - endif - - " Prepare commands and statuslines for caching - let cache = [ - \ 'let g:Powerline_cache_revision = '. string(s:CACHE_REVISION), - \ 'let g:Pl#HL = '. string(g:Pl#HL), - \ 'let g:Pl#THEME = '. string(g:Pl#THEME), - \ 'let g:Pl#THEME_CALLBACKS = '. string(g:Pl#THEME_CALLBACKS), - \ ] - - call writefile(cache, g:Powerline_cache_file) - endif - endfunction " }}} -" }}} -" Statusline updater {{{ - function! Pl#Statusline(statusline, current) " {{{ - let mode = mode() - - if ! a:current - let mode = 'N' " Normal (non-current) - elseif mode =~# '\v(v|V|)' - let mode = 'v' " Visual mode - elseif mode =~# '\v(s|S|)' - let mode = 's' " Select mode - elseif mode =~# '\vi' - let mode = 'i' " Insert mode - elseif mode =~# '\v(R|Rv)' - let mode = 'r' " Replace mode - else - " Fallback to normal mode - let mode = 'n' " Normal (current) - endif - - return g:Pl#THEME[a:statusline].mode_statuslines[mode] - endfunction " }}} - function! Pl#StatuslineCallback(statusline, args) " {{{ - " Replace %1, %2, etc. in the statusline with the callback args - return substitute( - \ a:statusline, - \ '\v\%(\d+)', - \ '\=a:args[submatch(1)]', - \ 'g') - endfunction " }}} - function! Pl#UpdateStatusline(current) " {{{ - if empty(g:Pl#THEME) - " Load statuslines if they aren't loaded yet - call Pl#Load() - endif - - for i in range(0, len(g:Pl#THEME) - 1) - if Pl#Match#Validate(g:Pl#THEME[i]) - " Update window-local statusline - let &l:statusline = '%!Pl#Statusline('. i .','. a:current .')' - endif - endfor - endfunction " }}} -" }}} diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Colorscheme.vim b/sources_non_forked/vim-powerline/autoload/Pl/Colorscheme.vim deleted file mode 100644 index ec15e461..00000000 --- a/sources_non_forked/vim-powerline/autoload/Pl/Colorscheme.vim +++ /dev/null @@ -1,145 +0,0 @@ -function! Pl#Colorscheme#Init(hi) " {{{ - let colorscheme = {} - - for hi in a:hi - " Ensure that the segments are a list - let segments = type(hi[0]) == type('') ? [ hi[0] ] : hi[0] - let mode_hi_dict = hi[1] - - for segment in segments - let colorscheme[segment] = mode_hi_dict - endfor - endfor - - return colorscheme -endfunction " }}} -function! Pl#Colorscheme#Apply(colorscheme, buffer_segments) " {{{ - " Set color parameters for all segments in a:buffer_segments - - " TODO This function should be recursive and work on both segments and groups - " TODO We could probably handle the NS stuff here... - - try - let colorscheme = g:Powerline#Colorschemes#{a:colorscheme}#colorscheme - catch - echom 'Color scheme "'. a:colorscheme .'" doesn''t exist!' - - return - endtry - - let buffer_segments = a:buffer_segments - - " This is a bit complex, I'll walk you through exactly what happens here... - " - " First of all we loop through the buffer_segments, which are the segments that - " this specific buffer will have. - for buffer_segment in buffer_segments - " The buffer_segment consists of a 'matches' list and a 'segments' list. - " The 'matches' list has conditions to limit this statusline to specific buffers/windows. - " The 'segments' list has each segment and segment group for this buffer - for segment in buffer_segment.segments - let type = get(segment, 'type', '') - - if type == 'segment_group' - " We're going to handle segment groups different from single segments. Segment groups - " have child segments which may have their own highlighting (e.g. fileinfo.flags), - " and these child segments may be grouped (e.g. fileinfo.flags.ro) to provide very - " specific highlighting. So here we'll handle all that: - - " Set the default/fallback colors for this group - for i in range(len(segment.variants), 0, -1) - " Check for available highlighting for the main group segment - " - " This works like the segment highlighting below - " TODO Create a function for this - let seg_variants = join(segment.variants[0:i], '.') - - let seg_name = i > 0 ? segment.name .'.'. seg_variants : segment.name - let seg_ns_name = len(segment.ns) > 0 ? segment.ns .':'. seg_name : seg_name - - if has_key(colorscheme, seg_ns_name) - " We have a namespaced highlight group - let segment.colors = colorscheme[seg_ns_name] - break - elseif has_key(colorscheme, seg_name) - " We have a non-namespaced group - let segment.colors = colorscheme[seg_name] - break - endif - endfor - - " The reason why we need to deepcopy the group's segments is that the child segments - " all point to the same base segments and that screws up highlighting if we highlight - " some child segments with different namespaced colors - let segment.segments = deepcopy(segment.segments) - - " Apply colors to each child segment - for child_segment in segment.segments - " Check if this child segment is grouped (e.g. fileinfo.flags.group.subgroup) - " We're going to prioritize the most specific grouping and then work back to the - " most common group (e.g. fileinfo.flags) - - " FIXME We don't have the variants from before because group children aren't run through Pl#Segment#Get - let child_segment.variants = [seg_name] + split(child_segment.name, '\.') - - " Use the parent group's namespace - let child_segment.ns = segment.ns - - for i in range(len(child_segment.variants), 0, -1) - " Check for available highlighting for the main group segment - let child_seg_name = join(child_segment.variants[0:i], '.') - - let child_seg_ns_name = len(child_segment.ns) > 0 ? child_segment.ns .':'. child_seg_name : child_seg_name - - if has_key(colorscheme, child_seg_ns_name) - " We have a namespaced highlight group - let child_segment.colors = colorscheme[child_seg_ns_name] - break - elseif has_key(colorscheme, child_seg_name) - " We have a non-namespaced group - let child_segment.colors = colorscheme[child_seg_name] - break - endif - endfor - endfor - elseif type == 'segment' - for i in range(len(segment.variants), 0, -1) - " Check for available highlighting - " - " This is done in the following manner, using the segment gundo:static_filename.text.buffer as an example: - " - " * Look for the hl group: gundo:static_filename.text.buffer - " * Look for the hl group: static_filename.text.buffer - " * Look for the hl group: gundo:static_filename.text - " * Look for the hl group: static_filename.text - " * Look for the hl group: gundo:static_filename - " * Look for the hl group: static_filename - " * Return the segment without highlighting, causing an error in the parser - let seg_variants = join(segment.variants[0:i], '.') - - let seg_name = i > 0 ? segment.name .'.'. seg_variants : segment.name - let seg_ns_name = len(segment.ns) > 0 ? segment.ns .':'. seg_name : seg_name - - if has_key(colorscheme, seg_ns_name) - " We have a namespaced highlight group - let segment.colors = colorscheme[seg_ns_name] - break - elseif has_key(colorscheme, seg_name) - " We have a non-namespaced group - let segment.colors = colorscheme[seg_name] - break - endif - endfor - endif - - unlet! segment - endfor - endfor - - " Good luck parsing this return value - " - " It's a huge dict with all segments for all buffers with their respective syntax highlighting. - " It will be parsed by the main Powerline code, where all the data will be shortened to a simple - " array consiting of a statusline for each mode, with generated highlighting groups and dividers. - return buffer_segments -endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Hi.vim b/sources_non_forked/vim-powerline/autoload/Pl/Hi.vim deleted file mode 100644 index f6b3eea2..00000000 --- a/sources_non_forked/vim-powerline/autoload/Pl/Hi.vim +++ /dev/null @@ -1,140 +0,0 @@ -" cterm -> gui color dict {{{ -let s:cterm2gui_dict = { - \ 16: 0x000000, 17: 0x00005f, 18: 0x000087, 19: 0x0000af, 20: 0x0000d7, 21: 0x0000ff, - \ 22: 0x005f00, 23: 0x005f5f, 24: 0x005f87, 25: 0x005faf, 26: 0x005fd7, 27: 0x005fff, - \ 28: 0x008700, 29: 0x00875f, 30: 0x008787, 31: 0x0087af, 32: 0x0087d7, 33: 0x0087ff, - \ 34: 0x00af00, 35: 0x00af5f, 36: 0x00af87, 37: 0x00afaf, 38: 0x00afd7, 39: 0x00afff, - \ 40: 0x00d700, 41: 0x00d75f, 42: 0x00d787, 43: 0x00d7af, 44: 0x00d7d7, 45: 0x00d7ff, - \ 46: 0x00ff00, 47: 0x00ff5f, 48: 0x00ff87, 49: 0x00ffaf, 50: 0x00ffd7, 51: 0x00ffff, - \ 52: 0x5f0000, 53: 0x5f005f, 54: 0x5f0087, 55: 0x5f00af, 56: 0x5f00d7, 57: 0x5f00ff, - \ 58: 0x5f5f00, 59: 0x5f5f5f, 60: 0x5f5f87, 61: 0x5f5faf, 62: 0x5f5fd7, 63: 0x5f5fff, - \ 64: 0x5f8700, 65: 0x5f875f, 66: 0x5f8787, 67: 0x5f87af, 68: 0x5f87d7, 69: 0x5f87ff, - \ 70: 0x5faf00, 71: 0x5faf5f, 72: 0x5faf87, 73: 0x5fafaf, 74: 0x5fafd7, 75: 0x5fafff, - \ 76: 0x5fd700, 77: 0x5fd75f, 78: 0x5fd787, 79: 0x5fd7af, 80: 0x5fd7d7, 81: 0x5fd7ff, - \ 82: 0x5fff00, 83: 0x5fff5f, 84: 0x5fff87, 85: 0x5fffaf, 86: 0x5fffd7, 87: 0x5fffff, - \ 88: 0x870000, 89: 0x87005f, 90: 0x870087, 91: 0x8700af, 92: 0x8700d7, 93: 0x8700ff, - \ 94: 0x875f00, 95: 0x875f5f, 96: 0x875f87, 97: 0x875faf, 98: 0x875fd7, 99: 0x875fff, - \ 100: 0x878700, 101: 0x87875f, 102: 0x878787, 103: 0x8787af, 104: 0x8787d7, 105: 0x8787ff, - \ 106: 0x87af00, 107: 0x87af5f, 108: 0x87af87, 109: 0x87afaf, 110: 0x87afd7, 111: 0x87afff, - \ 112: 0x87d700, 113: 0x87d75f, 114: 0x87d787, 115: 0x87d7af, 116: 0x87d7d7, 117: 0x87d7ff, - \ 118: 0x87ff00, 119: 0x87ff5f, 120: 0x87ff87, 121: 0x87ffaf, 122: 0x87ffd7, 123: 0x87ffff, - \ 124: 0xaf0000, 125: 0xaf005f, 126: 0xaf0087, 127: 0xaf00af, 128: 0xaf00d7, 129: 0xaf00ff, - \ 130: 0xaf5f00, 131: 0xaf5f5f, 132: 0xaf5f87, 133: 0xaf5faf, 134: 0xaf5fd7, 135: 0xaf5fff, - \ 136: 0xaf8700, 137: 0xaf875f, 138: 0xaf8787, 139: 0xaf87af, 140: 0xaf87d7, 141: 0xaf87ff, - \ 142: 0xafaf00, 143: 0xafaf5f, 144: 0xafaf87, 145: 0xafafaf, 146: 0xafafd7, 147: 0xafafff, - \ 148: 0xafd700, 149: 0xafd75f, 150: 0xafd787, 151: 0xafd7af, 152: 0xafd7d7, 153: 0xafd7ff, - \ 154: 0xafff00, 155: 0xafff5f, 156: 0xafff87, 157: 0xafffaf, 158: 0xafffd7, 159: 0xafffff, - \ 160: 0xd70000, 161: 0xd7005f, 162: 0xd70087, 163: 0xd700af, 164: 0xd700d7, 165: 0xd700ff, - \ 166: 0xd75f00, 167: 0xd75f5f, 168: 0xd75f87, 169: 0xd75faf, 170: 0xd75fd7, 171: 0xd75fff, - \ 172: 0xd78700, 173: 0xd7875f, 174: 0xd78787, 175: 0xd787af, 176: 0xd787d7, 177: 0xd787ff, - \ 178: 0xd7af00, 179: 0xd7af5f, 180: 0xd7af87, 181: 0xd7afaf, 182: 0xd7afd7, 183: 0xd7afff, - \ 184: 0xd7d700, 185: 0xd7d75f, 186: 0xd7d787, 187: 0xd7d7af, 188: 0xd7d7d7, 189: 0xd7d7ff, - \ 190: 0xd7ff00, 191: 0xd7ff5f, 192: 0xd7ff87, 193: 0xd7ffaf, 194: 0xd7ffd7, 195: 0xd7ffff, - \ 196: 0xff0000, 197: 0xff005f, 198: 0xff0087, 199: 0xff00af, 200: 0xff00d7, 201: 0xff00ff, - \ 202: 0xff5f00, 203: 0xff5f5f, 204: 0xff5f87, 205: 0xff5faf, 206: 0xff5fd7, 207: 0xff5fff, - \ 208: 0xff8700, 209: 0xff875f, 210: 0xff8787, 211: 0xff87af, 212: 0xff87d7, 213: 0xff87ff, - \ 214: 0xffaf00, 215: 0xffaf5f, 216: 0xffaf87, 217: 0xffafaf, 218: 0xffafd7, 219: 0xffafff, - \ 220: 0xffd700, 221: 0xffd75f, 222: 0xffd787, 223: 0xffd7af, 224: 0xffd7d7, 225: 0xffd7ff, - \ 226: 0xffff00, 227: 0xffff5f, 228: 0xffff87, 229: 0xffffaf, 230: 0xffffd7, 231: 0xffffff, - \ 232: 0x080808, 233: 0x121212, 234: 0x1c1c1c, 235: 0x262626, 236: 0x303030, 237: 0x3a3a3a, - \ 238: 0x444444, 239: 0x4e4e4e, 240: 0x585858, 241: 0x626262, 242: 0x6c6c6c, 243: 0x767676, - \ 244: 0x808080, 245: 0x8a8a8a, 246: 0x949494, 247: 0x9e9e9e, 248: 0xa8a8a8, 249: 0xb2b2b2, - \ 250: 0xbcbcbc, 251: 0xc6c6c6, 252: 0xd0d0d0, 253: 0xdadada, 254: 0xe4e4e4, 255: 0xeeeeee -\ } -" }}} -" Allocated color dict {{{ -let s:allocated_colors = { - \ 'NONE': 'NONE', - \ } -" }}} -function! s:Cterm2GUI(cterm) " {{{ - if toupper(a:cterm) == 'NONE' - return 'NONE' - endif - - if ! has_key(s:cterm2gui_dict, a:cterm) - return 0xff0000 - endif - - return s:cterm2gui_dict[a:cterm] -endfunction " }}} -function! Pl#Hi#Segments(segments, mode_colors) " {{{ - let mode_translate = { - \ 'normal': 'n', - \ 'noncurrent': 'N', - \ 'insert': 'i', - \ 'visual': 'v', - \ 'replace': 'r', - \ 'select': 's', - \ } - - let attributes = ['bold', 'italic', 'underline'] - - let segments = a:segments - let mode_hi_dict = {} - - " Mode dict - for [mode, colors] in items(a:mode_colors) - if has_key(mode_translate, mode) - let mode = mode_translate[mode] - endif - - unlet! fg - let fg = s:allocated_colors[colors[0]] - - let hi = { - \ 'cterm': [fg['cterm'], ''], - \ 'gui' : [fg['gui'], ''], - \ 'attr' : [] - \ } - - if exists('colors[1]') - if type(colors[1]) == type([]) - " We don't have a BG color, but we have attributes - let hi.attr = colors[1] - else - " The second parameter is the background color - unlet! bg - let bg = s:allocated_colors[colors[1]] - - let hi.cterm[1] = bg['cterm'] - let hi.gui[1] = bg['gui'] - endif - endif - - if exists('colors[2]') && type(colors[2]) == type([]) - " The third parameter is always an attribute list - let hi.attr = colors[2] - endif - - let mode_hi_dict[mode] = { - \ 'ctermfg': (empty(hi['cterm'][0]) ? '' : (string(hi['cterm'][0]) == 'NONE' ? 'NONE' : hi['cterm'][0])), - \ 'ctermbg': (empty(hi['cterm'][1]) ? '' : (string(hi['cterm'][1]) == 'NONE' ? 'NONE' : hi['cterm'][1])), - \ 'guifg' : (empty(hi['gui'][0]) ? '' : (string(hi['gui'][0]) == 'NONE' ? 'NONE' : hi['gui'][0])), - \ 'guibg' : (empty(hi['gui'][1]) ? '' : (string(hi['gui'][1]) == 'NONE' ? 'NONE' : hi['gui'][1])), - \ 'attr' : (! len(hi['attr']) ? 'NONE' : join(hi['attr'], ',')) - \ } - endfor - - return [segments, mode_hi_dict] -endfunction " }}} -function! Pl#Hi#Allocate(colors) " {{{ - for [key, color] in items(a:colors) - if type(color) == type(0) - " Only terminal color - let cterm = color - let gui = s:Cterm2GUI(color) - elseif type(color) == type([]) && len(color) == 2 - " Terminal and GUI colors - let cterm = color[0] - let gui = color[1] - endif - - let s:allocated_colors[key] = { - \ 'cterm': cterm, - \ 'gui': gui, - \ } - - unlet! color - endfor -endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Match.vim b/sources_non_forked/vim-powerline/autoload/Pl/Match.vim deleted file mode 100644 index b05f5851..00000000 --- a/sources_non_forked/vim-powerline/autoload/Pl/Match.vim +++ /dev/null @@ -1,43 +0,0 @@ -function! Pl#Match#Add(pat, expr) " {{{ - return [a:pat, a:expr] -endfunction " }}} -function! Pl#Match#Any(...) " {{{ - let matches = [] - - for match_name in a:000 - if empty(match_name) - " Skip empty match parameters - continue - endif - - if has_key(g:Powerline#Matches#matches, match_name) - call add(matches, g:Powerline#Matches#matches[match_name]) - endif - - unlet! match_name - endfor - - return ['match', 'any', matches] -endfunction " }}} -function! Pl#Match#Validate(theme) " {{{ - let match = a:theme.matches[1] - - if match == 'none' - return 0 - elseif match == 'any' - let matches = a:theme.matches[2] - - if ! len(matches) - " Empty match array matches everything - return 1 - endif - - for [eval, re] in matches - if match(eval(eval), '\v'. re) != -1 - return 1 - endif - endfor - - return 0 - endif -endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Mod.vim b/sources_non_forked/vim-powerline/autoload/Pl/Mod.vim deleted file mode 100644 index fdfb5718..00000000 --- a/sources_non_forked/vim-powerline/autoload/Pl/Mod.vim +++ /dev/null @@ -1,40 +0,0 @@ -let s:segment_mods = [] - -function! Pl#Mod#AddSegmentMod(action, properties) " {{{ - call add(s:segment_mods, [a:action, a:properties]) -endfunction " }}} -function! Pl#Mod#ApplySegmentMods(theme) " {{{ - let theme = deepcopy(a:theme) - - for mod in s:segment_mods - let [action, properties] = mod - - " We have to loop through the segments instead of using index() because some - " segments are lists! - let target_seg_idx = -1 - - for i in range(0, len(theme) - 1) - unlet! segment - let segment = theme[i] - - if type(segment) == type(properties.target_segment) && segment == properties.target_segment - let target_seg_idx = i - break - endif - endfor - - if action == 'insert_segment' - " Insert segment - if target_seg_idx != -1 - call insert(theme, properties.new_segment, (properties.where == 'before' ? target_seg_idx : target_seg_idx + 1)) - endif - elseif action == 'remove_segment' - " Remove segment - if target_seg_idx != -1 - call remove(theme, target_seg_idx) - endif - endif - endfor - - return theme -endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Parser.vim b/sources_non_forked/vim-powerline/autoload/Pl/Parser.vim deleted file mode 100644 index a6f3428a..00000000 --- a/sources_non_forked/vim-powerline/autoload/Pl/Parser.vim +++ /dev/null @@ -1,371 +0,0 @@ -let g:Pl#Parser#Symbols = { - \ 'compatible': { - \ 'dividers': [ '', [0x2502], '', [0x2502] ] - \ , 'symbols' : { - \ 'BRANCH': 'BR:' - \ , 'RO' : 'RO' - \ , 'FT' : 'FT' - \ , 'LINE' : 'LN' - \ } - \ }, - \ 'unicode': { - \ 'dividers': [ [0x25b6], [0x276f], [0x25c0], [0x276e] ] - \ , 'symbols' : { - \ 'BRANCH': [0x26a1] - \ , 'RO' : [0x2613] - \ , 'FT' : [0x2691] - \ , 'LINE' : [0x204b] - \ }, - \ }, - \ 'fancy': { - \ 'dividers': [ [0x2b80], [0x2b81], [0x2b82], [0x2b83] ] - \ , 'symbols' : { - \ 'BRANCH': [0x2b60] - \ , 'RO' : [0x2b64] - \ , 'FT' : [0x2b62, 0x2b63] - \ , 'LINE' : [0x2b61] - \ } - \ } -\ } - -" Handle symbol overrides -for [s:key, s:value] in items(g:Powerline_symbols_override) - let g:Pl#Parser#Symbols[g:Powerline_symbols].symbols[s:key] = s:value - - unlet! s:key s:value -endfor - -" Handle divider overrides -if len(g:Powerline_dividers_override) == 4 - let g:Pl#Parser#Symbols[g:Powerline_symbols].dividers = g:Powerline_dividers_override -endif - -let s:LEFT_SIDE = 0 -let s:RIGHT_SIDE = 2 - -let s:PADDING = 1 - -let s:EMPTY_SEGMENT = { 'type': 'empty' } - -let s:HARD_DIVIDER = 0 -let s:SOFT_DIVIDER = 1 - -function! Pl#Parser#GetStatusline(segments) " {{{ - let statusline = { - \ 'n': '' - \ , 'N': '' - \ , 'v': '' - \ , 'i': '' - \ , 'r': '' - \ , 's': '' - \ } - - " Run through the different modes and create the statuslines - for mode in keys(statusline) - " Create an empty statusline list - let stl = [] - - call extend(stl, s:ParseSegments(mode, s:LEFT_SIDE, a:segments)) - - let statusline[mode] .= join(stl, '') - endfor - - return statusline -endfunction " }}} -function! Pl#Parser#ParseChars(arg) " {{{ - " Handles symbol arrays which can be either an array of hex values, - " or a string. Will convert the hex array to a string, or return the - " string as-is. - let arg = a:arg - - if type(arg) == type([]) - " Hex array - call map(arg, 'nr2char(v:val)') - - return join(arg, '') - endif - - " Anything else, just return it as it is - return arg -endfunction " }}} -function! s:ParseSegments(mode, side, segments, ...) " {{{ - let mode = a:mode - let side = a:side - let segments = a:segments - - let level = exists('a:1') ? a:1 : 0 - let base_color = exists('a:2') ? a:2 : {} - - let ret = [] - - for i in range(0, len(segments) - 1) - unlet! seg_prev seg_curr seg_next - - " Prepare some resources (fetch previous, current and next segment) - let seg_curr = deepcopy(get(segments, i)) - - " Find previous segment - let seg_prev = s:EMPTY_SEGMENT - - " If we're currently at i = 0 we have to start on 0 or else we will start on the last segment (list[-1]) - let range_start = (i == 0 ? i : i - 1) - for j in range(range_start, 0, -1) - let seg = deepcopy(get(segments, j)) - if get(seg, 'name') ==# 'TRUNCATE' - " Skip truncate segments - continue - endif - - " Look ahead for another segment that's visible in this mode - if index(get(seg, 'modes'), mode) != -1 - " Use this segment - let seg_prev = seg - - break - endif - endfor - - "" Find next segment - let seg_next = s:EMPTY_SEGMENT - - " If we're currently at i = len(segments) - 1 we have to start on i or else we will get an error because the index doesn't exist - let range_start = (i == len(segments) - 1 ? i : i + 1) - for j in range(range_start, len(segments) - 1, 1) - let seg = deepcopy(get(segments, j)) - if get(seg, 'name') ==# 'TRUNCATE' - " Skip truncate segments - continue - endif - - " Look ahead for another segment that's visible in this mode - if index(get(seg, 'modes'), mode) != -1 - " Use this segment - let seg_next = seg - - break - endif - endfor - - if index(get(seg_curr, 'modes', []), mode) == -1 - " The segment is invisible in this mode, skip it - " FIXME When two segments after each other are hidden, a gap appears where the segments would be, this is probably due to segment padding - continue - endif - - " Handle the different segment types - if seg_curr.type == 'segment' - if seg_curr.name ==# 'TRUNCATE' - " Truncate statusline - call add(ret, '%<') - elseif seg_curr.name ==# 'SPLIT' - " Split statusline - - " Switch sides - let side = s:RIGHT_SIDE - - " Handle highlighting - let mode_colors = get(seg_curr.colors, mode, seg_curr.colors['n']) - let hl_group = s:HlCreate(mode_colors) - - " Add segment text - call add(ret, '%#'. hl_group .'#%=') - else - " Add segment text - let text = seg_curr.text - - " Decide on whether to use the group's colors or the segment's colors - let colors = get(seg_curr, 'colors', base_color) - - " Fallback to normal (current) highlighting if we don't have mode-specific highlighting - let mode_colors = get(colors, mode, get(colors, 'n', {})) - - if empty(mode_colors) - echom 'Segment doesn''t have any colors! NS: "'. seg_curr.ns .'" SEG: "'. seg_curr.name .'"' - - continue - endif - - " Check if we're in a group (level > 0) - if level > 0 - " If we're in a group we don't have dividers between - " segments, so we should only pad one side, but only pad - " if the segment doesn't have Pl#Segment#NoPadding() set - let padding_right = (seg_curr.padding && side == s:LEFT_SIDE ? repeat(' ', s:PADDING) : '') - let padding_left = (seg_curr.padding && side == s:RIGHT_SIDE ? repeat(' ', s:PADDING) : '') - - " Check if we lack a bg/fg color for this segment - " If we do, use the bg/fg color from base_color - let base_color_mode = ! has_key(base_color, mode) ? base_color['n'] : base_color[mode] - - for col in ['ctermbg', 'ctermfg', 'guibg', 'guifg'] - if empty(mode_colors[col]) - let mode_colors[col] = base_color_mode[col] - endif - endfor - else - "" If we're outside a group we have dividers and must pad both sides - let padding_left = repeat(' ', s:PADDING) - let padding_right = repeat(' ', s:PADDING) - endif - - " Get main hl group for segment - let hl_group = s:HlCreate(mode_colors) - - " Prepare segment text - let text = '%(%#'. hl_group .'#'. padding_left . text . padding_right . '%)' - - if level == 0 - " Add divider to single segments - let text = s:AddDivider(text, side, mode, colors, seg_prev, seg_curr, seg_next) - endif - - call add(ret, text) - endif - elseif seg_curr.type == 'segment_group' - " Recursively parse segment group - let func_params = [mode, side, seg_curr.segments, level + 1] - - if has_key(seg_curr, 'colors') - " Pass the base colors on to the child segments - call add(func_params, seg_curr.colors) - endif - - " Get segment group string - let text = join(call('s:ParseSegments', func_params), '') - - " Pad on the opposite side of the divider - let padding_right = (side == s:RIGHT_SIDE ? repeat(' ', s:PADDING) : '') - let padding_left = (side == s:LEFT_SIDE ? repeat(' ', s:PADDING) : '') - - let text = s:AddDivider(padding_left . text . padding_right, side, mode, seg_curr.colors, seg_prev, seg_curr, seg_next) - - call add(ret, text) - endif - endfor - - return ret -endfunction " }}} -function! s:HlCreate(hl) " {{{ - " Create a short and unique highlighting group name - " It uses the hex values of all the color properties and an attribute flag at the end - " NONE colors are translated to NN for cterm and NNNNNN for gui colors - let hi_group = printf('Pl%s%s%s%s%s' - \ , (a:hl['ctermfg'] == 'NONE' ? 'NN' : printf('%02x', a:hl['ctermfg'])) - \ , (a:hl['guifg'] == 'NONE' ? 'NNNNNN' : printf('%06x', a:hl['guifg'] )) - \ , (a:hl['ctermbg'] == 'NONE' ? 'NN' : printf('%02x', a:hl['ctermbg'])) - \ , (a:hl['guibg'] == 'NONE' ? 'NNNNNN' : printf('%06x', a:hl['guibg'] )) - \ , substitute(a:hl['attr'], '\v([a-zA-Z])[a-zA-Z]*,?', '\1', 'g') - \ ) - - if ! s:HlExists(hi_group) - let ctermbg = a:hl['ctermbg'] == 'NONE' ? 'NONE' : printf('%d', a:hl['ctermbg']) - if (has('win32') || has('win64')) && !has('gui_running') && ctermbg != 'NONE' && ctermbg > 128 - let ctermbg -= 128 - endif - let hi_cmd = printf('hi %s ctermfg=%s ctermbg=%s cterm=%s guifg=%s guibg=%s gui=%s' - \ , hi_group - \ , a:hl['ctermfg'] == 'NONE' ? 'NONE' : printf('%d', a:hl['ctermfg']) - \ , ctermbg - \ , a:hl['attr'] - \ , (a:hl['guifg'] == 'NONE' ? 'NONE' : printf('#%06x', a:hl['guifg'])) - \ , (a:hl['guibg'] == 'NONE' ? 'NONE' : printf('#%06x', a:hl['guibg'])) - \ , a:hl['attr'] - \ ) - - exec hi_cmd - - " Add command to Pl#HL list for caching - call add(g:Pl#HL, hi_cmd) - endif - - " Return only the highlighting group name - return hi_group -endfunction " }}} -function! s:HlExists(hl) " {{{ - if ! hlexists(a:hl) - return 0 - endif - - redir => hlstatus - silent exec 'hi' a:hl - redir END - - return (hlstatus !~ 'cleared') -endfunction " }}} -function! s:AddDivider(text, side, mode, colors, prev, curr, next) " {{{ - let seg_prev = a:prev - let seg_curr = a:curr - let seg_next = a:next - - " Set default color/type for the divider - let div_colors = get(a:colors, a:mode, a:colors['n']) - let div_type = s:SOFT_DIVIDER - - " Define segment to compare - let cmp_seg = a:side == s:LEFT_SIDE ? seg_next : seg_prev - - let cmp_all_colors = get(cmp_seg, 'colors', {}) - let cmp_colors = get(cmp_all_colors, a:mode, get(cmp_all_colors, 'n', {})) - - if ! empty(cmp_colors) - " Compare the highlighting groups - " - " If the background color for cterm is equal, use soft divider with the current segment's highlighting - " If not, use hard divider with a new highlighting group - " - " Note that if the previous/next segment is the split, a hard divider is always used - if get(div_colors, 'ctermbg') != get(cmp_colors, 'ctermbg') || get(seg_next, 'name') ==# 'SPLIT' || get(seg_prev, 'name') ==# 'SPLIT' - let div_type = s:HARD_DIVIDER - - " Create new highlighting group - if div_colors['attr'] =~ 'reverse' && cmp_colors['attr'] =~ 'reverse' - " Use FG = CURRENT FG, BG = CMP FG - let div_colors['ctermbg'] = get(cmp_colors, 'ctermfg') - let div_colors['guibg'] = get(cmp_colors, 'guifg') - - let div_colors['attr'] = div_colors['attr'] =~ 'bold' ? 'bold' : 'NONE' - elseif div_colors['attr'] =~ 'reverse' - " Use FG = CURRENT FG, BG = CMP BG - let div_colors['ctermbg'] = get(cmp_colors, 'ctermbg') - let div_colors['guibg'] = get(cmp_colors, 'guibg') - - let div_colors['attr'] = div_colors['attr'] =~ 'bold' ? 'bold' : 'NONE' - elseif cmp_colors['attr'] =~ 'reverse' - " Use FG = CMP FG, BG = CURRENT BG : reversed - let div_colors['ctermfg'] = get(cmp_colors, 'ctermfg') - let div_colors['guifg'] = get(cmp_colors, 'guifg') - - let div_colors['attr'] = 'reverse' - - else - " Use FG = CURRENT BG, BG = CMP BG - let div_colors['ctermfg'] = get(div_colors, 'ctermbg') - let div_colors['guifg'] = get(div_colors, 'guibg') - - let div_colors['ctermbg'] = get(cmp_colors, 'ctermbg') - let div_colors['guibg'] = get(cmp_colors, 'guibg') - - let div_colors['attr'] = 'NONE' - endif - endif - endif - - " Prepare divider - let divider_raw = deepcopy(g:Pl#Parser#Symbols[g:Powerline_symbols].dividers[a:side + div_type]) - let divider = Pl#Parser#ParseChars(divider_raw) - - " Don't add dividers for segments adjacent to split (unless it's a hard divider) - if ((get(seg_next, 'name') ==# 'SPLIT' || get(seg_prev, 'name') ==# 'SPLIT') && div_type != s:HARD_DIVIDER) - return '' - endif - - if a:side == s:LEFT_SIDE - " Left side - " Divider to the right - return printf('%%(%s%%#%s#%s%%)', a:text, s:HlCreate(div_colors), divider) - else - " Right side - " Divider to the left - return printf('%%(%%#%s#%s%s%%)', s:HlCreate(div_colors), divider, a:text) - endif -endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Segment.vim b/sources_non_forked/vim-powerline/autoload/Pl/Segment.vim deleted file mode 100644 index bb09438c..00000000 --- a/sources_non_forked/vim-powerline/autoload/Pl/Segment.vim +++ /dev/null @@ -1,188 +0,0 @@ -let s:default_modes = ['n', 'N', 'v', 'i', 'r', 's'] - -function! s:CheckConditions(params) " {{{ - " Check conditions for a segment/group - " Integer parameters are always conditions - for param in a:params - if type(param) == type(0) && param == 0 - " Break here if it's an integer parameter and it's false (0) - return 0 - endif - unlet! param - endfor - - return 1 -endfunction " }}} -function! Pl#Segment#Create(name, ...) " {{{ - " Check condition parameters - if ! s:CheckConditions(a:000) - return {} - endif - - let name = a:name - let modes = s:default_modes - let padding = 1 - let segments = [] - - for param in a:000 - " Lookup modes for this segment/group - if type(param) == type([]) && param[0] == 'modes' - let modes = param[1] - elseif type(param) == type([]) && param[0] == 'nopadding' - let padding = 0 - elseif type(a:1) == type([]) && a:1[0] == 'segment' - call add(segments, param[1]) - endif - - unlet! param - endfor - - if type(a:1) == type([]) && a:1[0] == 'segment' - " This is a segment group - return ['segment_group', { - \ 'type': 'segment_group' - \ , 'name': name - \ , 'segments': segments - \ , 'modes': modes - \ , 'padding': padding - \ }] - else - " This is a single segment - let text = a:1 - - " Search/replace symbols - for [key, symbol] in items(g:Pl#Parser#Symbols[g:Powerline_symbols].symbols) - let text = substitute( - \ text, - \ '\v\$('. key .')', - \ '\=Pl#Parser#ParseChars(g:Pl#Parser#Symbols[g:Powerline_symbols].symbols[submatch(1)])', - \ 'g') - - unlet! key symbol - endfor - - return ['segment', { - \ 'type': 'segment' - \ , 'name': name - \ , 'text': text - \ , 'modes': modes - \ , 'padding': padding - \ }] - endif - -endfunction " }}} -function! Pl#Segment#Init(params) " {{{ - " Check condition parameters - if ! s:CheckConditions(a:params) - return {} - endif - - let segments = {} - let ns = '' - - for param in a:params - if type(param) == type('') - " String parameters is the namespace - let ns = param - elseif type(param) == type([]) - " The data dict is in param[1] - " By default we don't have a namespace for the segment - let segment = param[1] - - if ! empty(ns) - " Update segment so that it includes the namespace - " Add the namespace to the segment dict key - let segment.ns = ns - let segment.name = join([segment.ns, segment.name], ':') - endif - - let key = segment.name - - let segments[key] = segment - endif - - unlet! param - endfor - - return segments -endfunction " }}} -function! Pl#Segment#Modes(modes) " {{{ - " Handle modes for both segments and groups - let modes = split(a:modes, '\zs') - - if modes[0] == '!' - " Filter modes (e.g. "!nr" will ignore the segment in normal and replace modes) - let modes = filter(deepcopy(s:default_modes), 'v:val !~# "['. join(modes[1:]) .']"') - endif - - return ['modes', modes] -endfunction " }}} -function! Pl#Segment#NoPadding() " {{{ - return ['nopadding'] -endfunction " }}} -function! Pl#Segment#Split(...) " {{{ - return a:0 ? a:1 .':SPLIT' : 'SPLIT' -endfunction " }}} -function! Pl#Segment#Truncate() " {{{ - return 'TRUNCATE' -endfunction " }}} -function! Pl#Segment#Get(name) " {{{ - " Return a segment data dict - let args = [] - - " Check for printf segments (lists) - if type(a:name) == type([]) - " We're dealing with a segment with printf arguments - let seg_orig_name = a:name[0] - let args = a:name[1:] - else - let seg_orig_name = a:name - endif - - " Fetch namespace and variants for storing in the segment dict - let seg_ns = '' - let seg_variants = [] - - " Retrieve color scheme variants - let seg_name_split = split(seg_orig_name, '\v\.') - if len(seg_name_split) > 1 - let seg_variants = seg_name_split[1:] - endif - - " Retrieve segment name and namespace - " Use the first piece of the split string, we can't have variants in the final segment name - let seg_name_split = split(seg_name_split[0], '\v:') - let seg_name = seg_name_split[0] - - if len(seg_name_split) > 1 - let seg_ns = seg_name_split[0] - let seg_name = seg_name_split[-1] - endif - - try - " If we have a namespace, try to use the namespaced segment first (i.e. search for the segment in the namespaced file first) - let return_segment = deepcopy(g:Powerline#Segments#{seg_ns}#segments[seg_ns .':'. seg_name]) - catch - try - " We didn't find a namespaced segment, fall back to common segments - let return_segment = deepcopy(g:Powerline#Segments#segments[seg_name]) - catch - " Didn't find the segment among the common segments either, just skip it - return {} - endtry - endtry - - if len(args) && has_key(return_segment, 'text') - " Handle segment printf arguments - " printf doesn't accept lists as its second argument, so we have to work around that - let return_segment.text = call('printf', [ return_segment.text ] + args) - endif - - " Assign namespace, name and variants - let return_segment.ns = seg_ns - let return_segment.name = seg_name - let return_segment.orig_name = seg_orig_name - let return_segment.variants = seg_variants - - return return_segment -endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Theme.vim b/sources_non_forked/vim-powerline/autoload/Pl/Theme.vim deleted file mode 100644 index da1581e2..00000000 --- a/sources_non_forked/vim-powerline/autoload/Pl/Theme.vim +++ /dev/null @@ -1,100 +0,0 @@ -function! Pl#Theme#Create(...) " {{{ - let buffer_segments = [] - - for buffer_segment in a:000 - " Remove empty segments (e.g. 'Pl#Theme#Function's) - if empty(buffer_segment) - continue - endif - - call add(buffer_segments, buffer_segment) - endfor - - let buffer_segments = Pl#Colorscheme#Apply(g:Powerline_colorscheme, buffer_segments) - - return buffer_segments -endfunction " }}} -function! Pl#Theme#Callback(name, expr) " {{{ - return ['callback', a:name, a:expr] -endfunction " }}} -function! Pl#Theme#Buffer(ns, ...) " {{{ - let segments = [] - let ns = ! empty(a:ns) ? a:ns .':' : '' - - " Match namespace parameter by default - let matches = Pl#Match#Any(a:ns) - let callback = [] - - let args = a:000 - let args = Pl#Mod#ApplySegmentMods(args) - - " Fetch segment data dicts - for item in args - if type(item) == type([]) - if item[0] == 'match' - " Match item, overrides default namespace match - let matches = item - - unlet! item - continue - elseif item[0] == 'callback' - " Store the item as a callback expression - let matches = ['match', 'none'] - let callback = [a:ns, item[1], item[2]] - - unlet! item - continue - endif - - " printf segment, append ns to first item in list - let item[0] = ns . item[0] - else - let item = ns . item - endif - - let segment = Pl#Segment#Get(item) - - if ! empty(segment) - " Skip empty (possible disabled) segments - call add(segments, segment) - endif - - unlet! item - endfor - - return { - \ 'matches': matches - \ , 'callback': callback - \ , 'segments': segments - \ } -endfunction " }}} -function! Pl#Theme#InsertSegment(new_segment, where, target_segment) " {{{ - " It's very important to NOT refer to the theme dict until everything's loaded! - " - " Because these functions are called from the vimrc, we need to put the - " actions in a list which will be parsed later. - " - " These functions don't accept a name parameter, because they work on the - " currently selected theme (will change any selected theme) - call Pl#Mod#AddSegmentMod('insert_segment', { - \ 'new_segment': a:new_segment, - \ 'where': a:where, - \ 'target_segment': a:target_segment - \ }) -endfunction " }}} -function! Pl#Theme#RemoveSegment(target_segment) " {{{ - " It's very important to NOT refer to the theme dict until everything's loaded! - " - " Because these functions are called from the vimrc, we need to put the - " actions in a list which will be parsed later. - " - " These functions don't accept a name parameter, because they work on the - " currently selected theme (will change any selected theme) - call Pl#Mod#AddSegmentMod('remove_segment', { - \ 'target_segment': a:target_segment - \ }) -endfunction " }}} -function! Pl#Theme#ReplaceSegment(old_segment, new_segment) " {{{ - call Pl#Theme#InsertSegment(a:new_segment, 'after', a:old_segment) - call Pl#Theme#RemoveSegment(a:old_segment) -endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/default.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/default.vim deleted file mode 100644 index 4d4c7fa8..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/default.vim +++ /dev/null @@ -1,166 +0,0 @@ -call Pl#Hi#Allocate({ - \ 'black' : 16, - \ 'white' : 231, - \ - \ 'darkestgreen' : 22, - \ 'darkgreen' : 28, - \ 'mediumgreen' : 70, - \ 'brightgreen' : 148, - \ - \ 'darkestcyan' : 23, - \ 'mediumcyan' : 117, - \ - \ 'darkestblue' : 24, - \ 'darkblue' : 31, - \ - \ 'darkestred' : 52, - \ 'darkred' : 88, - \ 'mediumred' : 124, - \ 'brightred' : 160, - \ 'brightestred' : 196, - \ - \ 'darkestpurple' : 55, - \ 'mediumpurple' : 98, - \ 'brightpurple' : 189, - \ - \ 'brightorange' : 208, - \ 'brightestorange': 214, - \ - \ 'gray0' : 233, - \ 'gray1' : 235, - \ 'gray2' : 236, - \ 'gray3' : 239, - \ 'gray4' : 240, - \ 'gray5' : 241, - \ 'gray6' : 244, - \ 'gray7' : 245, - \ 'gray8' : 247, - \ 'gray9' : 250, - \ 'gray10' : 252, - \ }) - -let g:Powerline#Colorschemes#default#colorscheme = Pl#Colorscheme#Init([ - \ Pl#Hi#Segments(['SPLIT'], { - \ 'n': ['white', 'gray2'], - \ 'N': ['white', 'gray0'], - \ 'i': ['white', 'darkestblue'], - \ }), - \ - \ Pl#Hi#Segments(['mode_indicator'], { - \ 'n': ['darkestgreen', 'brightgreen', ['bold']], - \ 'i': ['darkestcyan', 'white', ['bold']], - \ 'v': ['darkred', 'brightorange', ['bold']], - \ 'r': ['white', 'brightred', ['bold']], - \ 's': ['white', 'gray5', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['branch', 'scrollpercent', 'raw', 'filesize'], { - \ 'n': ['gray9', 'gray4'], - \ 'N': ['gray4', 'gray1'], - \ 'i': ['mediumcyan', 'darkblue'], - \ }), - \ - \ Pl#Hi#Segments(['fileinfo', 'filename'], { - \ 'n': ['white', 'gray4', ['bold']], - \ 'N': ['gray7', 'gray0', ['bold']], - \ 'i': ['white', 'darkblue', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['fileinfo.filepath'], { - \ 'n': ['gray10'], - \ 'N': ['gray5'], - \ 'i': ['mediumcyan'], - \ }), - \ - \ Pl#Hi#Segments(['static_str'], { - \ 'n': ['white', 'gray4'], - \ 'N': ['gray7', 'gray1'], - \ 'i': ['white', 'darkblue'], - \ }), - \ - \ Pl#Hi#Segments(['fileinfo.flags'], { - \ 'n': ['brightestred', ['bold']], - \ 'N': ['darkred'], - \ 'i': ['brightestred', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['currenttag', 'fullcurrenttag', 'fileformat', 'fileencoding', 'pwd', 'filetype', 'rvm:string', 'rvm:statusline', 'virtualenv:statusline', 'charcode', 'currhigroup'], { - \ 'n': ['gray8', 'gray2'], - \ 'i': ['mediumcyan', 'darkestblue'], - \ }), - \ - \ Pl#Hi#Segments(['lineinfo'], { - \ 'n': ['gray2', 'gray10', ['bold']], - \ 'N': ['gray7', 'gray1', ['bold']], - \ 'i': ['darkestcyan', 'mediumcyan', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['errors'], { - \ 'n': ['brightestorange', 'gray2', ['bold']], - \ 'i': ['brightestorange', 'darkestblue', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['lineinfo.line.tot'], { - \ 'n': ['gray6'], - \ 'N': ['gray5'], - \ 'i': ['darkestcyan'], - \ }), - \ - \ Pl#Hi#Segments(['paste_indicator', 'ws_marker'], { - \ 'n': ['white', 'brightred', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['gundo:static_str.name', 'command_t:static_str.name'], { - \ 'n': ['white', 'mediumred', ['bold']], - \ 'N': ['brightred', 'darkestred', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['gundo:static_str.buffer', 'command_t:raw.line'], { - \ 'n': ['white', 'darkred'], - \ 'N': ['brightred', 'darkestred'], - \ }), - \ - \ Pl#Hi#Segments(['gundo:SPLIT', 'command_t:SPLIT'], { - \ 'n': ['white', 'darkred'], - \ 'N': ['white', 'darkestred'], - \ }), - \ - \ Pl#Hi#Segments(['lustyexplorer:static_str.name', 'minibufexplorer:static_str.name', 'nerdtree:raw.name', 'tagbar:static_str.name'], { - \ 'n': ['white', 'mediumgreen', ['bold']], - \ 'N': ['mediumgreen', 'darkestgreen', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['lustyexplorer:static_str.buffer', 'tagbar:static_str.buffer'], { - \ 'n': ['brightgreen', 'darkgreen'], - \ 'N': ['mediumgreen', 'darkestgreen'], - \ }), - \ - \ Pl#Hi#Segments(['lustyexplorer:SPLIT', 'minibufexplorer:SPLIT', 'nerdtree:SPLIT', 'tagbar:SPLIT'], { - \ 'n': ['white', 'darkgreen'], - \ 'N': ['white', 'darkestgreen'], - \ }), - \ - \ Pl#Hi#Segments(['ctrlp:focus', 'ctrlp:byfname'], { - \ 'n': ['brightpurple', 'darkestpurple'], - \ }), - \ - \ Pl#Hi#Segments(['ctrlp:prev', 'ctrlp:next', 'ctrlp:pwd'], { - \ 'n': ['white', 'mediumpurple'], - \ }), - \ - \ Pl#Hi#Segments(['ctrlp:item'], { - \ 'n': ['darkestpurple', 'white', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['ctrlp:marked'], { - \ 'n': ['brightestred', 'darkestpurple', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['ctrlp:count'], { - \ 'n': ['darkestpurple', 'white'], - \ }), - \ - \ Pl#Hi#Segments(['ctrlp:SPLIT'], { - \ 'n': ['white', 'darkestpurple'], - \ }), - \ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/skwp.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/skwp.vim deleted file mode 100644 index 798caa44..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/skwp.vim +++ /dev/null @@ -1,192 +0,0 @@ -" This theme is based on Solarized-dark colors, combined -" with Powerline native colors -call Pl#Hi#Allocate({ - \ 'black' : 16, - \ 'white' : 231, - \ - \ 'darkestgreen' : 22, - \ 'darkgreen' : 28, - \ 'mediumgreen' : 70, - \ 'brightgreen' : 148, - \ - \ 'darkestcyan' : 23, - \ 'mediumcyan' : 117, - \ - \ 'darkestblue' : 24, - \ 'darkblue' : 31, - \ - \ 'darkestred' : 52, - \ 'darkred' : 88, - \ 'mediumred' : 124, - \ 'brightred' : 160, - \ 'brightestred' : 196, - \ - \ 'darkestpurple' : 55, - \ 'mediumpurple' : 98, - \ 'brightpurple' : 189, - \ - \ 'brightorange' : 208, - \ 'brightestorange': 214, - \ - \ 'gray0' : 233, - \ 'gray1' : 235, - \ 'gray2' : 236, - \ 'gray3' : 239, - \ 'gray4' : 240, - \ 'gray5' : 241, - \ 'gray6' : 244, - \ 'gray7' : 245, - \ 'gray8' : 247, - \ 'gray9' : 250, - \ 'gray10' : 252, - \ - \ 'base00' : [241, 0x657b83], - \ 'base01' : [240, 0x586e75], - \ 'base02' : [0, 0x073642], - \ 'base03' : [234, 0x002b36], - \ 'base0' : [244, 0x839496], - \ 'base1' : [245, 0x93a1a1], - \ 'base2' : [254, 0xeee8d5], - \ 'base3' : [230, 0xfdf6e3], - \ 'yellow' : [136, 0xb58900], - \ 'orange' : [166, 0xcb4b16], - \ 'red' : [160, 0xdc322f], - \ 'magenta' : [125, 0xd33682], - \ 'violet' : [61, 0x6c71c4], - \ 'blue' : [33, 0x268bd2], - \ 'cyan' : [37, 0x2aa198], - \ 'green' : [64, 0x859900], - \ }) - -let g:Powerline#Colorschemes#skwp#colorscheme = Pl#Colorscheme#Init([ - \ Pl#Hi#Segments(['SPLIT'], { - \ 'n': ['white', 'base02'], - \ 'N': ['white', 'base02'], - \ }), - \ - \ Pl#Hi#Segments(['mode_indicator'], { - \ 'n': ['darkestgreen', 'brightgreen', ['bold']], - \ 'i': ['darkestcyan', 'white', ['bold']], - \ 'v': ['red', 'brightorange', ['bold']], - \ 'r': ['white', 'violet', ['bold']], - \ 's': ['white', 'gray5', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['branch', 'raw', 'filesize'], { - \ 'n': ['base03', 'blue'], - \ 'N': ['gray5', 'base03'], - \ }), - \ - \ Pl#Hi#Segments(['scrollpercent'], { - \ 'n': ['gray7', 'gray2'], - \ 'N': ['base2', 'base02'], - \ }), - \ - \ Pl#Hi#Segments(['fileinfo', 'filename', 'filepath'], { - \ 'n': ['base2', 'darkestblue', ['bold']], - \ 'N': ['base1', 'base02', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['fileinfo.filepath'], { - \ 'n': ['gray10'], - \ 'N': ['gray5'], - \ 'i': ['mediumcyan'], - \ }), - \ - \ Pl#Hi#Segments(['static_str'], { - \ 'n': ['base3', 'violet'], - \ 'N': ['base1', 'base02'], - \ 'i': ['white', 'base02'], - \ }), - \ - \ Pl#Hi#Segments(['fileinfo.flags'], { - \ 'n': ['base03', ['bold']], - \ 'N': ['gray5'], - \ 'i': ['base03', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['currenttag', 'fullcurrenttag', 'fileformat', 'fileencoding', 'pwd', 'filetype', 'rvm:string', 'rvm:statusline', 'virtualenv:statusline', 'charcode', 'currhigroup'], { - \ 'n': ['gray5', 'gray2'], - \ 'i': ['mediumcyan', 'base02'], - \ }), - \ - \ Pl#Hi#Segments(['lineinfo'], { - \ 'n': ['gray2', 'gray10', ['bold']], - \ 'N': ['gray7', 'gray1', ['bold']], - \ 'i': ['darkestcyan', 'mediumcyan', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['errors'], { - \ 'n': ['orange', 'base02', ['bold']], - \ 'N': ['gray5', 'base03', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['lineinfo.line.tot'], { - \ 'n': ['gray6'], - \ 'N': ['gray5'], - \ 'i': ['darkestcyan'], - \ }), - \ - \ Pl#Hi#Segments(['paste_indicator', 'ws_marker'], { - \ 'n': ['base3', 'red', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['gundo:static_str.name', 'command_t:static_str.name'], { - \ 'n': ['base3', 'darkblue', ['bold']], - \ 'N': ['base1', 'base03', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['gundo:static_str.buffer', 'command_t:raw.line'], { - \ 'n': ['white', 'base02'], - \ 'N': ['gray5', 'base02'], - \ }), - \ - \ Pl#Hi#Segments(['gundo:SPLIT', 'command_t:SPLIT'], { - \ 'n': ['white', 'base02'], - \ 'N': ['white', 'base02'], - \ }), - \ - \ Pl#Hi#Segments(['lustyexplorer:static_str.name', 'minibufexplorer:static_str.name', 'nerdtree:raw.name', 'tagbar:static_str.name'], { - \ 'n': ['gray10', 'darkestblue', ['bold']], - \ 'N': ['gray3', 'base02', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['lustyexplorer:static_str.buffer', 'tagbar:static_str.buffer'], { - \ 'n': ['base3', 'blue'], - \ 'N': ['gray5', 'base02'], - \ }), - \ - \ Pl#Hi#Segments(['lustyexplorer:SPLIT', 'minibufexplorer:SPLIT', 'nerdtree:SPLIT', 'tagbar:SPLIT'], { - \ 'n': ['gray3', 'base02'], - \ 'N': ['gray3', 'base02'], - \ }), - \ - \ Pl#Hi#Segments(['ctrlp:focus', 'ctrlp:byfname'], { - \ 'n': ['green', 'base03'], - \ }), - \ - \ Pl#Hi#Segments(['ctrlp:prev', 'ctrlp:next', 'ctrlp:pwd'], { - \ 'n': ['green', 'base02'], - \ }), - \ - \ Pl#Hi#Segments(['ctrlp:item'], { - \ 'n': ['base2', 'darkestblue', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['ctrlp:marked'], { - \ 'n': ['brightgreen', 'base03', ['bold']], - \ }), - \ - \ Pl#Hi#Segments(['ctrlp:count'], { - \ 'n': ['base0', 'base03'], - \ }), - \ - \ Pl#Hi#Segments(['ctrlp:SPLIT'], { - \ 'n': ['white', 'base03'], - \ }), - \ - \ Pl#Hi#Segments(['status'], { - \ 'n': ['green', 'base02'], - \ 'N': ['gray5', 'base02'], - \ }), -\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Functions.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Functions.vim deleted file mode 100644 index 26db9b36..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Functions.vim +++ /dev/null @@ -1,141 +0,0 @@ -" Recalculate the trailing whitespace warning when idle, and after saving -autocmd CursorHold,BufWritePost,InsertLeave * unlet! b:statusline_trailing_space_warning - -function! Powerline#Functions#GetFilepath() " {{{ - " Recalculate the filepath when cwd changes. - let cwd = getcwd() - if exists("b:Powerline_cwd") && cwd != b:Powerline_cwd - unlet! b:Powerline_filepath - endif - let b:Powerline_cwd = cwd - - if exists('b:Powerline_filepath') - return b:Powerline_filepath - endif - - let dirsep = has('win32') && ! &shellslash ? '\' : '/' - let filepath = expand('%:p') - - if empty(filepath) - return '' - endif - - let ret = '' - - if g:Powerline_stl_path_style == 'short' - " Display a short path where the first directory is displayed with its - " full name, and the subsequent directories are shortened to their - " first letter, i.e. "/home/user/foo/foo/bar/baz.vim" becomes - " "~/foo/f/b/baz.vim" - " - " This displays the shortest possible path, relative to ~ or the - " current directory. - let mod = (exists('+acd') && &acd) ? ':~:h' : ':~:.:h' - let fpath = split(fnamemodify(filepath, mod), dirsep) - let fpath_shortparts = map(fpath[1:], 'v:val[0]') - let ret = join(extend([fpath[0]], fpath_shortparts), dirsep) . dirsep - elseif g:Powerline_stl_path_style == 'relative' - " Display a relative path, similar to the %f statusline item - let ret = fnamemodify(filepath, ':~:.:h') . dirsep - elseif g:Powerline_stl_path_style == 'full' - " Display the full path, similar to the %F statusline item - let ret = fnamemodify(filepath, ':h') . dirsep - endif - - if ret == ('.' . dirsep) - let ret = '' - endif - - let b:Powerline_filepath = ret - return ret -endfunction " }}} -function! Powerline#Functions#GetShortPath(threshold) " {{{ - let fullpath = split(substitute(expand('%:p:h'), $HOME, '~', 'g'), '/') - - if len(fullpath) > a:threshold - let fullpath = [fullpath[0], '…'] + fullpath[-a:threshold + 1 :] - endif - - return join(fullpath, '/') -endfunction " }}} -function! Powerline#Functions#GetMode() " {{{ - let mode = mode() - - if mode ==# 'v' - let mode = get(g:, "Powerline_mode_v", "VISUAL") - elseif mode ==# 'V' - let mode = get(g:, "Powerline_mode_V", "V⋅LINE") - elseif mode ==# '' - let mode = get(g:, "Powerline_mode_cv", "V⋅BLOCK") - elseif mode ==# 's' - let mode = get(g:, "Powerline_mode_s", "SELECT") - elseif mode ==# 'S' - let mode = get(g:, "Powerline_mode_S", "S⋅LINE") - elseif mode ==# '' - let mode = get(g:, "Powerline_mode_cs", "S⋅BLOCK") - elseif mode =~# '\vi' - let mode = get(g:, "Powerline_mode_i", "INSERT") - elseif mode =~# '\v(R|Rv)' - let mode = get(g:, "Powerline_mode_R", "REPLACE") - else - " Fallback to normal mode - let mode = get(g:, "Powerline_mode_n", "NORMAL") - endif - - return mode -endfunction " }}} -function! Powerline#Functions#GetFilesize() " {{{ - let bytes = getfsize(expand("%:p")) - - if bytes <= 0 - return '' - endif - - if bytes < 1024 - return bytes . 'B' - else - return (bytes / 1024) . 'kB' - endif -endfunction "}}} -function! Powerline#Functions#GetCharCode() " {{{ - " Get the output of :ascii - redir => ascii - silent! ascii - redir END - - if match(ascii, 'NUL') != -1 - return 'NUL' - endif - - " Zero pad hex values - let nrformat = '0x%02x' - - let encoding = (&fenc == '' ? &enc : &fenc) - - if encoding == 'utf-8' - " Zero pad with 4 zeroes in unicode files - let nrformat = '0x%04x' - endif - - " Get the character and the numeric value from the return value of :ascii - " This matches the two first pieces of the return value, e.g. - " " 70" => char: 'F', nr: '70' - let [str, char, nr; rest] = matchlist(ascii, '\v\<(.{-1,})\>\s*([0-9]+)') - - " Format the numeric value - let nr = printf(nrformat, nr) - - return "'". char ."' ". nr -endfunction "}}} -function! Powerline#Functions#GetWSMarker() " {{{ - " Return '...' if trailing white space is detected - " Return '' otherwise - if ! exists("b:statusline_trailing_space_warning") - if search('\s$', 'nw') != 0 - let b:statusline_trailing_space_warning = ' … ' - else - let b:statusline_trailing_space_warning = '' - endif - endif - return b:statusline_trailing_space_warning -endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Functions/ft_man.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Functions/ft_man.vim deleted file mode 100644 index 29135e43..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Functions/ft_man.vim +++ /dev/null @@ -1,12 +0,0 @@ -function! Powerline#Functions#ft_man#GetName() " {{{ - let matches = matchlist(getline(1), '\v^([a-zA-Z_\.\-]+)\((\d+)\)') - - if ! len(matches) - return 'n/a' - endif - - let file = tolower(matches[1]) - let num = matches[2] - - return file -endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Functions/fugitive.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Functions/fugitive.vim deleted file mode 100644 index bb001315..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Functions/fugitive.vim +++ /dev/null @@ -1,7 +0,0 @@ -function! Powerline#Functions#fugitive#GetBranch(symbol) " {{{ - let ret = fugitive#statusline() - - let ret = substitute(ret, '\c\v\[?GIT\(([a-z0-9\-_\./:]+)\)\]?', a:symbol .' \1', 'g') - - return ret -endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Functions/hgrev.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Functions/hgrev.vim deleted file mode 100644 index 61d94adf..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Functions/hgrev.vim +++ /dev/null @@ -1,17 +0,0 @@ -function! Powerline#Functions#hgrev#Status(symbol) " {{{ - if ! exists('*HGRev') - " HGRev hasn't been loaded yet - return '' - endif - if !exists("b:statusline_hg_status") - silent execute "RefreshMercurialRev" - endif - let b:statusline_hg_status=HGRev() - if b:statusline_hg_status != '-' - let ret = "\u26A1". '' . substitute(b:statusline_hg_status, '^[^ ]*', '\1', 'g') - let ret=substitute(ret,' M$','+','g') - else - let ret='' - endif - return ret -endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Functions/syntastic.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Functions/syntastic.vim deleted file mode 100644 index 70c8849e..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Functions/syntastic.vim +++ /dev/null @@ -1,16 +0,0 @@ -function! Powerline#Functions#syntastic#GetErrors(line_symbol) " {{{ - if ! exists('g:syntastic_stl_format') - " Syntastic hasn't been loaded yet - return '' - endif - - " Temporarily change syntastic output format - let old_stl_format = g:syntastic_stl_format - let g:syntastic_stl_format = '%E{ ERRORS (%e) '. a:line_symbol .' %fe }%W{ WARNINGS (%w) '. a:line_symbol .' %fw }' - - let ret = SyntasticStatuslineFlag() - - let g:syntastic_stl_format = old_stl_format - - return ret -endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Matches.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Matches.vim deleted file mode 100644 index 5cce4756..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Matches.vim +++ /dev/null @@ -1,13 +0,0 @@ -let g:Powerline#Matches#matches = { - \ 'command_t' : Pl#Match#Add('bufname("%")', 'GoToFile'), - \ 'bt_help' : Pl#Match#Add('&bt' , 'help'), - \ 'ft_man' : Pl#Match#Add('&ft' , 'man'), - \ 'ft_qf' : Pl#Match#Add('&ft' , 'qf'), - \ 'ft_vimpager' : Pl#Match#Add('&ft' , 'vimpager'), - \ 'gundo_preview' : Pl#Match#Add('bufname("%")', '__Gundo_Preview__'), - \ 'gundo_tree' : Pl#Match#Add('bufname("%")', '__Gundo__'), - \ 'lustyexplorer' : Pl#Match#Add('bufname("%")', '\[LustyExplorer-Buffers\]'), - \ 'minibufexplorer' : Pl#Match#Add('bufname("%")', '\-MiniBufExplorer\-'), - \ 'tagbar' : Pl#Match#Add('&ft' , 'tagbar'), - \ 'nerdtree' : Pl#Match#Add('&ft' , 'nerdtree'), -\ } diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments.vim deleted file mode 100644 index c74c34f3..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Segments.vim +++ /dev/null @@ -1,30 +0,0 @@ -let g:Powerline#Segments#segments = Pl#Segment#Init([ - \ Pl#Segment#Create('SPLIT' , '__split__'), - \ Pl#Segment#Create('TRUNCATE', '__truncate__'), - \ - \ Pl#Segment#Create('paste_indicator' , '%{&paste ? "PASTE" : ""}', Pl#Segment#Modes('!N')), - \ Pl#Segment#Create('mode_indicator' , '%{Powerline#Functions#GetMode()}', Pl#Segment#Modes('!N')), - \ Pl#Segment#Create('fileinfo', - \ Pl#Segment#Create('flags.ro' , '%{&readonly ? "$RO" : ""}'), - \ Pl#Segment#Create('filepath' , '%{Powerline#Functions#GetFilepath()}', Pl#Segment#NoPadding()), - \ Pl#Segment#Create('filename' , '%t'), - \ Pl#Segment#Create('flags.mod' , '%M'), - \ Pl#Segment#Create('flags.type' , '%H%W'), - \ ), - \ Pl#Segment#Create('filename' , '%t'), - \ Pl#Segment#Create('filesize' , '%{Powerline#Functions#GetFilesize()}', Pl#Segment#Modes('!N')), - \ Pl#Segment#Create('pwd' , '%{substitute(getcwd(), expand("$HOME"), "~", "g")}'), - \ Pl#Segment#Create('static_str' , '%%{"%s"}'), - \ Pl#Segment#Create('raw' , '%s'), - \ Pl#Segment#Create('fileformat' , '%{&fileformat}', Pl#Segment#Modes('!N')), - \ Pl#Segment#Create('fileencoding' , '%{(&fenc == "" ? &enc : &fenc)}', Pl#Segment#Modes('!N')), - \ Pl#Segment#Create('filetype' , '%{strlen(&ft) ? &ft : "no ft"}', Pl#Segment#Modes('!N')), - \ Pl#Segment#Create('scrollpercent' , '%3p%%'), - \ Pl#Segment#Create('lineinfo', - \ Pl#Segment#Create('line.cur' , '$LINE %3l'), - \ Pl#Segment#Create('line.tot' , ':%-2v', Pl#Segment#NoPadding()), - \ ), - \ Pl#Segment#Create('charcode' , '%{Powerline#Functions#GetCharCode()}', Pl#Segment#Modes('!N')), - \ Pl#Segment#Create('currhigroup' , '%{synIDattr(synID(line("."), col("."), 1), "name")}', Pl#Segment#Modes('!N')), - \ Pl#Segment#Create('ws_marker' , '%{Powerline#Functions#GetWSMarker()}', Pl#Segment#Modes('!N')), -\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/ctrlp.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/ctrlp.vim deleted file mode 100755 index 41c5ebfc..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/ctrlp.vim +++ /dev/null @@ -1,20 +0,0 @@ -if !exists("g:Powerline#Segments#ctrlp#segments#focus ") - let g:Powerline#Segments#ctrlp#segments#focus = '%{"%0"}' -endif -if !exists("g:Powerline#Segments#ctrlp#segments#prev ") - let g:Powerline#Segments#ctrlp#segments#prev = '%-3{"%3"}' -endif -if !exists("g:Powerline#Segments#ctrlp#segments#next ") - let g:Powerline#Segments#ctrlp#segments#next = '%-3{"%5"}' -endif - -let g:Powerline#Segments#ctrlp#segments = Pl#Segment#Init(['ctrlp' - \ , Pl#Segment#Create('focus', g:Powerline#Segments#ctrlp#segments#focus) - \ , Pl#Segment#Create('byfname', '%{"%1"}') - \ , Pl#Segment#Create('prev', g:Powerline#Segments#ctrlp#segments#prev) - \ , Pl#Segment#Create('item', '%-9{"%4"}') - \ , Pl#Segment#Create('next', g:Powerline#Segments#ctrlp#segments#next) - \ , Pl#Segment#Create('marked', '%{"%6" == " <+>" ? "" : strpart("%6", 2, len("%6") - 3)}') - \ - \ , Pl#Segment#Create('count', '%-6{"%0"}') -\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/ft_man.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/ft_man.vim deleted file mode 100644 index 6ed0cc30..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/ft_man.vim +++ /dev/null @@ -1,3 +0,0 @@ -let g:Powerline#Segments#ft_man#segments = Pl#Segment#Init(['ft_man', - \ Pl#Segment#Create('filename', '%{Powerline#Functions#ft_man#GetName()}') -\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/fugitive.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/fugitive.vim deleted file mode 100644 index bb46eeca..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/fugitive.vim +++ /dev/null @@ -1,5 +0,0 @@ -let g:Powerline#Segments#fugitive#segments = Pl#Segment#Init(['fugitive', - \ (exists('g:loaded_fugitive') && g:loaded_fugitive == 1), - \ - \ Pl#Segment#Create('branch', '%{Powerline#Functions#fugitive#GetBranch("$BRANCH")}') -\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/hgrev.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/hgrev.vim deleted file mode 100644 index 3e651d13..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/hgrev.vim +++ /dev/null @@ -1,4 +0,0 @@ -let g:Powerline#Segments#hgrev#segments = Pl#Segment#Init(['hgrev', - \ (exists('hgrev_loaded')), - \ Pl#Segment#Create('branch', '%{Powerline#Functions#hgrev#Status("$BRANCH")}') - \ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/rvm.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/rvm.vim deleted file mode 100644 index c840632d..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/rvm.vim +++ /dev/null @@ -1,6 +0,0 @@ -let g:Powerline#Segments#rvm#segments = Pl#Segment#Init(['rvm', - \ (exists('g:loaded_rvm') && g:loaded_rvm == 1), - \ - \ Pl#Segment#Create('string', '%{rvm#string()}'), - \ Pl#Segment#Create('statusline', '%{rvm#statusline()}') -\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/syntastic.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/syntastic.vim deleted file mode 100644 index 5a893d6e..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/syntastic.vim +++ /dev/null @@ -1,5 +0,0 @@ -let g:Powerline#Segments#syntastic#segments = Pl#Segment#Init(['syntastic', - \ (exists('g:loaded_syntastic_plugin') && g:loaded_syntastic_plugin == 1), - \ - \ Pl#Segment#Create('errors', '%{Powerline#Functions#syntastic#GetErrors("$LINE")}', Pl#Segment#Modes('!N')) -\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/tagbar.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/tagbar.vim deleted file mode 100644 index 5db8cd95..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/tagbar.vim +++ /dev/null @@ -1,6 +0,0 @@ -let g:Powerline#Segments#tagbar#segments = Pl#Segment#Init(['tagbar', - \ (exists(':Tagbar') > 0), - \ - \ Pl#Segment#Create('currenttag', '%{tagbar#currenttag("%s", "")}', Pl#Segment#Modes('!N')), - \ Pl#Segment#Create('fullcurrenttag', '%{tagbar#currenttag("%s", "", "f")}', Pl#Segment#Modes('!N')) -\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/virtualenv.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/virtualenv.vim deleted file mode 100644 index 8c7d6fb5..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/virtualenv.vim +++ /dev/null @@ -1,5 +0,0 @@ -let g:Powerline#Segments#virtualenv#segments = Pl#Segment#Init(['virtualenv', - \ has('python') && (exists('g:virtualenv_loaded') && g:virtualenv_loaded == 1), - \ - \ Pl#Segment#Create('statusline', '%{virtualenv#statusline()}') -\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Themes/default.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Themes/default.vim deleted file mode 100644 index a97d5b9c..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Themes/default.vim +++ /dev/null @@ -1,116 +0,0 @@ -let g:Powerline#Themes#default#theme = Pl#Theme#Create( - \ Pl#Theme#Buffer('' - \ , 'paste_indicator' - \ , 'mode_indicator' - \ , 'fugitive:branch' - \ , 'hgrev:branch' - \ , 'fileinfo' - \ , 'syntastic:errors' - \ , Pl#Segment#Truncate() - \ , 'tagbar:currenttag' - \ , Pl#Segment#Split() - \ , 'rvm:string' - \ , 'virtualenv:statusline' - \ , 'fileformat' - \ , 'fileencoding' - \ , 'filetype' - \ , 'scrollpercent' - \ , 'lineinfo' - \ ), - \ - \ Pl#Theme#Buffer('command_t' - \ , ['static_str.name', 'Command-T'] - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ , ['raw.line', '%10(Match #%l%)'] - \ ), - \ - \ Pl#Theme#Buffer('gundo', Pl#Match#Any('gundo_tree') - \ , ['static_str.name', 'Gundo'] - \ , ['static_str.buffer', 'Undo tree'] - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ ), - \ - \ Pl#Theme#Buffer('gundo', Pl#Match#Any('gundo_preview') - \ , ['static_str.name', 'Gundo'] - \ , ['static_str.buffer', 'Diff preview'] - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ ), - \ - \ Pl#Theme#Buffer('bt_help' - \ , ['static_str.name', 'Help'] - \ , 'filename' - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ , 'scrollpercent' - \ ), - \ - \ Pl#Theme#Buffer('ft_vimpager' - \ , ['static_str.name', 'Pager'] - \ , 'filename' - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ , 'scrollpercent' - \ ), - \ - \ Pl#Theme#Buffer('lustyexplorer' - \ , ['static_str.name', 'LustyExplorer'] - \ , ['static_str.buffer', 'Buffer list'] - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ ), - \ - \ Pl#Theme#Buffer('ft_man' - \ , ['static_str.name', 'Man page'] - \ , 'filename' - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ , 'scrollpercent' - \ ), - \ - \ Pl#Theme#Buffer('minibufexplorer' - \ , ['static_str.name', 'MiniBufExplorer'] - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ ), - \ - \ Pl#Theme#Buffer('ft_qf' - \ , ['static_str.name', 'Quickfix'] - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ ), - \ - \ Pl#Theme#Buffer('tagbar' - \ , ['static_str.name', 'Tagbar'] - \ , ['static_str.buffer', 'Tree'] - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ ), - \ - \ Pl#Theme#Buffer('ctrlp', Pl#Theme#Callback('ctrlp_main', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.main = "%s"') - \ , 'ctrlp:prev' - \ , 'ctrlp:item' - \ , 'ctrlp:next' - \ , 'ctrlp:marked' - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ , 'ctrlp:focus' - \ , 'ctrlp:byfname' - \ , 'pwd' - \ ), - \ - \ Pl#Theme#Buffer('ctrlp', Pl#Theme#Callback('ctrlp_prog', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.prog = "%s"') - \ , 'ctrlp:count' - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ , 'pwd' - \ ), - \ - \ Pl#Theme#Buffer('nerdtree' - \ , ['raw.name', '%{Powerline#Functions#GetShortPath(4)}'] - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ ) -\ ) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Themes/skwp.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Themes/skwp.vim deleted file mode 100644 index 64ed1342..00000000 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Themes/skwp.vim +++ /dev/null @@ -1,116 +0,0 @@ -" Disabled: -" Add the following line into the first theme group to see the highlight -" group -" \ , 'currhigroup' -" -" Line info taken out - I know which line number I'm on from the gutter -"\ , 'lineinfo' -let g:Powerline#Themes#skwp#theme = Pl#Theme#Create( - \ Pl#Theme#Buffer('' - \ , 'fugitive:branch' - \ , 'fileinfo' - \ , 'flags.mod' - \ , 'syntastic:errors' - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ , 'sass:status' - \ , 'rvm:string' - \ , 'paste_indicator' - \ ), - \ - \ Pl#Theme#Buffer('command_t' - \ , ['static_str.name', 'Command-T'] - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ , ['raw.line', '%10(Match #%l%)'] - \ ), - \ - \ Pl#Theme#Buffer('gundo', Pl#Match#Any('gundo_tree') - \ , ['static_str.name', 'Gundo'] - \ , ['static_str.buffer', 'Undo tree'] - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ ), - \ - \ Pl#Theme#Buffer('gundo', Pl#Match#Any('gundo_preview') - \ , ['static_str.name', 'Gundo'] - \ , ['static_str.buffer', 'Diff preview'] - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ ), - \ - \ Pl#Theme#Buffer('bt_help' - \ , ['static_str.name', 'Help'] - \ , 'filename' - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ , 'scrollpercent' - \ ), - \ - \ Pl#Theme#Buffer('ft_vimpager' - \ , ['static_str.name', 'Pager'] - \ , 'filename' - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ , 'scrollpercent' - \ ), - \ - \ Pl#Theme#Buffer('lustyexplorer' - \ , ['static_str.name', 'LustyExplorer'] - \ , ['static_str.buffer', 'Buffer list'] - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ ), - \ - \ Pl#Theme#Buffer('ft_man' - \ , ['static_str.name', 'Man page'] - \ , 'filename' - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ , 'scrollpercent' - \ ), - \ - \ Pl#Theme#Buffer('minibufexplorer' - \ , ['static_str.name', 'MiniBufExplorer'] - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ ), - \ - \ Pl#Theme#Buffer('ft_qf' - \ , ['static_str.name', 'Quickfix'] - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ ), - \ - \ Pl#Theme#Buffer('tagbar' - \ , ['static_str.name', 'Tagbar'] - \ , ['static_str.buffer', 'Tree'] - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ ), - \ - \ Pl#Theme#Buffer('ctrlp', Pl#Theme#Callback('ctrlp_main', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.main = "%s"') - \ , 'ctrlp:prev' - \ , 'ctrlp:item' - \ , 'ctrlp:next' - \ , 'ctrlp:marked' - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ , 'ctrlp:focus' - \ , 'ctrlp:byfname' - \ , 'pwd' - \ ), - \ - \ Pl#Theme#Buffer('ctrlp', Pl#Theme#Callback('ctrlp_prog', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.prog = "%s"') - \ , 'ctrlp:count' - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ , 'pwd' - \ ), - \ - \ Pl#Theme#Buffer('nerdtree' - \ , ['raw.name', '%{Powerline#Functions#GetShortPath(4)}'] - \ , Pl#Segment#Truncate() - \ , Pl#Segment#Split() - \ ) -\ ) diff --git a/sources_non_forked/vim-powerline/doc/Powerline.txt b/sources_non_forked/vim-powerline/doc/Powerline.txt deleted file mode 100644 index 33d136fd..00000000 --- a/sources_non_forked/vim-powerline/doc/Powerline.txt +++ /dev/null @@ -1,429 +0,0 @@ -*Powerline.txt* For Vim version 7.3. Last change: 2011 Nov 23 - - ______ - _________ \ /__ - \_____ \______ _ _____________ / /'__' ___ ____ - | ___/ _ \ \/ \/ / __ \_ ___\ / | |/ \_/ __ \ - | | | (_) \ _ / ___/| | / /__| | | \ ___/ - '___' \____/ \/ \/ \___ |__' /___ /'__'__| /\___ \ - \/ / / \/ \/ - | / - |/ - ' - -============================================================================== -CONTENTS *Powerline-contents* - - 1. Introduction ....................... |Powerline-introduction| - 2. Usage .............................. |Powerline-usage| - 3. Requirements ....................... |Powerline-requirements| - 3.1 Recommended settings ........... |Powerline-recommended-settings| - 4. Configuration ...................... |Powerline-configuration| - 4.1 Powerline_cache_file ........... |Powerline_cache_file| - 4.1.1 Clearing the cache ....... |:PowerlineClearCache| - 4.2 Powerline_cache_enabled ........ |Powerline_cache_enabled| - 4.3 Powerline_symbols .............. |Powerline_symbols| - 4.3.1 Compatible symbols ....... |Powerline-symbols-compatible| - 4.3.2 Fancy symbols ............ |Powerline-symbols-fancy| - 4.3.3 Overriding symbols ....... |Powerline_symbols_override| - 4.3.4 Overriding dividers ...... |Powerline_dividers_override| - 4.4 Powerline_theme ................ |Powerline_theme| - 4.5 Powerline_colorscheme .......... |Powerline_colorscheme| - 4.6 Powerline_stl_path_style ....... |Powerline_stl_path_style| - 5. Fonts .............................. |Powerline-fonts| - 6. Customization ...................... |Powerline-customization| - 6.1 Basic customization ............ |Powerline-basic-customization| - 6.2 Advanced customization ......... |Powerline-advanced-customization| - 6.2.1 Colorschemes ............. |Powerline-cust-colorschemes| - 6.2.2 Functions ................ |Powerline-cust-functions| - 6.2.3 Segments ................. |Powerline-cust-segments| - 6.2.4 Themes ................... |Powerline-cust-themes| - 7. License ............................ |Powerline-license| - 8. Known issues ....................... |Powerline-known-issues| - 9. Contributing ....................... |Powerline-contributing| - -============================================================================== -1. Introduction *Powerline* *Powerline-introduction* - -Powerline is a utility plugin which allows you to create better-looking, more -functional Vim statuslines. - -============================================================================== -2. Usage *Powerline-usage* - -Powerline is automatically enabled when it's installed, either by unzipping -the provided archive or by adding it as a Pathogen/Vundle bundle. - -Powerline replaces the standard Vim 'statusline' with a custom statusline made -up of Powerline segments. - -Powerline ignores any 'statusline' customizations you have defined in your -|vimrc|. If you remove Powerline, your 'statusline' customizations are -restored. - -============================================================================== -3. Requirements *Powerline-requirements* - -Powerline has been developed and tested in Vim 7.3, but it should run without -any problems in Vim 7.2. The default configuration requires a Unix-like system -to work properly. - -The plugin only works with Vim running in an 88/256-color terminal or Gvim. - -Vi-compatible mode must be disabled. - ------------------------------------------------------------------------------- -3.1 Recommended settings *Powerline-recommended-settings* - -The following configuration options should be set in your |vimrc|: > - - set nocompatible " Disable vi-compatibility - set laststatus=2 " Always show the statusline - set encoding=utf-8 " Necessary to show Unicode glyphs - -Note: If you're using an 88/256-color terminal but still don't see the colored -statusline, you may have to set the following option as well: > - - set t_Co=256 " Explicitly tell Vim that the terminal supports 256 colors - -============================================================================== -4. Configuration *Powerline-configuration* - -Powerline will work fine without any user configuration, but default behavior -can be overridden by setting configuration variables globally in your |vimrc| -file. - ------------------------------------------------------------------------------- -4.1 Powerline_cache_file *Powerline_cache_file* - -By default Powerline caches all the statuslines and colors in a cache file in -the plugin's directory (or the Vim directory, depending on the installation -method used). - -It's recommended that you enable the cache, as this dramatically improves Vim -startup time after the cache file has been generated (the plugin usually loads -within ~100ms without the cache and ~1ms with the cache). - -Note: The default cache filename includes the current theme, colorscheme and -symbol settings in order to tie the cache file to your current configuration, -so the cache file will be regenerated when you change any settings. This may -leave several old cache files in your Vim folder, and these may safely be -deleted. - -Defaults: "/Powerline___.cache" - ------------------------------------------------------------------------------- -4.1.1 Clearing the cache *:PowerlineClearCache* - -Powerline provides a command to easily clear the cache after changing your -settings or updating your theme. Simply run the following command to clear -your cache, and restart Vim afterwards: > - - :PowerlineClearCache -< ------------------------------------------------------------------------------- -4.2 Powerline_cache_enabled *Powerline_cache_enabled* - -It's possible to disable statusline caching by setting this option to 0. This -is mostly useful when developing statuslines. - -Example: > - - let g:Powerline_cache_enabled = 0 -< - -Default: 1 - ------------------------------------------------------------------------------- -4.3 Powerline_symbols *Powerline_symbols* - -This option defines which set of symbols and dividers you want to use. There -are currently three available options: "compatible", "unicode" and "fancy". - - TYPE DESCRIPTION ~ - compatible Doesn't use any special characters. - unicode Simulates icons and arrows using similar Unicode glyphs. - fancy Custom icons and arrows. Requires a patched font. - -Example: > - - let g:Powerline_symbols = 'fancy' -< - -Default: "compatible" - -Symbols can be inserted into statuslines by using the following variables -(just insert the variables as text in your segments): - - VARIABLE DESCRIPTION ~ - $BRANCH Inserts a branch symbol - $RO Inserts a read-only symbol - $FT Inserts a filetype symbol - $LINE Inserts a line number symbol - ------------------------------------------------------------------------------- -4.3.1 Compatible symbols *Powerline-symbols-compatible* - -These symbols will work in any configuration, and do not require a special -font to work. This option will replace the fancy icons with plain text, and -the pointy dividers with straight lines. - ------------------------------------------------------------------------------- -4.3.2 Fancy symbols *Powerline-symbols-fancy* - -These symbols require a custom font to work. A font patcher is provided for -adding the required symbols to any outline font and some bitmap fonts, see -|Powerline-fonts| and the provided README file for usage details. - ------------------------------------------------------------------------------- -4.3.3 Overriding symbols *Powerline_symbols_override* - -You can override symbols by adding your symbols to the -g:Powerline_symbols_override dictionary. Example: If you want the branch -symbol to be "∓" (hex code 0x2213) and the line symbol to be "L" you can add -the following to your |vimrc|: > - - let g:Powerline_symbols_override = { - \ 'BRANCH': [0x2213], - \ 'LINE': 'L', - \ } -< ------------------------------------------------------------------------------- -4.3.4 Overriding dividers *Powerline_dividers_override* - -If you for some reason want to override the dividers then you can set -g:Powerline_dividers_override to a list with exactly four elements: - - 1: Hard right-pointing arrow - 2: Soft right-pointing arrow - 3: Hard left-pointing arrow - 4: Soft left-pointing arrow - -Example: > - - let g:Powerline_dividers_override = ['>>', '>', '<<', '<'] -< - ------------------------------------------------------------------------------- -4.3.5 Overriding mode names *Powerline_mode* - -You can change the names used for modes at the far left by setting some -variables in your |vimrc|. For example you can change "N" to "NORMAL" with: > - - let g:Powerline_mode_n = 'NORMAL' -< -The variables are all named beginning with 'g:Powerline_mode_', as follows: - -mode name default note ~ -Normal n ' N ' (surrounded by spaces) -Insert i INSERT -Replace R REPLACE |Replace-mode| -Visual v VISUAL |Visual-mode| -Visual linewise V V⋅LINE -Visual blockwise cv V⋅BLOCK -Select s SELECT |Select-mode| -Select linewise S S⋅LINE -Select blockwise cs S⋅BLOCK - ------------------------------------------------------------------------------ -4.4 Powerline_theme *Powerline_theme* - -This option defines the theme Powerline uses. The available themes are located -in autoload/Powerline/Themes/. A theme is a pre-defined set of Powerline -segments which make up the statusline. - -Example: > - - let g:Powerline_theme = 'skwp' -< - -Default: "default" - ------------------------------------------------------------------------------- -4.5 Powerline_colorscheme *Powerline_colorscheme* - -This option defines the colorscheme Powerline uses. The available colorschemes -are located in autoload/Powerline/Colorschemes/. - -Example: > - - let g:Powerline_colorscheme = 'skwp' -< - -Default: "default" - ------------------------------------------------------------------------------- -4.6 Powerline_stl_path_style *Powerline_stl_path_style* - -There are currently four ways to display the current path and file name. The -default is to only display the file name like the %t statusline item. By -setting this configuration value you can choose from the following ways -display the current path and file name: - - VALUE DESCRIPTION ~ - filename Display only the file name using the %t statusline item. - short Display a short path. The home directory is substituted with - "~", the first directory is displayed with its full name, and - subsequent directories are shortened to their first letter. - I.e. "/home/user/foo/bar/baz.vim" becomes "~/f/b/baz.vim" and - "long/relative/path/foo/bar/baz.vim becomes - "long/r/p/f/b/baz.vim". - relative Display a relative path, similar to the %f statusline item. - full Display the full path, similar to the %F statusline item. - -Example: > - - let g:Powerline_stl_path_style = 'full' -< - -Default: "relative" - -============================================================================== -5. Fonts *Powerline-fonts* - -TODO - -============================================================================== -6. Customization *Powerline-customization* - -There are currently two ways of customizing Powerline: Basic customization -using a couple of functions to insert and remove existing segments from the -statusline, and advanced customization using your own autoload files. The -customization features of Powerline allow you to create your own statuslines -without ever touching the original source code. - ------------------------------------------------------------------------------- -6.1 Basic customization *Powerline-basic-customization* - -Powerline provides the following functions to alter the default statusline -look. These functions should be called from your |vimrc| file or another file -which is sourced at Vim startup. - -Note: These functions are currently applied to all statuslines, so if you -insert a segment after a segment which is present in many statuslines (e.g. -the "filename" segment), all the statuslines will have the inserted segment. -This behavior may be changed in a future version of Powerline. - -Note: Remember to clear your cache with |:PowerlineClearCache| after changing -your statusline! - -Example: > - - " Insert the charcode segment after the filetype segment - call Pl#Theme#InsertSegment('charcode', 'after', 'filetype') - - " Replace the scrollpercent segment with the charcode segment - call Pl#Theme#ReplaceSegment('scrollpercent', 'fileinfo') -< - *Pl#Theme#InsertSegment* -Pl#Theme#InsertSegment({newsegment}, {location}, {targetsegment}) - -This function inserts {newsegment} before or after {targetsegment}. The -{location} parameter specifies the location of the new segment, valid values -are "before" and "after". You can see all the available segments in -autoload/Powerline/Segments.vim and the files specified in -|Powerline-cust-segments|. - -Pl#Theme#RemoveSegment({targetsegment}) *Pl#Theme#RemoveSegment* - -This function removes the {targetsegment} segment entirely. - -Pl#Theme#ReplaceSegment({oldsegment}, {newsegment}) *Pl#Theme#ReplaceSegment* - -This function replaces {oldsegment} with {newsegment}. - ------------------------------------------------------------------------------- -6.2 Advanced customization *Powerline-advanced-customization* - -Because Powerline utilizes Vim's autoload functionality, you can easily create -your own segments, themes, functions and colorschemes without touching the -original source code. This is a bit more complex than using the utility -functions, but it allows you to do a lot more with your statusline. - -Your custom autoload files should be stored in your |runtimepath| (usually in -"~/.vim/autoload/Powerline/*"). - -Note: Remember to clear your cache with |:PowerlineClearCache| after changing -your statusline! - -6.2.1 Colorschemes *Powerline-cust-colorschemes* ------------------------------------------------------------------------------- - -Colorschemes should be stored as separate files in -{runtimepath}/autoload/Powerline/Colorschemes/. - -SYNTAX ~ - -TODO - -EXAMPLE ~ - -TODO - -6.2.2 Functions *Powerline-cust-functions* ------------------------------------------------------------------------------- - -Functions should be stored as separate files in -{runtimepath}/autoload/Powerline/Functions/. - -SYNTAX ~ - -TODO - -EXAMPLE ~ - -TODO - -6.2.3 Segments *Powerline-cust-segments* ------------------------------------------------------------------------------- - -Segments should be stored as separate files in -{runtimepath}/autoload/Powerline/Segments/. - -SYNTAX ~ - -TODO - -EXAMPLE ~ - -TODO - -6.2.4 Themes *Powerline-cust-themes* ------------------------------------------------------------------------------- - -Themes should be stored as separate files in -{runtimepath}/autoload/Powerline/Themes/. - -SYNTAX ~ - -TODO - -EXAMPLE ~ - -TODO - -============================================================================== -7. License *Powerline-license* - -Creative Commons Attribution-ShareAlike 3.0 Unported - -http://creativecommons.org/licenses/by-sa/3.0/ - -============================================================================== -8. Known issues *Powerline-known-issues* - -See the issue tracker at -https://github.com/Lokaltog/vim-powerline/issues - -============================================================================== -9. Contributing *Powerline-contributing* - -If you experience any bugs or have feature requests, please open an issue on -GitHub. Fork the source repository on GitHub and send a pull request if you -have any code improvements. - -Author: Kim Silkebækken -Source repository: https://github.com/Lokaltog/vim-powerline - -============================================================================== -vim:tw=78:sw=4:ts=8:ft=help:norl: diff --git a/sources_non_forked/vim-powerline/fontpatcher/PowerlineSymbols.sfd b/sources_non_forked/vim-powerline/fontpatcher/PowerlineSymbols.sfd deleted file mode 100644 index 34d7d0c8..00000000 --- a/sources_non_forked/vim-powerline/fontpatcher/PowerlineSymbols.sfd +++ /dev/null @@ -1,319 +0,0 @@ -SplineFontDB: 3.0 -FontName: PowerlineSymbols -FullName: PowerlineSymbols -FamilyName: PowerlineSymbols -Weight: Medium -Copyright: -UComments: "2011-11-21: Created." -Version: 001.000 -ItalicAngle: 0 -UnderlinePosition: -98.6328 -UnderlineWidth: 48.8281 -Ascent: 800 -Descent: 200 -LayerCount: 2 -Layer: 0 0 "Back" 1 -Layer: 1 0 "Fore" 0 -XUID: [1021 211 26716215 11021609] -FSType: 0 -OS2Version: 0 -OS2_WeightWidthSlopeOnly: 0 -OS2_UseTypoMetrics: 1 -CreationTime: 1321867751 -ModificationTime: 1326665029 -OS2TypoAscent: 0 -OS2TypoAOffset: 1 -OS2TypoDescent: 0 -OS2TypoDOffset: 1 -OS2TypoLinegap: 90 -OS2WinAscent: 0 -OS2WinAOffset: 1 -OS2WinDescent: 0 -OS2WinDOffset: 1 -HheadAscent: 0 -HheadAOffset: 1 -HheadDescent: 0 -HheadDOffset: 1 -OS2Vendor: 'PfEd' -MarkAttachClasses: 1 -DEI: 91125 -Encoding: UnicodeFull -Compacted: 1 -UnicodeInterp: none -NameList: Adobe Glyph List -DisplaySize: -24 -AntiAlias: 1 -FitToEm: 1 -WinInfo: 0 31 18 -BeginPrivate: 0 -EndPrivate -BeginChars: 1114112 9 - -StartChar: uni2B80 -Encoding: 11136 11136 0 -Width: 621 -Flags: HMW -LayerCount: 2 -Fore -SplineSet -0 1000 m 1 - 621 379 l 1 - 0 -243 l 1 - 0 1000 l 1 -EndSplineSet -EndChar - -StartChar: uni2B81 -Encoding: 11137 11137 1 -Width: 621 -Flags: HMW -LayerCount: 2 -Fore -SplineSet -10 991 m 0 - 16 997 23 1000 32 1000 c 0 - 41 1000 48 996 54 990 c 2 - 613 400 l 2 - 619 394 621 386 621 378 c 0 - 621 370 618 362 613 357 c 2 - 54 -233 l 2 - 48 -239 41 -242 32 -242 c 0 - 23 -242 16 -240 10 -234 c 0 - 4 -228 0 -221 0 -212 c 0 - 0 -203 3 -196 8 -190 c 2 - 547 379 l 1 - 8 948 l 2 - 3 954 0 961 0 970 c 0 - 0 979 4 985 10 991 c 0 -EndSplineSet -EndChar - -StartChar: uni2B82 -Encoding: 11138 11138 2 -Width: 621 -Flags: HMW -LayerCount: 2 -Fore -SplineSet -621 1000 m 5 - 621 -243 l 5 - 0 379 l 5 - 621 1000 l 5 -EndSplineSet -EndChar - -StartChar: uni2B83 -Encoding: 11139 11139 3 -Width: 621 -Flags: HMW -LayerCount: 2 -Fore -SplineSet -612 991 m 0 - 618 985 621 979 621 970 c 0 - 621 961 619 954 613 948 c 2 - 74 379 l 1 - 613 -190 l 2 - 619 -196 621 -203 621 -212 c 0 - 621 -221 618 -228 612 -234 c 0 - 606 -240 598 -242 589 -242 c 0 - 580 -242 574 -239 568 -233 c 2 - 8 357 l 2 - 3 362 0 370 0 378 c 0 - 0 386 3 394 8 400 c 2 - 568 990 l 2 - 574 996 580 1000 589 1000 c 0 - 598 1000 606 997 612 991 c 0 -EndSplineSet -EndChar - -StartChar: uni2B61 -Encoding: 11105 11105 4 -Width: 555 -VWidth: 0 -Flags: HMW -LayerCount: 2 -Fore -SplineSet -0 800 m 5 - 92 800 l 5 - 92 513 l 5 - 253 513 l 5 - 253 444 l 5 - 0 444 l 5 - 0 800 l 5 -236 312 m 5 - 339 312 l 5 - 468 67 l 5 - 468 312 l 5 - 555 312 l 5 - 555 -44 l 5 - 453 -44 l 5 - 323 200 l 5 - 323 -44 l 5 - 236 -44 l 5 - 236 312 l 5 -EndSplineSet -EndChar - -StartChar: uni2B60 -Encoding: 11104 11104 5 -Width: 676 -Flags: HMW -LayerCount: 2 -Fore -SplineSet -0 197 m 1 - 94 207 419 279 419 384 c 2 - 419 537 l 1 - 278 501 l 1 - 478 794 l 1 - 677 501 l 1 - 536 537 l 1 - 536 384 l 2 - 536 196 208 126 208 21 c 2 - 208 -244 l 1 - 0 -244 l 1 - 0 197 l 1 -0 288 m 1 - 0 405 0 944 0 944 c 1 - 208 944 l 1 - 208 944 208 451 208 334 c 1 - 185 311 12 288 0 288 c 1 -EndSplineSet -EndChar - -StartChar: uni2B62 -Encoding: 11106 11106 6 -Width: 428 -VWidth: 0 -Flags: HMW -LayerCount: 2 -Fore -SplineSet -88 677 m 2 - 429 677 l 1 - 429 589 l 1 - 88 589 l 1 - 88 162 l 1 - 198 162 l 1 - 198 343 l 1 - 374 343 l 1 - 374 427 l 1 - 198 427 l 1 - 198 506 l 1 - 429 506 l 1 - 429 274 l 1 - 416 263 391 255 374 255 c 2 - 286 255 l 1 - 286 162 l 2 - 286 114 246 74 198 74 c 2 - 88 74 l 2 - 40 74 0 114 0 162 c 2 - 0 589 l 2 - 0 637 40 677 88 677 c 2 -EndSplineSet -EndChar - -StartChar: uni2B63 -Encoding: 11107 11107 7 -Width: 428 -VWidth: 0 -Flags: HMW -LayerCount: 2 -Fore -SplineSet -0 677 m 5 - 341 677 l 6 - 389 677 429 637 429 589 c 6 - 429 506 l 6 - 429 458 389 418 341 418 c 6 - 287 418 l 5 - 287 162 l 6 - 287 114 247 74 199 74 c 6 - 89 74 l 6 - 41 74 1 114 1 162 c 6 - 1 274 l 6 - 0 274 l 6 - 0 506 l 5 - 89 506 l 5 - 89 162 l 5 - 199 162 l 5 - 199 506 l 5 - 341 506 l 5 - 341 589 l 5 - 0 589 l 5 - 0 677 l 5 -EndSplineSet -EndChar - -StartChar: uni2B64 -Encoding: 11108 11108 8 -Width: 546 -VWidth: 0 -Flags: HMW -LayerCount: 2 -Fore -SplineSet -273 733 m 4 - 429 733 430 538 430 538 c 5 - 430 420 l 5 - 547 420 l 5 - 547 303 l 5 - 547 303 546 -9 273 -9 c 4 - 0 -9 0 303 0 303 c 5 - 0 420 l 5 - 117 420 l 5 - 117 538 l 5 - 117 538 117 733 273 733 c 4 -273 655 m 4 - 195 655 195 576 195 420 c 5 - 352 420 l 5 - 352 576 351 655 273 655 c 4 -273 342 m 4 - 195 342 195 147 273 147 c 4 - 351 147 351 342 273 342 c 4 -EndSplineSet -EndChar -EndChars -BitmapFont: 10 10 8 2 1 -BDFChar: 0 11136 6 0 4 -2 7 -JAC+4q"X@:^jlCb -BDFChar: 1 11137 6 0 4 -2 7 -J3Y4g#RCta5_&h7 -BDFChar: 2 11138 6 1 5 -2 7 -#T,OGq"T(n(^L*A -BDFChar: 3 11139 6 1 5 -2 7 -#S8+DJ:Km-&-r79 -BDFChar: 4 11105 6 1 4 -1 7 -J:N1>!0GR3O8o7\ -BDFChar: 5 11104 7 0 5 -2 7 -^rYQ3 -BDFChar: 8 11108 5 0 5 0 6 -0M"b4bku\c -EndBitmapFont -BitmapFont: 12 10 10 2 1 -BDFChar: 0 11136 7 0 6 -2 11 -!!%Pbi:-O>r:od>^jlCb -BDFChar: 1 11137 7 0 6 -3 11 -!!%O7+:ne]":,P]5_&h7 -BDFChar: 2 11138 7 0 6 -2 11 -!!!-1*'AWHr-UUH$j6P1 -BDFChar: 3 11139 7 0 6 -2 11 -!!!--&0O5gJ3Y4g#Qt,- -BDFChar: 4 11105 7 0 5 0 8 -J:N1>!$jBP,QIfE -BDFChar: 5 11104 8 0 8 -3 11 -z^];.Ma8juqa8j9]a8jQehuLOm^];.Mz -BDFChar: 6 11106 5 1 6 0 8 -!-j$]R"1Qc?iU0, -BDFChar: 7 11107 5 0 5 0 7 -p]QtGOH>Q3 -BDFChar: 8 11108 7 0 5 0 8 -0M"`*r63C_GQ7^D -EndBitmapFont -EndSplineFont diff --git a/sources_non_forked/vim-powerline/fontpatcher/README.rst b/sources_non_forked/vim-powerline/fontpatcher/README.rst deleted file mode 100644 index 35b3d5d0..00000000 --- a/sources_non_forked/vim-powerline/fontpatcher/README.rst +++ /dev/null @@ -1,164 +0,0 @@ -====================== -Powerline font patcher -====================== - -:Author: Kim Silkebækken (kim.silkebaekken+vim@gmail.com) - -Description ------------ - -This font patcher creates dividers and symbols for use with Powerline. The -script requires Python 2 and FontForge compiled with Python bindings. - -Patched fonts are renamed by default (" for Powerline" is added to the font -name) so they don't conflict with existing fonts. Use the ``--no-rename`` -option to disable font renaming. - -Glyph table ------------ - -All the glyphs are stored in the ``U+2B60``-``U+2BFF`` range ("Misc symbols -and arrows"). - -+------------+-------------------+ -| Code point | Description | -+============+===================+ -| ``U+2B60`` | Branch symbol | -+------------+-------------------+ -| ``U+2B61`` | LN (line) symbol | -+------------+-------------------+ -| ``U+2B62`` | FT symbol, part 1 | -+------------+-------------------+ -| ``U+2B63`` | FT symbol, part 2 | -+------------+-------------------+ -| ``U+2B64`` | Padlock (closed) | -+------------+-------------------+ -| ``U+2B80`` | Hard right arrow | -+------------+-------------------+ -| ``U+2B81`` | Soft right arrow | -+------------+-------------------+ -| ``U+2B82`` | Hard left arrow | -+------------+-------------------+ -| ``U+2B83`` | Soft left arrow | -+------------+-------------------+ - -=================== -Font patching guide -=================== - -There's a `GitHub wiki page`_ dedicated to community-contributed patched -fonts. You may download one of the fonts on that page if you don't want to -patch the fonts yourself. - -If you do patch a font that's not included in the wiki (and you have -permission to distribute it), please include it on the wiki page. - -**Note:** The fonts in the wiki may be outdated, and may have different -glyphs than the ones provided in the latest version of Powerline. It's -recommended that you always patch your fonts yourself if you have the -required software. - -.. _`GitHub wiki page`: https://github.com/Lokaltog/vim-powerline/wiki/Patched-fonts - -Linux ------ - -1. Install fontforge with Python bindings. For Ubuntu users the required - package is ``python-fontforge``, for Arch Linux users the required - package is ``fontforge``. It should be something similar for other - distros. - -2. Run the font patcher:: - - $ /path/to/fontpatcher MyFontFile.ttf - -3. Copy the font file into ``~/.fonts`` (or another X font directory):: - - $ cp MyFontFile-Powerline.otf ~/.fonts - - **Note:** If the font is a pure bitmap font (e.g. a PCF font) it will be - stored in the BDF format. This is usually not a problem, and you may - convert the font back to the PCF format using ``bdftopcf`` if you want - to. All other fonts will be stored in the OTF format regardless of the - original format. - -4. Update your font cache:: - - $ sudo fc-cache -vf - - **Note:** If you use vim in rxvt-unicode in the client/daemon mode, you - may need to close all running terminals as well for the font to be - updated. - -5. **For gvim users:** Update the GUI font in your ``vimrc`` file:: - - set guifont=MyFont\ for\ Powerline - - **For terminal users:** Update your terminal configuration to use the - patched font. - -6. Update your ``vimrc`` configuration to use the new symbols:: - - let g:Powerline_symbols = 'fancy' - -7. Make sure that the cache file is deleted:: - - $ rm /tmp/Powerline.cache - -8. Start vim and enjoy your new statusline! - -OS X ----- - -1. Check if you have a FontForge version with Python support by running - ``fontforge -version``. You should see something like this:: - - $ fontforge -version - Copyright (c) 2000-2011 by George Williams. - Executable based on sources from 13:48 GMT 22-Feb-2011-D. - Library based on sources from 13:48 GMT 22-Feb-2011. - fontforge 20110222 - libfontforge 20110222 - - Make sure that the executable version number doesn't have ``NoPython`` in - it. If everything looks OK, skip ahead to step 4. - -2. If you have FontForge but with ``NoPython`` in the version number, please - try to update to a later version:: - - $ brew uninstall fontforge - $ brew update - $ brew install --use-gcc fontforge - - **Note:** You may have to use ``--use-clang`` instead of ``--use-gcc`` - when compiling FontForge. - -3. If you don't have FontForge, install it with Homebrew:: - - $ brew update - $ brew install --use-gcc fontforge - -4. Patch your fonts by passing the ``fontpatcher`` script as a parameter to - FontForge:: - - $ fontforge -script /path/to/fontpatcher MyFontFile.ttf - -5. Install the font by double-clicking the font file in Finder and click - "Install this font" from the preview window. - -6. **For gvim users:** Update the GUI font in your ``vimrc`` file:: - - set guifont=MyFont\ for\ Powerline - - **For terminal users:** Update your terminal configuration to use the - patched font. - -7. Update your ``vimrc`` configuration to use the new symbols:: - - let g:Powerline_symbols = 'fancy' - -8. Make sure that the cache file is deleted:: - - $ rm /tmp/Powerline.cache - -9. Start vim and enjoy your new statusline! diff --git a/sources_non_forked/vim-powerline/fontpatcher/fontpatcher b/sources_non_forked/vim-powerline/fontpatcher/fontpatcher deleted file mode 100755 index 2c54a3fa..00000000 --- a/sources_non_forked/vim-powerline/fontpatcher/fontpatcher +++ /dev/null @@ -1,240 +0,0 @@ -#!/usr/bin/env python - -"""Font patcher for Powerline. - -Creates dividers and symbols for use with Powerline. Requires FontForge with Python bindings. - -Stores glyphs in the 2b60-2bff Unicode range ("Misc symbols and arrows"). - -[2b60] Branch symbol -[2b61] LN (line) symbol -[2b62] FT symbol 1 -[2b63] FT symbol 2 -[2b64] Padlock (closed) symbol -[2b80] Hard right arrow -[2b81] Soft right arrow -[2b82] Hard left arrow -[2b83] Soft left arrow -""" - -from __future__ import division - -import argparse -import os -import sys -import re - -try: - import fontforge - import psMat -except ImportError: - sys.stderr.write('The required FontForge modules could not be loaded.\n\n') - - if sys.version_info.major > 2: - sys.stderr.write('FontForge only supports Python 2. Please run this script with the Python 2 executable - e.g. "python2 {0}"\n'.format(sys.argv[0])) - else: - sys.stderr.write('You need FontForge with Python bindings for this script to work.\n') - - sys.exit(1) - -# Handle command-line arguments -parser = argparse.ArgumentParser(description='Font patcher for Powerline. Creates dividers and symbols in FontForge-compatible font files. Requires FontForge with Python bindings. Stores glyphs in the U+2B80-U+2BFF range ("Miscellaneous symbols and arrows"). Stores the patched font as a new, renamed font file by default.') - -parser.add_argument('fonts', help='font file to patch', metavar='font', nargs='+') -parser.add_argument('--no-rename', help='don\'t add " for Powerline" to the font name', default=True, action='store_false', dest='rename') -parser.add_argument('--symbol-font', help='font file with symbols', metavar='font', dest='symbol_font', default='{0}/PowerlineSymbols.sfd'.format(sys.path[0])) -parser.add_argument('--fix-mono', help='fixes some mono-fonts which have glyphs of 0 widths', default=False, action='store_true', dest='fixmono') -parser.add_argument('--fix-win', help='modifies font names such that Windows correctly recognizes font families', default=False, action='store_true', dest='fixwin') - -args = parser.parse_args() - -SYM_ATTR = { - # Right/left-aligned glyphs will have their advance width reduced in order to overlap the next glyph slightly - 0x2b60: { 'align': 'c', 'stretch': 'y' , 'overlap': False }, - 0x2b61: { 'align': 'c', 'stretch': '' , 'overlap': False }, - 0x2b62: { 'align': 'r', 'stretch': '' , 'overlap': False }, - 0x2b63: { 'align': 'l', 'stretch': '' , 'overlap': False }, - 0x2b64: { 'align': 'c', 'stretch': '' , 'overlap': False }, - 0x2b80: { 'align': 'l', 'stretch': 'xy', 'overlap': True }, - 0x2b81: { 'align': 'l', 'stretch': 'xy', 'overlap': True }, - 0x2b82: { 'align': 'r', 'stretch': 'xy', 'overlap': True }, - 0x2b83: { 'align': 'r', 'stretch': 'xy', 'overlap': True }, -} - -# Open symbol font -try: - symbols = fontforge.open(args.symbol_font) -except EnvironmentError: - sys.exit(1) - -# Patch provided fonts -for font_path in args.fonts: - try: - font = fontforge.open(font_path) - except EnvironmentError: - sys.exit(1) - - # Rename font - if args.rename: - font.familyname += ' for Powerline' - font.fullname += ' for Powerline' - font.fontname += 'ForPowerline' - font.appendSFNTName('English (US)', 'Preferred Family', font.familyname) - font.appendSFNTName('English (US)', 'Compatible Full', font.fullname) - if args.fixwin: - font.fontname = re.sub(r'\W', '', font.familyname) - - # Force the em size to be equal - symbols.em = font.em - - # Initial font dimensions - font_dim = { - 'xmin' : 0, - 'ymin' : -font.descent, - 'xmax' : 0, - 'ymax' : font.ascent, - - 'width' : 0, - 'height': 0, - } - - # Find the biggest char width and height - # - # 0x00-0x17f is the Latin Extended-A range - # 0x2500-0x2600 is the box drawing range - for glyph in range(0x00, 0x17f) + range(0x2500, 0x2600): - try: - (xmin, ymin, xmax, ymax) = font[glyph].boundingBox() - except TypeError: - continue - - if font_dim['width'] == 0: - font_dim['width'] = font[glyph].width - - if ymin < font_dim['ymin']: font_dim['ymin'] = ymin - if ymax > font_dim['ymax']: font_dim['ymax'] = ymax - if xmax > font_dim['xmax']: font_dim['xmax'] = xmax - - # Calculate font height - font_dim['height'] = abs(font_dim['ymin']) + font_dim['ymax'] - - # Update the font encoding to ensure that the Unicode glyphs are available - font.encoding = 'ISO10646' - - # Fetch this property before adding outlines - onlybitmaps = font.onlybitmaps - - def get_dim(glyph): - bbox = glyph.boundingBox() - - return { - 'xmin' : bbox[0], - 'ymin' : bbox[1], - 'xmax' : bbox[2], - 'ymax' : bbox[3], - - 'width' : bbox[2] + (-bbox[0]), - 'height': bbox[3] + (-bbox[1]), - } - - # Create glyphs from symbol font - for sym_glyph in symbols.glyphs(): - sym_attr = SYM_ATTR[sym_glyph.unicode] - - # Prepare symbol glyph dimensions - sym_dim = get_dim(sym_glyph) - - # Select and copy symbol from its encoding point - symbols.selection.select(sym_glyph.encoding) - symbols.copy() - - # Select and paste symbol to its unicode code point - font.selection.select(sym_glyph.unicode) - font.paste() - - # Now that we have copy/pasted the glyph, it's time to scale and move it - - # Handle glyph stretching - if 'x' in sym_attr['stretch']: - # Stretch the glyph horizontally - scale_ratio = font_dim['width'] / sym_dim['width'] - - font.transform(psMat.scale(scale_ratio, 1)) - if 'y' in sym_attr['stretch']: - # Stretch the glyph vertically - scale_ratio = font_dim['height'] / sym_dim['height'] - - font.transform(psMat.scale(1, scale_ratio)) - - # Use the dimensions from the pasted and stretched glyph - sym_dim = get_dim(font[sym_glyph.unicode]) - - # Center-align the glyph vertically - font_ycenter = font_dim['height'] / 2 - sym_ycenter = sym_dim['height'] / 2 - - # First move it to the ymax (top) - font.transform(psMat.translate(0, font_dim['ymax'] - sym_dim['ymax'])) - - # Then move it the y center difference - font.transform(psMat.translate(0, sym_ycenter - font_ycenter)) - - # Ensure that the glyph doesn't extend outside the font's bounding box - if sym_dim['width'] > font_dim['width']: - # The glyph is too wide, scale it down to fit - scale_matrix = psMat.scale(font_dim['width'] / sym_dim['width'], 1) - - font.transform(scale_matrix) - - # Use the dimensions from the stretched glyph - sym_dim = get_dim(font[sym_glyph.unicode]) - - # Handle glyph alignment - if sym_attr['align'] == 'c': - # Center align - align_matrix = psMat.translate(font_dim['width'] / 2 - sym_dim['width'] / 2 , 0) - elif sym_attr['align'] == 'r': - # Right align - align_matrix = psMat.translate(font_dim['width'] - sym_dim['width'], 0) - else: - # No alignment (left alignment) - align_matrix = psMat.translate(0, 0) - - font.transform(align_matrix) - - if sym_attr['overlap'] is True: - overlap_width = font.em / 48 - - # Stretch the glyph slightly horizontally if it should overlap - font.transform(psMat.scale((sym_dim['width'] + overlap_width) / sym_dim['width'], 1)) - - if sym_attr['align'] == 'l': - # The glyph should be left-aligned, so it must be moved overlap_width to the left - # This only applies to left-aligned glyphs because the glyph is scaled to the right - font.transform(psMat.translate(-overlap_width, 0)) - - # Ensure the font is considered monospaced on Windows - font[sym_glyph.unicode].width = font_dim['width'] - - if font.bitmapSizes and not onlybitmaps: - # If this is an outline font with bitmaps, regenerate bitmaps for the changed glyphs - font.selection.changed() - - for size in font.bitmapSizes: - font.regenBitmaps((size, )) - - output_name, extension = os.path.split(font_path)[1].rsplit('.', 1) - if extension.lower() not in ['ttf', 'otf']: - # Default to OpenType if input is not TrueType/OpenType - extension = 'otf' - if args.fixmono: - for glyph in font.glyphs(): - if glyph.width == 0: glyph.width = font_dim['width'] - - if onlybitmaps: - # Generate BDF font - font.generate('{0}-Powerline.bdf'.format(output_name, bitmap_type='bdf')) - else: - # Generate OTF/TTF font - font.generate('{0}-Powerline.{1}'.format(output_name, extension)) - diff --git a/sources_non_forked/vim-powerline/plugin/Powerline.vim b/sources_non_forked/vim-powerline/plugin/Powerline.vim deleted file mode 100644 index 5454aa49..00000000 --- a/sources_non_forked/vim-powerline/plugin/Powerline.vim +++ /dev/null @@ -1,69 +0,0 @@ -" Powerline - The ultimate statusline utility -" -" Author: Kim Silkebækken -" Source repository: https://github.com/Lokaltog/vim-powerline - -" Script initialization {{{ - if exists('g:Powerline_loaded') || &compatible || version < 702 - finish - endif - - let g:Powerline_loaded = 1 -" }}} -" Commands {{{ - command! PowerlineClearCache call Pl#ClearCache() - command! PowerlineReloadColorscheme call Pl#ReloadColorscheme() -" }}} -" Set default options {{{ - for [s:key, s:value] in items({ - \ 'theme' : 'default' - \ , 'colorscheme' : 'default' - \ , 'symbols' : 'compatible' - \ , 'symbols_override' : {} - \ , 'dividers_override': [] - \ , 'stl_path_style' : 'relative' - \ , 'cache_enabled' : 1 - \ }) - - if ! exists('g:Powerline_' . s:key) - exec printf('let g:Powerline_%s = %s', s:key, string(s:value)) - endif - - unlet! s:key s:value - endfor - - if ! exists('g:Powerline_cache_file') - exec 'let g:Powerline_cache_file = '. string(printf('%s/Powerline_%s_%s_%s.cache' - \ , simplify(expand(':p:h') .'/..') - \ , g:Powerline_theme - \ , g:Powerline_colorscheme - \ , g:Powerline_symbols - \ )) - endif -" }}} -" Autocommands {{{ - function! s:CreateAutocmds() - augroup PowerlineMain - autocmd! - - " Reload statuslines when changing color scheme - autocmd ColorScheme * - \ call Pl#Load() - - autocmd BufEnter,WinEnter,FileType,BufUnload * - \ call Pl#UpdateStatusline(1) - - autocmd BufLeave,WinLeave * - \ call Pl#UpdateStatusline(0) - - autocmd BufWritePost */autoload/Powerline/Colorschemes/*.vim - \ :PowerlineReloadColorscheme - augroup END - endfunction - - augroup PowerlineStartup - autocmd! - - autocmd VimEnter * call s:CreateAutocmds() | call Pl#UpdateStatusline(1) - augroup END -" }}} diff --git a/sources_non_forked/vim-snipmate/README.rst b/sources_non_forked/vim-snipmate/README.rst index 55dae899..26916e6e 100644 --- a/sources_non_forked/vim-snipmate/README.rst +++ b/sources_non_forked/vim-snipmate/README.rst @@ -2,8 +2,17 @@ snipmate.vim ============ +IMPORTANT: comment on: [What about merging whith Ultisnip using its engine](https://github.com/garbas/vim-snipmate/issues/114) +status: snipmate-snippet files are read by Ultisnip flawlessly. See +snipmate-snippets readme about how to configure and use Ultisnips as alternative +That branch also supports completion menu now +Thus there is only one reason left to keep using snipmate from my point of +view: not having python support. +In other words: upstream of snipmate is almost dead. (Better to say Marc Weber is not going to fix any bugs anymore) + + :Author: `Michael Sanders`_ -:Maintainer: `Rok Garbas`_ +:Maintainer: `Adnan Zafar`_ & `Rok Garbas`_ & `Marc Weber`_ :Homepage: http://www.vim.org/scripts/script.php?script_id=2540 :Contributors: `MarcWeber`_, `lilydjwg`_, `henrik`_, `steveno`_, `asymmetric`_, `jherdman`_, `ironcamel`_, `honza`_, `jb55`_, `robhudson`_, `kozo2`_, `MicahElliott`_, `darkwise`_, `redpill`_, `thisgeek`_, `sickill`_, `pose`_, `marutanm`_, `r00k`_, `jbernard`_, `holizz`_, `muffinresearch`_, `statik`_, `taq`_, `alderz`_, `pielgrzym`_ @@ -11,79 +20,46 @@ snipmate.vim .. contents:: -Changelog +ChangeLog ========= -1.0 [Unreleased] ----------------- +0.85 [2013-04-03] +----------------- - * Split snippet files into separate git repository (github/honza/snipmate-snippets). [2011-06-20, `honza`_] - See 'Snippets repository' below. +* Allow trigger key customization +* Enable undoing of snippet expansion +* Support backslash escaping in snippets +* Add support for {VISUAL} +* Expand filetype extension with scope_aliases +* Add expansion guards +* Enable per-buffer expansion of snippets +* Fix 'cpo' compatibility +* Update supertab compatibility +* Enable customization of various things through g:snipMate - * Adding general snippets to ``css.snippets`` and ``htmldjango.snippets`` - [2011-06-10, `pielgrzym`_] +* Disable spelling in snippet files +* Highlight trigger names in .snippets files - * Adding ``css.snippets`` from `tisho`_ - (https://github.com/tisho/css-snippets-snipmate) - [2011-04-17, `garbas`_] +* Update many snippets +* Separate sample snippets into separate repository - * Lots of updates to snippets. - - * Made the trigger key configurable, https://github.com/garbas/vim-snipmate/pull/4. - [2011-04-13, `thenoseman`_] - - * Handle single-line or multiline snippets. - [2011-03-22, `johnbintz`_] - - * If there is only one snippet choose it directly. - [2011-03-16, `blueyed`_] - - * Add snippets file for "diff" filetype and add bang to function - definitons, allowing for reload. - [2011-03-06, `blueyed`_] - - * Update snipmate to handle latest supertab version. - [2011-02-09, `ervandew`_] - - * Updated README: added contributors, instructions how to install snipMate, - some spellchecking of my wonderful English, added this Changelog - [2011-02-07, `garbas`_] - - * Fixed bug: When leaving a placeholder unchanged and trying to jump to the - next placeholder, the text of the first placeholder would get cleared. - [2011-06-16, `jgosmann`_] - - * From below mentioned merges I must specially mention `MarcWeber`_'s patch - which brought quite a few functionalities/improvements: - - snippets are loaded lazily. - - snippets are no longer cached. Thus you always get the snippets you - just wrote to a file without reloading anything. - - When visually selecting a snippet in a .snippets file you can press - to replace spaces by tabs automatically in a smart way. - Big +1 to `MarcWeber`_ for this. Important to note is that we now depend - on `vim-addon-mw-utils`_ and `tlib`_. - [2011-02-02, `garbas`_] - - * Merged pull requests of `MarcWeber`_, `lilydjwg`_, `henrik`_, `steveno`_, - `asymmetric`_, `jherdman`_, `ironcamel`_, `honza`_, `jb55`_, - `robhudson`_, `kozo2`_, `MicahElliott`_, `darkwise`_, `redpill`_, - `thisgeek`_, `sickill`_, `pose`_, - [2011-02-02, `garbas`_] +0.84 +---- +* Unreleased version by `Michael Sanders`_. Available on `GitHub`_. 0.83 [2009-07-13] ----------------- - * last release done by `Michael Sanders`_, you can find it here: - http://www.vim.org/scripts/download_script.php?src_id=11006 +* Last release done by `Michael Sanders`_. Available on `vim.org`_. How to install ============== -Unfortunately there are many ways to how to install vim plugins. If you don't -see your preferred way of installation plugins please consider updating +Unfortunately there are many ways to install vim plugins. If you don't +see your preferred way of installation, please consider updating this section. Basically, installation consists of 2 simple steps: 1. Install vim-snipmate @@ -92,7 +68,7 @@ this section. Basically, installation consists of 2 simple steps: snipmate dependencies ============== -Important to note is that since version 1.0 we depend on this 2 vim plugins: +Important to note is that since version 0.85 we depend on 2 vim plugins: * `vim-addon-mw-utils`_ providing the implementation for caching parsed .snippets files. @@ -106,12 +82,11 @@ Important to note is that since version 1.0 we depend on this 2 vim plugins: Using `VAM`_ (recommended) ------------ -:: +- Add `snipmate-snippets` to the names to be installed. Or use + "github:name/repo" if you want to use a non standard upstream. - Add snipmate-snippets to the names to be installed. Or use - "github:name/repo" if you want to use a non standard upstream. - The default snippets depend on "snipmate" so VAM will fetch the core along - with its dependencies automatically +The default snippets depend on "snipmate" so VAM will fetch the core along +with its dependencies automatically. Using `pathogen`_ -------------------------------------- @@ -126,7 +101,7 @@ Using `pathogen`_ # Install dependencies: % git clone https://github.com/tomtom/tlib_vim.git % git clone https://github.com/MarcWeber/vim-addon-mw-utils.git - % git clone https://github.com/honza/snipmate-snippets.git + % git clone https://github.com/honza/vim-snippets.git Using `Vundle`_ --------------- @@ -136,7 +111,7 @@ Using `Vundle`_ Install dependencies: Bundle "MarcWeber/vim-addon-mw-utils" Bundle "tomtom/tlib_vim" - Bundle "honza/snipmate-snippets" + Bundle "honza/vim-snippets" Install: Bundle "garbas/vim-snipmate" @@ -150,7 +125,7 @@ Manually (not recommended!) :: - % git clone git://github.com/honza/snipmate-snippets.git + % git clone git://github.com/honza/vim-snippets.git % git clone git://github.com/garbas/vim-snipmate.git % cd snipmate.vim % cp -R * ~/.vim @@ -166,20 +141,13 @@ Snippets repository There is now one snippet repo containing almost all snippets. You are encouraged to submit any fixes and new snippets there. -https://github.com/honza/snipmate-snippets +https://github.com/honza/vim-snippets -We also encourage people to maintain sets of snippets for particular use cases. -That all users can benefit from them people can list their snippet repositories here: - - * https://github.com/rbonvall/snipmate-snippets-bib (snippets for BibTeX files) - -Installation using VAM: "github:rbonvall/snipmate-snippets-bib" +More snippet repositories are listed at that repository's README file. Why forking snipMate? ===================== -:: - After several unsuccessful attempts of contacting Michael Sanders, no commits in last half year and long pull request line on github (none of pull requests were commented/replied/rejected) I decided to take action, @@ -197,18 +165,22 @@ Why forking snipMate? Maybe I will only maintain it for a while until Michael Sanders takes things back into his hand or until some other super-hero shows up. - Tnx and happy snipmating, Rok Garbas, 2011-02-02 + Tnx and happy snipmating, Rok Garbas & Marc Weber, 2011-02-02 +related work +============= +See doc/snipMate.txt + Known Bugs ============= - * Set one value default as input of another value. https://github.com/garbas/vim-snipmate/issues/59 [2011-10-18, `bogdan`_] + TODO / Future ============= @@ -230,8 +202,17 @@ TODO / Future If you volunteer tell me so that I can reference the link. [2011-02-02, `MarcWeber`_] + * tcomment claims to know which language mode you're editing in even if its + JS in PHP or HTML within PHP. It would be great if that functionality could be + moved into its own plugirn (vim-detect-language-at-cursor) or such. + Then a lot of the scoped_aliases (which causes collisions easily) could + be enhanced. + + .. _`Michael Sanders`: http://www.vim.org/account/profile.php?user_id=16544 +.. _`Adnan Zafar`: https://github.com/ajzafar .. _`Rok Garbas`: rok@garbas.si +.. _`Marc Weber`: marco-oweber@gmx.de .. _`VAM`: https://github.com/MarcWeber/vim-addon-manager .. _`pathogen`: http://www.vim.org/scripts/script.php?script_id=2332 .. _`vim-addon-mw-utils`: https://github.com/MarcWeber/vim-addon-mw-utils @@ -270,4 +251,6 @@ TODO / Future .. _`tisho`: https://github.com/tisho .. _`pielgrzym`: https://github.com/pielgrzym .. _`jgosmann`: https://github.com/jgosmann -.. _`taq': https://github.com/taq +.. _`taq`: https://github.com/taq +.. _`vim.org`: http://www.vim.org/scripts/script.php?script_id=2540 +.. _`GitHub`: http://github.com/msanders/snipmate.vim diff --git a/sources_non_forked/vim-snipmate/addon-info.json b/sources_non_forked/vim-snipmate/addon-info.json index 66c18c41..94903731 100644 --- a/sources_non_forked/vim-snipmate/addon-info.json +++ b/sources_non_forked/vim-snipmate/addon-info.json @@ -2,8 +2,8 @@ "name" : "snipMate", "version" : "dev", "author" : "Michael Sanders -> original project http://github.com/msanders/snipmate.vim", - "maintainer" : "Marc Weber (I maintain this fork only)", - "repository" : {"type": "git", "url": "git://github.com/MarcWeber/snipMate.vim.git"}, + "maintainer" : "Rok Garbas / Marc Weber", + "repository" : {"type": "git", "url": "git://github.com/garbas/vim-snipmate.git"}, "dependencies" : { "vim-addon-mw-utils": {}, "tlib": {} diff --git a/sources_non_forked/vim-snipmate/after/plugin/snipMate.vim b/sources_non_forked/vim-snipmate/after/plugin/snipMate.vim index 4f51d246..76460826 100644 --- a/sources_non_forked/vim-snipmate/after/plugin/snipMate.vim +++ b/sources_non_forked/vim-snipmate/after/plugin/snipMate.vim @@ -4,6 +4,9 @@ if !exists('loaded_snips') || exists('s:did_snips_mappings') finish endif let s:did_snips_mappings = 1 +" save and reset 'cpo' +let s:save_cpo = &cpo +set cpo&vim " This is put here in the 'after' directory in order for snipMate to override " other plugin mappings (e.g., supertab). @@ -15,13 +18,13 @@ if !exists('g:snips_trigger_key') endif if !exists('g:snips_trigger_key_backwards') - let g:snips_trigger_key_backwards = ']', '', 'g') + let g:snips_trigger_key_backwards = ']', '', 'g') . '>' endif -exec 'ino ' . g:snips_trigger_key . ' u=snipMate#TriggerSnippet()' +exec 'ino ' . g:snips_trigger_key . ' =snipMate#TriggerSnippet()' exec 'snor ' . g:snips_trigger_key . ' i=snipMate#TriggerSnippet()' -exec 'ino ' . g:snips_trigger_key_backwards . '> =snipMate#BackwardsSnippet()' -exec 'snor ' . g:snips_trigger_key_backwards . '> i=snipMate#BackwardsSnippet()' +exec 'ino ' . g:snips_trigger_key_backwards . ' =snipMate#BackwardsSnippet()' +exec 'snor ' . g:snips_trigger_key_backwards . ' i=snipMate#BackwardsSnippet()' exec 'ino ' . g:snips_trigger_key . ' =snipMate#ShowAvailableSnips()' " maybe there is a better way without polluting registers ? @@ -45,4 +48,7 @@ if empty(snippets_dir) finish endif +" restore 'cpo' +let &cpo = s:save_cpo + " vim:noet:sw=4:ts=4:ft=vim diff --git a/sources_non_forked/vim-snipmate/autoload/snipMate.vim b/sources_non_forked/vim-snipmate/autoload/snipMate.vim index 3ea6aab0..db254c30 100644 --- a/sources_non_forked/vim-snipmate/autoload/snipMate.vim +++ b/sources_non_forked/vim-snipmate/autoload/snipMate.vim @@ -10,6 +10,9 @@ catch /.*/ echoe "you're missing tlib. See install instructions at ".expand(':h:h').'/README.rst' endtry +" match $ which doesn't follow a \ +let s:d = '\%([\\]\@ endf fun! snipMate#expandSnip(snip, col) @@ -61,7 +61,7 @@ fun! snipMate#expandSnip(snip, col) if snippet == '' | return '' | endif " Expand snippet onto current position with the tab stops removed - let snipLines = split(substitute(snippet, '$\d\+\|${\d\+.\{-}}', '', 'g'), "\n", 1) + let snipLines = split(substitute(snippet, ''.s:d .'\d\+\|'.s:d .'{\d\+.\{-}}', '', 'g'), "\n", 1) let line = getline(lnum) let afterCursor = strpart(line, col - 1) @@ -86,23 +86,18 @@ fun! snipMate#expandSnip(snip, col) " Open any folds snippet expands into if &fen | sil! exe lnum.','.(lnum + len(snipLines) - 1).'foldopen' | endif - let [g:snipPos, s:snipLen] = s:BuildTabStops(snippet, lnum, col - indent, indent) + let b:snip_state = copy(s:state_proto) + let [b:snip_state.stops, b:snip_state.stop_count] = s:BuildTabStops(snippet, lnum, col - indent, indent) - if s:snipLen - aug snipMateAutocmds - au CursorMovedI * call s:UpdateChangedSnip(0) - au InsertEnter * call s:UpdateChangedSnip(1) + if b:snip_state.stop_count + aug snipmate_changes + au CursorMovedI,InsertEnter call b:snip_state.update_changes() aug END - let s:lastBuf = bufnr(0) " Only expand snippet while in current buffer - let s:curPos = 0 - let s:endCol = g:snipPos[s:curPos][1] - let s:endLine = g:snipPos[s:curPos][0] + call b:snip_state.set_stop(0) - call cursor(g:snipPos[s:curPos][0], g:snipPos[s:curPos][1]) - let s:prevLen = [line('$'), col('$')] - if g:snipPos[s:curPos][2] != -1 | return s:SelectWord() | endif + return b:snip_state.select_word() else - unl g:snipPos s:snipLen + unlet b:snip_state " Place cursor at end of snippet if no tab stop is given let newlines = len(snipLines) - 1 call cursor(lnum + newlines, indent + len(snipLines[-1]) - len(afterCursor) @@ -111,6 +106,18 @@ fun! snipMate#expandSnip(snip, col) return '' endf +" Update state information to correspond to the given tab stop +function! s:state_proto.set_stop(stop) + let self.stop_no = a:stop + let self.cur_stop = self.stops[self.stop_no] + let self.end_col = self.cur_stop[1] + self.cur_stop[2] + let self.start_col = self.cur_stop[1] + call cursor(self.cur_stop[0], self.cur_stop[1]) + let self.prev_len = col('$') + let self.has_vars = exists('self.cur_stop[3]') + let self.old_vars = self.has_vars ? deepcopy(self.cur_stop[3]) : [] +endfunction + " Prepare snippet to be processed by s:BuildTabStops fun! s:ProcessSnippet(snip) let snippet = a:snip @@ -147,16 +154,16 @@ fun! s:ProcessSnippet(snip) " Place all text after a colon in a tab stop after the tab stop " (e.g. "${#:foo}" becomes "${:foo}foo"). " This helps tell the position of the tab stops later. - let snippet = substitute(snippet, '${\d\+:\(.\{-}\)}', '&\1', 'g') + let snippet = substitute(snippet, s:d.'{\d\+:\(.\{-}\)}', '&\1', 'g') " Update the a:snip so that all the $# become the text after " the colon in their associated ${#}. " (e.g. "${1:foo}" turns all "$1"'s into "foo") let i = 1 - while stridx(snippet, '${'.i) != -1 - let s = matchstr(snippet, '${'.i.':\zs.\{-}\ze}') + while snippet =~ s:d.'{'.i + let s = matchstr(snippet, s:d.'{'.i.':\zs.\{-}\ze}') if s != '' - let snippet = substitute(snippet, '$'.i, s.'&', 'g') + let snippet = substitute(snippet, s:d.i, s.'&', 'g') endif let i += 1 endw @@ -184,7 +191,7 @@ endf " (by getting the length of the string between the last "\n" and the " tab stop). " 3.) The length of the text after the colon for the current tab stop -" (e.g. "${1:foo}" would return 3). If there is no text, -1 is returned. +" (e.g. "${1:foo}" would return 3). " 4.) If the "${#:}" construct is given, another list containing all " the matches of "$#", to be replaced with the placeholder. This list is " composed the same way as the parent; the first item is the line number, @@ -193,30 +200,30 @@ fun! s:BuildTabStops(snip, lnum, col, indent) let snipPos = [] let i = 1 let withoutVars = substitute(a:snip, '$\d\+', '', 'g') - while stridx(a:snip, '${'.i) != -1 - let beforeTabStop = matchstr(withoutVars, '^.*\ze${'.i.'\D') - let withoutOthers = substitute(withoutVars, '${\('.i.'\D\)\@!\d\+.\{-}}', '', 'g') + while a:snip =~ s:d.'{'.i + let beforeTabStop = matchstr(withoutVars, '^.*\ze'.s:d .'{'.i.'\D') + let withoutOthers = substitute(withoutVars, ''.s:d .'{\('.i.'\D\)\@!\d\+.\{-}}', '', 'g') let j = i - 1 - call add(snipPos, [0, 0, -1]) + call add(snipPos, [0, 0, 0]) let snipPos[j][0] = a:lnum + s:Count(beforeTabStop, "\n") - let snipPos[j][1] = a:indent + len(matchstr(withoutOthers, '.*\(\n\|^\)\zs.*\ze${'.i.'\D')) + let snipPos[j][1] = a:indent + len(matchstr(withoutOthers, '.*\(\n\|^\)\zs.*\ze'.s:d .'{'.i.'\D')) if snipPos[j][0] == a:lnum | let snipPos[j][1] += a:col | endif " Get all $# matches in another list, if ${#:name} is given - if stridx(withoutVars, '${'.i.':') != -1 - let snipPos[j][2] = len(matchstr(withoutVars, '${'.i.':\zs.\{-}\ze}')) + if withoutVars =~ ''.s:d .'{'.i.':' + let snipPos[j][2] = len(matchstr(withoutVars, ''.s:d .'{'.i.':\zs.\{-}\ze}')) let dots = repeat('.', snipPos[j][2]) call add(snipPos[j], []) - let withoutOthers = substitute(a:snip, '${\d\+.\{-}}\|$'.i.'\@!\d\+', '', 'g') - while match(withoutOthers, '$'.i.'\(\D\|$\)') != -1 - let beforeMark = matchstr(withoutOthers, '^.\{-}\ze'.dots.'$'.i.'\(\D\|$\)') + let withoutOthers = substitute(a:snip, ''.s:d .'{\d\+.\{-}}\|'.s:d .''.i.'\@!\d\+', '', 'g') + while match(withoutOthers, ''.s:d .''.i.'\(\D\|$\)') != -1 + let beforeMark = matchstr(withoutOthers, '^.\{-}\ze'.dots.''.s:d .''.i.'\(\D\|$\)') call add(snipPos[j][3], [0, 0]) let snipPos[j][3][-1][0] = a:lnum + s:Count(beforeMark, "\n") let snipPos[j][3][-1][1] = a:indent + (snipPos[j][3][-1][0] > a:lnum \ ? len(matchstr(beforeMark, '.*\n\zs.*')) \ : a:col + len(beforeMark)) - let withoutOthers = substitute(withoutOthers, '$'.i.'\ze\(\D\|$\)', '', '') + let withoutOthers = substitute(withoutOthers, ''.s:d .''.i.'\ze\(\D\|$\)', '', '') endw endif let i += 1 @@ -224,65 +231,48 @@ fun! s:BuildTabStops(snip, lnum, col, indent) return [snipPos, i - 1] endf -fun! snipMate#jumpTabStop(backwards) - let leftPlaceholder = exists('s:origWordLen') - \ && s:origWordLen != g:snipPos[s:curPos][2] - if leftPlaceholder && exists('s:oldEndCol') - let startPlaceholder = s:oldEndCol + 1 - endif +function! s:state_proto.jump_stop(backwards) + " Update changes just in case + " This seems to be only needed because insert completion does not trigger + " the CursorMovedI event + call self.update_changes() - if exists('s:update') - call s:UpdatePlaceholderTabStops() - else - call s:UpdateTabStops() - endif + " Update stop and var locations + call self.update_stops() - " Don't reselect placeholder if it has been modified - if leftPlaceholder && g:snipPos[s:curPos][2] != -1 - if exists('startPlaceholder') - let g:snipPos[s:curPos][1] = startPlaceholder - else - let g:snipPos[s:curPos][1] = col('.') - let g:snipPos[s:curPos][2] = 0 - endif - endif + " Store the changed col/length of the current stop + let self.cur_stop[1] = self.start_col + let self.cur_stop[2] = self.end_col - self.start_col - let s:curPos += a:backwards ? -1 : 1 + let self.stop_no += a:backwards ? -1 : 1 " Loop over the snippet when going backwards from the beginning - if s:curPos < 0 | let s:curPos = s:snipLen - 1 | endif + if self.stop_no < 0 | let self.stop_no = self.stop_count - 1 | endif - if s:curPos == s:snipLen - let sMode = s:endCol == g:snipPos[s:curPos-1][1]+g:snipPos[s:curPos-1][2] - call s:RemoveSnippet() - return sMode ? "\" : snipMate#TriggerSnippet() + if self.stop_no == self.stop_count + call self.remove() + return -1 endif - call cursor(g:snipPos[s:curPos][0], g:snipPos[s:curPos][1]) + call self.set_stop(self.stop_no) + return self.select_word() +endfunction - let s:endLine = g:snipPos[s:curPos][0] - let s:endCol = g:snipPos[s:curPos][1] - let s:prevLen = [line('$'), col('$')] - - return g:snipPos[s:curPos][2] == -1 ? '' : s:SelectWord() -endf - -fun! s:UpdatePlaceholderTabStops() - let changeLen = s:origWordLen - g:snipPos[s:curPos][2] - unl s:startCol s:origWordLen s:update - if !exists('s:oldVars') | return | endif +" Updates tab stops/vars +function! s:state_proto.update_stops() + let changeLen = self.end_col - self.cur_stop[2] - self.start_col " Update tab stops in snippet if text has been added via "$#" " (e.g., in "${1:foo}bar$1${2}"). if changeLen != 0 let curLine = line('.') - for pos in g:snipPos - if pos == g:snipPos[s:curPos] | continue | endif - let changed = pos[0] == curLine && pos[1] > s:oldEndCol + for pos in self.stops + if pos == self.cur_stop | continue | endif + let changed = pos[0] == curLine && pos[1] > self.start_col let changedVars = 0 let endPlaceholder = pos[2] - 1 + pos[1] " Subtract changeLen from each tab stop that was after any of " the current tab stop's placeholders. - for [lnum, col] in s:oldVars + for [lnum, col] in self.old_vars if lnum > pos[0] | break | endif if pos[0] == lnum if pos[1] > col || (pos[2] == -1 && pos[1] == col) @@ -292,202 +282,95 @@ fun! s:UpdatePlaceholderTabStops() endif endif endfor - let pos[1] -= changeLen * changed - let pos[2] -= changeLen * changedVars " Parse variables within placeholders - " e.g., "${1:foo} ${2:$1bar}" + let pos[1] += changeLen * changed + " Parse variables within placeholders, e.g., "${1:foo} ${2:$1bar}" + let pos[2] += changeLen * changedVars - if pos[2] == -1 | continue | endif " Do the same to any placeholders in the other tab stops. - for nPos in pos[3] - let changed = nPos[0] == curLine && nPos[1] > s:oldEndCol - for [lnum, col] in s:oldVars - if lnum > nPos[0] | break | endif - if nPos[0] == lnum && nPos[1] > col - let changed += 1 - endif + if exists('pos[3]') + for nPos in pos[3] + let changed = nPos[0] == curLine && nPos[1] > self.start_col + for [lnum, col] in self.old_vars + if lnum > nPos[0] | break | endif + if nPos[0] == lnum && nPos[1] > col + let changed += 1 + endif + endfor + let nPos[1] += changeLen * changed endfor - let nPos[1] -= changeLen * changed - endfor - endfor - endif - unl s:endCol s:oldVars s:oldEndCol -endf - -fun! s:UpdateTabStops() - let changeLine = s:endLine - g:snipPos[s:curPos][0] - let changeCol = s:endCol - g:snipPos[s:curPos][1] - if exists('s:origWordLen') - let changeCol -= s:origWordLen - unl s:origWordLen - endif - let lnum = g:snipPos[s:curPos][0] - let col = g:snipPos[s:curPos][1] - " Update the line number of all proceeding tab stops if has - " been inserted. - if changeLine != 0 - let changeLine -= 1 - for pos in g:snipPos - if pos[0] >= lnum - if pos[0] == lnum | let pos[1] += changeCol | endif - let pos[0] += changeLine endif - if pos[2] == -1 | continue | endif - for nPos in pos[3] - if nPos[0] >= lnum - if nPos[0] == lnum | let nPos[1] += changeCol | endif - let nPos[0] += changeLine - endif - endfor - endfor - elseif changeCol != 0 - " Update the column of all proceeding tab stops if text has - " been inserted/deleted in the current line. - for pos in g:snipPos - if pos[1] >= col && pos[0] == lnum - let pos[1] += changeCol - endif - if pos[2] == -1 | continue | endif - for nPos in pos[3] - if nPos[0] > lnum | break | endif - if nPos[0] == lnum && nPos[1] >= col - let nPos[1] += changeCol - endif - endfor endfor endif -endf +endfunction -fun! s:SelectWord() - let s:origWordLen = g:snipPos[s:curPos][2] - let s:oldWord = strpart(getline('.'), g:snipPos[s:curPos][1] - 1, - \ s:origWordLen) - let s:prevLen[1] -= s:origWordLen - if !empty(g:snipPos[s:curPos][3]) - let s:update = 1 - let s:endCol = -1 - let s:startCol = g:snipPos[s:curPos][1] - 1 - endif - if !s:origWordLen | return '' | endif +" Select the placeholder for the current tab stop +function! s:state_proto.select_word() + let len = self.cur_stop[2] + if !len | return '' | endif let l = col('.') != 1 ? 'l' : '' if &sel == 'exclusive' - return "\".l.'v'.s:origWordLen."l\" + return "\".l.'v'.len."l\" endif - return s:origWordLen == 1 ? "\".l.'gh' - \ : "\".l.'v'.(s:origWordLen - 1)."l\" -endf + return len == 1 ? "\".l.'gh' : "\".l.'v'.(len - 1)."l\" +endfunction -" This updates the snippet as you type when text needs to be inserted -" into multiple places (e.g. in "${1:default text}foo$1bar$1", -" "default text" would be highlighted, and if the user types something, -" UpdateChangedSnip() would be called so that the text after "foo" & "bar" -" are updated accordingly) -" -" It also automatically quits the snippet if the cursor is moved out of it -" while in insert mode. -fun! s:UpdateChangedSnip(entering) - if exists('g:snipPos') && bufnr(0) != s:lastBuf - call s:RemoveSnippet() - elseif exists('s:update') " If modifying a placeholder - if !exists('s:oldVars') && s:curPos + 1 < s:snipLen - " Save the old snippet & word length before it's updated - " s:startCol must be saved too, in case text is added - " before the snippet (e.g. in "foo$1${2}bar${1:foo}"). - let s:oldEndCol = s:startCol - let s:oldVars = deepcopy(g:snipPos[s:curPos][3]) - endif - let col = col('.') - 1 +" Update the snippet as text is typed. The self.update_vars() function does +" the actual work. +" If the cursor moves outside of a placeholder, call self.remove() +function! s:state_proto.update_changes() + let change_len = col('$') - self.prev_len + let self.end_col += change_len - if s:endCol != -1 - let changeLen = col('$') - s:prevLen[1] - let s:endCol += changeLen - else " When being updated the first time, after leaving select mode - if a:entering | return | endif - let s:endCol = col - 1 - endif - - " If the cursor moves outside the snippet, quit it - if line('.') != g:snipPos[s:curPos][0] || col < s:startCol || - \ col - 1 > s:endCol - unl! s:startCol s:origWordLen s:oldVars s:update - return s:RemoveSnippet() - endif - - call s:UpdateVars() - let s:prevLen[1] = col('$') - elseif exists('g:snipPos') - if !a:entering && g:snipPos[s:curPos][2] != -1 - let g:snipPos[s:curPos][2] = -2 - endif - - let col = col('.') - let lnum = line('.') - let changeLine = line('$') - s:prevLen[0] - - if lnum == s:endLine - let s:endCol += col('$') - s:prevLen[1] - let s:prevLen = [line('$'), col('$')] - endif - if changeLine != 0 - let s:endLine += changeLine - let s:endCol = col - endif - - " Delete snippet if cursor moves out of it in insert mode - if (lnum == s:endLine && (col > s:endCol || col < g:snipPos[s:curPos][1])) - \ || lnum > s:endLine || lnum < g:snipPos[s:curPos][0] - call s:RemoveSnippet() - endif - endif -endf - -" This updates the variables in a snippet when a placeholder has been edited. -" (e.g., each "$1" in "${1:foo} $1bar $1bar") -fun! s:UpdateVars() - let newWordLen = s:endCol - s:startCol + 1 - let newWord = strpart(getline('.'), s:startCol, newWordLen) - if newWord == s:oldWord || empty(g:snipPos[s:curPos][3]) - return + let col = col('.') + if line('.') != self.cur_stop[0] || col < self.start_col || col > self.end_col + call self.remove() endif - let changeLen = g:snipPos[s:curPos][2] - newWordLen + if self.has_vars + call self.update_vars(change_len) + endif + + let self.prev_len = col('$') +endfunction + +" Actually update the vars for any changed text +function! s:state_proto.update_vars(change) + let newWordLen = self.end_col - self.start_col + let newWord = strpart(getline('.'), self.start_col - 1, newWordLen) + let changeLen = a:change let curLine = line('.') let startCol = col('.') - let oldStartSnip = s:startCol + let oldStartSnip = self.start_col let updateTabStops = changeLen != 0 let i = 0 - for [lnum, col] in g:snipPos[s:curPos][3] + for [lnum, col] in self.cur_stop[3] if updateTabStops - let start = s:startCol + let start = self.start_col if lnum == curLine && col <= start - let s:startCol -= changeLen - let s:endCol -= changeLen + let self.start_col += changeLen + let self.end_col += changeLen endif - for nPos in g:snipPos[s:curPos][3][(i):] + for nPos in self.cur_stop[3][(i):] " This list is in ascending order, so quit if we've gone too far. if nPos[0] > lnum | break | endif if nPos[0] == lnum && nPos[1] > col - let nPos[1] -= changeLen + let nPos[1] += changeLen endif endfor if lnum == curLine && col > start - let col -= changeLen - let g:snipPos[s:curPos][3][i][1] = col + let col += changeLen + let self.cur_stop[3][i][1] = col endif let i += 1 endif - " "Very nomagic" is used here to allow special characters. - call setline(lnum, substitute(getline(lnum), '\%'.col.'c\V'. - \ escape(s:oldWord, '\'), escape(newWord, '\&'), '')) + let theline = getline(lnum) + " subtract -1 to go from column byte index to string byte index + " subtract another -1 to exclude the col'th element + call setline(lnum, theline[0:(col-2)] . newWord . theline[(col+self.end_col-self.start_col-a:change-1):]) endfor - if oldStartSnip != s:startCol - call cursor(0, startCol + s:startCol - oldStartSnip) - endif - - let s:oldWord = newWord - let g:snipPos[s:curPos][2] = newWordLen -endf +endfunction " should be moved to utils or such? fun! snipMate#SetByPath(dict, path, value) @@ -506,7 +389,7 @@ endf fun! snipMate#ReadSnippetsFile(file) let result = [] if !filereadable(a:file) | return result | endif - let r_guard = 'guard\s\+\zs.*' + let r_guard = '^guard\s\+\zs.*' let inSnip = 0 let guard = 1 for line in readfile(a:file) + ["\n"] @@ -565,7 +448,19 @@ endf fun! s:Glob(dir, file) let f = a:dir.a:file if a:dir =~ '\*' || isdirectory(a:dir) - return split(glob(escape(f,"{}")),"\n") + " vim's glob() is somewhat unreliable since it uses the + " user's current shell which may accept different patterns + " (POSIX vs. zsh vs. bash vs. ...). On my system, that + " leads to glob() sometimes returning files that don't + " exist, so filter the returned list to make sure that the + " files really exist in the filesystem. + let res = split(glob(escape(f,"{}")), "\n") + + if !empty(res) + return filter(res, 'filereadable(v:val)') + else + return [] + endif else return filereadable(f) ? [f] : [] endif @@ -650,7 +545,7 @@ fun! snipMate#DefaultPool(scopes, trigger, result) for [f,opts] in items(snipMate#GetSnippetFiles(1, a:scopes, a:trigger)) if opts.type == 'snippets' for [trigger, name, contents, guard] in cached_file_contents#CachedFileContents(f, s:c.read_snippets_cached, 0) - if trigger !~ triggerR | continue | endif + if trigger !~ escape(triggerR,'~') | continue | endif if snipMate#EvalGuard(guard) call snipMate#SetByPath(a:result, [trigger, opts.name_prefix.' '.name], contents) endif @@ -809,23 +704,11 @@ fun! s:ChooseSnippet(snippets) endf fun! snipMate#ShowAvailableSnips() - let line = getline('.') let col = col('.') - let word = matchstr(line, '\S\+\%'.col.'c') - let matchlen = 0 - let matches = [] + let word = matchstr(getline('.'), '\S\+\%'.col.'c') - let snippet_triggers = map(snipMate#GetSnippetsForWordBelowCursor(word, '*', 0),'v:val[0]') - - for trigger in snippet_triggers - if word == '' - let matches += [trigger] " Show all matches if word is empty - elseif trigger =~ '^'.word - let matches += [trigger] - let len = len(word) - if len > matchlen | let matchlen = len | endif - endif - endfor + let snippets = map(snipMate#GetSnippetsForWordBelowCursor(word, '*', 0),'v:val[0]') + let matches = filter(snippets, "v:val =~# '\\V\\^" . escape(word, '\') . "'") " Pretty hacky, but really can't have the tab swallowed! if len(matches) == 0 @@ -833,10 +716,7 @@ fun! snipMate#ShowAvailableSnips() return "" endif - " This is to avoid a bug with Vim when using complete(col - matchlen, matches) - " (Issue#46 on the Google Code snipMate issue tracker). - call setline(line('.'), substitute(line, repeat('.', matchlen).'\%'.col.'c', '', '')) - call complete(col, sort(matches)) + call complete(col - len(word), sort(matches)) return '' endf @@ -870,7 +750,12 @@ fun! snipMate#TriggerSnippet() call feedkeys("\") | return '' endif - if exists('g:snipPos') | return snipMate#jumpTabStop(0) | endif + if exists('b:snip_state') + let jump = b:snip_state.jump_stop(0) + if type(jump) == 1 " returned a string + return jump + endif + endif let word = matchstr(getline('.'), '\S\+\%'.col('.').'c') let list = snipMate#GetSnippetsForWordBelowCursor(word, '', 1) @@ -886,7 +771,8 @@ fun! snipMate#TriggerSnippet() let snippet = s end - let &undolevels = &undolevels " create new undo point + " Before expanding snippet, create new undo point |i_CTRL-G| + let &undolevels = &undolevels let col = col('.') - len(trigger) sil exe 's/\V'.escape(trigger, '/\.').'\%#//' return snipMate#expandSnip(snippet, col) @@ -904,7 +790,7 @@ endf fun! snipMate#BackwardsSnippet() - if exists('g:snipPos') | return snipMate#jumpTabStop(1) | endif + if exists('b:snip_state') | return b:snip_state.jump_stop(1) | endif if exists('g:SuperTabMappingForward') if g:SuperTabMappingForward == "" diff --git a/sources_non_forked/vim-snipmate/doc/snipMate.txt b/sources_non_forked/vim-snipmate/doc/snipMate.txt index 72077b3d..ced9d55f 100644 --- a/sources_non_forked/vim-snipmate/doc/snipMate.txt +++ b/sources_non_forked/vim-snipmate/doc/snipMate.txt @@ -49,6 +49,8 @@ There are some alternatives: - ultisnips (python based) - xptemplate which is probably a much more powerful but also more complex +- neosnippets - which seems to be able to read snippet +files when swiching on compatible mode - (..?) snipmate is not perfect - however it gets its job done perfectly and gets out @@ -113,8 +115,8 @@ The parsed .snippets files are cached. in the current buffer to show a list via. ------------------------------------------------------------------------------- -SNIPPET SOURCES *snippet-sources* +============================================================================== +SNIPPET SOURCES *snipMate-snippet-sources* snipMate is configurable. @@ -178,7 +180,7 @@ More details about all possible relative locations to |rtp| can be found in SYNTAX *snippet-syntax* *snipMate-syntax* Default snippet sources [1], you can add your own as illustrated in -|snippet-sources|. +|snipMate-snippet-sources|. trigger: the snippet's name. |rtp| : Vim's |runtimepath| path list @@ -409,6 +411,7 @@ Perhaps some of these features will be added in a later release. CONTACT *snipMate-contact* *snipMate-author* current maintainers: + - Adnan Zafar - garbas - Marc Weber (marco-oweber@gmx.de) You should consider creating a github ticket or contacting us because the diff --git a/sources_non_forked/vim-snipmate/plugin/snipMate.vim b/sources_non_forked/vim-snipmate/plugin/snipMate.vim index 8de4878a..5dbe0cbc 100644 --- a/sources_non_forked/vim-snipmate/plugin/snipMate.vim +++ b/sources_non_forked/vim-snipmate/plugin/snipMate.vim @@ -1,6 +1,6 @@ " File: snipMate.vim " Author: Michael Sanders -" Version: 0.84 +" Version: 0.85 " Description: snipMate.vim implements some of TextMate's snippets features in " Vim. A snippet is a piece of often-typed text that you can " insert into your document using a trigger word followed by a "". diff --git a/sources_non_forked/snipmate-snippets/AUTHORS b/sources_non_forked/vim-snippets/AUTHORS similarity index 78% rename from sources_non_forked/snipmate-snippets/AUTHORS rename to sources_non_forked/vim-snippets/AUTHORS index 30c65d9e..22a32290 100644 --- a/sources_non_forked/snipmate-snippets/AUTHORS +++ b/sources_non_forked/vim-snippets/AUTHORS @@ -1,3 +1,4 @@ +Aaron Broder Adam Folmert Alberto Pose Angel Alonso @@ -36,3 +37,7 @@ Povilas Balzaravičius Pawka Dmitry Dementev Travis Holton Chrisyue +Erik Westrup + +TODO: add contributors from github.com/SirVer/Ultisnip having contributed to +github.com/SirVer/Ultisnip/UltiSnips/* files diff --git a/sources_non_forked/snipmate-snippets/LICENSE b/sources_non_forked/vim-snippets/LICENSE similarity index 100% rename from sources_non_forked/snipmate-snippets/LICENSE rename to sources_non_forked/vim-snippets/LICENSE diff --git a/sources_non_forked/vim-snippets/README.md b/sources_non_forked/vim-snippets/README.md new file mode 100644 index 00000000..17a73739 --- /dev/null +++ b/sources_non_forked/vim-snippets/README.md @@ -0,0 +1,118 @@ +IMPORTANT: comment on: [What about merging whith Ultisnip using its engine](https://github.com/garbas/vim-snipmate/issues/114) + +Snipmate & UltiSnip Snippets +============================ + +This repository contains snippets files for various programming languages. + +It is community-maintained and many people have contributed snippet files and other +improvements already. + +Contents +======== + + snippets/*: snippets using snipmate format + UltiSnips/*: snippets using UltiSnips format + +Snippet engines +=============== + +There are different forks of snippet engines which allow the user to insert +sippets by typing the name of a snippet hitting the expansion mapping. + + garbas/vim-snipmate [4]: + VimL, snipmate-snippets, engine sometimes behaves strange, supports + rewriting snippets on the fly (eg adding a second version with folding + markers) + + MarcWeber/UltiSnips [6]: + python, snipmate-snippets and UltiSnips-snippets + + SirVer/ultisnips [7]: + python, UltiSnips-snippets + + github.com/Shougo/neosnippet [5]: + viml, has a compatible mode allowing to reuse most snipmate snippets ? + + XPTemplate: + totally different syntax, does not read snippets contained in this file, + but it is also very powerful + + ... there are some more, but they have less features which is why I don't + mention them here + +UltiSnips engine has additional features such as "nested snippets". + +Which one to use? If you have python give MarcWeber/UltiSnips a try because its +fast and supports all important features. You can prefer the UltiSnip versions +of the snippets by setting the "always_use_first_snippet" option to 1. + +If you have VimL only (vim without python support) your best option is using +garbas/vim-snipmate and cope with the minor bugs found in the engine. + +Related repositories +==================== +We also encourage people to maintain sets of snippets for particular use cases +so that all users can benefit from them. People can list their snippet repositories here: + + * https://github.com/rbonvall/snipmate-snippets-bib (snippets for BibTeX files) + * https://github.com/sudar/vim-arduino-snippets (snippets for Arduino files) + * https://github.com/zedr/zope-snipmate-bundle.git (snippets for Python, TAL and ZCML) + * https://github.com/bonsaiben/bootstrap-snippets (snippets for Twitter Bootstrap markup, in HTML and Haml) + +Installation using VAM: "github:rbonvall/snipmate-snippets-bib" + +Historical notes +================ + +[vim-snipmate][1] was originally started by [Michael Sanders][2] who has now +unfortunately abandoned the project. [Rok Garbas][3] is now maintaining a +[fork][4] of the project in hopes of improving the existing code base. + + +Language maintainers +-------------------- + +No one can really be proficient in all programming languages. If you would like +to maintain snippets for a language, please get in touch. + +* Python - [honza](http://github.com/honza) +* Javascript - [honza](http://github.com/honza) +* HTML Django - [honza](http://github.com/honza) +* Markdown - [honza](http://github.com/honza) +* Ruby - [taq](http://github.com/taq) +* PHP - [chrisyue](http://github.com/chrisyue) + +Contributing notes +------------------ + +Until further work is done on `vim-snipmate`, please don't add folding markers +into snippets. `vim-snipmate` has some comments about how to patch all snippets +on the fly adding those. + +Because MarcWeber/UltiSnips [6] supports also snipmate-snippets there is no +need to duplicate all snippets - only those snippets who use advanced UltiSnips +features should be duplicated in UltiSnips (?) + +Currently all snippets from UltiSnips have been put into UltiSnips - some work +on merging should be done (dropping duplicates etc) + +Authors +------- + +For a list of authors, please see the `AUTHORS` files. + +License +------- + +Just as the original snipMate plugin, all the snippets are licensed under the +terms of the MIT license. + + +[1]: http://github.com/garbas/vim-snipmate +[2]: http://github.com/msanders +[3]: http://github.com/garbas +[4]: http://github.com/garbas/vim-snipmate +[5]: http://github.com/Shougo/neosnippet +[6]: http://github.com/MarcWeber/UltiSnips +[7]: http://github.com/SirVer/ultisnips diff --git a/sources_non_forked/vim-snippets/UltiSnips/README b/sources_non_forked/vim-snippets/UltiSnips/README new file mode 100644 index 00000000..eafd0866 --- /dev/null +++ b/sources_non_forked/vim-snippets/UltiSnips/README @@ -0,0 +1,21 @@ +This directory contains the main scripts that come bundled with UltiSnips. + +Standing On The Shoulders of Giants +=================================== + +The snippets have been collected from various other project which I want to +express my gratitude for. My main source for inspiration where the following +two projects: + + TextMate: http://svn.textmate.org/trunk/Bundles/ + SnipMate: http://code.google.com/p/snipmate/ + +All snippets from those sources were copied and cleaned up, so that they are + - not using shell script, only python (so they are cross platform compatible) + - not using any feature that UltiSnips doesn't offer + +UltiSnips has seen contributions by various individuals. Those contributions +have been merged into this collection seamlessly and without further comments. + +-- vim:ft=rst:nospell: + diff --git a/sources_non_forked/vim-snippets/all.snippets b/sources_non_forked/vim-snippets/UltiSnips/all.snippets similarity index 100% rename from sources_non_forked/vim-snippets/all.snippets rename to sources_non_forked/vim-snippets/UltiSnips/all.snippets diff --git a/sources_non_forked/vim-snippets/bindzone.snippets b/sources_non_forked/vim-snippets/UltiSnips/bindzone.snippets similarity index 100% rename from sources_non_forked/vim-snippets/bindzone.snippets rename to sources_non_forked/vim-snippets/UltiSnips/bindzone.snippets diff --git a/sources_non_forked/vim-snippets/c.snippets b/sources_non_forked/vim-snippets/UltiSnips/c.snippets similarity index 89% rename from sources_non_forked/vim-snippets/c.snippets rename to sources_non_forked/vim-snippets/UltiSnips/c.snippets index 532fe173..062a36ae 100644 --- a/sources_non_forked/vim-snippets/c.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/c.snippets @@ -1,8 +1,12 @@ - ########################################################################### # TextMate Snippets # ########################################################################### -snippet def "#ifndef ... #define ... #endif" + +snippet def "#define ..." +#define ${1} +endsnippet + +snippet ifndef "#ifndef ... #define ... #endif" #ifndef ${1/([A-Za-z0-9_]+).*/$1/} #define ${1:SYMBOL} ${2:value} #endif @@ -88,6 +92,17 @@ if (${1:/* condition */}) } endsnippet +snippet ife "if .. else (ife)" +if (${1:/* condition */}) +{ + ${2:/* code */} +} +else +{ + ${3:/* else */} +} +endsnippet + snippet printf "printf .. (printf)" printf("${1:%s}\n"${1/([^%]|%%)*(%.)?.*/(?2:, :\);)/}$2${1/([^%]|%%)*(%.)?.*/(?2:\);)/} endsnippet diff --git a/sources_non_forked/vim-snippets/coffee.snippets b/sources_non_forked/vim-snippets/UltiSnips/coffee.snippets similarity index 100% rename from sources_non_forked/vim-snippets/coffee.snippets rename to sources_non_forked/vim-snippets/UltiSnips/coffee.snippets diff --git a/sources_non_forked/vim-snippets/coffee_jasmine.snippets b/sources_non_forked/vim-snippets/UltiSnips/coffee_jasmine.snippets similarity index 100% rename from sources_non_forked/vim-snippets/coffee_jasmine.snippets rename to sources_non_forked/vim-snippets/UltiSnips/coffee_jasmine.snippets diff --git a/sources_non_forked/vim-snippets/cpp.snippets b/sources_non_forked/vim-snippets/UltiSnips/cpp.snippets similarity index 99% rename from sources_non_forked/vim-snippets/cpp.snippets rename to sources_non_forked/vim-snippets/UltiSnips/cpp.snippets index 9d2eb868..6999c1f9 100644 --- a/sources_non_forked/vim-snippets/cpp.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/cpp.snippets @@ -1,5 +1,3 @@ -extends c - ########################################################################### # TextMate Snippets # ########################################################################### diff --git a/sources_non_forked/vim-snippets/css.snippets b/sources_non_forked/vim-snippets/UltiSnips/css.snippets similarity index 100% rename from sources_non_forked/vim-snippets/css.snippets rename to sources_non_forked/vim-snippets/UltiSnips/css.snippets diff --git a/sources_non_forked/vim-snippets/UltiSnips/d.snippets b/sources_non_forked/vim-snippets/UltiSnips/d.snippets new file mode 100644 index 00000000..8ed9b417 --- /dev/null +++ b/sources_non_forked/vim-snippets/UltiSnips/d.snippets @@ -0,0 +1,583 @@ +# Simple shortcuts + +snippet imp "import (imp)" b +import ${1:std.stdio}; +endsnippet + +snippet pimp "public import (pimp)" b +public import ${1:/*module*/}; +endsnippet + +snippet over "override (over)" b +override ${1:/*function*/} +endsnippet + +snippet al "alias (al)" +alias ${1:/*orig*/} ${2:/*alias*/}; +endsnippet + +snippet mixin "mixin (mixin)" b +mixin ${1:/*mixed_in*/} ${2:/*name*/}; +endsnippet + +snippet new "new (new)" +new ${1}(${2}); +endsnippet + +snippet scpn "@safe const pure nothrow (scpn)" +@safe const pure nothrow +endsnippet + +snippet spn "@safe pure nothrow (spn)" +@safe pure nothrow +endsnippet + +snippet cont "continue (cont)" +continue; +endsnippet + +snippet dis "@disable (dis)" b +@disable ${1:/*method*/}; +endsnippet + +snippet pub "public (pub)" b +public: + ${1:/*members*/} +endsnippet + +snippet priv "private (priv)" b +private: + ${1:/*members*/} +endsnippet + +snippet prot "protected (prot)" b +protected: + ${1:/*members*/} +endsnippet + +snippet pack "package (pack)" b +package: + ${1:/*members*/} +endsnippet + +snippet ret "return (ret)" +return ${1:/*value to return*/}; +endsnippet + +snippet auto "auto (auto)" b +auto ${1:/*variable*/} = ${2:/*value*/}; +endsnippet + +snippet con "const (con)" b +const ${1:/*variable*/} = ${2:/*value*/}; +endsnippet + +snippet siz "size_t (siz)" b +size_t ${1:/*variable*/} = ${2:/*value*/}; +endsnippet + +snippet sup "super (sup)" b +super(${1:/*args*/}); +endsnippet + +# Phobos + +snippet tup "tuple (tup)" +tuple(${1:/*args*/}) +endsnippet + +snippet wr "writeln (wr)" +writeln(${1:/*args*/}); +endsnippet + +snippet to "to (to)" +to!(${1:/*type*/})(${2:/*arg*/}) +endsnippet + +snippet enf "enforce (enf)" b +enforce(${1:/*condition*/}, + new ${2}Exception(${3:/*args*/})); +endsnippet + +# Branches + +snippet if "if .. (if)" +if(${1:/*condition*/}) +{ + ${VISUAL}${0:/*code*/} +} +endsnippet + +snippet ife "if .. else (ife)" b +if(${1:/*condition*/}) +{ + ${2:/*code*/} +} +else +{ + ${3:/*else*/} +} +endsnippet + +snippet el "else (el)" b +else +{ + ${VISUAL}${1:/*code*/} +} +endsnippet + +snippet elif "else if (elif)" b +else if(${1:/*condition*/}) +{ + ${VISUAL}${0:/*code*/} +} +endsnippet + +snippet sw "switch (sw)" +switch(${1:/*var*/}) +{ + case ${2:/*value*/}: + ${3:/*code*/} + break; + case ${4:/*value*/}: + ${5:/*code*/} + break; + ${7:/*more cases*/} + default: + ${6:assert(false);} +} +endsnippet + +snippet fsw "final switch (fsw)" +switch(${1:/*var*/}) +{ + case ${2:/*value*/}: + ${3:/*code*/} + break; + case ${4:/*value*/}: + ${5:/*code*/} + break; + ${7:/*more cases*/} +} +endsnippet + +snippet case "case (case)" b +case ${1:/*value*/}: + ${2:/*code*/} + break; +endsnippet + +snippet ?: "ternary operator (?:)" +${1:/*condition*/} ? ${2:/*then*/} : ${3:/*else*/}$4 +endsnippet + +# Loops + +snippet do "do while (do)" b +do +{ + ${VISUAL}${2:/*code*/} +} while(${1:/*condition*/}); +endsnippet + +snippet wh "while (wh)" b +while(${1:/*condition*/}) +{ + ${VISUAL}${2:/*code*/} +} +endsnippet + +snippet for "for (for)" b +for (${4:size_t} ${2:i} = 0; $2 < ${1:count}; ${3:++$2}) +{ + ${VISUAL}${0:/*code*/} +} +endsnippet + +snippet forever "forever (forever)" b +for(;;) +{ + ${VISUAL}${0:/*code*/} +} +endsnippet + +snippet fore "foreach (fore)" +foreach(${1:/*elem*/}; ${2:/*range*/}) +{ + ${VISUAL}${3:/*code*/} +} +endsnippet + +snippet forif "foreach if (forif)" b +foreach(${1:/*elem*/}; ${2:/*range*/}) if(${3:/*condition*/}) +{ + ${VISUAL}${4:/*code*/} +} +endsnippet + +# Contracts +snippet in "in contract (in)" b +in +{ + assert(${1:/*condition*/}, "${2:error message}"); + ${3} +} +body +endsnippet + +snippet out "out contract (out)" b +out${1:(result)} +{ + assert(${2:/*condition*/}, "${3:error message}"); + ${4} +} +body +endsnippet + +snippet inv "invariant (inv)" b +invariant() +{ + assert(${1:/*condition*/}, "${2:error message}"); + ${3} +} +endsnippet + +# Functions (generic) + +snippet fun "function definition (fun)" +${1:void} ${2:/*function name*/}(${3:/*args*/}) ${4:@safe pure nothrow} +{ + ${VISUAL}${5:/*code*/} +} +endsnippet + +snippet void "void function definition (void)" +void ${1:/*function name*/}(${2:/*args*/}) ${3:@safe pure nothrow} +{ + ${VISUAL}${4:/*code*/} +} +endsnippet + +snippet this "ctor (this)" w +this(${1:/*args*/}) +{ + ${VISUAL}${2:/*code*/} +} +endsnippet + +snippet get "getter property (get)" ! +@property ${1:/*type*/} ${2:/*member_name*/}() const pure nothrow {return ${3:$2_};} +endsnippet + +snippet set "setter property (set)" ! +@property void ${1:/*member_name*/}(${2:/*type*/} rhs) pure nothrow {${3:$1_} = rhs;} +endsnippet + +# Functions (concrete) + +snippet main "Main" b +void main(string[] args) +{ + ${VISUAL}${0: /*code*/} +} +endsnippet + +# Mixins + +snippet signal "signal (signal)" b +mixin Signal!(${1:/*args*/}) ${2:/*name*/}; +endsnippet + +# Scope + +snippet scope "scope (scope)" b +scope(${1:exit}) +{ + ${VISUAL}${2:/*code*/} +} +endsnippet + +# With + +snippet with "with (with)" +with(${1}) +{ + ${VISUAL}${2:/*code*/} +} +endsnippet + +# Exception handling + +snippet try "try/catch (try)" b +try +{ + ${VISUAL}${1:/*code to try*/} +} +catch(${2}Exception e) +{ + ${3:/*handle exception*/} +} +endsnippet + +snippet tryf "try/catch/finally (tryf)" b +try +{ + ${VISUAL}${1:/*code to try*/} +} +catch(${2}Exception e) +{ + ${3:/*handle exception*/} +} +finally +{ + ${4:/*cleanup*/} +} +endsnippet + +snippet catch "catch (catch)" b +catch(${1}Exception e) +{ + ${2:/*handle exception*/} +} +endsnippet + +snippet thr "throw (thr)" +throw new ${1}Exception("${2}"); +endsnippet + + +# Type declarations + +snippet struct "struct (struct)" +struct ${1:`!p snip.rv = (snip.basename or "name")`} +{ + ${2} +} +endsnippet + +snippet union "union (union)" +union ${1:`!p snip.rv = (snip.basename or "name")`} +{ + ${2} +} +endsnippet + +snippet class "class (class)" +class ${1:`!p snip.rv = (snip.basename or "name")`} +{ + ${2} +} +endsnippet + +snippet inter "interface (inter)" +interface ${1:`!p snip.rv = (snip.basename or "name")`} +{ + ${2} +} +endsnippet + +snippet enum "enum (enum)" +enum ${1:`!p snip.rv = (snip.basename or "name")`} +{ + ${2} +} +endsnippet + + +# Exception declarations + +snippet exc "exception declaration (exc)" b +/// ${3:/*documentation*/} +class ${1}Exception : ${2}Exception +{ + public this(string msg, string file = __FILE__, int line = __LINE__) + { + super(msg, file, line); + } +} +endsnippet + + +# Conditional compilation + +snippet version "version (version)" b +version(${1:/*version name*/}) +{ + ${VISUAL}${2:/*code*/} +} +endsnippet + +snippet debug "debug" b +debug +{ + ${VISUAL}${1:/*code*/} +} +endsnippet + + +# Templates + +snippet temp "template (temp)" b +template ${2:/*name*/}(${1:/*args*/}) +{ + ${3:/*code*/} +} +endsnippet + + +# Asserts + +snippet ass "assert (ass)" b +assert(${1:false}, "${2:TODO}"); + +endsnippet + + +# Unittests + +snippet unittest "unittest (unittest)" b +unittest +{ + ${1:/*code*/} +} +endsnippet + + +# Common member functions + +snippet opDis "opDispatch (opDis)" b +${1:/*return type*/} opDispatch(string s)() +{ + ${2:/*code*/}; +} +endsnippet + +snippet op= "opAssign (op=)" b +void opAssign(${1} rhs) ${2:@safe pure nothrow} +{ + ${2:/*code*/} +} +endsnippet + +snippet opCmp "opCmp (opCmp)" b +int opCmp(${1} rhs) @safe const pure nothrow +{ + ${2:/*code*/} +} +endsnippet + +snippet opApply "opApply (opApply)" b +int opApply(int delegate(ref ${1:/*iterated type/s*/}) dg) +{ + int result = 0; + ${2:/*loop*/} + { + result = dg(${3:/*arg/s*/}); + if(result){break;} + } + return result; +} +endsnippet + +snippet toString "toString (toString)" b +string toString() @safe const pure nothrow +{ + ${1:/*code*/} +} +endsnippet + + +# Comments + + +snippet todo "TODO (todo)" ! +// TODO: ${1} +endsnippet + + + +# DDoc + +snippet doc "generic ddoc block (doc)" b +/// ${1:description} +/// +/// ${2:details} +endsnippet + +snippet fdoc "function ddoc block (fdoc)" b +/// ${1:description} +/// +/// ${2:Params: ${3:param} = ${4:param description} +/// ${5}} +/// +/// ${6:Returns: ${7:return value}} +/// +/// ${8:Throws: ${9}Exception ${10}} +endsnippet + +snippet Par "Params (Par)" +Params: ${1:param} = ${2:param description} +/// ${3} +endsnippet + +snippet Ret "Returns (Ret)" +Returns: ${1:return value/s} +endsnippet + +snippet Thr "Throws (Thr)" +Throws: ${1}Exception ${2} +endsnippet + +snippet Example "Examples (Example)" +Examples: +/// -------------------- +/// ${1:example code} +/// -------------------- +endsnippet + + +# License blocks + +snippet gpl "GPL (gpl)" b +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// Copyright (C) ${1:Author}, `!v strftime("%Y")` + +${2} +endsnippet + +snippet boost "Boost (boost)" b +// Copyright ${1:Author} `!v strftime("%Y")`. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +${2} +endsnippet + + +# New module + +snippet module "New module (module)" b +// Copyright ${1:Author} `!v strftime("%Y")`. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +module ${2}.`!v Filename('$1', 'name')`; + + +${3} +endsnippet diff --git a/sources_non_forked/vim-snippets/django.snippets b/sources_non_forked/vim-snippets/UltiSnips/django.snippets similarity index 100% rename from sources_non_forked/vim-snippets/django.snippets rename to sources_non_forked/vim-snippets/UltiSnips/django.snippets diff --git a/sources_non_forked/vim-snippets/erlang.snippets b/sources_non_forked/vim-snippets/UltiSnips/erlang.snippets similarity index 100% rename from sources_non_forked/vim-snippets/erlang.snippets rename to sources_non_forked/vim-snippets/UltiSnips/erlang.snippets diff --git a/sources_non_forked/vim-snippets/eruby.snippets b/sources_non_forked/vim-snippets/UltiSnips/eruby.snippets similarity index 100% rename from sources_non_forked/vim-snippets/eruby.snippets rename to sources_non_forked/vim-snippets/UltiSnips/eruby.snippets diff --git a/sources_non_forked/vim-snippets/go.snippets b/sources_non_forked/vim-snippets/UltiSnips/go.snippets similarity index 100% rename from sources_non_forked/vim-snippets/go.snippets rename to sources_non_forked/vim-snippets/UltiSnips/go.snippets diff --git a/sources_non_forked/vim-snippets/haskell.snippets b/sources_non_forked/vim-snippets/UltiSnips/haskell.snippets similarity index 100% rename from sources_non_forked/vim-snippets/haskell.snippets rename to sources_non_forked/vim-snippets/UltiSnips/haskell.snippets diff --git a/sources_non_forked/vim-snippets/help.snippets b/sources_non_forked/vim-snippets/UltiSnips/help.snippets similarity index 88% rename from sources_non_forked/vim-snippets/help.snippets rename to sources_non_forked/vim-snippets/UltiSnips/help.snippets index bfa7bc05..bd0bb12f 100644 --- a/sources_non_forked/vim-snippets/help.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/help.snippets @@ -4,11 +4,11 @@ global !p def sec_title(snip, t): file_start = snip.fn.split('.')[0] sec_name = t[1].strip("1234567890. ").lower().replace(' ', '-') - return ("*%s-%s*" % (file_start, sec_name)).rjust(77-len(t[1])) + return ("*%s-%s*" % (file_start, sec_name)).rjust(78-len(t[1])) endglobal snippet sec "Section marker" b -============================================================================= +============================================================================== ${1:SECTION}`!p snip.rv = sec_title(snip, t)` $0 diff --git a/sources_non_forked/vim-snippets/html.snippets b/sources_non_forked/vim-snippets/UltiSnips/html.snippets similarity index 84% rename from sources_non_forked/vim-snippets/html.snippets rename to sources_non_forked/vim-snippets/UltiSnips/html.snippets index aa5ebe17..bb074789 100644 --- a/sources_non_forked/vim-snippets/html.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/html.snippets @@ -120,17 +120,9 @@ snippet ! "IE Conditional Comment: NOT Internet Explorer" ${1: IE Conditional Comment: NOT Internet Explorer }$0 endsnippet -########### -# Forms # -########### -snippet form "XHTML
            " - - $0 - -

            -
            -endsnippet - +############# +# HTML TAGS # +############# snippet input "Input with Label" @@ -140,8 +132,9 @@ snippet input "XHTML " endsnippet -snippet textarea "XHTML + +snippet opt "Option" +${3:$2} endsnippet snippet select "Select Box" @@ -152,8 +145,9 @@ snippet select "Select Box" endsnippet -snippet opt "Option" -${3:$2} + +snippet textarea "XHTML endsnippet snippet mailto "XHTML " @@ -165,25 +159,31 @@ snippet base "XHTML " endsnippet snippet body "XHTML " - + $0 endsnippet snippet div "XHTML
            " -${3}
            ${4} + + $0 + +endsnippet + +snippet form "XHTML
            " + + $0 + +

            +
            endsnippet snippet h1 "XHTML

            " -

            ${1}

            ${2} -endsnippet - -snippet h2 "XHTML

            " -

            ${1}

            ${2} -endsnippet - -snippet h3 "XHTML

            " -

            ${1}

            ${2} +

            ${1}

            endsnippet snippet head "XHTML " @@ -208,8 +208,8 @@ endsnippet snippet script "XHTML ${2} + $0 + endsnippet snippet style "XHTML endsnippet -snippet a "Link" w -
            ${4:Anchor Text} +snippet table "XHTML " +
            + + +
            ${5:Header}
            ${0:Data}
            +endsnippet + +snippet a "Link" +${4:Anchor Text} endsnippet snippet p "paragraph" -

            ${1}

            ${2} -endsnippet - -########## -# List # -########## -snippet ul "unordered list" - - ${2} -${3} -endsnippet - -snippet ol "unordered list" - - ${2} -$0 +

            $0

            endsnippet snippet li "list item" -
          • ${1}
          • -li${2} +
          • endsnippet -snippet dl "dl" !b -
            ${1}
            -dl${2} -endsnippet - -snippet . "class" -class="${1}"${2} -endsnippet - -snippet # "id" -id="${1}"${2} -endsnippet - - -########### -# Table # -########### -snippet table "XHTML " - - ${2} -
            ${3} -endsnippet - -snippet thead "XHTML " - - ${1} -${2} -endsnippet - -snippet tbody "XHTML " - - ${1} -${2} -endsnippet - -snippet tfoot "XHTML " - - ${1} -${2} -endsnippet - -snippet tr "table row" -${1} -tr${2} +snippet ul "unordered list" +
              +$0 +
            endsnippet snippet td "table cell" -${1} -td${2} +$0 endsnippet -snippet th "table cell" -${1} -th${2} +snippet tr "table row" +$0 endsnippet snippet title "XHTML " @@ -314,10 +263,6 @@ snippet fieldset "Fieldset" </fieldset> endsnippet -snippet pre "XHTML pre" !b -<pre>${1}</pre>${2} -endsnippet - snippet movie "Embed QT movie (movie)" b <object width="$2" height="$3" classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab"> <param name="src" value="$1"`!p x(snip)`> @@ -332,4 +277,21 @@ snippet movie "Embed QT movie (movie)" b </object> endsnippet +snippet html5 "HTML5 Template" +<!DOCTYPE html> +<html> +<head> + <title>${1} + + + +
            + ${2} +
            +
            + ${4} +
            + + +endsnippet # vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/htmldjango.snippets b/sources_non_forked/vim-snippets/UltiSnips/htmldjango.snippets similarity index 100% rename from sources_non_forked/vim-snippets/htmldjango.snippets rename to sources_non_forked/vim-snippets/UltiSnips/htmldjango.snippets diff --git a/sources_non_forked/vim-snippets/java.snippets b/sources_non_forked/vim-snippets/UltiSnips/java.snippets similarity index 100% rename from sources_non_forked/vim-snippets/java.snippets rename to sources_non_forked/vim-snippets/UltiSnips/java.snippets diff --git a/sources_non_forked/vim-snippets/javascript.snippets b/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets similarity index 100% rename from sources_non_forked/vim-snippets/javascript.snippets rename to sources_non_forked/vim-snippets/UltiSnips/javascript.snippets diff --git a/sources_non_forked/vim-snippets/javascript_jasmine.snippets b/sources_non_forked/vim-snippets/UltiSnips/javascript_jasmine.snippets similarity index 100% rename from sources_non_forked/vim-snippets/javascript_jasmine.snippets rename to sources_non_forked/vim-snippets/UltiSnips/javascript_jasmine.snippets diff --git a/sources_non_forked/vim-snippets/jinja2.snippets b/sources_non_forked/vim-snippets/UltiSnips/jinja2.snippets similarity index 100% rename from sources_non_forked/vim-snippets/jinja2.snippets rename to sources_non_forked/vim-snippets/UltiSnips/jinja2.snippets diff --git a/sources_non_forked/vim-snippets/json.snippets b/sources_non_forked/vim-snippets/UltiSnips/json.snippets similarity index 100% rename from sources_non_forked/vim-snippets/json.snippets rename to sources_non_forked/vim-snippets/UltiSnips/json.snippets diff --git a/sources_non_forked/vim-snippets/lua.snippets b/sources_non_forked/vim-snippets/UltiSnips/lua.snippets similarity index 100% rename from sources_non_forked/vim-snippets/lua.snippets rename to sources_non_forked/vim-snippets/UltiSnips/lua.snippets diff --git a/sources_non_forked/vim-snippets/mako.snippets b/sources_non_forked/vim-snippets/UltiSnips/mako.snippets similarity index 100% rename from sources_non_forked/vim-snippets/mako.snippets rename to sources_non_forked/vim-snippets/UltiSnips/mako.snippets diff --git a/sources_non_forked/vim-snippets/mkd.snippets b/sources_non_forked/vim-snippets/UltiSnips/markdown.snippets similarity index 92% rename from sources_non_forked/vim-snippets/mkd.snippets rename to sources_non_forked/vim-snippets/UltiSnips/markdown.snippets index eebab1ac..c3189b8a 100644 --- a/sources_non_forked/vim-snippets/mkd.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/markdown.snippets @@ -33,11 +33,11 @@ endsnippet ################ # Common stuff # ################ -snippet link "Link to something" +snippet link "Link to something" [${1:${VISUAL:Text}}](${3:http://${2:www.url.com}})$0 endsnippet -snippet img "Link to something" +snippet img "Image" ![${1:pic alt}](${2:path}${3/.+/ "/}${3:opt title}${3/.+/"/})$0 endsnippet diff --git a/sources_non_forked/vim-snippets/objc.snippets b/sources_non_forked/vim-snippets/UltiSnips/objc.snippets similarity index 100% rename from sources_non_forked/vim-snippets/objc.snippets rename to sources_non_forked/vim-snippets/UltiSnips/objc.snippets diff --git a/sources_non_forked/vim-snippets/UltiSnips/ocaml.snippets b/sources_non_forked/vim-snippets/UltiSnips/ocaml.snippets new file mode 100644 index 00000000..8aefef3a --- /dev/null +++ b/sources_non_forked/vim-snippets/UltiSnips/ocaml.snippets @@ -0,0 +1,172 @@ +snippet rs "raise" b +raise (${1:Not_found}) +endsnippet + +snippet open "open" +let open ${1:module} in +${2:e} +endsnippet + +snippet try "try" +try ${1:e} +with ${2:Not_found} -> ${3:()} +endsnippet + +snippet ref "ref" +let ${1:name} = ref ${2:val} in +${3:e} +endsnippet + +snippet matchl "pattern match on a list" +match ${1:list} with +| [] -> ${2:()} +| x::xs -> ${3:()} +endsnippet + +snippet matcho "pattern match on an option type" +match ${1:x} with +| Some(${2:y}) -> ${3:()} +| None -> ${4:()} +endsnippet + +snippet fun "anonymous function" +(fun ${1:x} -> ${2:x}) +endsnippet + +snippet cc "commment" +(* ${1:comment} *) +endsnippet + +snippet let "let .. in binding" +let ${1:x} = ${2:v} in +${3:e} +endsnippet + +snippet lr "let rec" +let rec ${1:f} = + ${2:expr} +endsnippet + +snippet if "if" +if ${1:(* condition *)} then + ${2:(* A *)} +else + ${3:(* B *)} +endsnippet + +snippet If "If" +if ${1:(* condition *)} then + ${2:(* A *)} +endsnippet + +snippet while "while" +while ${1:(* condition *)} do + ${2:(* A *)} +done +endsnippet + +snippet for "for" +for ${1:i} = ${2:1} to ${3:10} do + ${4:(* BODY *)} +done +endsnippet + +snippet match "match" +match ${1:(* e1 *)} with +| ${2:p} -> ${3:e2} +endsnippet + +snippet Match "match" +match ${1:(* e1 *)} with +| ${2:p} -> ${3:e2} +endsnippet + +snippet class "class" +class ${1:name} = object + ${2:methods} +end +endsnippet + +snippet obj "obj" +object + ${2:methods} +end +endsnippet + +snippet Obj "object" +object (self) + ${2:methods} +end +endsnippet + +snippet {{ "object functional update" +{< ${1:x} = ${2:y} >} +endsnippet + +snippet beg "beg" +begin + ${1:block} +end +endsnippet + +snippet ml "module instantiantion with functor" +module ${1:Mod} = ${2:Functor}(${3:Arg}) +endsnippet + +snippet mod "module - no signature" +module ${1:(* Name *)} = struct + ${2:(* BODY *)} +end +endsnippet + +snippet Mod "module with signature" +module ${1:(* Name *)} : ${2:(* SIG *)} = struct + ${3:(* BODY *)} +end +endsnippet + +snippet sig "anonymous signature" +sig + ${2:(* BODY *)} +end +endsnippet + +snippet sigf "functor signature or anonymous functor" +functor (${1:Arg} : ${2:ARG}) -> ${3:(* BODY *)} +endsnippet + +snippet func "define functor - no signature" +module ${1:M} (${2:Arg} : ${3:ARG}) = struct + ${4:(* BODY *)} +end +endsnippet + +snippet Func "define functor - with signature" +module ${1:M} (${2:Arg} : ${3:ARG}) : ${4:SIG} = struct + ${5:(* BODY *)} +end +endsnippet + +snippet mot "Declare module signature" +module type ${1:(* Name *)} = sig + ${2:(* BODY *)} +end +endsnippet + +snippet module "Module with anonymous signature" +module ${1:(* Name *)} : sig + ${2:(* SIGNATURE *)} +end = struct + ${3:(* BODY *)} +end +endsnippet + +snippet oo "odoc" +(** ${1:odoc} *) +endsnippet + +snippet qt "inline qtest" +(*$T ${1:name} + ${2:test} +*) +endsnippet diff --git a/sources_non_forked/vim-snippets/perl.snippets b/sources_non_forked/vim-snippets/UltiSnips/perl.snippets similarity index 100% rename from sources_non_forked/vim-snippets/perl.snippets rename to sources_non_forked/vim-snippets/UltiSnips/perl.snippets diff --git a/sources_non_forked/vim-snippets/UltiSnips/php.snippets b/sources_non_forked/vim-snippets/UltiSnips/php.snippets new file mode 100644 index 00000000..40461d29 --- /dev/null +++ b/sources_non_forked/vim-snippets/UltiSnips/php.snippets @@ -0,0 +1,258 @@ +## Snippets from SnipMate, taken from +## https://github.com/scrooloose/snipmate-snippets.git + +snippet array "array" +$${1:arrayName} = array('${2}' => ${3});${4} +endsnippet + +snippet def "def" +define('${1}'${2});${3} +endsnippet + +snippet do "do" +do { + ${2:// code... } +} while (${1:/* condition */});" +endsnippet + +snippet doc_f "doc_f" +/** + * $2 + * @return ${4:void} + * @author ${5:`!v g:snips_author`} + **/ +${1:public }function ${2:someFunc}(${3}) +{${6} +} +endsnippet + +snippet doc_i "doc_i" +/** + * $1 + * @package ${2:default} + * @author ${3:`!v g:snips_author`} + **/ +interface ${1:someClass} +{${4} +} // END interface $1" +endsnippet + +snippet else "else" +else { + ${1:// code...} +} +endsnippet + +snippet for "for" +for ($${2:i} = 0; $$2 < ${1:count}; $$2${3:++}) { + ${4:// code...} +} +endsnippet + +snippet foreachk "foreachk" +foreach ($${1:variable} as $${2:key} => $${3:value}){ + ${4:// code...} +} +endsnippet + +snippet get "get" +$_GET['${1}']${2} +endsnippet + +snippet if "if" +if (${1:/* condition */}) { + ${2:// code...} +} +endsnippet + +snippet inc "inc" +include '${1:file}';${2} +endsnippet + +snippet log "log" +error_log(var_export(${1}, true));${2} +endsnippet + +snippet post "post" +$_POST['${1}']${2} +endsnippet + +snippet req1 "req1" +require_once '${1:file}';${2} +endsnippet + +snippet session "session" +$_SESSION['${1}']${2} +endsnippet + +snippet t "t" +$${1:retVal} = (${2:condition}) ? ${3:a} : ${4:b};${5} +endsnippet + +snippet var "var" +var_export(${1});${2} +endsnippet + +snippet getter "PHP Class Getter" !b +/* + * Getter for $1 + */ +public function get${1/\w+\s*/\u$0/}() +{ + return $this->$1;$2 +} +$4 +endsnippet + +snippet setter "PHP Class Setter" !b +/* + * Setter for $1 + */ +public function set${1/\w+\s*/\u$0/}($$1) +{ + $this->$1 = $$1;$3 + ${4:return $this;} +} +$0 +endsnippet + +snippet gs "PHP Class Getter Setter" !b +protected $$1 + +/* + * Getter for $1 + */ +public function get${1/\w+\s*/\u$0/}() +{ + return $this->$1;$2 +} + +/* + * Setter for $1 + */ +public function set${1/\w+\s*/\u$0/}($$1) +{ + $this->$1 = $$1;$3 + ${4:return $this;} +} +$0 +endsnippet + +snippet pub "Public function" !b +public function ${1:name}(${2:$param}) +{ + ${VISUAL}${3:return null;} +} +$0 +endsnippet + +snippet pro "Protected function" !b +protected function ${1:name}(${2:$param}) +{ + ${VISUAL}${3:return null;} +} +$0 +endsnippet + +snippet pri "Private function" !b +private function ${1:name}(${2:$param}) +{ + ${VISUAL}${3:return null;} +} +$0 +endsnippet + +snippet pubs "Public static function" !b +public static function ${1:name}(${2:$param}) +{ + ${VISUAL}${3:return null;} +} +$0 +endsnippet + +snippet pros "Protected static function" !b +protected static function ${1:name}(${2:$param}) +{ + ${VISUAL}${3:return null;} +} +$0 +endsnippet + +snippet pris "Private static function" !b +private static function ${1:name}(${2:$param}) +{ + ${VISUAL}${3:return null;} +} +$0 +endsnippet + +snippet fu "Function snip" !b +function ${1:name}(${2:$param}) +{ + ${VISUAL}${3:return null;} +} +$0 +endsnippet +# :vim:ft=snippets + +snippet fore "Foreach loop" +foreach ($${1:variable} as $${3:value}){ + ${VISUAL}${4} +} +$0 +endsnippet + +snippet new "New class instance" !b +$$1 = new $1($2); +$0 +endsnippet + + +snippet ife "if else" +if (${1:/* condition */}) { + ${2:// code...} +} else { + ${3:// code...} +} +$0 +endsnippet + + +snippet class "Class declaration template" !b +/** + * Class ${1:`!p snip.rv=snip.fn.capitalize().split('.')[0]`} + * @author $2 + */ +class $1 +{ + public function ${3:__construct}(${4:$options}) + { + ${4:// code} + } +} +$0 +endsnippet + +snippet pr "Dumb debug helper in HTML" +echo '
            ' . var_export($1, 1) . '
            ';$0 +endsnippet + +snippet pc "Dumb debug helper in cli" +var_export($1);$0 +endsnippet + +# Symfony 2 based snippets +snippet sfa "Symfony 2 Controller action" +/** +* @Route("/${1:route_name}", name="$1") +* @Template() +*/ +public function $1Action($2) +{ + $3 + return ${4:array();}$0 +} +endsnippet + +# :vim:ft=snippets: + diff --git a/sources_non_forked/vim-snippets/puppet.snippets b/sources_non_forked/vim-snippets/UltiSnips/puppet.snippets similarity index 100% rename from sources_non_forked/vim-snippets/puppet.snippets rename to sources_non_forked/vim-snippets/UltiSnips/puppet.snippets diff --git a/sources_non_forked/vim-snippets/python.snippets b/sources_non_forked/vim-snippets/UltiSnips/python.snippets similarity index 98% rename from sources_non_forked/vim-snippets/python.snippets rename to sources_non_forked/vim-snippets/UltiSnips/python.snippets index 462bf20c..a770d2a9 100644 --- a/sources_non_forked/vim-snippets/python.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/python.snippets @@ -368,7 +368,12 @@ endsnippet snippet rwprop "Read write property" b def ${1:property}(): - ${2/.+/(?0:""")/}${2:The RW property $1}${2/.+/(?0:"""\n )/}def fget(self): + ${2/.+/(?0:""")/}${2:The RW property $1}`!p if t[2]: + snip.rv += '"""' + snip >> 1 + snip += "" +else: + snip.rv = ""`def fget(self): return self._$1$0 def fset(self, value): self._$1 = value diff --git a/sources_non_forked/vim-snippets/rails.snippets b/sources_non_forked/vim-snippets/UltiSnips/rails.snippets similarity index 100% rename from sources_non_forked/vim-snippets/rails.snippets rename to sources_non_forked/vim-snippets/UltiSnips/rails.snippets diff --git a/sources_non_forked/vim-snippets/rst.snippets b/sources_non_forked/vim-snippets/UltiSnips/rst.snippets similarity index 100% rename from sources_non_forked/vim-snippets/rst.snippets rename to sources_non_forked/vim-snippets/UltiSnips/rst.snippets diff --git a/sources_non_forked/vim-snippets/ruby.snippets b/sources_non_forked/vim-snippets/UltiSnips/ruby.snippets similarity index 100% rename from sources_non_forked/vim-snippets/ruby.snippets rename to sources_non_forked/vim-snippets/UltiSnips/ruby.snippets diff --git a/sources_non_forked/vim-snippets/sh.snippets b/sources_non_forked/vim-snippets/UltiSnips/sh.snippets similarity index 67% rename from sources_non_forked/vim-snippets/sh.snippets rename to sources_non_forked/vim-snippets/UltiSnips/sh.snippets index 1085d869..915c0df9 100644 --- a/sources_non_forked/vim-snippets/sh.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/sh.snippets @@ -1,15 +1,32 @@ +global !p +import vim + +# Tests for the existence of a variable declared by Vim's filetype detection +# suggesting the type of shell script of the current file +def testShell(scope, shell): + return vim.eval("exists('" + scope + ":is_" + shell + "')") + +# Loops over the possible variables, checking for global variables +# first since they indicate an override by the user. +def getShell(): + for scope in ["g", "b"]: + for shell in ["bash", "sh", "kornshell"]: + if testShell(scope, shell) == "1": + if shell == "kornshell": + return "ksh" + return shell + return "sh" +endglobal ########################################################################### # TextMate Snippets # ########################################################################### snippet #! -#!/bin/sh - +`!p snip.rv = '#!/bin/' + getShell() + "\n\n" ` endsnippet snippet !env "#!/usr/bin/env (!env)" -#!/usr/bin/env bash - +`!p snip.rv = '#!/usr/bin/env ' + getShell() + "\n\n" ` endsnippet snippet temp "Tempfile" diff --git a/sources_non_forked/vim-snippets/snippets.snippets b/sources_non_forked/vim-snippets/UltiSnips/snippets.snippets similarity index 100% rename from sources_non_forked/vim-snippets/snippets.snippets rename to sources_non_forked/vim-snippets/UltiSnips/snippets.snippets diff --git a/sources_non_forked/vim-snippets/tcl.snippets b/sources_non_forked/vim-snippets/UltiSnips/tcl.snippets similarity index 100% rename from sources_non_forked/vim-snippets/tcl.snippets rename to sources_non_forked/vim-snippets/UltiSnips/tcl.snippets diff --git a/sources_non_forked/vim-snippets/tex.snippets b/sources_non_forked/vim-snippets/UltiSnips/tex.snippets similarity index 99% rename from sources_non_forked/vim-snippets/tex.snippets rename to sources_non_forked/vim-snippets/UltiSnips/tex.snippets index d6e62fce..97ea8a82 100644 --- a/sources_non_forked/vim-snippets/tex.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/tex.snippets @@ -1,4 +1,3 @@ -extends texmath ########################################################################### # LATEX SNIPPETS # diff --git a/sources_non_forked/vim-snippets/texmath.snippets b/sources_non_forked/vim-snippets/UltiSnips/texmath.snippets similarity index 100% rename from sources_non_forked/vim-snippets/texmath.snippets rename to sources_non_forked/vim-snippets/UltiSnips/texmath.snippets diff --git a/sources_non_forked/vim-snippets/vim.snippets b/sources_non_forked/vim-snippets/UltiSnips/vim.snippets similarity index 100% rename from sources_non_forked/vim-snippets/vim.snippets rename to sources_non_forked/vim-snippets/UltiSnips/vim.snippets diff --git a/sources_non_forked/vim-snippets/UltiSnips/xhtml.snippets b/sources_non_forked/vim-snippets/UltiSnips/xhtml.snippets new file mode 100644 index 00000000..e69de29b diff --git a/sources_non_forked/vim-snippets/UltiSnips/xml.snippets b/sources_non_forked/vim-snippets/UltiSnips/xml.snippets new file mode 100644 index 00000000..80b017ce --- /dev/null +++ b/sources_non_forked/vim-snippets/UltiSnips/xml.snippets @@ -0,0 +1,9 @@ +snippet t "Simple tag" b +<${1:tag}> + ${2:content} + +endsnippet + +snippet ti "Inline tag" b +<${1:tag}>${2:content} +endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/zsh.snippets b/sources_non_forked/vim-snippets/UltiSnips/zsh.snippets new file mode 100644 index 00000000..80394597 --- /dev/null +++ b/sources_non_forked/vim-snippets/UltiSnips/zsh.snippets @@ -0,0 +1,11 @@ +snippet #! "shebang" ! +#!/bin/zsh + +endsnippet + +snippet !env "#!/usr/bin/env (!env)" ! +#!/usr/bin/env zsh + +endsnippet + +# vim:ft=snippets: diff --git a/sources_non_forked/snipmate-snippets/addon-info.json b/sources_non_forked/vim-snippets/addon-info.json similarity index 93% rename from sources_non_forked/snipmate-snippets/addon-info.json rename to sources_non_forked/vim-snippets/addon-info.json index 1f37bed8..303bf285 100644 --- a/sources_non_forked/snipmate-snippets/addon-info.json +++ b/sources_non_forked/vim-snippets/addon-info.json @@ -4,7 +4,6 @@ "maintainer" : "honza @ github & others", "repository" : {"type": "git", "url": "git://github.com/honza/snipmate-snippets.git"}, "dependencies" : { - "snipmate": {} }, "description" : "community driven set of snippets for snipmate" } diff --git a/sources_non_forked/vim-snippets/pascal.snippets b/sources_non_forked/vim-snippets/pascal.snippets deleted file mode 100644 index 33006269..00000000 --- a/sources_non_forked/vim-snippets/pascal.snippets +++ /dev/null @@ -1,122 +0,0 @@ -snippet cls -clrscr;${1} -endsnippet - -snippet tbg -textbackground(${1});${2} -endsnippet - -snippet tc -textcolor(${1});${2} -endsnippet - -snippet var -${1:varName} := ${2:value}; -endsnippet - -snippet program -program ${1:`!p snip.rv = snip.basename or "ProgramName"`}; -uses crt; - -var - ${2} - -begin -${3} -end. -endsnippet - -snippet bg -begin - ${1} -end${2} -endsnippet - -snippet bg; -begin - ${1} -end;${2} -endsnippet - -snippet rec -type ${1} = record - ${2} -end;${3} -endsnippet - -snippet if -if ${1} then - ${2} -endsnippet - -snippet ife -if ${1} then - ${2} -else - ${3}; -endsnippet - -snippet wrl -writeln(${1});${2} -endsnippet - -snippet wr -write(${1});${2} -endsnippet - -snippet rd -read(${1});${2} -endsnippet - -snippet rdl -readln(${1});${2} -endsnippet - -snippet rdk -readkey;${1} -endsnippet - -snippet gt -gotoxy(${1:0}, ${2:0});${3} -endsnippet - -snippet case -case ${1} of - ${2} -end;${3} -endsnippet - -snippet for -for ${1:i} := ${2:0} to ${3:10} do - ${4} -endsnippet - -snippet wh -while ${1} do - ${2} -endsnippet - -snippet rep -repeat - ${2} -until ${1}; -endsnippet - -snippet fun -function ${1:name} : ${2}; -var - ${3} -begin - ${4} -end; -endsnippet - -snippet pro -procedure ${1:name}; -var - ${2} -begin - ${3} -end; -endsnippet - diff --git a/sources_non_forked/vim-snippets/php.snippets b/sources_non_forked/vim-snippets/php.snippets deleted file mode 100644 index 84f6bb46..00000000 --- a/sources_non_forked/vim-snippets/php.snippets +++ /dev/null @@ -1,236 +0,0 @@ -## Snippets from SnipMate, taken from -## https://github.com/scrooloose/snipmate-snippets.git - - -############## -# Comments # -############## -snippet /* "docblock" -/** - * ${1} - */ -${2} -endsnippet - -snippet doc_f "doc_f" -/** - * $2 - * @return ${4:void} - * @author ${5:`!v g:snips_author`} - **/ -${1:public }function ${2:someFunc}(${3}) -{ - ${6} -}$0 -endsnippet - -snippet doc_i "doc_i" -/** - * $1 - * @package ${2:default} - * @author ${3:`!v g:snips_author`} - **/ -interface ${1:someClass} -{ - ${4} -} // END interface $1" -endsnippet - -########### -# Array # -########### -snippet array "PHP array" -$${1:var} = array(${2});${3} -endsnippet - -snippet key "PHP array key" -'${1}' => ${2} -endsnippet - -############ -# CLasss # -############ -snippet class "PHP class" -/** - * ${1} - */ -class ${2:ClassName} -{ - ${3} - function ${4:__construct}(${5:argument}) - { - ${6:// code...} - } -} -endsnippet - -snippet . "PHP $this->" w -$this->${1:name} -endsnippet - -############################## -# constant # -############################## -snippet def "PHP define" -define('${1}', ${2});${3} -endsnippet - -snippet def? "PHP definied" w -defined('${1}')${2} -endsnippet - -############################## -# ties # -############################## -snippet wh -while (${1:/* condition */}) { - ${2:// code...} -} -endsnippet - -snippet do "PHP do" -do { - ${2:// code... } -} while (${1:/* condition */});" -endsnippet - -snippet foreach "PHP foreach" -foreach ($${1:variable} as $${2:value}){ - ${3:// code...} -} -endsnippet - -snippet foreachk "PHP foreachk" -foreach ($${1:variable} as $${2:key} => $${3:value}){ - ${4:// code...} -} -endsnippet - -snippet for "PHP for" -for ($${2:i} = 0; $$2 < ${1:count}; $$2${3:++}) { - ${4:// code...} -} -endsnippet - -############################## -# condition # -############################## -snippet ife "PHP if else" -if (${1:/* condition */}) { - ${2:// code...} -} -else { - ${3:// code...} -} -${4} -endsnippet - -snippet if "PHP if" -if (${1:/* condition */}) { - ${2:// code...} -} -endsnippet - -snippet el "PHP else" -else { - ${1:// code...} -}${2} -endsnippet - -snippet elf "PHP elseif" -elseif (${1:/* condition */}) { - ${2:// code...} -}${3} -endsnippet - -snippet t "PHP t" -$${1:retVal} = (${2:condition}) ? ${3:a} : ${4:b};${5} -endsnippet - -snippet inc "PHP include" -include '${1:file}';${2} -endsnippet - -snippet inc1 "PHP include_once" -include_once '${1:file}';${2} -endsnippet - -snippet req "PHP require" -require_once '${1:file}';${2} -endsnippet - -snippet req1 "PHP require_once" -require_once '${1:file}';${2} -endsnippet - -snippet log "PHP error_log" -error_log(var_export(${1}, true));${2} -endsnippet - -snippet G "PHP GLOBALS" -$GLOBALS['${1:variable}']${2} -endsnippet - -snippet $_ "PHP COOKIE['...']" -$_COOKIE['${1:variable}']${2} -endsnippet - -snippet $_ "PHP ENV['...']" -$_ENV['${1:variable}']${2} -endsnippet - -snippet $_ "PHP FILES['...']" -$_FILES['${1:variable}']${2} -endsnippet - -snippet $_ "PHP GET['...']" -$_GET['${1:variable}']${2} -endsnippet - -snippet $_ "PHP POST['...']" -$_POST['${1:variable}']${2} -endsnippet - -snippet $_ "PHP REQUEST['...']" -$_REQUEST['${1:variable}']${2} -endsnippet - -snippet $_ "PHP SERVER['...']" -$_SERVER['${1:variable}']${2} -endsnippet - -snippet $_ "PHP SESSION['...']" -$_SESSION['${1:variable}']${2} -endsnippet - -snippet try "PHP try catch" -try { - ${2} -} catch (${1:Exception} $e) { -} -endsnippet - -snippet vare "PHP var_export" -var_export(${1});${2} -endsnippet - -############################## -# write # -############################## -snippet ec "PHP echo" -echo ${1} -endsnippet - -snippet pr "PHP print" -print ${1:$var}; -endsnippet - -snippet prf "PHP printf" -printf('${1:%s}', ${2});${3} -endsnippet - -snippet sprf "PHP sprintf" -sprintf('${1:%s}', ${2});${3} -endsnippet - -# :vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/phtml.snippets b/sources_non_forked/vim-snippets/phtml.snippets deleted file mode 100644 index 73f3b340..00000000 --- a/sources_non_forked/vim-snippets/phtml.snippets +++ /dev/null @@ -1,74 +0,0 @@ -snippet ec "PHTML echo" -${2} -endsnippet - -snippet inc "PHTML include" -${2} -endsnippet - -snippet inc1 "PHTML include_once" -${2} -endsnippet - -snippet req "PHTML require" -${2} -endsnippet - -snippet req1 "PHTML require_once" -${2} -endsnippet - -snippet if "PHTML if" - - ${2:// code...} - -endsnippet - -snippet ife "PHTML if else" - - ${2:// code...} - - ${3:// code...} - -${4} -endsnippet - -snippet el "PHTML else" - -endsnippet - -snippet elf "PHTML elseif" - - ${2:// code...} -endsnippet - -snippet wh "PHTML while" - - ${2:// code...} - -endsnippet - -snippet do "PHTML do" - - ${2:// code... } - -endsnippet - -snippet for "PHTML for" - - ${4: // code...} - -endsnippet - -snippet foreach "PHTML foreach" - - ${3:// code...} - -endsnippet - -snippet foreachk "PHTML foreach $key => $value" - $${3:value}): ?> - ${4:// code...} - -endsnippet - diff --git a/sources_non_forked/snipmate-snippets/snippets/_.snippets b/sources_non_forked/vim-snippets/snippets/_.snippets similarity index 93% rename from sources_non_forked/snipmate-snippets/snippets/_.snippets rename to sources_non_forked/vim-snippets/snippets/_.snippets index 081db1c5..85759848 100644 --- a/sources_non_forked/snipmate-snippets/snippets/_.snippets +++ b/sources_non_forked/vim-snippets/snippets/_.snippets @@ -26,8 +26,7 @@ snippet GPL2 GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + along with this program; if not, see . ${3} snippet LGPL2 @@ -45,8 +44,7 @@ snippet LGPL2 GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License - along with this library; if not, write to the Free Software Foundation, - Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + along with this library; if not, see . ${3} snippet GPL3 @@ -82,8 +80,7 @@ snippet LGPL3 GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License - along with this library; if not, write to the Free Software Foundation, - Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + along with this library; if not, see . ${3} snippet BSD2 @@ -216,12 +213,27 @@ snippet APACHE ${3} snippet BEERWARE - ${1:one line to give the program's name and a brief description} - Copyright `strftime("%Y")` ${2:copyright holder} + ${2:one line to give the program's name and a brief description} + Copyright `strftime("%Y")` ${3:copyright holder} Licensed under the "THE BEER-WARE LICENSE" (Revision 42): ${1:`g:snips_author`} wrote this file. As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer or coffee in return - ${3} + ${4} + +snippet WTFPL + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright `strftime("%Y")` ${1:copyright holder} + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/sources_non_forked/snipmate-snippets/snippets/actionscript.snippets b/sources_non_forked/vim-snippets/snippets/actionscript.snippets similarity index 99% rename from sources_non_forked/snipmate-snippets/snippets/actionscript.snippets rename to sources_non_forked/vim-snippets/snippets/actionscript.snippets index 999b8a30..af9611c3 100644 --- a/sources_non_forked/snipmate-snippets/snippets/actionscript.snippets +++ b/sources_non_forked/vim-snippets/snippets/actionscript.snippets @@ -107,7 +107,7 @@ snippet try ${3} } # For Loop (same as c.snippet) -snippet for +snippet for for (..) {..} for (${2:i} = 0; $2 < ${1:count}; $2${3:++}) { ${4:/* code */} } diff --git a/sources_non_forked/snipmate-snippets/snippets/apache.snippets b/sources_non_forked/vim-snippets/snippets/apache.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/apache.snippets rename to sources_non_forked/vim-snippets/snippets/apache.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/autoit.snippets b/sources_non_forked/vim-snippets/snippets/autoit.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/autoit.snippets rename to sources_non_forked/vim-snippets/snippets/autoit.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/c.snippets b/sources_non_forked/vim-snippets/snippets/c.snippets similarity index 52% rename from sources_non_forked/snipmate-snippets/snippets/c.snippets rename to sources_non_forked/vim-snippets/snippets/c.snippets index 38e8d9eb..de6d6a93 100644 --- a/sources_non_forked/snipmate-snippets/snippets/c.snippets +++ b/sources_non_forked/vim-snippets/snippets/c.snippets @@ -1,38 +1,45 @@ -# main() +## Main +# main snippet main int main(int argc, const char *argv[]) { ${1} return 0; } +# main(void) snippet mainn int main(void) { ${1} return 0; } +## +## Preprocessor # #include <...> snippet inc #include <${1:stdio}.h>${2} # #include "..." snippet Inc #include "${1:`Filename("$1.h")`}"${2} -# #ifndef ... #define ... #endif -snippet Def +# ifndef...define...endif +snippet ndef #ifndef $1 #define ${1:SYMBOL} ${2:value} #endif${3} +# define snippet def #define +# ifdef...endif snippet ifdef #ifdef ${1:FOO} ${2:#define } - #endif + #endif${3} +# if snippet #if #if ${1:FOO} ${2} #endif -# Header Include-Guard +# header include guard snippet once #ifndef ${1:`toupper(Filename('$1_H', 'UNTITLED_H'))`} @@ -41,73 +48,167 @@ snippet once ${2} #endif /* end of include guard: $1 */ -# If Condition +## +## Control Statements +# if snippet if if (${1:/* condition */}) { ${2:/* code */} - } + }${3} +# else snippet el else { ${1} - } -# Ternary conditional + }${2} +# else if +snippet elif + else if (${1:/* condition */}) { + ${2:/* code */} + }${3} +# ternary snippet t ${1:/* condition */} ? ${2:a} : ${3:b} -# Do While Loop -snippet do - do { - ${2:/* code */} - } while (${1:/* condition */}); -# While Loop -snippet wh - while (${1:/* condition */}) { - ${2:/* code */} - } -# For Loop +# switch +snippet switch + switch (${1:/* variable */}) { + case ${2:/* variable case */}: + ${3} + ${4:break;}${5} + default: + ${6} + }${7} +# switch without default +snippet switchndef + switch (${1:/* variable */}) { + case ${2:/* variable case */}: + ${3} + ${4:break;}${5} + }${6} +# case +snippet case + case ${1:/* variable case */}: + ${2} + ${3:break;}${4} +## +## Loops +# for snippet for for (${2:i} = 0; $2 < ${1:count}; $2${3:++}) { ${4:/* code */} - } -# Custom For Loop + }${5} +# for (custom) snippet forr for (${1:i} = ${2:0}; ${3:$1 < 10}; $1${4:++}) { ${5:/* code */} - } -# Function + }${6} +# while +snippet wh + while (${1:/* condition */}) { + ${2:/* code */} + }${3} +# do... while +snippet do + do { + ${2:/* code */} + } while (${1:/* condition */});${3} +## +## Functions +# function definition snippet fun ${1:void} ${2:function_name}(${3}) { ${4:/* code */} - } -# Function Declaration + }${5} +# function declaration snippet fund ${1:void} ${2:function_name}(${3});${4} -# Typedef +## +## Types +# typedef snippet td typedef ${1:int} ${2:MyCustomType};${3} -# Struct +# struct snippet st struct ${1:`Filename('$1_t', 'name')`} { ${2:/* data */} }${3: /* optional variable list */};${4} -# Typedef struct +# typedef struct snippet tds typedef struct ${2:_$1 }{ ${3:/* data */} - } ${1:`Filename('$1_t', 'name')`}; -# Typdef enum + } ${1:`Filename('$1_t', 'name')`};${4} +# typedef enum snippet tde typedef enum { ${1:/* data */} - } ${2:foo}; + } ${2:foo};${3} +## +## Input/Output # printf -# unfortunately version this isn't as nice as TextMates's, given the lack of a -# dynamic `...` snippet pr printf("${1:%s}\n"${2});${3} # fprintf (again, this isn't as nice as TextMate's version, but it works) snippet fpr fprintf(${1:stderr}, "${2:%s}\n"${3});${4} +# getopt +snippet getopt + int choice; + while (1) + { + static struct option long_options[] = + { + /* Use flags like so: + {"verbose", no_argument, &verbose_flag, 'V'}*/ + /* Argument styles: no_argument, required_argument, optional_argument */ + {"version", no_argument, 0, 'v'}, + {"help", no_argument, 0, 'h'}, + ${1} + {0,0,0,0} + }; + + int option_index = 0; + + /* Argument parameters: + no_argument: " " + required_argument: ":" + optional_argument: "::" */ + + choice = getopt_long( argc, argv, "vh", + long_options, &option_index); + + if (choice == -1) + break; + + switch( choice ) + { + case 'v': + ${2} + break; + + case 'h': + ${3} + break; + + case '?': + /* getopt_long will have already printed an error */ + break; + + default: + /* Not sure how to get here... */ + return EXIT_FAILURE; + } + } + + /* Deal with non-option arguments here */ + if ( optind < argc ) + { + while ( optind < argc ) + { + ${4} + } + } +## +## Miscellaneous # This is kind of convenient snippet . [${1}]${2} @@ -125,8 +226,7 @@ snippet gpl * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * along with this program; if not, see . * * Copyright (C) ${1:Author}, `strftime("%Y")` */ diff --git a/sources_non_forked/snipmate-snippets/snippets/chef.snippets b/sources_non_forked/vim-snippets/snippets/chef.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/chef.snippets rename to sources_non_forked/vim-snippets/snippets/chef.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/clojure.snippets b/sources_non_forked/vim-snippets/snippets/clojure.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/clojure.snippets rename to sources_non_forked/vim-snippets/snippets/clojure.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/cmake.snippets b/sources_non_forked/vim-snippets/snippets/cmake.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/cmake.snippets rename to sources_non_forked/vim-snippets/snippets/cmake.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/coffee.snippets b/sources_non_forked/vim-snippets/snippets/coffee.snippets similarity index 93% rename from sources_non_forked/snipmate-snippets/snippets/coffee.snippets rename to sources_non_forked/vim-snippets/snippets/coffee.snippets index dfe3658c..83b77eba 100644 --- a/sources_non_forked/snipmate-snippets/snippets/coffee.snippets +++ b/sources_non_forked/vim-snippets/snippets/coffee.snippets @@ -1,3 +1,8 @@ +# Closure loop +snippet forindo + for ${1:name} in ${2:array} + do ($1) -> + ${3:// body} # Array comprehension snippet fora for ${1:name} in ${2:array} @@ -85,3 +90,6 @@ snippet try # Require snippet req ${2:$1} = require '${1:sys}'${3} +# Export +snippet exp + ${1:root} = exports ? this diff --git a/sources_non_forked/vim-snippets/snippets/cpp.snippets b/sources_non_forked/vim-snippets/snippets/cpp.snippets new file mode 100644 index 00000000..c3e19fe9 --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/cpp.snippets @@ -0,0 +1,131 @@ +## STL Collections +# std::array +snippet array + std::array<${1:T}, ${2:N}> ${3};${4} +# std::vector +snippet vector + std::vector<${1:T}> ${2};${3} +# std::deque +snippet deque + std::deque<${1:T}> ${2};${3} +# std::forward_list +snippet flist + std::forward_list<${1:T}> ${2};${3} +# std::list +snippet list + std::list<${1:T}> ${2};${3} +# std::set +snippet set + std::set<${1:T}> ${2};${3} +# std::map +snippet map + std::map<${1:Key}, ${2:T}> ${3};${4} +# std::multiset +snippet mset + std::multiset<${1:T}> ${2};${3} +# std::multimap +snippet mmap + std::multimap<${1:Key}, ${2:T}> ${3};${4} +# std::unordered_set +snippet uset + std::unordered_set<${1:T}> ${2};${3} +# std::unordered_map +snippet umap + std::unordered_map<${1:Key}, ${2:T}> ${3};${4} +# std::unordered_multiset +snippet umset + std::unordered_multiset<${1:T}> ${2};${3} +# std::unordered_multimap +snippet ummap + std::unordered_multimap<${1:Key}, ${2:T}> ${3};${4} +# std::stack +snippet stack + std::stack<${1:T}> ${2};${3} +# std::queue +snippet queue + std::queue<${1:T}> ${2};${3} +# std::priority_queue +snippet pqueue + std::priority_queue<${1:T}> ${2};${3} +## +## Access Modifiers +# private +snippet pri + private +# protected +snippet pro + protected +# public +snippet pub + public +# friend +snippet fr + friend +# mutable +snippet mu + mutable +## +## Class +# class +snippet cl + class ${1:`Filename('$1', 'name')`} + { + public: + $1(${2}); + ~$1(); + + private: + ${3:/* data */} + }; +# member function implementation +snippet mfun + ${4:void} ${1:`Filename('$1', 'ClassName')`}::${2:memberFunction}(${3}) { + ${5:/* code */} + } +# namespace +snippet ns + namespace ${1:`Filename('', 'my')`} { + ${2} + } /* namespace $1 */ +## +## Input/Output +# std::cout +snippet cout + std::cout << ${1} << std::endl;${2} +# std::cin +snippet cin + std::cin >> ${1};${2} +## +## Iteration +# for i +snippet fori + for (int ${2:i} = 0; $2 < ${1:count}; $2${3:++}) { + ${4:/* code */} + }${5} + +# foreach +snippet fore + for (${1:auto} ${2:i} : ${3:container}) { + ${4:/* code */} + }${5} +# iterator +snippet iter + for (${1:std::vector}<${2:type}>::${3:const_iterator} ${4:i} = ${5:container}.begin(); $4 != $5.end(); ++$4) { + ${6} + }${7} + +# auto iterator +snippet itera + for (auto ${1:i} = $1.begin(); $1 != $1.end(); ++$1) { + ${2:std::cout << *$1 << std::endl;} + }${3} +## +## Lambdas +# lamda (one line) +snippet ld + [${1}](${2}){${3:/* code */}}${4} +# lambda (multi-line) +snippet lld + [${1}](${2}){ + ${3:/* code */} + }${4} diff --git a/sources_non_forked/snipmate-snippets/snippets/cs.snippets b/sources_non_forked/vim-snippets/snippets/cs.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/cs.snippets rename to sources_non_forked/vim-snippets/snippets/cs.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/css.snippets b/sources_non_forked/vim-snippets/snippets/css.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/css.snippets rename to sources_non_forked/vim-snippets/snippets/css.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/dart.snippets b/sources_non_forked/vim-snippets/snippets/dart.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/dart.snippets rename to sources_non_forked/vim-snippets/snippets/dart.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/diff.snippets b/sources_non_forked/vim-snippets/snippets/diff.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/diff.snippets rename to sources_non_forked/vim-snippets/snippets/diff.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/django.snippets b/sources_non_forked/vim-snippets/snippets/django.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/django.snippets rename to sources_non_forked/vim-snippets/snippets/django.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/erlang.snippets b/sources_non_forked/vim-snippets/snippets/erlang.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/erlang.snippets rename to sources_non_forked/vim-snippets/snippets/erlang.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/eruby.snippets b/sources_non_forked/vim-snippets/snippets/eruby.snippets similarity index 98% rename from sources_non_forked/snipmate-snippets/snippets/eruby.snippets rename to sources_non_forked/vim-snippets/snippets/eruby.snippets index be1c7ec4..f96ca846 100644 --- a/sources_non_forked/snipmate-snippets/snippets/eruby.snippets +++ b/sources_non_forked/vim-snippets/snippets/eruby.snippets @@ -81,10 +81,6 @@ snippet fields <% fields_for :${1:model}, @$1 do |${2:f}| %> ${3} <% end %> -snippet ff - <%= form_for @${1:model} do |f| %> - ${2} - <% end %> snippet i18 I18n.t('${1:type.key}')${2} snippet it diff --git a/sources_non_forked/snipmate-snippets/snippets/falcon.snippets b/sources_non_forked/vim-snippets/snippets/falcon.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/falcon.snippets rename to sources_non_forked/vim-snippets/snippets/falcon.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/go.snippets b/sources_non_forked/vim-snippets/snippets/go.snippets similarity index 85% rename from sources_non_forked/snipmate-snippets/snippets/go.snippets rename to sources_non_forked/vim-snippets/snippets/go.snippets index 0e4fe61d..c64db91f 100644 --- a/sources_non_forked/snipmate-snippets/snippets/go.snippets +++ b/sources_non_forked/vim-snippets/snippets/go.snippets @@ -53,8 +53,7 @@ snippet gpl * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * along with this program; if not, see . * * Copyright (C) ${1:Author}, `strftime("%Y")` */ @@ -67,7 +66,7 @@ snippet i snippet im import ( "${1:package}" - ) + )${2} # interface snippet in interface{} @@ -80,12 +79,12 @@ snippet inf snippet if if ${1:/* condition */} { ${2:/* code */} - } + }${2} # else snippet snippet el else { ${1} - } + }${2} # error snippet snippet ir if err != nil { @@ -114,26 +113,37 @@ snippet ie } else { ${3} } + ${4} # for loop snippet fo - for ${2:i} = 0; $2 < ${1:count}; $2${3:++} { + for ${2:i} := 0; $2 < ${1:count}; $2${3:++} { ${4:/* code */} } + ${5} # for range loop snippet fr for ${1:k}, ${2:v} := range ${3} { ${4:/* code */} } + ${5} # function simple snippet fun - func ${1:funcName}(${2}) ${3:os.Error} { + func ${1:funcName}(${2}) ${3:error} { ${4:/* code */} } + ${5} # function on receiver snippet fum - func (self ${1:type}) ${2:funcName}(${3}) ${4:os.Error} { + func (self ${1:type}) ${2:funcName}(${3}) ${4:error} { ${5:/* code */} } + ${6} +# log printf +snippet lf + log.Printf("%${1:s}", ${2:var})${3} +# log printf +snippet lp + log.Println("${1}")${2} # make snippet mk make(${1:[]string}, ${2:0}) @@ -145,6 +155,7 @@ snippet main func main() { ${1:/* code */} } + ${2} # new snippet nw new(${1:type}) @@ -153,7 +164,7 @@ snippet pn panic("${1:msg}") # print snippet pr - fmt.Printf("${1:%s}\n", ${2:var})${3} + fmt.Printf("%${1:s}\n", ${2:var})${3} # range snippet rn range ${1} @@ -180,7 +191,8 @@ snippet sr snippet st struct ${1:name} { ${2:/* data */} - }${4} + } + ${3} # switch snippet sw switch ${1:var} { @@ -192,7 +204,7 @@ snippet sw ${6:/* code */} } snippet sp - fmt.Sprintf("${1:%s}", ${2:var})${3} + fmt.Sprintf("%${1:s}", ${2:var})${3} # true snippet t true diff --git a/sources_non_forked/snipmate-snippets/snippets/haml.snippets b/sources_non_forked/vim-snippets/snippets/haml.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/haml.snippets rename to sources_non_forked/vim-snippets/snippets/haml.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/haskell.snippets b/sources_non_forked/vim-snippets/snippets/haskell.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/haskell.snippets rename to sources_non_forked/vim-snippets/snippets/haskell.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/html.snippets b/sources_non_forked/vim-snippets/snippets/html.snippets similarity index 97% rename from sources_non_forked/snipmate-snippets/snippets/html.snippets rename to sources_non_forked/vim-snippets/snippets/html.snippets index be8b0f65..cfc44ad1 100644 --- a/sources_non_forked/snipmate-snippets/snippets/html.snippets +++ b/sources_non_forked/vim-snippets/snippets/html.snippets @@ -353,11 +353,11 @@ snippet footer ${1} snippet footer. -
            ${2}
            snippet footer# -
            ${2}
            snippet form @@ -445,6 +445,18 @@ snippet xhtml ${1} +snippet html5 + + + + + ${1:`substitute(Filename('', 'Page Title'), '^.', '\u&', '')`} + ${2:meta} + + + ${3:body} + + snippet i ${1} snippet iframe @@ -544,7 +556,7 @@ snippet link snippet link:atom ${2} snippet link:css - ${4} + ${3} snippet link:favicon ${2} snippet link:rss @@ -777,7 +789,7 @@ snippet thead ${1} snippet time - snippet title ${1:`substitute(Filename('', 'Page Title'), '^.', '\u&', '')`} snippet tr diff --git a/sources_non_forked/snipmate-snippets/snippets/htmldjango.snippets b/sources_non_forked/vim-snippets/snippets/htmldjango.snippets similarity index 97% rename from sources_non_forked/snipmate-snippets/snippets/htmldjango.snippets rename to sources_non_forked/vim-snippets/snippets/htmldjango.snippets index 38f836bf..09cf98ec 100644 --- a/sources_non_forked/snipmate-snippets/snippets/htmldjango.snippets +++ b/sources_non_forked/vim-snippets/snippets/htmldjango.snippets @@ -50,6 +50,9 @@ snippet if snippet else {% else %} ${1} +snippet elif + {% elif ${1} %} + ${2} snippet ifchanged {% ifchanged %}${1}{% endifchanged %} snippet ifequal @@ -80,6 +83,8 @@ snippet widthratio {% widthratio ${1:this_value} ${2:max_value} ${3:100} %} snippet with {% with ${1} as ${2} %} + ${3} + {% endwith %} # Template Filters diff --git a/sources_non_forked/snipmate-snippets/snippets/htmltornado.snippets b/sources_non_forked/vim-snippets/snippets/htmltornado.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/htmltornado.snippets rename to sources_non_forked/vim-snippets/snippets/htmltornado.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/java.snippets b/sources_non_forked/vim-snippets/snippets/java.snippets similarity index 97% rename from sources_non_forked/snipmate-snippets/snippets/java.snippets rename to sources_non_forked/vim-snippets/snippets/java.snippets index fb27b9c1..854f14ac 100644 --- a/sources_non_forked/snipmate-snippets/snippets/java.snippets +++ b/sources_non_forked/vim-snippets/snippets/java.snippets @@ -140,7 +140,7 @@ snippet /** * ${1} */ snippet @au - @author `system("grep \`id -un\` /etc/passwd | cut -d \":\" -f5")` + @author `system("grep \`id -un\` /etc/passwd | cut -d \":\" -f5 | cut -d \",\" -f1")` snippet @br @brief ${1:Description} snippet @fi @@ -176,9 +176,9 @@ snippet main ## ## Print Methods snippet print - System.out.print("${1:Message"); + System.out.print("${1:Message}"); snippet printf - System.out.printf("${1:Message", ${2:args}); + System.out.printf("${1:Message}", ${2:args}); snippet println System.out.println(${1}); ## diff --git a/sources_non_forked/snipmate-snippets/snippets/javascript-jquery.snippets b/sources_non_forked/vim-snippets/snippets/javascript-jquery.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/javascript-jquery.snippets rename to sources_non_forked/vim-snippets/snippets/javascript-jquery.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/javascript.snippets b/sources_non_forked/vim-snippets/snippets/javascript.snippets similarity index 82% rename from sources_non_forked/snipmate-snippets/snippets/javascript.snippets rename to sources_non_forked/vim-snippets/snippets/javascript.snippets index de50a0cf..2901587f 100644 --- a/sources_non_forked/snipmate-snippets/snippets/javascript.snippets +++ b/sources_non_forked/vim-snippets/snippets/javascript.snippets @@ -11,12 +11,12 @@ snippet fun } # Anonymous Function snippet f - function(${1}) { + function (${1}) { ${3} }${2:;} # Immediate function snippet (f - (function(${1}) { + (function (${1}) { ${3:/* code */} }(${2})); # if @@ -32,11 +32,11 @@ snippet ife ${3} } # tertiary conditional -snippet t +snippet ter ${1:/* condition */} ? ${2:a} : ${3:b} # switch snippet switch - switch(${1:expression}) { + switch (${1:expression}) { case '${3:case}': ${4:// code} break; @@ -52,13 +52,13 @@ snippet case ${3} # for (...) {...} snippet for - for (var ${2:i} = 0; $2 < ${1:Things}.length; $2${3: += 1}) { - ${4:$1[$2]} + for (var ${2:i} = 0, l = ${1:arr}.length; $2 < l; $2 ++) { + var ${3:v} = $1[$2];${4:} } # for (...) {...} (Improved Native For-Loop) snippet forr - for (var ${2:i} = ${1:Things}.length - 1; $2 >= 0; $2${3: -= 1}) { - ${4:$1[$2]} + for (var ${2:i} = ${1:arr}.length - 1; $2 >= 0; $2 --) { + var ${3:v} = $1[$2];${4:} } # while (...) {...} snippet wh @@ -69,7 +69,7 @@ snippet wh snippet try try { ${1:/* code */} - } catch(${2:e}) { + } catch (${2:e}) { ${3:/* handle error */} } # do...while @@ -79,12 +79,12 @@ snippet do } while (${1:/* condition */}); # Object Method snippet :f - ${1:method_name}: function(${2:attribute}) { + ${1:method_name}: function (${2:attribute}) { ${4} }${3:,} # setTimeout function snippet timeout - setTimeout(function() {${3}}${2}, ${1:10}); + setTimeout(function () {${3}}${2}, ${1:10}); # Get Elements snippet get getElementsBy${1:TagName}('${2}')${3} @@ -129,7 +129,7 @@ snippet sdf $1 = function ($2) { ${4:// main code} }; - } + }; # singleton snippet sing function ${1:Singleton} (${2:argument}) { @@ -154,3 +154,10 @@ snippet sing return instance; } +# Crockford's object function +snippet obj + function object(o) { + function F() {} + F.prototype = o; + return new F(); + } diff --git a/sources_non_forked/vim-snippets/snippets/javascript_jquery.snippets b/sources_non_forked/vim-snippets/snippets/javascript_jquery.snippets new file mode 100644 index 00000000..9b4966db --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/javascript_jquery.snippets @@ -0,0 +1 @@ +javascript-jquery.snippets \ No newline at end of file diff --git a/sources_non_forked/snipmate-snippets/snippets/jsp.snippets b/sources_non_forked/vim-snippets/snippets/jsp.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/jsp.snippets rename to sources_non_forked/vim-snippets/snippets/jsp.snippets diff --git a/sources_non_forked/vim-snippets/snippets/ledger.snippets b/sources_non_forked/vim-snippets/snippets/ledger.snippets new file mode 100644 index 00000000..293d4b65 --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/ledger.snippets @@ -0,0 +1,5 @@ +# Ledger +snippet ent + `strftime("%Y/%m/%d")` ${1:transaction} + ${2:account} ${3:value} + ${4:account} diff --git a/sources_non_forked/snipmate-snippets/snippets/lua.snippets b/sources_non_forked/vim-snippets/snippets/lua.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/lua.snippets rename to sources_non_forked/vim-snippets/snippets/lua.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/make.snippets b/sources_non_forked/vim-snippets/snippets/make.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/make.snippets rename to sources_non_forked/vim-snippets/snippets/make.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/mako.snippets b/sources_non_forked/vim-snippets/snippets/mako.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/mako.snippets rename to sources_non_forked/vim-snippets/snippets/mako.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/markdown.snippets b/sources_non_forked/vim-snippets/snippets/markdown.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/markdown.snippets rename to sources_non_forked/vim-snippets/snippets/markdown.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/objc.snippets b/sources_non_forked/vim-snippets/snippets/objc.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/objc.snippets rename to sources_non_forked/vim-snippets/snippets/objc.snippets diff --git a/sources_non_forked/vim-snippets/snippets/openfoam.snippets b/sources_non_forked/vim-snippets/snippets/openfoam.snippets new file mode 100644 index 00000000..ff690cca --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/openfoam.snippets @@ -0,0 +1,53 @@ +# 0/* +snippet fv + type fixedValue; + value uniform ${1}; +snippet zg + type zeroGradient; +snippet sym + type symmetryPlane; +# system/controlDict +snippet forces + forces + { + type forces; + functionObjectLibs ("libforces.so"); + enabled true; + outputControl ${1:timeStep}; + outputInterval ${2:1}; + patches (${3}); + log ${4:true}; + CofR (${5:0 0 0}); + } +# system/fvSolution +# solvers +snippet gamg + ${1:p} + { + solver GAMG; + tolerance 1e-${2:6}; + relTol ${3:0.0}; + smoother GaussSeidel; + cacheAgglomeration true; + nCellsInCoarsestLevel 10; + agglomerator faceAreaPair; + mergeLevels 1; + } +snippet pbicg + ${1:U} + { + solver PBiCG; + preconditioner DILU; + tolerance 1e-${2:6}; + relTol ${3:0.0}; + } +# PIMPLE +snippet pimple + PIMPLE + { + nOuterCorrectors ${1:outer}; + nCorrectors ${2:inner}; + nNonOrthogonalCorrectors ${3:nonOrtho}; + pRefCell ${4:cell}; + pRefValue ${5:value for $4}; + } diff --git a/sources_non_forked/snipmate-snippets/snippets/perl.snippets b/sources_non_forked/vim-snippets/snippets/perl.snippets similarity index 83% rename from sources_non_forked/snipmate-snippets/snippets/perl.snippets rename to sources_non_forked/vim-snippets/snippets/perl.snippets index 4ba985db..9cebedea 100644 --- a/sources_non_forked/snipmate-snippets/snippets/perl.snippets +++ b/sources_non_forked/vim-snippets/snippets/perl.snippets @@ -79,48 +79,54 @@ snippet for snippet fore ${1:expression} foreach @${2:array};${3} # Package -snippet cl - package ${1:ClassName}; +snippet package + package ${1:`substitute(Filename('', 'Page Title'), '^.', '\u&', '')`}; - use base qw(${2:ParentClass}); + ${2} - sub new { - my $class = shift; - $class = ref $class if ref $class; - my $self = bless {}, $class; - $self; - } + 1; - 1;${3} + __END__ +# Package syntax perl >= 5.14 +snippet packagev514 + package ${1:`substitute(Filename('', 'Page Title'), '^.', '\u&', '')`} ${2:0.99}; + + ${3} + + 1; + + __END__ +#moose +snippet moose + use Moose; + use namespace::autoclean; + ${1:#}BEGIN {extends '${2:ParentClass}'}; + + ${3} +# parent +snippet parent + use parent qw(${1:Parent Class}); # Read File snippet slurp my $${1:var} = do { local $/; open my $file, '<', "${2:file}"; <$file> }; ${3} - - # strict warnings snippet strwar use strict; use warnings; - - -# standard versioning with perlcritic bypass +# older versioning with perlcritic bypass snippet vers ## no critic our $VERSION = '${1:version}'; eval $VERSION; ## use critic - - # new 'switch' like feature snippet switch use feature 'switch'; - - # Anonymous subroutine snippet asub - sub { + sub { ${1:# body } } @@ -133,19 +139,19 @@ snippet begin } # call package function with some parameter -snippet pkgmv +snippet pkgmv __PACKAGE__->${1:package_method}(${2:var}) # call package function without a parameter -snippet pkgm +snippet pkgm __PACKAGE__->${1:package_method}() # call package "get_" function without a parameter -snippet pkget +snippet pkget __PACKAGE__->get_${1:package_method}() # call package function with a parameter -snippet pkgetv +snippet pkgetv __PACKAGE__->get_${1:package_method}(${2:var}) # complex regex @@ -160,10 +166,10 @@ snippet qr/ #given snippet given - given ($${1:var}) { + given ($${1:var}) { ${2:# cases} ${3:# default} - } + } # switch-like case snippet when @@ -176,7 +182,6 @@ snippet hslice @{ ${1:hash} }{ ${2:array} } - # map snippet map map { ${2: body } } ${1: @array } ; @@ -190,7 +195,7 @@ snippet ppod ${1:ClassName} - ${2:ShortDesc} =head1 SYNOPSIS - + use $1; ${3:# synopsis...} @@ -202,7 +207,7 @@ snippet ppod =head1 INTERFACE - + =head1 DEPENDENCIES @@ -223,8 +228,17 @@ snippet psubi =cut +# inline documented subroutine +snippet subpod + =head2 $1 + Summary of $1 + =cut + + sub ${1:subroutine_name} { + ${2:# body...} + } # Subroutine signature snippet parg =over 2 @@ -232,7 +246,7 @@ snippet parg =item Arguments - + =over 3 =item @@ -255,47 +269,21 @@ snippet parg =back - =back -# Moose package -snippet moosecl - package ${1:ClassName}; - - use Moose; - #extends '${2:# ParentClass}'; - - ${6:# body of class} - - 1; - - - __END__ - - =head1 NAME - - $1 - ${3:ShortDesc} - - =head1 SYNOPSIS - - ${4:# synopsis...} - - =head1 DESCRIPTION - - ${5:# longer description...} - - # Moose has snippet has has ${1:attribute} => ( - is => '${2:ro|rw}', + is => '${2:ro|rw}', isa => '${3:Str|Int|HashRef|ArrayRef|etc}', - default => ${4:defaultvalue} - ,${5:# other attributes} + default => sub { + ${4:defaultvalue} + }, + ${5:# other attributes} ); @@ -303,14 +291,14 @@ snippet has snippet override override ${1:attribute} => sub { ${2:# my $self = shift;}; - ${3:# my ($self,$args) = @_;}; + ${3:# my ($self, $args) = @_;}; }; # use test classes snippet tuse use Test::More; - use Test::Deep (); + use Test::Deep; # (); # uncomment to stop prototype errors use Test::Exception; # local test lib @@ -331,7 +319,7 @@ snippet tsub sub t${1:number}_${2:test_case} :Test(${3:num_of_tests}) { my $self = shift; ${4:# body} - + } # Test::Routine-style test @@ -347,6 +335,7 @@ snippet tprep my $self = shift; ${4:# body} } + # cause failures to print stack trace snippet debug_trace use Carp; # 'verbose'; diff --git a/sources_non_forked/snipmate-snippets/snippets/php.snippets b/sources_non_forked/vim-snippets/snippets/php.snippets similarity index 83% rename from sources_non_forked/snipmate-snippets/snippets/php.snippets rename to sources_non_forked/vim-snippets/snippets/php.snippets index 9ce93d47..513ee9b6 100644 --- a/sources_non_forked/snipmate-snippets/snippets/php.snippets +++ b/sources_non_forked/vim-snippets/snippets/php.snippets @@ -39,23 +39,30 @@ snippet m ${7} } # setter method -# I think vim's functions will not be called at the snipMate's runtime -# but `compile` time -# so `tolower` here won't work -# but it would be wonderful if we could make the property and parameter to lower case snippet sm - ${1:public} function set${2:Foo}(${3:$2 }$${4:`tolower('$2')`}) + /** + * Sets the value of ${1:foo} + * + * @param ${2:$1} $$1 ${3:description} + * + * @return ${4:`Filename()`} + */ + ${5:public} function set${6:$2}(${7:$2 }$$1) { - $this->${5:$4} = $$4; - ${6} + $this->${8:$1} = $$1; return $this; - } + }${9} # getter method snippet gm - ${1:public} function get${2:Foo}() + /** + * Gets the value of ${1:foo} + * + * @return ${2:$1} + */ + ${3:public} function get${4:$2}() { - return $this->${3:$2}; - } + return $this->${5:$1}; + }${6} #setter snippet $s ${1:$foo}->set${2:Bar}(${3}); @@ -195,7 +202,7 @@ snippet interface * @package ${3:default} * @author ${4:`g:snips_author`} */ - interface ${1:} + interface ${1:`Filename()`} { ${5} } @@ -204,7 +211,7 @@ snippet class /** * ${1} */ - class ${2:ClassName} + class ${2:`Filename()`} { ${3} /** @@ -215,6 +222,13 @@ snippet class ${8:// code...} } } +snippet nc + namespace ${1:`substitute(substitute(expand("%:h"), '\v^\w+\/(\u)', '\1', ''), '\/', '\\\', 'g')`}; + + ${2:abstract }class ${3:`Filename()`} + { + ${4} + } # define(...) snippet def define('${1}'${2});${3} @@ -322,25 +336,46 @@ snippet http_redirect header ("Location: ".URL); exit(); # Getters & Setters -snippet getset +snippet gs /** - * Gets the value of ${1:} + * Gets the value of ${1:foo} * - * @return ${2} + * @return ${2:$1} */ - public function get$1() + public function get${3:$2}() { - return $this->$1; + return $this->${4:$1}; } /** * Sets the value of $1 * - * @param mixed $$1 ${3} + * @param $2 $$1 ${5:description} + * + * @return ${6:`Filename()`} */ - public function set$1($$1) + public function set$3(${7:$2 }$$1) { - $this->$1 = $$1; + $this->$4 = $$1; + return $this; + }${8} +# anotation, get, and set, useful for doctrine +snippet ags + /** + * ${1:description} + * + * @${7} + */ + ${2:protected} $${3:foo}; + + public function get${4:$3}() + { + return $this->$3; + } + + public function set$4(${5:$4 }$${6:$3}) + { + $this->$3 = $$6; return $this; } snippet rett diff --git a/sources_non_forked/vim-snippets/snippets/plsql.snippets b/sources_non_forked/vim-snippets/snippets/plsql.snippets new file mode 100644 index 00000000..dba25eee --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/plsql.snippets @@ -0,0 +1,109 @@ +# create package spec +snippet ps + create or replace package ${1:name} + as + ${2:-- spec} + end; -- end of package spec $1 +# create package body +snippet pb + create or replace package body ${1:name} + as + ${2:-- body} + end; -- end of package body $1; +# package procedure spec +snippet pps + procedure ${1:name}(${2:args}); +# package procedure body +snippet ppb + procedure ${1:name}(${2:args}) + as + begin + ${3:-- body} + end $2; +# package function spec +snippet pfs + function ${1:name}(${2:args}) + return ${3:type}; +# package function body +snippet pfb + function ${1:name}(${2:args}) + return ${3:type} + as + l_res $3; + begin + ${4:-- body}; + return l_res; + end $1; +# snow errors +snippet err + show errors; +# proc/func in parameter +snippet p + ${1:name} ${2:in} ${3:type} ${4: := null} +# package type: record +snippet tr + type tr_${1:name} is record (${2:/* columns */}); +# package type: nested table +snippet tt + type tt_${1:name} is table of tr_${2:name}; +# package type: indexed table +snippet tti + type tt_${1:name} is table of tr_${2:name} index by binary_integer; +# proc/func comment +snippet doc + /* + * ${1: comment ...} + */ +# plsql block +snippet beg + begin + ${1} + end; +# plsql block with declare part +snippet dec + declare + ${1} + begin + ${2} + end; +# return pipe row +snippet rpipe + for ${1:i} in 1 .. ${2:l_res}.count loop + pipe row( $2($1) ); + end loop; + return; +# bulk collect +snippet bc + bulk collect into ${1} +# local variable +snippet l + l_${1} ${2:number}; +# output +snippet log + dbms_output.put_line('${1}'); +# for loop +snippet for + for ${1:i} in ${2:1}..${3:42} loop + ${3} + end loop; +# for loop with select +snippet fors + for ${1:rec} in (${2: select}) loop + ${3} + end loop; +# for loop with collection +snippet forc + for ${1:i} in ${2:l_var}.first .. $2.last loop + ${3: -- dbms_output.put_line($2($1)); } + end loop; +# if +snippet if + if ${1} then + ${2} + end if; +snippet ife + if ${1} then + ${2} + else + ${3} + end if; diff --git a/sources_non_forked/snipmate-snippets/snippets/po.snippets b/sources_non_forked/vim-snippets/snippets/po.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/po.snippets rename to sources_non_forked/vim-snippets/snippets/po.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/processing.snippets b/sources_non_forked/vim-snippets/snippets/processing.snippets old mode 100755 new mode 100644 similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/processing.snippets rename to sources_non_forked/vim-snippets/snippets/processing.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/progress.snippets b/sources_non_forked/vim-snippets/snippets/progress.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/progress.snippets rename to sources_non_forked/vim-snippets/snippets/progress.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/puppet.snippets b/sources_non_forked/vim-snippets/snippets/puppet.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/puppet.snippets rename to sources_non_forked/vim-snippets/snippets/puppet.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/python.snippets b/sources_non_forked/vim-snippets/snippets/python.snippets similarity index 66% rename from sources_non_forked/snipmate-snippets/snippets/python.snippets rename to sources_non_forked/vim-snippets/snippets/python.snippets index b3b1e9b2..9cb21135 100644 --- a/sources_non_forked/snipmate-snippets/snippets/python.snippets +++ b/sources_non_forked/vim-snippets/snippets/python.snippets @@ -6,23 +6,25 @@ snippet from from ${1:package} import ${2:module} # Module Docstring snippet docs - ''' + """ File: ${1:`Filename('$1.py', 'foo.py')`} - Author: ${2:`g:snips_author`} - Description: ${3} - ''' + Author: `g:snips_author` + Email: `g:snips_email` + Github: `g:snips_github` + Description: ${2} + """ snippet wh while ${1:condition}: - ${2:# code...} + ${2:# TODO: write code...} # dowh - does the same as do...while in other languages snippet dowh while True: - ${1:# code...} + ${1:# TODO: write code...} if ${2:condition}: break snippet with with ${1:expr} as ${2:var}: - ${3:# code...} + ${3:# TODO: write code...} # New Class snippet cl class ${1:ClassName}(${2:object}): @@ -35,14 +37,14 @@ snippet cl snippet def def ${1:fname}(${2:`indent('.') ? 'self' : ''`}): """${3:docstring for $1}""" - ${4:pass} + ${4:# TODO: write code...} snippet deff def ${1:fname}(${2:`indent('.') ? 'self' : ''`}): - ${3} + ${3:# TODO: write code...} # New Method snippet defs def ${1:mname}(self, ${2:arg}): - ${3:pass} + ${3:# TODO: write code...} # New Property snippet property def ${1:foo}(): @@ -51,20 +53,24 @@ snippet property ${3:return self._$1} def fset(self, value): ${4:self._$1 = value} + def fdel(self): + ${5:del self._$1} + return locals() + $1 = property(**$1()) # Ifs snippet if if ${1:condition}: - ${2:code...} + ${2:# TODO: write code...} snippet el else: - ${1:code...} + ${1:# TODO: write code...} snippet ei elif ${1:condition}: - ${2:code...} + ${2:# TODO: write code...} # For snippet for for ${1:item} in ${2:items}: - ${3:code...} + ${3:# TODO: write code...} # Encodes snippet cutf8 # -*- coding: utf-8 -*- @@ -79,32 +85,32 @@ snippet . self. snippet try Try/Except try: - ${1:pass} + ${1:# TODO: write code...} except ${2:Exception}, ${3:e}: ${4:raise $3} snippet try Try/Except/Else try: - ${1:pass} + ${1:# TODO: write code...} except ${2:Exception}, ${3:e}: ${4:raise $3} else: - ${5:pass} + ${5:# TODO: write code...} snippet try Try/Except/Finally try: - ${1:pass} + ${1:# TODO: write code...} except ${2:Exception}, ${3:e}: ${4:raise $3} finally: - ${5:pass} + ${5:# TODO: write code...} snippet try Try/Except/Else/Finally try: - ${1:pass} + ${1:# TODO: write code...} except ${2:Exception}, ${3:e}: ${4:raise $3} else: - ${5:pass} + ${5:# TODO: write code...} finally: - ${6:pass} + ${6:# TODO: write code...} # if __name__ == '__main__': snippet ifmain if __name__ == '__main__': @@ -130,12 +136,29 @@ snippet " # test function/method snippet test def test_${1:description}(${2:`indent('.') ? 'self' : ''`}): - ${3:pass} + ${3:# TODO: write code...} # test case snippet testcase class ${1:ExampleCase}(unittest.TestCase): def test_${2:description}(self): - ${3:pass} + ${3:# TODO: write code...} snippet fut from __future__ import ${1} +#getopt +snippet getopt + try: + # Short option syntax: "hv:" + # Long option syntax: "help" or "verbose=" + opts, args = getopt.getopt(sys.argv[1:], "${1:short_options}", [${2:long_options}]) + + except getopt.GetoptError, err: + # Print debug info + print str(err) + ${3:error_action} + + for option, argument in opts: + if option in ("-h", "--help"): + ${4} + elif option in ("-v", "--verbose"): + verbose = argument diff --git a/sources_non_forked/snipmate-snippets/snippets/r.snippets b/sources_non_forked/vim-snippets/snippets/r.snippets similarity index 77% rename from sources_non_forked/snipmate-snippets/snippets/r.snippets rename to sources_non_forked/vim-snippets/snippets/r.snippets index 909e70d9..71186e35 100644 --- a/sources_non_forked/snipmate-snippets/snippets/r.snippets +++ b/sources_non_forked/vim-snippets/snippets/r.snippets @@ -93,3 +93,29 @@ snippet ma maply(${1:matrix}, ${2:function}) snippet m_ m_ply(${1:matrix}, ${2:function}) + +# plot functions +snippet pl + plot(${1:x}, ${2:y}) +snippet ggp + ggplot(${1:data}, aes(${2:aesthetics})) +snippet img + ${1:(jpeg,bmp,png,tiff)}(filename="${2:filename}", width=${3}, height=${4}, unit="${5}") + ${6:plot} + dev.off() + +# statistical test functions +snippet fis + fisher.test(${1:x}, ${2:y}) +snippet chi + chisq.test(${1:x}, ${2:y}) +snippet tt + t.test(${1:x}, ${2:y}) +snippet wil + wilcox.test(${1:x}, ${2:y}) +snippet cor + cor.test(${1:x}, ${2:y}) +snippet fte + var.test(${1:x}, ${2:y}) +snippet kvt + kv.test(${1:x}, ${2:y}) diff --git a/sources_non_forked/snipmate-snippets/snippets/rst.snippets b/sources_non_forked/vim-snippets/snippets/rst.snippets similarity index 69% rename from sources_non_forked/snipmate-snippets/snippets/rst.snippets rename to sources_non_forked/vim-snippets/snippets/rst.snippets index d31a13ff..97845de3 100644 --- a/sources_non_forked/snipmate-snippets/snippets/rst.snippets +++ b/sources_non_forked/vim-snippets/snippets/rst.snippets @@ -1,14 +1,14 @@ # rst snippet : - :${1:Text}: ${2:blah blah} + :${1:field name}: ${2:field body} snippet * *${1:Emphasis}* snippet ** **${1:Strong emphasis}** snippet _ - \`${1:Text}\`_ - .. _\`$1\`: ${2:blah blah} + \`${1:hyperlink-name}\`_ + .. _\`$1\`: ${2:link-block} snippet = ${1:Title} =====${2:=} diff --git a/sources_non_forked/snipmate-snippets/snippets/ruby.snippets b/sources_non_forked/vim-snippets/snippets/ruby.snippets similarity index 95% rename from sources_non_forked/snipmate-snippets/snippets/ruby.snippets rename to sources_non_forked/vim-snippets/snippets/ruby.snippets index 26bdfa5a..a9b45ad4 100644 --- a/sources_non_forked/snipmate-snippets/snippets/ruby.snippets +++ b/sources_non_forked/vim-snippets/snippets/ruby.snippets @@ -2,6 +2,10 @@ # Ruby snippets - for Rails, see below # ######################################## +# encoding for Ruby 1.9 +snippet enc + # encoding: utf-8 + # #!/usr/bin/env ruby snippet #! #!/usr/bin/env ruby @@ -22,8 +26,10 @@ snippet beg rescue ${1:Exception} => ${2:e} end -snippet req +snippet req require require "${1}"${2} +snippet reqr + require_relative "${1}"${2} snippet # # => snippet end @@ -282,9 +288,15 @@ snippet eavd snippet eawi each_with_index { |${1:e}, ${2:i}| ${3} } snippet eawid - each_with_index do |${1:e},${2:i}| + each_with_index do |${1:e}, ${2:i}| ${3} end +snippet eawo + each_with_object(${1:init}) { |${2:e}, ${3:var}| ${4} } +snippet eawod + each_with_object(${1:init}) do |${2:e}, ${3:var}| + ${4} + end snippet reve reverse_each { |${1:e}| ${2} } snippet reved @@ -390,7 +402,7 @@ snippet : snippet ope open(${1:"path/or/url/or/pipe"}, "${2:w}") { |${3:io}| ${4} } # path_from_here() -snippet patfh +snippet fpath File.join(File.dirname(__FILE__), *%2[${1:rel path here}])${2} # unix_filter {} snippet unif @@ -571,7 +583,7 @@ snippet asre assert_response :${1:success}, @response.body${2} snippet asrj assert_rjs :${1:replace}, "${2:dom id}" -snippet ass +snippet ass assert_select(..) assert_select '${1:path}', :${2:text} => '${3:inner_html' ${4:do} snippet bf before_filter :${1:method} @@ -650,6 +662,10 @@ snippet defupdate end end end${3} +snippet dele delegate .. to + delegate :${1:methods}, :to => :${2:object} +snippet dele delegate .. to .. prefix .. allow_nil + delegate :${1:methods}, :to => :${2:object}, :prefix => :${3:prefix}, :allow_nil => ${4:allow_nil} snippet flash flash[:${1:notice}] = "${2}" snippet habtm @@ -865,7 +881,6 @@ snippet test test "should ${1:do something}" do ${2} end - #migrations snippet mac add_column :${1:table_name}, :${2:column_name}, :${3:data_type} @@ -907,6 +922,11 @@ snippet it snippet itp it "${1:spec_name}" ${2} +snippet its + its(:${1:method}) { should ${2} } +snippet itsn + its(:${1:method}) { should_not ${2} } + snippet desc describe ${1:class_name} do ${2} @@ -923,3 +943,19 @@ snippet aft after :${1:each} do ${2} end +snippet let + let(:${1:method}) { ${2} } +snippet subj + subject { ${1} } +snippet spec + specify { subject.${1} } +snippet exp + expect(${1:object}).to ${2} +snippet btr + be_true +snippet bfa + be_false +snippet shared + shared_examples "${1:shared examples name}" ${2} +snippet itb + it_behaves_like "${1:shared examples name}"${2} diff --git a/sources_non_forked/vim-snippets/snippets/scala.snippets b/sources_non_forked/vim-snippets/snippets/scala.snippets new file mode 100644 index 00000000..c342228a --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/scala.snippets @@ -0,0 +1,349 @@ +################################################################ +# © Copyright 2011 Konstantin Gorodinskiy. All Rights Reserved.# +# Do What The Fuck You Want To Public License, Version 2. # +# See http://sam.zoy.org/wtfpl/COPYING for more details. # +################################################################ +# Scala lang +#if +snippet if + if(${1:obj}) { + ${2:/* code */} + } +#if not +snippet ifn + if(!${1:obj}) { + ${2:/* code */} + } +#if-else +snippet ifel + if(${1:obj}) { + ${2:/* code */} + } else { + ${3:/* code */} + } +#if-else-if +snippet ifelif + if(${1:obj}) { + ${2:/* code */} + } else if(${3:obj}) { + ${4:/* code */} + } +#while loop +snippet while + while (${1:obj}) { + ${2:/* code */} + } +#for loop(classic) +snippet for + for (${1:item} <- ${2:obj}) { + ${3:/* code */} + } +#for loop(indexed) +snippet fori + for (${1:i} <- ${2:0} to ${3:obj}.length) { + ${4:/* code */} + } +#exceptions +snippet try + try { + ${1:/* code */} + } catch { + case e: FileNotFoundException => ${2:/* code */} + case e: IOException => ${3:/* code */} + } finally { + ${4:/* code */} + } +#match +snippet match + ${1: obj} match { + case ${2:e} => ${3:/* code */} + case _ => ${4:/* code */} + } +#case +snippet case + case ${1:value} => ${2:/* code */} +############################ +# methods and arguments +# +#arg +snippet arg + ${1:a}: ${2:T}${3:, arg} +#args +snippet args + ${1:args}: ${2:T}* +#def +snippet def + def ${1:name}(${2:arg}) = ${3:} +#private def +snippet prdef + private def ${1:name}(${2:arg}) = ${3:} +#override def +snippet ovdef + override def ${1:name}(${2:arg}) = ${3:} +#first class function(see scalabook p 188) +snippet fcf + (${1:a}: ${2:T}) => $1 ${3:/* code */} +snippet => + ${1:name} => ${2:/* code */} +#recursion +snippet rec + def ${1:name}(${2:arg}) = + if($2) $2 + else $1($2) +#curried method +snippet crdef + def ${1:name}(${2:arg})(${3:arg}) = ${4:} +#main method +#check validity of T +snippet main + def main(args: Array[String]):${1:T} = ${2:} +############################ +# basic types(general purpose) +# you might want to use basic types snippets + +#1 +snippet T Double + dbl +#2 +snippet T Int + int +#3 +snippet T Long + lng +#4 +snippet T Char + chr +#5 +snippet T String + str +#6 +snippet T Array + arr +#7 +snippet T Buffer + buf +#8 +snippet T List + list +#9 +snippet T Tuple + tpl +#10 +snippet T Set + set +#11 +snippet T Map + map +#12 +snippet T HashSet + hset +#13 +snippet T HashMap + hmap +#14 +snippet T Boolean + bool +#end + +#named snippets for types +snippet bool + Boolean +snippet anyr + AnyRef +snippet dbl + Double +snippet int + Int +snippet str + String +snippet chr + Char +snippet lng + Long +snippet arr + Array${1:[T]}${2:()} +snippet buf + Buffer${1:[T]}${2:()} +snippet list + List${1:[T]}${2:()} +snippet tpl + Tuple${1:2}[${2:T},${3:T}] +snippet set + Set${1:[T]}${2:()} +snippet hset + HashSet${1:[T]}${2:()} +snippet mhset + mutable.HashSet${1:[T]}${2:()} +#for maps +snippet keyval + ${1:key}->${2:val}${3:, keyval} +snippet map + Map[${1:T},${2:T}]${3:(keyval)} +snippet hmap + HashMap[${1:T},${2:T}]${3:(keyval)} +snippet mmap + mutable.Map[${1:T},${2:T}]${3:(keyval)} +snippet mhmap + mutable.HashMap[${1:T},${2:T}]${3:(keyval)} +#TODO add TreeMap and TreeSet +#asInstanceOf[] +snippet as + ${1:name}.asInstanceOf[${2:T}] +#isInstanceOf[] + ${1:name}.isInstanceOf[${2:T}] +#end +#collections methods + +#scope() with one arg +snippet (a + (${1:a} => ${2:/* code */}) +#scope() with two args +snippet {( + {(${1:a},${2:b}) => + ${3:/* code */} + } +#filter +snippet filter + ${1:name}.filter (a +#map function +snippet mapf + ${1:name}.map (a +#flatmap +snippet flatmap + ${1:name}.flatMap${2:[T]}(a +#fold left +snippet fldl + ${1:name}.foldLeft(${2:first}) {( +#fold right +snippet fldr + ${1:name}.foldRight(${2:first}) {( +#fold left operator(if u wanna reduce readability of ur code) +#use wildcard symbols +snippet /: + (${1:first}/:${2:name})(${3:/* code */}) +#fold right operator +snippet :\ + (${1:first}:\${2:name})(${3:/* code */}) +#reduce left +snippet redl + ${1:name}.reduceLeft[${2:T}] {( +#reduce right +snippet redr + ${1:name}.reduceRight[${2:T}] {( +#zipWithIndex(safe way). +#see http://daily-scala.blogspot.com/2010/05/zipwithindex.html +snippet zipwi + ${1:name}.view.zipWithIndex +#split +snippet spl + ${1:name}.split("${2:,}") +#end +snippet val + val ${1:name}${2:: T} = ${3:value} +snippet var + var ${1:name}${2:: T} = ${3:value} +############################ +# classes +# +#extends +snippet extends + extends ${1:what} +#with +snippet with + with ${1:what}${2: with} +#auxiliary constructor(a. this) +snippet athis + def this(arg) = this(arg) +#abstract class +snippet abstract + abstract class ${1:name}${2:(arg)}${3: extends }${4: with} { + ${5:override def toString = "$1"} + ${6:/* code */} + } +#class +snippet class + class ${1:name}${2:(arg)}${3: extends }${4: with} { + ${5:override def toString = "$1"} + ${6:/* code */} + } +#object +snippet object + object ${1:name}${2:(arg)}${3: extends }${4: with} ${5:} +#trait +snippet trait + trait ${1:name}${2: extends }${3: with} { + ${4:} + } +#class with trait Ordered(page 265) +snippet ordered + class ${1:name}${2:(arg)} extends Ordered[$1] ${3: with} { + ${4:override def toString = "$1"} + def compare(that: $1) = ${5:this - that} + ${6:/* code */} + } +#case class +snippet casecl + case class ${1:name}${2:(arg)}${3: extends }${4: with} ${5:} +############################ +# testing +# +#scalatest imports +snippet scalatest + ${1:import org.scalatest.Suite} + ${2:import org.scalatest.FunSuite} +#assert +snippet assert + assert(${1:a}==${2:b}) +#ensuring(p 296) +snippet ensuring + ifel ensuring(${1:a}==${2:b}) +#expect +snippet expect + expect(${1:what}) { +#intercept +snippet intercept + intercept[${1:IllegalArgumentException}] { +#test +snippet test + test("${1:description}") { +#suite +snippet suite + class ${1:name} extends Suite { + def test() { + } +#funsuite +snippet fsuite + class ${1:name} extends FunSuite { + test("${2:description}") { + } +############################ +# SBT +# +snippet webproject + import sbt._ + + class ${1:Name}(info: ProjectInfo) extends DefaultWebProject(info) { + val liftVersion = "${2:2.3}" + + override def libraryDependencies = Set( + + ) ++ super.libraryDependencies + + val snapshots = ScalaToolsSnapshots + } +#depencies +snippet liftjar + "net.liftweb" %% "${1:lib}" % liftVersion % "compile->default", +snippet jettyjar + "org.mortbay.jetty" % "jetty" % "${1:version}" % "test->default", +############################ +# Lift +# +#lift imports +snippet liftimports + import _root_.net.liftweb.http._ + import S._ + import _root_.net.liftweb.util._ + import Helpers._ + import _root_.scala.xml._ +#TODO LIFT,SBT,WEB.XML,HTML snippets diff --git a/sources_non_forked/vim-snippets/snippets/sh.snippets b/sources_non_forked/vim-snippets/snippets/sh.snippets new file mode 100644 index 00000000..b0736208 --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/sh.snippets @@ -0,0 +1,86 @@ +# Shebang. Executing bash via /usr/bin/env makes scripts more portable. +snippet #! + #!/usr/bin/env bash + +snippet if + if [[ ${1:condition} ]]; then + ${2:#statements} + fi +snippet elif + elif [[ ${1:condition} ]]; then + ${2:#statements} +snippet for + for (( ${2:i} = 0; $2 < ${1:count}; $2++ )); do + ${3:#statements} + done +snippet fori + for ${1:needle} in ${2:haystack} ; do + ${3:#statements} + done +snippet wh + while [[ ${1:condition} ]]; do + ${2:#statements} + done +snippet until + until [[ ${1:condition} ]]; do + ${2:#statements} + done +snippet case + case ${1:word} in + ${2:pattern}) + ${3};; + esac +snippet go + while getopts '${1:o}' ${2:opts} + do + case $$2 in + ${3:o0}) + ${4:#staments};; + esac + done +# Set SCRIPT_DIR variable to directory script is located. +snippet sdir + SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +# getopt +snippet getopt + __ScriptVersion="${1:version}" + + #=== FUNCTION ================================================================ + # NAME: usage + # DESCRIPTION: Display usage information. + #=============================================================================== + function usage () + { + cat <<- EOT + + Usage : $${0:0} [options] [--] + + Options: + -h|help Display this message + -v|version Display script version + + EOT + } # ---------- end of function usage ---------- + + #----------------------------------------------------------------------- + # Handle command line arguments + #----------------------------------------------------------------------- + + while getopts ":hv" opt + do + case $opt in + + h|help ) usage; exit 0 ;; + + v|version ) echo "$${0:0} -- Version $__ScriptVersion"; exit 0 ;; + + \? ) echo -e "\n Option does not exist : $OPTARG\n" + usage; exit 1 ;; + + esac # --- end of case --- + done + shift $(($OPTIND-1)) + + +snippet root + if [ $(id -u) -ne 0 ]; then exec sudo $0; fi diff --git a/sources_non_forked/snipmate-snippets/snippets/snippets.snippets b/sources_non_forked/vim-snippets/snippets/snippets.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/snippets.snippets rename to sources_non_forked/vim-snippets/snippets/snippets.snippets diff --git a/sources_non_forked/vim-snippets/snippets/sql.snippets b/sources_non_forked/vim-snippets/snippets/sql.snippets new file mode 100644 index 00000000..eb4b37ca --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/sql.snippets @@ -0,0 +1,26 @@ +snippet tbl + create table ${1:table} ( + ${2:columns} + ); +snippet col + ${1:name} ${2:type} ${3:default ''} ${4:not null} +snippet ccol + ${1:name} varchar2(${2:size}) ${3:default ''} ${4:not null} +snippet ncol + ${1:name} number ${3:default 0} ${4:not null} +snippet dcol + ${1:name} date ${3:default sysdate} ${4:not null} +snippet ind + create index ${3:$1_$2} on ${1:table}(${2:column}); +snippet uind + create unique index ${1:name} on ${2:table}(${3:column}); +snippet tblcom + comment on table ${1:table} is '${2:comment}'; +snippet colcom + comment on column ${1:table}.${2:column} is '${3:comment}'; +snippet addcol + alter table ${1:table} add (${2:column} ${3:type}); +snippet seq + create sequence ${1:name} start with ${2:1} increment by ${3:1} minvalue ${4:1}; +snippet s* + select * from ${1:table} diff --git a/sources_non_forked/snipmate-snippets/snippets/tcl.snippets b/sources_non_forked/vim-snippets/snippets/tcl.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/tcl.snippets rename to sources_non_forked/vim-snippets/snippets/tcl.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/tex.snippets b/sources_non_forked/vim-snippets/snippets/tex.snippets similarity index 84% rename from sources_non_forked/snipmate-snippets/snippets/tex.snippets rename to sources_non_forked/vim-snippets/snippets/tex.snippets index 511a4c9e..10fa82ef 100644 --- a/sources_non_forked/snipmate-snippets/snippets/tex.snippets +++ b/sources_non_forked/vim-snippets/snippets/tex.snippets @@ -1,5 +1,3 @@ -# recomendation: change the fold marker from {{{,}}} to (fold),(end) ; tex uses "{" and "}" a lot - #PREAMBLE #newcommand snippet nc @@ -97,40 +95,34 @@ snippet part % part $2 (end) # Chapter snippet cha - \chapter{${1:chapter name}} % (fold) + \chapter{${1:chapter name}} \label{cha:${2:$1}} ${3} - % chapter $2 (end) # Section snippet sec - \section{${1:section name}} % (fold) + \section{${1:section name}} \label{sec:${2:$1}} ${3} - % section $2 (end) # Sub Section snippet sub - \subsection{${1:subsection name}} % (fold) + \subsection{${1:subsection name}} \label{sub:${2:$1}} ${3} - % subsection $2 (end) # Sub Sub Section snippet subs - \subsubsection{${1:subsubsection name}} % (fold) + \subsubsection{${1:subsubsection name}} \label{ssub:${2:$1}} ${3} - % subsubsection $2 (end) # Paragraph snippet par - \paragraph{${1:paragraph name}} % (fold) + \paragraph{${1:paragraph name}} \label{par:${2:$1}} ${3} - % paragraph $2 (end) # Sub Paragraph snippet subp - \subparagraph{${1:subparagraph name}} % (fold) + \subparagraph{${1:subparagraph name}} \label{subp:${2:$1}} ${3} - % subparagraph $2 (end) #References snippet itd \item[${1:description}] ${2:item} @@ -146,9 +138,11 @@ snippet page ${1:page}~\pageref{${2}}${3} snippet index \index{${1:index}}${2} -#cite +#Citations snippet cite - \cite{${1}}${2} + \cite[${1}]{${2}}${3} +snippet fcite + \footcite[${1}]{${2}}${3} #Formating text: italic, bold, underline, small capital, emphase .. snippet it \textit{${1:text}} diff --git a/sources_non_forked/snipmate-snippets/snippets/textile.snippets b/sources_non_forked/vim-snippets/snippets/textile.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/textile.snippets rename to sources_non_forked/vim-snippets/snippets/textile.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/vim.snippets b/sources_non_forked/vim-snippets/snippets/vim.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/vim.snippets rename to sources_non_forked/vim-snippets/snippets/vim.snippets diff --git a/sources_non_forked/snipmate-snippets/snippets/xslt.snippets b/sources_non_forked/vim-snippets/snippets/xslt.snippets similarity index 98% rename from sources_non_forked/snipmate-snippets/snippets/xslt.snippets rename to sources_non_forked/vim-snippets/snippets/xslt.snippets index 892e9dbe..e7abdf3f 100644 --- a/sources_non_forked/snipmate-snippets/snippets/xslt.snippets +++ b/sources_non_forked/vim-snippets/snippets/xslt.snippets @@ -8,7 +8,7 @@ snippet apply-templates sort-by ${5} ${6} -snippet apply-templates +snippet apply-templates plain ${2} snippet attribute blank diff --git a/sources_non_forked/vim-snippets/snippets/yii-chtml.snippets b/sources_non_forked/vim-snippets/snippets/yii-chtml.snippets new file mode 100644 index 00000000..91c65b92 --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/yii-chtml.snippets @@ -0,0 +1,248 @@ +#--------------------Yii CHtml--------------------------------- +#Yii CHtml::radioButton +snippet yhrb + echo CHtml::radioButton('${1:name}', ${2:false},array(${3:optionName}=>${4:optionValue} ); + +#Yii CHtml::asset +snippet yhass + echo CHtml::asset('${1:path}'); + +#Yii CHtml::activeLabelEx +snippet yhale + echo CHtml::activeLabelEx(${1:model}, '${2:attribute}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::encodeArray +snippet yheca + echo CHtml::encodeArray(array(${1})); + +#Yii CHtml::normalizeUrl +snippet yhnurl + echo CHtml::normalizeUrl(array('${1}')); + +#Yii CHtml::resetButton +snippet yhsb + echo CHtml::submitButton('${1:label}',array('${2:optionName}'=>${3:optionValue})); + +#Yii CHtml::linkButton +snippet yhlinkb + echo CHtml::linkButton('${1:lable}',array('${2:optionName}'=>${3:optionValue})); + +#Yii CHtml::activeTextArea +snippet yhata + echo CHtml::activeTextArea(${1:model}, '${2:attribute}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::ajaxButton +snippet yhajb + echo CHtml::ajaxButton('${1:label}', '${2:url}',array('${3:ajaxOptionName}'=>${4:ajaxOptionValue}),array('${5:optionName}'=>${6:optionValue})); + +#Yii CHtml::activeId +snippet yhai + echo CHtml::activeId(${1:model}, '${2:attribute}'); + +#Yii CHtml::activeCheckBox +snippet yhacb + echo CHtml::activeCheckBox(${1:model}, '${2:attribute}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::activeHiddenField +snippet yhahf + echo CHtml::activeHiddenField(${1:model}, '${2:attribute}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::encode +snippet yhec + echo CHtml::encode(${1:text}); + +#Yii CHtml::metaTag +snippet yhmtag + echo CHtml::metaTag('${1:content}', '${2:name}', '${3:httpEquiv}',array('${4:optionName}'=>${5:optionValue})); + +#Yii CHtml::dropDownList +snippet yhddl + echo CHtml::dropDownList('${1:name}', '${2:select}', array(${3}),array('${4:optionName}'=>${5:optionValue})); + +#Yii CHtml::listBox +snippet yhlb + echo CHtml::listBox('${1:name}', '${2:select}',array(${3}),array('${4:optionName}'=>${5:optionValue})); + +#Yii CHtml::script +snippet yhjs + echo CHtml::script('${1:test}'); + +#Yii CHtml::ajax +snippet yhaj + echo CHtml::ajax(array(${1})); + +#Yii CHtml::textField +snippet yhtf + echo CHtml::textField('${1:name}', '${2:value}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::activePasswordField +snippet yhapf + echo CHtml::activePasswordField(${1:model}, '${2:attribute}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::listData +snippet yhld + echo CHtml::listData(array(${1}),'${2:valueField}', '${3:textField}','${4:groupField}'); + +#Yii CHtml::mailto +snippet yhmt + echo CHtml::mailto('${1:text}', '${2:email}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::image +snippet yhimg + echo CHtml::image('${1:src}', '${2:alt}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::activeListBox +snippet yhalb + echo CHtml::activeListBox(${1:model}, '${2:attribute}', array(${3}),array('${4:optionName}'=>${5:optionValue})); + +#Yii CHtml::activeFileField +snippet yhaff + echo CHtml::activeFileField(${1:model}, '${2:attribute}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::closeTag +snippet yhct + echo CHtml::closeTag('${1:tag}'); + +#Yii CHtml::activeInputField +snippet yhaif + echo CHtml::activeInputField('${1:type}', ${2:model}, '${3:attribute}',array('${4:optionName}'=>${5:optionValue})); + +#Yii CHtml::scriptFile +snippet yhjsf + echo CHtml::scriptFile('${1:url}'); + +#Yii CHtml::radioButtonList +snippet yhrbl + echo CHtml::radioButtonList('${1:name}', ${2:select}, array(${3}),array('${4:optionName}'=>${5:optionValue})); + +#Yii CHtml::cssFile +snippet yhcssf + echo CHtml::cssFile('${1:url}','${2:media}'); + +#Yii CHtml::error +snippet yherr + echo CHtml::error(${1:model}, '${2:attribute}'); + +#Yii CHtml::passwordField +snippet yhpf + echo CHtml::passwordField('${1:name}', '${2:value}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::hiddenField +snippet yhhf + echo CHtml::hiddenField('${1:name}', '${2:value}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::cdata +snippet yhc + echo CHtml::cdata(${1:text}); + +#Yii CHtml::link +snippet yhlink + echo CHtml::link('${1:text}',array(${2}),array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::errorSummary +snippet yherrs + echo CHtml::errorSummary(${1:model},'${2:headerHtml}','${3:footerHtml}'); + +#Yii CHtml::tag +snippet yht + echo CHtml::tag('${1:tag}',array('${2:optionName}'=>${3:optionValue}),${4:false},${5:true}); + +#Yii CHtml::ajaxLink +snippet yhajl + echo CHtml::ajaxLink('${1:label}', '${2:url}',array('${3:ajaxOptionName}'=>${4:ajaxOptionValue}),array('${5:optionName}'=>${6:optionValue})); + +#Yii CHtml::label +snippet yhlabel + echo CHtml::label('${1:label}', '${2:for}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::activeName +snippet yhan + echo CHtml::activeName(${1:model}, '${2:attribute}'); + +#Yii CHtml::statefulForm +snippet yhsform + echo CHtml::statefulForm(array('${1}'), '${2:post}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::fileField +snippet yhff + echo CHtml::fileField('${1:name}', '${2:value}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::activeTextField +snippet yhatf + echo CHtml::activeTextField(${1:model}, '${2:attribute}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::css +snippet yhcss + echo CHtml::css('${1:test}','${2:media}'); + +#Yii CHtml::imageButton +snippet yhimgb + echo CHtml::imageButton('${1:src}',array('${2:optionName}'=>${3:optionValue})); + +#Yii CHtml::ajaxSubmitButton +snippet yhajsb + echo CHtml::ajaxSubmitButton('${1:label}', '${2:url}',array('${3:ajaxOptionName}'=>${4:ajaxOptionValue}),array('${5:optionName}'=>${6:optionValue})); + +#Yii CHtml::button +snippet yhb + echo CHtml::button('${1:label}',array('${2:optionName}'=>${3:optionValue})); + +#Yii CHtml::listOptions +snippet yhlo + echo CHtml::listOptions('${1:selection}', array(${2}), array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::activeCheckBoxList +snippet yhacbl + echo CHtml::activeCheckBoxList(${1:model}, '${2:attribute}', array(${3}),array('${4:optionName}'=>${5:optionValue})); + +#Yii CHtml::openTag +snippet yhot + echo CHtml::openTag('${1:tag}', array('${2:optionName}'=>${3:optionValue})); + +#Yii CHtml::checkBox +snippet yhcb + echo CHtml::checkBox('${1:name}', ${2:false}, array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::textArea +snippet yhta + echo CHtml::textArea('${1:name}', '${2:value}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::linkTag +snippet yhlinkt + echo CHtml::linkTag('${1:relation}', '${2:type}', '${3:href}', '${4:media}',array('${5:optionName}'=>${6:optionValue})); + +#Yii CHtml::resetButton +snippet yhrsb + echo CHtml::resetButton('${1:label}',array('${2:optionName}'=>${3:optionValue})); + +#Yii CHtml::activeRadioButtonList +snippet yharbl + echo CHtml::activeRadioButtonList(${1:model}, '${2:attribute}', array(${3}),array('${4:optionName}'=>${5:optionValue})); + +#Yii CHtml::checkBoxList +snippet yhcbl + echo CHtml::checkBoxList('${1:name}', ${2:select}, array(${3}),array('${4:optionName}'=>${5:optionValue})); + +#Yii CHtml::form +snippet yhform + echo CHtml::form(array('${1}'), '${2:post}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::beginForm +snippet yhbeform + echo CHtml::beginForm(array('${1}'), '${2:post}',array('${3:optionName}'=>${4:optionValue})); + ${5} + echo CHtml::endForm(); + +#Yii CHtml::activeDropDownList +snippet yhaddl + echo CHtml::activeDropDownList(${1:model}, '${2:attribute}', array(${3}),array('${4:optionName}'=>${5:optionValue})); + +#Yii CHtml::activeRadioButton +snippet yharb + echo CHtml::activeRadioButton(${1:model}, '${2:attribute}',array('${3:optionName}'=>${4:optionValue})); + +#Yii CHtml::activeLabel +snippet yhal + echo CHtml::activeLabel(${1:model}, '${2:attribute}',array('${3:optionName}'=>${4:optionValue})); + + diff --git a/sources_non_forked/vim-snippets/snippets/yii.snippets b/sources_non_forked/vim-snippets/snippets/yii.snippets new file mode 100644 index 00000000..9f29eaf1 --- /dev/null +++ b/sources_non_forked/vim-snippets/snippets/yii.snippets @@ -0,0 +1,300 @@ +#Yii session offset +snippet yse + Yii::app()->session['${1}']; + +#Yii renderDynamic +snippet yrd + $this->renderDynamic('${1:callback}'); + +#Yii set cache +snippet ycas + Yii::app()->cache->set('${1:key}', ${2:value}, ${3:expire}, new C${4:}CacheDependency(${5})); + +#Yii Add cache +snippet ycad + Yii::app()->cache->add('${1:key}', ${2:value}, ${3:expire}, new C${4}CacheDependency(${5})); + +#Yii register CSS file +snippet yregcf + Yii::app()->clientScript->registerCssFile('${1:file}'); + +#Yii requestType +snippet yreqtype + Yii::app()->request->requestType + +#Yii isAjaxRequest +snippet yisajax + Yii::app()->request->isAjaxRequest + +#Yii translate +snippet yt + Yii::t('${1:category}', '${2:message}',array(${3})); + +#Yii register CSS +snippet yregc + Yii::app()->clientScript->registerCss('${1:id}', '${2}'); + +#Yii log +snippet ylog + Yii::log('${1:msg}', '${2:info}'); + +#Yii userHostAddress +snippet yuserip + YYii::app()->request->userHostAddress + +#Yii register script file +snippet yregsf + Yii::app()->clientScript->registerScriptFile('${1:scriptUrl}', CClientScript::POS_${2:END}); + +#Yii CLinkPager +snippet ylinkpager + $this->widget('CLinkPager', array('pages'=>$pages,'header'=>'${1}'})) + +#Yii CJSON::encode +snippet yjec + CJSON::encode(${1:text}); + +#CActiveDataProvider +snippet yadp + $dataProvider = new CActiveDataProvider('${1}', array( + 'criteria' => array( + 'condition' => '${2}', + 'order' => '${3}', + 'with' => array('${4}') + ), + //'pagination' => false, + 'pagination' => array( + 'pageSize'=>${5}, + ), + )); + ${6} + // $dataProvider->getData() will return a list of Post objects + +#Yii renderDynamic internal +snippet yrdi + $this->renderDynamic('${1:callback}', array('${2:key}'=>${3:value})); + +#Yii register script +snippet yregs + Yii::app()->clientScript->registerScript('${1:id}', '${2}', CClientScript::POS_${3:READY}); + +#Yii Flush cache +snippet ycaf + Yii::app()->cache->flush(); + +#Yii Yii::app()->request->cookies +snippet yco + Yii::app()->request->cookies['${1}'] + +#Yii user-> +snippet yuser + Yii::app()->user->${1} + +#Yii refresh +snippet yrf + $this->refresh(); + +#Yii import +snippet yimp + Yii::import('${1}'); + +#Yii trace +snippet ytrace + Yii::trace('${1:msg}'); + +#Yii params +snippet ypar + Yii::app()->params['${1}'] + +#Yii isPostRequest +snippet yispost + Yii::app()->request->isPostRequest + +#Yii IF isAjaxRequest +snippet yifisajax + if(Yii::app()->request->isAjaxRequest == TRUE) + { + ${1} + } + +#Yii Yii::app()->cache->delete +snippet ydelcache + Yii::app()->cache->delete('${1:key}'); + +#Yii render view +snippet yr + $this->render('${1:view}',array('${2:key}'=>${3:value})); + +#Yii redirect +snippet yre + $this->redirect(array('${1:controller}/${2:action}')); + +#Yii Get cache +snippet ycag + Yii::app()->cache->get('${1:key}'); + +#Yii render text +snippet yrt + $this->renderText('${1}'); + +#Yii render partial +snippet yrp + $this->renderPartial('${1:view}',array('${2:key}'=>${3:value})); + +#----------------Yii Model----------------------------- +#Yii Model count +snippet ycountm + ${1:ModelName}::model()->count(${2:condition}, array('${3:key}'=>${4:value})); + +#Yii Model countBySql +snippet ycountbs + ${1:ModelName}::model()->countBySql(${2:sql},array('${3:key}'=>${4:value})); + +#Yii Model updateAll +snippet yupdatea + ${1:ModelName}::model()->updateAll(${2:array('attributes')}, ${3:condition},array('${4:key}'=>${5:value})); + +#Yii Model updateByPk +snippet yupdatebp + ${1:ModelName}::model()->updateByPk(${2:pk}, ${3:array('attributes')}, ${4:condition},array('${5:key}'=>${6:value})); + +#Yii Model deleteAll +snippet ydela + ${1:ModelName}::model()->deleteAll(${2:condition},array('${3:key}'=>${4:value})); + +#Yii Model deleteByPk +snippet ydelbp + ${1:ModelName}::model()->deleteByPk(${2:pk}, ${3:condition}, array('${4:key}'=>${5:value})); + +#Yii Model find +snippet yfind + ${1:ModelName}::model()->find(${2:condition},array('${3:key}'=>${4:value})); + +#Yii Model findAll +snippet yfinda + ${1:ModelName}::model()->findAll(${2:condition},array('${3:key}'=>${4:value})); + +#Yii Model findByPk +snippet yfindbp + ${1:ModelName}::model()->findByPk(${2:pk}, ${3:condition}, array('${4:key}'=>${5:value})); + +#Yii Model findAllByPk +snippet yfindabp + ${1:ModelName}::model()->findAllByPk(${2:pk}, ${3:condition},array('${4:key}'=>${5:value})); + +#Yii Model findBySql +snippet yfindbs + ${1:ModelName}::model()->findBySql(${2:sql}, array('${3:key}'=>${4:value})); + +#Yii Model findAllByAttributes +snippet yfindaba + ${1:ModelName}::model()->findAllByAttributes(array('${2:attributeName}'=>${3:attributeValue}), ${4:condition}, array('${5:key}'=>${6:value})); + +#Yii Model exists +snippet yexists + ${1:ModelName}::model()->exists(${2:condition}, array('${3:key}'=>${4:value})); + +#Yii Create model class +snippet ymodel + 'path.to.FilterClass', + 'propertyName'=>'propertyValue', + ), + ); + } + + public function actions() + { + // return external action classes, e.g.: + return array( + 'action1'=>'path.to.ActionClass', + 'action2'=>array( + 'class'=>'path.to.AnotherActionClass', + 'propertyName'=>'propertyValue', + ), + ); + } + */ + } + +#Yii Create controller action method +snippet yact + public function action${1:Index}(${2:params}) + { + ${3} + } + + diff --git a/sources_non_forked/snipmate-snippets/snippets/zsh.snippets b/sources_non_forked/vim-snippets/snippets/zsh.snippets similarity index 100% rename from sources_non_forked/snipmate-snippets/snippets/zsh.snippets rename to sources_non_forked/vim-snippets/snippets/zsh.snippets diff --git a/sources_non_forked/vim-snippets/xhtml.snippets b/sources_non_forked/vim-snippets/xhtml.snippets deleted file mode 100644 index cc31dbc7..00000000 --- a/sources_non_forked/vim-snippets/xhtml.snippets +++ /dev/null @@ -1 +0,0 @@ -extends html diff --git a/sources_non_forked/vim-surround/doc/surround.txt b/sources_non_forked/vim-surround/doc/surround.txt index 6c959847..30a642ae 100644 --- a/sources_non_forked/vim-surround/doc/surround.txt +++ b/sources_non_forked/vim-surround/doc/surround.txt @@ -133,15 +133,9 @@ attributes here and they will be stripped from the closing tag. End your input by pressing or >. If is used, the tags will appear on lines by themselves. -A deprecated replacement of a LaTeX environment is provided on \ and l. The -name of the environment and any arguments will be input from a prompt. This -will be removed once a more fully functional customization system is -implemented. The following shows the resulting environment from -csp\tabular}{lc -> - \begin{tabular}{lc} - \end{tabular} -< +If s is used, a leading but not trailing space is added. This is useful for +removing parentheses from a function call with csbs. + CUSTOMIZING *surround-customizing* The following adds a potential replacement on "-" (ASCII 45) in PHP files. diff --git a/sources_non_forked/vim-surround/plugin/surround.vim b/sources_non_forked/vim-surround/plugin/surround.vim index 8b882dd7..e3871570 100644 --- a/sources_non_forked/vim-surround/plugin/surround.vim +++ b/sources_non_forked/vim-surround/plugin/surround.vim @@ -1,6 +1,6 @@ " surround.vim - Surroundings " Author: Tim Pope -" Version: 1.90 +" Version: 2.0 " GetLatestVimScripts: 1697 1 :AutoInstall: surround.vim if exists("g:loaded_surround") || &cp || v:version < 700 @@ -159,6 +159,12 @@ function! s:wrap(string,char,type,...) elseif newchar ==# "p" let before = "\n" let after = "\n\n" + elseif newchar ==# 's' + let before = ' ' + let after = '' + elseif newchar ==# ':' + let before = ':' + let after = '' elseif newchar =~# "[tT\<,]" let dounmapp = 0 let dounmapb = 0 @@ -218,6 +224,10 @@ function! s:wrap(string,char,type,...) let after = ' ' . after endif endif + elseif newchar ==# "\" + let fnc = input('function: ') + let before = '('.fnc.' ' + let after = ')' elseif idx >= 0 let spc = (idx % 3) == 1 ? " " : "" let idx = idx / 3 * 3 @@ -330,7 +340,7 @@ function! s:insert(...) " {{{1 endfunction " }}}1 function! s:reindent() " {{{1 - if exists("b:surround_indent") ? b:surround_indent : (exists("g:surround_indent") && g:surround_indent) + if exists("b:surround_indent") ? b:surround_indent : (!exists("g:surround_indent") || g:surround_indent) silent norm! '[='] endif endfunction " }}}1 @@ -415,7 +425,7 @@ function! s:dosurround(...) " {{{1 else let pcmd = "P" endif - if line('.') < oldlnum && regtype ==# "V" + if line('.') + 1 < oldlnum && regtype ==# "V" let pcmd = "p" endif call setreg('"',keeper,regtype) @@ -557,11 +567,13 @@ if !exists("g:surround_no_mappings") || ! g:surround_no_mappings nmap ySS YSsurround xmap S VSurround xmap gS VgSurround - if !hasmapto("Isurround","i") && "" == mapcheck("","i") - imap Isurround + if !exists("g:surround_no_insert_mappings") || ! g:surround_no_insert_mappings + if !hasmapto("Isurround","i") && "" == mapcheck("","i") + imap Isurround + endif + imap s Isurround + imap S ISurround endif - imap s Isurround - imap S ISurround endif " vim:set ft=vim sw=2 sts=2 et: diff --git a/update_plugins.py b/update_plugins.py new file mode 100644 index 00000000..16cfea3f --- /dev/null +++ b/update_plugins.py @@ -0,0 +1,76 @@ +import zipfile +import shutil +import tempfile +import requests + +from os import path + + +#--- Globals ---------------------------------------------- +PLUGINS = """ +ack.vim https://github.com/mileszs/ack.vim +bufexplorer https://github.com/corntrace/bufexplorer +ctrlp.vim https://github.com/kien/ctrlp.vim +mayansmoke https://github.com/vim-scripts/mayansmoke +nerdtree https://github.com/scrooloose/nerdtree +nginx.vim https://github.com/vim-scripts/nginx.vim +open_file_under_cursor.vim https://github.com/amix/open_file_under_cursor.vim +snipmate-snippets https://github.com/scrooloose/snipmate-snippets +taglist.vim https://github.com/vim-scripts/taglist.vim +tlib https://github.com/vim-scripts/tlib +vim-addon-mw-utils https://github.com/MarcWeber/vim-addon-mw-utils +vim-bundle-mako https://github.com/sophacles/vim-bundle-mako +vim-coffee-script https://github.com/kchmck/vim-coffee-script +vim-colors-solarized https://github.com/altercation/vim-colors-solarized +vim-indent-object https://github.com/michaeljsmith/vim-indent-object +vim-less https://github.com/groenewege/vim-less +vim-markdown https://github.com/tpope/vim-markdown +vim-powerline https://github.com/Lokaltog/vim-powerline +vim-pyte https://github.com/therubymug/vim-pyte +vim-snipmate https://github.com/garbas/vim-snipmate +vim-snippets https://github.com/honza/vim-snippets +vim-surround https://github.com/tpope/vim-surround +""".strip() + +GITHUB_ZIP = '%s/archive/master.zip' + +SOURCE_DIR = path.join( path.dirname(__file__), 'sources_non_forked' ) + + +def download_extract_replace(plugin_name, zip_path, temp_dir, source_dir): + temp_zip_path = path.join(temp_dir, plugin_name) + + # Download and extract file in temp dir + req = requests.get(zip_path) + open(temp_zip_path, 'wb').write(req.content) + + zip_f = zipfile.ZipFile(temp_zip_path) + zip_f.extractall(temp_dir) + + plugin_temp_path = path.join(temp_dir, + path.join(temp_dir, '%s-master' % plugin_name)) + + # Remove the current plugin and replace it with the extracted + plugin_dest_path = path.join(source_dir, plugin_name) + + try: + shutil.rmtree(plugin_dest_path) + except OSError: + pass + + shutil.move(plugin_temp_path, plugin_dest_path) + + print 'Updated %s' % plugin_name + + +if __name__ == '__main__': + temp_directory = tempfile.mkdtemp() + + try: + for line in PLUGINS.splitlines(): + name, github_url = line.split(' ') + zip_path = GITHUB_ZIP % github_url + download_extract_replace(name, zip_path, + temp_directory, SOURCE_DIR) + finally: + shutil.rmtree(temp_directory) diff --git a/vimrcs/basic.vim b/vimrcs/basic.vim index cebedd39..2e31754d 100644 --- a/vimrcs/basic.vim +++ b/vimrcs/basic.vim @@ -61,6 +61,10 @@ let g:mapleader = "," " Fast saving nmap w :w! +" :W sudo saves the file +" (useful for handling the permission-denied error) +command W w !sudo tee % > /dev/null + """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => VIM user interface diff --git a/vimrcs/plugins_config.vim b/vimrcs/plugins_config.vim index fb50a3b5..28f257f5 100644 --- a/vimrcs/plugins_config.vim +++ b/vimrcs/plugins_config.vim @@ -57,6 +57,14 @@ let g:ctrlp_custom_ignore = 'node_modules\|^\.DS_Store\|^\.git\|^\.coffee' map j :PeepOpen + +"""""""""""""""""""""""""""""" +" => ZenCoding +"""""""""""""""""""""""""""""" +" Enable all functions in all modes +let g:user_zen_mode='a' + + """""""""""""""""""""""""""""" " => snipMate (beside support ) """""""""""""""""""""""""""""" From 30c8977178c85dc560d31b9a7bc6be76b8e72a06 Mon Sep 17 00:00:00 2001 From: amix Date: Sat, 13 Apr 2013 14:54:26 -0300 Subject: [PATCH 02/13] Updated documentation --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index d1c16a05..04c86348 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,9 @@ I recommend reading the docs of these plugins to understand them better. Each of * [ctrlp.vim](https://github.com/kien/ctrlp.vim): Fuzzy file, buffer, mru and tag finder. In my config it's mapped to ``, because `` is used by YankRing * [mru.vim](https://github.com/vim-scripts/mru.vim): Plugin to manage Most Recently Used (MRU) files. Includes my own fork which adds syntax highlighting to MRU. This plugin can be opened with `` * [open_file_under_cursor.vim](https://github.com/amix/open_file_under_cursor.vim): Open file under cursor when pressing `gf` +* [zencoding](https://github.com/mattn/zencoding-vim): Expanding abbreviation like zen-coding, very useful for editing XML, HTML. +* [vim-indent-object](https://github.com/michaeljsmith/vim-indent-object): Defines a new text object representing lines of code at the same indent level. Useful for python/vim scripts +* [taglist.vim](https://github.com/vim-scripts/taglist.vim): Source code browser (supports C/C++, java, perl, python, tcl, sql, php, etc) ## What color schemes are included? @@ -85,6 +88,7 @@ I recommend reading the docs of these plugins to understand them better. Each of * [vim-less](https://github.com/groenewege/vim-less) * [vim-bundle-mako](https://github.com/sophacles/vim-bundle-mako) * [vim-markdown](https://github.com/tpope/vim-markdown) +* [nginx.vim](https://github.com/vim-scripts/nginx.vim): Highlights configuration files for nginx ## How to include your own stuff? From f7aaff4afcd0290bbdacfa974666cbdc75bcbd82 Mon Sep 17 00:00:00 2001 From: amix Date: Sat, 13 Apr 2013 15:10:31 -0300 Subject: [PATCH 03/13] Reverted back powerline --- update_plugins.py | 1 - 1 file changed, 1 deletion(-) diff --git a/update_plugins.py b/update_plugins.py index 16cfea3f..ce4b8917 100644 --- a/update_plugins.py +++ b/update_plugins.py @@ -25,7 +25,6 @@ vim-colors-solarized https://github.com/altercation/vim-colors-solarized vim-indent-object https://github.com/michaeljsmith/vim-indent-object vim-less https://github.com/groenewege/vim-less vim-markdown https://github.com/tpope/vim-markdown -vim-powerline https://github.com/Lokaltog/vim-powerline vim-pyte https://github.com/therubymug/vim-pyte vim-snipmate https://github.com/garbas/vim-snipmate vim-snippets https://github.com/honza/vim-snippets From 0087ef8f9bf39aa358b99c5a352d1ddb6294e1da Mon Sep 17 00:00:00 2001 From: amix Date: Sat, 13 Apr 2013 15:15:26 -0300 Subject: [PATCH 04/13] Reverted powerline version. Increased font size --- ...Powerline_default_default_compatible.cache | 4 + sources_non_forked/vim-powerline/README.rst | 107 +++++ .../vim-powerline/autoload/Pl.vim | 183 ++++++++ .../vim-powerline/autoload/Pl/Colorscheme.vim | 145 ++++++ .../vim-powerline/autoload/Pl/Hi.vim | 140 ++++++ .../vim-powerline/autoload/Pl/Match.vim | 43 ++ .../vim-powerline/autoload/Pl/Mod.vim | 40 ++ .../vim-powerline/autoload/Pl/Parser.vim | 371 +++++++++++++++ .../vim-powerline/autoload/Pl/Segment.vim | 188 ++++++++ .../vim-powerline/autoload/Pl/Theme.vim | 100 ++++ .../Powerline/Colorschemes/default.vim | 166 +++++++ .../autoload/Powerline/Colorschemes/skwp.vim | 192 ++++++++ .../autoload/Powerline/Functions.vim | 141 ++++++ .../autoload/Powerline/Functions/ft_man.vim | 12 + .../autoload/Powerline/Functions/fugitive.vim | 7 + .../autoload/Powerline/Functions/hgrev.vim | 17 + .../Powerline/Functions/syntastic.vim | 16 + .../autoload/Powerline/Matches.vim | 13 + .../autoload/Powerline/Segments.vim | 30 ++ .../autoload/Powerline/Segments/ctrlp.vim | 20 + .../autoload/Powerline/Segments/ft_man.vim | 3 + .../autoload/Powerline/Segments/fugitive.vim | 5 + .../autoload/Powerline/Segments/hgrev.vim | 4 + .../autoload/Powerline/Segments/rvm.vim | 6 + .../autoload/Powerline/Segments/syntastic.vim | 5 + .../autoload/Powerline/Segments/tagbar.vim | 6 + .../Powerline/Segments/virtualenv.vim | 5 + .../autoload/Powerline/Themes/default.vim | 116 +++++ .../autoload/Powerline/Themes/skwp.vim | 116 +++++ .../vim-powerline/doc/Powerline.txt | 429 ++++++++++++++++++ sources_non_forked/vim-powerline/doc/tags | 34 ++ .../fontpatcher/PowerlineSymbols.sfd | 319 +++++++++++++ .../vim-powerline/fontpatcher/README.rst | 164 +++++++ .../vim-powerline/fontpatcher/fontpatcher | 240 ++++++++++ .../vim-powerline/plugin/Powerline.vim | 69 +++ vimrcs/extended.vim | 8 +- 36 files changed, 3459 insertions(+), 5 deletions(-) create mode 100644 sources_non_forked/vim-powerline/Powerline_default_default_compatible.cache create mode 100755 sources_non_forked/vim-powerline/README.rst create mode 100755 sources_non_forked/vim-powerline/autoload/Pl.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Pl/Colorscheme.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Pl/Hi.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Pl/Match.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Pl/Mod.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Pl/Parser.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Pl/Segment.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Pl/Theme.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/default.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/skwp.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Functions.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Functions/ft_man.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Functions/fugitive.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Functions/hgrev.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Functions/syntastic.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Matches.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Segments.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Segments/ctrlp.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Segments/ft_man.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Segments/fugitive.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Segments/hgrev.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Segments/rvm.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Segments/syntastic.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Segments/tagbar.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Segments/virtualenv.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Themes/default.vim create mode 100755 sources_non_forked/vim-powerline/autoload/Powerline/Themes/skwp.vim create mode 100755 sources_non_forked/vim-powerline/doc/Powerline.txt create mode 100644 sources_non_forked/vim-powerline/doc/tags create mode 100755 sources_non_forked/vim-powerline/fontpatcher/PowerlineSymbols.sfd create mode 100755 sources_non_forked/vim-powerline/fontpatcher/README.rst create mode 100755 sources_non_forked/vim-powerline/fontpatcher/fontpatcher create mode 100755 sources_non_forked/vim-powerline/plugin/Powerline.vim diff --git a/sources_non_forked/vim-powerline/Powerline_default_default_compatible.cache b/sources_non_forked/vim-powerline/Powerline_default_default_compatible.cache new file mode 100644 index 00000000..a237c0a1 --- /dev/null +++ b/sources_non_forked/vim-powerline/Powerline_default_default_compatible.cache @@ -0,0 +1,4 @@ +let g:Powerline_cache_revision = 7 +let g:Pl#HL = ['hi Ple7ffffffa0d70000b ctermfg=231 ctermbg=160 cterm=bold guifg=#ffffff guibg=#d70000 gui=bold', 'hi Pla0d70000f0585858N ctermfg=160 ctermbg=240 cterm=NONE guifg=#d70000 guibg=#585858 gui=NONE', 'hi Plc4ff0000f0585858b ctermfg=196 ctermbg=240 cterm=bold guifg=#ff0000 guibg=#585858 gui=bold', 'hi Plfcd0d0d0f0585858N ctermfg=252 ctermbg=240 cterm=NONE guifg=#d0d0d0 guibg=#585858 gui=NONE', 'hi Ple7fffffff0585858b ctermfg=231 ctermbg=240 cterm=bold guifg=#ffffff guibg=#585858 gui=bold', 'hi Plf0585858ec303030N ctermfg=240 ctermbg=236 cterm=NONE guifg=#585858 guibg=#303030 gui=NONE', 'hi Ple7ffffffec303030N ctermfg=231 ctermbg=236 cterm=NONE guifg=#ffffff guibg=#303030 gui=NONE', 'hi Plf79e9e9eec303030N ctermfg=247 ctermbg=236 cterm=NONE guifg=#9e9e9e guibg=#303030 gui=NONE', 'hi Plec303030ec303030N ctermfg=236 ctermbg=236 cterm=NONE guifg=#303030 guibg=#303030 gui=NONE', 'hi Plfabcbcbcf0585858N ctermfg=250 ctermbg=240 cterm=NONE guifg=#bcbcbc guibg=#585858 gui=NONE', 'hi Plec303030fcd0d0d0b ctermfg=236 ctermbg=252 cterm=bold guifg=#303030 guibg=#d0d0d0 gui=bold', 'hi Plf4808080fcd0d0d0N ctermfg=244 ctermbg=252 cterm=NONE guifg=#808080 guibg=#d0d0d0 gui=NONE', 'hi Pla0d70000f1626262N ctermfg=160 ctermbg=241 cterm=NONE guifg=#d70000 guibg=#626262 gui=NONE', 'hi Ple7fffffff1626262b ctermfg=231 ctermbg=241 cterm=bold guifg=#ffffff guibg=#626262 gui=bold', 'hi Plf1626262f0585858N ctermfg=241 ctermbg=240 cterm=NONE guifg=#626262 guibg=#585858 gui=NONE', 'hi Pl58870000e9121212N ctermfg=88 ctermbg=233 cterm=NONE guifg=#870000 guibg=#121212 gui=NONE', 'hi Plf1626262e9121212N ctermfg=241 ctermbg=233 cterm=NONE guifg=#626262 guibg=#121212 gui=NONE', 'hi Plf58a8a8ae9121212b ctermfg=245 ctermbg=233 cterm=bold guifg=#8a8a8a guibg=#121212 gui=bold', 'hi Ple9121212e9121212N ctermfg=233 ctermbg=233 cterm=NONE guifg=#121212 guibg=#121212 gui=NONE', 'hi Ple7ffffffe9121212N ctermfg=231 ctermbg=233 cterm=NONE guifg=#ffffff guibg=#121212 gui=NONE', 'hi Plf0585858eb262626N ctermfg=240 ctermbg=235 cterm=NONE guifg=#585858 guibg=#262626 gui=NONE', 'hi Pleb262626e9121212N ctermfg=235 ctermbg=233 cterm=NONE guifg=#262626 guibg=#121212 gui=NONE', 'hi Plf58a8a8aeb262626b ctermfg=245 ctermbg=235 cterm=bold guifg=#8a8a8a guibg=#262626 gui=bold', 'hi Plf1626262eb262626N ctermfg=241 ctermbg=235 cterm=NONE guifg=#626262 guibg=#262626 gui=NONE', 'hi Pla0d70000d0ff8700N ctermfg=160 ctermbg=208 cterm=NONE guifg=#d70000 guibg=#ff8700 gui=NONE', 'hi Pl58870000d0ff8700b ctermfg=88 ctermbg=208 cterm=bold guifg=#870000 guibg=#ff8700 gui=bold', 'hi Pld0ff8700f0585858N ctermfg=208 ctermbg=240 cterm=NONE guifg=#ff8700 guibg=#585858 gui=NONE', 'hi Pla0d70000e7ffffffN ctermfg=160 ctermbg=231 cterm=NONE guifg=#d70000 guibg=#ffffff gui=NONE', 'hi Pl17005f5fe7ffffffb ctermfg=23 ctermbg=231 cterm=bold guifg=#005f5f guibg=#ffffff gui=bold', 'hi Ple7ffffff1f0087afN ctermfg=231 ctermbg=31 cterm=NONE guifg=#ffffff guibg=#0087af gui=NONE', 'hi Plc4ff00001f0087afb ctermfg=196 ctermbg=31 cterm=bold guifg=#ff0000 guibg=#0087af gui=bold', 'hi Pl7587d7ff1f0087afN ctermfg=117 ctermbg=31 cterm=NONE guifg=#87d7ff guibg=#0087af gui=NONE', 'hi Ple7ffffff1f0087afb ctermfg=231 ctermbg=31 cterm=bold guifg=#ffffff guibg=#0087af gui=bold', 'hi Pl1f0087af18005f87N ctermfg=31 ctermbg=24 cterm=NONE guifg=#0087af guibg=#005f87 gui=NONE', 'hi Ple7ffffff18005f87N ctermfg=231 ctermbg=24 cterm=NONE guifg=#ffffff guibg=#005f87 gui=NONE', 'hi Pl7587d7ff18005f87N ctermfg=117 ctermbg=24 cterm=NONE guifg=#87d7ff guibg=#005f87 gui=NONE', 'hi Pl18005f8718005f87N ctermfg=24 ctermbg=24 cterm=NONE guifg=#005f87 guibg=#005f87 gui=NONE', 'hi Pl17005f5f7587d7ffb ctermfg=23 ctermbg=117 cterm=bold guifg=#005f5f guibg=#87d7ff gui=bold', 'hi Pl17005f5f7587d7ffN ctermfg=23 ctermbg=117 cterm=NONE guifg=#005f5f guibg=#87d7ff gui=NONE', 'hi Pla0d7000094afd700N ctermfg=160 ctermbg=148 cterm=NONE guifg=#d70000 guibg=#afd700 gui=NONE', 'hi Pl16005f0094afd700b ctermfg=22 ctermbg=148 cterm=bold guifg=#005f00 guibg=#afd700 gui=bold', 'hi Pl94afd700f0585858N ctermfg=148 ctermbg=240 cterm=NONE guifg=#afd700 guibg=#585858 gui=NONE', 'hi Ple7ffffff7caf0000b ctermfg=231 ctermbg=124 cterm=bold guifg=#ffffff guibg=#af0000 gui=bold', 'hi Pl7caf000058870000N ctermfg=124 ctermbg=88 cterm=NONE guifg=#af0000 guibg=#870000 gui=NONE', 'hi Ple7ffffff58870000N ctermfg=231 ctermbg=88 cterm=NONE guifg=#ffffff guibg=#870000 gui=NONE', 'hi Pl5887000058870000N ctermfg=88 ctermbg=88 cterm=NONE guifg=#870000 guibg=#870000 gui=NONE', 'hi Pla0d70000345f0000b ctermfg=160 ctermbg=52 cterm=bold guifg=#d70000 guibg=#5f0000 gui=bold', 'hi Pl345f0000345f0000N ctermfg=52 ctermbg=52 cterm=NONE guifg=#5f0000 guibg=#5f0000 gui=NONE', 'hi Ple7ffffff345f0000N ctermfg=231 ctermbg=52 cterm=NONE guifg=#ffffff guibg=#5f0000 gui=NONE', 'hi Pla0d70000345f0000N ctermfg=160 ctermbg=52 cterm=NONE guifg=#d70000 guibg=#5f0000 gui=NONE', 'hi Ple7fffffff0585858N ctermfg=231 ctermbg=240 cterm=NONE guifg=#ffffff guibg=#585858 gui=NONE', 'hi Plf58a8a8aeb262626N ctermfg=245 ctermbg=235 cterm=NONE guifg=#8a8a8a guibg=#262626 gui=NONE', 'hi Ple7ffffff465faf00b ctermfg=231 ctermbg=70 cterm=bold guifg=#ffffff guibg=#5faf00 gui=bold', 'hi Pl465faf001c008700N ctermfg=70 ctermbg=28 cterm=NONE guifg=#5faf00 guibg=#008700 gui=NONE', 'hi Pl94afd7001c008700N ctermfg=148 ctermbg=28 cterm=NONE guifg=#afd700 guibg=#008700 gui=NONE', 'hi Pl1c0087001c008700N ctermfg=28 ctermbg=28 cterm=NONE guifg=#008700 guibg=#008700 gui=NONE', 'hi Ple7ffffff1c008700N ctermfg=231 ctermbg=28 cterm=NONE guifg=#ffffff guibg=#008700 gui=NONE', 'hi Pl465faf0016005f00b ctermfg=70 ctermbg=22 cterm=bold guifg=#5faf00 guibg=#005f00 gui=bold', 'hi Pl465faf0016005f00N ctermfg=70 ctermbg=22 cterm=NONE guifg=#5faf00 guibg=#005f00 gui=NONE', 'hi Pl16005f0016005f00N ctermfg=22 ctermbg=22 cterm=NONE guifg=#005f00 guibg=#005f00 gui=NONE', 'hi Ple7ffffff16005f00N ctermfg=231 ctermbg=22 cterm=NONE guifg=#ffffff guibg=#005f00 gui=NONE', 'hi Ple7ffffff62875fd7N ctermfg=231 ctermbg=98 cterm=NONE guifg=#ffffff guibg=#875fd7 gui=NONE', 'hi Pl62875fd7e7ffffffN ctermfg=98 ctermbg=231 cterm=NONE guifg=#875fd7 guibg=#ffffff gui=NONE', 'hi Pl375f00afe7ffffffb ctermfg=55 ctermbg=231 cterm=bold guifg=#5f00af guibg=#ffffff gui=bold', 'hi Pl62875fd7375f00afN ctermfg=98 ctermbg=55 cterm=NONE guifg=#875fd7 guibg=#5f00af gui=NONE', 'hi Plc4ff0000375f00afb ctermfg=196 ctermbg=55 cterm=bold guifg=#ff0000 guibg=#5f00af gui=bold', 'hi Pl375f00af375f00afN ctermfg=55 ctermbg=55 cterm=NONE guifg=#5f00af guibg=#5f00af gui=NONE', 'hi Ple7ffffff375f00afN ctermfg=231 ctermbg=55 cterm=NONE guifg=#ffffff guibg=#5f00af gui=NONE', 'hi Plbdd7d7ff375f00afN ctermfg=189 ctermbg=55 cterm=NONE guifg=#d7d7ff guibg=#5f00af gui=NONE', 'hi Pl375f00afe7ffffffN ctermfg=55 ctermbg=231 cterm=NONE guifg=#5f00af guibg=#ffffff gui=NONE'] +let g:Pl#THEME = [{'mode_statuslines': {'r': '%(%(%#Ple7ffffffa0d70000b# %{&paste ? "PASTE" : ""} %)%#Ple7ffffffa0d70000b#│%)%(%(%#Ple7ffffffa0d70000b# %{Powerline#Functions#GetMode()} %)%#Pla0d70000f0585858N#%)%( %(%#Plc4ff0000f0585858b#%{&readonly ? "RO" : ""} %)%(%#Plfcd0d0d0f0585858N#%{Powerline#Functions#GetFilepath()}%)%(%#Ple7fffffff0585858b#%t %)%(%#Plc4ff0000f0585858b#%M %)%(%#Plc4ff0000f0585858b#%H%W %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plec303030ec303030N#%(%#Plf79e9e9eec303030N# %{&fileformat} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{(&fenc == "" ? &enc : &fenc)} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{strlen(&ft) ? &ft : "no ft"} %)%)%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)%(%#Plfcd0d0d0f0585858N#%(%#Plec303030fcd0d0d0b# LN %3l%)%(%#Plf4808080fcd0d0d0N#:%-2v%) %)', 's': '%(%(%#Ple7ffffffa0d70000b# %{&paste ? "PASTE" : ""} %)%#Pla0d70000f1626262N#%)%(%(%#Ple7fffffff1626262b# %{Powerline#Functions#GetMode()} %)%#Plf1626262f0585858N#%)%( %(%#Plc4ff0000f0585858b#%{&readonly ? "RO" : ""} %)%(%#Plfcd0d0d0f0585858N#%{Powerline#Functions#GetFilepath()}%)%(%#Ple7fffffff0585858b#%t %)%(%#Plc4ff0000f0585858b#%M %)%(%#Plc4ff0000f0585858b#%H%W %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plec303030ec303030N#%(%#Plf79e9e9eec303030N# %{&fileformat} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{(&fenc == "" ? &enc : &fenc)} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{strlen(&ft) ? &ft : "no ft"} %)%)%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)%(%#Plfcd0d0d0f0585858N#%(%#Plec303030fcd0d0d0b# LN %3l%)%(%#Plf4808080fcd0d0d0N#:%-2v%) %)', 'N': '%( %(%#Pl58870000e9121212N#%{&readonly ? "RO" : ""} %)%(%#Plf1626262e9121212N#%{Powerline#Functions#GetFilepath()}%)%(%#Plf58a8a8ae9121212b#%t %)%(%#Pl58870000e9121212N#%M %)%(%#Pl58870000e9121212N#%H%W %)%#Ple9121212e9121212N#%)%<%#Ple7ffffffe9121212N#%=%(%#Pleb262626e9121212N#%(%#Plf0585858eb262626N# %3p%% %)%)%(%#Plf58a8a8aeb262626b#│%(%#Plf58a8a8aeb262626b# LN %3l%)%(%#Plf1626262eb262626N#:%-2v%) %)', 'v': '%(%(%#Ple7ffffffa0d70000b# %{&paste ? "PASTE" : ""} %)%#Pla0d70000d0ff8700N#%)%(%(%#Pl58870000d0ff8700b# %{Powerline#Functions#GetMode()} %)%#Pld0ff8700f0585858N#%)%( %(%#Plc4ff0000f0585858b#%{&readonly ? "RO" : ""} %)%(%#Plfcd0d0d0f0585858N#%{Powerline#Functions#GetFilepath()}%)%(%#Ple7fffffff0585858b#%t %)%(%#Plc4ff0000f0585858b#%M %)%(%#Plc4ff0000f0585858b#%H%W %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plec303030ec303030N#%(%#Plf79e9e9eec303030N# %{&fileformat} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{(&fenc == "" ? &enc : &fenc)} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{strlen(&ft) ? &ft : "no ft"} %)%)%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)%(%#Plfcd0d0d0f0585858N#%(%#Plec303030fcd0d0d0b# LN %3l%)%(%#Plf4808080fcd0d0d0N#:%-2v%) %)', 'i': '%(%(%#Ple7ffffffa0d70000b# %{&paste ? "PASTE" : ""} %)%#Pla0d70000e7ffffffN#%)%(%(%#Pl17005f5fe7ffffffb# %{Powerline#Functions#GetMode()} %)%#Ple7ffffff1f0087afN#%)%( %(%#Plc4ff00001f0087afb#%{&readonly ? "RO" : ""} %)%(%#Pl7587d7ff1f0087afN#%{Powerline#Functions#GetFilepath()}%)%(%#Ple7ffffff1f0087afb#%t %)%(%#Plc4ff00001f0087afb#%M %)%(%#Plc4ff00001f0087afb#%H%W %)%#Pl1f0087af18005f87N#%)%<%#Ple7ffffff18005f87N#%=%(%#Pl18005f8718005f87N#%(%#Pl7587d7ff18005f87N# %{&fileformat} %)%)%(%#Pl7587d7ff18005f87N#│%(%#Pl7587d7ff18005f87N# %{(&fenc == "" ? &enc : &fenc)} %)%)%(%#Pl7587d7ff18005f87N#│%(%#Pl7587d7ff18005f87N# %{strlen(&ft) ? &ft : "no ft"} %)%)%(%#Pl1f0087af18005f87N#%(%#Pl7587d7ff1f0087afN# %3p%% %)%)%(%#Pl7587d7ff1f0087afN#%(%#Pl17005f5f7587d7ffb# LN %3l%)%(%#Pl17005f5f7587d7ffN#:%-2v%) %)', 'n': '%(%(%#Ple7ffffffa0d70000b# %{&paste ? "PASTE" : ""} %)%#Pla0d7000094afd700N#%)%(%(%#Pl16005f0094afd700b# %{Powerline#Functions#GetMode()} %)%#Pl94afd700f0585858N#%)%( %(%#Plc4ff0000f0585858b#%{&readonly ? "RO" : ""} %)%(%#Plfcd0d0d0f0585858N#%{Powerline#Functions#GetFilepath()}%)%(%#Ple7fffffff0585858b#%t %)%(%#Plc4ff0000f0585858b#%M %)%(%#Plc4ff0000f0585858b#%H%W %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plec303030ec303030N#%(%#Plf79e9e9eec303030N# %{&fileformat} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{(&fenc == "" ? &enc : &fenc)} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{strlen(&ft) ? &ft : "no ft"} %)%)%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)%(%#Plfcd0d0d0f0585858N#%(%#Plec303030fcd0d0d0b# LN %3l%)%(%#Plf4808080fcd0d0d0N#:%-2v%) %)'}, 'matches': ['match', 'any', []]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff7caf0000b# %{"Command-T"} %)%#Pl7caf000058870000N#%)%<%#Ple7ffffff58870000N#%=%(%#Pl5887000058870000N#%(%#Ple7ffffff58870000N# %10(Match #%l%) %)%)', 's': '%(%(%#Ple7ffffff7caf0000b# %{"Command-T"} %)%#Pl7caf000058870000N#%)%<%#Ple7ffffff58870000N#%=%(%#Pl5887000058870000N#%(%#Ple7ffffff58870000N# %10(Match #%l%) %)%)', 'N': '%(%(%#Pla0d70000345f0000b# %{"Command-T"} %)%#Pl345f0000345f0000N#%)%<%#Ple7ffffff345f0000N#%=%(%#Pl345f0000345f0000N#%(%#Pla0d70000345f0000N# %10(Match #%l%) %)%)', 'v': '%(%(%#Ple7ffffff7caf0000b# %{"Command-T"} %)%#Pl7caf000058870000N#%)%<%#Ple7ffffff58870000N#%=%(%#Pl5887000058870000N#%(%#Ple7ffffff58870000N# %10(Match #%l%) %)%)', 'i': '%(%(%#Ple7ffffff7caf0000b# %{"Command-T"} %)%#Pl7caf000058870000N#%)%<%#Ple7ffffff58870000N#%=%(%#Pl5887000058870000N#%(%#Ple7ffffff58870000N# %10(Match #%l%) %)%)', 'n': '%(%(%#Ple7ffffff7caf0000b# %{"Command-T"} %)%#Pl7caf000058870000N#%)%<%#Ple7ffffff58870000N#%=%(%#Pl5887000058870000N#%(%#Ple7ffffff58870000N# %10(Match #%l%) %)%)'}, 'matches': ['match', 'any', [['bufname("%")', 'GoToFile']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Undo tree"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 's': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Undo tree"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'N': '%(%(%#Pla0d70000345f0000b# %{"Gundo"} %)%#Pla0d70000345f0000b#│%)%(%(%#Pla0d70000345f0000N# %{"Undo tree"} %)%#Pl345f0000345f0000N#%)%<%#Ple7ffffff345f0000N#%=', 'v': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Undo tree"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'i': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Undo tree"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'n': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Undo tree"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%='}, 'matches': ['match', 'any', [['bufname("%")', '__Gundo__']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Diff preview"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 's': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Diff preview"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'N': '%(%(%#Pla0d70000345f0000b# %{"Gundo"} %)%#Pla0d70000345f0000b#│%)%(%(%#Pla0d70000345f0000N# %{"Diff preview"} %)%#Pl345f0000345f0000N#%)%<%#Ple7ffffff345f0000N#%=', 'v': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Diff preview"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'i': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Diff preview"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'n': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Diff preview"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%='}, 'matches': ['match', 'any', [['bufname("%")', '__Gundo_Preview__']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7fffffff0585858N# %{"Help"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 's': '%(%(%#Ple7fffffff0585858N# %{"Help"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'N': '%(%(%#Plf58a8a8aeb262626N# %{"Help"} %)%#Pleb262626e9121212N#%)%(%(%#Plf58a8a8ae9121212b# %t %)%#Ple9121212e9121212N#%)%<%#Ple7ffffffe9121212N#%=%(%#Pleb262626e9121212N#%(%#Plf0585858eb262626N# %3p%% %)%)', 'v': '%(%(%#Ple7fffffff0585858N# %{"Help"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'i': '%(%(%#Ple7ffffff1f0087afN# %{"Help"} %)%#Ple7ffffff1f0087afN#│%)%(%(%#Ple7ffffff1f0087afb# %t %)%#Pl1f0087af18005f87N#%)%<%#Ple7ffffff18005f87N#%=%(%#Pl1f0087af18005f87N#%(%#Pl7587d7ff1f0087afN# %3p%% %)%)', 'n': '%(%(%#Ple7fffffff0585858N# %{"Help"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)'}, 'matches': ['match', 'any', [['&bt', 'help']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7fffffff0585858N# %{"Pager"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 's': '%(%(%#Ple7fffffff0585858N# %{"Pager"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'N': '%(%(%#Plf58a8a8aeb262626N# %{"Pager"} %)%#Pleb262626e9121212N#%)%(%(%#Plf58a8a8ae9121212b# %t %)%#Ple9121212e9121212N#%)%<%#Ple7ffffffe9121212N#%=%(%#Pleb262626e9121212N#%(%#Plf0585858eb262626N# %3p%% %)%)', 'v': '%(%(%#Ple7fffffff0585858N# %{"Pager"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'i': '%(%(%#Ple7ffffff1f0087afN# %{"Pager"} %)%#Ple7ffffff1f0087afN#│%)%(%(%#Ple7ffffff1f0087afb# %t %)%#Pl1f0087af18005f87N#%)%<%#Ple7ffffff18005f87N#%=%(%#Pl1f0087af18005f87N#%(%#Pl7587d7ff1f0087afN# %3p%% %)%)', 'n': '%(%(%#Ple7fffffff0585858N# %{"Pager"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)'}, 'matches': ['match', 'any', [['&ft', 'vimpager']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff465faf00b# %{"LustyExplorer"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Buffer list"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 's': '%(%(%#Ple7ffffff465faf00b# %{"LustyExplorer"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Buffer list"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'N': '%(%(%#Pl465faf0016005f00b# %{"LustyExplorer"} %)%#Pl465faf0016005f00b#│%)%(%(%#Pl465faf0016005f00N# %{"Buffer list"} %)%#Pl16005f0016005f00N#%)%<%#Ple7ffffff16005f00N#%=', 'v': '%(%(%#Ple7ffffff465faf00b# %{"LustyExplorer"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Buffer list"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'i': '%(%(%#Ple7ffffff465faf00b# %{"LustyExplorer"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Buffer list"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'n': '%(%(%#Ple7ffffff465faf00b# %{"LustyExplorer"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Buffer list"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%='}, 'matches': ['match', 'any', [['bufname("%")', '\[LustyExplorer-Buffers\]']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7fffffff0585858N# %{"Man page"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %{Powerline#Functions#ft_man#GetName()} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 's': '%(%(%#Ple7fffffff0585858N# %{"Man page"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %{Powerline#Functions#ft_man#GetName()} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'N': '%(%(%#Plf58a8a8aeb262626N# %{"Man page"} %)%#Pleb262626e9121212N#%)%(%(%#Plf58a8a8ae9121212b# %{Powerline#Functions#ft_man#GetName()} %)%#Ple9121212e9121212N#%)%<%#Ple7ffffffe9121212N#%=%(%#Pleb262626e9121212N#%(%#Plf0585858eb262626N# %3p%% %)%)', 'v': '%(%(%#Ple7fffffff0585858N# %{"Man page"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %{Powerline#Functions#ft_man#GetName()} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'i': '%(%(%#Ple7ffffff1f0087afN# %{"Man page"} %)%#Ple7ffffff1f0087afN#│%)%(%(%#Ple7ffffff1f0087afb# %{Powerline#Functions#ft_man#GetName()} %)%#Pl1f0087af18005f87N#%)%<%#Ple7ffffff18005f87N#%=%(%#Pl1f0087af18005f87N#%(%#Pl7587d7ff1f0087afN# %3p%% %)%)', 'n': '%(%(%#Ple7fffffff0585858N# %{"Man page"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %{Powerline#Functions#ft_man#GetName()} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)'}, 'matches': ['match', 'any', [['&ft', 'man']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff465faf00b# %{"MiniBufExplorer"} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 's': '%(%(%#Ple7ffffff465faf00b# %{"MiniBufExplorer"} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'N': '%(%(%#Pl465faf0016005f00b# %{"MiniBufExplorer"} %)%#Pl16005f0016005f00N#%)%<%#Ple7ffffff16005f00N#%=', 'v': '%(%(%#Ple7ffffff465faf00b# %{"MiniBufExplorer"} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'i': '%(%(%#Ple7ffffff465faf00b# %{"MiniBufExplorer"} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'n': '%(%(%#Ple7ffffff465faf00b# %{"MiniBufExplorer"} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%='}, 'matches': ['match', 'any', [['bufname("%")', '\-MiniBufExplorer\-']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7fffffff0585858N# %{"Quickfix"} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=', 's': '%(%(%#Ple7fffffff0585858N# %{"Quickfix"} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=', 'N': '%(%(%#Plf58a8a8aeb262626N# %{"Quickfix"} %)%#Pleb262626e9121212N#%)%<%#Ple7ffffffe9121212N#%=', 'v': '%(%(%#Ple7fffffff0585858N# %{"Quickfix"} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=', 'i': '%(%(%#Ple7ffffff1f0087afN# %{"Quickfix"} %)%#Pl1f0087af18005f87N#%)%<%#Ple7ffffff18005f87N#%=', 'n': '%(%(%#Ple7fffffff0585858N# %{"Quickfix"} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%='}, 'matches': ['match', 'any', [['&ft', 'qf']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff465faf00b# %{"Tagbar"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Tree"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 's': '%(%(%#Ple7ffffff465faf00b# %{"Tagbar"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Tree"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'N': '%(%(%#Pl465faf0016005f00b# %{"Tagbar"} %)%#Pl465faf0016005f00b#│%)%(%(%#Pl465faf0016005f00N# %{"Tree"} %)%#Pl16005f0016005f00N#%)%<%#Ple7ffffff16005f00N#%=', 'v': '%(%(%#Ple7ffffff465faf00b# %{"Tagbar"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Tree"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'i': '%(%(%#Ple7ffffff465faf00b# %{"Tagbar"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Tree"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'n': '%(%(%#Ple7ffffff465faf00b# %{"Tagbar"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Tree"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%='}, 'matches': ['match', 'any', [['&ft', 'tagbar']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff465faf00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 's': '%(%(%#Ple7ffffff465faf00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'N': '%(%(%#Pl465faf0016005f00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl16005f0016005f00N#%)%<%#Ple7ffffff16005f00N#%=', 'v': '%(%(%#Ple7ffffff465faf00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'i': '%(%(%#Ple7ffffff465faf00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'n': '%(%(%#Ple7ffffff465faf00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%='}, 'matches': ['match', 'any', [['&ft', 'nerdtree']]]}] +let g:Pl#THEME_CALLBACKS = [['function! PowerlineStatuslineCallback_ctrlp_main(...){{NEWLINE}}return Pl#StatuslineCallback(''%(%(%#Ple7ffffff62875fd7N# %-3{"%3"} %)%#Pl62875fd7e7ffffffN#%)%(%(%#Pl375f00afe7ffffffb# %-9{"%4"} %)%#Ple7ffffff62875fd7N#%)%(%(%#Ple7ffffff62875fd7N# %-3{"%5"} %)%#Pl62875fd7375f00afN#%)%(%(%#Plc4ff0000375f00afb# %{"%6" == " <+>" ? "" : strpart("%6", 2, len("%6") - 3)} %)%#Pl375f00af375f00afN#%)%<%#Ple7ffffff375f00afN#%=%(%#Pl375f00af375f00afN#%(%#Plbdd7d7ff375f00afN# %{"%0"} %)%)%(%#Plbdd7d7ff375f00afN#│%(%#Plbdd7d7ff375f00afN# %{"%1"} %)%)%(%#Pl62875fd7375f00afN#%(%#Ple7ffffff62875fd7N# %{substitute(getcwd(), expand("$HOME"), "~", "g")} %)%)'', a:000){{NEWLINE}}endfunction', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.main = "PowerlineStatuslineCallback_ctrlp_main"'], ['function! PowerlineStatuslineCallback_ctrlp_prog(...){{NEWLINE}}return Pl#StatuslineCallback(''%(%(%#Pl375f00afe7ffffffN# %-6{"%0"} %)%#Ple7ffffff375f00afN#%)%<%#Ple7ffffff375f00afN#%=%(%#Pl62875fd7375f00afN#%(%#Ple7ffffff62875fd7N# %{substitute(getcwd(), expand("$HOME"), "~", "g")} %)%)'', a:000){{NEWLINE}}endfunction', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.prog = "PowerlineStatuslineCallback_ctrlp_prog"']] diff --git a/sources_non_forked/vim-powerline/README.rst b/sources_non_forked/vim-powerline/README.rst new file mode 100755 index 00000000..72cd84f2 --- /dev/null +++ b/sources_non_forked/vim-powerline/README.rst @@ -0,0 +1,107 @@ +================= +Powerline for vim +================= + +:Author: Kim Silkebækken (kim.silkebaekken+vim@gmail.com) +:Source: https://github.com/Lokaltog/vim-powerline +:Version: β + +Introduction +------------ + +Powerline is a utility plugin which allows you to create better-looking, +more functional vim statuslines. See the screenshots below for +a demonstration of the plugin's capabilities. + +It's recommended that you install the plugin using Pathogen_ or Vundle_. +After the plugin is installed update your help tags and see ``:help +Powerline`` for instructions on how to enable and configure the plugin. + +See the `Troubleshooting`_ section below if you're having any issues with +the plugin or the font patcher. + +**Note:** You need a patched font to be able to use the symbols in the +statusline. An experimental Python/fontforge-based font patcher is included +in the ``fontpatcher`` directory. See ``fontpatcher/README.rst`` for usage +instructions. + +.. _Pathogen: https://github.com/tpope/vim-pathogen +.. _Vundle: https://github.com/gmarik/vundle + +Screenshots +----------- + +.. image:: http://i.imgur.com/MsuIB.png + +Troubleshooting +--------------- + +I can't see the fancy symbols, what's wrong? + Make sure that you have ``let g:Powerline_symbols = 'fancy'`` in your + ``vimrc`` file. The settings may be loaded too late if you have this in + ``gvimrc``, so always put this in your ``vimrc``. + + Clear the cache using ``:PowerlineClearCache`` and restart vim. + + Make sure that you've configured gvim or your terminal emulator to use + a patched font. + + Make sure that vim is compiled with the ``--with-features=big`` flag. + +The fancy symbols look a bit blurry or "off"! + Make sure that you have patched all variants of your font (i.e. both the + regular and the bold font files). + +I'm unable to patch my font, what should I do? + Font patching is only known to work on most Linux and OS X machines. If + you have followed the instructions in the fontpatcher README and still + have problems, please submit an issue on GitHub. + + You can download some community-contributed patched fonts from the + `Powerline wiki`_ if you don't want to mess around with the font + patcher. + +The Syntastic/Fugitive statusline flags don't work! + These flags should work without any configuration. If you installed + either plugin after Powerline, you'll have to clear the cache using + ``:PowerlineClearCache`` and restart vim. + +The colors are weird in the default OS X Terminal app! + The default OS X Terminal app is known to have some issues with the + Powerline colors. Please use another terminal emulator. iTerm2 should + work fine. + + The arrows may have the wrong colors if you have changed the "minimum + contrast" slider in the color tab of your OS X settings. + +The statusline has strange characters like ``^B`` in it! + Please add ``set encoding=utf-8`` to your ``vimrc``. + + You may also need to set your ``LANG`` and ``LC_*`` environment + variables to a UTF-8 locale (e.g. ``LANG=en_US.utf8``). Consult your + Linux distro's documentation for information about setting these + variables correctly. + +The statusline has a lot of ``^`` or underline characters in it! + You need to configure the ``fillchars`` setting to disable statusline + fillchars (see ``:h fillchars`` for details). Add this to your + ``vimrc`` to solve this issue:: + + set fillchars+=stl:\ ,stlnc:\ + +The statusline is hidden/only appears in split windows! + Make sure that you have ``set laststatus=2`` in your ``vimrc``. + +I'm using tmux and Powerline looks like crap, what's wrong? + You need to tell tmux that it has 256-color capabilities. Add this to + your ``.tmux.conf`` to solve this issue:: + + set -g default-terminal "screen-256color" + + If you use iTerm2, make sure that you have enabled the setting 'Set + locale variables automatically' in Profiles > Terminal > Environment. + +If you have any other issues and you can't find the answer in the docs, +please submit an issue on GitHub. + +.. _`Powerline wiki`: https://github.com/Lokaltog/vim-powerline/wiki/Patched-fonts diff --git a/sources_non_forked/vim-powerline/autoload/Pl.vim b/sources_non_forked/vim-powerline/autoload/Pl.vim new file mode 100755 index 00000000..c933030d --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Pl.vim @@ -0,0 +1,183 @@ +" Powerline - The ultimate statusline utility +" +" Author: Kim Silkebækken +" Source repository: https://github.com/Lokaltog/vim-powerline + +" Script variables {{{ + let g:Pl#OLD_STL = '' + let g:Pl#THEME = [] + let g:Pl#THEME_CALLBACKS = [] + let g:Pl#HL = [] + + " Cache revision, this must be incremented whenever the cache format is changed + let s:CACHE_REVISION = 7 +" }}} +" Script initialization {{{ + function! Pl#LoadCache() " {{{ + if filereadable(g:Powerline_cache_file) && g:Powerline_cache_enabled + exec 'source' escape(g:Powerline_cache_file, ' \') + + if ! exists('g:Powerline_cache_revision') || g:Powerline_cache_revision != s:CACHE_REVISION + " Cache revision differs, cache is invalid + unlet! g:Powerline_cache_revision + + return 0 + endif + + " Create highlighting groups + for hi_cmd in g:Pl#HL + exec hi_cmd + endfor + + " Run theme callbacks + for callback in g:Pl#THEME_CALLBACKS + " Substitute {{NEWLINE}} with newlines (strings must be + " stored without newlines characters to avoid vim errors) + exec substitute(callback[0], "{{NEWLINE}}", "\n", 'g') + exec substitute(callback[1], "{{NEWLINE}}", "\n", 'g') + endfor + + return 1 + endif + + return 0 + endfunction " }}} + function! Pl#ClearCache() " {{{ + if filereadable(g:Powerline_cache_file) + " Delete the cache file + call delete(g:Powerline_cache_file) + endif + + echo 'Powerline cache cleared. Please restart vim for the changes to take effect.' + endfunction " }}} + function! Pl#ReloadColorscheme() " {{{ + call Pl#ClearCache() + + " The colorscheme and theme files must be manually sourced because + " vim won't reload previously autoloaded files + " + " This is a bit hackish, but it works + unlet! g:Powerline#Colorschemes#{g:Powerline_colorscheme}#colorscheme + exec "source" split(globpath(&rtp, 'autoload/Powerline/Colorschemes/'. g:Powerline_colorscheme .'.vim', 1), '\n')[0] + + unlet! g:Powerline#Themes#{g:Powerline_theme}#theme + exec "source" split(globpath(&rtp, 'autoload/Powerline/Themes/'. g:Powerline_theme .'.vim', 1), '\n')[0] + + let g:Pl#THEME = [] + + call Pl#Load() + endfunction " }}} + function! Pl#Load() " {{{ + if empty(g:Pl#OLD_STL) + " Store old statusline + let g:Pl#OLD_STL = &statusline + endif + + if ! Pl#LoadCache() + try + " Autoload the theme dict first + let raw_theme = g:Powerline#Themes#{g:Powerline_theme}#theme + catch + echom 'Invalid Powerline theme! Please check your theme and colorscheme settings.' + + return + endtry + + " Create list with parsed statuslines + for buffer_statusline in raw_theme + unlet! mode_statuslines + let mode_statuslines = Pl#Parser#GetStatusline(buffer_statusline.segments) + + if ! empty(buffer_statusline.callback) + " The callback function passes its arguments on to + " Pl#StatuslineCallback along with the normal/current mode + " statusline. + let s:cb_func = "function! PowerlineStatuslineCallback_". buffer_statusline.callback[1] ."(...)\n" + let s:cb_func .= "return Pl#StatuslineCallback(". string(mode_statuslines['n']) .", a:000)\n" + let s:cb_func .= "endfunction" + + " The callback expression should be used to initialize any + " variables that will use the callback function. The + " expression requires a %s which will be replaced by the + " callback function name. + let s:cb_expr = printf(buffer_statusline.callback[2], 'PowerlineStatuslineCallback_'. buffer_statusline.callback[1]) + + exec s:cb_func + exec s:cb_expr + + " Newlines must be substituted with another character + " because vim doesn't like newlines in strings + call add(g:Pl#THEME_CALLBACKS, [substitute(s:cb_func, "\n", "{{NEWLINE}}", 'g'), substitute(s:cb_expr, "\n", "{{NEWLINE}}", 'g')]) + + unlet! s:cb_func s:cb_expr + + continue + endif + + " Store the statuslines for matching specific buffers + call add(g:Pl#THEME, { + \ 'matches': buffer_statusline.matches, + \ 'mode_statuslines': mode_statuslines + \ }) + endfor + + if ! g:Powerline_cache_enabled + " Don't cache anything if caching is disabled or cache file isn't writeable + return + endif + + " Prepare commands and statuslines for caching + let cache = [ + \ 'let g:Powerline_cache_revision = '. string(s:CACHE_REVISION), + \ 'let g:Pl#HL = '. string(g:Pl#HL), + \ 'let g:Pl#THEME = '. string(g:Pl#THEME), + \ 'let g:Pl#THEME_CALLBACKS = '. string(g:Pl#THEME_CALLBACKS), + \ ] + + call writefile(cache, g:Powerline_cache_file) + endif + endfunction " }}} +" }}} +" Statusline updater {{{ + function! Pl#Statusline(statusline, current) " {{{ + let mode = mode() + + if ! a:current + let mode = 'N' " Normal (non-current) + elseif mode =~# '\v(v|V|)' + let mode = 'v' " Visual mode + elseif mode =~# '\v(s|S|)' + let mode = 's' " Select mode + elseif mode =~# '\vi' + let mode = 'i' " Insert mode + elseif mode =~# '\v(R|Rv)' + let mode = 'r' " Replace mode + else + " Fallback to normal mode + let mode = 'n' " Normal (current) + endif + + return g:Pl#THEME[a:statusline].mode_statuslines[mode] + endfunction " }}} + function! Pl#StatuslineCallback(statusline, args) " {{{ + " Replace %1, %2, etc. in the statusline with the callback args + return substitute( + \ a:statusline, + \ '\v\%(\d+)', + \ '\=a:args[submatch(1)]', + \ 'g') + endfunction " }}} + function! Pl#UpdateStatusline(current) " {{{ + if empty(g:Pl#THEME) + " Load statuslines if they aren't loaded yet + call Pl#Load() + endif + + for i in range(0, len(g:Pl#THEME) - 1) + if Pl#Match#Validate(g:Pl#THEME[i]) + " Update window-local statusline + let &l:statusline = '%!Pl#Statusline('. i .','. a:current .')' + endif + endfor + endfunction " }}} +" }}} diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Colorscheme.vim b/sources_non_forked/vim-powerline/autoload/Pl/Colorscheme.vim new file mode 100755 index 00000000..ec15e461 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Pl/Colorscheme.vim @@ -0,0 +1,145 @@ +function! Pl#Colorscheme#Init(hi) " {{{ + let colorscheme = {} + + for hi in a:hi + " Ensure that the segments are a list + let segments = type(hi[0]) == type('') ? [ hi[0] ] : hi[0] + let mode_hi_dict = hi[1] + + for segment in segments + let colorscheme[segment] = mode_hi_dict + endfor + endfor + + return colorscheme +endfunction " }}} +function! Pl#Colorscheme#Apply(colorscheme, buffer_segments) " {{{ + " Set color parameters for all segments in a:buffer_segments + + " TODO This function should be recursive and work on both segments and groups + " TODO We could probably handle the NS stuff here... + + try + let colorscheme = g:Powerline#Colorschemes#{a:colorscheme}#colorscheme + catch + echom 'Color scheme "'. a:colorscheme .'" doesn''t exist!' + + return + endtry + + let buffer_segments = a:buffer_segments + + " This is a bit complex, I'll walk you through exactly what happens here... + " + " First of all we loop through the buffer_segments, which are the segments that + " this specific buffer will have. + for buffer_segment in buffer_segments + " The buffer_segment consists of a 'matches' list and a 'segments' list. + " The 'matches' list has conditions to limit this statusline to specific buffers/windows. + " The 'segments' list has each segment and segment group for this buffer + for segment in buffer_segment.segments + let type = get(segment, 'type', '') + + if type == 'segment_group' + " We're going to handle segment groups different from single segments. Segment groups + " have child segments which may have their own highlighting (e.g. fileinfo.flags), + " and these child segments may be grouped (e.g. fileinfo.flags.ro) to provide very + " specific highlighting. So here we'll handle all that: + + " Set the default/fallback colors for this group + for i in range(len(segment.variants), 0, -1) + " Check for available highlighting for the main group segment + " + " This works like the segment highlighting below + " TODO Create a function for this + let seg_variants = join(segment.variants[0:i], '.') + + let seg_name = i > 0 ? segment.name .'.'. seg_variants : segment.name + let seg_ns_name = len(segment.ns) > 0 ? segment.ns .':'. seg_name : seg_name + + if has_key(colorscheme, seg_ns_name) + " We have a namespaced highlight group + let segment.colors = colorscheme[seg_ns_name] + break + elseif has_key(colorscheme, seg_name) + " We have a non-namespaced group + let segment.colors = colorscheme[seg_name] + break + endif + endfor + + " The reason why we need to deepcopy the group's segments is that the child segments + " all point to the same base segments and that screws up highlighting if we highlight + " some child segments with different namespaced colors + let segment.segments = deepcopy(segment.segments) + + " Apply colors to each child segment + for child_segment in segment.segments + " Check if this child segment is grouped (e.g. fileinfo.flags.group.subgroup) + " We're going to prioritize the most specific grouping and then work back to the + " most common group (e.g. fileinfo.flags) + + " FIXME We don't have the variants from before because group children aren't run through Pl#Segment#Get + let child_segment.variants = [seg_name] + split(child_segment.name, '\.') + + " Use the parent group's namespace + let child_segment.ns = segment.ns + + for i in range(len(child_segment.variants), 0, -1) + " Check for available highlighting for the main group segment + let child_seg_name = join(child_segment.variants[0:i], '.') + + let child_seg_ns_name = len(child_segment.ns) > 0 ? child_segment.ns .':'. child_seg_name : child_seg_name + + if has_key(colorscheme, child_seg_ns_name) + " We have a namespaced highlight group + let child_segment.colors = colorscheme[child_seg_ns_name] + break + elseif has_key(colorscheme, child_seg_name) + " We have a non-namespaced group + let child_segment.colors = colorscheme[child_seg_name] + break + endif + endfor + endfor + elseif type == 'segment' + for i in range(len(segment.variants), 0, -1) + " Check for available highlighting + " + " This is done in the following manner, using the segment gundo:static_filename.text.buffer as an example: + " + " * Look for the hl group: gundo:static_filename.text.buffer + " * Look for the hl group: static_filename.text.buffer + " * Look for the hl group: gundo:static_filename.text + " * Look for the hl group: static_filename.text + " * Look for the hl group: gundo:static_filename + " * Look for the hl group: static_filename + " * Return the segment without highlighting, causing an error in the parser + let seg_variants = join(segment.variants[0:i], '.') + + let seg_name = i > 0 ? segment.name .'.'. seg_variants : segment.name + let seg_ns_name = len(segment.ns) > 0 ? segment.ns .':'. seg_name : seg_name + + if has_key(colorscheme, seg_ns_name) + " We have a namespaced highlight group + let segment.colors = colorscheme[seg_ns_name] + break + elseif has_key(colorscheme, seg_name) + " We have a non-namespaced group + let segment.colors = colorscheme[seg_name] + break + endif + endfor + endif + + unlet! segment + endfor + endfor + + " Good luck parsing this return value + " + " It's a huge dict with all segments for all buffers with their respective syntax highlighting. + " It will be parsed by the main Powerline code, where all the data will be shortened to a simple + " array consiting of a statusline for each mode, with generated highlighting groups and dividers. + return buffer_segments +endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Hi.vim b/sources_non_forked/vim-powerline/autoload/Pl/Hi.vim new file mode 100755 index 00000000..f6b3eea2 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Pl/Hi.vim @@ -0,0 +1,140 @@ +" cterm -> gui color dict {{{ +let s:cterm2gui_dict = { + \ 16: 0x000000, 17: 0x00005f, 18: 0x000087, 19: 0x0000af, 20: 0x0000d7, 21: 0x0000ff, + \ 22: 0x005f00, 23: 0x005f5f, 24: 0x005f87, 25: 0x005faf, 26: 0x005fd7, 27: 0x005fff, + \ 28: 0x008700, 29: 0x00875f, 30: 0x008787, 31: 0x0087af, 32: 0x0087d7, 33: 0x0087ff, + \ 34: 0x00af00, 35: 0x00af5f, 36: 0x00af87, 37: 0x00afaf, 38: 0x00afd7, 39: 0x00afff, + \ 40: 0x00d700, 41: 0x00d75f, 42: 0x00d787, 43: 0x00d7af, 44: 0x00d7d7, 45: 0x00d7ff, + \ 46: 0x00ff00, 47: 0x00ff5f, 48: 0x00ff87, 49: 0x00ffaf, 50: 0x00ffd7, 51: 0x00ffff, + \ 52: 0x5f0000, 53: 0x5f005f, 54: 0x5f0087, 55: 0x5f00af, 56: 0x5f00d7, 57: 0x5f00ff, + \ 58: 0x5f5f00, 59: 0x5f5f5f, 60: 0x5f5f87, 61: 0x5f5faf, 62: 0x5f5fd7, 63: 0x5f5fff, + \ 64: 0x5f8700, 65: 0x5f875f, 66: 0x5f8787, 67: 0x5f87af, 68: 0x5f87d7, 69: 0x5f87ff, + \ 70: 0x5faf00, 71: 0x5faf5f, 72: 0x5faf87, 73: 0x5fafaf, 74: 0x5fafd7, 75: 0x5fafff, + \ 76: 0x5fd700, 77: 0x5fd75f, 78: 0x5fd787, 79: 0x5fd7af, 80: 0x5fd7d7, 81: 0x5fd7ff, + \ 82: 0x5fff00, 83: 0x5fff5f, 84: 0x5fff87, 85: 0x5fffaf, 86: 0x5fffd7, 87: 0x5fffff, + \ 88: 0x870000, 89: 0x87005f, 90: 0x870087, 91: 0x8700af, 92: 0x8700d7, 93: 0x8700ff, + \ 94: 0x875f00, 95: 0x875f5f, 96: 0x875f87, 97: 0x875faf, 98: 0x875fd7, 99: 0x875fff, + \ 100: 0x878700, 101: 0x87875f, 102: 0x878787, 103: 0x8787af, 104: 0x8787d7, 105: 0x8787ff, + \ 106: 0x87af00, 107: 0x87af5f, 108: 0x87af87, 109: 0x87afaf, 110: 0x87afd7, 111: 0x87afff, + \ 112: 0x87d700, 113: 0x87d75f, 114: 0x87d787, 115: 0x87d7af, 116: 0x87d7d7, 117: 0x87d7ff, + \ 118: 0x87ff00, 119: 0x87ff5f, 120: 0x87ff87, 121: 0x87ffaf, 122: 0x87ffd7, 123: 0x87ffff, + \ 124: 0xaf0000, 125: 0xaf005f, 126: 0xaf0087, 127: 0xaf00af, 128: 0xaf00d7, 129: 0xaf00ff, + \ 130: 0xaf5f00, 131: 0xaf5f5f, 132: 0xaf5f87, 133: 0xaf5faf, 134: 0xaf5fd7, 135: 0xaf5fff, + \ 136: 0xaf8700, 137: 0xaf875f, 138: 0xaf8787, 139: 0xaf87af, 140: 0xaf87d7, 141: 0xaf87ff, + \ 142: 0xafaf00, 143: 0xafaf5f, 144: 0xafaf87, 145: 0xafafaf, 146: 0xafafd7, 147: 0xafafff, + \ 148: 0xafd700, 149: 0xafd75f, 150: 0xafd787, 151: 0xafd7af, 152: 0xafd7d7, 153: 0xafd7ff, + \ 154: 0xafff00, 155: 0xafff5f, 156: 0xafff87, 157: 0xafffaf, 158: 0xafffd7, 159: 0xafffff, + \ 160: 0xd70000, 161: 0xd7005f, 162: 0xd70087, 163: 0xd700af, 164: 0xd700d7, 165: 0xd700ff, + \ 166: 0xd75f00, 167: 0xd75f5f, 168: 0xd75f87, 169: 0xd75faf, 170: 0xd75fd7, 171: 0xd75fff, + \ 172: 0xd78700, 173: 0xd7875f, 174: 0xd78787, 175: 0xd787af, 176: 0xd787d7, 177: 0xd787ff, + \ 178: 0xd7af00, 179: 0xd7af5f, 180: 0xd7af87, 181: 0xd7afaf, 182: 0xd7afd7, 183: 0xd7afff, + \ 184: 0xd7d700, 185: 0xd7d75f, 186: 0xd7d787, 187: 0xd7d7af, 188: 0xd7d7d7, 189: 0xd7d7ff, + \ 190: 0xd7ff00, 191: 0xd7ff5f, 192: 0xd7ff87, 193: 0xd7ffaf, 194: 0xd7ffd7, 195: 0xd7ffff, + \ 196: 0xff0000, 197: 0xff005f, 198: 0xff0087, 199: 0xff00af, 200: 0xff00d7, 201: 0xff00ff, + \ 202: 0xff5f00, 203: 0xff5f5f, 204: 0xff5f87, 205: 0xff5faf, 206: 0xff5fd7, 207: 0xff5fff, + \ 208: 0xff8700, 209: 0xff875f, 210: 0xff8787, 211: 0xff87af, 212: 0xff87d7, 213: 0xff87ff, + \ 214: 0xffaf00, 215: 0xffaf5f, 216: 0xffaf87, 217: 0xffafaf, 218: 0xffafd7, 219: 0xffafff, + \ 220: 0xffd700, 221: 0xffd75f, 222: 0xffd787, 223: 0xffd7af, 224: 0xffd7d7, 225: 0xffd7ff, + \ 226: 0xffff00, 227: 0xffff5f, 228: 0xffff87, 229: 0xffffaf, 230: 0xffffd7, 231: 0xffffff, + \ 232: 0x080808, 233: 0x121212, 234: 0x1c1c1c, 235: 0x262626, 236: 0x303030, 237: 0x3a3a3a, + \ 238: 0x444444, 239: 0x4e4e4e, 240: 0x585858, 241: 0x626262, 242: 0x6c6c6c, 243: 0x767676, + \ 244: 0x808080, 245: 0x8a8a8a, 246: 0x949494, 247: 0x9e9e9e, 248: 0xa8a8a8, 249: 0xb2b2b2, + \ 250: 0xbcbcbc, 251: 0xc6c6c6, 252: 0xd0d0d0, 253: 0xdadada, 254: 0xe4e4e4, 255: 0xeeeeee +\ } +" }}} +" Allocated color dict {{{ +let s:allocated_colors = { + \ 'NONE': 'NONE', + \ } +" }}} +function! s:Cterm2GUI(cterm) " {{{ + if toupper(a:cterm) == 'NONE' + return 'NONE' + endif + + if ! has_key(s:cterm2gui_dict, a:cterm) + return 0xff0000 + endif + + return s:cterm2gui_dict[a:cterm] +endfunction " }}} +function! Pl#Hi#Segments(segments, mode_colors) " {{{ + let mode_translate = { + \ 'normal': 'n', + \ 'noncurrent': 'N', + \ 'insert': 'i', + \ 'visual': 'v', + \ 'replace': 'r', + \ 'select': 's', + \ } + + let attributes = ['bold', 'italic', 'underline'] + + let segments = a:segments + let mode_hi_dict = {} + + " Mode dict + for [mode, colors] in items(a:mode_colors) + if has_key(mode_translate, mode) + let mode = mode_translate[mode] + endif + + unlet! fg + let fg = s:allocated_colors[colors[0]] + + let hi = { + \ 'cterm': [fg['cterm'], ''], + \ 'gui' : [fg['gui'], ''], + \ 'attr' : [] + \ } + + if exists('colors[1]') + if type(colors[1]) == type([]) + " We don't have a BG color, but we have attributes + let hi.attr = colors[1] + else + " The second parameter is the background color + unlet! bg + let bg = s:allocated_colors[colors[1]] + + let hi.cterm[1] = bg['cterm'] + let hi.gui[1] = bg['gui'] + endif + endif + + if exists('colors[2]') && type(colors[2]) == type([]) + " The third parameter is always an attribute list + let hi.attr = colors[2] + endif + + let mode_hi_dict[mode] = { + \ 'ctermfg': (empty(hi['cterm'][0]) ? '' : (string(hi['cterm'][0]) == 'NONE' ? 'NONE' : hi['cterm'][0])), + \ 'ctermbg': (empty(hi['cterm'][1]) ? '' : (string(hi['cterm'][1]) == 'NONE' ? 'NONE' : hi['cterm'][1])), + \ 'guifg' : (empty(hi['gui'][0]) ? '' : (string(hi['gui'][0]) == 'NONE' ? 'NONE' : hi['gui'][0])), + \ 'guibg' : (empty(hi['gui'][1]) ? '' : (string(hi['gui'][1]) == 'NONE' ? 'NONE' : hi['gui'][1])), + \ 'attr' : (! len(hi['attr']) ? 'NONE' : join(hi['attr'], ',')) + \ } + endfor + + return [segments, mode_hi_dict] +endfunction " }}} +function! Pl#Hi#Allocate(colors) " {{{ + for [key, color] in items(a:colors) + if type(color) == type(0) + " Only terminal color + let cterm = color + let gui = s:Cterm2GUI(color) + elseif type(color) == type([]) && len(color) == 2 + " Terminal and GUI colors + let cterm = color[0] + let gui = color[1] + endif + + let s:allocated_colors[key] = { + \ 'cterm': cterm, + \ 'gui': gui, + \ } + + unlet! color + endfor +endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Match.vim b/sources_non_forked/vim-powerline/autoload/Pl/Match.vim new file mode 100755 index 00000000..b05f5851 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Pl/Match.vim @@ -0,0 +1,43 @@ +function! Pl#Match#Add(pat, expr) " {{{ + return [a:pat, a:expr] +endfunction " }}} +function! Pl#Match#Any(...) " {{{ + let matches = [] + + for match_name in a:000 + if empty(match_name) + " Skip empty match parameters + continue + endif + + if has_key(g:Powerline#Matches#matches, match_name) + call add(matches, g:Powerline#Matches#matches[match_name]) + endif + + unlet! match_name + endfor + + return ['match', 'any', matches] +endfunction " }}} +function! Pl#Match#Validate(theme) " {{{ + let match = a:theme.matches[1] + + if match == 'none' + return 0 + elseif match == 'any' + let matches = a:theme.matches[2] + + if ! len(matches) + " Empty match array matches everything + return 1 + endif + + for [eval, re] in matches + if match(eval(eval), '\v'. re) != -1 + return 1 + endif + endfor + + return 0 + endif +endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Mod.vim b/sources_non_forked/vim-powerline/autoload/Pl/Mod.vim new file mode 100755 index 00000000..fdfb5718 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Pl/Mod.vim @@ -0,0 +1,40 @@ +let s:segment_mods = [] + +function! Pl#Mod#AddSegmentMod(action, properties) " {{{ + call add(s:segment_mods, [a:action, a:properties]) +endfunction " }}} +function! Pl#Mod#ApplySegmentMods(theme) " {{{ + let theme = deepcopy(a:theme) + + for mod in s:segment_mods + let [action, properties] = mod + + " We have to loop through the segments instead of using index() because some + " segments are lists! + let target_seg_idx = -1 + + for i in range(0, len(theme) - 1) + unlet! segment + let segment = theme[i] + + if type(segment) == type(properties.target_segment) && segment == properties.target_segment + let target_seg_idx = i + break + endif + endfor + + if action == 'insert_segment' + " Insert segment + if target_seg_idx != -1 + call insert(theme, properties.new_segment, (properties.where == 'before' ? target_seg_idx : target_seg_idx + 1)) + endif + elseif action == 'remove_segment' + " Remove segment + if target_seg_idx != -1 + call remove(theme, target_seg_idx) + endif + endif + endfor + + return theme +endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Parser.vim b/sources_non_forked/vim-powerline/autoload/Pl/Parser.vim new file mode 100755 index 00000000..a6f3428a --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Pl/Parser.vim @@ -0,0 +1,371 @@ +let g:Pl#Parser#Symbols = { + \ 'compatible': { + \ 'dividers': [ '', [0x2502], '', [0x2502] ] + \ , 'symbols' : { + \ 'BRANCH': 'BR:' + \ , 'RO' : 'RO' + \ , 'FT' : 'FT' + \ , 'LINE' : 'LN' + \ } + \ }, + \ 'unicode': { + \ 'dividers': [ [0x25b6], [0x276f], [0x25c0], [0x276e] ] + \ , 'symbols' : { + \ 'BRANCH': [0x26a1] + \ , 'RO' : [0x2613] + \ , 'FT' : [0x2691] + \ , 'LINE' : [0x204b] + \ }, + \ }, + \ 'fancy': { + \ 'dividers': [ [0x2b80], [0x2b81], [0x2b82], [0x2b83] ] + \ , 'symbols' : { + \ 'BRANCH': [0x2b60] + \ , 'RO' : [0x2b64] + \ , 'FT' : [0x2b62, 0x2b63] + \ , 'LINE' : [0x2b61] + \ } + \ } +\ } + +" Handle symbol overrides +for [s:key, s:value] in items(g:Powerline_symbols_override) + let g:Pl#Parser#Symbols[g:Powerline_symbols].symbols[s:key] = s:value + + unlet! s:key s:value +endfor + +" Handle divider overrides +if len(g:Powerline_dividers_override) == 4 + let g:Pl#Parser#Symbols[g:Powerline_symbols].dividers = g:Powerline_dividers_override +endif + +let s:LEFT_SIDE = 0 +let s:RIGHT_SIDE = 2 + +let s:PADDING = 1 + +let s:EMPTY_SEGMENT = { 'type': 'empty' } + +let s:HARD_DIVIDER = 0 +let s:SOFT_DIVIDER = 1 + +function! Pl#Parser#GetStatusline(segments) " {{{ + let statusline = { + \ 'n': '' + \ , 'N': '' + \ , 'v': '' + \ , 'i': '' + \ , 'r': '' + \ , 's': '' + \ } + + " Run through the different modes and create the statuslines + for mode in keys(statusline) + " Create an empty statusline list + let stl = [] + + call extend(stl, s:ParseSegments(mode, s:LEFT_SIDE, a:segments)) + + let statusline[mode] .= join(stl, '') + endfor + + return statusline +endfunction " }}} +function! Pl#Parser#ParseChars(arg) " {{{ + " Handles symbol arrays which can be either an array of hex values, + " or a string. Will convert the hex array to a string, or return the + " string as-is. + let arg = a:arg + + if type(arg) == type([]) + " Hex array + call map(arg, 'nr2char(v:val)') + + return join(arg, '') + endif + + " Anything else, just return it as it is + return arg +endfunction " }}} +function! s:ParseSegments(mode, side, segments, ...) " {{{ + let mode = a:mode + let side = a:side + let segments = a:segments + + let level = exists('a:1') ? a:1 : 0 + let base_color = exists('a:2') ? a:2 : {} + + let ret = [] + + for i in range(0, len(segments) - 1) + unlet! seg_prev seg_curr seg_next + + " Prepare some resources (fetch previous, current and next segment) + let seg_curr = deepcopy(get(segments, i)) + + " Find previous segment + let seg_prev = s:EMPTY_SEGMENT + + " If we're currently at i = 0 we have to start on 0 or else we will start on the last segment (list[-1]) + let range_start = (i == 0 ? i : i - 1) + for j in range(range_start, 0, -1) + let seg = deepcopy(get(segments, j)) + if get(seg, 'name') ==# 'TRUNCATE' + " Skip truncate segments + continue + endif + + " Look ahead for another segment that's visible in this mode + if index(get(seg, 'modes'), mode) != -1 + " Use this segment + let seg_prev = seg + + break + endif + endfor + + "" Find next segment + let seg_next = s:EMPTY_SEGMENT + + " If we're currently at i = len(segments) - 1 we have to start on i or else we will get an error because the index doesn't exist + let range_start = (i == len(segments) - 1 ? i : i + 1) + for j in range(range_start, len(segments) - 1, 1) + let seg = deepcopy(get(segments, j)) + if get(seg, 'name') ==# 'TRUNCATE' + " Skip truncate segments + continue + endif + + " Look ahead for another segment that's visible in this mode + if index(get(seg, 'modes'), mode) != -1 + " Use this segment + let seg_next = seg + + break + endif + endfor + + if index(get(seg_curr, 'modes', []), mode) == -1 + " The segment is invisible in this mode, skip it + " FIXME When two segments after each other are hidden, a gap appears where the segments would be, this is probably due to segment padding + continue + endif + + " Handle the different segment types + if seg_curr.type == 'segment' + if seg_curr.name ==# 'TRUNCATE' + " Truncate statusline + call add(ret, '%<') + elseif seg_curr.name ==# 'SPLIT' + " Split statusline + + " Switch sides + let side = s:RIGHT_SIDE + + " Handle highlighting + let mode_colors = get(seg_curr.colors, mode, seg_curr.colors['n']) + let hl_group = s:HlCreate(mode_colors) + + " Add segment text + call add(ret, '%#'. hl_group .'#%=') + else + " Add segment text + let text = seg_curr.text + + " Decide on whether to use the group's colors or the segment's colors + let colors = get(seg_curr, 'colors', base_color) + + " Fallback to normal (current) highlighting if we don't have mode-specific highlighting + let mode_colors = get(colors, mode, get(colors, 'n', {})) + + if empty(mode_colors) + echom 'Segment doesn''t have any colors! NS: "'. seg_curr.ns .'" SEG: "'. seg_curr.name .'"' + + continue + endif + + " Check if we're in a group (level > 0) + if level > 0 + " If we're in a group we don't have dividers between + " segments, so we should only pad one side, but only pad + " if the segment doesn't have Pl#Segment#NoPadding() set + let padding_right = (seg_curr.padding && side == s:LEFT_SIDE ? repeat(' ', s:PADDING) : '') + let padding_left = (seg_curr.padding && side == s:RIGHT_SIDE ? repeat(' ', s:PADDING) : '') + + " Check if we lack a bg/fg color for this segment + " If we do, use the bg/fg color from base_color + let base_color_mode = ! has_key(base_color, mode) ? base_color['n'] : base_color[mode] + + for col in ['ctermbg', 'ctermfg', 'guibg', 'guifg'] + if empty(mode_colors[col]) + let mode_colors[col] = base_color_mode[col] + endif + endfor + else + "" If we're outside a group we have dividers and must pad both sides + let padding_left = repeat(' ', s:PADDING) + let padding_right = repeat(' ', s:PADDING) + endif + + " Get main hl group for segment + let hl_group = s:HlCreate(mode_colors) + + " Prepare segment text + let text = '%(%#'. hl_group .'#'. padding_left . text . padding_right . '%)' + + if level == 0 + " Add divider to single segments + let text = s:AddDivider(text, side, mode, colors, seg_prev, seg_curr, seg_next) + endif + + call add(ret, text) + endif + elseif seg_curr.type == 'segment_group' + " Recursively parse segment group + let func_params = [mode, side, seg_curr.segments, level + 1] + + if has_key(seg_curr, 'colors') + " Pass the base colors on to the child segments + call add(func_params, seg_curr.colors) + endif + + " Get segment group string + let text = join(call('s:ParseSegments', func_params), '') + + " Pad on the opposite side of the divider + let padding_right = (side == s:RIGHT_SIDE ? repeat(' ', s:PADDING) : '') + let padding_left = (side == s:LEFT_SIDE ? repeat(' ', s:PADDING) : '') + + let text = s:AddDivider(padding_left . text . padding_right, side, mode, seg_curr.colors, seg_prev, seg_curr, seg_next) + + call add(ret, text) + endif + endfor + + return ret +endfunction " }}} +function! s:HlCreate(hl) " {{{ + " Create a short and unique highlighting group name + " It uses the hex values of all the color properties and an attribute flag at the end + " NONE colors are translated to NN for cterm and NNNNNN for gui colors + let hi_group = printf('Pl%s%s%s%s%s' + \ , (a:hl['ctermfg'] == 'NONE' ? 'NN' : printf('%02x', a:hl['ctermfg'])) + \ , (a:hl['guifg'] == 'NONE' ? 'NNNNNN' : printf('%06x', a:hl['guifg'] )) + \ , (a:hl['ctermbg'] == 'NONE' ? 'NN' : printf('%02x', a:hl['ctermbg'])) + \ , (a:hl['guibg'] == 'NONE' ? 'NNNNNN' : printf('%06x', a:hl['guibg'] )) + \ , substitute(a:hl['attr'], '\v([a-zA-Z])[a-zA-Z]*,?', '\1', 'g') + \ ) + + if ! s:HlExists(hi_group) + let ctermbg = a:hl['ctermbg'] == 'NONE' ? 'NONE' : printf('%d', a:hl['ctermbg']) + if (has('win32') || has('win64')) && !has('gui_running') && ctermbg != 'NONE' && ctermbg > 128 + let ctermbg -= 128 + endif + let hi_cmd = printf('hi %s ctermfg=%s ctermbg=%s cterm=%s guifg=%s guibg=%s gui=%s' + \ , hi_group + \ , a:hl['ctermfg'] == 'NONE' ? 'NONE' : printf('%d', a:hl['ctermfg']) + \ , ctermbg + \ , a:hl['attr'] + \ , (a:hl['guifg'] == 'NONE' ? 'NONE' : printf('#%06x', a:hl['guifg'])) + \ , (a:hl['guibg'] == 'NONE' ? 'NONE' : printf('#%06x', a:hl['guibg'])) + \ , a:hl['attr'] + \ ) + + exec hi_cmd + + " Add command to Pl#HL list for caching + call add(g:Pl#HL, hi_cmd) + endif + + " Return only the highlighting group name + return hi_group +endfunction " }}} +function! s:HlExists(hl) " {{{ + if ! hlexists(a:hl) + return 0 + endif + + redir => hlstatus + silent exec 'hi' a:hl + redir END + + return (hlstatus !~ 'cleared') +endfunction " }}} +function! s:AddDivider(text, side, mode, colors, prev, curr, next) " {{{ + let seg_prev = a:prev + let seg_curr = a:curr + let seg_next = a:next + + " Set default color/type for the divider + let div_colors = get(a:colors, a:mode, a:colors['n']) + let div_type = s:SOFT_DIVIDER + + " Define segment to compare + let cmp_seg = a:side == s:LEFT_SIDE ? seg_next : seg_prev + + let cmp_all_colors = get(cmp_seg, 'colors', {}) + let cmp_colors = get(cmp_all_colors, a:mode, get(cmp_all_colors, 'n', {})) + + if ! empty(cmp_colors) + " Compare the highlighting groups + " + " If the background color for cterm is equal, use soft divider with the current segment's highlighting + " If not, use hard divider with a new highlighting group + " + " Note that if the previous/next segment is the split, a hard divider is always used + if get(div_colors, 'ctermbg') != get(cmp_colors, 'ctermbg') || get(seg_next, 'name') ==# 'SPLIT' || get(seg_prev, 'name') ==# 'SPLIT' + let div_type = s:HARD_DIVIDER + + " Create new highlighting group + if div_colors['attr'] =~ 'reverse' && cmp_colors['attr'] =~ 'reverse' + " Use FG = CURRENT FG, BG = CMP FG + let div_colors['ctermbg'] = get(cmp_colors, 'ctermfg') + let div_colors['guibg'] = get(cmp_colors, 'guifg') + + let div_colors['attr'] = div_colors['attr'] =~ 'bold' ? 'bold' : 'NONE' + elseif div_colors['attr'] =~ 'reverse' + " Use FG = CURRENT FG, BG = CMP BG + let div_colors['ctermbg'] = get(cmp_colors, 'ctermbg') + let div_colors['guibg'] = get(cmp_colors, 'guibg') + + let div_colors['attr'] = div_colors['attr'] =~ 'bold' ? 'bold' : 'NONE' + elseif cmp_colors['attr'] =~ 'reverse' + " Use FG = CMP FG, BG = CURRENT BG : reversed + let div_colors['ctermfg'] = get(cmp_colors, 'ctermfg') + let div_colors['guifg'] = get(cmp_colors, 'guifg') + + let div_colors['attr'] = 'reverse' + + else + " Use FG = CURRENT BG, BG = CMP BG + let div_colors['ctermfg'] = get(div_colors, 'ctermbg') + let div_colors['guifg'] = get(div_colors, 'guibg') + + let div_colors['ctermbg'] = get(cmp_colors, 'ctermbg') + let div_colors['guibg'] = get(cmp_colors, 'guibg') + + let div_colors['attr'] = 'NONE' + endif + endif + endif + + " Prepare divider + let divider_raw = deepcopy(g:Pl#Parser#Symbols[g:Powerline_symbols].dividers[a:side + div_type]) + let divider = Pl#Parser#ParseChars(divider_raw) + + " Don't add dividers for segments adjacent to split (unless it's a hard divider) + if ((get(seg_next, 'name') ==# 'SPLIT' || get(seg_prev, 'name') ==# 'SPLIT') && div_type != s:HARD_DIVIDER) + return '' + endif + + if a:side == s:LEFT_SIDE + " Left side + " Divider to the right + return printf('%%(%s%%#%s#%s%%)', a:text, s:HlCreate(div_colors), divider) + else + " Right side + " Divider to the left + return printf('%%(%%#%s#%s%s%%)', s:HlCreate(div_colors), divider, a:text) + endif +endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Segment.vim b/sources_non_forked/vim-powerline/autoload/Pl/Segment.vim new file mode 100755 index 00000000..bb09438c --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Pl/Segment.vim @@ -0,0 +1,188 @@ +let s:default_modes = ['n', 'N', 'v', 'i', 'r', 's'] + +function! s:CheckConditions(params) " {{{ + " Check conditions for a segment/group + " Integer parameters are always conditions + for param in a:params + if type(param) == type(0) && param == 0 + " Break here if it's an integer parameter and it's false (0) + return 0 + endif + unlet! param + endfor + + return 1 +endfunction " }}} +function! Pl#Segment#Create(name, ...) " {{{ + " Check condition parameters + if ! s:CheckConditions(a:000) + return {} + endif + + let name = a:name + let modes = s:default_modes + let padding = 1 + let segments = [] + + for param in a:000 + " Lookup modes for this segment/group + if type(param) == type([]) && param[0] == 'modes' + let modes = param[1] + elseif type(param) == type([]) && param[0] == 'nopadding' + let padding = 0 + elseif type(a:1) == type([]) && a:1[0] == 'segment' + call add(segments, param[1]) + endif + + unlet! param + endfor + + if type(a:1) == type([]) && a:1[0] == 'segment' + " This is a segment group + return ['segment_group', { + \ 'type': 'segment_group' + \ , 'name': name + \ , 'segments': segments + \ , 'modes': modes + \ , 'padding': padding + \ }] + else + " This is a single segment + let text = a:1 + + " Search/replace symbols + for [key, symbol] in items(g:Pl#Parser#Symbols[g:Powerline_symbols].symbols) + let text = substitute( + \ text, + \ '\v\$('. key .')', + \ '\=Pl#Parser#ParseChars(g:Pl#Parser#Symbols[g:Powerline_symbols].symbols[submatch(1)])', + \ 'g') + + unlet! key symbol + endfor + + return ['segment', { + \ 'type': 'segment' + \ , 'name': name + \ , 'text': text + \ , 'modes': modes + \ , 'padding': padding + \ }] + endif + +endfunction " }}} +function! Pl#Segment#Init(params) " {{{ + " Check condition parameters + if ! s:CheckConditions(a:params) + return {} + endif + + let segments = {} + let ns = '' + + for param in a:params + if type(param) == type('') + " String parameters is the namespace + let ns = param + elseif type(param) == type([]) + " The data dict is in param[1] + " By default we don't have a namespace for the segment + let segment = param[1] + + if ! empty(ns) + " Update segment so that it includes the namespace + " Add the namespace to the segment dict key + let segment.ns = ns + let segment.name = join([segment.ns, segment.name], ':') + endif + + let key = segment.name + + let segments[key] = segment + endif + + unlet! param + endfor + + return segments +endfunction " }}} +function! Pl#Segment#Modes(modes) " {{{ + " Handle modes for both segments and groups + let modes = split(a:modes, '\zs') + + if modes[0] == '!' + " Filter modes (e.g. "!nr" will ignore the segment in normal and replace modes) + let modes = filter(deepcopy(s:default_modes), 'v:val !~# "['. join(modes[1:]) .']"') + endif + + return ['modes', modes] +endfunction " }}} +function! Pl#Segment#NoPadding() " {{{ + return ['nopadding'] +endfunction " }}} +function! Pl#Segment#Split(...) " {{{ + return a:0 ? a:1 .':SPLIT' : 'SPLIT' +endfunction " }}} +function! Pl#Segment#Truncate() " {{{ + return 'TRUNCATE' +endfunction " }}} +function! Pl#Segment#Get(name) " {{{ + " Return a segment data dict + let args = [] + + " Check for printf segments (lists) + if type(a:name) == type([]) + " We're dealing with a segment with printf arguments + let seg_orig_name = a:name[0] + let args = a:name[1:] + else + let seg_orig_name = a:name + endif + + " Fetch namespace and variants for storing in the segment dict + let seg_ns = '' + let seg_variants = [] + + " Retrieve color scheme variants + let seg_name_split = split(seg_orig_name, '\v\.') + if len(seg_name_split) > 1 + let seg_variants = seg_name_split[1:] + endif + + " Retrieve segment name and namespace + " Use the first piece of the split string, we can't have variants in the final segment name + let seg_name_split = split(seg_name_split[0], '\v:') + let seg_name = seg_name_split[0] + + if len(seg_name_split) > 1 + let seg_ns = seg_name_split[0] + let seg_name = seg_name_split[-1] + endif + + try + " If we have a namespace, try to use the namespaced segment first (i.e. search for the segment in the namespaced file first) + let return_segment = deepcopy(g:Powerline#Segments#{seg_ns}#segments[seg_ns .':'. seg_name]) + catch + try + " We didn't find a namespaced segment, fall back to common segments + let return_segment = deepcopy(g:Powerline#Segments#segments[seg_name]) + catch + " Didn't find the segment among the common segments either, just skip it + return {} + endtry + endtry + + if len(args) && has_key(return_segment, 'text') + " Handle segment printf arguments + " printf doesn't accept lists as its second argument, so we have to work around that + let return_segment.text = call('printf', [ return_segment.text ] + args) + endif + + " Assign namespace, name and variants + let return_segment.ns = seg_ns + let return_segment.name = seg_name + let return_segment.orig_name = seg_orig_name + let return_segment.variants = seg_variants + + return return_segment +endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Theme.vim b/sources_non_forked/vim-powerline/autoload/Pl/Theme.vim new file mode 100755 index 00000000..da1581e2 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Pl/Theme.vim @@ -0,0 +1,100 @@ +function! Pl#Theme#Create(...) " {{{ + let buffer_segments = [] + + for buffer_segment in a:000 + " Remove empty segments (e.g. 'Pl#Theme#Function's) + if empty(buffer_segment) + continue + endif + + call add(buffer_segments, buffer_segment) + endfor + + let buffer_segments = Pl#Colorscheme#Apply(g:Powerline_colorscheme, buffer_segments) + + return buffer_segments +endfunction " }}} +function! Pl#Theme#Callback(name, expr) " {{{ + return ['callback', a:name, a:expr] +endfunction " }}} +function! Pl#Theme#Buffer(ns, ...) " {{{ + let segments = [] + let ns = ! empty(a:ns) ? a:ns .':' : '' + + " Match namespace parameter by default + let matches = Pl#Match#Any(a:ns) + let callback = [] + + let args = a:000 + let args = Pl#Mod#ApplySegmentMods(args) + + " Fetch segment data dicts + for item in args + if type(item) == type([]) + if item[0] == 'match' + " Match item, overrides default namespace match + let matches = item + + unlet! item + continue + elseif item[0] == 'callback' + " Store the item as a callback expression + let matches = ['match', 'none'] + let callback = [a:ns, item[1], item[2]] + + unlet! item + continue + endif + + " printf segment, append ns to first item in list + let item[0] = ns . item[0] + else + let item = ns . item + endif + + let segment = Pl#Segment#Get(item) + + if ! empty(segment) + " Skip empty (possible disabled) segments + call add(segments, segment) + endif + + unlet! item + endfor + + return { + \ 'matches': matches + \ , 'callback': callback + \ , 'segments': segments + \ } +endfunction " }}} +function! Pl#Theme#InsertSegment(new_segment, where, target_segment) " {{{ + " It's very important to NOT refer to the theme dict until everything's loaded! + " + " Because these functions are called from the vimrc, we need to put the + " actions in a list which will be parsed later. + " + " These functions don't accept a name parameter, because they work on the + " currently selected theme (will change any selected theme) + call Pl#Mod#AddSegmentMod('insert_segment', { + \ 'new_segment': a:new_segment, + \ 'where': a:where, + \ 'target_segment': a:target_segment + \ }) +endfunction " }}} +function! Pl#Theme#RemoveSegment(target_segment) " {{{ + " It's very important to NOT refer to the theme dict until everything's loaded! + " + " Because these functions are called from the vimrc, we need to put the + " actions in a list which will be parsed later. + " + " These functions don't accept a name parameter, because they work on the + " currently selected theme (will change any selected theme) + call Pl#Mod#AddSegmentMod('remove_segment', { + \ 'target_segment': a:target_segment + \ }) +endfunction " }}} +function! Pl#Theme#ReplaceSegment(old_segment, new_segment) " {{{ + call Pl#Theme#InsertSegment(a:new_segment, 'after', a:old_segment) + call Pl#Theme#RemoveSegment(a:old_segment) +endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/default.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/default.vim new file mode 100755 index 00000000..4d4c7fa8 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/default.vim @@ -0,0 +1,166 @@ +call Pl#Hi#Allocate({ + \ 'black' : 16, + \ 'white' : 231, + \ + \ 'darkestgreen' : 22, + \ 'darkgreen' : 28, + \ 'mediumgreen' : 70, + \ 'brightgreen' : 148, + \ + \ 'darkestcyan' : 23, + \ 'mediumcyan' : 117, + \ + \ 'darkestblue' : 24, + \ 'darkblue' : 31, + \ + \ 'darkestred' : 52, + \ 'darkred' : 88, + \ 'mediumred' : 124, + \ 'brightred' : 160, + \ 'brightestred' : 196, + \ + \ 'darkestpurple' : 55, + \ 'mediumpurple' : 98, + \ 'brightpurple' : 189, + \ + \ 'brightorange' : 208, + \ 'brightestorange': 214, + \ + \ 'gray0' : 233, + \ 'gray1' : 235, + \ 'gray2' : 236, + \ 'gray3' : 239, + \ 'gray4' : 240, + \ 'gray5' : 241, + \ 'gray6' : 244, + \ 'gray7' : 245, + \ 'gray8' : 247, + \ 'gray9' : 250, + \ 'gray10' : 252, + \ }) + +let g:Powerline#Colorschemes#default#colorscheme = Pl#Colorscheme#Init([ + \ Pl#Hi#Segments(['SPLIT'], { + \ 'n': ['white', 'gray2'], + \ 'N': ['white', 'gray0'], + \ 'i': ['white', 'darkestblue'], + \ }), + \ + \ Pl#Hi#Segments(['mode_indicator'], { + \ 'n': ['darkestgreen', 'brightgreen', ['bold']], + \ 'i': ['darkestcyan', 'white', ['bold']], + \ 'v': ['darkred', 'brightorange', ['bold']], + \ 'r': ['white', 'brightred', ['bold']], + \ 's': ['white', 'gray5', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['branch', 'scrollpercent', 'raw', 'filesize'], { + \ 'n': ['gray9', 'gray4'], + \ 'N': ['gray4', 'gray1'], + \ 'i': ['mediumcyan', 'darkblue'], + \ }), + \ + \ Pl#Hi#Segments(['fileinfo', 'filename'], { + \ 'n': ['white', 'gray4', ['bold']], + \ 'N': ['gray7', 'gray0', ['bold']], + \ 'i': ['white', 'darkblue', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['fileinfo.filepath'], { + \ 'n': ['gray10'], + \ 'N': ['gray5'], + \ 'i': ['mediumcyan'], + \ }), + \ + \ Pl#Hi#Segments(['static_str'], { + \ 'n': ['white', 'gray4'], + \ 'N': ['gray7', 'gray1'], + \ 'i': ['white', 'darkblue'], + \ }), + \ + \ Pl#Hi#Segments(['fileinfo.flags'], { + \ 'n': ['brightestred', ['bold']], + \ 'N': ['darkred'], + \ 'i': ['brightestred', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['currenttag', 'fullcurrenttag', 'fileformat', 'fileencoding', 'pwd', 'filetype', 'rvm:string', 'rvm:statusline', 'virtualenv:statusline', 'charcode', 'currhigroup'], { + \ 'n': ['gray8', 'gray2'], + \ 'i': ['mediumcyan', 'darkestblue'], + \ }), + \ + \ Pl#Hi#Segments(['lineinfo'], { + \ 'n': ['gray2', 'gray10', ['bold']], + \ 'N': ['gray7', 'gray1', ['bold']], + \ 'i': ['darkestcyan', 'mediumcyan', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['errors'], { + \ 'n': ['brightestorange', 'gray2', ['bold']], + \ 'i': ['brightestorange', 'darkestblue', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['lineinfo.line.tot'], { + \ 'n': ['gray6'], + \ 'N': ['gray5'], + \ 'i': ['darkestcyan'], + \ }), + \ + \ Pl#Hi#Segments(['paste_indicator', 'ws_marker'], { + \ 'n': ['white', 'brightred', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['gundo:static_str.name', 'command_t:static_str.name'], { + \ 'n': ['white', 'mediumred', ['bold']], + \ 'N': ['brightred', 'darkestred', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['gundo:static_str.buffer', 'command_t:raw.line'], { + \ 'n': ['white', 'darkred'], + \ 'N': ['brightred', 'darkestred'], + \ }), + \ + \ Pl#Hi#Segments(['gundo:SPLIT', 'command_t:SPLIT'], { + \ 'n': ['white', 'darkred'], + \ 'N': ['white', 'darkestred'], + \ }), + \ + \ Pl#Hi#Segments(['lustyexplorer:static_str.name', 'minibufexplorer:static_str.name', 'nerdtree:raw.name', 'tagbar:static_str.name'], { + \ 'n': ['white', 'mediumgreen', ['bold']], + \ 'N': ['mediumgreen', 'darkestgreen', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['lustyexplorer:static_str.buffer', 'tagbar:static_str.buffer'], { + \ 'n': ['brightgreen', 'darkgreen'], + \ 'N': ['mediumgreen', 'darkestgreen'], + \ }), + \ + \ Pl#Hi#Segments(['lustyexplorer:SPLIT', 'minibufexplorer:SPLIT', 'nerdtree:SPLIT', 'tagbar:SPLIT'], { + \ 'n': ['white', 'darkgreen'], + \ 'N': ['white', 'darkestgreen'], + \ }), + \ + \ Pl#Hi#Segments(['ctrlp:focus', 'ctrlp:byfname'], { + \ 'n': ['brightpurple', 'darkestpurple'], + \ }), + \ + \ Pl#Hi#Segments(['ctrlp:prev', 'ctrlp:next', 'ctrlp:pwd'], { + \ 'n': ['white', 'mediumpurple'], + \ }), + \ + \ Pl#Hi#Segments(['ctrlp:item'], { + \ 'n': ['darkestpurple', 'white', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['ctrlp:marked'], { + \ 'n': ['brightestred', 'darkestpurple', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['ctrlp:count'], { + \ 'n': ['darkestpurple', 'white'], + \ }), + \ + \ Pl#Hi#Segments(['ctrlp:SPLIT'], { + \ 'n': ['white', 'darkestpurple'], + \ }), + \ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/skwp.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/skwp.vim new file mode 100755 index 00000000..798caa44 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/skwp.vim @@ -0,0 +1,192 @@ +" This theme is based on Solarized-dark colors, combined +" with Powerline native colors +call Pl#Hi#Allocate({ + \ 'black' : 16, + \ 'white' : 231, + \ + \ 'darkestgreen' : 22, + \ 'darkgreen' : 28, + \ 'mediumgreen' : 70, + \ 'brightgreen' : 148, + \ + \ 'darkestcyan' : 23, + \ 'mediumcyan' : 117, + \ + \ 'darkestblue' : 24, + \ 'darkblue' : 31, + \ + \ 'darkestred' : 52, + \ 'darkred' : 88, + \ 'mediumred' : 124, + \ 'brightred' : 160, + \ 'brightestred' : 196, + \ + \ 'darkestpurple' : 55, + \ 'mediumpurple' : 98, + \ 'brightpurple' : 189, + \ + \ 'brightorange' : 208, + \ 'brightestorange': 214, + \ + \ 'gray0' : 233, + \ 'gray1' : 235, + \ 'gray2' : 236, + \ 'gray3' : 239, + \ 'gray4' : 240, + \ 'gray5' : 241, + \ 'gray6' : 244, + \ 'gray7' : 245, + \ 'gray8' : 247, + \ 'gray9' : 250, + \ 'gray10' : 252, + \ + \ 'base00' : [241, 0x657b83], + \ 'base01' : [240, 0x586e75], + \ 'base02' : [0, 0x073642], + \ 'base03' : [234, 0x002b36], + \ 'base0' : [244, 0x839496], + \ 'base1' : [245, 0x93a1a1], + \ 'base2' : [254, 0xeee8d5], + \ 'base3' : [230, 0xfdf6e3], + \ 'yellow' : [136, 0xb58900], + \ 'orange' : [166, 0xcb4b16], + \ 'red' : [160, 0xdc322f], + \ 'magenta' : [125, 0xd33682], + \ 'violet' : [61, 0x6c71c4], + \ 'blue' : [33, 0x268bd2], + \ 'cyan' : [37, 0x2aa198], + \ 'green' : [64, 0x859900], + \ }) + +let g:Powerline#Colorschemes#skwp#colorscheme = Pl#Colorscheme#Init([ + \ Pl#Hi#Segments(['SPLIT'], { + \ 'n': ['white', 'base02'], + \ 'N': ['white', 'base02'], + \ }), + \ + \ Pl#Hi#Segments(['mode_indicator'], { + \ 'n': ['darkestgreen', 'brightgreen', ['bold']], + \ 'i': ['darkestcyan', 'white', ['bold']], + \ 'v': ['red', 'brightorange', ['bold']], + \ 'r': ['white', 'violet', ['bold']], + \ 's': ['white', 'gray5', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['branch', 'raw', 'filesize'], { + \ 'n': ['base03', 'blue'], + \ 'N': ['gray5', 'base03'], + \ }), + \ + \ Pl#Hi#Segments(['scrollpercent'], { + \ 'n': ['gray7', 'gray2'], + \ 'N': ['base2', 'base02'], + \ }), + \ + \ Pl#Hi#Segments(['fileinfo', 'filename', 'filepath'], { + \ 'n': ['base2', 'darkestblue', ['bold']], + \ 'N': ['base1', 'base02', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['fileinfo.filepath'], { + \ 'n': ['gray10'], + \ 'N': ['gray5'], + \ 'i': ['mediumcyan'], + \ }), + \ + \ Pl#Hi#Segments(['static_str'], { + \ 'n': ['base3', 'violet'], + \ 'N': ['base1', 'base02'], + \ 'i': ['white', 'base02'], + \ }), + \ + \ Pl#Hi#Segments(['fileinfo.flags'], { + \ 'n': ['base03', ['bold']], + \ 'N': ['gray5'], + \ 'i': ['base03', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['currenttag', 'fullcurrenttag', 'fileformat', 'fileencoding', 'pwd', 'filetype', 'rvm:string', 'rvm:statusline', 'virtualenv:statusline', 'charcode', 'currhigroup'], { + \ 'n': ['gray5', 'gray2'], + \ 'i': ['mediumcyan', 'base02'], + \ }), + \ + \ Pl#Hi#Segments(['lineinfo'], { + \ 'n': ['gray2', 'gray10', ['bold']], + \ 'N': ['gray7', 'gray1', ['bold']], + \ 'i': ['darkestcyan', 'mediumcyan', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['errors'], { + \ 'n': ['orange', 'base02', ['bold']], + \ 'N': ['gray5', 'base03', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['lineinfo.line.tot'], { + \ 'n': ['gray6'], + \ 'N': ['gray5'], + \ 'i': ['darkestcyan'], + \ }), + \ + \ Pl#Hi#Segments(['paste_indicator', 'ws_marker'], { + \ 'n': ['base3', 'red', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['gundo:static_str.name', 'command_t:static_str.name'], { + \ 'n': ['base3', 'darkblue', ['bold']], + \ 'N': ['base1', 'base03', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['gundo:static_str.buffer', 'command_t:raw.line'], { + \ 'n': ['white', 'base02'], + \ 'N': ['gray5', 'base02'], + \ }), + \ + \ Pl#Hi#Segments(['gundo:SPLIT', 'command_t:SPLIT'], { + \ 'n': ['white', 'base02'], + \ 'N': ['white', 'base02'], + \ }), + \ + \ Pl#Hi#Segments(['lustyexplorer:static_str.name', 'minibufexplorer:static_str.name', 'nerdtree:raw.name', 'tagbar:static_str.name'], { + \ 'n': ['gray10', 'darkestblue', ['bold']], + \ 'N': ['gray3', 'base02', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['lustyexplorer:static_str.buffer', 'tagbar:static_str.buffer'], { + \ 'n': ['base3', 'blue'], + \ 'N': ['gray5', 'base02'], + \ }), + \ + \ Pl#Hi#Segments(['lustyexplorer:SPLIT', 'minibufexplorer:SPLIT', 'nerdtree:SPLIT', 'tagbar:SPLIT'], { + \ 'n': ['gray3', 'base02'], + \ 'N': ['gray3', 'base02'], + \ }), + \ + \ Pl#Hi#Segments(['ctrlp:focus', 'ctrlp:byfname'], { + \ 'n': ['green', 'base03'], + \ }), + \ + \ Pl#Hi#Segments(['ctrlp:prev', 'ctrlp:next', 'ctrlp:pwd'], { + \ 'n': ['green', 'base02'], + \ }), + \ + \ Pl#Hi#Segments(['ctrlp:item'], { + \ 'n': ['base2', 'darkestblue', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['ctrlp:marked'], { + \ 'n': ['brightgreen', 'base03', ['bold']], + \ }), + \ + \ Pl#Hi#Segments(['ctrlp:count'], { + \ 'n': ['base0', 'base03'], + \ }), + \ + \ Pl#Hi#Segments(['ctrlp:SPLIT'], { + \ 'n': ['white', 'base03'], + \ }), + \ + \ Pl#Hi#Segments(['status'], { + \ 'n': ['green', 'base02'], + \ 'N': ['gray5', 'base02'], + \ }), +\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Functions.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Functions.vim new file mode 100755 index 00000000..26db9b36 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Functions.vim @@ -0,0 +1,141 @@ +" Recalculate the trailing whitespace warning when idle, and after saving +autocmd CursorHold,BufWritePost,InsertLeave * unlet! b:statusline_trailing_space_warning + +function! Powerline#Functions#GetFilepath() " {{{ + " Recalculate the filepath when cwd changes. + let cwd = getcwd() + if exists("b:Powerline_cwd") && cwd != b:Powerline_cwd + unlet! b:Powerline_filepath + endif + let b:Powerline_cwd = cwd + + if exists('b:Powerline_filepath') + return b:Powerline_filepath + endif + + let dirsep = has('win32') && ! &shellslash ? '\' : '/' + let filepath = expand('%:p') + + if empty(filepath) + return '' + endif + + let ret = '' + + if g:Powerline_stl_path_style == 'short' + " Display a short path where the first directory is displayed with its + " full name, and the subsequent directories are shortened to their + " first letter, i.e. "/home/user/foo/foo/bar/baz.vim" becomes + " "~/foo/f/b/baz.vim" + " + " This displays the shortest possible path, relative to ~ or the + " current directory. + let mod = (exists('+acd') && &acd) ? ':~:h' : ':~:.:h' + let fpath = split(fnamemodify(filepath, mod), dirsep) + let fpath_shortparts = map(fpath[1:], 'v:val[0]') + let ret = join(extend([fpath[0]], fpath_shortparts), dirsep) . dirsep + elseif g:Powerline_stl_path_style == 'relative' + " Display a relative path, similar to the %f statusline item + let ret = fnamemodify(filepath, ':~:.:h') . dirsep + elseif g:Powerline_stl_path_style == 'full' + " Display the full path, similar to the %F statusline item + let ret = fnamemodify(filepath, ':h') . dirsep + endif + + if ret == ('.' . dirsep) + let ret = '' + endif + + let b:Powerline_filepath = ret + return ret +endfunction " }}} +function! Powerline#Functions#GetShortPath(threshold) " {{{ + let fullpath = split(substitute(expand('%:p:h'), $HOME, '~', 'g'), '/') + + if len(fullpath) > a:threshold + let fullpath = [fullpath[0], '…'] + fullpath[-a:threshold + 1 :] + endif + + return join(fullpath, '/') +endfunction " }}} +function! Powerline#Functions#GetMode() " {{{ + let mode = mode() + + if mode ==# 'v' + let mode = get(g:, "Powerline_mode_v", "VISUAL") + elseif mode ==# 'V' + let mode = get(g:, "Powerline_mode_V", "V⋅LINE") + elseif mode ==# '' + let mode = get(g:, "Powerline_mode_cv", "V⋅BLOCK") + elseif mode ==# 's' + let mode = get(g:, "Powerline_mode_s", "SELECT") + elseif mode ==# 'S' + let mode = get(g:, "Powerline_mode_S", "S⋅LINE") + elseif mode ==# '' + let mode = get(g:, "Powerline_mode_cs", "S⋅BLOCK") + elseif mode =~# '\vi' + let mode = get(g:, "Powerline_mode_i", "INSERT") + elseif mode =~# '\v(R|Rv)' + let mode = get(g:, "Powerline_mode_R", "REPLACE") + else + " Fallback to normal mode + let mode = get(g:, "Powerline_mode_n", "NORMAL") + endif + + return mode +endfunction " }}} +function! Powerline#Functions#GetFilesize() " {{{ + let bytes = getfsize(expand("%:p")) + + if bytes <= 0 + return '' + endif + + if bytes < 1024 + return bytes . 'B' + else + return (bytes / 1024) . 'kB' + endif +endfunction "}}} +function! Powerline#Functions#GetCharCode() " {{{ + " Get the output of :ascii + redir => ascii + silent! ascii + redir END + + if match(ascii, 'NUL') != -1 + return 'NUL' + endif + + " Zero pad hex values + let nrformat = '0x%02x' + + let encoding = (&fenc == '' ? &enc : &fenc) + + if encoding == 'utf-8' + " Zero pad with 4 zeroes in unicode files + let nrformat = '0x%04x' + endif + + " Get the character and the numeric value from the return value of :ascii + " This matches the two first pieces of the return value, e.g. + " " 70" => char: 'F', nr: '70' + let [str, char, nr; rest] = matchlist(ascii, '\v\<(.{-1,})\>\s*([0-9]+)') + + " Format the numeric value + let nr = printf(nrformat, nr) + + return "'". char ."' ". nr +endfunction "}}} +function! Powerline#Functions#GetWSMarker() " {{{ + " Return '...' if trailing white space is detected + " Return '' otherwise + if ! exists("b:statusline_trailing_space_warning") + if search('\s$', 'nw') != 0 + let b:statusline_trailing_space_warning = ' … ' + else + let b:statusline_trailing_space_warning = '' + endif + endif + return b:statusline_trailing_space_warning +endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Functions/ft_man.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Functions/ft_man.vim new file mode 100755 index 00000000..29135e43 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Functions/ft_man.vim @@ -0,0 +1,12 @@ +function! Powerline#Functions#ft_man#GetName() " {{{ + let matches = matchlist(getline(1), '\v^([a-zA-Z_\.\-]+)\((\d+)\)') + + if ! len(matches) + return 'n/a' + endif + + let file = tolower(matches[1]) + let num = matches[2] + + return file +endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Functions/fugitive.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Functions/fugitive.vim new file mode 100755 index 00000000..bb001315 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Functions/fugitive.vim @@ -0,0 +1,7 @@ +function! Powerline#Functions#fugitive#GetBranch(symbol) " {{{ + let ret = fugitive#statusline() + + let ret = substitute(ret, '\c\v\[?GIT\(([a-z0-9\-_\./:]+)\)\]?', a:symbol .' \1', 'g') + + return ret +endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Functions/hgrev.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Functions/hgrev.vim new file mode 100755 index 00000000..61d94adf --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Functions/hgrev.vim @@ -0,0 +1,17 @@ +function! Powerline#Functions#hgrev#Status(symbol) " {{{ + if ! exists('*HGRev') + " HGRev hasn't been loaded yet + return '' + endif + if !exists("b:statusline_hg_status") + silent execute "RefreshMercurialRev" + endif + let b:statusline_hg_status=HGRev() + if b:statusline_hg_status != '-' + let ret = "\u26A1". '' . substitute(b:statusline_hg_status, '^[^ ]*', '\1', 'g') + let ret=substitute(ret,' M$','+','g') + else + let ret='' + endif + return ret +endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Functions/syntastic.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Functions/syntastic.vim new file mode 100755 index 00000000..70c8849e --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Functions/syntastic.vim @@ -0,0 +1,16 @@ +function! Powerline#Functions#syntastic#GetErrors(line_symbol) " {{{ + if ! exists('g:syntastic_stl_format') + " Syntastic hasn't been loaded yet + return '' + endif + + " Temporarily change syntastic output format + let old_stl_format = g:syntastic_stl_format + let g:syntastic_stl_format = '%E{ ERRORS (%e) '. a:line_symbol .' %fe }%W{ WARNINGS (%w) '. a:line_symbol .' %fw }' + + let ret = SyntasticStatuslineFlag() + + let g:syntastic_stl_format = old_stl_format + + return ret +endfunction " }}} diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Matches.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Matches.vim new file mode 100755 index 00000000..5cce4756 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Matches.vim @@ -0,0 +1,13 @@ +let g:Powerline#Matches#matches = { + \ 'command_t' : Pl#Match#Add('bufname("%")', 'GoToFile'), + \ 'bt_help' : Pl#Match#Add('&bt' , 'help'), + \ 'ft_man' : Pl#Match#Add('&ft' , 'man'), + \ 'ft_qf' : Pl#Match#Add('&ft' , 'qf'), + \ 'ft_vimpager' : Pl#Match#Add('&ft' , 'vimpager'), + \ 'gundo_preview' : Pl#Match#Add('bufname("%")', '__Gundo_Preview__'), + \ 'gundo_tree' : Pl#Match#Add('bufname("%")', '__Gundo__'), + \ 'lustyexplorer' : Pl#Match#Add('bufname("%")', '\[LustyExplorer-Buffers\]'), + \ 'minibufexplorer' : Pl#Match#Add('bufname("%")', '\-MiniBufExplorer\-'), + \ 'tagbar' : Pl#Match#Add('&ft' , 'tagbar'), + \ 'nerdtree' : Pl#Match#Add('&ft' , 'nerdtree'), +\ } diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments.vim new file mode 100755 index 00000000..c74c34f3 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Segments.vim @@ -0,0 +1,30 @@ +let g:Powerline#Segments#segments = Pl#Segment#Init([ + \ Pl#Segment#Create('SPLIT' , '__split__'), + \ Pl#Segment#Create('TRUNCATE', '__truncate__'), + \ + \ Pl#Segment#Create('paste_indicator' , '%{&paste ? "PASTE" : ""}', Pl#Segment#Modes('!N')), + \ Pl#Segment#Create('mode_indicator' , '%{Powerline#Functions#GetMode()}', Pl#Segment#Modes('!N')), + \ Pl#Segment#Create('fileinfo', + \ Pl#Segment#Create('flags.ro' , '%{&readonly ? "$RO" : ""}'), + \ Pl#Segment#Create('filepath' , '%{Powerline#Functions#GetFilepath()}', Pl#Segment#NoPadding()), + \ Pl#Segment#Create('filename' , '%t'), + \ Pl#Segment#Create('flags.mod' , '%M'), + \ Pl#Segment#Create('flags.type' , '%H%W'), + \ ), + \ Pl#Segment#Create('filename' , '%t'), + \ Pl#Segment#Create('filesize' , '%{Powerline#Functions#GetFilesize()}', Pl#Segment#Modes('!N')), + \ Pl#Segment#Create('pwd' , '%{substitute(getcwd(), expand("$HOME"), "~", "g")}'), + \ Pl#Segment#Create('static_str' , '%%{"%s"}'), + \ Pl#Segment#Create('raw' , '%s'), + \ Pl#Segment#Create('fileformat' , '%{&fileformat}', Pl#Segment#Modes('!N')), + \ Pl#Segment#Create('fileencoding' , '%{(&fenc == "" ? &enc : &fenc)}', Pl#Segment#Modes('!N')), + \ Pl#Segment#Create('filetype' , '%{strlen(&ft) ? &ft : "no ft"}', Pl#Segment#Modes('!N')), + \ Pl#Segment#Create('scrollpercent' , '%3p%%'), + \ Pl#Segment#Create('lineinfo', + \ Pl#Segment#Create('line.cur' , '$LINE %3l'), + \ Pl#Segment#Create('line.tot' , ':%-2v', Pl#Segment#NoPadding()), + \ ), + \ Pl#Segment#Create('charcode' , '%{Powerline#Functions#GetCharCode()}', Pl#Segment#Modes('!N')), + \ Pl#Segment#Create('currhigroup' , '%{synIDattr(synID(line("."), col("."), 1), "name")}', Pl#Segment#Modes('!N')), + \ Pl#Segment#Create('ws_marker' , '%{Powerline#Functions#GetWSMarker()}', Pl#Segment#Modes('!N')), +\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/ctrlp.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/ctrlp.vim new file mode 100755 index 00000000..41c5ebfc --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/ctrlp.vim @@ -0,0 +1,20 @@ +if !exists("g:Powerline#Segments#ctrlp#segments#focus ") + let g:Powerline#Segments#ctrlp#segments#focus = '%{"%0"}' +endif +if !exists("g:Powerline#Segments#ctrlp#segments#prev ") + let g:Powerline#Segments#ctrlp#segments#prev = '%-3{"%3"}' +endif +if !exists("g:Powerline#Segments#ctrlp#segments#next ") + let g:Powerline#Segments#ctrlp#segments#next = '%-3{"%5"}' +endif + +let g:Powerline#Segments#ctrlp#segments = Pl#Segment#Init(['ctrlp' + \ , Pl#Segment#Create('focus', g:Powerline#Segments#ctrlp#segments#focus) + \ , Pl#Segment#Create('byfname', '%{"%1"}') + \ , Pl#Segment#Create('prev', g:Powerline#Segments#ctrlp#segments#prev) + \ , Pl#Segment#Create('item', '%-9{"%4"}') + \ , Pl#Segment#Create('next', g:Powerline#Segments#ctrlp#segments#next) + \ , Pl#Segment#Create('marked', '%{"%6" == " <+>" ? "" : strpart("%6", 2, len("%6") - 3)}') + \ + \ , Pl#Segment#Create('count', '%-6{"%0"}') +\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/ft_man.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/ft_man.vim new file mode 100755 index 00000000..6ed0cc30 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/ft_man.vim @@ -0,0 +1,3 @@ +let g:Powerline#Segments#ft_man#segments = Pl#Segment#Init(['ft_man', + \ Pl#Segment#Create('filename', '%{Powerline#Functions#ft_man#GetName()}') +\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/fugitive.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/fugitive.vim new file mode 100755 index 00000000..bb46eeca --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/fugitive.vim @@ -0,0 +1,5 @@ +let g:Powerline#Segments#fugitive#segments = Pl#Segment#Init(['fugitive', + \ (exists('g:loaded_fugitive') && g:loaded_fugitive == 1), + \ + \ Pl#Segment#Create('branch', '%{Powerline#Functions#fugitive#GetBranch("$BRANCH")}') +\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/hgrev.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/hgrev.vim new file mode 100755 index 00000000..3e651d13 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/hgrev.vim @@ -0,0 +1,4 @@ +let g:Powerline#Segments#hgrev#segments = Pl#Segment#Init(['hgrev', + \ (exists('hgrev_loaded')), + \ Pl#Segment#Create('branch', '%{Powerline#Functions#hgrev#Status("$BRANCH")}') + \ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/rvm.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/rvm.vim new file mode 100755 index 00000000..c840632d --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/rvm.vim @@ -0,0 +1,6 @@ +let g:Powerline#Segments#rvm#segments = Pl#Segment#Init(['rvm', + \ (exists('g:loaded_rvm') && g:loaded_rvm == 1), + \ + \ Pl#Segment#Create('string', '%{rvm#string()}'), + \ Pl#Segment#Create('statusline', '%{rvm#statusline()}') +\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/syntastic.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/syntastic.vim new file mode 100755 index 00000000..5a893d6e --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/syntastic.vim @@ -0,0 +1,5 @@ +let g:Powerline#Segments#syntastic#segments = Pl#Segment#Init(['syntastic', + \ (exists('g:loaded_syntastic_plugin') && g:loaded_syntastic_plugin == 1), + \ + \ Pl#Segment#Create('errors', '%{Powerline#Functions#syntastic#GetErrors("$LINE")}', Pl#Segment#Modes('!N')) +\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/tagbar.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/tagbar.vim new file mode 100755 index 00000000..5db8cd95 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/tagbar.vim @@ -0,0 +1,6 @@ +let g:Powerline#Segments#tagbar#segments = Pl#Segment#Init(['tagbar', + \ (exists(':Tagbar') > 0), + \ + \ Pl#Segment#Create('currenttag', '%{tagbar#currenttag("%s", "")}', Pl#Segment#Modes('!N')), + \ Pl#Segment#Create('fullcurrenttag', '%{tagbar#currenttag("%s", "", "f")}', Pl#Segment#Modes('!N')) +\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/virtualenv.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/virtualenv.vim new file mode 100755 index 00000000..8c7d6fb5 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Segments/virtualenv.vim @@ -0,0 +1,5 @@ +let g:Powerline#Segments#virtualenv#segments = Pl#Segment#Init(['virtualenv', + \ has('python') && (exists('g:virtualenv_loaded') && g:virtualenv_loaded == 1), + \ + \ Pl#Segment#Create('statusline', '%{virtualenv#statusline()}') +\ ]) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Themes/default.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Themes/default.vim new file mode 100755 index 00000000..a97d5b9c --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Themes/default.vim @@ -0,0 +1,116 @@ +let g:Powerline#Themes#default#theme = Pl#Theme#Create( + \ Pl#Theme#Buffer('' + \ , 'paste_indicator' + \ , 'mode_indicator' + \ , 'fugitive:branch' + \ , 'hgrev:branch' + \ , 'fileinfo' + \ , 'syntastic:errors' + \ , Pl#Segment#Truncate() + \ , 'tagbar:currenttag' + \ , Pl#Segment#Split() + \ , 'rvm:string' + \ , 'virtualenv:statusline' + \ , 'fileformat' + \ , 'fileencoding' + \ , 'filetype' + \ , 'scrollpercent' + \ , 'lineinfo' + \ ), + \ + \ Pl#Theme#Buffer('command_t' + \ , ['static_str.name', 'Command-T'] + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ , ['raw.line', '%10(Match #%l%)'] + \ ), + \ + \ Pl#Theme#Buffer('gundo', Pl#Match#Any('gundo_tree') + \ , ['static_str.name', 'Gundo'] + \ , ['static_str.buffer', 'Undo tree'] + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ ), + \ + \ Pl#Theme#Buffer('gundo', Pl#Match#Any('gundo_preview') + \ , ['static_str.name', 'Gundo'] + \ , ['static_str.buffer', 'Diff preview'] + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ ), + \ + \ Pl#Theme#Buffer('bt_help' + \ , ['static_str.name', 'Help'] + \ , 'filename' + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ , 'scrollpercent' + \ ), + \ + \ Pl#Theme#Buffer('ft_vimpager' + \ , ['static_str.name', 'Pager'] + \ , 'filename' + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ , 'scrollpercent' + \ ), + \ + \ Pl#Theme#Buffer('lustyexplorer' + \ , ['static_str.name', 'LustyExplorer'] + \ , ['static_str.buffer', 'Buffer list'] + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ ), + \ + \ Pl#Theme#Buffer('ft_man' + \ , ['static_str.name', 'Man page'] + \ , 'filename' + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ , 'scrollpercent' + \ ), + \ + \ Pl#Theme#Buffer('minibufexplorer' + \ , ['static_str.name', 'MiniBufExplorer'] + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ ), + \ + \ Pl#Theme#Buffer('ft_qf' + \ , ['static_str.name', 'Quickfix'] + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ ), + \ + \ Pl#Theme#Buffer('tagbar' + \ , ['static_str.name', 'Tagbar'] + \ , ['static_str.buffer', 'Tree'] + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ ), + \ + \ Pl#Theme#Buffer('ctrlp', Pl#Theme#Callback('ctrlp_main', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.main = "%s"') + \ , 'ctrlp:prev' + \ , 'ctrlp:item' + \ , 'ctrlp:next' + \ , 'ctrlp:marked' + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ , 'ctrlp:focus' + \ , 'ctrlp:byfname' + \ , 'pwd' + \ ), + \ + \ Pl#Theme#Buffer('ctrlp', Pl#Theme#Callback('ctrlp_prog', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.prog = "%s"') + \ , 'ctrlp:count' + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ , 'pwd' + \ ), + \ + \ Pl#Theme#Buffer('nerdtree' + \ , ['raw.name', '%{Powerline#Functions#GetShortPath(4)}'] + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ ) +\ ) diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Themes/skwp.vim b/sources_non_forked/vim-powerline/autoload/Powerline/Themes/skwp.vim new file mode 100755 index 00000000..64ed1342 --- /dev/null +++ b/sources_non_forked/vim-powerline/autoload/Powerline/Themes/skwp.vim @@ -0,0 +1,116 @@ +" Disabled: +" Add the following line into the first theme group to see the highlight +" group +" \ , 'currhigroup' +" +" Line info taken out - I know which line number I'm on from the gutter +"\ , 'lineinfo' +let g:Powerline#Themes#skwp#theme = Pl#Theme#Create( + \ Pl#Theme#Buffer('' + \ , 'fugitive:branch' + \ , 'fileinfo' + \ , 'flags.mod' + \ , 'syntastic:errors' + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ , 'sass:status' + \ , 'rvm:string' + \ , 'paste_indicator' + \ ), + \ + \ Pl#Theme#Buffer('command_t' + \ , ['static_str.name', 'Command-T'] + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ , ['raw.line', '%10(Match #%l%)'] + \ ), + \ + \ Pl#Theme#Buffer('gundo', Pl#Match#Any('gundo_tree') + \ , ['static_str.name', 'Gundo'] + \ , ['static_str.buffer', 'Undo tree'] + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ ), + \ + \ Pl#Theme#Buffer('gundo', Pl#Match#Any('gundo_preview') + \ , ['static_str.name', 'Gundo'] + \ , ['static_str.buffer', 'Diff preview'] + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ ), + \ + \ Pl#Theme#Buffer('bt_help' + \ , ['static_str.name', 'Help'] + \ , 'filename' + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ , 'scrollpercent' + \ ), + \ + \ Pl#Theme#Buffer('ft_vimpager' + \ , ['static_str.name', 'Pager'] + \ , 'filename' + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ , 'scrollpercent' + \ ), + \ + \ Pl#Theme#Buffer('lustyexplorer' + \ , ['static_str.name', 'LustyExplorer'] + \ , ['static_str.buffer', 'Buffer list'] + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ ), + \ + \ Pl#Theme#Buffer('ft_man' + \ , ['static_str.name', 'Man page'] + \ , 'filename' + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ , 'scrollpercent' + \ ), + \ + \ Pl#Theme#Buffer('minibufexplorer' + \ , ['static_str.name', 'MiniBufExplorer'] + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ ), + \ + \ Pl#Theme#Buffer('ft_qf' + \ , ['static_str.name', 'Quickfix'] + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ ), + \ + \ Pl#Theme#Buffer('tagbar' + \ , ['static_str.name', 'Tagbar'] + \ , ['static_str.buffer', 'Tree'] + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ ), + \ + \ Pl#Theme#Buffer('ctrlp', Pl#Theme#Callback('ctrlp_main', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.main = "%s"') + \ , 'ctrlp:prev' + \ , 'ctrlp:item' + \ , 'ctrlp:next' + \ , 'ctrlp:marked' + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ , 'ctrlp:focus' + \ , 'ctrlp:byfname' + \ , 'pwd' + \ ), + \ + \ Pl#Theme#Buffer('ctrlp', Pl#Theme#Callback('ctrlp_prog', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.prog = "%s"') + \ , 'ctrlp:count' + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ , 'pwd' + \ ), + \ + \ Pl#Theme#Buffer('nerdtree' + \ , ['raw.name', '%{Powerline#Functions#GetShortPath(4)}'] + \ , Pl#Segment#Truncate() + \ , Pl#Segment#Split() + \ ) +\ ) diff --git a/sources_non_forked/vim-powerline/doc/Powerline.txt b/sources_non_forked/vim-powerline/doc/Powerline.txt new file mode 100755 index 00000000..33d136fd --- /dev/null +++ b/sources_non_forked/vim-powerline/doc/Powerline.txt @@ -0,0 +1,429 @@ +*Powerline.txt* For Vim version 7.3. Last change: 2011 Nov 23 + + ______ + _________ \ /__ + \_____ \______ _ _____________ / /'__' ___ ____ + | ___/ _ \ \/ \/ / __ \_ ___\ / | |/ \_/ __ \ + | | | (_) \ _ / ___/| | / /__| | | \ ___/ + '___' \____/ \/ \/ \___ |__' /___ /'__'__| /\___ \ + \/ / / \/ \/ + | / + |/ + ' + +============================================================================== +CONTENTS *Powerline-contents* + + 1. Introduction ....................... |Powerline-introduction| + 2. Usage .............................. |Powerline-usage| + 3. Requirements ....................... |Powerline-requirements| + 3.1 Recommended settings ........... |Powerline-recommended-settings| + 4. Configuration ...................... |Powerline-configuration| + 4.1 Powerline_cache_file ........... |Powerline_cache_file| + 4.1.1 Clearing the cache ....... |:PowerlineClearCache| + 4.2 Powerline_cache_enabled ........ |Powerline_cache_enabled| + 4.3 Powerline_symbols .............. |Powerline_symbols| + 4.3.1 Compatible symbols ....... |Powerline-symbols-compatible| + 4.3.2 Fancy symbols ............ |Powerline-symbols-fancy| + 4.3.3 Overriding symbols ....... |Powerline_symbols_override| + 4.3.4 Overriding dividers ...... |Powerline_dividers_override| + 4.4 Powerline_theme ................ |Powerline_theme| + 4.5 Powerline_colorscheme .......... |Powerline_colorscheme| + 4.6 Powerline_stl_path_style ....... |Powerline_stl_path_style| + 5. Fonts .............................. |Powerline-fonts| + 6. Customization ...................... |Powerline-customization| + 6.1 Basic customization ............ |Powerline-basic-customization| + 6.2 Advanced customization ......... |Powerline-advanced-customization| + 6.2.1 Colorschemes ............. |Powerline-cust-colorschemes| + 6.2.2 Functions ................ |Powerline-cust-functions| + 6.2.3 Segments ................. |Powerline-cust-segments| + 6.2.4 Themes ................... |Powerline-cust-themes| + 7. License ............................ |Powerline-license| + 8. Known issues ....................... |Powerline-known-issues| + 9. Contributing ....................... |Powerline-contributing| + +============================================================================== +1. Introduction *Powerline* *Powerline-introduction* + +Powerline is a utility plugin which allows you to create better-looking, more +functional Vim statuslines. + +============================================================================== +2. Usage *Powerline-usage* + +Powerline is automatically enabled when it's installed, either by unzipping +the provided archive or by adding it as a Pathogen/Vundle bundle. + +Powerline replaces the standard Vim 'statusline' with a custom statusline made +up of Powerline segments. + +Powerline ignores any 'statusline' customizations you have defined in your +|vimrc|. If you remove Powerline, your 'statusline' customizations are +restored. + +============================================================================== +3. Requirements *Powerline-requirements* + +Powerline has been developed and tested in Vim 7.3, but it should run without +any problems in Vim 7.2. The default configuration requires a Unix-like system +to work properly. + +The plugin only works with Vim running in an 88/256-color terminal or Gvim. + +Vi-compatible mode must be disabled. + +------------------------------------------------------------------------------ +3.1 Recommended settings *Powerline-recommended-settings* + +The following configuration options should be set in your |vimrc|: > + + set nocompatible " Disable vi-compatibility + set laststatus=2 " Always show the statusline + set encoding=utf-8 " Necessary to show Unicode glyphs + +Note: If you're using an 88/256-color terminal but still don't see the colored +statusline, you may have to set the following option as well: > + + set t_Co=256 " Explicitly tell Vim that the terminal supports 256 colors + +============================================================================== +4. Configuration *Powerline-configuration* + +Powerline will work fine without any user configuration, but default behavior +can be overridden by setting configuration variables globally in your |vimrc| +file. + +------------------------------------------------------------------------------ +4.1 Powerline_cache_file *Powerline_cache_file* + +By default Powerline caches all the statuslines and colors in a cache file in +the plugin's directory (or the Vim directory, depending on the installation +method used). + +It's recommended that you enable the cache, as this dramatically improves Vim +startup time after the cache file has been generated (the plugin usually loads +within ~100ms without the cache and ~1ms with the cache). + +Note: The default cache filename includes the current theme, colorscheme and +symbol settings in order to tie the cache file to your current configuration, +so the cache file will be regenerated when you change any settings. This may +leave several old cache files in your Vim folder, and these may safely be +deleted. + +Defaults: "/Powerline___.cache" + +------------------------------------------------------------------------------ +4.1.1 Clearing the cache *:PowerlineClearCache* + +Powerline provides a command to easily clear the cache after changing your +settings or updating your theme. Simply run the following command to clear +your cache, and restart Vim afterwards: > + + :PowerlineClearCache +< +------------------------------------------------------------------------------ +4.2 Powerline_cache_enabled *Powerline_cache_enabled* + +It's possible to disable statusline caching by setting this option to 0. This +is mostly useful when developing statuslines. + +Example: > + + let g:Powerline_cache_enabled = 0 +< + +Default: 1 + +------------------------------------------------------------------------------ +4.3 Powerline_symbols *Powerline_symbols* + +This option defines which set of symbols and dividers you want to use. There +are currently three available options: "compatible", "unicode" and "fancy". + + TYPE DESCRIPTION ~ + compatible Doesn't use any special characters. + unicode Simulates icons and arrows using similar Unicode glyphs. + fancy Custom icons and arrows. Requires a patched font. + +Example: > + + let g:Powerline_symbols = 'fancy' +< + +Default: "compatible" + +Symbols can be inserted into statuslines by using the following variables +(just insert the variables as text in your segments): + + VARIABLE DESCRIPTION ~ + $BRANCH Inserts a branch symbol + $RO Inserts a read-only symbol + $FT Inserts a filetype symbol + $LINE Inserts a line number symbol + +------------------------------------------------------------------------------ +4.3.1 Compatible symbols *Powerline-symbols-compatible* + +These symbols will work in any configuration, and do not require a special +font to work. This option will replace the fancy icons with plain text, and +the pointy dividers with straight lines. + +------------------------------------------------------------------------------ +4.3.2 Fancy symbols *Powerline-symbols-fancy* + +These symbols require a custom font to work. A font patcher is provided for +adding the required symbols to any outline font and some bitmap fonts, see +|Powerline-fonts| and the provided README file for usage details. + +------------------------------------------------------------------------------ +4.3.3 Overriding symbols *Powerline_symbols_override* + +You can override symbols by adding your symbols to the +g:Powerline_symbols_override dictionary. Example: If you want the branch +symbol to be "∓" (hex code 0x2213) and the line symbol to be "L" you can add +the following to your |vimrc|: > + + let g:Powerline_symbols_override = { + \ 'BRANCH': [0x2213], + \ 'LINE': 'L', + \ } +< +------------------------------------------------------------------------------ +4.3.4 Overriding dividers *Powerline_dividers_override* + +If you for some reason want to override the dividers then you can set +g:Powerline_dividers_override to a list with exactly four elements: + + 1: Hard right-pointing arrow + 2: Soft right-pointing arrow + 3: Hard left-pointing arrow + 4: Soft left-pointing arrow + +Example: > + + let g:Powerline_dividers_override = ['>>', '>', '<<', '<'] +< + +------------------------------------------------------------------------------ +4.3.5 Overriding mode names *Powerline_mode* + +You can change the names used for modes at the far left by setting some +variables in your |vimrc|. For example you can change "N" to "NORMAL" with: > + + let g:Powerline_mode_n = 'NORMAL' +< +The variables are all named beginning with 'g:Powerline_mode_', as follows: + +mode name default note ~ +Normal n ' N ' (surrounded by spaces) +Insert i INSERT +Replace R REPLACE |Replace-mode| +Visual v VISUAL |Visual-mode| +Visual linewise V V⋅LINE +Visual blockwise cv V⋅BLOCK +Select s SELECT |Select-mode| +Select linewise S S⋅LINE +Select blockwise cs S⋅BLOCK + +----------------------------------------------------------------------------- +4.4 Powerline_theme *Powerline_theme* + +This option defines the theme Powerline uses. The available themes are located +in autoload/Powerline/Themes/. A theme is a pre-defined set of Powerline +segments which make up the statusline. + +Example: > + + let g:Powerline_theme = 'skwp' +< + +Default: "default" + +------------------------------------------------------------------------------ +4.5 Powerline_colorscheme *Powerline_colorscheme* + +This option defines the colorscheme Powerline uses. The available colorschemes +are located in autoload/Powerline/Colorschemes/. + +Example: > + + let g:Powerline_colorscheme = 'skwp' +< + +Default: "default" + +------------------------------------------------------------------------------ +4.6 Powerline_stl_path_style *Powerline_stl_path_style* + +There are currently four ways to display the current path and file name. The +default is to only display the file name like the %t statusline item. By +setting this configuration value you can choose from the following ways +display the current path and file name: + + VALUE DESCRIPTION ~ + filename Display only the file name using the %t statusline item. + short Display a short path. The home directory is substituted with + "~", the first directory is displayed with its full name, and + subsequent directories are shortened to their first letter. + I.e. "/home/user/foo/bar/baz.vim" becomes "~/f/b/baz.vim" and + "long/relative/path/foo/bar/baz.vim becomes + "long/r/p/f/b/baz.vim". + relative Display a relative path, similar to the %f statusline item. + full Display the full path, similar to the %F statusline item. + +Example: > + + let g:Powerline_stl_path_style = 'full' +< + +Default: "relative" + +============================================================================== +5. Fonts *Powerline-fonts* + +TODO + +============================================================================== +6. Customization *Powerline-customization* + +There are currently two ways of customizing Powerline: Basic customization +using a couple of functions to insert and remove existing segments from the +statusline, and advanced customization using your own autoload files. The +customization features of Powerline allow you to create your own statuslines +without ever touching the original source code. + +------------------------------------------------------------------------------ +6.1 Basic customization *Powerline-basic-customization* + +Powerline provides the following functions to alter the default statusline +look. These functions should be called from your |vimrc| file or another file +which is sourced at Vim startup. + +Note: These functions are currently applied to all statuslines, so if you +insert a segment after a segment which is present in many statuslines (e.g. +the "filename" segment), all the statuslines will have the inserted segment. +This behavior may be changed in a future version of Powerline. + +Note: Remember to clear your cache with |:PowerlineClearCache| after changing +your statusline! + +Example: > + + " Insert the charcode segment after the filetype segment + call Pl#Theme#InsertSegment('charcode', 'after', 'filetype') + + " Replace the scrollpercent segment with the charcode segment + call Pl#Theme#ReplaceSegment('scrollpercent', 'fileinfo') +< + *Pl#Theme#InsertSegment* +Pl#Theme#InsertSegment({newsegment}, {location}, {targetsegment}) + +This function inserts {newsegment} before or after {targetsegment}. The +{location} parameter specifies the location of the new segment, valid values +are "before" and "after". You can see all the available segments in +autoload/Powerline/Segments.vim and the files specified in +|Powerline-cust-segments|. + +Pl#Theme#RemoveSegment({targetsegment}) *Pl#Theme#RemoveSegment* + +This function removes the {targetsegment} segment entirely. + +Pl#Theme#ReplaceSegment({oldsegment}, {newsegment}) *Pl#Theme#ReplaceSegment* + +This function replaces {oldsegment} with {newsegment}. + +------------------------------------------------------------------------------ +6.2 Advanced customization *Powerline-advanced-customization* + +Because Powerline utilizes Vim's autoload functionality, you can easily create +your own segments, themes, functions and colorschemes without touching the +original source code. This is a bit more complex than using the utility +functions, but it allows you to do a lot more with your statusline. + +Your custom autoload files should be stored in your |runtimepath| (usually in +"~/.vim/autoload/Powerline/*"). + +Note: Remember to clear your cache with |:PowerlineClearCache| after changing +your statusline! + +6.2.1 Colorschemes *Powerline-cust-colorschemes* +------------------------------------------------------------------------------ + +Colorschemes should be stored as separate files in +{runtimepath}/autoload/Powerline/Colorschemes/. + +SYNTAX ~ + +TODO + +EXAMPLE ~ + +TODO + +6.2.2 Functions *Powerline-cust-functions* +------------------------------------------------------------------------------ + +Functions should be stored as separate files in +{runtimepath}/autoload/Powerline/Functions/. + +SYNTAX ~ + +TODO + +EXAMPLE ~ + +TODO + +6.2.3 Segments *Powerline-cust-segments* +------------------------------------------------------------------------------ + +Segments should be stored as separate files in +{runtimepath}/autoload/Powerline/Segments/. + +SYNTAX ~ + +TODO + +EXAMPLE ~ + +TODO + +6.2.4 Themes *Powerline-cust-themes* +------------------------------------------------------------------------------ + +Themes should be stored as separate files in +{runtimepath}/autoload/Powerline/Themes/. + +SYNTAX ~ + +TODO + +EXAMPLE ~ + +TODO + +============================================================================== +7. License *Powerline-license* + +Creative Commons Attribution-ShareAlike 3.0 Unported + +http://creativecommons.org/licenses/by-sa/3.0/ + +============================================================================== +8. Known issues *Powerline-known-issues* + +See the issue tracker at +https://github.com/Lokaltog/vim-powerline/issues + +============================================================================== +9. Contributing *Powerline-contributing* + +If you experience any bugs or have feature requests, please open an issue on +GitHub. Fork the source repository on GitHub and send a pull request if you +have any code improvements. + +Author: Kim Silkebækken +Source repository: https://github.com/Lokaltog/vim-powerline + +============================================================================== +vim:tw=78:sw=4:ts=8:ft=help:norl: diff --git a/sources_non_forked/vim-powerline/doc/tags b/sources_non_forked/vim-powerline/doc/tags new file mode 100644 index 00000000..c81aba9a --- /dev/null +++ b/sources_non_forked/vim-powerline/doc/tags @@ -0,0 +1,34 @@ +:PowerlineClearCache Powerline.txt /*:PowerlineClearCache* +Pl#Theme#InsertSegment Powerline.txt /*Pl#Theme#InsertSegment* +Pl#Theme#RemoveSegment Powerline.txt /*Pl#Theme#RemoveSegment* +Pl#Theme#ReplaceSegment Powerline.txt /*Pl#Theme#ReplaceSegment* +Powerline Powerline.txt /*Powerline* +Powerline-advanced-customization Powerline.txt /*Powerline-advanced-customization* +Powerline-basic-customization Powerline.txt /*Powerline-basic-customization* +Powerline-configuration Powerline.txt /*Powerline-configuration* +Powerline-contents Powerline.txt /*Powerline-contents* +Powerline-contributing Powerline.txt /*Powerline-contributing* +Powerline-cust-colorschemes Powerline.txt /*Powerline-cust-colorschemes* +Powerline-cust-functions Powerline.txt /*Powerline-cust-functions* +Powerline-cust-segments Powerline.txt /*Powerline-cust-segments* +Powerline-cust-themes Powerline.txt /*Powerline-cust-themes* +Powerline-customization Powerline.txt /*Powerline-customization* +Powerline-fonts Powerline.txt /*Powerline-fonts* +Powerline-introduction Powerline.txt /*Powerline-introduction* +Powerline-known-issues Powerline.txt /*Powerline-known-issues* +Powerline-license Powerline.txt /*Powerline-license* +Powerline-recommended-settings Powerline.txt /*Powerline-recommended-settings* +Powerline-requirements Powerline.txt /*Powerline-requirements* +Powerline-symbols-compatible Powerline.txt /*Powerline-symbols-compatible* +Powerline-symbols-fancy Powerline.txt /*Powerline-symbols-fancy* +Powerline-usage Powerline.txt /*Powerline-usage* +Powerline.txt Powerline.txt /*Powerline.txt* +Powerline_cache_enabled Powerline.txt /*Powerline_cache_enabled* +Powerline_cache_file Powerline.txt /*Powerline_cache_file* +Powerline_colorscheme Powerline.txt /*Powerline_colorscheme* +Powerline_dividers_override Powerline.txt /*Powerline_dividers_override* +Powerline_mode Powerline.txt /*Powerline_mode* +Powerline_stl_path_style Powerline.txt /*Powerline_stl_path_style* +Powerline_symbols Powerline.txt /*Powerline_symbols* +Powerline_symbols_override Powerline.txt /*Powerline_symbols_override* +Powerline_theme Powerline.txt /*Powerline_theme* diff --git a/sources_non_forked/vim-powerline/fontpatcher/PowerlineSymbols.sfd b/sources_non_forked/vim-powerline/fontpatcher/PowerlineSymbols.sfd new file mode 100755 index 00000000..34d7d0c8 --- /dev/null +++ b/sources_non_forked/vim-powerline/fontpatcher/PowerlineSymbols.sfd @@ -0,0 +1,319 @@ +SplineFontDB: 3.0 +FontName: PowerlineSymbols +FullName: PowerlineSymbols +FamilyName: PowerlineSymbols +Weight: Medium +Copyright: +UComments: "2011-11-21: Created." +Version: 001.000 +ItalicAngle: 0 +UnderlinePosition: -98.6328 +UnderlineWidth: 48.8281 +Ascent: 800 +Descent: 200 +LayerCount: 2 +Layer: 0 0 "Back" 1 +Layer: 1 0 "Fore" 0 +XUID: [1021 211 26716215 11021609] +FSType: 0 +OS2Version: 0 +OS2_WeightWidthSlopeOnly: 0 +OS2_UseTypoMetrics: 1 +CreationTime: 1321867751 +ModificationTime: 1326665029 +OS2TypoAscent: 0 +OS2TypoAOffset: 1 +OS2TypoDescent: 0 +OS2TypoDOffset: 1 +OS2TypoLinegap: 90 +OS2WinAscent: 0 +OS2WinAOffset: 1 +OS2WinDescent: 0 +OS2WinDOffset: 1 +HheadAscent: 0 +HheadAOffset: 1 +HheadDescent: 0 +HheadDOffset: 1 +OS2Vendor: 'PfEd' +MarkAttachClasses: 1 +DEI: 91125 +Encoding: UnicodeFull +Compacted: 1 +UnicodeInterp: none +NameList: Adobe Glyph List +DisplaySize: -24 +AntiAlias: 1 +FitToEm: 1 +WinInfo: 0 31 18 +BeginPrivate: 0 +EndPrivate +BeginChars: 1114112 9 + +StartChar: uni2B80 +Encoding: 11136 11136 0 +Width: 621 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 1000 m 1 + 621 379 l 1 + 0 -243 l 1 + 0 1000 l 1 +EndSplineSet +EndChar + +StartChar: uni2B81 +Encoding: 11137 11137 1 +Width: 621 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +10 991 m 0 + 16 997 23 1000 32 1000 c 0 + 41 1000 48 996 54 990 c 2 + 613 400 l 2 + 619 394 621 386 621 378 c 0 + 621 370 618 362 613 357 c 2 + 54 -233 l 2 + 48 -239 41 -242 32 -242 c 0 + 23 -242 16 -240 10 -234 c 0 + 4 -228 0 -221 0 -212 c 0 + 0 -203 3 -196 8 -190 c 2 + 547 379 l 1 + 8 948 l 2 + 3 954 0 961 0 970 c 0 + 0 979 4 985 10 991 c 0 +EndSplineSet +EndChar + +StartChar: uni2B82 +Encoding: 11138 11138 2 +Width: 621 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +621 1000 m 5 + 621 -243 l 5 + 0 379 l 5 + 621 1000 l 5 +EndSplineSet +EndChar + +StartChar: uni2B83 +Encoding: 11139 11139 3 +Width: 621 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +612 991 m 0 + 618 985 621 979 621 970 c 0 + 621 961 619 954 613 948 c 2 + 74 379 l 1 + 613 -190 l 2 + 619 -196 621 -203 621 -212 c 0 + 621 -221 618 -228 612 -234 c 0 + 606 -240 598 -242 589 -242 c 0 + 580 -242 574 -239 568 -233 c 2 + 8 357 l 2 + 3 362 0 370 0 378 c 0 + 0 386 3 394 8 400 c 2 + 568 990 l 2 + 574 996 580 1000 589 1000 c 0 + 598 1000 606 997 612 991 c 0 +EndSplineSet +EndChar + +StartChar: uni2B61 +Encoding: 11105 11105 4 +Width: 555 +VWidth: 0 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 800 m 5 + 92 800 l 5 + 92 513 l 5 + 253 513 l 5 + 253 444 l 5 + 0 444 l 5 + 0 800 l 5 +236 312 m 5 + 339 312 l 5 + 468 67 l 5 + 468 312 l 5 + 555 312 l 5 + 555 -44 l 5 + 453 -44 l 5 + 323 200 l 5 + 323 -44 l 5 + 236 -44 l 5 + 236 312 l 5 +EndSplineSet +EndChar + +StartChar: uni2B60 +Encoding: 11104 11104 5 +Width: 676 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 197 m 1 + 94 207 419 279 419 384 c 2 + 419 537 l 1 + 278 501 l 1 + 478 794 l 1 + 677 501 l 1 + 536 537 l 1 + 536 384 l 2 + 536 196 208 126 208 21 c 2 + 208 -244 l 1 + 0 -244 l 1 + 0 197 l 1 +0 288 m 1 + 0 405 0 944 0 944 c 1 + 208 944 l 1 + 208 944 208 451 208 334 c 1 + 185 311 12 288 0 288 c 1 +EndSplineSet +EndChar + +StartChar: uni2B62 +Encoding: 11106 11106 6 +Width: 428 +VWidth: 0 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +88 677 m 2 + 429 677 l 1 + 429 589 l 1 + 88 589 l 1 + 88 162 l 1 + 198 162 l 1 + 198 343 l 1 + 374 343 l 1 + 374 427 l 1 + 198 427 l 1 + 198 506 l 1 + 429 506 l 1 + 429 274 l 1 + 416 263 391 255 374 255 c 2 + 286 255 l 1 + 286 162 l 2 + 286 114 246 74 198 74 c 2 + 88 74 l 2 + 40 74 0 114 0 162 c 2 + 0 589 l 2 + 0 637 40 677 88 677 c 2 +EndSplineSet +EndChar + +StartChar: uni2B63 +Encoding: 11107 11107 7 +Width: 428 +VWidth: 0 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +0 677 m 5 + 341 677 l 6 + 389 677 429 637 429 589 c 6 + 429 506 l 6 + 429 458 389 418 341 418 c 6 + 287 418 l 5 + 287 162 l 6 + 287 114 247 74 199 74 c 6 + 89 74 l 6 + 41 74 1 114 1 162 c 6 + 1 274 l 6 + 0 274 l 6 + 0 506 l 5 + 89 506 l 5 + 89 162 l 5 + 199 162 l 5 + 199 506 l 5 + 341 506 l 5 + 341 589 l 5 + 0 589 l 5 + 0 677 l 5 +EndSplineSet +EndChar + +StartChar: uni2B64 +Encoding: 11108 11108 8 +Width: 546 +VWidth: 0 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +273 733 m 4 + 429 733 430 538 430 538 c 5 + 430 420 l 5 + 547 420 l 5 + 547 303 l 5 + 547 303 546 -9 273 -9 c 4 + 0 -9 0 303 0 303 c 5 + 0 420 l 5 + 117 420 l 5 + 117 538 l 5 + 117 538 117 733 273 733 c 4 +273 655 m 4 + 195 655 195 576 195 420 c 5 + 352 420 l 5 + 352 576 351 655 273 655 c 4 +273 342 m 4 + 195 342 195 147 273 147 c 4 + 351 147 351 342 273 342 c 4 +EndSplineSet +EndChar +EndChars +BitmapFont: 10 10 8 2 1 +BDFChar: 0 11136 6 0 4 -2 7 +JAC+4q"X@:^jlCb +BDFChar: 1 11137 6 0 4 -2 7 +J3Y4g#RCta5_&h7 +BDFChar: 2 11138 6 1 5 -2 7 +#T,OGq"T(n(^L*A +BDFChar: 3 11139 6 1 5 -2 7 +#S8+DJ:Km-&-r79 +BDFChar: 4 11105 6 1 4 -1 7 +J:N1>!0GR3O8o7\ +BDFChar: 5 11104 7 0 5 -2 7 +^rYQ3 +BDFChar: 8 11108 5 0 5 0 6 +0M"b4bku\c +EndBitmapFont +BitmapFont: 12 10 10 2 1 +BDFChar: 0 11136 7 0 6 -2 11 +!!%Pbi:-O>r:od>^jlCb +BDFChar: 1 11137 7 0 6 -3 11 +!!%O7+:ne]":,P]5_&h7 +BDFChar: 2 11138 7 0 6 -2 11 +!!!-1*'AWHr-UUH$j6P1 +BDFChar: 3 11139 7 0 6 -2 11 +!!!--&0O5gJ3Y4g#Qt,- +BDFChar: 4 11105 7 0 5 0 8 +J:N1>!$jBP,QIfE +BDFChar: 5 11104 8 0 8 -3 11 +z^];.Ma8juqa8j9]a8jQehuLOm^];.Mz +BDFChar: 6 11106 5 1 6 0 8 +!-j$]R"1Qc?iU0, +BDFChar: 7 11107 5 0 5 0 7 +p]QtGOH>Q3 +BDFChar: 8 11108 7 0 5 0 8 +0M"`*r63C_GQ7^D +EndBitmapFont +EndSplineFont diff --git a/sources_non_forked/vim-powerline/fontpatcher/README.rst b/sources_non_forked/vim-powerline/fontpatcher/README.rst new file mode 100755 index 00000000..35b3d5d0 --- /dev/null +++ b/sources_non_forked/vim-powerline/fontpatcher/README.rst @@ -0,0 +1,164 @@ +====================== +Powerline font patcher +====================== + +:Author: Kim Silkebækken (kim.silkebaekken+vim@gmail.com) + +Description +----------- + +This font patcher creates dividers and symbols for use with Powerline. The +script requires Python 2 and FontForge compiled with Python bindings. + +Patched fonts are renamed by default (" for Powerline" is added to the font +name) so they don't conflict with existing fonts. Use the ``--no-rename`` +option to disable font renaming. + +Glyph table +----------- + +All the glyphs are stored in the ``U+2B60``-``U+2BFF`` range ("Misc symbols +and arrows"). + ++------------+-------------------+ +| Code point | Description | ++============+===================+ +| ``U+2B60`` | Branch symbol | ++------------+-------------------+ +| ``U+2B61`` | LN (line) symbol | ++------------+-------------------+ +| ``U+2B62`` | FT symbol, part 1 | ++------------+-------------------+ +| ``U+2B63`` | FT symbol, part 2 | ++------------+-------------------+ +| ``U+2B64`` | Padlock (closed) | ++------------+-------------------+ +| ``U+2B80`` | Hard right arrow | ++------------+-------------------+ +| ``U+2B81`` | Soft right arrow | ++------------+-------------------+ +| ``U+2B82`` | Hard left arrow | ++------------+-------------------+ +| ``U+2B83`` | Soft left arrow | ++------------+-------------------+ + +=================== +Font patching guide +=================== + +There's a `GitHub wiki page`_ dedicated to community-contributed patched +fonts. You may download one of the fonts on that page if you don't want to +patch the fonts yourself. + +If you do patch a font that's not included in the wiki (and you have +permission to distribute it), please include it on the wiki page. + +**Note:** The fonts in the wiki may be outdated, and may have different +glyphs than the ones provided in the latest version of Powerline. It's +recommended that you always patch your fonts yourself if you have the +required software. + +.. _`GitHub wiki page`: https://github.com/Lokaltog/vim-powerline/wiki/Patched-fonts + +Linux +----- + +1. Install fontforge with Python bindings. For Ubuntu users the required + package is ``python-fontforge``, for Arch Linux users the required + package is ``fontforge``. It should be something similar for other + distros. + +2. Run the font patcher:: + + $ /path/to/fontpatcher MyFontFile.ttf + +3. Copy the font file into ``~/.fonts`` (or another X font directory):: + + $ cp MyFontFile-Powerline.otf ~/.fonts + + **Note:** If the font is a pure bitmap font (e.g. a PCF font) it will be + stored in the BDF format. This is usually not a problem, and you may + convert the font back to the PCF format using ``bdftopcf`` if you want + to. All other fonts will be stored in the OTF format regardless of the + original format. + +4. Update your font cache:: + + $ sudo fc-cache -vf + + **Note:** If you use vim in rxvt-unicode in the client/daemon mode, you + may need to close all running terminals as well for the font to be + updated. + +5. **For gvim users:** Update the GUI font in your ``vimrc`` file:: + + set guifont=MyFont\ for\ Powerline + + **For terminal users:** Update your terminal configuration to use the + patched font. + +6. Update your ``vimrc`` configuration to use the new symbols:: + + let g:Powerline_symbols = 'fancy' + +7. Make sure that the cache file is deleted:: + + $ rm /tmp/Powerline.cache + +8. Start vim and enjoy your new statusline! + +OS X +---- + +1. Check if you have a FontForge version with Python support by running + ``fontforge -version``. You should see something like this:: + + $ fontforge -version + Copyright (c) 2000-2011 by George Williams. + Executable based on sources from 13:48 GMT 22-Feb-2011-D. + Library based on sources from 13:48 GMT 22-Feb-2011. + fontforge 20110222 + libfontforge 20110222 + + Make sure that the executable version number doesn't have ``NoPython`` in + it. If everything looks OK, skip ahead to step 4. + +2. If you have FontForge but with ``NoPython`` in the version number, please + try to update to a later version:: + + $ brew uninstall fontforge + $ brew update + $ brew install --use-gcc fontforge + + **Note:** You may have to use ``--use-clang`` instead of ``--use-gcc`` + when compiling FontForge. + +3. If you don't have FontForge, install it with Homebrew:: + + $ brew update + $ brew install --use-gcc fontforge + +4. Patch your fonts by passing the ``fontpatcher`` script as a parameter to + FontForge:: + + $ fontforge -script /path/to/fontpatcher MyFontFile.ttf + +5. Install the font by double-clicking the font file in Finder and click + "Install this font" from the preview window. + +6. **For gvim users:** Update the GUI font in your ``vimrc`` file:: + + set guifont=MyFont\ for\ Powerline + + **For terminal users:** Update your terminal configuration to use the + patched font. + +7. Update your ``vimrc`` configuration to use the new symbols:: + + let g:Powerline_symbols = 'fancy' + +8. Make sure that the cache file is deleted:: + + $ rm /tmp/Powerline.cache + +9. Start vim and enjoy your new statusline! diff --git a/sources_non_forked/vim-powerline/fontpatcher/fontpatcher b/sources_non_forked/vim-powerline/fontpatcher/fontpatcher new file mode 100755 index 00000000..2c54a3fa --- /dev/null +++ b/sources_non_forked/vim-powerline/fontpatcher/fontpatcher @@ -0,0 +1,240 @@ +#!/usr/bin/env python + +"""Font patcher for Powerline. + +Creates dividers and symbols for use with Powerline. Requires FontForge with Python bindings. + +Stores glyphs in the 2b60-2bff Unicode range ("Misc symbols and arrows"). + +[2b60] Branch symbol +[2b61] LN (line) symbol +[2b62] FT symbol 1 +[2b63] FT symbol 2 +[2b64] Padlock (closed) symbol +[2b80] Hard right arrow +[2b81] Soft right arrow +[2b82] Hard left arrow +[2b83] Soft left arrow +""" + +from __future__ import division + +import argparse +import os +import sys +import re + +try: + import fontforge + import psMat +except ImportError: + sys.stderr.write('The required FontForge modules could not be loaded.\n\n') + + if sys.version_info.major > 2: + sys.stderr.write('FontForge only supports Python 2. Please run this script with the Python 2 executable - e.g. "python2 {0}"\n'.format(sys.argv[0])) + else: + sys.stderr.write('You need FontForge with Python bindings for this script to work.\n') + + sys.exit(1) + +# Handle command-line arguments +parser = argparse.ArgumentParser(description='Font patcher for Powerline. Creates dividers and symbols in FontForge-compatible font files. Requires FontForge with Python bindings. Stores glyphs in the U+2B80-U+2BFF range ("Miscellaneous symbols and arrows"). Stores the patched font as a new, renamed font file by default.') + +parser.add_argument('fonts', help='font file to patch', metavar='font', nargs='+') +parser.add_argument('--no-rename', help='don\'t add " for Powerline" to the font name', default=True, action='store_false', dest='rename') +parser.add_argument('--symbol-font', help='font file with symbols', metavar='font', dest='symbol_font', default='{0}/PowerlineSymbols.sfd'.format(sys.path[0])) +parser.add_argument('--fix-mono', help='fixes some mono-fonts which have glyphs of 0 widths', default=False, action='store_true', dest='fixmono') +parser.add_argument('--fix-win', help='modifies font names such that Windows correctly recognizes font families', default=False, action='store_true', dest='fixwin') + +args = parser.parse_args() + +SYM_ATTR = { + # Right/left-aligned glyphs will have their advance width reduced in order to overlap the next glyph slightly + 0x2b60: { 'align': 'c', 'stretch': 'y' , 'overlap': False }, + 0x2b61: { 'align': 'c', 'stretch': '' , 'overlap': False }, + 0x2b62: { 'align': 'r', 'stretch': '' , 'overlap': False }, + 0x2b63: { 'align': 'l', 'stretch': '' , 'overlap': False }, + 0x2b64: { 'align': 'c', 'stretch': '' , 'overlap': False }, + 0x2b80: { 'align': 'l', 'stretch': 'xy', 'overlap': True }, + 0x2b81: { 'align': 'l', 'stretch': 'xy', 'overlap': True }, + 0x2b82: { 'align': 'r', 'stretch': 'xy', 'overlap': True }, + 0x2b83: { 'align': 'r', 'stretch': 'xy', 'overlap': True }, +} + +# Open symbol font +try: + symbols = fontforge.open(args.symbol_font) +except EnvironmentError: + sys.exit(1) + +# Patch provided fonts +for font_path in args.fonts: + try: + font = fontforge.open(font_path) + except EnvironmentError: + sys.exit(1) + + # Rename font + if args.rename: + font.familyname += ' for Powerline' + font.fullname += ' for Powerline' + font.fontname += 'ForPowerline' + font.appendSFNTName('English (US)', 'Preferred Family', font.familyname) + font.appendSFNTName('English (US)', 'Compatible Full', font.fullname) + if args.fixwin: + font.fontname = re.sub(r'\W', '', font.familyname) + + # Force the em size to be equal + symbols.em = font.em + + # Initial font dimensions + font_dim = { + 'xmin' : 0, + 'ymin' : -font.descent, + 'xmax' : 0, + 'ymax' : font.ascent, + + 'width' : 0, + 'height': 0, + } + + # Find the biggest char width and height + # + # 0x00-0x17f is the Latin Extended-A range + # 0x2500-0x2600 is the box drawing range + for glyph in range(0x00, 0x17f) + range(0x2500, 0x2600): + try: + (xmin, ymin, xmax, ymax) = font[glyph].boundingBox() + except TypeError: + continue + + if font_dim['width'] == 0: + font_dim['width'] = font[glyph].width + + if ymin < font_dim['ymin']: font_dim['ymin'] = ymin + if ymax > font_dim['ymax']: font_dim['ymax'] = ymax + if xmax > font_dim['xmax']: font_dim['xmax'] = xmax + + # Calculate font height + font_dim['height'] = abs(font_dim['ymin']) + font_dim['ymax'] + + # Update the font encoding to ensure that the Unicode glyphs are available + font.encoding = 'ISO10646' + + # Fetch this property before adding outlines + onlybitmaps = font.onlybitmaps + + def get_dim(glyph): + bbox = glyph.boundingBox() + + return { + 'xmin' : bbox[0], + 'ymin' : bbox[1], + 'xmax' : bbox[2], + 'ymax' : bbox[3], + + 'width' : bbox[2] + (-bbox[0]), + 'height': bbox[3] + (-bbox[1]), + } + + # Create glyphs from symbol font + for sym_glyph in symbols.glyphs(): + sym_attr = SYM_ATTR[sym_glyph.unicode] + + # Prepare symbol glyph dimensions + sym_dim = get_dim(sym_glyph) + + # Select and copy symbol from its encoding point + symbols.selection.select(sym_glyph.encoding) + symbols.copy() + + # Select and paste symbol to its unicode code point + font.selection.select(sym_glyph.unicode) + font.paste() + + # Now that we have copy/pasted the glyph, it's time to scale and move it + + # Handle glyph stretching + if 'x' in sym_attr['stretch']: + # Stretch the glyph horizontally + scale_ratio = font_dim['width'] / sym_dim['width'] + + font.transform(psMat.scale(scale_ratio, 1)) + if 'y' in sym_attr['stretch']: + # Stretch the glyph vertically + scale_ratio = font_dim['height'] / sym_dim['height'] + + font.transform(psMat.scale(1, scale_ratio)) + + # Use the dimensions from the pasted and stretched glyph + sym_dim = get_dim(font[sym_glyph.unicode]) + + # Center-align the glyph vertically + font_ycenter = font_dim['height'] / 2 + sym_ycenter = sym_dim['height'] / 2 + + # First move it to the ymax (top) + font.transform(psMat.translate(0, font_dim['ymax'] - sym_dim['ymax'])) + + # Then move it the y center difference + font.transform(psMat.translate(0, sym_ycenter - font_ycenter)) + + # Ensure that the glyph doesn't extend outside the font's bounding box + if sym_dim['width'] > font_dim['width']: + # The glyph is too wide, scale it down to fit + scale_matrix = psMat.scale(font_dim['width'] / sym_dim['width'], 1) + + font.transform(scale_matrix) + + # Use the dimensions from the stretched glyph + sym_dim = get_dim(font[sym_glyph.unicode]) + + # Handle glyph alignment + if sym_attr['align'] == 'c': + # Center align + align_matrix = psMat.translate(font_dim['width'] / 2 - sym_dim['width'] / 2 , 0) + elif sym_attr['align'] == 'r': + # Right align + align_matrix = psMat.translate(font_dim['width'] - sym_dim['width'], 0) + else: + # No alignment (left alignment) + align_matrix = psMat.translate(0, 0) + + font.transform(align_matrix) + + if sym_attr['overlap'] is True: + overlap_width = font.em / 48 + + # Stretch the glyph slightly horizontally if it should overlap + font.transform(psMat.scale((sym_dim['width'] + overlap_width) / sym_dim['width'], 1)) + + if sym_attr['align'] == 'l': + # The glyph should be left-aligned, so it must be moved overlap_width to the left + # This only applies to left-aligned glyphs because the glyph is scaled to the right + font.transform(psMat.translate(-overlap_width, 0)) + + # Ensure the font is considered monospaced on Windows + font[sym_glyph.unicode].width = font_dim['width'] + + if font.bitmapSizes and not onlybitmaps: + # If this is an outline font with bitmaps, regenerate bitmaps for the changed glyphs + font.selection.changed() + + for size in font.bitmapSizes: + font.regenBitmaps((size, )) + + output_name, extension = os.path.split(font_path)[1].rsplit('.', 1) + if extension.lower() not in ['ttf', 'otf']: + # Default to OpenType if input is not TrueType/OpenType + extension = 'otf' + if args.fixmono: + for glyph in font.glyphs(): + if glyph.width == 0: glyph.width = font_dim['width'] + + if onlybitmaps: + # Generate BDF font + font.generate('{0}-Powerline.bdf'.format(output_name, bitmap_type='bdf')) + else: + # Generate OTF/TTF font + font.generate('{0}-Powerline.{1}'.format(output_name, extension)) + diff --git a/sources_non_forked/vim-powerline/plugin/Powerline.vim b/sources_non_forked/vim-powerline/plugin/Powerline.vim new file mode 100755 index 00000000..5454aa49 --- /dev/null +++ b/sources_non_forked/vim-powerline/plugin/Powerline.vim @@ -0,0 +1,69 @@ +" Powerline - The ultimate statusline utility +" +" Author: Kim Silkebækken +" Source repository: https://github.com/Lokaltog/vim-powerline + +" Script initialization {{{ + if exists('g:Powerline_loaded') || &compatible || version < 702 + finish + endif + + let g:Powerline_loaded = 1 +" }}} +" Commands {{{ + command! PowerlineClearCache call Pl#ClearCache() + command! PowerlineReloadColorscheme call Pl#ReloadColorscheme() +" }}} +" Set default options {{{ + for [s:key, s:value] in items({ + \ 'theme' : 'default' + \ , 'colorscheme' : 'default' + \ , 'symbols' : 'compatible' + \ , 'symbols_override' : {} + \ , 'dividers_override': [] + \ , 'stl_path_style' : 'relative' + \ , 'cache_enabled' : 1 + \ }) + + if ! exists('g:Powerline_' . s:key) + exec printf('let g:Powerline_%s = %s', s:key, string(s:value)) + endif + + unlet! s:key s:value + endfor + + if ! exists('g:Powerline_cache_file') + exec 'let g:Powerline_cache_file = '. string(printf('%s/Powerline_%s_%s_%s.cache' + \ , simplify(expand(':p:h') .'/..') + \ , g:Powerline_theme + \ , g:Powerline_colorscheme + \ , g:Powerline_symbols + \ )) + endif +" }}} +" Autocommands {{{ + function! s:CreateAutocmds() + augroup PowerlineMain + autocmd! + + " Reload statuslines when changing color scheme + autocmd ColorScheme * + \ call Pl#Load() + + autocmd BufEnter,WinEnter,FileType,BufUnload * + \ call Pl#UpdateStatusline(1) + + autocmd BufLeave,WinLeave * + \ call Pl#UpdateStatusline(0) + + autocmd BufWritePost */autoload/Powerline/Colorschemes/*.vim + \ :PowerlineReloadColorscheme + augroup END + endfunction + + augroup PowerlineStartup + autocmd! + + autocmd VimEnter * call s:CreateAutocmds() | call Pl#UpdateStatusline(1) + augroup END +" }}} diff --git a/vimrcs/extended.vim b/vimrcs/extended.vim index a3201968..d76b2d9a 100644 --- a/vimrcs/extended.vim +++ b/vimrcs/extended.vim @@ -18,13 +18,11 @@ endif " Set font according to system if has("mac") || has("macunix") - set gfn=Menlo:h14 - set shell=/bin/bash + set gfn=Menlo:h15 elseif has("win16") || has("win32") - set gfn=Bitstream\ Vera\ Sans\ Mono:h10 + set gfn=Bitstream\ Vera\ Sans\ Mono:h11 elseif has("linux") - set gfn=Monospace\ 10 - set shell=/bin/bash + set gfn=Monospace\ 11 endif " Open MacVim in fullscreen mode From 67a1baaae380c6d5ab4dd6029b77b2740c4dea0b Mon Sep 17 00:00:00 2001 From: amix Date: Sat, 13 Apr 2013 18:33:45 -0300 Subject: [PATCH 05/13] Fixed some things in peaksea (regarding omni menu and folding in terminal mode). Optimized a bit colors for powerline --- sources_forked/peaksea/colors/peaksea.vim | 41 ++++++++++--------- ...Powerline_default_default_compatible.cache | 6 +-- .../vim-powerline/README.md | 0 .../vim-powerline/README.rst | 0 .../vim-powerline/autoload/Pl.vim | 0 .../vim-powerline/autoload/Pl/Colorscheme.vim | 0 .../vim-powerline/autoload/Pl/Hi.vim | 0 .../vim-powerline/autoload/Pl/Match.vim | 0 .../vim-powerline/autoload/Pl/Mod.vim | 0 .../vim-powerline/autoload/Pl/Parser.vim | 0 .../vim-powerline/autoload/Pl/Segment.vim | 0 .../vim-powerline/autoload/Pl/Theme.vim | 0 .../Powerline/Colorschemes/default.vim | 4 +- .../autoload/Powerline/Colorschemes/skwp.vim | 0 .../autoload/Powerline/Functions.vim | 0 .../autoload/Powerline/Functions/ft_man.vim | 0 .../autoload/Powerline/Functions/fugitive.vim | 0 .../autoload/Powerline/Functions/hgrev.vim | 0 .../Powerline/Functions/syntastic.vim | 0 .../autoload/Powerline/Matches.vim | 0 .../autoload/Powerline/Segments.vim | 0 .../autoload/Powerline/Segments/ctrlp.vim | 0 .../autoload/Powerline/Segments/ft_man.vim | 0 .../autoload/Powerline/Segments/fugitive.vim | 0 .../autoload/Powerline/Segments/hgrev.vim | 0 .../autoload/Powerline/Segments/rvm.vim | 0 .../autoload/Powerline/Segments/syntastic.vim | 0 .../autoload/Powerline/Segments/tagbar.vim | 0 .../Powerline/Segments/virtualenv.vim | 0 .../autoload/Powerline/Themes/default.vim | 0 .../autoload/Powerline/Themes/skwp.vim | 0 .../vim-powerline/doc/Powerline.txt | 0 .../vim-powerline/doc/tags | 0 .../fontpatcher/PowerlineSymbols.sfd | 0 .../vim-powerline/fontpatcher/README.rst | 0 .../vim-powerline/fontpatcher/fontpatcher | 0 .../vim-powerline/plugin/Powerline.vim | 0 vimrcs/extended.vim | 6 +-- 38 files changed, 27 insertions(+), 30 deletions(-) rename {sources_non_forked => sources_forked}/vim-powerline/Powerline_default_default_compatible.cache (75%) rename {sources_non_forked => sources_forked}/vim-powerline/README.md (100%) rename {sources_non_forked => sources_forked}/vim-powerline/README.rst (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Pl.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Pl/Colorscheme.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Pl/Hi.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Pl/Match.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Pl/Mod.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Pl/Parser.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Pl/Segment.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Pl/Theme.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Colorschemes/default.vim (97%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Colorschemes/skwp.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Functions.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Functions/ft_man.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Functions/fugitive.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Functions/hgrev.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Functions/syntastic.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Matches.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Segments.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Segments/ctrlp.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Segments/ft_man.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Segments/fugitive.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Segments/hgrev.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Segments/rvm.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Segments/syntastic.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Segments/tagbar.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Segments/virtualenv.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Themes/default.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/autoload/Powerline/Themes/skwp.vim (100%) rename {sources_non_forked => sources_forked}/vim-powerline/doc/Powerline.txt (100%) rename {sources_non_forked => sources_forked}/vim-powerline/doc/tags (100%) rename {sources_non_forked => sources_forked}/vim-powerline/fontpatcher/PowerlineSymbols.sfd (100%) rename {sources_non_forked => sources_forked}/vim-powerline/fontpatcher/README.rst (100%) rename {sources_non_forked => sources_forked}/vim-powerline/fontpatcher/fontpatcher (100%) rename {sources_non_forked => sources_forked}/vim-powerline/plugin/Powerline.vim (100%) diff --git a/sources_forked/peaksea/colors/peaksea.vim b/sources_forked/peaksea/colors/peaksea.vim index 92895bc3..7b95aadd 100644 --- a/sources_forked/peaksea/colors/peaksea.vim +++ b/sources_forked/peaksea/colors/peaksea.vim @@ -309,10 +309,10 @@ elseif &background=='dark' hi SpellRare guifg=NONE guibg=NONE guisp=#f0c0f0 hi SpellLocal guifg=NONE guibg=NONE guisp=#c0d8f8 endif - hi Pmenu guifg=fg guibg=#800080 - hi PmenuSel guifg=#000000 guibg=#d0d0d0 gui=NONE - hi PmenuSbar guifg=fg guibg=#000080 gui=NONE - hi PmenuThumb guifg=fg guibg=#008000 gui=NONE + + hi Pmenu guifg=#dddddd guibg=#444444 gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuSel guifg=#000000 guibg=#ffffff gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE + hi TabLine guifg=fg guibg=#008000 gui=NONE hi TabLineFill guifg=fg guibg=#008000 gui=NONE hi TabLineSel guifg=fg guibg=NONE gui=NONE @@ -369,12 +369,12 @@ elseif &background=='dark' hi StatusLine ctermfg=Black ctermbg=DarkCyan hi Question ctermfg=Black ctermbg=DarkYellow hi Todo ctermfg=DarkRed ctermbg=DarkYellow - hi Folded ctermfg=White ctermbg=DarkGreen + hi Folded ctermfg=DarkGrey ctermbg=DarkGrey + hi FoldColumn ctermfg=DarkGrey ctermbg=DarkGrey hi ModeMsg ctermfg=Grey ctermbg=DarkBlue hi VisualNOS ctermfg=Grey ctermbg=DarkBlue hi ErrorMsg ctermfg=DarkYellow ctermbg=DarkRed hi WildMenu ctermfg=Black ctermbg=DarkYellow - hi FoldColumn ctermfg=White ctermbg=DarkGreen hi SignColumn ctermfg=White ctermbg=DarkGreen hi DiffText ctermfg=Black ctermbg=DarkYellow @@ -385,12 +385,12 @@ elseif &background=='dark' hi SpellRare ctermfg=NONE ctermbg=DarkMagenta hi SpellLocal ctermfg=NONE ctermbg=DarkGreen endif - hi Pmenu ctermfg=fg ctermbg=DarkMagenta - hi PmenuSel ctermfg=Black ctermbg=fg - hi PmenuSbar ctermfg=fg ctermbg=DarkBlue - hi PmenuThumb ctermfg=fg ctermbg=DarkGreen - hi TabLine ctermfg=fg ctermbg=DarkGreen cterm=underline - hi TabLineFill ctermfg=fg ctermbg=DarkGreen cterm=underline + + hi Pmenu ctermfg=White ctermbg=DarkGrey + hi PmenuSel ctermfg=Black ctermbg=White + + hi TabLine ctermfg=fg ctermbg=Black cterm=underline + hi TabLineFill ctermfg=fg ctermbg=Black cterm=underline hi CursorColumn ctermfg=NONE ctermbg=DarkRed hi TabLineSel ctermfg=fg ctermbg=bg @@ -524,8 +524,8 @@ elseif &background=='dark' hi Title ctermfg=219 ctermbg=NONE cterm=NONE hi WarningMsg ctermfg=209 ctermbg=NONE cterm=NONE hi WildMenu ctermfg=16 ctermbg=186 cterm=NONE - hi Folded ctermfg=NONE ctermbg=22 cterm=NONE - hi FoldColumn ctermfg=254 ctermbg=28 cterm=NONE + hi Folded ctermfg=NONE ctermbg=DarkGrey cterm=NONE + hi FoldColumn ctermfg=DarkGrey ctermbg=DarkGrey cterm=NONE hi DiffAdd ctermfg=NONE ctermbg=18 cterm=NONE hi DiffChange ctermfg=NONE ctermbg=90 cterm=NONE hi DiffDelete ctermfg=69 ctermbg=234 cterm=NONE @@ -552,13 +552,14 @@ elseif &background=='dark' hi SpellLocal cterm=undercurl ctermbg=NONE ctermfg=NONE endif endif - hi Pmenu ctermfg=fg ctermbg=90 - hi PmenuSel ctermfg=16 ctermbg=252 cterm=NONE - hi PmenuSbar ctermfg=fg ctermbg=18 cterm=NONE - hi PmenuThumb ctermfg=fg ctermbg=28 cterm=NONE - hi TabLine ctermfg=fg ctermbg=28 cterm=NONE - hi TabLineFill ctermfg=fg ctermbg=28 cterm=NONE + + hi Pmenu ctermfg=White ctermbg=DarkGrey + hi PmenuSel ctermfg=Black ctermbg=White cterm=NONE + + hi TabLine ctermfg=fg ctermbg=Black cterm=NONE + hi TabLineFill ctermfg=fg ctermbg=Black cterm=NONE hi TabLineSel ctermfg=fg ctermbg=NONE cterm=NONE + hi CursorColumn ctermfg=NONE ctermbg=88 cterm=NONE hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline hi MatchParen ctermfg=NONE ctermbg=90 diff --git a/sources_non_forked/vim-powerline/Powerline_default_default_compatible.cache b/sources_forked/vim-powerline/Powerline_default_default_compatible.cache similarity index 75% rename from sources_non_forked/vim-powerline/Powerline_default_default_compatible.cache rename to sources_forked/vim-powerline/Powerline_default_default_compatible.cache index a237c0a1..498b4f63 100644 --- a/sources_non_forked/vim-powerline/Powerline_default_default_compatible.cache +++ b/sources_forked/vim-powerline/Powerline_default_default_compatible.cache @@ -1,4 +1,4 @@ let g:Powerline_cache_revision = 7 -let g:Pl#HL = ['hi Ple7ffffffa0d70000b ctermfg=231 ctermbg=160 cterm=bold guifg=#ffffff guibg=#d70000 gui=bold', 'hi Pla0d70000f0585858N ctermfg=160 ctermbg=240 cterm=NONE guifg=#d70000 guibg=#585858 gui=NONE', 'hi Plc4ff0000f0585858b ctermfg=196 ctermbg=240 cterm=bold guifg=#ff0000 guibg=#585858 gui=bold', 'hi Plfcd0d0d0f0585858N ctermfg=252 ctermbg=240 cterm=NONE guifg=#d0d0d0 guibg=#585858 gui=NONE', 'hi Ple7fffffff0585858b ctermfg=231 ctermbg=240 cterm=bold guifg=#ffffff guibg=#585858 gui=bold', 'hi Plf0585858ec303030N ctermfg=240 ctermbg=236 cterm=NONE guifg=#585858 guibg=#303030 gui=NONE', 'hi Ple7ffffffec303030N ctermfg=231 ctermbg=236 cterm=NONE guifg=#ffffff guibg=#303030 gui=NONE', 'hi Plf79e9e9eec303030N ctermfg=247 ctermbg=236 cterm=NONE guifg=#9e9e9e guibg=#303030 gui=NONE', 'hi Plec303030ec303030N ctermfg=236 ctermbg=236 cterm=NONE guifg=#303030 guibg=#303030 gui=NONE', 'hi Plfabcbcbcf0585858N ctermfg=250 ctermbg=240 cterm=NONE guifg=#bcbcbc guibg=#585858 gui=NONE', 'hi Plec303030fcd0d0d0b ctermfg=236 ctermbg=252 cterm=bold guifg=#303030 guibg=#d0d0d0 gui=bold', 'hi Plf4808080fcd0d0d0N ctermfg=244 ctermbg=252 cterm=NONE guifg=#808080 guibg=#d0d0d0 gui=NONE', 'hi Pla0d70000f1626262N ctermfg=160 ctermbg=241 cterm=NONE guifg=#d70000 guibg=#626262 gui=NONE', 'hi Ple7fffffff1626262b ctermfg=231 ctermbg=241 cterm=bold guifg=#ffffff guibg=#626262 gui=bold', 'hi Plf1626262f0585858N ctermfg=241 ctermbg=240 cterm=NONE guifg=#626262 guibg=#585858 gui=NONE', 'hi Pl58870000e9121212N ctermfg=88 ctermbg=233 cterm=NONE guifg=#870000 guibg=#121212 gui=NONE', 'hi Plf1626262e9121212N ctermfg=241 ctermbg=233 cterm=NONE guifg=#626262 guibg=#121212 gui=NONE', 'hi Plf58a8a8ae9121212b ctermfg=245 ctermbg=233 cterm=bold guifg=#8a8a8a guibg=#121212 gui=bold', 'hi Ple9121212e9121212N ctermfg=233 ctermbg=233 cterm=NONE guifg=#121212 guibg=#121212 gui=NONE', 'hi Ple7ffffffe9121212N ctermfg=231 ctermbg=233 cterm=NONE guifg=#ffffff guibg=#121212 gui=NONE', 'hi Plf0585858eb262626N ctermfg=240 ctermbg=235 cterm=NONE guifg=#585858 guibg=#262626 gui=NONE', 'hi Pleb262626e9121212N ctermfg=235 ctermbg=233 cterm=NONE guifg=#262626 guibg=#121212 gui=NONE', 'hi Plf58a8a8aeb262626b ctermfg=245 ctermbg=235 cterm=bold guifg=#8a8a8a guibg=#262626 gui=bold', 'hi Plf1626262eb262626N ctermfg=241 ctermbg=235 cterm=NONE guifg=#626262 guibg=#262626 gui=NONE', 'hi Pla0d70000d0ff8700N ctermfg=160 ctermbg=208 cterm=NONE guifg=#d70000 guibg=#ff8700 gui=NONE', 'hi Pl58870000d0ff8700b ctermfg=88 ctermbg=208 cterm=bold guifg=#870000 guibg=#ff8700 gui=bold', 'hi Pld0ff8700f0585858N ctermfg=208 ctermbg=240 cterm=NONE guifg=#ff8700 guibg=#585858 gui=NONE', 'hi Pla0d70000e7ffffffN ctermfg=160 ctermbg=231 cterm=NONE guifg=#d70000 guibg=#ffffff gui=NONE', 'hi Pl17005f5fe7ffffffb ctermfg=23 ctermbg=231 cterm=bold guifg=#005f5f guibg=#ffffff gui=bold', 'hi Ple7ffffff1f0087afN ctermfg=231 ctermbg=31 cterm=NONE guifg=#ffffff guibg=#0087af gui=NONE', 'hi Plc4ff00001f0087afb ctermfg=196 ctermbg=31 cterm=bold guifg=#ff0000 guibg=#0087af gui=bold', 'hi Pl7587d7ff1f0087afN ctermfg=117 ctermbg=31 cterm=NONE guifg=#87d7ff guibg=#0087af gui=NONE', 'hi Ple7ffffff1f0087afb ctermfg=231 ctermbg=31 cterm=bold guifg=#ffffff guibg=#0087af gui=bold', 'hi Pl1f0087af18005f87N ctermfg=31 ctermbg=24 cterm=NONE guifg=#0087af guibg=#005f87 gui=NONE', 'hi Ple7ffffff18005f87N ctermfg=231 ctermbg=24 cterm=NONE guifg=#ffffff guibg=#005f87 gui=NONE', 'hi Pl7587d7ff18005f87N ctermfg=117 ctermbg=24 cterm=NONE guifg=#87d7ff guibg=#005f87 gui=NONE', 'hi Pl18005f8718005f87N ctermfg=24 ctermbg=24 cterm=NONE guifg=#005f87 guibg=#005f87 gui=NONE', 'hi Pl17005f5f7587d7ffb ctermfg=23 ctermbg=117 cterm=bold guifg=#005f5f guibg=#87d7ff gui=bold', 'hi Pl17005f5f7587d7ffN ctermfg=23 ctermbg=117 cterm=NONE guifg=#005f5f guibg=#87d7ff gui=NONE', 'hi Pla0d7000094afd700N ctermfg=160 ctermbg=148 cterm=NONE guifg=#d70000 guibg=#afd700 gui=NONE', 'hi Pl16005f0094afd700b ctermfg=22 ctermbg=148 cterm=bold guifg=#005f00 guibg=#afd700 gui=bold', 'hi Pl94afd700f0585858N ctermfg=148 ctermbg=240 cterm=NONE guifg=#afd700 guibg=#585858 gui=NONE', 'hi Ple7ffffff7caf0000b ctermfg=231 ctermbg=124 cterm=bold guifg=#ffffff guibg=#af0000 gui=bold', 'hi Pl7caf000058870000N ctermfg=124 ctermbg=88 cterm=NONE guifg=#af0000 guibg=#870000 gui=NONE', 'hi Ple7ffffff58870000N ctermfg=231 ctermbg=88 cterm=NONE guifg=#ffffff guibg=#870000 gui=NONE', 'hi Pl5887000058870000N ctermfg=88 ctermbg=88 cterm=NONE guifg=#870000 guibg=#870000 gui=NONE', 'hi Pla0d70000345f0000b ctermfg=160 ctermbg=52 cterm=bold guifg=#d70000 guibg=#5f0000 gui=bold', 'hi Pl345f0000345f0000N ctermfg=52 ctermbg=52 cterm=NONE guifg=#5f0000 guibg=#5f0000 gui=NONE', 'hi Ple7ffffff345f0000N ctermfg=231 ctermbg=52 cterm=NONE guifg=#ffffff guibg=#5f0000 gui=NONE', 'hi Pla0d70000345f0000N ctermfg=160 ctermbg=52 cterm=NONE guifg=#d70000 guibg=#5f0000 gui=NONE', 'hi Ple7fffffff0585858N ctermfg=231 ctermbg=240 cterm=NONE guifg=#ffffff guibg=#585858 gui=NONE', 'hi Plf58a8a8aeb262626N ctermfg=245 ctermbg=235 cterm=NONE guifg=#8a8a8a guibg=#262626 gui=NONE', 'hi Ple7ffffff465faf00b ctermfg=231 ctermbg=70 cterm=bold guifg=#ffffff guibg=#5faf00 gui=bold', 'hi Pl465faf001c008700N ctermfg=70 ctermbg=28 cterm=NONE guifg=#5faf00 guibg=#008700 gui=NONE', 'hi Pl94afd7001c008700N ctermfg=148 ctermbg=28 cterm=NONE guifg=#afd700 guibg=#008700 gui=NONE', 'hi Pl1c0087001c008700N ctermfg=28 ctermbg=28 cterm=NONE guifg=#008700 guibg=#008700 gui=NONE', 'hi Ple7ffffff1c008700N ctermfg=231 ctermbg=28 cterm=NONE guifg=#ffffff guibg=#008700 gui=NONE', 'hi Pl465faf0016005f00b ctermfg=70 ctermbg=22 cterm=bold guifg=#5faf00 guibg=#005f00 gui=bold', 'hi Pl465faf0016005f00N ctermfg=70 ctermbg=22 cterm=NONE guifg=#5faf00 guibg=#005f00 gui=NONE', 'hi Pl16005f0016005f00N ctermfg=22 ctermbg=22 cterm=NONE guifg=#005f00 guibg=#005f00 gui=NONE', 'hi Ple7ffffff16005f00N ctermfg=231 ctermbg=22 cterm=NONE guifg=#ffffff guibg=#005f00 gui=NONE', 'hi Ple7ffffff62875fd7N ctermfg=231 ctermbg=98 cterm=NONE guifg=#ffffff guibg=#875fd7 gui=NONE', 'hi Pl62875fd7e7ffffffN ctermfg=98 ctermbg=231 cterm=NONE guifg=#875fd7 guibg=#ffffff gui=NONE', 'hi Pl375f00afe7ffffffb ctermfg=55 ctermbg=231 cterm=bold guifg=#5f00af guibg=#ffffff gui=bold', 'hi Pl62875fd7375f00afN ctermfg=98 ctermbg=55 cterm=NONE guifg=#875fd7 guibg=#5f00af gui=NONE', 'hi Plc4ff0000375f00afb ctermfg=196 ctermbg=55 cterm=bold guifg=#ff0000 guibg=#5f00af gui=bold', 'hi Pl375f00af375f00afN ctermfg=55 ctermbg=55 cterm=NONE guifg=#5f00af guibg=#5f00af gui=NONE', 'hi Ple7ffffff375f00afN ctermfg=231 ctermbg=55 cterm=NONE guifg=#ffffff guibg=#5f00af gui=NONE', 'hi Plbdd7d7ff375f00afN ctermfg=189 ctermbg=55 cterm=NONE guifg=#d7d7ff guibg=#5f00af gui=NONE', 'hi Pl375f00afe7ffffffN ctermfg=55 ctermbg=231 cterm=NONE guifg=#5f00af guibg=#ffffff gui=NONE'] -let g:Pl#THEME = [{'mode_statuslines': {'r': '%(%(%#Ple7ffffffa0d70000b# %{&paste ? "PASTE" : ""} %)%#Ple7ffffffa0d70000b#│%)%(%(%#Ple7ffffffa0d70000b# %{Powerline#Functions#GetMode()} %)%#Pla0d70000f0585858N#%)%( %(%#Plc4ff0000f0585858b#%{&readonly ? "RO" : ""} %)%(%#Plfcd0d0d0f0585858N#%{Powerline#Functions#GetFilepath()}%)%(%#Ple7fffffff0585858b#%t %)%(%#Plc4ff0000f0585858b#%M %)%(%#Plc4ff0000f0585858b#%H%W %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plec303030ec303030N#%(%#Plf79e9e9eec303030N# %{&fileformat} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{(&fenc == "" ? &enc : &fenc)} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{strlen(&ft) ? &ft : "no ft"} %)%)%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)%(%#Plfcd0d0d0f0585858N#%(%#Plec303030fcd0d0d0b# LN %3l%)%(%#Plf4808080fcd0d0d0N#:%-2v%) %)', 's': '%(%(%#Ple7ffffffa0d70000b# %{&paste ? "PASTE" : ""} %)%#Pla0d70000f1626262N#%)%(%(%#Ple7fffffff1626262b# %{Powerline#Functions#GetMode()} %)%#Plf1626262f0585858N#%)%( %(%#Plc4ff0000f0585858b#%{&readonly ? "RO" : ""} %)%(%#Plfcd0d0d0f0585858N#%{Powerline#Functions#GetFilepath()}%)%(%#Ple7fffffff0585858b#%t %)%(%#Plc4ff0000f0585858b#%M %)%(%#Plc4ff0000f0585858b#%H%W %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plec303030ec303030N#%(%#Plf79e9e9eec303030N# %{&fileformat} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{(&fenc == "" ? &enc : &fenc)} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{strlen(&ft) ? &ft : "no ft"} %)%)%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)%(%#Plfcd0d0d0f0585858N#%(%#Plec303030fcd0d0d0b# LN %3l%)%(%#Plf4808080fcd0d0d0N#:%-2v%) %)', 'N': '%( %(%#Pl58870000e9121212N#%{&readonly ? "RO" : ""} %)%(%#Plf1626262e9121212N#%{Powerline#Functions#GetFilepath()}%)%(%#Plf58a8a8ae9121212b#%t %)%(%#Pl58870000e9121212N#%M %)%(%#Pl58870000e9121212N#%H%W %)%#Ple9121212e9121212N#%)%<%#Ple7ffffffe9121212N#%=%(%#Pleb262626e9121212N#%(%#Plf0585858eb262626N# %3p%% %)%)%(%#Plf58a8a8aeb262626b#│%(%#Plf58a8a8aeb262626b# LN %3l%)%(%#Plf1626262eb262626N#:%-2v%) %)', 'v': '%(%(%#Ple7ffffffa0d70000b# %{&paste ? "PASTE" : ""} %)%#Pla0d70000d0ff8700N#%)%(%(%#Pl58870000d0ff8700b# %{Powerline#Functions#GetMode()} %)%#Pld0ff8700f0585858N#%)%( %(%#Plc4ff0000f0585858b#%{&readonly ? "RO" : ""} %)%(%#Plfcd0d0d0f0585858N#%{Powerline#Functions#GetFilepath()}%)%(%#Ple7fffffff0585858b#%t %)%(%#Plc4ff0000f0585858b#%M %)%(%#Plc4ff0000f0585858b#%H%W %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plec303030ec303030N#%(%#Plf79e9e9eec303030N# %{&fileformat} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{(&fenc == "" ? &enc : &fenc)} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{strlen(&ft) ? &ft : "no ft"} %)%)%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)%(%#Plfcd0d0d0f0585858N#%(%#Plec303030fcd0d0d0b# LN %3l%)%(%#Plf4808080fcd0d0d0N#:%-2v%) %)', 'i': '%(%(%#Ple7ffffffa0d70000b# %{&paste ? "PASTE" : ""} %)%#Pla0d70000e7ffffffN#%)%(%(%#Pl17005f5fe7ffffffb# %{Powerline#Functions#GetMode()} %)%#Ple7ffffff1f0087afN#%)%( %(%#Plc4ff00001f0087afb#%{&readonly ? "RO" : ""} %)%(%#Pl7587d7ff1f0087afN#%{Powerline#Functions#GetFilepath()}%)%(%#Ple7ffffff1f0087afb#%t %)%(%#Plc4ff00001f0087afb#%M %)%(%#Plc4ff00001f0087afb#%H%W %)%#Pl1f0087af18005f87N#%)%<%#Ple7ffffff18005f87N#%=%(%#Pl18005f8718005f87N#%(%#Pl7587d7ff18005f87N# %{&fileformat} %)%)%(%#Pl7587d7ff18005f87N#│%(%#Pl7587d7ff18005f87N# %{(&fenc == "" ? &enc : &fenc)} %)%)%(%#Pl7587d7ff18005f87N#│%(%#Pl7587d7ff18005f87N# %{strlen(&ft) ? &ft : "no ft"} %)%)%(%#Pl1f0087af18005f87N#%(%#Pl7587d7ff1f0087afN# %3p%% %)%)%(%#Pl7587d7ff1f0087afN#%(%#Pl17005f5f7587d7ffb# LN %3l%)%(%#Pl17005f5f7587d7ffN#:%-2v%) %)', 'n': '%(%(%#Ple7ffffffa0d70000b# %{&paste ? "PASTE" : ""} %)%#Pla0d7000094afd700N#%)%(%(%#Pl16005f0094afd700b# %{Powerline#Functions#GetMode()} %)%#Pl94afd700f0585858N#%)%( %(%#Plc4ff0000f0585858b#%{&readonly ? "RO" : ""} %)%(%#Plfcd0d0d0f0585858N#%{Powerline#Functions#GetFilepath()}%)%(%#Ple7fffffff0585858b#%t %)%(%#Plc4ff0000f0585858b#%M %)%(%#Plc4ff0000f0585858b#%H%W %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plec303030ec303030N#%(%#Plf79e9e9eec303030N# %{&fileformat} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{(&fenc == "" ? &enc : &fenc)} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{strlen(&ft) ? &ft : "no ft"} %)%)%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)%(%#Plfcd0d0d0f0585858N#%(%#Plec303030fcd0d0d0b# LN %3l%)%(%#Plf4808080fcd0d0d0N#:%-2v%) %)'}, 'matches': ['match', 'any', []]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff7caf0000b# %{"Command-T"} %)%#Pl7caf000058870000N#%)%<%#Ple7ffffff58870000N#%=%(%#Pl5887000058870000N#%(%#Ple7ffffff58870000N# %10(Match #%l%) %)%)', 's': '%(%(%#Ple7ffffff7caf0000b# %{"Command-T"} %)%#Pl7caf000058870000N#%)%<%#Ple7ffffff58870000N#%=%(%#Pl5887000058870000N#%(%#Ple7ffffff58870000N# %10(Match #%l%) %)%)', 'N': '%(%(%#Pla0d70000345f0000b# %{"Command-T"} %)%#Pl345f0000345f0000N#%)%<%#Ple7ffffff345f0000N#%=%(%#Pl345f0000345f0000N#%(%#Pla0d70000345f0000N# %10(Match #%l%) %)%)', 'v': '%(%(%#Ple7ffffff7caf0000b# %{"Command-T"} %)%#Pl7caf000058870000N#%)%<%#Ple7ffffff58870000N#%=%(%#Pl5887000058870000N#%(%#Ple7ffffff58870000N# %10(Match #%l%) %)%)', 'i': '%(%(%#Ple7ffffff7caf0000b# %{"Command-T"} %)%#Pl7caf000058870000N#%)%<%#Ple7ffffff58870000N#%=%(%#Pl5887000058870000N#%(%#Ple7ffffff58870000N# %10(Match #%l%) %)%)', 'n': '%(%(%#Ple7ffffff7caf0000b# %{"Command-T"} %)%#Pl7caf000058870000N#%)%<%#Ple7ffffff58870000N#%=%(%#Pl5887000058870000N#%(%#Ple7ffffff58870000N# %10(Match #%l%) %)%)'}, 'matches': ['match', 'any', [['bufname("%")', 'GoToFile']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Undo tree"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 's': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Undo tree"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'N': '%(%(%#Pla0d70000345f0000b# %{"Gundo"} %)%#Pla0d70000345f0000b#│%)%(%(%#Pla0d70000345f0000N# %{"Undo tree"} %)%#Pl345f0000345f0000N#%)%<%#Ple7ffffff345f0000N#%=', 'v': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Undo tree"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'i': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Undo tree"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'n': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Undo tree"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%='}, 'matches': ['match', 'any', [['bufname("%")', '__Gundo__']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Diff preview"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 's': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Diff preview"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'N': '%(%(%#Pla0d70000345f0000b# %{"Gundo"} %)%#Pla0d70000345f0000b#│%)%(%(%#Pla0d70000345f0000N# %{"Diff preview"} %)%#Pl345f0000345f0000N#%)%<%#Ple7ffffff345f0000N#%=', 'v': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Diff preview"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'i': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Diff preview"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'n': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Diff preview"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%='}, 'matches': ['match', 'any', [['bufname("%")', '__Gundo_Preview__']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7fffffff0585858N# %{"Help"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 's': '%(%(%#Ple7fffffff0585858N# %{"Help"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'N': '%(%(%#Plf58a8a8aeb262626N# %{"Help"} %)%#Pleb262626e9121212N#%)%(%(%#Plf58a8a8ae9121212b# %t %)%#Ple9121212e9121212N#%)%<%#Ple7ffffffe9121212N#%=%(%#Pleb262626e9121212N#%(%#Plf0585858eb262626N# %3p%% %)%)', 'v': '%(%(%#Ple7fffffff0585858N# %{"Help"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'i': '%(%(%#Ple7ffffff1f0087afN# %{"Help"} %)%#Ple7ffffff1f0087afN#│%)%(%(%#Ple7ffffff1f0087afb# %t %)%#Pl1f0087af18005f87N#%)%<%#Ple7ffffff18005f87N#%=%(%#Pl1f0087af18005f87N#%(%#Pl7587d7ff1f0087afN# %3p%% %)%)', 'n': '%(%(%#Ple7fffffff0585858N# %{"Help"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)'}, 'matches': ['match', 'any', [['&bt', 'help']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7fffffff0585858N# %{"Pager"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 's': '%(%(%#Ple7fffffff0585858N# %{"Pager"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'N': '%(%(%#Plf58a8a8aeb262626N# %{"Pager"} %)%#Pleb262626e9121212N#%)%(%(%#Plf58a8a8ae9121212b# %t %)%#Ple9121212e9121212N#%)%<%#Ple7ffffffe9121212N#%=%(%#Pleb262626e9121212N#%(%#Plf0585858eb262626N# %3p%% %)%)', 'v': '%(%(%#Ple7fffffff0585858N# %{"Pager"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'i': '%(%(%#Ple7ffffff1f0087afN# %{"Pager"} %)%#Ple7ffffff1f0087afN#│%)%(%(%#Ple7ffffff1f0087afb# %t %)%#Pl1f0087af18005f87N#%)%<%#Ple7ffffff18005f87N#%=%(%#Pl1f0087af18005f87N#%(%#Pl7587d7ff1f0087afN# %3p%% %)%)', 'n': '%(%(%#Ple7fffffff0585858N# %{"Pager"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)'}, 'matches': ['match', 'any', [['&ft', 'vimpager']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff465faf00b# %{"LustyExplorer"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Buffer list"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 's': '%(%(%#Ple7ffffff465faf00b# %{"LustyExplorer"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Buffer list"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'N': '%(%(%#Pl465faf0016005f00b# %{"LustyExplorer"} %)%#Pl465faf0016005f00b#│%)%(%(%#Pl465faf0016005f00N# %{"Buffer list"} %)%#Pl16005f0016005f00N#%)%<%#Ple7ffffff16005f00N#%=', 'v': '%(%(%#Ple7ffffff465faf00b# %{"LustyExplorer"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Buffer list"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'i': '%(%(%#Ple7ffffff465faf00b# %{"LustyExplorer"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Buffer list"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'n': '%(%(%#Ple7ffffff465faf00b# %{"LustyExplorer"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Buffer list"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%='}, 'matches': ['match', 'any', [['bufname("%")', '\[LustyExplorer-Buffers\]']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7fffffff0585858N# %{"Man page"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %{Powerline#Functions#ft_man#GetName()} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 's': '%(%(%#Ple7fffffff0585858N# %{"Man page"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %{Powerline#Functions#ft_man#GetName()} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'N': '%(%(%#Plf58a8a8aeb262626N# %{"Man page"} %)%#Pleb262626e9121212N#%)%(%(%#Plf58a8a8ae9121212b# %{Powerline#Functions#ft_man#GetName()} %)%#Ple9121212e9121212N#%)%<%#Ple7ffffffe9121212N#%=%(%#Pleb262626e9121212N#%(%#Plf0585858eb262626N# %3p%% %)%)', 'v': '%(%(%#Ple7fffffff0585858N# %{"Man page"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %{Powerline#Functions#ft_man#GetName()} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'i': '%(%(%#Ple7ffffff1f0087afN# %{"Man page"} %)%#Ple7ffffff1f0087afN#│%)%(%(%#Ple7ffffff1f0087afb# %{Powerline#Functions#ft_man#GetName()} %)%#Pl1f0087af18005f87N#%)%<%#Ple7ffffff18005f87N#%=%(%#Pl1f0087af18005f87N#%(%#Pl7587d7ff1f0087afN# %3p%% %)%)', 'n': '%(%(%#Ple7fffffff0585858N# %{"Man page"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %{Powerline#Functions#ft_man#GetName()} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)'}, 'matches': ['match', 'any', [['&ft', 'man']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff465faf00b# %{"MiniBufExplorer"} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 's': '%(%(%#Ple7ffffff465faf00b# %{"MiniBufExplorer"} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'N': '%(%(%#Pl465faf0016005f00b# %{"MiniBufExplorer"} %)%#Pl16005f0016005f00N#%)%<%#Ple7ffffff16005f00N#%=', 'v': '%(%(%#Ple7ffffff465faf00b# %{"MiniBufExplorer"} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'i': '%(%(%#Ple7ffffff465faf00b# %{"MiniBufExplorer"} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'n': '%(%(%#Ple7ffffff465faf00b# %{"MiniBufExplorer"} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%='}, 'matches': ['match', 'any', [['bufname("%")', '\-MiniBufExplorer\-']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7fffffff0585858N# %{"Quickfix"} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=', 's': '%(%(%#Ple7fffffff0585858N# %{"Quickfix"} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=', 'N': '%(%(%#Plf58a8a8aeb262626N# %{"Quickfix"} %)%#Pleb262626e9121212N#%)%<%#Ple7ffffffe9121212N#%=', 'v': '%(%(%#Ple7fffffff0585858N# %{"Quickfix"} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=', 'i': '%(%(%#Ple7ffffff1f0087afN# %{"Quickfix"} %)%#Pl1f0087af18005f87N#%)%<%#Ple7ffffff18005f87N#%=', 'n': '%(%(%#Ple7fffffff0585858N# %{"Quickfix"} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%='}, 'matches': ['match', 'any', [['&ft', 'qf']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff465faf00b# %{"Tagbar"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Tree"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 's': '%(%(%#Ple7ffffff465faf00b# %{"Tagbar"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Tree"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'N': '%(%(%#Pl465faf0016005f00b# %{"Tagbar"} %)%#Pl465faf0016005f00b#│%)%(%(%#Pl465faf0016005f00N# %{"Tree"} %)%#Pl16005f0016005f00N#%)%<%#Ple7ffffff16005f00N#%=', 'v': '%(%(%#Ple7ffffff465faf00b# %{"Tagbar"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Tree"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'i': '%(%(%#Ple7ffffff465faf00b# %{"Tagbar"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Tree"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'n': '%(%(%#Ple7ffffff465faf00b# %{"Tagbar"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Tree"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%='}, 'matches': ['match', 'any', [['&ft', 'tagbar']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff465faf00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 's': '%(%(%#Ple7ffffff465faf00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'N': '%(%(%#Pl465faf0016005f00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl16005f0016005f00N#%)%<%#Ple7ffffff16005f00N#%=', 'v': '%(%(%#Ple7ffffff465faf00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'i': '%(%(%#Ple7ffffff465faf00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'n': '%(%(%#Ple7ffffff465faf00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%='}, 'matches': ['match', 'any', [['&ft', 'nerdtree']]]}] -let g:Pl#THEME_CALLBACKS = [['function! PowerlineStatuslineCallback_ctrlp_main(...){{NEWLINE}}return Pl#StatuslineCallback(''%(%(%#Ple7ffffff62875fd7N# %-3{"%3"} %)%#Pl62875fd7e7ffffffN#%)%(%(%#Pl375f00afe7ffffffb# %-9{"%4"} %)%#Ple7ffffff62875fd7N#%)%(%(%#Ple7ffffff62875fd7N# %-3{"%5"} %)%#Pl62875fd7375f00afN#%)%(%(%#Plc4ff0000375f00afb# %{"%6" == " <+>" ? "" : strpart("%6", 2, len("%6") - 3)} %)%#Pl375f00af375f00afN#%)%<%#Ple7ffffff375f00afN#%=%(%#Pl375f00af375f00afN#%(%#Plbdd7d7ff375f00afN# %{"%0"} %)%)%(%#Plbdd7d7ff375f00afN#│%(%#Plbdd7d7ff375f00afN# %{"%1"} %)%)%(%#Pl62875fd7375f00afN#%(%#Ple7ffffff62875fd7N# %{substitute(getcwd(), expand("$HOME"), "~", "g")} %)%)'', a:000){{NEWLINE}}endfunction', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.main = "PowerlineStatuslineCallback_ctrlp_main"'], ['function! PowerlineStatuslineCallback_ctrlp_prog(...){{NEWLINE}}return Pl#StatuslineCallback(''%(%(%#Pl375f00afe7ffffffN# %-6{"%0"} %)%#Ple7ffffff375f00afN#%)%<%#Ple7ffffff375f00afN#%=%(%#Pl62875fd7375f00afN#%(%#Ple7ffffff62875fd7N# %{substitute(getcwd(), expand("$HOME"), "~", "g")} %)%)'', a:000){{NEWLINE}}endfunction', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.prog = "PowerlineStatuslineCallback_ctrlp_prog"']] +let g:Pl#HL = ['hi Ple7ffffffa0d70000b ctermfg=231 ctermbg=160 cterm=bold guifg=#ffffff guibg=#d70000 gui=bold', 'hi Pla0d70000f0585858N ctermfg=160 ctermbg=240 cterm=NONE guifg=#d70000 guibg=#585858 gui=NONE', 'hi Plc4ff0000f0585858b ctermfg=196 ctermbg=240 cterm=bold guifg=#ff0000 guibg=#585858 gui=bold', 'hi Plfcd0d0d0f0585858N ctermfg=252 ctermbg=240 cterm=NONE guifg=#d0d0d0 guibg=#585858 gui=NONE', 'hi Ple7fffffff0585858b ctermfg=231 ctermbg=240 cterm=bold guifg=#ffffff guibg=#585858 gui=bold', 'hi Plf0585858ec303030N ctermfg=240 ctermbg=236 cterm=NONE guifg=#585858 guibg=#303030 gui=NONE', 'hi Ple7ffffffec303030N ctermfg=231 ctermbg=236 cterm=NONE guifg=#ffffff guibg=#303030 gui=NONE', 'hi Plf79e9e9eec303030N ctermfg=247 ctermbg=236 cterm=NONE guifg=#9e9e9e guibg=#303030 gui=NONE', 'hi Plec303030ec303030N ctermfg=236 ctermbg=236 cterm=NONE guifg=#303030 guibg=#303030 gui=NONE', 'hi Plfabcbcbcf0585858N ctermfg=250 ctermbg=240 cterm=NONE guifg=#bcbcbc guibg=#585858 gui=NONE', 'hi Plec303030fcd0d0d0b ctermfg=236 ctermbg=252 cterm=bold guifg=#303030 guibg=#d0d0d0 gui=bold', 'hi Plf4808080fcd0d0d0N ctermfg=244 ctermbg=252 cterm=NONE guifg=#808080 guibg=#d0d0d0 gui=NONE', 'hi Pla0d70000f1626262N ctermfg=160 ctermbg=241 cterm=NONE guifg=#d70000 guibg=#626262 gui=NONE', 'hi Ple7fffffff1626262b ctermfg=231 ctermbg=241 cterm=bold guifg=#ffffff guibg=#626262 gui=bold', 'hi Plf1626262f0585858N ctermfg=241 ctermbg=240 cterm=NONE guifg=#626262 guibg=#585858 gui=NONE', 'hi Pl58870000e9121212N ctermfg=88 ctermbg=233 cterm=NONE guifg=#870000 guibg=#121212 gui=NONE', 'hi Plf1626262e9121212N ctermfg=241 ctermbg=233 cterm=NONE guifg=#626262 guibg=#121212 gui=NONE', 'hi Plf58a8a8ae9121212b ctermfg=245 ctermbg=233 cterm=bold guifg=#8a8a8a guibg=#121212 gui=bold', 'hi Ple9121212e9121212N ctermfg=233 ctermbg=233 cterm=NONE guifg=#121212 guibg=#121212 gui=NONE', 'hi Ple7ffffffe9121212N ctermfg=231 ctermbg=233 cterm=NONE guifg=#ffffff guibg=#121212 gui=NONE', 'hi Plf0585858eb262626N ctermfg=240 ctermbg=235 cterm=NONE guifg=#585858 guibg=#262626 gui=NONE', 'hi Pleb262626e9121212N ctermfg=235 ctermbg=233 cterm=NONE guifg=#262626 guibg=#121212 gui=NONE', 'hi Plf58a8a8aeb262626b ctermfg=245 ctermbg=235 cterm=bold guifg=#8a8a8a guibg=#262626 gui=bold', 'hi Plf1626262eb262626N ctermfg=241 ctermbg=235 cterm=NONE guifg=#626262 guibg=#262626 gui=NONE', 'hi Pla0d70000d0ff8700N ctermfg=160 ctermbg=208 cterm=NONE guifg=#d70000 guibg=#ff8700 gui=NONE', 'hi Pl58870000d0ff8700b ctermfg=88 ctermbg=208 cterm=bold guifg=#870000 guibg=#ff8700 gui=bold', 'hi Pld0ff8700f0585858N ctermfg=208 ctermbg=240 cterm=NONE guifg=#ff8700 guibg=#585858 gui=NONE', 'hi Pla0d70000e7ffffffN ctermfg=160 ctermbg=231 cterm=NONE guifg=#d70000 guibg=#ffffff gui=NONE', 'hi Pl17005f5fe7ffffffb ctermfg=23 ctermbg=231 cterm=bold guifg=#005f5f guibg=#ffffff gui=bold', 'hi Ple7ffffff1f0087afN ctermfg=231 ctermbg=31 cterm=NONE guifg=#ffffff guibg=#0087af gui=NONE', 'hi Plc4ff00001f0087afb ctermfg=196 ctermbg=31 cterm=bold guifg=#ff0000 guibg=#0087af gui=bold', 'hi Pl7587d7ff1f0087afN ctermfg=117 ctermbg=31 cterm=NONE guifg=#87d7ff guibg=#0087af gui=NONE', 'hi Ple7ffffff1f0087afb ctermfg=231 ctermbg=31 cterm=bold guifg=#ffffff guibg=#0087af gui=bold', 'hi Pl1f0087af18005f87N ctermfg=31 ctermbg=24 cterm=NONE guifg=#0087af guibg=#005f87 gui=NONE', 'hi Ple7ffffff18005f87N ctermfg=231 ctermbg=24 cterm=NONE guifg=#ffffff guibg=#005f87 gui=NONE', 'hi Pl7587d7ff18005f87N ctermfg=117 ctermbg=24 cterm=NONE guifg=#87d7ff guibg=#005f87 gui=NONE', 'hi Pl18005f8718005f87N ctermfg=24 ctermbg=24 cterm=NONE guifg=#005f87 guibg=#005f87 gui=NONE', 'hi Pl17005f5f7587d7ffb ctermfg=23 ctermbg=117 cterm=bold guifg=#005f5f guibg=#87d7ff gui=bold', 'hi Pl17005f5f7587d7ffN ctermfg=23 ctermbg=117 cterm=NONE guifg=#005f5f guibg=#87d7ff gui=NONE', 'hi Pla0d7000094afd700N ctermfg=160 ctermbg=148 cterm=NONE guifg=#d70000 guibg=#afd700 gui=NONE', 'hi Pl16005f0094afd700b ctermfg=22 ctermbg=148 cterm=bold guifg=#005f00 guibg=#afd700 gui=bold', 'hi Pl94afd700f0585858N ctermfg=148 ctermbg=240 cterm=NONE guifg=#afd700 guibg=#585858 gui=NONE', 'hi Ple7ffffff7caf0000b ctermfg=231 ctermbg=124 cterm=bold guifg=#ffffff guibg=#af0000 gui=bold', 'hi Pl7caf000058870000N ctermfg=124 ctermbg=88 cterm=NONE guifg=#af0000 guibg=#870000 gui=NONE', 'hi Ple7ffffff58870000N ctermfg=231 ctermbg=88 cterm=NONE guifg=#ffffff guibg=#870000 gui=NONE', 'hi Pl5887000058870000N ctermfg=88 ctermbg=88 cterm=NONE guifg=#870000 guibg=#870000 gui=NONE', 'hi Pla0d70000345f0000b ctermfg=160 ctermbg=52 cterm=bold guifg=#d70000 guibg=#5f0000 gui=bold', 'hi Pl345f0000345f0000N ctermfg=52 ctermbg=52 cterm=NONE guifg=#5f0000 guibg=#5f0000 gui=NONE', 'hi Ple7ffffff345f0000N ctermfg=231 ctermbg=52 cterm=NONE guifg=#ffffff guibg=#5f0000 gui=NONE', 'hi Pla0d70000345f0000N ctermfg=160 ctermbg=52 cterm=NONE guifg=#d70000 guibg=#5f0000 gui=NONE', 'hi Ple7fffffff0585858N ctermfg=231 ctermbg=240 cterm=NONE guifg=#ffffff guibg=#585858 gui=NONE', 'hi Plf58a8a8aeb262626N ctermfg=245 ctermbg=235 cterm=NONE guifg=#8a8a8a guibg=#262626 gui=NONE', 'hi Ple7ffffff465faf00b ctermfg=231 ctermbg=70 cterm=bold guifg=#ffffff guibg=#5faf00 gui=bold', 'hi Pl465faf001c008700N ctermfg=70 ctermbg=28 cterm=NONE guifg=#5faf00 guibg=#008700 gui=NONE', 'hi Pl94afd7001c008700N ctermfg=148 ctermbg=28 cterm=NONE guifg=#afd700 guibg=#008700 gui=NONE', 'hi Pl1c0087001c008700N ctermfg=28 ctermbg=28 cterm=NONE guifg=#008700 guibg=#008700 gui=NONE', 'hi Ple7ffffff1c008700N ctermfg=231 ctermbg=28 cterm=NONE guifg=#ffffff guibg=#008700 gui=NONE', 'hi Pl465faf0016005f00b ctermfg=70 ctermbg=22 cterm=bold guifg=#5faf00 guibg=#005f00 gui=bold', 'hi Pl465faf0016005f00N ctermfg=70 ctermbg=22 cterm=NONE guifg=#5faf00 guibg=#005f00 gui=NONE', 'hi Pl16005f0016005f00N ctermfg=22 ctermbg=22 cterm=NONE guifg=#005f00 guibg=#005f00 gui=NONE', 'hi Ple7ffffff16005f00N ctermfg=231 ctermbg=22 cterm=NONE guifg=#ffffff guibg=#005f00 gui=NONE', 'hi Ple7ffffff62875fd7N ctermfg=231 ctermbg=98 cterm=NONE guifg=#ffffff guibg=#875fd7 gui=NONE', 'hi Pl62875fd7e7ffffffN ctermfg=98 ctermbg=231 cterm=NONE guifg=#875fd7 guibg=#ffffff gui=NONE', 'hi Pl375f00afe7ffffffb ctermfg=55 ctermbg=231 cterm=bold guifg=#5f00af guibg=#ffffff gui=bold', 'hi Pl62875fd7375f00afN ctermfg=98 ctermbg=55 cterm=NONE guifg=#875fd7 guibg=#5f00af gui=NONE', 'hi Plc4ff0000375f00afb ctermfg=196 ctermbg=55 cterm=bold guifg=#ff0000 guibg=#5f00af gui=bold', 'hi Pl375f00af375f00afN ctermfg=55 ctermbg=55 cterm=NONE guifg=#5f00af guibg=#5f00af gui=NONE', 'hi Ple7ffffff375f00afN ctermfg=231 ctermbg=55 cterm=NONE guifg=#ffffff guibg=#5f00af gui=NONE', 'hi Plbdd7d7ff375f00afN ctermfg=189 ctermbg=55 cterm=NONE guifg=#d7d7ff guibg=#5f00af gui=NONE', 'hi Pl375f00afe7ffffffN ctermfg=55 ctermbg=231 cterm=NONE guifg=#5f00af guibg=#ffffff gui=NONE', 'hi Pla0d7000000000000N ctermfg=160 ctermbg=0 cterm=NONE guifg=#d70000 guibg=#000000 gui=NONE', 'hi Ple7ffffff00000000b ctermfg=231 ctermbg=0 cterm=bold guifg=#ffffff guibg=#000000 gui=bold', 'hi Pl00000000f0585858N ctermfg=0 ctermbg=240 cterm=NONE guifg=#000000 guibg=#585858 gui=NONE', 'hi Pla0d70000e9121212N ctermfg=160 ctermbg=233 cterm=NONE guifg=#d70000 guibg=#121212 gui=NONE', 'hi Plfcd0d0d0e9121212b ctermfg=252 ctermbg=233 cterm=bold guifg=#d0d0d0 guibg=#121212 gui=bold', 'hi Ple9121212f0585858N ctermfg=233 ctermbg=240 cterm=NONE guifg=#121212 guibg=#585858 gui=NONE', 'hi Pla0d7000018005f87N ctermfg=160 ctermbg=24 cterm=NONE guifg=#d70000 guibg=#005f87 gui=NONE', 'hi Ple7ffffff18005f87b ctermfg=231 ctermbg=24 cterm=bold guifg=#ffffff guibg=#005f87 gui=bold', 'hi Pl18005f87f0585858N ctermfg=24 ctermbg=240 cterm=NONE guifg=#005f87 guibg=#585858 gui=NONE'] +let g:Pl#THEME = [{'mode_statuslines': {'r': '%(%(%#Ple7ffffffa0d70000b# %{&paste ? "PASTE" : ""} %)%#Ple7ffffffa0d70000b#│%)%(%(%#Ple7ffffffa0d70000b# %{Powerline#Functions#GetMode()} %)%#Pla0d70000f0585858N#%)%( %(%#Plc4ff0000f0585858b#%{&readonly ? "RO" : ""} %)%(%#Plfcd0d0d0f0585858N#%{Powerline#Functions#GetFilepath()}%)%(%#Ple7fffffff0585858b#%t %)%(%#Plc4ff0000f0585858b#%M %)%(%#Plc4ff0000f0585858b#%H%W %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plec303030ec303030N#%(%#Plf79e9e9eec303030N# %{&fileformat} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{(&fenc == "" ? &enc : &fenc)} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{strlen(&ft) ? &ft : "no ft"} %)%)%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)%(%#Plfcd0d0d0f0585858N#%(%#Plec303030fcd0d0d0b# LN %3l%)%(%#Plf4808080fcd0d0d0N#:%-2v%) %)', 's': '%(%(%#Ple7ffffffa0d70000b# %{&paste ? "PASTE" : ""} %)%#Pla0d70000f1626262N#%)%(%(%#Ple7fffffff1626262b# %{Powerline#Functions#GetMode()} %)%#Plf1626262f0585858N#%)%( %(%#Plc4ff0000f0585858b#%{&readonly ? "RO" : ""} %)%(%#Plfcd0d0d0f0585858N#%{Powerline#Functions#GetFilepath()}%)%(%#Ple7fffffff0585858b#%t %)%(%#Plc4ff0000f0585858b#%M %)%(%#Plc4ff0000f0585858b#%H%W %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plec303030ec303030N#%(%#Plf79e9e9eec303030N# %{&fileformat} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{(&fenc == "" ? &enc : &fenc)} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{strlen(&ft) ? &ft : "no ft"} %)%)%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)%(%#Plfcd0d0d0f0585858N#%(%#Plec303030fcd0d0d0b# LN %3l%)%(%#Plf4808080fcd0d0d0N#:%-2v%) %)', 'N': '%( %(%#Pl58870000e9121212N#%{&readonly ? "RO" : ""} %)%(%#Plf1626262e9121212N#%{Powerline#Functions#GetFilepath()}%)%(%#Plf58a8a8ae9121212b#%t %)%(%#Pl58870000e9121212N#%M %)%(%#Pl58870000e9121212N#%H%W %)%#Ple9121212e9121212N#%)%<%#Ple7ffffffe9121212N#%=%(%#Pleb262626e9121212N#%(%#Plf0585858eb262626N# %3p%% %)%)%(%#Plf58a8a8aeb262626b#│%(%#Plf58a8a8aeb262626b# LN %3l%)%(%#Plf1626262eb262626N#:%-2v%) %)', 'v': '%(%(%#Ple7ffffffa0d70000b# %{&paste ? "PASTE" : ""} %)%#Pla0d7000018005f87N#%)%(%(%#Ple7ffffff18005f87b# %{Powerline#Functions#GetMode()} %)%#Pl18005f87f0585858N#%)%( %(%#Plc4ff0000f0585858b#%{&readonly ? "RO" : ""} %)%(%#Plfcd0d0d0f0585858N#%{Powerline#Functions#GetFilepath()}%)%(%#Ple7fffffff0585858b#%t %)%(%#Plc4ff0000f0585858b#%M %)%(%#Plc4ff0000f0585858b#%H%W %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plec303030ec303030N#%(%#Plf79e9e9eec303030N# %{&fileformat} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{(&fenc == "" ? &enc : &fenc)} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{strlen(&ft) ? &ft : "no ft"} %)%)%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)%(%#Plfcd0d0d0f0585858N#%(%#Plec303030fcd0d0d0b# LN %3l%)%(%#Plf4808080fcd0d0d0N#:%-2v%) %)', 'i': '%(%(%#Ple7ffffffa0d70000b# %{&paste ? "PASTE" : ""} %)%#Pla0d70000e7ffffffN#%)%(%(%#Pl17005f5fe7ffffffb# %{Powerline#Functions#GetMode()} %)%#Ple7ffffff1f0087afN#%)%( %(%#Plc4ff00001f0087afb#%{&readonly ? "RO" : ""} %)%(%#Pl7587d7ff1f0087afN#%{Powerline#Functions#GetFilepath()}%)%(%#Ple7ffffff1f0087afb#%t %)%(%#Plc4ff00001f0087afb#%M %)%(%#Plc4ff00001f0087afb#%H%W %)%#Pl1f0087af18005f87N#%)%<%#Ple7ffffff18005f87N#%=%(%#Pl18005f8718005f87N#%(%#Pl7587d7ff18005f87N# %{&fileformat} %)%)%(%#Pl7587d7ff18005f87N#│%(%#Pl7587d7ff18005f87N# %{(&fenc == "" ? &enc : &fenc)} %)%)%(%#Pl7587d7ff18005f87N#│%(%#Pl7587d7ff18005f87N# %{strlen(&ft) ? &ft : "no ft"} %)%)%(%#Pl1f0087af18005f87N#%(%#Pl7587d7ff1f0087afN# %3p%% %)%)%(%#Pl7587d7ff1f0087afN#%(%#Pl17005f5f7587d7ffb# LN %3l%)%(%#Pl17005f5f7587d7ffN#:%-2v%) %)', 'n': '%(%(%#Ple7ffffffa0d70000b# %{&paste ? "PASTE" : ""} %)%#Pla0d70000e9121212N#%)%(%(%#Plfcd0d0d0e9121212b# %{Powerline#Functions#GetMode()} %)%#Ple9121212f0585858N#%)%( %(%#Plc4ff0000f0585858b#%{&readonly ? "RO" : ""} %)%(%#Plfcd0d0d0f0585858N#%{Powerline#Functions#GetFilepath()}%)%(%#Ple7fffffff0585858b#%t %)%(%#Plc4ff0000f0585858b#%M %)%(%#Plc4ff0000f0585858b#%H%W %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plec303030ec303030N#%(%#Plf79e9e9eec303030N# %{&fileformat} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{(&fenc == "" ? &enc : &fenc)} %)%)%(%#Plf79e9e9eec303030N#│%(%#Plf79e9e9eec303030N# %{strlen(&ft) ? &ft : "no ft"} %)%)%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)%(%#Plfcd0d0d0f0585858N#%(%#Plec303030fcd0d0d0b# LN %3l%)%(%#Plf4808080fcd0d0d0N#:%-2v%) %)'}, 'matches': ['match', 'any', []]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff7caf0000b# %{"Command-T"} %)%#Pl7caf000058870000N#%)%<%#Ple7ffffff58870000N#%=%(%#Pl5887000058870000N#%(%#Ple7ffffff58870000N# %10(Match #%l%) %)%)', 's': '%(%(%#Ple7ffffff7caf0000b# %{"Command-T"} %)%#Pl7caf000058870000N#%)%<%#Ple7ffffff58870000N#%=%(%#Pl5887000058870000N#%(%#Ple7ffffff58870000N# %10(Match #%l%) %)%)', 'N': '%(%(%#Pla0d70000345f0000b# %{"Command-T"} %)%#Pl345f0000345f0000N#%)%<%#Ple7ffffff345f0000N#%=%(%#Pl345f0000345f0000N#%(%#Pla0d70000345f0000N# %10(Match #%l%) %)%)', 'v': '%(%(%#Ple7ffffff7caf0000b# %{"Command-T"} %)%#Pl7caf000058870000N#%)%<%#Ple7ffffff58870000N#%=%(%#Pl5887000058870000N#%(%#Ple7ffffff58870000N# %10(Match #%l%) %)%)', 'i': '%(%(%#Ple7ffffff7caf0000b# %{"Command-T"} %)%#Pl7caf000058870000N#%)%<%#Ple7ffffff58870000N#%=%(%#Pl5887000058870000N#%(%#Ple7ffffff58870000N# %10(Match #%l%) %)%)', 'n': '%(%(%#Ple7ffffff7caf0000b# %{"Command-T"} %)%#Pl7caf000058870000N#%)%<%#Ple7ffffff58870000N#%=%(%#Pl5887000058870000N#%(%#Ple7ffffff58870000N# %10(Match #%l%) %)%)'}, 'matches': ['match', 'any', [['bufname("%")', 'GoToFile']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Undo tree"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 's': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Undo tree"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'N': '%(%(%#Pla0d70000345f0000b# %{"Gundo"} %)%#Pla0d70000345f0000b#│%)%(%(%#Pla0d70000345f0000N# %{"Undo tree"} %)%#Pl345f0000345f0000N#%)%<%#Ple7ffffff345f0000N#%=', 'v': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Undo tree"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'i': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Undo tree"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'n': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Undo tree"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%='}, 'matches': ['match', 'any', [['bufname("%")', '__Gundo__']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Diff preview"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 's': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Diff preview"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'N': '%(%(%#Pla0d70000345f0000b# %{"Gundo"} %)%#Pla0d70000345f0000b#│%)%(%(%#Pla0d70000345f0000N# %{"Diff preview"} %)%#Pl345f0000345f0000N#%)%<%#Ple7ffffff345f0000N#%=', 'v': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Diff preview"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'i': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Diff preview"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%=', 'n': '%(%(%#Ple7ffffff7caf0000b# %{"Gundo"} %)%#Pl7caf000058870000N#%)%(%(%#Ple7ffffff58870000N# %{"Diff preview"} %)%#Pl5887000058870000N#%)%<%#Ple7ffffff58870000N#%='}, 'matches': ['match', 'any', [['bufname("%")', '__Gundo_Preview__']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7fffffff0585858N# %{"Help"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 's': '%(%(%#Ple7fffffff0585858N# %{"Help"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'N': '%(%(%#Plf58a8a8aeb262626N# %{"Help"} %)%#Pleb262626e9121212N#%)%(%(%#Plf58a8a8ae9121212b# %t %)%#Ple9121212e9121212N#%)%<%#Ple7ffffffe9121212N#%=%(%#Pleb262626e9121212N#%(%#Plf0585858eb262626N# %3p%% %)%)', 'v': '%(%(%#Ple7fffffff0585858N# %{"Help"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'i': '%(%(%#Ple7ffffff1f0087afN# %{"Help"} %)%#Ple7ffffff1f0087afN#│%)%(%(%#Ple7ffffff1f0087afb# %t %)%#Pl1f0087af18005f87N#%)%<%#Ple7ffffff18005f87N#%=%(%#Pl1f0087af18005f87N#%(%#Pl7587d7ff1f0087afN# %3p%% %)%)', 'n': '%(%(%#Ple7fffffff0585858N# %{"Help"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)'}, 'matches': ['match', 'any', [['&bt', 'help']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7fffffff0585858N# %{"Pager"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 's': '%(%(%#Ple7fffffff0585858N# %{"Pager"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'N': '%(%(%#Plf58a8a8aeb262626N# %{"Pager"} %)%#Pleb262626e9121212N#%)%(%(%#Plf58a8a8ae9121212b# %t %)%#Ple9121212e9121212N#%)%<%#Ple7ffffffe9121212N#%=%(%#Pleb262626e9121212N#%(%#Plf0585858eb262626N# %3p%% %)%)', 'v': '%(%(%#Ple7fffffff0585858N# %{"Pager"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'i': '%(%(%#Ple7ffffff1f0087afN# %{"Pager"} %)%#Ple7ffffff1f0087afN#│%)%(%(%#Ple7ffffff1f0087afb# %t %)%#Pl1f0087af18005f87N#%)%<%#Ple7ffffff18005f87N#%=%(%#Pl1f0087af18005f87N#%(%#Pl7587d7ff1f0087afN# %3p%% %)%)', 'n': '%(%(%#Ple7fffffff0585858N# %{"Pager"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %t %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)'}, 'matches': ['match', 'any', [['&ft', 'vimpager']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff465faf00b# %{"LustyExplorer"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Buffer list"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 's': '%(%(%#Ple7ffffff465faf00b# %{"LustyExplorer"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Buffer list"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'N': '%(%(%#Pl465faf0016005f00b# %{"LustyExplorer"} %)%#Pl465faf0016005f00b#│%)%(%(%#Pl465faf0016005f00N# %{"Buffer list"} %)%#Pl16005f0016005f00N#%)%<%#Ple7ffffff16005f00N#%=', 'v': '%(%(%#Ple7ffffff465faf00b# %{"LustyExplorer"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Buffer list"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'i': '%(%(%#Ple7ffffff465faf00b# %{"LustyExplorer"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Buffer list"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'n': '%(%(%#Ple7ffffff465faf00b# %{"LustyExplorer"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Buffer list"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%='}, 'matches': ['match', 'any', [['bufname("%")', '\[LustyExplorer-Buffers\]']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7fffffff0585858N# %{"Man page"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %{Powerline#Functions#ft_man#GetName()} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 's': '%(%(%#Ple7fffffff0585858N# %{"Man page"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %{Powerline#Functions#ft_man#GetName()} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'N': '%(%(%#Plf58a8a8aeb262626N# %{"Man page"} %)%#Pleb262626e9121212N#%)%(%(%#Plf58a8a8ae9121212b# %{Powerline#Functions#ft_man#GetName()} %)%#Ple9121212e9121212N#%)%<%#Ple7ffffffe9121212N#%=%(%#Pleb262626e9121212N#%(%#Plf0585858eb262626N# %3p%% %)%)', 'v': '%(%(%#Ple7fffffff0585858N# %{"Man page"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %{Powerline#Functions#ft_man#GetName()} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)', 'i': '%(%(%#Ple7ffffff1f0087afN# %{"Man page"} %)%#Ple7ffffff1f0087afN#│%)%(%(%#Ple7ffffff1f0087afb# %{Powerline#Functions#ft_man#GetName()} %)%#Pl1f0087af18005f87N#%)%<%#Ple7ffffff18005f87N#%=%(%#Pl1f0087af18005f87N#%(%#Pl7587d7ff1f0087afN# %3p%% %)%)', 'n': '%(%(%#Ple7fffffff0585858N# %{"Man page"} %)%#Ple7fffffff0585858N#│%)%(%(%#Ple7fffffff0585858b# %{Powerline#Functions#ft_man#GetName()} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=%(%#Plf0585858ec303030N#%(%#Plfabcbcbcf0585858N# %3p%% %)%)'}, 'matches': ['match', 'any', [['&ft', 'man']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff465faf00b# %{"MiniBufExplorer"} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 's': '%(%(%#Ple7ffffff465faf00b# %{"MiniBufExplorer"} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'N': '%(%(%#Pl465faf0016005f00b# %{"MiniBufExplorer"} %)%#Pl16005f0016005f00N#%)%<%#Ple7ffffff16005f00N#%=', 'v': '%(%(%#Ple7ffffff465faf00b# %{"MiniBufExplorer"} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'i': '%(%(%#Ple7ffffff465faf00b# %{"MiniBufExplorer"} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'n': '%(%(%#Ple7ffffff465faf00b# %{"MiniBufExplorer"} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%='}, 'matches': ['match', 'any', [['bufname("%")', '\-MiniBufExplorer\-']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7fffffff0585858N# %{"Quickfix"} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=', 's': '%(%(%#Ple7fffffff0585858N# %{"Quickfix"} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=', 'N': '%(%(%#Plf58a8a8aeb262626N# %{"Quickfix"} %)%#Pleb262626e9121212N#%)%<%#Ple7ffffffe9121212N#%=', 'v': '%(%(%#Ple7fffffff0585858N# %{"Quickfix"} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%=', 'i': '%(%(%#Ple7ffffff1f0087afN# %{"Quickfix"} %)%#Pl1f0087af18005f87N#%)%<%#Ple7ffffff18005f87N#%=', 'n': '%(%(%#Ple7fffffff0585858N# %{"Quickfix"} %)%#Plf0585858ec303030N#%)%<%#Ple7ffffffec303030N#%='}, 'matches': ['match', 'any', [['&ft', 'qf']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff465faf00b# %{"Tagbar"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Tree"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 's': '%(%(%#Ple7ffffff465faf00b# %{"Tagbar"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Tree"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'N': '%(%(%#Pl465faf0016005f00b# %{"Tagbar"} %)%#Pl465faf0016005f00b#│%)%(%(%#Pl465faf0016005f00N# %{"Tree"} %)%#Pl16005f0016005f00N#%)%<%#Ple7ffffff16005f00N#%=', 'v': '%(%(%#Ple7ffffff465faf00b# %{"Tagbar"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Tree"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'i': '%(%(%#Ple7ffffff465faf00b# %{"Tagbar"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Tree"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'n': '%(%(%#Ple7ffffff465faf00b# %{"Tagbar"} %)%#Pl465faf001c008700N#%)%(%(%#Pl94afd7001c008700N# %{"Tree"} %)%#Pl1c0087001c008700N#%)%<%#Ple7ffffff1c008700N#%='}, 'matches': ['match', 'any', [['&ft', 'tagbar']]]}, {'mode_statuslines': {'r': '%(%(%#Ple7ffffff465faf00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 's': '%(%(%#Ple7ffffff465faf00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'N': '%(%(%#Pl465faf0016005f00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl16005f0016005f00N#%)%<%#Ple7ffffff16005f00N#%=', 'v': '%(%(%#Ple7ffffff465faf00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'i': '%(%(%#Ple7ffffff465faf00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%=', 'n': '%(%(%#Ple7ffffff465faf00b# %{Powerline#Functions#GetShortPath(4)} %)%#Pl465faf001c008700N#%)%<%#Ple7ffffff1c008700N#%='}, 'matches': ['match', 'any', [['&ft', 'nerdtree']]]}] +let g:Pl#THEME_CALLBACKS = [['function! PowerlineStatuslineCallback_ctrlp_main(...){{NEWLINE}}return Pl#StatuslineCallback(''%(%(%#Ple7ffffff62875fd7N# %-3{"%3"} %)%#Pl62875fd7e7ffffffN#%)%(%(%#Pl375f00afe7ffffffb# %-9{"%4"} %)%#Ple7ffffff62875fd7N#%)%(%(%#Ple7ffffff62875fd7N# %-3{"%5"} %)%#Pl62875fd7375f00afN#%)%(%(%#Plc4ff0000375f00afb# %{"%6" == " <+>" ? "" : strpart("%6", 2, len("%6") - 3)} %)%#Pl375f00af375f00afN#%)%<%#Ple7ffffff375f00afN#%=%(%#Pl375f00af375f00afN#%(%#Plbdd7d7ff375f00afN# %{"%0"} %)%)%(%#Plbdd7d7ff375f00afN#│%(%#Plbdd7d7ff375f00afN# %{"%1"} %)%)%(%#Pl62875fd7375f00afN#%(%#Ple7ffffff62875fd7N# %{substitute(getcwd(), expand("$HOME"), "~", "g")} %)%)'', a:000){{NEWLINE}}endfunction', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.main = "PowerlineStatuslineCallback_ctrlp_main"'], ['function! PowerlineStatuslineCallback_ctrlp_prog(...){{NEWLINE}}return Pl#StatuslineCallback(''%(%(%#Pl375f00afe7ffffffN# %-6{"%0"} %)%#Ple7ffffff375f00afN#%)%<%#Ple7ffffff375f00afN#%=%(%#Pl62875fd7375f00afN#%(%#Ple7ffffff62875fd7N# %{substitute(getcwd(), expand("$HOME"), "~", "g")} %)%)'', a:000){{NEWLINE}}endfunction', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.prog = "PowerlineStatuslineCallback_ctrlp_prog"'], ['function! PowerlineStatuslineCallback_ctrlp_main(...){{NEWLINE}}return Pl#StatuslineCallback(''%(%(%#Ple7ffffff62875fd7N# %-3{"%3"} %)%#Pl62875fd7e7ffffffN#%)%(%(%#Pl375f00afe7ffffffb# %-9{"%4"} %)%#Ple7ffffff62875fd7N#%)%(%(%#Ple7ffffff62875fd7N# %-3{"%5"} %)%#Pl62875fd7375f00afN#%)%(%(%#Plc4ff0000375f00afb# %{"%6" == " <+>" ? "" : strpart("%6", 2, len("%6") - 3)} %)%#Pl375f00af375f00afN#%)%<%#Ple7ffffff375f00afN#%=%(%#Pl375f00af375f00afN#%(%#Plbdd7d7ff375f00afN# %{"%0"} %)%)%(%#Plbdd7d7ff375f00afN#│%(%#Plbdd7d7ff375f00afN# %{"%1"} %)%)%(%#Pl62875fd7375f00afN#%(%#Ple7ffffff62875fd7N# %{substitute(getcwd(), expand("$HOME"), "~", "g")} %)%)'', a:000){{NEWLINE}}endfunction', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.main = "PowerlineStatuslineCallback_ctrlp_main"'], ['function! PowerlineStatuslineCallback_ctrlp_prog(...){{NEWLINE}}return Pl#StatuslineCallback(''%(%(%#Pl375f00afe7ffffffN# %-6{"%0"} %)%#Ple7ffffff375f00afN#%)%<%#Ple7ffffff375f00afN#%=%(%#Pl62875fd7375f00afN#%(%#Ple7ffffff62875fd7N# %{substitute(getcwd(), expand("$HOME"), "~", "g")} %)%)'', a:000){{NEWLINE}}endfunction', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.prog = "PowerlineStatuslineCallback_ctrlp_prog"'], ['function! PowerlineStatuslineCallback_ctrlp_main(...){{NEWLINE}}return Pl#StatuslineCallback(''%(%(%#Ple7ffffff62875fd7N# %-3{"%3"} %)%#Pl62875fd7e7ffffffN#%)%(%(%#Pl375f00afe7ffffffb# %-9{"%4"} %)%#Ple7ffffff62875fd7N#%)%(%(%#Ple7ffffff62875fd7N# %-3{"%5"} %)%#Pl62875fd7375f00afN#%)%(%(%#Plc4ff0000375f00afb# %{"%6" == " <+>" ? "" : strpart("%6", 2, len("%6") - 3)} %)%#Pl375f00af375f00afN#%)%<%#Ple7ffffff375f00afN#%=%(%#Pl375f00af375f00afN#%(%#Plbdd7d7ff375f00afN# %{"%0"} %)%)%(%#Plbdd7d7ff375f00afN#│%(%#Plbdd7d7ff375f00afN# %{"%1"} %)%)%(%#Pl62875fd7375f00afN#%(%#Ple7ffffff62875fd7N# %{substitute(getcwd(), expand("$HOME"), "~", "g")} %)%)'', a:000){{NEWLINE}}endfunction', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.main = "PowerlineStatuslineCallback_ctrlp_main"'], ['function! PowerlineStatuslineCallback_ctrlp_prog(...){{NEWLINE}}return Pl#StatuslineCallback(''%(%(%#Pl375f00afe7ffffffN# %-6{"%0"} %)%#Ple7ffffff375f00afN#%)%<%#Ple7ffffff375f00afN#%=%(%#Pl62875fd7375f00afN#%(%#Ple7ffffff62875fd7N# %{substitute(getcwd(), expand("$HOME"), "~", "g")} %)%)'', a:000){{NEWLINE}}endfunction', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.prog = "PowerlineStatuslineCallback_ctrlp_prog"'], ['function! PowerlineStatuslineCallback_ctrlp_main(...){{NEWLINE}}return Pl#StatuslineCallback(''%(%(%#Ple7ffffff62875fd7N# %-3{"%3"} %)%#Pl62875fd7e7ffffffN#%)%(%(%#Pl375f00afe7ffffffb# %-9{"%4"} %)%#Ple7ffffff62875fd7N#%)%(%(%#Ple7ffffff62875fd7N# %-3{"%5"} %)%#Pl62875fd7375f00afN#%)%(%(%#Plc4ff0000375f00afb# %{"%6" == " <+>" ? "" : strpart("%6", 2, len("%6") - 3)} %)%#Pl375f00af375f00afN#%)%<%#Ple7ffffff375f00afN#%=%(%#Pl375f00af375f00afN#%(%#Plbdd7d7ff375f00afN# %{"%0"} %)%)%(%#Plbdd7d7ff375f00afN#│%(%#Plbdd7d7ff375f00afN# %{"%1"} %)%)%(%#Pl62875fd7375f00afN#%(%#Ple7ffffff62875fd7N# %{substitute(getcwd(), expand("$HOME"), "~", "g")} %)%)'', a:000){{NEWLINE}}endfunction', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.main = "PowerlineStatuslineCallback_ctrlp_main"'], ['function! PowerlineStatuslineCallback_ctrlp_prog(...){{NEWLINE}}return Pl#StatuslineCallback(''%(%(%#Pl375f00afe7ffffffN# %-6{"%0"} %)%#Ple7ffffff375f00afN#%)%<%#Ple7ffffff375f00afN#%=%(%#Pl62875fd7375f00afN#%(%#Ple7ffffff62875fd7N# %{substitute(getcwd(), expand("$HOME"), "~", "g")} %)%)'', a:000){{NEWLINE}}endfunction', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.prog = "PowerlineStatuslineCallback_ctrlp_prog"'], ['function! PowerlineStatuslineCallback_ctrlp_main(...){{NEWLINE}}return Pl#StatuslineCallback(''%(%(%#Ple7ffffff62875fd7N# %-3{"%3"} %)%#Pl62875fd7e7ffffffN#%)%(%(%#Pl375f00afe7ffffffb# %-9{"%4"} %)%#Ple7ffffff62875fd7N#%)%(%(%#Ple7ffffff62875fd7N# %-3{"%5"} %)%#Pl62875fd7375f00afN#%)%(%(%#Plc4ff0000375f00afb# %{"%6" == " <+>" ? "" : strpart("%6", 2, len("%6") - 3)} %)%#Pl375f00af375f00afN#%)%<%#Ple7ffffff375f00afN#%=%(%#Pl375f00af375f00afN#%(%#Plbdd7d7ff375f00afN# %{"%0"} %)%)%(%#Plbdd7d7ff375f00afN#│%(%#Plbdd7d7ff375f00afN# %{"%1"} %)%)%(%#Pl62875fd7375f00afN#%(%#Ple7ffffff62875fd7N# %{substitute(getcwd(), expand("$HOME"), "~", "g")} %)%)'', a:000){{NEWLINE}}endfunction', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.main = "PowerlineStatuslineCallback_ctrlp_main"'], ['function! PowerlineStatuslineCallback_ctrlp_prog(...){{NEWLINE}}return Pl#StatuslineCallback(''%(%(%#Pl375f00afe7ffffffN# %-6{"%0"} %)%#Ple7ffffff375f00afN#%)%<%#Ple7ffffff375f00afN#%=%(%#Pl62875fd7375f00afN#%(%#Ple7ffffff62875fd7N# %{substitute(getcwd(), expand("$HOME"), "~", "g")} %)%)'', a:000){{NEWLINE}}endfunction', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.prog = "PowerlineStatuslineCallback_ctrlp_prog"'], ['function! PowerlineStatuslineCallback_ctrlp_main(...){{NEWLINE}}return Pl#StatuslineCallback(''%(%(%#Ple7ffffff62875fd7N# %-3{"%3"} %)%#Pl62875fd7e7ffffffN#%)%(%(%#Pl375f00afe7ffffffb# %-9{"%4"} %)%#Ple7ffffff62875fd7N#%)%(%(%#Ple7ffffff62875fd7N# %-3{"%5"} %)%#Pl62875fd7375f00afN#%)%(%(%#Plc4ff0000375f00afb# %{"%6" == " <+>" ? "" : strpart("%6", 2, len("%6") - 3)} %)%#Pl375f00af375f00afN#%)%<%#Ple7ffffff375f00afN#%=%(%#Pl375f00af375f00afN#%(%#Plbdd7d7ff375f00afN# %{"%0"} %)%)%(%#Plbdd7d7ff375f00afN#│%(%#Plbdd7d7ff375f00afN# %{"%1"} %)%)%(%#Pl62875fd7375f00afN#%(%#Ple7ffffff62875fd7N# %{substitute(getcwd(), expand("$HOME"), "~", "g")} %)%)'', a:000){{NEWLINE}}endfunction', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.main = "PowerlineStatuslineCallback_ctrlp_main"'], ['function! PowerlineStatuslineCallback_ctrlp_prog(...){{NEWLINE}}return Pl#StatuslineCallback(''%(%(%#Pl375f00afe7ffffffN# %-6{"%0"} %)%#Ple7ffffff375f00afN#%)%<%#Ple7ffffff375f00afN#%=%(%#Pl62875fd7375f00afN#%(%#Ple7ffffff62875fd7N# %{substitute(getcwd(), expand("$HOME"), "~", "g")} %)%)'', a:000){{NEWLINE}}endfunction', 'if ! exists("g:ctrlp_status_func") | let g:ctrlp_status_func = {} | endif | let g:ctrlp_status_func.prog = "PowerlineStatuslineCallback_ctrlp_prog"']] diff --git a/sources_non_forked/vim-powerline/README.md b/sources_forked/vim-powerline/README.md similarity index 100% rename from sources_non_forked/vim-powerline/README.md rename to sources_forked/vim-powerline/README.md diff --git a/sources_non_forked/vim-powerline/README.rst b/sources_forked/vim-powerline/README.rst similarity index 100% rename from sources_non_forked/vim-powerline/README.rst rename to sources_forked/vim-powerline/README.rst diff --git a/sources_non_forked/vim-powerline/autoload/Pl.vim b/sources_forked/vim-powerline/autoload/Pl.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Pl.vim rename to sources_forked/vim-powerline/autoload/Pl.vim diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Colorscheme.vim b/sources_forked/vim-powerline/autoload/Pl/Colorscheme.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Pl/Colorscheme.vim rename to sources_forked/vim-powerline/autoload/Pl/Colorscheme.vim diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Hi.vim b/sources_forked/vim-powerline/autoload/Pl/Hi.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Pl/Hi.vim rename to sources_forked/vim-powerline/autoload/Pl/Hi.vim diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Match.vim b/sources_forked/vim-powerline/autoload/Pl/Match.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Pl/Match.vim rename to sources_forked/vim-powerline/autoload/Pl/Match.vim diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Mod.vim b/sources_forked/vim-powerline/autoload/Pl/Mod.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Pl/Mod.vim rename to sources_forked/vim-powerline/autoload/Pl/Mod.vim diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Parser.vim b/sources_forked/vim-powerline/autoload/Pl/Parser.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Pl/Parser.vim rename to sources_forked/vim-powerline/autoload/Pl/Parser.vim diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Segment.vim b/sources_forked/vim-powerline/autoload/Pl/Segment.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Pl/Segment.vim rename to sources_forked/vim-powerline/autoload/Pl/Segment.vim diff --git a/sources_non_forked/vim-powerline/autoload/Pl/Theme.vim b/sources_forked/vim-powerline/autoload/Pl/Theme.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Pl/Theme.vim rename to sources_forked/vim-powerline/autoload/Pl/Theme.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/default.vim b/sources_forked/vim-powerline/autoload/Powerline/Colorschemes/default.vim similarity index 97% rename from sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/default.vim rename to sources_forked/vim-powerline/autoload/Powerline/Colorschemes/default.vim index 4d4c7fa8..b28a4871 100755 --- a/sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/default.vim +++ b/sources_forked/vim-powerline/autoload/Powerline/Colorschemes/default.vim @@ -47,9 +47,9 @@ let g:Powerline#Colorschemes#default#colorscheme = Pl#Colorscheme#Init([ \ }), \ \ Pl#Hi#Segments(['mode_indicator'], { - \ 'n': ['darkestgreen', 'brightgreen', ['bold']], + \ 'n': ['gray10', 'gray0', ['bold']], \ 'i': ['darkestcyan', 'white', ['bold']], - \ 'v': ['darkred', 'brightorange', ['bold']], + \ 'v': ['white', 'darkestblue', ['bold']], \ 'r': ['white', 'brightred', ['bold']], \ 's': ['white', 'gray5', ['bold']], \ }), diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/skwp.vim b/sources_forked/vim-powerline/autoload/Powerline/Colorschemes/skwp.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Colorschemes/skwp.vim rename to sources_forked/vim-powerline/autoload/Powerline/Colorschemes/skwp.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Functions.vim b/sources_forked/vim-powerline/autoload/Powerline/Functions.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Functions.vim rename to sources_forked/vim-powerline/autoload/Powerline/Functions.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Functions/ft_man.vim b/sources_forked/vim-powerline/autoload/Powerline/Functions/ft_man.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Functions/ft_man.vim rename to sources_forked/vim-powerline/autoload/Powerline/Functions/ft_man.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Functions/fugitive.vim b/sources_forked/vim-powerline/autoload/Powerline/Functions/fugitive.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Functions/fugitive.vim rename to sources_forked/vim-powerline/autoload/Powerline/Functions/fugitive.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Functions/hgrev.vim b/sources_forked/vim-powerline/autoload/Powerline/Functions/hgrev.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Functions/hgrev.vim rename to sources_forked/vim-powerline/autoload/Powerline/Functions/hgrev.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Functions/syntastic.vim b/sources_forked/vim-powerline/autoload/Powerline/Functions/syntastic.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Functions/syntastic.vim rename to sources_forked/vim-powerline/autoload/Powerline/Functions/syntastic.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Matches.vim b/sources_forked/vim-powerline/autoload/Powerline/Matches.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Matches.vim rename to sources_forked/vim-powerline/autoload/Powerline/Matches.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments.vim b/sources_forked/vim-powerline/autoload/Powerline/Segments.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Segments.vim rename to sources_forked/vim-powerline/autoload/Powerline/Segments.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/ctrlp.vim b/sources_forked/vim-powerline/autoload/Powerline/Segments/ctrlp.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Segments/ctrlp.vim rename to sources_forked/vim-powerline/autoload/Powerline/Segments/ctrlp.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/ft_man.vim b/sources_forked/vim-powerline/autoload/Powerline/Segments/ft_man.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Segments/ft_man.vim rename to sources_forked/vim-powerline/autoload/Powerline/Segments/ft_man.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/fugitive.vim b/sources_forked/vim-powerline/autoload/Powerline/Segments/fugitive.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Segments/fugitive.vim rename to sources_forked/vim-powerline/autoload/Powerline/Segments/fugitive.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/hgrev.vim b/sources_forked/vim-powerline/autoload/Powerline/Segments/hgrev.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Segments/hgrev.vim rename to sources_forked/vim-powerline/autoload/Powerline/Segments/hgrev.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/rvm.vim b/sources_forked/vim-powerline/autoload/Powerline/Segments/rvm.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Segments/rvm.vim rename to sources_forked/vim-powerline/autoload/Powerline/Segments/rvm.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/syntastic.vim b/sources_forked/vim-powerline/autoload/Powerline/Segments/syntastic.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Segments/syntastic.vim rename to sources_forked/vim-powerline/autoload/Powerline/Segments/syntastic.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/tagbar.vim b/sources_forked/vim-powerline/autoload/Powerline/Segments/tagbar.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Segments/tagbar.vim rename to sources_forked/vim-powerline/autoload/Powerline/Segments/tagbar.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Segments/virtualenv.vim b/sources_forked/vim-powerline/autoload/Powerline/Segments/virtualenv.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Segments/virtualenv.vim rename to sources_forked/vim-powerline/autoload/Powerline/Segments/virtualenv.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Themes/default.vim b/sources_forked/vim-powerline/autoload/Powerline/Themes/default.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Themes/default.vim rename to sources_forked/vim-powerline/autoload/Powerline/Themes/default.vim diff --git a/sources_non_forked/vim-powerline/autoload/Powerline/Themes/skwp.vim b/sources_forked/vim-powerline/autoload/Powerline/Themes/skwp.vim similarity index 100% rename from sources_non_forked/vim-powerline/autoload/Powerline/Themes/skwp.vim rename to sources_forked/vim-powerline/autoload/Powerline/Themes/skwp.vim diff --git a/sources_non_forked/vim-powerline/doc/Powerline.txt b/sources_forked/vim-powerline/doc/Powerline.txt similarity index 100% rename from sources_non_forked/vim-powerline/doc/Powerline.txt rename to sources_forked/vim-powerline/doc/Powerline.txt diff --git a/sources_non_forked/vim-powerline/doc/tags b/sources_forked/vim-powerline/doc/tags similarity index 100% rename from sources_non_forked/vim-powerline/doc/tags rename to sources_forked/vim-powerline/doc/tags diff --git a/sources_non_forked/vim-powerline/fontpatcher/PowerlineSymbols.sfd b/sources_forked/vim-powerline/fontpatcher/PowerlineSymbols.sfd similarity index 100% rename from sources_non_forked/vim-powerline/fontpatcher/PowerlineSymbols.sfd rename to sources_forked/vim-powerline/fontpatcher/PowerlineSymbols.sfd diff --git a/sources_non_forked/vim-powerline/fontpatcher/README.rst b/sources_forked/vim-powerline/fontpatcher/README.rst similarity index 100% rename from sources_non_forked/vim-powerline/fontpatcher/README.rst rename to sources_forked/vim-powerline/fontpatcher/README.rst diff --git a/sources_non_forked/vim-powerline/fontpatcher/fontpatcher b/sources_forked/vim-powerline/fontpatcher/fontpatcher similarity index 100% rename from sources_non_forked/vim-powerline/fontpatcher/fontpatcher rename to sources_forked/vim-powerline/fontpatcher/fontpatcher diff --git a/sources_non_forked/vim-powerline/plugin/Powerline.vim b/sources_forked/vim-powerline/plugin/Powerline.vim similarity index 100% rename from sources_non_forked/vim-powerline/plugin/Powerline.vim rename to sources_forked/vim-powerline/plugin/Powerline.vim diff --git a/vimrcs/extended.vim b/vimrcs/extended.vim index d76b2d9a..6373d424 100644 --- a/vimrcs/extended.vim +++ b/vimrcs/extended.vim @@ -10,11 +10,7 @@ """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" set background=dark -if has("gui_running") - colorscheme peaksea -else - colorscheme ir_black -endif +colorscheme peaksea " Set font according to system if has("mac") || has("macunix") From ce9589ee1065f3e0d37fc17df91ceb07adba6e5d Mon Sep 17 00:00:00 2001 From: amix Date: Sat, 13 Apr 2013 18:35:25 -0300 Subject: [PATCH 06/13] Ignore docs tags --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 1a13e7c7..8d66da36 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ temp_dirs/undodir* sources_non_forked/ack.vim/.netrwhist temp_dirs/yankring_history_v2.txt +sources_forked/yankring/doc/tags +sources_non_forked/tlib/doc/tags my_configs.vim From c1bacbbc805720c615ab82752ef6cd552a573c7a Mon Sep 17 00:00:00 2001 From: amix Date: Sat, 13 Apr 2013 18:36:44 -0300 Subject: [PATCH 07/13] Removed generated doc tags from git repo --- sources_forked/yankring/doc/tags | 40 ----- sources_non_forked/tlib/doc/tags | 252 ------------------------------- 2 files changed, 292 deletions(-) delete mode 100644 sources_forked/yankring/doc/tags delete mode 100644 sources_non_forked/tlib/doc/tags diff --git a/sources_forked/yankring/doc/tags b/sources_forked/yankring/doc/tags deleted file mode 100644 index 36de7820..00000000 --- a/sources_forked/yankring/doc/tags +++ /dev/null @@ -1,40 +0,0 @@ -YRClear yankring.txt /*YRClear* -YRClear-example yankring.txt /*YRClear-example* -YRDeleteRange yankring.txt /*YRDeleteRange* -YRGetElem yankring.txt /*YRGetElem* -YRGetMultiple yankring.txt /*YRGetMultiple* -YRGetMultiple-example yankring.txt /*YRGetMultiple-example* -YRMapsCreate yankring.txt /*YRMapsCreate* -YRMapsDelete yankring.txt /*YRMapsDelete* -YRPaste yankring.txt /*YRPaste* -YRPop yankring.txt /*YRPop* -YRPop-example yankring.txt /*YRPop-example* -YRPush yankring.txt /*YRPush* -YRPush-example yankring.txt /*YRPush-example* -YRReplace yankring.txt /*YRReplace* -YRReplace-example yankring.txt /*YRReplace-example* -YRSearch yankring.txt /*YRSearch* -YRSearch-example yankring.txt /*YRSearch-example* -YRShow yankring.txt /*YRShow* -YRShow-example yankring.txt /*YRShow-example* -YRToggle yankring.txt /*YRToggle* -YRYankCount yankring.txt /*YRYankCount* -YRYankRange yankring.txt /*YRYankRange* -YRYankRange-example yankring.txt /*YRYankRange-example* -any-item-example yankring.txt /*any-item-example* -global-example yankring.txt /*global-example* -multiple-items-example yankring.txt /*multiple-items-example* -yankring yankring.txt /*yankring* -yankring-commands yankring.txt /*yankring-commands* -yankring-configure yankring.txt /*yankring-configure* -yankring-contents yankring.txt /*yankring-contents* -yankring-custom-maps yankring.txt /*yankring-custom-maps* -yankring-description yankring.txt /*yankring-description* -yankring-globals yankring.txt /*yankring-globals* -yankring-history yankring.txt /*yankring-history* -yankring-mappings yankring.txt /*yankring-mappings* -yankring-tutorial yankring.txt /*yankring-tutorial* -yankring-visual-example yankring.txt /*yankring-visual-example* -yankring-window yankring.txt /*yankring-window* -yankring-window-example yankring.txt /*yankring-window-example* -yankring.txt yankring.txt /*yankring.txt* diff --git a/sources_non_forked/tlib/doc/tags b/sources_non_forked/tlib/doc/tags deleted file mode 100644 index 8ca42840..00000000 --- a/sources_non_forked/tlib/doc/tags +++ /dev/null @@ -1,252 +0,0 @@ -:TBrowseOutput tlib.txt /*:TBrowseOutput* -:TBrowseScriptnames tlib.txt /*:TBrowseScriptnames* -:TKeyArg tlib.txt /*:TKeyArg* -:TLet tlib.txt /*:TLet* -:TRequire tlib.txt /*:TRequire* -:TScratch tlib.txt /*:TScratch* -:TTimeCommand tlib.txt /*:TTimeCommand* -:TVarArg tlib.txt /*:TVarArg* -g:tlib#Filter_cnfx#expander tlib.txt /*g:tlib#Filter_cnfx#expander* -g:tlib#cache#dont_purge tlib.txt /*g:tlib#cache#dont_purge* -g:tlib#cache#purge_days tlib.txt /*g:tlib#cache#purge_days* -g:tlib#cache#purge_every_days tlib.txt /*g:tlib#cache#purge_every_days* -g:tlib#cache#run_script tlib.txt /*g:tlib#cache#run_script* -g:tlib#cache#script_encoding tlib.txt /*g:tlib#cache#script_encoding* -g:tlib#cache#silent tlib.txt /*g:tlib#cache#silent* -g:tlib#input#filename_max_width tlib.txt /*g:tlib#input#filename_max_width* -g:tlib#input#filename_padding_r tlib.txt /*g:tlib#input#filename_padding_r* -g:tlib#input#format_filename tlib.txt /*g:tlib#input#format_filename* -g:tlib#input#use_popup tlib.txt /*g:tlib#input#use_popup* -g:tlib#vcs#check tlib.txt /*g:tlib#vcs#check* -g:tlib#vcs#def tlib.txt /*g:tlib#vcs#def* -g:tlib#vcs#executables tlib.txt /*g:tlib#vcs#executables* -g:tlib#vim#simalt_maximize tlib.txt /*g:tlib#vim#simalt_maximize* -g:tlib#vim#simalt_restore tlib.txt /*g:tlib#vim#simalt_restore* -g:tlib#vim#use_vimtweak tlib.txt /*g:tlib#vim#use_vimtweak* -g:tlib#vim#use_wmctrl tlib.txt /*g:tlib#vim#use_wmctrl* -g:tlib_cache tlib.txt /*g:tlib_cache* -g:tlib_debug tlib.txt /*g:tlib_debug* -g:tlib_filename_sep tlib.txt /*g:tlib_filename_sep* -g:tlib_handlers_EditList tlib.txt /*g:tlib_handlers_EditList* -g:tlib_inputlist_and tlib.txt /*g:tlib_inputlist_and* -g:tlib_inputlist_filename_indicators tlib.txt /*g:tlib_inputlist_filename_indicators* -g:tlib_inputlist_higroup tlib.txt /*g:tlib_inputlist_higroup* -g:tlib_inputlist_livesearch_threshold tlib.txt /*g:tlib_inputlist_livesearch_threshold* -g:tlib_inputlist_match tlib.txt /*g:tlib_inputlist_match* -g:tlib_inputlist_not tlib.txt /*g:tlib_inputlist_not* -g:tlib_inputlist_or tlib.txt /*g:tlib_inputlist_or* -g:tlib_inputlist_pct tlib.txt /*g:tlib_inputlist_pct* -g:tlib_inputlist_shortmessage tlib.txt /*g:tlib_inputlist_shortmessage* -g:tlib_inputlist_width_filename tlib.txt /*g:tlib_inputlist_width_filename* -g:tlib_keyagents_InputList_m tlib.txt /*g:tlib_keyagents_InputList_m* -g:tlib_keyagents_InputList_s tlib.txt /*g:tlib_keyagents_InputList_s* -g:tlib_numeric_chars tlib.txt /*g:tlib_numeric_chars* -g:tlib_persistent tlib.txt /*g:tlib_persistent* -g:tlib_pick_last_item tlib.txt /*g:tlib_pick_last_item* -g:tlib_scratch_pos tlib.txt /*g:tlib_scratch_pos* -g:tlib_scroll_lines tlib.txt /*g:tlib_scroll_lines* -g:tlib_sortprefs_threshold tlib.txt /*g:tlib_sortprefs_threshold* -g:tlib_tag_substitute tlib.txt /*g:tlib_tag_substitute* -g:tlib_tags_extra tlib.txt /*g:tlib_tags_extra* -g:tlib_viewline_position tlib.txt /*g:tlib_viewline_position* -o_sp tlib.txt /*o_sp* -standard-paragraph tlib.txt /*standard-paragraph* -tlib#Filter_cnf#New() tlib.txt /*tlib#Filter_cnf#New()* -tlib#Filter_cnfd#New() tlib.txt /*tlib#Filter_cnfd#New()* -tlib#Filter_cnfx#New() tlib.txt /*tlib#Filter_cnfx#New()* -tlib#Filter_fuzzy#New() tlib.txt /*tlib#Filter_fuzzy#New()* -tlib#Object#Methods() tlib.txt /*tlib#Object#Methods()* -tlib#Object#New() tlib.txt /*tlib#Object#New()* -tlib#World#New() tlib.txt /*tlib#World#New()* -tlib#agent#AND() tlib.txt /*tlib#agent#AND()* -tlib#agent#CompleteAgentNames() tlib.txt /*tlib#agent#CompleteAgentNames()* -tlib#agent#Copy() tlib.txt /*tlib#agent#Copy()* -tlib#agent#CopyItems() tlib.txt /*tlib#agent#CopyItems()* -tlib#agent#Cut() tlib.txt /*tlib#agent#Cut()* -tlib#agent#Debug() tlib.txt /*tlib#agent#Debug()* -tlib#agent#DeleteItems() tlib.txt /*tlib#agent#DeleteItems()* -tlib#agent#DoAtLine() tlib.txt /*tlib#agent#DoAtLine()* -tlib#agent#Down() tlib.txt /*tlib#agent#Down()* -tlib#agent#DownN() tlib.txt /*tlib#agent#DownN()* -tlib#agent#EditFile() tlib.txt /*tlib#agent#EditFile()* -tlib#agent#EditFileInSplit() tlib.txt /*tlib#agent#EditFileInSplit()* -tlib#agent#EditFileInTab() tlib.txt /*tlib#agent#EditFileInTab()* -tlib#agent#EditFileInVSplit() tlib.txt /*tlib#agent#EditFileInVSplit()* -tlib#agent#EditItem() tlib.txt /*tlib#agent#EditItem()* -tlib#agent#EditReturnValue() tlib.txt /*tlib#agent#EditReturnValue()* -tlib#agent#ExecAgentByName() tlib.txt /*tlib#agent#ExecAgentByName()* -tlib#agent#Exit() tlib.txt /*tlib#agent#Exit()* -tlib#agent#GotoLine() tlib.txt /*tlib#agent#GotoLine()* -tlib#agent#Help() tlib.txt /*tlib#agent#Help()* -tlib#agent#Input() tlib.txt /*tlib#agent#Input()* -tlib#agent#NewItem() tlib.txt /*tlib#agent#NewItem()* -tlib#agent#Null() tlib.txt /*tlib#agent#Null()* -tlib#agent#OR() tlib.txt /*tlib#agent#OR()* -tlib#agent#PageDown() tlib.txt /*tlib#agent#PageDown()* -tlib#agent#PageUp() tlib.txt /*tlib#agent#PageUp()* -tlib#agent#Paste() tlib.txt /*tlib#agent#Paste()* -tlib#agent#PopFilter() tlib.txt /*tlib#agent#PopFilter()* -tlib#agent#PreviewLine() tlib.txt /*tlib#agent#PreviewLine()* -tlib#agent#ReduceFilter() tlib.txt /*tlib#agent#ReduceFilter()* -tlib#agent#Reset() tlib.txt /*tlib#agent#Reset()* -tlib#agent#Select() tlib.txt /*tlib#agent#Select()* -tlib#agent#SelectAll() tlib.txt /*tlib#agent#SelectAll()* -tlib#agent#SelectDown() tlib.txt /*tlib#agent#SelectDown()* -tlib#agent#SelectUp() tlib.txt /*tlib#agent#SelectUp()* -tlib#agent#ShiftLeft() tlib.txt /*tlib#agent#ShiftLeft()* -tlib#agent#ShiftRight() tlib.txt /*tlib#agent#ShiftRight()* -tlib#agent#ShowInfo() tlib.txt /*tlib#agent#ShowInfo()* -tlib#agent#Suspend() tlib.txt /*tlib#agent#Suspend()* -tlib#agent#SuspendToParentWindow() tlib.txt /*tlib#agent#SuspendToParentWindow()* -tlib#agent#ToggleScrollbind() tlib.txt /*tlib#agent#ToggleScrollbind()* -tlib#agent#ToggleStickyList() tlib.txt /*tlib#agent#ToggleStickyList()* -tlib#agent#Up() tlib.txt /*tlib#agent#Up()* -tlib#agent#UpN() tlib.txt /*tlib#agent#UpN()* -tlib#agent#ViewFile() tlib.txt /*tlib#agent#ViewFile()* -tlib#agent#Wildcard() tlib.txt /*tlib#agent#Wildcard()* -tlib#arg#Ex() tlib.txt /*tlib#arg#Ex()* -tlib#arg#Get() tlib.txt /*tlib#arg#Get()* -tlib#arg#Key() tlib.txt /*tlib#arg#Key()* -tlib#arg#Let() tlib.txt /*tlib#arg#Let()* -tlib#arg#StringAsKeyArgs() tlib.txt /*tlib#arg#StringAsKeyArgs()* -tlib#autocmdgroup#Init() tlib.txt /*tlib#autocmdgroup#Init()* -tlib#balloon#Expr() tlib.txt /*tlib#balloon#Expr()* -tlib#balloon#Register() tlib.txt /*tlib#balloon#Register()* -tlib#balloon#Remove() tlib.txt /*tlib#balloon#Remove()* -tlib#buffer#BufDo() tlib.txt /*tlib#buffer#BufDo()* -tlib#buffer#CurrentByte() tlib.txt /*tlib#buffer#CurrentByte()* -tlib#buffer#DeleteRange() tlib.txt /*tlib#buffer#DeleteRange()* -tlib#buffer#DisableMRU() tlib.txt /*tlib#buffer#DisableMRU()* -tlib#buffer#EnableMRU() tlib.txt /*tlib#buffer#EnableMRU()* -tlib#buffer#Eval() tlib.txt /*tlib#buffer#Eval()* -tlib#buffer#GetList() tlib.txt /*tlib#buffer#GetList()* -tlib#buffer#HighlightLine() tlib.txt /*tlib#buffer#HighlightLine()* -tlib#buffer#InsertText() tlib.txt /*tlib#buffer#InsertText()* -tlib#buffer#InsertText0() tlib.txt /*tlib#buffer#InsertText0()* -tlib#buffer#KeepCursorPosition() tlib.txt /*tlib#buffer#KeepCursorPosition()* -tlib#buffer#ReplaceRange() tlib.txt /*tlib#buffer#ReplaceRange()* -tlib#buffer#ScratchEnd() tlib.txt /*tlib#buffer#ScratchEnd()* -tlib#buffer#ScratchStart() tlib.txt /*tlib#buffer#ScratchStart()* -tlib#buffer#Set() tlib.txt /*tlib#buffer#Set()* -tlib#buffer#ViewLine() tlib.txt /*tlib#buffer#ViewLine()* -tlib#cache#Dir() tlib.txt /*tlib#cache#Dir()* -tlib#cache#Filename() tlib.txt /*tlib#cache#Filename()* -tlib#cache#Get() tlib.txt /*tlib#cache#Get()* -tlib#cache#ListFilesInCache() tlib.txt /*tlib#cache#ListFilesInCache()* -tlib#cache#MaybePurge() tlib.txt /*tlib#cache#MaybePurge()* -tlib#cache#Purge() tlib.txt /*tlib#cache#Purge()* -tlib#cache#Save() tlib.txt /*tlib#cache#Save()* -tlib#char#Get() tlib.txt /*tlib#char#Get()* -tlib#char#GetWithTimeout() tlib.txt /*tlib#char#GetWithTimeout()* -tlib#char#IsAvailable() tlib.txt /*tlib#char#IsAvailable()* -tlib#cmd#BrowseOutput() tlib.txt /*tlib#cmd#BrowseOutput()* -tlib#cmd#BrowseOutputWithCallback() tlib.txt /*tlib#cmd#BrowseOutputWithCallback()* -tlib#cmd#DefaultBrowseOutput() tlib.txt /*tlib#cmd#DefaultBrowseOutput()* -tlib#cmd#OutputAsList() tlib.txt /*tlib#cmd#OutputAsList()* -tlib#cmd#ParseScriptname() tlib.txt /*tlib#cmd#ParseScriptname()* -tlib#cmd#Time() tlib.txt /*tlib#cmd#Time()* -tlib#cmd#UseVertical() tlib.txt /*tlib#cmd#UseVertical()* -tlib#comments#Comments() tlib.txt /*tlib#comments#Comments()* -tlib#date#DiffInDays() tlib.txt /*tlib#date#DiffInDays()* -tlib#date#Parse() tlib.txt /*tlib#date#Parse()* -tlib#date#SecondsSince1970() tlib.txt /*tlib#date#SecondsSince1970()* -tlib#dir#CD() tlib.txt /*tlib#dir#CD()* -tlib#dir#CanonicName() tlib.txt /*tlib#dir#CanonicName()* -tlib#dir#Ensure() tlib.txt /*tlib#dir#Ensure()* -tlib#dir#MyRuntime() tlib.txt /*tlib#dir#MyRuntime()* -tlib#dir#PlainName() tlib.txt /*tlib#dir#PlainName()* -tlib#dir#Pop() tlib.txt /*tlib#dir#Pop()* -tlib#dir#Push() tlib.txt /*tlib#dir#Push()* -tlib#eval#FormatValue() tlib.txt /*tlib#eval#FormatValue()* -tlib#file#Join() tlib.txt /*tlib#file#Join()* -tlib#file#Relative() tlib.txt /*tlib#file#Relative()* -tlib#file#Split() tlib.txt /*tlib#file#Split()* -tlib#file#With() tlib.txt /*tlib#file#With()* -tlib#hook#Run() tlib.txt /*tlib#hook#Run()* -tlib#input#CommandSelect() tlib.txt /*tlib#input#CommandSelect()* -tlib#input#Dialog() tlib.txt /*tlib#input#Dialog()* -tlib#input#Edit() tlib.txt /*tlib#input#Edit()* -tlib#input#EditList() tlib.txt /*tlib#input#EditList()* -tlib#input#List() tlib.txt /*tlib#input#List()* -tlib#input#ListD() tlib.txt /*tlib#input#ListD()* -tlib#input#ListW() tlib.txt /*tlib#input#ListW()* -tlib#input#Resume() tlib.txt /*tlib#input#Resume()* -tlib#list#All() tlib.txt /*tlib#list#All()* -tlib#list#Any() tlib.txt /*tlib#list#Any()* -tlib#list#Compact() tlib.txt /*tlib#list#Compact()* -tlib#list#Find() tlib.txt /*tlib#list#Find()* -tlib#list#FindAll() tlib.txt /*tlib#list#FindAll()* -tlib#list#Flatten() tlib.txt /*tlib#list#Flatten()* -tlib#list#Inject() tlib.txt /*tlib#list#Inject()* -tlib#list#Remove() tlib.txt /*tlib#list#Remove()* -tlib#list#RemoveAll() tlib.txt /*tlib#list#RemoveAll()* -tlib#list#Uniq() tlib.txt /*tlib#list#Uniq()* -tlib#list#Zip() tlib.txt /*tlib#list#Zip()* -tlib#map#PumAccept() tlib.txt /*tlib#map#PumAccept()* -tlib#normal#WithRegister() tlib.txt /*tlib#normal#WithRegister()* -tlib#notify#Echo() tlib.txt /*tlib#notify#Echo()* -tlib#notify#TrimMessage() tlib.txt /*tlib#notify#TrimMessage()* -tlib#paragraph#GetMetric() tlib.txt /*tlib#paragraph#GetMetric()* -tlib#paragraph#Move() tlib.txt /*tlib#paragraph#Move()* -tlib#persistent#Dir() tlib.txt /*tlib#persistent#Dir()* -tlib#persistent#Filename() tlib.txt /*tlib#persistent#Filename()* -tlib#persistent#Get() tlib.txt /*tlib#persistent#Get()* -tlib#persistent#Save() tlib.txt /*tlib#persistent#Save()* -tlib#progressbar#Display() tlib.txt /*tlib#progressbar#Display()* -tlib#progressbar#Init() tlib.txt /*tlib#progressbar#Init()* -tlib#progressbar#Restore() tlib.txt /*tlib#progressbar#Restore()* -tlib#rx#Escape() tlib.txt /*tlib#rx#Escape()* -tlib#rx#EscapeReplace() tlib.txt /*tlib#rx#EscapeReplace()* -tlib#rx#Suffixes() tlib.txt /*tlib#rx#Suffixes()* -tlib#scratch#CloseScratch() tlib.txt /*tlib#scratch#CloseScratch()* -tlib#scratch#UseScratch() tlib.txt /*tlib#scratch#UseScratch()* -tlib#signs#ClearAll() tlib.txt /*tlib#signs#ClearAll()* -tlib#signs#ClearBuffer() tlib.txt /*tlib#signs#ClearBuffer()* -tlib#signs#Mark() tlib.txt /*tlib#signs#Mark()* -tlib#string#Chomp() tlib.txt /*tlib#string#Chomp()* -tlib#string#Count() tlib.txt /*tlib#string#Count()* -tlib#string#Format() tlib.txt /*tlib#string#Format()* -tlib#string#Printf1() tlib.txt /*tlib#string#Printf1()* -tlib#string#RemoveBackslashes() tlib.txt /*tlib#string#RemoveBackslashes()* -tlib#string#Strip() tlib.txt /*tlib#string#Strip()* -tlib#string#TrimLeft() tlib.txt /*tlib#string#TrimLeft()* -tlib#string#TrimRight() tlib.txt /*tlib#string#TrimRight()* -tlib#syntax#Collect() tlib.txt /*tlib#syntax#Collect()* -tlib#syntax#Names() tlib.txt /*tlib#syntax#Names()* -tlib#tab#BufMap() tlib.txt /*tlib#tab#BufMap()* -tlib#tab#Set() tlib.txt /*tlib#tab#Set()* -tlib#tab#TabWinNr() tlib.txt /*tlib#tab#TabWinNr()* -tlib#tag#Collect() tlib.txt /*tlib#tag#Collect()* -tlib#tag#Format() tlib.txt /*tlib#tag#Format()* -tlib#tag#Retrieve() tlib.txt /*tlib#tag#Retrieve()* -tlib#textobjects#Init() tlib.txt /*tlib#textobjects#Init()* -tlib#time#Diff() tlib.txt /*tlib#time#Diff()* -tlib#time#DiffMSecs() tlib.txt /*tlib#time#DiffMSecs()* -tlib#time#MSecs() tlib.txt /*tlib#time#MSecs()* -tlib#time#Now() tlib.txt /*tlib#time#Now()* -tlib#type#IsDictionary() tlib.txt /*tlib#type#IsDictionary()* -tlib#type#IsFuncref() tlib.txt /*tlib#type#IsFuncref()* -tlib#type#IsList() tlib.txt /*tlib#type#IsList()* -tlib#type#IsNumber() tlib.txt /*tlib#type#IsNumber()* -tlib#type#IsString() tlib.txt /*tlib#type#IsString()* -tlib#url#Decode() tlib.txt /*tlib#url#Decode()* -tlib#url#DecodeChar() tlib.txt /*tlib#url#DecodeChar()* -tlib#url#Encode() tlib.txt /*tlib#url#Encode()* -tlib#url#EncodeChar() tlib.txt /*tlib#url#EncodeChar()* -tlib#var#EGet() tlib.txt /*tlib#var#EGet()* -tlib#var#Get() tlib.txt /*tlib#var#Get()* -tlib#var#Let() tlib.txt /*tlib#var#Let()* -tlib#var#List() tlib.txt /*tlib#var#List()* -tlib#vcs#Diff() tlib.txt /*tlib#vcs#Diff()* -tlib#vcs#FindVCS() tlib.txt /*tlib#vcs#FindVCS()* -tlib#vcs#Ls() tlib.txt /*tlib#vcs#Ls()* -tlib#vim#Maximize() tlib.txt /*tlib#vim#Maximize()* -tlib#vim#RestoreWindow() tlib.txt /*tlib#vim#RestoreWindow()* -tlib#win#GetLayout() tlib.txt /*tlib#win#GetLayout()* -tlib#win#List() tlib.txt /*tlib#win#List()* -tlib#win#Set() tlib.txt /*tlib#win#Set()* -tlib#win#SetLayout() tlib.txt /*tlib#win#SetLayout()* -tlib#win#Width() tlib.txt /*tlib#win#Width()* -tlib#win#WinDo() tlib.txt /*tlib#win#WinDo()* -tlib.txt tlib.txt /*tlib.txt* -v_sp tlib.txt /*v_sp* From 8b5bc388b0be273cea06577994be602b7fd39a76 Mon Sep 17 00:00:00 2001 From: amix Date: Sun, 14 Apr 2013 12:48:31 -0300 Subject: [PATCH 08/13] Added two new plugins: vim-expand-region and vim-multiple-cursors. They are both super useful. Read more on their GitHub pages for more info: https://github.com/terryma/vim-expand-region https://github.com/terryma/vim-multiple-cursors --- README.md | 5 +- .../vim-expand-region/MIT-LICENSE.txt | 20 + .../vim-expand-region/README.md | 92 +++ .../autoload/expand_region.vim | 350 +++++++++ .../vim-expand-region/doc/expand_region.txt | 126 ++++ sources_non_forked/vim-expand-region/doc/tags | 10 + .../vim-expand-region/expand-region.gif | Bin 0 -> 770749 bytes .../plugin/expand_region.vim | 43 ++ .../vim-multiple-cursors/MIT-LICENSE.txt | 20 + .../vim-multiple-cursors/README.md | 90 +++ .../vim-multiple-cursors/assets/example1.gif | Bin 0 -> 103002 bytes .../vim-multiple-cursors/assets/example2.gif | Bin 0 -> 271369 bytes .../vim-multiple-cursors/assets/example3.gif | Bin 0 -> 186260 bytes .../autoload/multiple_cursors.vim | 689 ++++++++++++++++++ .../doc/multiple_cursors.txt | 174 +++++ .../vim-multiple-cursors/doc/tags | 19 + .../plugin/multiple_cursors.vim | 99 +++ update_plugins.py | 1 + vimrcs/plugins_config.vim | 6 + 19 files changed, 1743 insertions(+), 1 deletion(-) create mode 100755 sources_non_forked/vim-expand-region/MIT-LICENSE.txt create mode 100755 sources_non_forked/vim-expand-region/README.md create mode 100755 sources_non_forked/vim-expand-region/autoload/expand_region.vim create mode 100755 sources_non_forked/vim-expand-region/doc/expand_region.txt create mode 100644 sources_non_forked/vim-expand-region/doc/tags create mode 100755 sources_non_forked/vim-expand-region/expand-region.gif create mode 100755 sources_non_forked/vim-expand-region/plugin/expand_region.vim create mode 100755 sources_non_forked/vim-multiple-cursors/MIT-LICENSE.txt create mode 100755 sources_non_forked/vim-multiple-cursors/README.md create mode 100755 sources_non_forked/vim-multiple-cursors/assets/example1.gif create mode 100755 sources_non_forked/vim-multiple-cursors/assets/example2.gif create mode 100755 sources_non_forked/vim-multiple-cursors/assets/example3.gif create mode 100755 sources_non_forked/vim-multiple-cursors/autoload/multiple_cursors.vim create mode 100755 sources_non_forked/vim-multiple-cursors/doc/multiple_cursors.txt create mode 100644 sources_non_forked/vim-multiple-cursors/doc/tags create mode 100755 sources_non_forked/vim-multiple-cursors/plugin/multiple_cursors.vim diff --git a/README.md b/README.md index 04c86348..39efe3fc 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,8 @@ I recommend reading the docs of these plugins to understand them better. Each of * [zencoding](https://github.com/mattn/zencoding-vim): Expanding abbreviation like zen-coding, very useful for editing XML, HTML. * [vim-indent-object](https://github.com/michaeljsmith/vim-indent-object): Defines a new text object representing lines of code at the same indent level. Useful for python/vim scripts * [taglist.vim](https://github.com/vim-scripts/taglist.vim): Source code browser (supports C/C++, java, perl, python, tcl, sql, php, etc) +* [vim-multiple-cursors](https://github.com/terryma/vim-multiple-cursors): Sublime Text style multiple selections for Vim, CTRL+N is remapped to CTRL+A (due to YankRing) +* [vim-expand-region](https://github.com/terryma/vim-expand-region): Allows you to visually select increasingly larger regions of text using the same key combination. ## What color schemes are included? @@ -134,6 +136,7 @@ Managing the [NERD Tree](https://github.com/scrooloose/nerdtree) plugin: map nf :NERDTreeFind ### Normal mode mappings + Fast saving of a buffer: nmap w :w! @@ -261,7 +264,7 @@ Bash like keys for the command line: cnoremap cnoremap -Write the file as sudo (only on Unix). [Vim tip](http://vim.wikia.com/wiki/Su-write): +Write the file as sudo (only on Unix). Super useful when you open a file and you don't have permissions to save your changes. [Vim tip](http://vim.wikia.com/wiki/Su-write): :W diff --git a/sources_non_forked/vim-expand-region/MIT-LICENSE.txt b/sources_non_forked/vim-expand-region/MIT-LICENSE.txt new file mode 100755 index 00000000..dade7aa4 --- /dev/null +++ b/sources_non_forked/vim-expand-region/MIT-LICENSE.txt @@ -0,0 +1,20 @@ +Copyright 2013 Terry Ma + +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/sources_non_forked/vim-expand-region/README.md b/sources_non_forked/vim-expand-region/README.md new file mode 100755 index 00000000..0ba8efac --- /dev/null +++ b/sources_non_forked/vim-expand-region/README.md @@ -0,0 +1,92 @@ +# vim-expand-region + +## About +[vim-expand-region] is a Vim plugin that allows you to visually select increasingly larger regions of text using the same key combination. It is similar to features from other editors: + +- Emac's [expand region](https://github.com/magnars/expand-region.el) +- IntelliJ's [syntax aware selection](http://www.jetbrains.com/idea/documentation/tips/#tips_code_editing) +- Eclipse's [select enclosing element](http://stackoverflow.com/questions/4264047/intellij-ctrlw-equivalent-shortcut-in-eclipse) + +

            + vim-expand-region +

            + +## Installation +Install using [Pathogen], [Vundle], [Neobundle], or your favorite Vim package manager. + +## Quick Start +Press ```+``` to expand the visual selection and ```_``` to shrink it. + +## Mapping +Customize the key mapping if you don't like the default. + +``` +map K (expand_region_expand) +map J (expand_region_shrink) +``` + +## Setting +### Customize selected regions +The plugin uses __your own__ text objects to determine the expansion. You can customize the text objects the plugin knows about with ```g:expand_region_text_objects```. + +```vim +" Default settings. (NOTE: Remove comments in dictionary before sourcing) +let g:expand_region_text_objects = { + \ 'iw' :0, + \ 'iW' :0, + \ 'i"' :0, + \ 'i''' :0, + \ 'i]' :1, " Support nesting of square brackets + \ 'ib' :1, " Support nesting of parentheses + \ 'iB' :1, " Support nesting of braces + \ 'il' :0, " 'inside line'. Available through https://github.com/kana/vim-textobj-line + \ 'ip' :0, + \ 'ie' :0, " 'entire file'. Available through https://github.com/kana/vim-textobj-entire + \ } +``` + +You can extend the global default dictionary by calling ```expand_region#custom_text_objects```: + +```vim +" Extend the global default (NOTE: Remove comments in dictionary before sourcing) +call expand_region#custom_text_objects({ + \ "\/\\n\\n\": 1, " Motions are supported as well. Here's a search motion that finds a blank line + \ 'a]' :1, " Support nesting of 'around' brackets + \ 'ab' :1, " Support nesting of 'around' parentheses + \ 'aB' :1, " Support nesting of 'around' braces + \ 'ii' :0, " 'inside indent'. Available through https://github.com/kana/vim-textobj-indent + \ 'ai' :0, " 'around indent'. Available through https://github.com/kana/vim-textobj-indent + \ }) +``` + +You can further customize the text objects dictionary on a per filetype basis by defining global variables like ```g:expand_region_text_objects_{ft}```. + +```vim +" Use the following setting for ruby. (NOTE: Remove comments in dictionary before sourcing) +let g:expand_region_text_objects_ruby = { + \ 'im' :0, " 'inner method'. Available through https://github.com/vim-ruby/vim-ruby + \ 'am' :0, " 'around method'. Available through https://github.com/vim-ruby/vim-ruby + \ } +``` + +Note that this completely replaces the default dictionary. To extend the default on a per filetype basis, you can call ```expand_region#custom_text_objects``` by passing in the filetype in the first argument: + +```vim +" Use the global default + the following for ruby +call expand_region#custom_text_objects('ruby', { + \ 'im' :0, + \ 'am' :0, + \ }) +``` + +### Customize selection mode +By default, after an expansion, the plugin leaves you in visual mode. If your ```selectmode```(h:selectmode)) contains ```cmd```, then the plugin will respect that setting and leave you in select mode. If you don't have ```selectmode``` set, but would like to default the expansion in select mode, you can use the global setting below: + +```vim +let g:expand_region_use_select_mode = 1 +``` + +[vim-expand-region]:http://github.com/terryma/vim-expand-region +[Pathogen]:http://github.com/tpope/vim-pathogen +[Vundle]:http://github.com/gmarik/vundle +[Neobundle]:http://github.com/Shougo/neobundle.vim diff --git a/sources_non_forked/vim-expand-region/autoload/expand_region.vim b/sources_non_forked/vim-expand-region/autoload/expand_region.vim new file mode 100755 index 00000000..3bf2f70a --- /dev/null +++ b/sources_non_forked/vim-expand-region/autoload/expand_region.vim @@ -0,0 +1,350 @@ +" ============================================================================== +" File: expand_region.vim +" Author: Terry Ma +" Last Modified: March 30, 2013 +" ============================================================================== + +let s:save_cpo = &cpo +set cpo&vim + +" ============================================================================== +" Settings +" ============================================================================== + +" Init global vars +function! expand_region#init() + if exists('g:expand_region_init') && g:expand_region_init + return + endif + let g:expand_region_init = 1 + + " Dictionary of text objects that are supported by default. Note that some of + " the text objects are not available in vanilla vim. '1' indicates that the + " text object is recursive (think of nested parens or brackets) + let g:expand_region_text_objects = get(g:, 'expand_region_text_objects', { + \ 'iw' :0, + \ 'iW' :0, + \ 'i"' :0, + \ 'i''' :0, + \ 'i]' :1, + \ 'ib' :1, + \ 'iB' :1, + \ 'il' :0, + \ 'ip' :0, + \ 'ie' :0, + \}) + + " Option to default to the select mode when selecting a new region + let g:expand_region_use_select_mode = get(g:, 'expand_region_use_select_mode', 0) +endfunction +call expand_region#init() + +" ============================================================================== +" Global Functions +" ============================================================================== + +" Allow user to customize the global dictionary, or the per file type dictionary +function! expand_region#custom_text_objects(...) + if a:0 == 1 + call extend(g:expand_region_text_objects, a:1) + elseif a:0 == 2 + if !exists("g:expand_region_text_objects_".a:1) + let g:expand_region_text_objects_{a:1} = {} + call extend(g:expand_region_text_objects_{a:1}, g:expand_region_text_objects) + endif + call extend(g:expand_region_text_objects_{a:1}, a:2) + endif +endfunction + +" Returns whether we should perform the region highlighting use visual mode or +" select mode +function! expand_region#use_select_mode() + return g:expand_region_use_select_mode || index(split(s:saved_selectmode, ','), 'cmd') != -1 +endfunction + +" Main function +function! expand_region#next(mode, direction) + call s:expand_region(a:mode, a:direction) +endfunction + +" ============================================================================== +" Variables +" ============================================================================== + +" The saved cursor position when user initiates expand. This is the position we +" use to calcuate the region for all of our text objects. This is also used to +" restore the original cursor position when the region is completely shrinked. +let s:saved_pos = [] + +" Index into the list of filtered text objects(s:candidates), the text object +" this points to is the currently selected region. +let s:cur_index = -1 + +" The list of filtered text objects used to expand/shrink the visual selection. +" This is computed when expand-region is called the first time. +" Each item is a dictionary containing the following: +" text_object: The actual text object string +" start_pos: The result of getpos() on the starting position of the text object +" end_pos: The result of getpos() on the ending position of the text object +" length: The number of characters for the text object +let s:candidates = [] + +" This is used to save the user's selectmode setting. If the user's selectmode +" contains 'cmd', then our expansion should result in the region selected under +" select mode. +let s:saved_selectmode = &selectmode + +" ============================================================================== +" Functions +" ============================================================================== + +" Sort the text object by length in ascending order +function! s:sort_text_object(l, r) + return a:l.length - a:r.length +endfunction + +" Compare two position arrays. Each input is the result of getpos(). Return a +" negative value if lhs occurs before rhs, positive value if after, and 0 if +" they are the same. +function! s:compare_pos(l, r) + " If number lines are the same, compare columns + return a:l[1] ==# a:r[1] ? a:l[2] - a:r[2] : a:l[1] - a:r[1] +endfunction + +" Boundary check on the cursor position to make sure it's inside the text object +" region. Return 1 if the cursor is within range, 0 otherwise. +function! s:is_cursor_inside(pos, region) + if s:compare_pos(a:pos, a:region.start_pos) < 0 + return 0 + endif + if s:compare_pos(a:pos, a:region.end_pos) > 0 + return 0 + endif + return 1 +endfunction + +" Remove duplicates from the candidate list. Two candidates are duplicates if +" they cover the exact same region (same length and same starting position) +function! s:remove_duplicate(input) + let i = len(a:input) - 1 + while i >= 1 + if a:input[i].length ==# a:input[i-1].length && + \ a:input[i].start_pos ==# a:input[i-1].start_pos + call remove(a:input, i) + endif + let i-=1 + endwhile +endfunction + +" Return a single candidate dictionary. Each dictionary contains the following: +" text_object: The actual text object string +" start_pos: The result of getpos() on the starting position of the text object +" end_pos: The result of getpos() on the ending position of the text object +" length: The number of characters for the text object +function! s:get_candidate_dict(text_object) + " Store the current view so we can restore it at the end + let winview = winsaveview() + + " Use ! as much as possible + exec 'normal! v' + exec 'silent! normal '.a:text_object + " The double quote is important + exec "normal! \" + + let selection = s:get_visual_selection() + let ret = { + \ "text_object": a:text_object, + \ "start_pos": selection.start_pos, + \ "end_pos": selection.end_pos, + \ "length": selection.length, + \} + + " Restore peace + call winrestview(winview) + return ret +endfunction + + +" Return dictionary of text objects that are to be used for the current +" filetype. Filetype-specific dictionaries will be loaded if they exist +" and the global dictionary will be used as a fallback. +function! s:get_configuration() + let configuration = {} + for ft in split(&ft, '\.') + if exists("g:expand_region_text_objects_".ft) + call extend(configuration, g:expand_region_text_objects_{ft}) + endif + endfor + + if empty(configuration) + call extend(configuration, g:expand_region_text_objects) + endif + + return configuration +endfunction + +" Return list of candidate dictionary. Each dictionary contains the following: +" text_object: The actual text object string +" start_pos: The result of getpos() on the starting position of the text object +" length: The number of characters for the text object +function! s:get_candidate_list() + " Turn off wrap to allow recursive search to work without triggering errors + let save_wrapscan = &wrapscan + set nowrapscan + + let config = s:get_configuration() + + " Generate the candidate list for every defined text object + let candidates = keys(config) + call map(candidates, "s:get_candidate_dict(v:val)") + + " For the ones that are recursive, generate them until they no longer match + " any region + let recursive_candidates = [] + for i in candidates + " Continue if not recursive + if !config[i.text_object] + continue + endif + " If the first level is already empty, no point in going any further + if i.length ==# 0 + continue + endif + let l:count = 2 + let previous = i.length + while 1 + let test = l:count.i.text_object + let candidate = s:get_candidate_dict(test) + if candidate.length ==# 0 + break + endif + " If we're not producing larger regions, end early + if candidate.length ==# previous + break + endif + call add(recursive_candidates, candidate) + let l:count+=1 + let previous = candidate.length + endwhile + endfor + + " Restore wrapscan + let &wrapscan = save_wrapscan + + return extend(candidates, recursive_candidates) +endfunction + +" Return a dictionary containing the start position, end position and length of +" the current visual selection. +function! s:get_visual_selection() + let start_pos = getpos("'<") + let end_pos = getpos("'>") + let [lnum1, col1] = start_pos[1:2] + let [lnum2, col2] = end_pos[1:2] + let lines = getline(lnum1, lnum2) + let lines[-1] = lines[-1][: col2 - 1] + let lines[0] = lines[0][col1 - 1:] + return { + \ 'start_pos': start_pos, + \ 'end_pos': end_pos, + \ 'length': len(join(lines, "\n")) + \} +endfunction + +" Figure out whether we should compute the candidate text objects, or we're in +" the middle of an expand/shrink. +function! s:should_compute_candidates(mode) + if a:mode ==# 'v' + " Check that current visual selection is idential to our last expanded + " region + if s:cur_index >= 0 + let selection = s:get_visual_selection() + if s:candidates[s:cur_index].start_pos ==# selection.start_pos + \ && s:candidates[s:cur_index].length ==# selection.length + return 0 + endif + endif + endif + return 1 +endfunction + +" Computes the list of text object candidates to be used given the current +" cursor position. +function! s:compute_candidates(cursor_pos) + " Reset index into the candidates list + let s:cur_index = -1 + + " Save the current cursor position so we can restore it later + let s:saved_pos = a:cursor_pos + + " Compute a list of candidate regions + let s:candidates = s:get_candidate_list() + + " Sort them and remove the ones with 0 or 1 length + call filter(sort(s:candidates, "s:sort_text_object"), 'v:val.length > 1') + + " Filter out the ones where the cursor falls outside of its region. i" and i' + " can start after the cursor position, and ib can start before, so both checks + " are needed + call filter(s:candidates, 's:is_cursor_inside(s:saved_pos, v:val)') + + " Remove duplicates + call s:remove_duplicate(s:candidates) +endfunction + +" Perform the visual selection at the end. If the user wants to be left in +" select mode, do so +function! s:select_region() + exec 'normal! v' + exec 'normal '.s:candidates[s:cur_index].text_object + if expand_region#use_select_mode() + exec "normal! \" + endif +endfunction + +" Expand or shrink the visual selection to the next candidate in the text object +" list. +function! s:expand_region(mode, direction) + " Save the selectmode setting, and remove the setting so our 'v' command do + " not get interfered + let s:saved_selectmode = &selectmode + let &selectmode="" + + if s:should_compute_candidates(a:mode) + call s:compute_candidates(getpos('.')) + else + call setpos('.', s:saved_pos) + endif + + if a:direction ==# '+' + " Expanding + if s:cur_index ==# len(s:candidates) - 1 + normal! gv + else + let s:cur_index+=1 + " Associate the window view with the text object + let s:candidates[s:cur_index].prev_winview = winsaveview() + call s:select_region() + endif + else + "Shrinking + if s:cur_index <=# 0 + " In visual mode, doing nothing here will return us to normal mode. For + " select mode, the following is needed. + if expand_region#use_select_mode() + exec "normal! gV" + endif + else + " Restore the window view + call winrestview(s:candidates[s:cur_index].prev_winview) + let s:cur_index-=1 + call s:select_region() + endif + endif + + " Restore the selectmode setting + let &selectmode = s:saved_selectmode +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/sources_non_forked/vim-expand-region/doc/expand_region.txt b/sources_non_forked/vim-expand-region/doc/expand_region.txt new file mode 100755 index 00000000..109dd721 --- /dev/null +++ b/sources_non_forked/vim-expand-region/doc/expand_region.txt @@ -0,0 +1,126 @@ +*vim-expand-region.txt* Incremental visual selection + + __ _ + ___ _ ______ ____ _____ ____/ / ________ ____ _(_)___ ____ + / _ \| |/_/ __ \/ __ `/ __ \/ __ / / ___/ _ \/ __ `/ / __ \/ __ \ + / __/> + + map K (expand_region_expand) + map J (expand_region_shrink) +< + +============================================================================== +4. Global Options *expand-region-global-options* + + *expand_region_text_objects* +Default: See below +Dictionary containing the text objects the plugin uses to search for the +available regions to expand/shrink to. The value corresponding to each plugin +indicates whether text object is recursive. A recursive text object is +continually expanded until the region no longer gets larger. > + + " Default settings. (NOTE: Remove comments in dictionary before sourcing) + let g:expand_region_text_objects = { + \ 'iw' :0, + \ 'iW' :0, + \ 'i"' :0, + \ 'i''' :0, + \ 'i]' :1, " Support nesting of square brackets + \ 'ib' :1, " Support nesting of parentheses + \ 'iB' :1, " Support nesting of braces + \ 'il' :0, " 'inside line'. Available through https://github.com/kana/vim-textobj-line + \ 'ip' :0, + \ 'ie' :0, " 'entire file'. Available through https://github.com/kana/vim-textobj-entire + \ } +< + +You can extend the global default dictionary by calling +'expand_region#custom_text_objects'. > + + " Extend the global default (NOTE: Remove comments in dictionary before sourcing) + call expand_region#custom_text_objects({ + \ "\/\\n\\n\": 1, " Motions are supported as well. Here's a search motion that finds a blank line + \ 'a]' :1, " Support nesting of 'around' brackets + \ 'ab' :1, " Support nesting of 'around' parentheses + \ 'aB' :1, " Support nesting of 'around' braces + \ 'ii' :0, " 'inside indent'. Available through https://github.com/kana/vim-textobj-indent + \ 'ai' :0, " 'around indent'. Available through https://github.com/kana/vim-textobj-indent + \ }) +< + +You can further customize the text objects dictionary on a per filetype basis +by defining global variables like 'g:expand_region_text_objects_{ft}'. > + + " Use the following setting for ruby. (NOTE: Remove comments in dictionary before sourcing) + let g:expand_region_text_objects_ruby = { + \ 'im' :0, " 'inner method'. Available through https://github.com/vim-ruby/vim-ruby + \ 'am' :0, " 'around method'. Available through https://github.com/vim-ruby/vim-ruby + \ } +< + +Note that this completely replaces the default dictionary. To extend the +default on a per filetype basis, you can call +'expand_region#custom_text_objects' by passing in the filetype in the first +argument: > + + " Use the global default + the following for ruby + call expand_region#custom_text_objects('ruby', { + \ 'im' :0, + \ 'am' :0, + \ }) +< + *expand_region_use_select_mode* +Default: 0 +By default, after an expansion, the plugin leaves you in visual mode. If your +'selectmode' contains "cmd", then the plugin will respect that setting and +leave you in select mode. If you don't have 'selectmode' set, but would +like to default the expansion in select mode, you can use the global setting +below: > + + let g:expand_region_use_select_mode = 1 +< + +============================================================================== +5. About *expand-region-about* +============================================================================== + +Find the latest version of the plugin here: + http://github.com/terryma/vim-expand-region + + vim:tw=78:sw=4:ft=help:norl: diff --git a/sources_non_forked/vim-expand-region/doc/tags b/sources_non_forked/vim-expand-region/doc/tags new file mode 100644 index 00000000..402a0c43 --- /dev/null +++ b/sources_non_forked/vim-expand-region/doc/tags @@ -0,0 +1,10 @@ +expand-region-about expand_region.txt /*expand-region-about* +expand-region-contents expand_region.txt /*expand-region-contents* +expand-region-global-options expand_region.txt /*expand-region-global-options* +expand-region-intro expand_region.txt /*expand-region-intro* +expand-region-mappings expand_region.txt /*expand-region-mappings* +expand-region-usage expand_region.txt /*expand-region-usage* +expand_region_text_objects expand_region.txt /*expand_region_text_objects* +expand_region_use_select_mode expand_region.txt /*expand_region_use_select_mode* +vim-expand-region.txt expand_region.txt /*vim-expand-region.txt* +vim-expand-regions expand_region.txt /*vim-expand-regions* diff --git a/sources_non_forked/vim-expand-region/expand-region.gif b/sources_non_forked/vim-expand-region/expand-region.gif new file mode 100755 index 0000000000000000000000000000000000000000..00aa5b3391997f3cb7a67b32b1239a30cae35bf6 GIT binary patch literal 770749 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%0A|YywY>0ek*H9~La_fj&Lk=S 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

            U8;`EBC$k-jf2)-!c7Mapa8C_=-gJw4MMm4( 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⋘̸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

            tJJ;q{h@T%RzneJLn+4Zy^RWue!gG!^0 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¥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

            52tLJ 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 PvTZ{x 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

            n&^ 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 literal 0 HcmV?d00001 diff --git a/sources_non_forked/vim-multiple-cursors/assets/example3.gif b/sources_non_forked/vim-multiple-cursors/assets/example3.gif new file mode 100755 index 0000000000000000000000000000000000000000..f4ab9876fb8e581d3b605833d782dcaccb904014 GIT binary patch literal 186260 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

            Y=>}sFwg~>R2tq``c?;hX}vTV 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

            X#)=$o_r^b7zAeuJra??KDX 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 z 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 z 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 botQ+?5`H^Ru}vv (multi_cursor_process_user_input) + \ :call process_user_inut('i') +nnoremap (multi_cursor_process_user_input) + \ :call process_user_inut('n') +xnoremap (multi_cursor_process_user_input) + \ :call process_user_inut('v') + +inoremap (multi_cursor_apply_user_input_next) + \ :call apply_user_input_next('i') +nnoremap (multi_cursor_apply_user_input_next) + \ :call apply_user_input_next('n') +xnoremap (multi_cursor_apply_user_input_next) + \ :call apply_user_input_next('v') + +"=============================================================================== +" Public Functions +"=============================================================================== + +" Reset everything the plugin has done +function! multiple_cursors#reset() + call s:cm.reset() +endfunction + +" Creates a new cursor. Different logic applies depending on the mode the user +" is in and the current state of the buffer. +" 1. In normal mode, a new cursor is created at the end of the word under Vim's +" normal cursor +" 2. In visual mode, if the visual selection covers more than one line, a new +" cursor is created at the beginning of each line +" 3. In visual mode, if the visual selection covers a single line, a new cursor +" is created at the end of the visual selection. Another cursor will be +" attempted to be created at the next occurrence of the visual selection +function! multiple_cursors#new(mode) + if a:mode ==# 'n' + " Reset all existing cursors + call s:cm.reset() + + " Select the word under cursor to set the '< and '> marks + exec "normal! viw\" + normal! gv + + call s:create_cursor_from_visual_selection() + + call s:wait_for_user_input('v') + elseif a:mode ==# 'v' + " If the visual area covers the same line, then do a search for next + " occurrence + let start = line("'<") + let finish = line("'>") + if start != finish + call s:cm.reset() + for line in range(line("'<"), line("'>")) + call cursor(line, col("'<")) + call s:cm.add() + endfor + " Start in normal mode + call s:wait_for_user_input('n') + else + " Came directly from visual mode + if s:cm.is_empty() + call s:create_cursor_from_visual_selection() + call s:exit_visual_mode() + endif + " Select the next ocurrence + call s:select_next_occurrence(s:get_visual_selection()) + " Try to place a cursor there, reselect old cursor if fails + if !s:cm.add() + call s:exit_visual_mode() + " Adding cursor failed, this mean the new cursor is already added + call s:cm.reapply_visual_selection() + endif + call s:wait_for_user_input('v') + endif + endif +endfunction + +" Delete the current cursor and move Vim's cursor back to the previous cursor +function! multiple_cursors#prev() + if s:cm.is_empty() + normal! gv + return + endif + call s:cm.delete_current() + " If that was the last cursor, go back to normal mode + if s:cm.is_empty() + call s:cm.reset() + else + call s:cm.reapply_visual_selection() + call s:wait_for_user_input('v') + endif +endfunction + +" Skip the current cursor and move to the next cursor +function! multiple_cursors#skip() + if s:cm.is_empty() + normal! gv + return + endif + call s:cm.delete_current() + call s:select_next_occurrence(s:get_visual_selection()) + call s:cm.add() + call s:wait_for_user_input('v') +endfunction + +"=============================================================================== +" Cursor class +"=============================================================================== +let s:Cursor = {} + +" Create a new cursor. Highlight it and save the current line length +function! s:Cursor.new(position) + let obj = copy(self) + let obj.position = a:position + let obj.visual = [] + let obj.cursor_hi_id = s:highlight_cursor(a:position) + let obj.visual_hi_id = 0 + let obj.line_length = col([a:position[1], '$']) + return obj +endfunction + +" Return the line the cursor is on +function! s:Cursor.line() dict + return self.position[1] +endfunction + +" Return the column the cursor is on +function! s:Cursor.column() dict + return self.position[2] +endfunction + +" Move the cursor location by the number of lines and columns specified in the +" input. The input can be negative. +function! s:Cursor.move(line, column) dict + let self.position[1] += a:line + let self.position[2] += a:column + if !empty(self.visual) + let self.visual[0][1] += a:line + let self.visual[0][2] += a:column + let self.visual[1][1] += a:line + let self.visual[1][2] += a:column + endif + call self.update_highlight() +endfunction + +" Update the current position of the cursor +function! s:Cursor.update_position(pos) dict + let self.position = a:pos + call self.update_highlight() +endfunction + +" Reapply the highlight on the cursor +function! s:Cursor.update_highlight() dict + call s:cm.remove_highlight(self.cursor_hi_id) + let self.cursor_hi_id = s:highlight_cursor(self.position) +endfunction + +" Refresh the length of the line the cursor is on. This could change from +" underneath +function! s:Cursor.update_line_length() dict + let self.line_length = col([self.line(), '$']) +endfunction + +" Update the visual selection and its highlight +function! s:Cursor.update_visual_selection(region) dict + let self.visual = a:region + call s:cm.remove_highlight(self.visual_hi_id) + let self.visual_hi_id = s:highlight_region(a:region) +endfunction + +" Remove the visual selection and its highlight +function! s:Cursor.remove_visual_selection() dict + let self.visual = [] + " TODO(terryma): Move functionality into separate class + call s:cm.remove_highlight(self.visual_hi_id) + let self.visual_hi_id = 0 +endfunction + +"=============================================================================== +" CursorManager class +"=============================================================================== +let s:CursorManager = {} + +" Constructor +function! s:CursorManager.new() + let obj = copy(self) + let obj.cursors = [] + let obj.current_index = -1 + let obj.starting_index = -1 + let obj.saved_settings = { + \ 'virtualedit': &virtualedit, + \ 'cursorline': &cursorline, + \ } + return obj +endfunction + +" Clear all cursors and their highlights +function! s:CursorManager.reset() dict + call clearmatches() + let self.cursors = [] + let self.current_index = -1 + let self.starting_index = -1 + call self.restore_user_settings() + " FIXME(terryma): Doesn't belong here + let s:from_mode = '' + let s:to_mode = '' +endfunction + +" Returns 0 if it's not managing any cursors at the moment +function! s:CursorManager.is_empty() dict + return self.size() == 0 +endfunction + +" Returns the number of cursors it's managing +function! s:CursorManager.size() dict + return len(self.cursors) +endfunction + +" Returns the current cursor +function! s:CursorManager.get_current() dict + return self.cursors[self.current_index] +endfunction + +" Returns the cursor at index i +function! s:CursorManager.get(i) dict + return self.cursors[a:i] +endfunction + +" Removes the current cursor and all its associated highlighting. Also update +" the current index +function! s:CursorManager.delete_current() dict + call self.remove_highlight(self.get_current().cursor_hi_id) + call self.remove_highlight(self.get_current().visual_hi_id) + call remove(self.cursors, self.current_index) + let self.current_index -= 1 +endfunction + +" Remove the highlighting if it matchid exists +function! s:CursorManager.remove_highlight(hi_id) dict + if a:hi_id + call matchdelete(a:hi_id) + endif +endfunction + +function! s:CursorManager.debug() dict + let i = 0 + for c in self.cursors + echom 'cursor #'.i.': '.string(c) + let i+=1 + endfor + echom 'last key = '.s:char + echom 'current cursor = '.self.current_index + echom 'current pos = '.string(getpos('.')) + echom 'last visual begin = '.string(getpos("'<")) + echom 'last visual end = '.string(getpos("'>")) + echom 'current mode = '.mode() + echom 'current mode custom = '.s:to_mode + echom 'prev mode custom = '.s:from_mode + echom ' ' +endfunction + +" Sync the current cursor to the current Vim cursor. This includes updating its +" location, its highlight, and potentially its visual region. Return true if the +" position changed, false otherwise +function! s:CursorManager.update_current() dict + let cur = self.get_current() + if s:to_mode ==# 'v' + call cur.update_visual_selection(s:get_current_visual_selection()) + call s:exit_visual_mode() + else + call cur.remove_visual_selection() + endif + + let vdelta = line('$') - s:saved_linecount + " If the cursor changed line, and the total number of lines changed + if vdelta != 0 && cur.line() != line('.') + if self.current_index != self.size() - 1 + let cur_line_length = len(getline(cur.line())) + let new_line_length = len(getline('.')) + for i in range(self.current_index+1, self.size()-1) + let hdelta = 0 + " If there're other cursors on the same line, we need to adjust their + " columns. This needs to happen before we adjust their line! + if cur.line() == self.get(i).line() + if vdelta > 0 + " Added a line + let hdelta = cur_line_length * -1 + else + " Removed a line + let hdelta = new_line_length + endif + endif + call self.get(i).move(vdelta, hdelta) + endfor + endif + else + " If the line length changes, for all the other cursors on the same line as + " the current one, update their cursor location as well + let hdelta = col('$') - cur.line_length + " Only do this if we're still on the same line as before + if hdelta != 0 && cur.line() == line('.') + " Update all the cursor's positions that occur after the current cursor on + " the same line + if self.current_index != self.size() - 1 + for i in range(self.current_index+1, self.size()-1) + " Only do it for cursors on the same line + if cur.line() == self.get(i).line() + call self.get(i).move(0, hdelta) + else + " Early exit, if we're not on the same line, neither will any cursor + " that come after this + break + endif + endfor + endif + endif + endif + + let pos = getpos('.') + if cur.position == pos + return 0 + endif + call cur.update_position(pos) + return 1 +endfunction + +" Advance to the next cursor +function! s:CursorManager.next() dict + let self.current_index = (self.current_index + 1) % self.size() +endfunction + +" Start tracking cursor updates +function! s:CursorManager.start_loop() dict + let self.starting_index = self.current_index +endfunction + +" Returns true if we're cycled through all the cursors +function! s:CursorManager.loop_done() dict + return self.current_index == self.starting_index +endfunction + +" Tweak some user settings. This is called every time multicursor mode is +" entered. +" virtualedit needs to be set to onemore for updates to work correctly +" cursorline needs to be turned off for the cursor highlight to work on the line +" where the real vim cursor is +function! s:CursorManager.initialize() dict + let &virtualedit = "onemore" + let &cursorline = 0 +endfunction + +" Restore user settings. +function! s:CursorManager.restore_user_settings() dict + if !empty(self.saved_settings) + let &virtualedit = self.saved_settings['virtualedit'] + let &cursorline = self.saved_settings['cursorline'] + endif +endfunction + +" Reselect the current cursor's region in visual mode +function! s:CursorManager.reapply_visual_selection() dict + call s:select_in_visual_mode(self.get_current().visual) +endfunction + +" Creates a new multicursor at the current Vim cursor location. Return true if +" the cursor has been successfully added, false otherwise +function! s:CursorManager.add() dict + " Lazy init + if self.is_empty() + call self.initialize() + endif + + let pos = getpos('.') + + " Don't add duplicates + let i = 0 + for c in self.cursors + if c.position == pos + return 0 + endif + let i+=1 + endfor + + let cursor = s:Cursor.new(pos) + + " Save the visual selection + if mode() ==# 'v' + call cursor.update_visual_selection(s:get_current_visual_selection()) + endif + + call add(self.cursors, cursor) + let self.current_index += 1 + return 1 +endfunction + +"=============================================================================== +" Variables +"=============================================================================== + +" This is the last user input that we're going to replicate, in its string form +let s:char = '' +" This is the mode the user is in before s:char +let s:from_mode='' +" This is the mode the user is in after s:char +let s:to_mode='' +" This is the total number of lines in the buffer before processing s:char +let s:saved_linecount=-1 +" These keys will not be replcated at every cursor location +let s:special_keys = [ + \ g:multi_cursor_next_key, + \ g:multi_cursor_prev_key, + \ g:multi_cursor_skip_key, + \ ] +" The highlight group we use for all the cursors +let s:hi_group_cursor = 'multiple_cursors_cursor' +" The highlight group we use for all the visual selection +let s:hi_group_visual = 'multiple_cursors_visual' + +" Singleton cursor manager instance +let s:cm = s:CursorManager.new() + +"=============================================================================== +" Initialization +"=============================================================================== +if !hlexists(s:hi_group_cursor) + exec "highlight ".s:hi_group_cursor." term=reverse cterm=reverse gui=reverse" +endif +if !hlexists(s:hi_group_visual) + exec "highlight link ".s:hi_group_visual." Visual" +endif + +"=============================================================================== +" Utility functions +"=============================================================================== + +" Exit visual mode and go back to normal mode +" Precondition: In visual mode +" Postcondition: In normal mode, cursor in the same location as visual mode +" The reason for the additional gv\ is that it allows the cursor to stay +" on where it was before exiting +function! s:exit_visual_mode() + exec "normal! \gv\" +endfunction + +" Visually select input region, where region is an array containing the start +" and end position. If start is after end, the selection simply goes backwards. +" Typically m<, m>, and gv would be a simple way of accomplishing this, but on +" some systems, the m< and m> marks are not supported. Note that v`` has random +" behavior if `` is the same location as the cursor location. +" Precondition: In normal mode +" Postcondition: In visual mode, with the region selected +function! s:select_in_visual_mode(region) + call setpos('.', a:region[0]) + call setpos("'`", a:region[1]) + if getpos('.') == getpos("'`") + normal! v + else + normal! v`` + endif +endfunction + +" Highlight the position using the cursor highlight group +function! s:highlight_cursor(pos) + " Give cursor highlight high priority, to overrule visual selection + return matchadd(s:hi_group_cursor, '\%'.a:pos[1].'l\%'.a:pos[2].'v', 99999) +endfunction + +" Compare two position arrays. Each input is the result of getpos(). Return a +" negative value if lhs occurs before rhs, positive value if after, and 0 if +" they are the same. +function! s:compare_pos(l, r) + " If number lines are the same, compare columns + return a:l[1] ==# a:r[1] ? a:l[2] - a:r[2] : a:l[1] - a:r[1] +endfunction + +" Highlight the area bounded by the input region. The logic here really stinks, +" it's frustrating that Vim doesn't have a built in easier way to do this. None +" of the \%V or \%'m solutions work because we need the highlighting to stay for +" multiple places. +function! s:highlight_region(region) + let s = sort(copy(a:region), "s:compare_pos") + if (s[0][1] == s[1][1]) + " Same line + let pattern = '\%'.s[0][1].'l\%>'.(s[0][2]-1).'v.*\%<'.(s[1][2]+1).'v.' + else + " Two lines + let s1 = '\%'.s[0][1].'l.\%>'.s[0][2].'v.*' + let s2 = '\%'.s[1][1].'l.*\%<'.s[1][2].'v..' + let pattern = s1.'\|'.s2 + if (s[1][1] - s[0][1] > 1) + let pattern = pattern.'\|\%>'.s[0][1].'l\%<'.s[1][1].'l' + endif + endif + return matchadd(s:hi_group_visual, pattern) +endfunction + +" Perform the operation that's necessary to revert us from one mode to another +function! s:revert_mode(from, to) + if a:to ==# 'v' + call s:cm.reapply_visual_selection() + endif + if a:to ==# 'i' + startinsert + endif + if a:to ==# 'n' && a:from ==# 'i' + stopinsert + endif + if a:to ==# 'n' && a:from ==# 'v' + " TODO(terryma): Hmm this would cause visual to normal mode to break. + " Strange + " call s:exit_visual_mode() + endif +endfunction + +" Consume all the additional character the user typed between the last +" getchar() and here, to avoid potential race condition. +" TODO(terryma): This solves the problem of cursors getting out of sync, but +" we're potentially losing user input. We COULD replay these characters as +" well... +function! s:feedkeys(keys) + while 1 + let c = getchar(0) + " Checking type is important, when strings are compared with integers, + " strings are always converted to ints, and all strings are equal to 0 + if type(c) == 0 && c == 0 + break + endif + endwhile + call feedkeys(a:keys) +endfunction + +" Take the user input and apply it at every cursor +function! s:process_user_inut(mode) + " Grr this is frustrating. In Insert mode, between the feedkey call and here, + " the current position could actually CHANGE for some odd reason. Forcing a + " position reset here + call setpos('.', s:cm.get_current().position) + + " Before applying the user input, we need to revert back to the mode the user + " was in when the input was entered + call s:revert_mode(s:to_mode, s:from_mode) + + " Update the line length BEFORE applying any actions. TODO(terryma): Is there + " a better place to do this? + call s:cm.get_current().update_line_length() + let s:saved_linecount = line('$') + + " Apply the user input. Note that the above could potentially change mode, we + " use the mapping below to help us determine what the new mode is + call s:feedkeys(s:char."\(multi_cursor_apply_user_input_next)") +endfunction + +" Apply the user input at the next cursor location +function! s:apply_user_input_next(mode) + " Save the current mode + let s:to_mode = a:mode + + " Update the current cursor's information + let changed = s:cm.update_current() + + " Advance the cursor index + call s:cm.next() + + " Update Vim's cursor + call setpos('.', s:cm.get_current().position) + + " We're done if we're made the full round + if s:cm.loop_done() + " If we stay in visual mode, we need to reselect the original cursor + if s:to_mode ==# 'v' + call s:cm.reapply_visual_selection() + endif + call s:wait_for_user_input(s:to_mode) + else + " Continue to next + call s:process_user_inut(s:from_mode) + endif +endfunction + +" Precondition: In visual mode with selected text +" Postcondition: A new cursor is placed at the end of the selected text +function! s:create_cursor_from_visual_selection() + " Get the text for the current visual selection + let selection = s:get_visual_selection() + + " Go to the end of the visual selection + call cursor(line("'<"), col("'>")) + + " Add the current at the new location + call s:cm.add() +endfunction + +" Precondition: In visual mode +" Postcondition: Remain in visual mode +" Return array of start and end position of visual selection +" This should be available from the '< and '> registers, but it fails to work +" correctly on some systems until visual mode quits. So we force quitting in +" visual mode and reselecting the region afterwards +function! s:get_current_visual_selection() + call s:exit_visual_mode() + let left = getpos("'<") + let right = getpos("'>") + if getpos('.') == left + let region = [right, left] + else + let region = [left, right] + endif + call s:select_in_visual_mode(region) + return region +endfunction + +" Return the content of the current visual selection. This is used to find the +" next match in the buffer +function! s:get_visual_selection() + normal! gv + let start_pos = getpos("'<") + let end_pos = getpos("'>") + let [lnum1, col1] = start_pos[1:2] + let [lnum2, col2] = end_pos[1:2] + let lines = getline(lnum1, lnum2) + let lines[-1] = lines[-1][: col2 - 1] + let lines[0] = lines[0][col1 - 1:] + return join(lines, "\n") +endfunction + +" Visually select the next occurrence of the input text in the buffer +function! s:select_next_occurrence(text) + call s:exit_visual_mode() + let pattern = '\V\C'.substitute(escape(a:text, '\'), '\n', '\\n', 'g') + call search(pattern) + let start = getpos('.') + call search(pattern, 'ce') + let end = getpos('.') + call s:select_in_visual_mode([start, end]) +endfunction + +" Wrapper around getchar() that returns the string representation of the user +" input +function! s:get_char() + let c = getchar() + " If the character is a number, then it's not a special key + if type(c) == 0 + let c = nr2char(c) + endif + return c +endfunction + +" Quits multicursor mode and clears all cursors. Return true if exited +" successfully. +function! s:exit() + if s:char ==# g:multi_cursor_quit_key && + \ (s:from_mode ==# 'n' || + \ s:from_mode ==# 'v' && g:multi_cursor_exit_from_visual_mode || + \ s:from_mode ==# 'i' && g:multi_cursor_exit_from_insert_mode) + if s:from_mode ==# 'i' + stopinsert + elseif s:from_mode ==# 'v' + call s:exit_visual_mode() + endif + call s:cm.reset() + return 1 + endif + return 0 +endfunction + +" Take users input and figure out what to do with it +function! s:wait_for_user_input(mode) + let s:from_mode = a:mode + let s:to_mode = '' + redraw + let s:char = s:get_char() + redraw + + if s:exit() + return + endif + + let feedkeys = '' + if index(s:special_keys, s:char) != -1 + let feedkeys = s:char + else + call s:cm.start_loop() + let feedkeys = "\(multi_cursor_process_user_input)" + endif + call s:feedkeys(feedkeys) +endfunction diff --git a/sources_non_forked/vim-multiple-cursors/doc/multiple_cursors.txt b/sources_non_forked/vim-multiple-cursors/doc/multiple_cursors.txt new file mode 100755 index 00000000..75af3d45 --- /dev/null +++ b/sources_non_forked/vim-multiple-cursors/doc/multiple_cursors.txt @@ -0,0 +1,174 @@ +*vim-multiple-cursors.txt* True Sublime Text multiple selection in Vim + + ____ _ __ + ____ ___ __ __/ / /_(_)___ / /__ _______ ________________ __________ + / __ `__ \/ / / / / __/ / __ \/ / _ \ / ___/ / / / ___/ ___/ __ \/ ___/ ___/ + / / / / / / /_/ / / /_/ / /_/ / / __/ / /__/ /_/ / / (__ ) /_/ / / (__ ) +/_/ /_/ /_/\__,_/_/\__/_/ .___/_/\___/ \___/\__,_/_/ /____/\____/_/ /____/ + /_/ + + + Reference Manual~ + + +============================================================================== + +CONTENTS *multiple-cursors-contents* + 1.Intro...................................|multiple-cursors-intro| + 2.Usage...................................|multiple-cursors-usage| + 3.Mappings................................|multiple-cursors-mappings| + 4.Global Options..........................|multiple-cursors-global-options| + 5.Issues..................................|multiple-cursors-issues| + 6.Contributing............................|multiple-cursors-contributing| + 7.License.................................|multiple-cursors-license| + 8.Credit..................................|multiple-cursors-credit| + 9.References..............................|multiple-cursors-references| + +============================================================================== +1. Intro *multiple-cursors-intro* + +There [1] have [2] been [3] many [4] attempts [5] at bringing Sublime Text's +awesome multiple selection [6] feature into Vim, but none so far have been in +my opinion a faithful port that is simplistic to use, yet powerful and +intuitive enough for an existing Vim user. *vim-multiple-cursors* is yet +another attempt at that. + +============================================================================== +2. Usage *multiple-cursors-usage* + +Out of the box, all you need to know is a single key CTRL-N. Pressing the key +in Normal mode highlights the current word under the cursor in Visual mode and +places a virtual cursor at the end of it. Pressing it again finds the next +ocurrence and places another virtual cursor at the end of the visual +selection. If you select multiple lines in Visual mode, pressing the key puts +a virtual cursor at every line and leaves you in Normal mode. + +After you've marked all your locations with CTRL-N, you can change the visual +selection with normal Vim motion commands in Visual mode. You could go to +Normal mode by pressing v and wield your motion commands there. Single key +command to switch to Insert mode such as `c` or `s` from Visual mode or `i`, +`a`, `I`, `A` in Normal mode should work without any issues. + +At any time, you can press to exit back to regular Vim. + +Two additional keys are also mapped: + +CTRL-P in Visual mode will remove the current virtual cursor and go back to +the previous virtual cursor location. This is useful if you are trigger happy +with Ctrl-n and accidentally went too far. + +CTRL-X in Visual mode will remove the current virtual cursor and skip to the +next virtual cursor location. This is useful if you don't want the current +selection to be a candidate to operate on later. + +**NOTE**: The plugin is still somewhat buggy, if at any time you have +lingering cursors on screen, you can press CTRL-N in Normal mode and it will +remove all prior cursors before starting a new one. + +============================================================================== +3. Mappings *multiple-cursors-mappings* + +*g:multi_cursor_use_default_mapping* (Default: 1) + +Out of the box, CTRL-N, CTRL-P, and CTRL-X are mapped by default. If you don't +like the plugin taking over your favorite key bindings, then turn off the +default with > + + let g:multi_cursor_use_default_mapping=0 +< + +*g:multi_cursor_next_key* (Default: "\") +*g:multi_cursor_prev_key* (Default: "\") +*g:multi_cursor_skip_key* (Default: "\") +*g:multi_cursor_exit_key* (Default: "\") +You can map the 'next', 'previous', 'skip', and 'exit' keys like the +following: > + + " Default mapping + let g:multi_cursor_next_key="\" + let g:multi_cursor_prev_key="\" + let g:multi_cursor_skip_key="\" + let g:multi_cursor_exit_key="\" +< + +============================================================================== +4. Global Options *multiple-cursors-global-options* + +Currently there're two additional global settings one can tweak: + +*g:multi_cursor_exit_from_visual_mode* (Defaut: 1) + +If set to 0, then pressing |g:multi_cursor_exit_key| in Visual mode will not +quit and delete all existing cursors. This is useful if you want to press +Escape and go back to Normal mode, and still be able to operate on all the +cursors. + +*g:multi_cursor_exit_from_insert_mode* (Default: 1) + +If set to 0, then pressing |g:multi_cursor_exit_key| in Insert mode will not +quit and delete all existing cursors. This is useful if you want to press +Escape and go back to Normal mode, and still be able to operate on all the +cursors. + +The plugin uses the highlight group `multiple_cursors_cursor` and +`multiple_cursors_visual` to highlight the virtual cursors and their visual +selections respectively. You can customize them by putting something similar +like the following in your vimrc: > + + " Default highlighting (see help :highlight and help :highlight-link) + highlight multiple_cursors_cursor term=reverse cterm=reverse gui=reverse + highlight link multiple_cursors_visual Visual +< + +============================================================================== +5. Issues *multiple-cursors-issues* + +- Multi key commands like ciw do not work at the moment +- All user input typed before Vim is able to fan out the last operation to all + cursors is lost. This is a implementation decision to keep the input + perfectly synced in all locations, at the cost of potentially losing user + input. +- Single key commands that do not terminate properly cause unexpected + behavior. For example, if the cursor is on the first character in the buffer + and 'b' is pressed. +- Undo behavior is unpredictable +- Performance in terminal vim degrades significantly with more cursors +- Select mode is not implemented +- Buggy when wrap is turned on +- Cursor highlighting is off. The last column on the same row as Vim's cursor + is not highlighted incorrectly. Setting virtualedit=all might help + +============================================================================== +6. Contributing *multiple-cursors-contributing* + +The project is hosted on Github. Patches, feature requests and suggestions are +always welcome! + +Find the latest version of the plugin here: + http://github.com/terryma/vim-multiple-cursors + +============================================================================== +7. License *multiple-cursors-license* + +The project is licensed under the MIT license [7]. Copyrigth 2013 Terry Ma + +============================================================================== +8. Credit *multiple-cursors-credit* + +The plugin is obviously inspired by Sublime Text's awesome multiple selection +[6] feature. Some inspiration was also taken from Emac's multiple cursors [8] +implementation. + +============================================================================== +9. References *multiple-cursors-references* + +[1] https://github.com/paradigm/vim-multicursor +[2] https://github.com/felixr/vim-multiedit +[3] https://github.com/hlissner/vim-multiedit +[4] https://github.com/adinapoli/vim-markmultiple +[5] https://github.com/AndrewRadev/multichange.vim +[6] http://www.sublimetext.com/docs/2/multiple_selection_with_the_keyboard.html +[7] http://opensource.org/licenses/MIT +[8] https://github.com/magnars/multiple-cursors.el + + vim:tw=78:sw=4:ft=help:norl: diff --git a/sources_non_forked/vim-multiple-cursors/doc/tags b/sources_non_forked/vim-multiple-cursors/doc/tags new file mode 100644 index 00000000..97741cb1 --- /dev/null +++ b/sources_non_forked/vim-multiple-cursors/doc/tags @@ -0,0 +1,19 @@ +g:multi_cursor_exit_from_insert_mode multiple_cursors.txt /*g:multi_cursor_exit_from_insert_mode* +g:multi_cursor_exit_from_visual_mode multiple_cursors.txt /*g:multi_cursor_exit_from_visual_mode* +g:multi_cursor_exit_key multiple_cursors.txt /*g:multi_cursor_exit_key* +g:multi_cursor_next_key multiple_cursors.txt /*g:multi_cursor_next_key* +g:multi_cursor_prev_key multiple_cursors.txt /*g:multi_cursor_prev_key* +g:multi_cursor_skip_key multiple_cursors.txt /*g:multi_cursor_skip_key* +g:multi_cursor_use_default_mapping multiple_cursors.txt /*g:multi_cursor_use_default_mapping* +multiple-cursors-contents multiple_cursors.txt /*multiple-cursors-contents* +multiple-cursors-contributing multiple_cursors.txt /*multiple-cursors-contributing* +multiple-cursors-credit multiple_cursors.txt /*multiple-cursors-credit* +multiple-cursors-global-options multiple_cursors.txt /*multiple-cursors-global-options* +multiple-cursors-intro multiple_cursors.txt /*multiple-cursors-intro* +multiple-cursors-issues multiple_cursors.txt /*multiple-cursors-issues* +multiple-cursors-license multiple_cursors.txt /*multiple-cursors-license* +multiple-cursors-mappings multiple_cursors.txt /*multiple-cursors-mappings* +multiple-cursors-references multiple_cursors.txt /*multiple-cursors-references* +multiple-cursors-usage multiple_cursors.txt /*multiple-cursors-usage* +vim-multiple-cursors multiple_cursors.txt /*vim-multiple-cursors* +vim-multiple-cursors.txt multiple_cursors.txt /*vim-multiple-cursors.txt* diff --git a/sources_non_forked/vim-multiple-cursors/plugin/multiple_cursors.vim b/sources_non_forked/vim-multiple-cursors/plugin/multiple_cursors.vim new file mode 100755 index 00000000..e2273862 --- /dev/null +++ b/sources_non_forked/vim-multiple-cursors/plugin/multiple_cursors.vim @@ -0,0 +1,99 @@ +"=============================================================================== +" File: multiple_cursors.vim +" Author: Terry Ma +" Description: Emulate Sublime Text's multi selection feature +" Issues: +" - Performance in terminal vim degrades significantly with more cursors +" - All user input typed before Vim is able to fan out the last operation to all +" cursors is lost. This is a implementation decision to keep the input +" perfectly synced in all locations, at the cost of potentially losing user +" input. +" - Multi key commands is not supported +" - Single key commands that do not terminate properly cause unexpected +" behavior. For example, if the cursor is on the first character in the buffer +" and 'b' is pressed. +" - Undo behavior is unpredictable +" - Select mode is not implemented +" - There is a bug with selection and highlight when wrap is on +" +" Potential Features: +" - Create a blinking cursor effect? Good place to do it would be instead of +" waiting for user input, cycle through the highlight +" - Integrate with the status line? Maybe show a special multicursor mode? +" - Support mouse? Ctrl/Cmd click to set cursor? +" +" Features: +" - Real time update of cursor locations +" - In normal mode, pressing will highlight the current word under cursor, +" and places a 'multicursor' at the end of the word, and goes to visual mode +" - In visual mode, right after the above operation, pressing again will +" search for the word forward, and places a new cursor at the end of the +" resulting search, one can continue to do this in Visual mode, this resembles +" the Cmd-D feature of Sublime +" - In insert mode, insert operations are captures and replayed at all the +" cursor locations +" - Pressing in Normal mode quits multicursor mode and clears all cursors +" - Normal mode single keystroke commands work: +" - Works: 'w,e,i,p,a,h,j,k,l,x,v,b' +" - Does not work: '' +" - Replace mode just seems to work +" - Visual mode +" - Works: 'w,e,b,h,j,k,l,o' +" - Does not work: 'A, I', because does not get it out of normal mode +" for these commands. It takes two +"=============================================================================== +let s:save_cpo = &cpo +set cpo&vim + +function! s:init_settings(settings) + for [key, value] in items(a:settings) + let sub = '' + if type(value) == 0 + let sub = '%d' + elseif type(value) == 1 + let sub = '"%s"' + endif + let fmt = printf("let g:multi_cursor_%%s=get(g:, 'multi_cursor_%%s', %s)", + \ sub) + exec printf(fmt, key, key, value) + endfor +endfunction + +" Settings +let s:settings = { + \ 'exit_from_visual_mode': 1, + \ 'exit_from_insert_mode': 1, + \ 'use_default_mapping': 1, + \ } + +let s:settings_if_default = { + \ 'quit_key': "\", + \ 'next_key': "\", + \ 'prev_key': "\", + \ 'skip_key': "\", + \ } + +call s:init_settings(s:settings) + +if g:multi_cursor_use_default_mapping + call s:init_settings(s:settings_if_default) +endif + +" External mappings +if exists('g:multi_cursor_next_key') + exec 'nnoremap '.g:multi_cursor_next_key. + \' :call multiple_cursors#new("n")' + exec 'xnoremap '.g:multi_cursor_next_key. + \' :call multiple_cursors#new("v")' +endif +if exists('g:multi_cursor_prev_key') + exec 'xnoremap '.g:multi_cursor_prev_key. + \' :call multiple_cursors#prev()' +endif +if exists('g:multi_cursor_skip_key') + exec 'xnoremap '.g:multi_cursor_skip_key. + \' :call multiple_cursors#skip()' +endif + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/update_plugins.py b/update_plugins.py index ce4b8917..b93bde6b 100644 --- a/update_plugins.py +++ b/update_plugins.py @@ -29,6 +29,7 @@ vim-pyte https://github.com/therubymug/vim-pyte vim-snipmate https://github.com/garbas/vim-snipmate vim-snippets https://github.com/honza/vim-snippets vim-surround https://github.com/tpope/vim-surround +vim-expand-region https://github.com/terryma/vim-expand-region """.strip() GITHUB_ZIP = '%s/archive/master.zip' diff --git a/vimrcs/plugins_config.vim b/vimrcs/plugins_config.vim index 28f257f5..a2c09717 100644 --- a/vimrcs/plugins_config.vim +++ b/vimrcs/plugins_config.vim @@ -87,6 +87,12 @@ map nb :NERDTreeFromBookmark map nf :NERDTreeFind +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +" => vim-multiple-cursors +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +let g:multi_cursor_next_key="\" + + """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => surround.vim config " Annotate strings with gettext http://amix.dk/blog/post/19678 From 6e12f37544a18ea47321080691f448e03be9ac74 Mon Sep 17 00:00:00 2001 From: amix Date: Sun, 14 Apr 2013 12:50:51 -0300 Subject: [PATCH 09/13] Fixed a typo in documentation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 39efe3fc..cd17bb29 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ After you have installed the setup you can create **~/.vim_runtime/my_configs.vi You can also install your own plugins, for instance, via pathogen we can install [vim-rails](https://github.com/tpope/vim-rails): cd ~/.vim_runtime - git clone git://github.com/tpope/vim-rails.git sources_plugins/vim-rails + git clone git://github.com/tpope/vim-rails.git sources_non_forked/vim-rails Now you have vim-rails installed ;-) From 349a9f5cdacf73c526e80ee3bff58daabf09eaf7 Mon Sep 17 00:00:00 2001 From: amix Date: Sun, 14 Apr 2013 12:55:47 -0300 Subject: [PATCH 10/13] Added a new maping to update_plugins.py --- update_plugins.py | 1 + 1 file changed, 1 insertion(+) diff --git a/update_plugins.py b/update_plugins.py index b93bde6b..381c0161 100644 --- a/update_plugins.py +++ b/update_plugins.py @@ -30,6 +30,7 @@ vim-snipmate https://github.com/garbas/vim-snipmate vim-snippets https://github.com/honza/vim-snippets vim-surround https://github.com/tpope/vim-surround vim-expand-region https://github.com/terryma/vim-expand-region +vim-multiple-cursors https://github.com/terryma/vim-multiple-cursors """.strip() GITHUB_ZIP = '%s/archive/master.zip' From a817e88e356861df4bfedd79103503a02df0534a Mon Sep 17 00:00:00 2001 From: amix Date: Tue, 16 Apr 2013 10:27:16 -0300 Subject: [PATCH 11/13] Revert overriding CTRL-A (instead we use CTRL+S) --- README.md | 2 +- vimrcs/plugins_config.vim | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cd17bb29..bc0fba7b 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ I recommend reading the docs of these plugins to understand them better. Each of * [zencoding](https://github.com/mattn/zencoding-vim): Expanding abbreviation like zen-coding, very useful for editing XML, HTML. * [vim-indent-object](https://github.com/michaeljsmith/vim-indent-object): Defines a new text object representing lines of code at the same indent level. Useful for python/vim scripts * [taglist.vim](https://github.com/vim-scripts/taglist.vim): Source code browser (supports C/C++, java, perl, python, tcl, sql, php, etc) -* [vim-multiple-cursors](https://github.com/terryma/vim-multiple-cursors): Sublime Text style multiple selections for Vim, CTRL+N is remapped to CTRL+A (due to YankRing) +* [vim-multiple-cursors](https://github.com/terryma/vim-multiple-cursors): Sublime Text style multiple selections for Vim, CTRL+N is remapped to CTRL+S (due to YankRing) * [vim-expand-region](https://github.com/terryma/vim-expand-region): Allows you to visually select increasingly larger regions of text using the same key combination. diff --git a/vimrcs/plugins_config.vim b/vimrcs/plugins_config.vim index a2c09717..6ac0d330 100644 --- a/vimrcs/plugins_config.vim +++ b/vimrcs/plugins_config.vim @@ -90,7 +90,7 @@ map nf :NERDTreeFind """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => vim-multiple-cursors """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" -let g:multi_cursor_next_key="\" +let g:multi_cursor_next_key="\" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" From 687184f0bb7b7911fe469e0bb9639370c8c8f039 Mon Sep 17 00:00:00 2001 From: amix Date: Fri, 26 Apr 2013 13:17:22 -0300 Subject: [PATCH 12/13] Updated vim plugins --- .../nerdtree/autoload/nerdtree.vim | 13 + .../{plugin => lib}/nerdtree/bookmark.vim | 0 .../{plugin => lib}/nerdtree/creator.vim | 0 .../{plugin => lib}/nerdtree/key_map.vim | 0 .../nerdtree/menu_controller.vim | 0 .../{plugin => lib}/nerdtree/menu_item.vim | 0 .../{plugin => lib}/nerdtree/opener.vim | 0 .../{plugin => lib}/nerdtree/path.vim | 0 .../nerdtree/tree_dir_node.vim | 0 .../nerdtree/tree_file_node.vim | 0 .../nerdtree/plugin/NERD_tree.vim | 10 +- .../vim-expand-region/MIT-LICENSE.txt | 0 .../vim-expand-region/README.md | 0 .../autoload/expand_region.vim | 0 .../vim-expand-region/doc/expand_region.txt | 0 .../vim-expand-region/expand-region.gif | Bin .../plugin/expand_region.vim | 0 .../vim-multiple-cursors/.rspec | 2 + .../vim-multiple-cursors/.travis.yml | 7 + .../vim-multiple-cursors/CHANGELOG.md | 97 +++ .../vim-multiple-cursors/Gemfile | 4 + .../vim-multiple-cursors/Gemfile.lock | 22 + .../vim-multiple-cursors/MIT-LICENSE.txt | 0 .../vim-multiple-cursors/README.md | 49 +- .../vim-multiple-cursors/Rakefile | 5 + .../vim-multiple-cursors/assets/example1.gif | Bin .../vim-multiple-cursors/assets/example2.gif | Bin .../vim-multiple-cursors/assets/example3.gif | Bin .../vim-multiple-cursors/assets/example4.gif | Bin 0 -> 545119 bytes .../autoload/multiple_cursors.vim | 740 ++++++++++++------ .../doc/multiple_cursors.txt | 71 +- .../vim-multiple-cursors/doc/tags | 4 +- .../plugin/multiple_cursors.vim | 64 +- .../spec/multiple_cursors_spec.rb | 259 ++++++ .../vim-multiple-cursors/spec/spec_helper.rb | 25 + sources_non_forked/vim-snipmate/README.rst | 3 +- .../vim-snipmate/after/plugin/snipMate.vim | 89 +-- .../vim-snipmate/autoload/snipMate.vim | 7 +- .../vim-snipmate/doc/snipMate.txt | 28 +- .../vim-snipmate/plugin/snipMate.vim | 14 + sources_non_forked/vim-snippets/README.md | 5 +- .../vim-snippets/UltiSnips/eruby.snippets | 4 +- .../vim-snippets/snippets/coffee.snippets | 26 +- .../vim-snippets/snippets/eruby.snippets | 8 +- .../vim-snippets/snippets/php.snippets | 41 +- 45 files changed, 1186 insertions(+), 411 deletions(-) rename sources_non_forked/nerdtree/{plugin => lib}/nerdtree/bookmark.vim (100%) rename sources_non_forked/nerdtree/{plugin => lib}/nerdtree/creator.vim (100%) rename sources_non_forked/nerdtree/{plugin => lib}/nerdtree/key_map.vim (100%) rename sources_non_forked/nerdtree/{plugin => lib}/nerdtree/menu_controller.vim (100%) rename sources_non_forked/nerdtree/{plugin => lib}/nerdtree/menu_item.vim (100%) rename sources_non_forked/nerdtree/{plugin => lib}/nerdtree/opener.vim (100%) rename sources_non_forked/nerdtree/{plugin => lib}/nerdtree/path.vim (100%) rename sources_non_forked/nerdtree/{plugin => lib}/nerdtree/tree_dir_node.vim (100%) rename sources_non_forked/nerdtree/{plugin => lib}/nerdtree/tree_file_node.vim (100%) mode change 100755 => 100644 sources_non_forked/vim-expand-region/MIT-LICENSE.txt mode change 100755 => 100644 sources_non_forked/vim-expand-region/README.md mode change 100755 => 100644 sources_non_forked/vim-expand-region/autoload/expand_region.vim mode change 100755 => 100644 sources_non_forked/vim-expand-region/doc/expand_region.txt mode change 100755 => 100644 sources_non_forked/vim-expand-region/expand-region.gif mode change 100755 => 100644 sources_non_forked/vim-expand-region/plugin/expand_region.vim create mode 100644 sources_non_forked/vim-multiple-cursors/.rspec create mode 100644 sources_non_forked/vim-multiple-cursors/.travis.yml create mode 100644 sources_non_forked/vim-multiple-cursors/CHANGELOG.md create mode 100644 sources_non_forked/vim-multiple-cursors/Gemfile create mode 100644 sources_non_forked/vim-multiple-cursors/Gemfile.lock mode change 100755 => 100644 sources_non_forked/vim-multiple-cursors/MIT-LICENSE.txt mode change 100755 => 100644 sources_non_forked/vim-multiple-cursors/README.md create mode 100644 sources_non_forked/vim-multiple-cursors/Rakefile mode change 100755 => 100644 sources_non_forked/vim-multiple-cursors/assets/example1.gif mode change 100755 => 100644 sources_non_forked/vim-multiple-cursors/assets/example2.gif mode change 100755 => 100644 sources_non_forked/vim-multiple-cursors/assets/example3.gif create mode 100644 sources_non_forked/vim-multiple-cursors/assets/example4.gif mode change 100755 => 100644 sources_non_forked/vim-multiple-cursors/autoload/multiple_cursors.vim mode change 100755 => 100644 sources_non_forked/vim-multiple-cursors/doc/multiple_cursors.txt mode change 100755 => 100644 sources_non_forked/vim-multiple-cursors/plugin/multiple_cursors.vim create mode 100644 sources_non_forked/vim-multiple-cursors/spec/multiple_cursors_spec.rb create mode 100644 sources_non_forked/vim-multiple-cursors/spec/spec_helper.rb diff --git a/sources_non_forked/nerdtree/autoload/nerdtree.vim b/sources_non_forked/nerdtree/autoload/nerdtree.vim index 3da55662..3a2d71a6 100644 --- a/sources_non_forked/nerdtree/autoload/nerdtree.vim +++ b/sources_non_forked/nerdtree/autoload/nerdtree.vim @@ -227,6 +227,19 @@ function! nerdtree#invokeKeyMap(key) call g:NERDTreeKeyMap.Invoke(a:key) endfunction +" FUNCTION: nerdtree#loadClassFiles() {{{2 +function! nerdtree#loadClassFiles() + runtime lib/nerdtree/path.vim + runtime lib/nerdtree/menu_controller.vim + runtime lib/nerdtree/menu_item.vim + runtime lib/nerdtree/key_map.vim + runtime lib/nerdtree/bookmark.vim + runtime lib/nerdtree/tree_file_node.vim + runtime lib/nerdtree/tree_dir_node.vim + runtime lib/nerdtree/opener.vim + runtime lib/nerdtree/creator.vim +endfunction + " FUNCTION: nerdtree#postSourceActions() {{{2 function! nerdtree#postSourceActions() call g:NERDTreeBookmark.CacheBookmarks(0) diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/bookmark.vim b/sources_non_forked/nerdtree/lib/nerdtree/bookmark.vim similarity index 100% rename from sources_non_forked/nerdtree/plugin/nerdtree/bookmark.vim rename to sources_non_forked/nerdtree/lib/nerdtree/bookmark.vim diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/creator.vim b/sources_non_forked/nerdtree/lib/nerdtree/creator.vim similarity index 100% rename from sources_non_forked/nerdtree/plugin/nerdtree/creator.vim rename to sources_non_forked/nerdtree/lib/nerdtree/creator.vim diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/key_map.vim b/sources_non_forked/nerdtree/lib/nerdtree/key_map.vim similarity index 100% rename from sources_non_forked/nerdtree/plugin/nerdtree/key_map.vim rename to sources_non_forked/nerdtree/lib/nerdtree/key_map.vim diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/menu_controller.vim b/sources_non_forked/nerdtree/lib/nerdtree/menu_controller.vim similarity index 100% rename from sources_non_forked/nerdtree/plugin/nerdtree/menu_controller.vim rename to sources_non_forked/nerdtree/lib/nerdtree/menu_controller.vim diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/menu_item.vim b/sources_non_forked/nerdtree/lib/nerdtree/menu_item.vim similarity index 100% rename from sources_non_forked/nerdtree/plugin/nerdtree/menu_item.vim rename to sources_non_forked/nerdtree/lib/nerdtree/menu_item.vim diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/opener.vim b/sources_non_forked/nerdtree/lib/nerdtree/opener.vim similarity index 100% rename from sources_non_forked/nerdtree/plugin/nerdtree/opener.vim rename to sources_non_forked/nerdtree/lib/nerdtree/opener.vim diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/path.vim b/sources_non_forked/nerdtree/lib/nerdtree/path.vim similarity index 100% rename from sources_non_forked/nerdtree/plugin/nerdtree/path.vim rename to sources_non_forked/nerdtree/lib/nerdtree/path.vim diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/tree_dir_node.vim b/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim similarity index 100% rename from sources_non_forked/nerdtree/plugin/nerdtree/tree_dir_node.vim rename to sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim diff --git a/sources_non_forked/nerdtree/plugin/nerdtree/tree_file_node.vim b/sources_non_forked/nerdtree/lib/nerdtree/tree_file_node.vim similarity index 100% rename from sources_non_forked/nerdtree/plugin/nerdtree/tree_file_node.vim rename to sources_non_forked/nerdtree/lib/nerdtree/tree_file_node.vim diff --git a/sources_non_forked/nerdtree/plugin/NERD_tree.vim b/sources_non_forked/nerdtree/plugin/NERD_tree.vim index 6c19a3fa..5bee03ad 100644 --- a/sources_non_forked/nerdtree/plugin/NERD_tree.vim +++ b/sources_non_forked/nerdtree/plugin/NERD_tree.vim @@ -136,15 +136,7 @@ call s:initVariable("g:NERDTreeMapUpdirKeepOpen", "U") call s:initVariable("g:NERDTreeMapCWD", "CD") "SECTION: Load class files{{{2 -runtime plugin/nerdtree/path.vim -runtime plugin/nerdtree/menu_controller.vim -runtime plugin/nerdtree/menu_item.vim -runtime plugin/nerdtree/key_map.vim -runtime plugin/nerdtree/bookmark.vim -runtime plugin/nerdtree/tree_file_node.vim -runtime plugin/nerdtree/tree_dir_node.vim -runtime plugin/nerdtree/opener.vim -runtime plugin/nerdtree/creator.vim +call nerdtree#loadClassFiles() " SECTION: Commands {{{1 "============================================================ diff --git a/sources_non_forked/vim-expand-region/MIT-LICENSE.txt b/sources_non_forked/vim-expand-region/MIT-LICENSE.txt old mode 100755 new mode 100644 diff --git a/sources_non_forked/vim-expand-region/README.md b/sources_non_forked/vim-expand-region/README.md old mode 100755 new mode 100644 diff --git a/sources_non_forked/vim-expand-region/autoload/expand_region.vim b/sources_non_forked/vim-expand-region/autoload/expand_region.vim old mode 100755 new mode 100644 diff --git a/sources_non_forked/vim-expand-region/doc/expand_region.txt b/sources_non_forked/vim-expand-region/doc/expand_region.txt old mode 100755 new mode 100644 diff --git a/sources_non_forked/vim-expand-region/expand-region.gif b/sources_non_forked/vim-expand-region/expand-region.gif old mode 100755 new mode 100644 diff --git a/sources_non_forked/vim-expand-region/plugin/expand_region.vim b/sources_non_forked/vim-expand-region/plugin/expand_region.vim old mode 100755 new mode 100644 diff --git a/sources_non_forked/vim-multiple-cursors/.rspec b/sources_non_forked/vim-multiple-cursors/.rspec new file mode 100644 index 00000000..397921fb --- /dev/null +++ b/sources_non_forked/vim-multiple-cursors/.rspec @@ -0,0 +1,2 @@ +--color +--format d diff --git a/sources_non_forked/vim-multiple-cursors/.travis.yml b/sources_non_forked/vim-multiple-cursors/.travis.yml new file mode 100644 index 00000000..e99037a9 --- /dev/null +++ b/sources_non_forked/vim-multiple-cursors/.travis.yml @@ -0,0 +1,7 @@ +language: ruby +rvm: + - 1.9.3 +before_install: sudo apt-get install vim-gtk +before_script: + - "export DISPLAY=:99.0" + - "sh -e /etc/init.d/xvfb start" diff --git a/sources_non_forked/vim-multiple-cursors/CHANGELOG.md b/sources_non_forked/vim-multiple-cursors/CHANGELOG.md new file mode 100644 index 00000000..aa8b644e --- /dev/null +++ b/sources_non_forked/vim-multiple-cursors/CHANGELOG.md @@ -0,0 +1,97 @@ +## 2.0 (04/24/2013) + +Bugfixes: + - Fix inconsistent undo behavior. Changes made in multicursor insert mode are now undone together. This fixes #22. + - Single key commands that do not terminate properly no longer cause ghostly cursors to linger on screen. An error message is now displayed informing the user the number of cursor locations that the input cannot be properly played back at. This fixes #28. + +## 1.16 (04/23/2013) + +Features: + - Add integration tests using vimrunner. Hook up travis-ci to run continous integration on commit. + +## 1.15 (04/22/2013) + +Bugfixes: + - Fix plugin causing error bell. This fixes #29. + +## 1.14 (04/22/2013) + +Features: + - Allow users to separate start key from next key. (credit: @xanderman) + +## 1.13 (04/22/2013) + +Bugfixes: + - Add support for switching to visual line mode from inside multicursor mode + - Fix highlight issue where extra character at end of line is highlighted for visual selections covering more than 2 lines. + +## 1.12 (04/19/2013) + +Bugfixes: + - Fix tab character causing highlight errors. This fixes #18 and fixes #32 + +## 1.11 (04/18/2013) + +Bugfixes: + - Fix regression where `C-n` doesn't exhibit correct behavior when all matches have been found + - Clear echo messages when a new input is received + +## 1.10 (04/17/2013) + +Bugfixes: + - `O` works now in normal mode. This fixes #24 + - Turn on `lazyredraw` during multicursor mode to prevent the sluggish screen redraws + +Features: + - Add command **MultipleCursorsFind** to add multiple virtual cursors using regexp. This closes #20 + +## 1.9 (04/17/2013) + +Bugfixes: + - Fix starting multicursor mode in visual line mode. This fixes #25 + - Major refactoring to avoid getting in and out of visual mode as much as possible + +## 1.8 (04/16/2013) + +Bugfixes: + - Fix regression that causes call stack to explode with too many cursors + +## 1.7 (04/15/2013) + +Bugfixes: + - Finally fix the annoying highlighting problem when the last virtual cursor is on the last character of the line. The solution is a hack, but it should be harmless + +## 1.6 (04/15/2013) + +Bugfixes: + - Stop chaining dictionary function calls. This fixes #10 and #11 + +## 1.5 (04/15/2013) + +Bugfixes: + - Exit Vim's visual mode before waiting for user's next input. This fixes #14 + +## 1.4 (04/14/2013) + +Bugfixes: + - Don't use clearmatches(). It clears highlighting from other plugins. This fixes #13 + +## 1.3 (04/14/2013) + +Bugfixes: + - Change mapping from using expression-quote syntax to using raw strings + +## 1.2 (04/14/2013) + +Bugfixes: + - Restore view when exiting from multicursor mode. This fixes #5 + - Remove the unnecessary user level mapping for 'prev' and 'skip' in visual mode, since we can purely detect those keys from multicursor mode + +## 1.1 (04/14/2013) + +Bugfixes: + - Stop hijacking escape key in normal mode. This fixes #1, #2, and #3 + +## 1.0 (04/13/2013) + +Initial release diff --git a/sources_non_forked/vim-multiple-cursors/Gemfile b/sources_non_forked/vim-multiple-cursors/Gemfile new file mode 100644 index 00000000..7658cb9d --- /dev/null +++ b/sources_non_forked/vim-multiple-cursors/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' +gem 'vimrunner' +gem 'rake' +gem 'rspec' diff --git a/sources_non_forked/vim-multiple-cursors/Gemfile.lock b/sources_non_forked/vim-multiple-cursors/Gemfile.lock new file mode 100644 index 00000000..12bf0d65 --- /dev/null +++ b/sources_non_forked/vim-multiple-cursors/Gemfile.lock @@ -0,0 +1,22 @@ +GEM + remote: https://rubygems.org/ + specs: + diff-lcs (1.2.4) + rake (10.0.4) + rspec (2.13.0) + rspec-core (~> 2.13.0) + rspec-expectations (~> 2.13.0) + rspec-mocks (~> 2.13.0) + rspec-core (2.13.1) + rspec-expectations (2.13.0) + diff-lcs (>= 1.1.3, < 2.0) + rspec-mocks (2.13.1) + vimrunner (0.3.0) + +PLATFORMS + ruby + +DEPENDENCIES + rake + rspec + vimrunner diff --git a/sources_non_forked/vim-multiple-cursors/MIT-LICENSE.txt b/sources_non_forked/vim-multiple-cursors/MIT-LICENSE.txt old mode 100755 new mode 100644 diff --git a/sources_non_forked/vim-multiple-cursors/README.md b/sources_non_forked/vim-multiple-cursors/README.md old mode 100755 new mode 100644 index b38c311a..5bf961f7 --- a/sources_non_forked/vim-multiple-cursors/README.md +++ b/sources_non_forked/vim-multiple-cursors/README.md @@ -1,4 +1,4 @@ -# vim-multiple-cursors +# vim-multiple-cursors [![Build Status](https://travis-ci.org/terryma/vim-multiple-cursors.png)](https://travis-ci.org/terryma/vim-multiple-cursors) ## About [There](https://github.com/paradigm/vim-multicursor) [have](https://github.com/felixr/vim-multiedit) [been](https://github.com/hlissner/vim-multiedit) [many](https://github.com/adinapoli/vim-markmultiple) [attempts](https://github.com/AndrewRadev/multichange.vim) at bringing Sublime Text's awesome [multiple selection][sublime-multiple-selection] feature into Vim, but none so far have been in my opinion a faithful port that is simplistic to use, yet powerful and intuitive enough for an existing Vim user. [vim-multiple-cursors] is yet another attempt at that. @@ -12,6 +12,11 @@ ### Do it backwards too! This is not just a replay of the above gif :) ![Example3](assets/example3.gif?raw=true) +### Add multiple cursors using regexes +![Example4](assets/example4.gif?raw=true) + +To see what keystrokes are used for the above example, see [this issue](https://github.com/terryma/vim-multiple-cursors/issues/39). + ## Features - Live update in Insert mode - One key to rule it all! See [Quick Start](#quick-start) on what the key does in different scenarios @@ -31,31 +36,45 @@ Two additional keys are also mapped: - `Ctrl-p` in Visual mode will remove the current virtual cursor and go back to the previous virtual cursor location. This is useful if you are trigger happy with `Ctrl-n` and accidentally went too far. - `Ctrl-x` in Visual mode will remove the current virtual cursor and skip to the next virtual cursor location. This is useful if you don't want the current selection to be a candidate to operate on later. -**NOTE**: The plugin is still somewhat buggy, if at any time you have lingering cursors on screen, you can press `Ctrl-n` in Normal mode and it will remove all prior cursors before starting a new one. +You can also add multiple cursors using a regular expression. The command `MultipleCursorsFind` accepts a range and a pattern, and it will create a virtual cursor at the end of every match within the range. If no range is passed in, then it defaults to the entire buffer. + +**NOTE:** If at any time you have lingering cursors on screen, you can press `Ctrl-n` in Normal mode and it will remove all prior cursors before starting a new one. ## Mapping -Out of the box, `Ctrl-n`, `Ctrl-p`, and `Ctrl-x` are mapped by default. If you don't like the plugin taking over your favorite key bindings, then turn off the default with +Out of the box, only the single key `Ctrl-n` is mapped in regular Vim's Normal mode and Visual mode to provide the functionality mentioned above. `Ctrl-n`, `Ctrl-p`, `Ctrl-x`, and `` are mapped in the special multicursor mode once you've added at least one virtual cursor to the buffer. If you don't like the plugin taking over your favorite key bindings, you can turn off the default with ``` let g:multi_cursor_use_default_mapping=0 ``` -You can map the 'next', 'previous', 'skip', and 'exit' keys like the following: +You can then map the 'next', 'previous', 'skip', and 'exit' keys like the following: ``` " Default mapping -let g:multi_cursor_next_key="\" -let g:multi_cursor_prev_key="\" -let g:multi_cursor_skip_key="\" -let g:multi_cursor_exit_key="\" +let g:multi_cursor_next_key='' +let g:multi_cursor_prev_key='' +let g:multi_cursor_skip_key='' +let g:multi_cursor_quit_key='' ``` +By default, the 'next' key is also used to enter multicursor mode. If you want to use a different key to start multicursor mode than for selecting the next location, do like the following: +``` +" Map start key separately from next key +let g:multi_cursor_start_key='' +``` + +**IMPORTANT:** Please note that currently only single keystrokes and special keys can be mapped. This contraint is also the reason why multikey commands such as `ciw` do not work and cause unexpected behavior in Normal mode. This means that a mapping like `n` will NOT work correctly. For a list of special keys that are supported, see `help :key-notation` + +**NOTE:** Please make sure to always map something to `g:multi_cursor_quit_key`, otherwise you'll have a tough time quitting from multicursor mode. + +**NOTE:** Prior to version 1.3, the recommended way to map the keys is using the expressoin quote syntax in Vim, using something like `"\"` or `"\"` (see h: expr-quote). After 1.3, the recommended way is to use a raw string like above. If your key mappings don't appear to work, give the new syntax a try. + ## Setting Currently there're two additional global settings one can tweak: ### ```g:multi_cursor_exit_from_visual_mode``` (Defaut: 1) -If set to 0, then pressing `g:multi_cursor_exit_key` in _Visual_ mode will not quit and delete all existing cursors. This is useful if you want to press Escape and go back to Normal mode, and still be able to operate on all the cursors. +If set to 0, then pressing `g:multi_cursor_quit_key` in _Visual_ mode will not quit and delete all existing cursors. This is useful if you want to press Escape and go back to Normal mode, and still be able to operate on all the cursors. ### ```g:multi_cursor_exit_from_insert_mode``` (Default: 1) -If set to 0, then pressing `g:multi_cursor_exit_key` in _Insert_ mode will not quit and delete all existing cursors. This is useful if you want to press Escape and go back to Normal mode, and still be able to operate on all the cursors. +If set to 0, then pressing `g:multi_cursor_quit_key` in _Insert_ mode will not quit and delete all existing cursors. This is useful if you want to press Escape and go back to Normal mode, and still be able to operate on all the cursors. ### Highlight The plugin uses the highlight group `multiple_cursors_cursor` and `multiple_cursors_visual` to highlight the virtual cursors and their visual selections respectively. You can customize them by putting something similar like the following in your vimrc: @@ -69,15 +88,14 @@ highlight link multiple_cursors_visual Visual ## Issues - Multi key commands like `ciw` do not work at the moment - All user input typed before Vim is able to fan out the last operation to all cursors is lost. This is a implementation decision to keep the input perfectly synced in all locations, at the cost of potentially losing user input. -- Single key commands that do not terminate properly cause unexpected behavior. For example, if the cursor is on the first character in the buffer and 'b' is pressed. -- Undo behavior is unpredictable - Performance in terminal vim degrades significantly with more cursors - Select mode is not implemented -- Buggy when `wrap` is turned on -- Cursor highlighting is off. The last column on the same row as Vim's cursor is not highlighted incorrectly. Setting virtualedit=all might help + +## Changelog +See [CHANGELOG.md](CHANGELOG.md) ## Contributing -As one can see, there're still many issues to be resolved, patches and suggestions are always welcome! +As one can see, there're still many issues to be resolved, patches and suggestions are always welcome! A list of open feature requests can be found [here](../../issues?labels=enhancement&state=open). ## Credit Obviously inspired by Sublime Text's [multiple selection][sublime-multiple-selection] feature, also encouraged by Emac's [multiple cursors][emacs-multiple-cursors] implemetation by Magnar Sveen @@ -88,3 +106,4 @@ Obviously inspired by Sublime Text's [multiple selection][sublime-multiple-selec [Vundle]:http://github.com/gmarik/vundle [Neobundle]:http://github.com/Shougo/neobundle.vim [emacs-multiple-cursors]:https://github.com/magnars/multiple-cursors.el + diff --git a/sources_non_forked/vim-multiple-cursors/Rakefile b/sources_non_forked/vim-multiple-cursors/Rakefile new file mode 100644 index 00000000..70a846df --- /dev/null +++ b/sources_non_forked/vim-multiple-cursors/Rakefile @@ -0,0 +1,5 @@ +require 'rspec/core/rake_task' + +RSpec::Core::RakeTask.new(:spec) + +task :default => :spec diff --git a/sources_non_forked/vim-multiple-cursors/assets/example1.gif b/sources_non_forked/vim-multiple-cursors/assets/example1.gif old mode 100755 new mode 100644 diff --git a/sources_non_forked/vim-multiple-cursors/assets/example2.gif b/sources_non_forked/vim-multiple-cursors/assets/example2.gif old mode 100755 new mode 100644 diff --git a/sources_non_forked/vim-multiple-cursors/assets/example3.gif b/sources_non_forked/vim-multiple-cursors/assets/example3.gif old mode 100755 new mode 100644 diff --git a/sources_non_forked/vim-multiple-cursors/assets/example4.gif b/sources_non_forked/vim-multiple-cursors/assets/example4.gif new file mode 100644 index 0000000000000000000000000000000000000000..062e0ca7137ebc374ea2f1116aa0eac7a3f8128f GIT binary patch literal 545119 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

            _|YTUe823|6=KbuypC(2 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 ZT4(N(expand_region_expand)') + nmap + (expand_region_expand) + vmap + (expand_region_expand) +endif +if !hasmapto('(expand_region_shrink)') + vmap _ (expand_region_shrink) + nmap _ (expand_region_shrink) +endif + +nnoremap (expand_region_expand) + \ :call expand_region#next('n', '+') +" Map keys differently depending on which mode is desired +if expand_region#use_select_mode() + snoremap (expand_region_expand) + \ :call expand_region#next('v', '+') + snoremap (expand_region_shrink) + \ :call expand_region#next('v', '-') +else + xnoremap (expand_region_expand) + \ :call expand_region#next('v', '+') + xnoremap (expand_region_shrink) + \ :call expand_region#next('v', '-') +endif + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/sources_non_forked/vim-multiple-cursors/MIT-LICENSE.txt b/sources_non_forked/vim-multiple-cursors/MIT-LICENSE.txt new file mode 100755 index 00000000..dade7aa4 --- /dev/null +++ b/sources_non_forked/vim-multiple-cursors/MIT-LICENSE.txt @@ -0,0 +1,20 @@ +Copyright 2013 Terry Ma + +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/sources_non_forked/vim-multiple-cursors/README.md b/sources_non_forked/vim-multiple-cursors/README.md new file mode 100755 index 00000000..b38c311a --- /dev/null +++ b/sources_non_forked/vim-multiple-cursors/README.md @@ -0,0 +1,90 @@ +# vim-multiple-cursors + +## About +[There](https://github.com/paradigm/vim-multicursor) [have](https://github.com/felixr/vim-multiedit) [been](https://github.com/hlissner/vim-multiedit) [many](https://github.com/adinapoli/vim-markmultiple) [attempts](https://github.com/AndrewRadev/multichange.vim) at bringing Sublime Text's awesome [multiple selection][sublime-multiple-selection] feature into Vim, but none so far have been in my opinion a faithful port that is simplistic to use, yet powerful and intuitive enough for an existing Vim user. [vim-multiple-cursors] is yet another attempt at that. + +### It's great for quick refactoring +![Example1](assets/example1.gif?raw=true) + +### Add a cursor to each line of your visual selection +![Example2](assets/example2.gif?raw=true) + +### Do it backwards too! This is not just a replay of the above gif :) +![Example3](assets/example3.gif?raw=true) + +## Features +- Live update in Insert mode +- One key to rule it all! See [Quick Start](#quick-start) on what the key does in different scenarios +- Works in Normal, Insert, and Visual mode for SINGLE key command + +## Installation +Install using [Pathogen], [Vundle], [Neobundle], or your favorite Vim package manager. + +## Quick Start +Out of the box, all you need to know is a single key `Ctrl-n`. Pressing the key in Normal mode highlights the current word under the cursor in Visual mode and places a virtual cursor at the end of it. Pressing it again finds the next ocurrence and places another virtual cursor at the end of the visual selection. If you select multiple lines in Visual mode, pressing the key puts a virtual cursor at every line and leaves you in Normal mode. + +After you've marked all your locations with `Ctrl-n`, you can change the visual selection with normal Vim motion commands in Visual mode. You could go to Normal mode by pressing `v` and wield your motion commands there. Single key command to switch to Insert mode such as `c` or `s` from Visual mode or `i`, `a`, `I`, `A` in Normal mode should work without any issues. + +At any time, you can press `` to exit back to regular Vim. + +Two additional keys are also mapped: +- `Ctrl-p` in Visual mode will remove the current virtual cursor and go back to the previous virtual cursor location. This is useful if you are trigger happy with `Ctrl-n` and accidentally went too far. +- `Ctrl-x` in Visual mode will remove the current virtual cursor and skip to the next virtual cursor location. This is useful if you don't want the current selection to be a candidate to operate on later. + +**NOTE**: The plugin is still somewhat buggy, if at any time you have lingering cursors on screen, you can press `Ctrl-n` in Normal mode and it will remove all prior cursors before starting a new one. + +## Mapping +Out of the box, `Ctrl-n`, `Ctrl-p`, and `Ctrl-x` are mapped by default. If you don't like the plugin taking over your favorite key bindings, then turn off the default with +``` +let g:multi_cursor_use_default_mapping=0 +``` + +You can map the 'next', 'previous', 'skip', and 'exit' keys like the following: +``` +" Default mapping +let g:multi_cursor_next_key="\" +let g:multi_cursor_prev_key="\" +let g:multi_cursor_skip_key="\" +let g:multi_cursor_exit_key="\" +``` + +## Setting +Currently there're two additional global settings one can tweak: +### ```g:multi_cursor_exit_from_visual_mode``` (Defaut: 1) + +If set to 0, then pressing `g:multi_cursor_exit_key` in _Visual_ mode will not quit and delete all existing cursors. This is useful if you want to press Escape and go back to Normal mode, and still be able to operate on all the cursors. + +### ```g:multi_cursor_exit_from_insert_mode``` (Default: 1) +If set to 0, then pressing `g:multi_cursor_exit_key` in _Insert_ mode will not quit and delete all existing cursors. This is useful if you want to press Escape and go back to Normal mode, and still be able to operate on all the cursors. + +### Highlight +The plugin uses the highlight group `multiple_cursors_cursor` and `multiple_cursors_visual` to highlight the virtual cursors and their visual selections respectively. You can customize them by putting something similar like the following in your vimrc: + +``` +" Default highlighting (see help :highlight and help :highlight-link) +highlight multiple_cursors_cursor term=reverse cterm=reverse gui=reverse +highlight link multiple_cursors_visual Visual +``` + +## Issues +- Multi key commands like `ciw` do not work at the moment +- All user input typed before Vim is able to fan out the last operation to all cursors is lost. This is a implementation decision to keep the input perfectly synced in all locations, at the cost of potentially losing user input. +- Single key commands that do not terminate properly cause unexpected behavior. For example, if the cursor is on the first character in the buffer and 'b' is pressed. +- Undo behavior is unpredictable +- Performance in terminal vim degrades significantly with more cursors +- Select mode is not implemented +- Buggy when `wrap` is turned on +- Cursor highlighting is off. The last column on the same row as Vim's cursor is not highlighted incorrectly. Setting virtualedit=all might help + +## Contributing +As one can see, there're still many issues to be resolved, patches and suggestions are always welcome! + +## Credit +Obviously inspired by Sublime Text's [multiple selection][sublime-multiple-selection] feature, also encouraged by Emac's [multiple cursors][emacs-multiple-cursors] implemetation by Magnar Sveen + +[vim-multiple-cursors]:http://github.com/terryma/vim-multiple-cursors +[sublime-multiple-selection]:http://www.sublimetext.com/docs/2/multiple_selection_with_the_keyboard.html +[Pathogen]:http://github.com/tpope/vim-pathogen +[Vundle]:http://github.com/gmarik/vundle +[Neobundle]:http://github.com/Shougo/neobundle.vim +[emacs-multiple-cursors]:https://github.com/magnars/multiple-cursors.el diff --git a/sources_non_forked/vim-multiple-cursors/assets/example1.gif b/sources_non_forked/vim-multiple-cursors/assets/example1.gif new file mode 100755 index 0000000000000000000000000000000000000000..f191985abffc1b3a0f16cf1f63de0b90d0d9236c GIT binary patch literal 103002 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 literal 0 HcmV?d00001 diff --git a/sources_non_forked/vim-multiple-cursors/assets/example2.gif b/sources_non_forked/vim-multiple-cursors/assets/example2.gif new file mode 100755 index 0000000000000000000000000000000000000000..df14aa3c19ba8705d29128573731a720fbbcc6d6 GIT binary patch literal 271369 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�m_P6_H!HZEH5{8O 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

            aA9nnd_+8vN!favw7ooCc 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