# HG changeset patch # User Steve Losh # Date 1289859357 18000 # Node ID 90083699bcd276a70dd32aeab6cd0f23e111a6a1 # Parent 662f1676bfb4ad005ecfcc7cf2b43e8477d8d683 vim: kill histwin, add delimitmate, fix visual next, and more diff -r 662f1676bfb4 -r 90083699bcd2 .tmux.conf --- a/.tmux.conf Mon Nov 15 08:40:32 2010 -0500 +++ b/.tmux.conf Mon Nov 15 17:15:57 2010 -0500 @@ -1,15 +1,14 @@ -# Prefix is something nicer, like C-J +# prefix = C-j set-option -g prefix C-j bind C-j send-prefix +# vim setw -g mode-keys vi -bind C-h select-pane -L -bind C-j select-pane -D -bind C-k select-pane -U -bind C-l select-pane -R +# esc to copy unbind [ bind Escape copy-mode + setw -g automatic-rename # status bar @@ -31,6 +30,28 @@ set-option -g pane-border-fg white set-option -g pane-active-border-fg magenta -bind s split-window -v -bind v split-window -h +# splitting panes +bind s split-window -v +bind C-s split-window -v +bind v split-window -h +bind C-v split-window -h +# moving between panes +bind h select-pane -L +bind C-h select-pane -L +bind j select-pane -D +bind C-j select-pane -D +bind k select-pane -U +bind C-k select-pane -U +bind l select-pane -R +bind C-l select-pane -R + +# resizing panes +bind Down resize-pane -D 10 +bind Up resize-pane -U 10 +bind Left resize-pane -L 10 +bind Right resize-pane -R 10 + +# resource +bind r source-file ~/.tmux.conf +bind C-r source-file ~/.tmux.conf diff -r 662f1676bfb4 -r 90083699bcd2 vim/.vimrc --- a/vim/.vimrc Mon Nov 15 08:40:32 2010 -0500 +++ b/vim/.vimrc Mon Nov 15 17:15:57 2010 -0500 @@ -152,7 +152,6 @@ map a :Ack " Yankring -nnoremap :YRShow nnoremap y :YRShow " Formatting, TextMate-style @@ -220,8 +219,8 @@ nmap R :RainbowParenthesesToggle " Edit vim stuff. -nmap ev sjL:e $MYVIMRC -nmap es sjL:e ~/.vim/snippets/ +nnoremap ev sjL:e $MYVIMRC +nnoremap es sjL:e ~/.vim/snippets/ " Sudo to write cmap w!! w !sudo tee % >/dev/null @@ -231,7 +230,10 @@ nnoremap _jt :set ft=htmljinja nnoremap _cw :set ft=confluencewiki nnoremap _pd :set ft=python.django -" + +" Python docs +nnoremap p :Pydoc + " HALP nnoremap _wtfcw :!open 'http://confluence.atlassian.com/renderer/notationhelp.action?section=all' @@ -289,37 +291,56 @@ onoremap ad a[ " Next () +vnoremap inb :normal! f(vib onoremap inb :normal! f(vib +vnoremap anb :normal! f(vab onoremap anb :normal! f(vab +vnoremap in( :normal! f(vi( onoremap in( :normal! f(vi( +vnoremap an( :normal! f(va( onoremap an( :normal! f(va( " Next {} +vnoremap inB :normal! f{viB onoremap inB :normal! f{viB +vnoremap anB :normal! f{vaB onoremap anB :normal! f{vaB +vnoremap in{ :normal! f{vi{ onoremap in{ :normal! f{vi{ +vnoremap an{ :normal! f{va{ onoremap an{ :normal! f{va{ " Next [] +vnoremap ind :normal! f[vi[ onoremap ind :normal! f[vi[ +vnoremap and :normal! f[va[ onoremap and :normal! f[va[ +vnoremap in[ :normal! f[vi[ onoremap in[ :normal! f[vi[ +vnoremap an[ :normal! f[va[ onoremap an[ :normal! f[va[ " Next <> +vnoremap in< :normal! f onoremap in< :normal! f +vnoremap an< :normal! f onoremap an< :normal! f " Next '' +vnoremap in' :normal! f'vi' onoremap in' :normal! f'vi' +vnoremap an' :normal! f'va' onoremap an' :normal! f'va' " Next "" +vnoremap in" :normal! f"vi" onoremap in" :normal! f"vi" +vnoremap an" :normal! f"va" onoremap an" :normal! f"va" " Skipreturn inoremap A +inoremap A: " VimClojure let vimclojure#HighlightBuiltins=1 diff -r 662f1676bfb4 -r 90083699bcd2 vim/bundle/delimitMate/.gitignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vim/bundle/delimitMate/.gitignore Mon Nov 15 17:15:57 2010 -0500 @@ -0,0 +1,8 @@ +*.sw? +*.un? +*.vba +*.zip +*.gz +vimball.txt +*.orig +tags diff -r 662f1676bfb4 -r 90083699bcd2 vim/bundle/delimitMate/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vim/bundle/delimitMate/Makefile Mon Nov 15 17:15:57 2010 -0500 @@ -0,0 +1,62 @@ +PLUGIN=$(shell basename "$$PWD") +SCRIPT=$(wildcard plugin/*.vim) +#AUTOL=$(wildcard autoload/*.vim) +AUTOL=autoload/$(PLUGIN).vim +DOC=$(wildcard doc/*.txt) +TESTS=$(wildcard autoload/*Tests.vim) +VERSION=$(shell perl -ne 'if (/\*\sCurrent\srelease:/) {s/^\s+(\d+\.\S+)\s.*$$/\1/;print}' $(DOC)) +VIMFOLDER=~/.vim/ +VIM=/usr/bin/vim + +.PHONY: $(PLUGIN).vba README + +all: vimball README zip gzip + +vimball: $(PLUGIN).vba + +clean: + @echo clean + rm -f *.vba */*.orig *.~* .VimballRecord *.zip *.gz + +dist-clean: clean + +undo: + for i in */*.orig; do mv -f "$$i" "$${i%.*}"; done + +README: + @echo README + cp -f $(DOC) README + +$(PLUGIN).vba: + @echo $(PLUGIN).vba + rm -f $(PLUGIN)-$(VERSION).vba + $(VIM) -N -c 'ru! vimballPlugin.vim' -c ':call append("0", [ "$(SCRIPT)", "$(AUTOL)", "$(DOC)"])' -c '$$d' -c ":%MkVimball $(PLUGIN)-$(VERSION) ." -c':q!' + ln -f $(PLUGIN)-$(VERSION).vba $(PLUGIN).vba + +zip: + @echo zip + rm -f *.zip + zip -r $(PLUGIN).zip doc plugin autoload + zip $(PLUGIN).zip -d \*.sw\? || echo 1 + zip $(PLUGIN).zip -d \*.un\? || echo 1 + zip $(PLUGIN).zip -d \*.orig || echo 1 + zip $(PLUGIN).zip -d \*tags || echo 1 + zip $(PLUGIN).zip -d $(TESTS) + ln -f $(PLUGIN).zip $(PLUGIN)-$(VERSION).zip + +gzip: vimball + @echo vimball + gzip -f $(PLUGIN).vba + +release: version all + +version: + @echo version: $(VERSION) + perl -i.orig -pne 'if (/^"\sVersion:/) {s/(\d+\.\S+)/$(VERSION)/}' $(SCRIPT) $(AUTOL) + perl -i.orig -pne 'if (/let\sdelimitMate_version/) {s/"(\d+\.\S+)"/"$(VERSION)"/}' $(SCRIPT) + perl -i.orig -pne 'if (/beasts/) {s/(v\d+\.\S+)/v$(VERSION)/}' $(DOC) + perl -i.orig -MPOSIX -pne 'if (/^"\sModified:/) {$$now_string = strftime "%F", localtime; s/(\d+-\d+-\d+)/$$now_string/e}' $(SCRIPT) $(AUTOL) + perl -i.orig -MPOSIX -pne 'if (/^\s+$(VERSION)\s+\d+-\d+-\d+\s+\*/) {$$now_string = strftime "%F", localtime; s/(\d+-\d+-\d+)/$$now_string/}' $(DOC) + @echo Version: $(VERSION) + +echo: diff -r 662f1676bfb4 -r 90083699bcd2 vim/bundle/delimitMate/README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vim/bundle/delimitMate/README Mon Nov 15 17:15:57 2010 -0500 @@ -0,0 +1,761 @@ +*delimitMate.txt* Trying to keep those beasts at bay! v2.5.1 *delimitMate* + + + + MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM + MMMM MMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMM MMMMM MMMMMMMMMMMMMMMMMMMMM ~ + MMMM MMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMM MMM MMMMMMMMMMMMMMMMMMMMM + MMMM MMMMMMMMM MMMMMMMMMMMMMMMMMMMMM MMM M M MMMMMMMMMM MMMMMMMMM ~ + MMMM MMM MMM MM MM M M MMM MM MM MM MM MMM MMM MMM MM + MM MM M MM MMMMMM MMMMMMM MMM MMMMM MM M MMM MMM M M ~ + M M MM MM MM MM M M MM MMM MMM MMMMM MMMMM MMM MMM M + M M MM MMMMM MM MM M M MM MMM MMM MMMMM MMM MMM MMM MMMM ~ + M M MM M MM MM MM M M MM MMM MMM MMMMM MM M MMM MMM M M + MM MMM MMM MM MM M M MM MMM MM MMMMM MMM MMM MMM MM ~ + MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM + + + +============================================================================== + 0.- CONTENTS *delimitMate-contents* + + 1. Introduction____________________________|delimitMateIntro| + 2. Customization___________________________|delimitMateOptions| + 2.1 Options summary____________________|delimitMateOptionSummary| + 2.2 Options details____________________|delimitMateOptionDetails| + 3. Functionality___________________________|delimitMateFunctionality| + 3.1 Automatic closing & exiting________|delimitMateAutoClose| + 3.2 Expansion of space and CR__________|delimitMateExpansion| + 3.3 Backspace__________________________|delimitMateBackspace| + 3.4 Smart Quotes_______________________|delimitMateSmartQuotes| + 3.5 Balancing matching pairs___________|delimitMateBalance| + 3.6 FileType based configuration_______|delimitMateFileType| + 3.7 Syntax awareness___________________|delimitMateSyntax| + 4. Commands________________________________|delimitMateCommands| + 5. Mappings________________________________|delimitMateMappings| + 6. Functions_______________________________|delimitMateFunctions| + 7. TODO list_______________________________|delimitMateTodo| + 8. Maintainer______________________________|delimitMateMaintainer| + 9. Credits_________________________________|delimitMateCredits| + 10. History_________________________________|delimitMateHistory| + +============================================================================== + 1.- INTRODUCTION *delimitMateIntro* + +This plug-in provides automatic closing of quotes, parenthesis, brackets, +etc.; besides some other related features that should make your time in insert +mode a little bit easier. + +Most of the features can be modified or disabled permanently, using global +variables, or on a FileType basis, using autocommands. With a couple of +exceptions and limitations, this features don't brake undo, redo or history. + +NOTE 1: If you have any trouble with this plugin, please run |:DelimitMateTest| +in a new buffer to see what is not working. + +NOTE 2: |'timeout'| needs to be set when working in the terminal, otherwise you +might find weird behaviour with mappings including or arrow keys. + +NOTE 3: Abbreiations set with |:iabbrev| will not be expanded by delimiters +used on delimitMate, you should use (read |i_CTRL-]|) to expand them on +the go. + +============================================================================== + 2. CUSTOMIZATION *delimitMateOptions* + +You can create your own mappings for some features using the global functions. +Read |DelimitMateFunctions| for more info. + +------------------------------------------------------------------------------ + 2.1 OPTIONS SUMMARY *delimitMateOptionSummary* + +The behaviour of this script can be customized setting the following options +in your vimrc file. You can use local options to set the configuration for +specific file types, see |delimitMateOptionDetails| for examples. + +|'loaded_delimitMate'| Turns off the script. + +|'delimitMate_autoclose'| Tells delimitMate whether to automagically + insert the closing delimiter. + +|'delimitMate_matchpairs'| Tells delimitMate which characters are + matching pairs. + +|'delimitMate_quotes'| Tells delimitMate which quotes should be + used. + +|'delimitMate_nesting_quotes'| Tells delimitMate which quotes should be + allowed to be nested. + +|'delimitMate_expand_cr'| Turns on/off the expansion of . + +|'delimitMate_expand_space'| Turns on/off the expansion of . + +|'delimitMate_smart_quotes'| Turns on/off the "smart quotes" feature. + +|'delimitMate_balance_matchpairs'|Turns on/off the "balance matching pairs" + feature. + +|'delimitMate_excluded_regions'| Turns off the script for the given regions or + syntax group names. + +|'delimitMate_excluded_ft'| Turns off the script for the given file types. + +|'delimitMate_apostrophes'| Tells delimitMate how it should "fix" + balancing of single quotes when used as + apostrophes. NOTE: Not needed any more, kept + for compatibility with older versions. + +------------------------------------------------------------------------------ + 2.2 OPTIONS DETAILS *delimitMateOptionDetails* + +Add the shown lines to your vimrc file in order to set the below options. +Buffer variables take precedence over global ones and can be used along with +autocmd to modify delimitMate's behavior for specific file types, read more in +|delimitMateFileType|. + +Note: Use buffer variables only to set options for specific file types using +:autocmd, use global variables to set options for every buffer. Read more in +|g:var| and |b:var|. + +------------------------------------------------------------------------------ + *'loaded_delimitMate'* + *'b:loaded_delimitMate'* +This option prevents delimitMate from loading. +e.g.: > + let loaded_delimitMate = 1 + au FileType mail let b:loaded_delimitMate = 1 +< +------------------------------------------------------------------------------ + *'delimitMate_autoclose'* + *'b:delimitMate_autoclose'* +Values: 0 or 1. ~ +Default: 1 ~ + +If this option is set to 0, delimitMate will not add a closing delimiter +automagically. See |delimitMateAutoClose| for details. +e.g.: > + let delimitMate_autoclose = 0 + au FileType mail let b:delimitMate_autoclose = 0 +< +------------------------------------------------------------------------------ + *'delimitMate_matchpairs'* + *'b:delimitMate_matchpairs'* +Values: A string with |'matchpairs'| syntax, plus support for multi-byte~ + characters.~ +Default: &matchpairs ~ + +Use this option to tell delimitMate which characters should be considered +matching pairs. Read |delimitMateAutoClose| for details. +e.g: > + let delimitMate_matchpairs = "(:),[:],{:},<:>" + au FileType vim,html let b:delimitMate_matchpairs = "(:),[:],{:},<:>" +< +------------------------------------------------------------------------------ + *'delimitMate_quotes'* + *'b:delimitMate_quotes'* +Values: A string of characters separated by spaces. ~ +Default: "\" ' `" ~ + +Use this option to tell delimitMate which characters should be considered as +quotes. Read |delimitMateAutoClose| for details. +e.g.: > + let delimitMate_quotes = "\" ' ` *" + au FileType html let b:delimitMate_quotes = "\" '" +< +------------------------------------------------------------------------------ + *'delimitMate_nesting_quotes'* + *'b:delimitMate_nesting_quotes'* +Values: A list of quotes. ~ +Default: [] ~ + +Quotes listed here will not be able to jump out of the empty pair, thus +allowing the autoclosed quotes to be nested. +e.g.: > + let delimitMate_nesting_quotes = ['"','`'] + au FileType python let b:delimitMate_nesting_quotes = ['"'] +< +------------------------------------------------------------------------------ + *'delimitMate_expand_cr'* + *'b:delimitMate_expand_cr'* +Values: 1 or 0 ~ +Default: 0 ~ + +This option turns on/off the expansion of . Read |delimitMateExpansion| +for details. +e.g.: > + let delimitMate_expand_cr = 1 + au FileType mail let b:delimitMate_expand_cr = 1 +< +------------------------------------------------------------------------------ + *'delimitMate_expand_space'* + *'b:delimitMate_expand_space'* +Values: 1 or 0 ~ +Default: 0 ~ + +This option turns on/off the expansion of . Read |delimitMateExpansion| +for details. +e.g.: > + let delimitMate_expand_space = 1 + au FileType tcl let b:delimitMate_expand_space = 1 +< +------------------------------------------------------------------------------ + *'delimitMate_smart_quotes'* + *'b:delimitMate_smart_quotes'* +Values: 1 or 0 ~ +Default: 1 ~ + +This option turns on/off the smart quotes feature. Read +|delimitMateSmartQuotes| for details. +e.g.: > + let delimitMate_smart_quotes = 0 + au FileType tcl let b:delimitMate_smart_quotes = 0 +< +------------------------------------------------------------------------------ + *'delimitMate_balance_matchpairs'* + *'b:delimitMate_balance_matchpairs'* +Values: 1 or 0 ~ +Default: 0 ~ + +This option turns on/off the balancing of matching pairs. Read +|delimitMateBalance| for details. +e.g.: > + let delimitMate_balance_matchpairs = 1 + au FileType tcl let b:delimitMate_balance_matchpairs = 1 +< +------------------------------------------------------------------------------ + *'delimitMate_excluded_regions'* +Values: A string of syntax group names names separated by single commas. ~ +Default: Comment ~ + +This options turns delimitMate off for the listed regions, read |group-name| +for more info about what is a region. +e.g.: > + let delimitMate_excluded_regions = "Comments,String" +< +------------------------------------------------------------------------------ + *'delimitMate_excluded_ft'* +Values: A string of file type names separated by single commas. ~ +Default: Empty. ~ + +This options turns delimitMate off for the listed file types, use this option +only if you don't want any of the features it provides on those file types. +e.g.: > + let delimitMate_excluded_ft = "mail,txt" +< +------------------------------------------------------------------------------ + *'delimitMate_apostrophes'* +Values: Strings separated by ":". ~ +Default: No longer used. ~ + +NOTE: This feature is turned off by default, it's been kept for compatibility +with older version, read |delimitMateSmartQuotes| for details. +If auto-close is enabled, this option tells delimitMate how to try to fix the +balancing of single quotes when used as apostrophes. The values of this option +are strings of text where a single quote would be used as an apostrophe (e.g.: +the "n't" of wouldn't or can't) separated by ":". Set it to an empty string to +disable this feature. +e.g.: > + let delimitMate_apostrophes = "" + au FileType tcl let delimitMate_apostrophes = "" +< +============================================================================== + 3. FUNCTIONALITY *delimitMateFunctionality* + +------------------------------------------------------------------------------ + 3.1 AUTOMATIC CLOSING AND EXITING *delimitMateAutoClose* + +With automatic closing enabled, if an opening delimiter is inserted the plugin +inserts the closing delimiter and places the cursor between the pair. With +automatic closing disabled, no closing delimiters is inserted by delimitMate, +but when a pair of delimiters is typed, the cursor is placed in the middle. + +When the cursor is inside an empty pair or located next to the left of a +closing delimiter, the cursor is placed outside the pair to the right of the +closing delimiter. + +Unless |'delimitMate_matchpairs'| or |'delimitMate_quotes'|are set, this +script uses the values in '&matchpairs' to identify the pairs, and ", ' and ` +for quotes respectively. + +The following table shows the behaviour, this applies to quotes too (the final +position of the cursor is represented by a "|"): + +With auto-close: > + Type | You get + ==================== + ( | (|) + –––––––––|–––––––––– + () | ()| + –––––––––|–––––––––– + ( | ()| +< +Without auto-close: > + + Type | You get + ===================== + () | (|) + –––––––––-|–––––––––– + ()) | ()| + –––––––––-|–––––––––– + () | ()| +< +NOTE: Abbreviations will not be expanded by delimiters used on delimitMate, +you should use (read |i_CTRL-]|) to expand them on the go. + +------------------------------------------------------------------------------ + 3.2 EXPANSION OF SPACE AND CAR RETURN *delimitMateExpansion* + +When the cursor is inside an empty pair of delimiters, and can be +expanded, see |'delimitMate_expand_space'| and +|'delimitMate_expand_cr'|: + +Expand to: > + + | You get + ==================================== + (|) | ( | ) +< +Expand to: > + + | You get + ============================ + (|) | ( + | | + | ) +< + +NOTE that the expansion of will brake the redo command. + +Since and are used everywhere, I have made the functions involved +in expansions global, so they can be used to make custom mappings. Read +|delimitMateFunctions| for more details. + +------------------------------------------------------------------------------ + 3.3 BACKSPACE *delimitMateBackspace* + +If you press backspace inside an empty pair, both delimiters are deleted. When +expansions are enabled, will also delete the expansions. NOTE that +deleting expansions will brake the redo command. + +If you type (shift + backspace) instead, only the closing delimiter +will be deleted. NOTE that this will not usually work when using Vim from the +terminal, see 'delimitMate#JumpAny()' below to see how to fix it. + +e.g. typing at the "|": > + + What | Before | After + ============================================== + | call expand(|) | call expand| + ---------|-------------------|----------------- + | call expand( | ) | call expand(|) + ---------|-------------------|----------------- + | call expand( | call expand(|) + | | | + | ) | + ---------|-------------------|----------------- + | call expand(|) | call expand(| +< + +------------------------------------------------------------------------------ + 3.4 SMART QUOTES *delimitMateSmartQuotes* + +Only one quote will be inserted following a quote, a "\" or, following or +preceding an alphanumeric character. This should cover closing quotes after a +string, opening quotes before a string, escaped quotes and apostrophes. Except +for apostrophes, this feature can be disabled setting the option +|'delimitMate_smart_quotes'| to 0. + +e.g. typing at the "|": > + + What | Before | After + ======================================= + " | Text | | Text "|" + " | "String| | "String"| + " | let i = "| | let i = "|" + 'm | I| | I'm| +< +------------------------------------------------------------------------------ + 3.5 BALANCING MATCHING PAIRS *delimitMateBalance* + +When inserting an opening paren and |'delimitMate_balance_matchpairs'| is +enabled, delimitMate will try to balance the closing pairs in the current +line. + +e.g. typing at the "|": > + + What | Before | After + ======================================= + ( | |) | (|) + ( | | | (|) + ( | (|) | ((|)) +< +------------------------------------------------------------------------------ + 3.6 FILE TYPE BASED CONFIGURATION *delimitMateFileType* + +delimitMate options can be set globally for all buffers using global +("regular") variables in your |vimrc| file. But |:autocmd| can be used to set +options for specific file types (see |'filetype'|) using buffer variables in +the following way: > + + au FileType mail,text let b:delimitMate_autoclose = 0 + ^ ^ ^ ^ ^ + | | | | | + | | | | - Option value. + | | | - Option name. + | | - Buffer variable. + | - File types for which the option will be set. + - Don't forget to put this event. +< +NOTE that you should use buffer variables (|b:var|) only to set options with +|:autocmd|, for global options use regular variables (|g:var|) in your vimrc. + +------------------------------------------------------------------------------ + 3.7 SYNTAX AWARENESS *delimitMateSyntax* + +The features of this plug-in might not be always helpful, comments and strings +usualy don't need auto-completion. delimitMate monitors which region is being +edited and if it detects that the cursor is in a comment it'll turn itself off +until the cursor leaves the comment. The excluded regions can be set using the +option |'delimitMate_excluded_regions'|. Read |group-name| for a list of +regions or syntax group names. + +NOTE that this feature relies on a proper syntax file for the current file +type, if the appropiate syntax file doesn't define a region, delimitMate won't +know about it. + +============================================================================== + 4. COMMANDS *delimitMateCommands* + +------------------------------------------------------------------------------ +:DelimitMateReload *:DelimitMateReload* + +Re-sets all the mappings used for this script, use it if any option has been +changed or if the filetype option hasn't been set yet. + +------------------------------------------------------------------------------ +:DelimitMateSwitch *:DelimitMateSwitch* + +Switches the plug-in on and off. + +------------------------------------------------------------------------------ +:DelimitMateTest *:DelimitMateTest* + +This command tests every mapping set-up for this script, useful for testing +custom configurations. + +The following output corresponds to the default values, it will be different +depending on your configuration. "Open & close:" represents the final result +when the closing delimiter has been inserted, either manually or +automatically, see |delimitMateExpansion|. "Delete:" typing backspace in an +empty pair, see |delimitMateBackspace|. "Exit:" typing a closing delimiter +inside a pair of delimiters, see |delimitMateAutoclose|. "Space:" the +expansion, if any, of space, see |delimitMateExpansion|. "Visual-L", +"Visual-R" and "Visual" shows visual wrapping, see +|delimitMateVisualWrapping|. "Car return:" the expansion of car return, see +|delimitMateExpansion|. The cursor's position at the end of every test is +represented by an "|": > + + * AUTOCLOSE: + Open & close: (|) + Delete: | + Exit: ()| + Space: ( |) + Visual-L: (v) + Visual-R: (v) + Car return: ( + |) + + Open & close: {|} + Delete: | + Exit: {}| + Space: { |} + Visual-L: {v} + Visual-R: {v} + Car return: { + |} + + Open & close: [|] + Delete: | + Exit: []| + Space: [ |] + Visual-L: [v] + Visual-R: [v] + Car return: [ + |] + + Open & close: "|" + Delete: | + Exit: ""| + Space: " |" + Visual: "v" + Car return: " + |" + + Open & close: '|' + Delete: | + Exit: ''| + Space: ' |' + Visual: 'v' + Car return: ' + |' + + Open & close: `|` + Delete: | + Exit: ``| + Space: ` |` + Visual: `v` + Car return: ` + |` +< + +============================================================================== + 5. MAPPINGS *delimitMateMappings* + +delimitMate doesn't override any existing map, so you may encounter that it +doesn't work as expected because a mapping is missing. In that case, the +conflicting mappings should be resolved by either disabling the conflicting +mapping or creating a custom mappings. + +In order to make custom mappings easier and prevent overwritting existing +ones, delimitMate uses the || + |hasmapto()| (|usr_41.txt|) construct +for its mappings. + +The following are the mappings alway set by delimitMate: + + is mapped to delimitMateBS + is mapped to delimitMateS-BS + is mapped to delimitMateS-Tab + is mapped to delimitMateDel + is mapped to delimitMateEsc + is mapped to delimitMateLeft + is mapped to delimitMateRight + is mapped to delimitMateHome + is mapped to delimitMateEnd + is mapped to delimitMateUp + is mapped to delimitMateDown + is mapped to delimitMatePageUp + is mapped to delimitMatePageDown + is mapped to delimitMateS-Down + is mapped to delimitMateS-Up + is mapped to delimitMateMLeftMouse + is mapped to delimitMateMRightMouse + +The rest of the mappings correspond to parens, quotes, CR, Space, etc. and they +depend on the values of the delimitMate options, they have the following form: + +delimitMate + char + +e.g.: for "(": + +( is mapped to delimitMate( + +e.g.: If you have expansion enabled, you might want to skip it on pop-up +menus: + + imap pumvisible() ? + \"\" : + \ "delimitMateCR" + + +============================================================================== + 6. FUNCTIONS *delimitMateFunctions* + +------------------------------------------------------------------------------ +delimitMate#WithinEmptyPair() *delimitMate_WithinEmptyPair()* + +Returns 1 if the cursor is inside an empty pair, 0 otherwise. +e.g.: > + + inoremap delimitMate#WithinEmptyPair() ? + \ "\=delimitMate#ExpandReturn()\" : + \ "external_mapping" +< + +------------------------------------------------------------------------------ +delimitMate#ShouldJump() *delimitMate#ShouldJump()* + +Returns 1 if there is a closing delimiter or a quote to the right of the +cursor, 0 otherwise. + +------------------------------------------------------------------------------ +delimitMate#JumpAny(key) *delimitMate#JumpAny()* + +This function returns a mapping that will make the cursor jump to the right +when delimitMate#ShouldJump() returns 1, returns the argument "key" otherwise. +e.g.: You can use this to create your own mapping to jump over any delimiter. +> + inoremap =delimitMate#JumpAny("\") +< + +============================================================================== + 7. TODO LIST *delimitMateTodo* + +- Automatic set-up by file type. +- Make block-wise visual wrapping work on un-even regions. + +============================================================================== + 8. MAINTAINER *delimitMateMaintainer* + +Hi there! My name is Israel Chauca F. and I can be reached at: + mailto:israelchauca@gmail.com + +Feel free to send me any suggestions and/or comments about this plugin, I'll +be very pleased to read them. + +============================================================================== + 9. CREDITS *delimitMateCredits* + +Some of the code that make this script is modified or just shamelessly copied +from the following sources: + + - Ian McCracken + Post titled: Vim, Part II: Matching Pairs: + http://concisionandconcinnity.blogspot.com/ + + - Aristotle Pagaltzis + From the comments on the previous blog post and from: + http://gist.github.com/144619 + + - Karl Guertin + AutoClose: + http://www.vim.org/scripts/script.php?script_id=1849 + + - Thiago Alves + AutoClose: + http://www.vim.org/scripts/script.php?script_id=2009 + + - Edoardo Vacchi + ClosePairs: + http://www.vim.org/scripts/script.php?script_id=2373 + +This script was inspired by the auto-completion of delimiters on TextMate. + +============================================================================== + 10. HISTORY *delimitMateHistory* + + Version Date Release notes ~ +|---------|------------|-----------------------------------------------------| + 2.5.1 2010-09-30 * Current release: + - Remove visual wrapping. Surround.vim offers a much + better implementation. + - Minor mods to DelimitMateTest. +|---------|------------|-----------------------------------------------------| + 2.5 2010-09-22 * - Better handling of mappings. + - Add report for mappings in |:DelimitMateTest|. + - Allow the use of "|" and multi-byte characters in + |'delimitMate_quotes'| and |'delimitMate_matchpairs'|. + - Allow commands to be concatenated using |. +|---------|------------|-----------------------------------------------------| + 2.4.1 2010-07-31 * - Fix problem with and . + - Add missing doc on |'delimitMate_smart_quotes'|, + |delimitMateBalance| and + |'delimitMate_balance_matchpairs'|. +|---------|------------|-----------------------------------------------------| + 2.4 2010-07-29 * - Unbalanced parens: see :help delimitMateBalance. + - Visual wrapping now works on block-wise visual + with some limitations. + - Arrow keys didn't work on terminal. + - Added option to allow nested quotes. + - Expand Smart Quotes to look for a string on the + right of the cursor. + +|---------|------------|-----------------------------------------------------| + 2.3.1 2010-06-06 * - Fix: an extra is inserted after + expansion. + +|---------|------------|-----------------------------------------------------| + 2.3 2010-06-06 * - Syntax aware: Will turn off when editing comments + or other regions, customizable. + - Changed format of most mappings. + - Fix: expansion doesn't brake automatic + indentation adjustments anymore. + - Fix: Arrow keys would insert A, B, C or D instead + of moving the cursor when using Vim on a terminal. + +|---------|------------|-----------------------------------------------------| + 2.2 2010-05-16 * - Added command to switch the plug-in on and off. + - Fix: some problems with , and . + - Fix: A small problem when inserting a delimiter at + the beginning of the line. + +|---------|------------|-----------------------------------------------------| + 2.1 2010-05-10 * - Most of the functions have been moved to an + autoload script to avoid loading unnecessary ones. + - Fixed a problem with the redo command. + - Many small fixes. + +|---------|------------|-----------------------------------------------------| + 2.0 2010-04-01 * New features: + - All features are redo/undo-wise safe. + - A single quote typed after an alphanumeric + character is considered an apostrophe and one + single quote is inserted. + - A quote typed after another quote inserts a single + quote and the cursor jumps to the middle. + - jumps out of any empty pair. + - and expansions are fixed, but the + functions used for it are global and can be used in + custom mappings. The previous system is still + active if you have any of the expansion options + set. + - deletes the closing delimiter. + * Fixed bug: + - s:vars were being used to store buffer options. + +|---------|------------|-----------------------------------------------------| + 1.6 2009-10-10 * Now delimitMate tries to fix the balancing of single + quotes when used as apostrophes. You can read + |delimitMate_apostrophes| for details. + Fixed an error when |b:delimitMate_expand_space| + wasn't set but |delimitMate_expand_space| wasn't. + +|---------|------------|-----------------------------------------------------| + 1.5 2009-10-05 * Fix: delimitMate should work correctly for files + passed as arguments to Vim. Thanks to Ben Beuchler + for helping to nail this bug. + +|---------|------------|-----------------------------------------------------| + 1.4 2009-09-27 * Fix: delimitMate is now enabled on new buffers even + if they don't have set the file type option or were + opened directly from the terminal. + +|---------|------------|-----------------------------------------------------| + 1.3 2009-09-24 * Now local options can be used along with autocmd + for specific file type configurations. + Fixes: + - Unnamed register content is not lost on visual + mode. + - Use noremap where appropiate. + - Wrapping a single empty line works as expected. + +|---------|------------|-----------------------------------------------------| + 1.2 2009-09-07 * Fixes: + - When inside nested empty pairs, deleting the + innermost left delimiter would delete all right + contiguous delimiters. + - When inside an empty pair, inserting a left + delimiter wouldn't insert the right one, instead + the cursor would jump to the right. + - New buffer inside the current window wouldn't + have the mappings set. + +|---------|------------|-----------------------------------------------------| + 1.1 2009-08-25 * Fixed an error that ocurred when mapleader wasn't + set and added support for GetLatestScripts + auto-detection. + +|---------|------------|-----------------------------------------------------| + 1.0 2009-08-23 * Initial upload. + +|---------|------------|-----------------------------------------------------| + + + `\|||/´ MMM \|/ www __^__ ~ + (o o) (o o) @ @ (O-O) /(o o)\\ ~ +ooO_(_)_Ooo__ ooO_(_)_Ooo___oOO_(_)_OOo___oOO__(_)__OOo___oOO__(_)__OOo_____ ~ +_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|____ ~ +__|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_ ~ +_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|____ ~ + +vim:tw=78:et:ts=2:sw=2:ft=help:norl:formatoptions+=tcroqn:autoindent: diff -r 662f1676bfb4 -r 90083699bcd2 vim/bundle/delimitMate/autoload/delimitMate.vim --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vim/bundle/delimitMate/autoload/delimitMate.vim Mon Nov 15 17:15:57 2010 -0500 @@ -0,0 +1,538 @@ +" ============================================================================ +" File: autoload/delimitMate.vim +" Version: 2.5.1 +" Modified: 2010-09-30 +" Description: This plugin provides auto-completion for quotes, parens, etc. +" Maintainer: Israel Chauca F. +" Manual: Read ":help delimitMate". + +" Utilities {{{ + +let delimitMate_loaded = 1 + +function! delimitMate#ShouldJump() "{{{ + " Returns 1 if the next character is a closing delimiter. + let col = col('.') + let lcol = col('$') + let char = getline('.')[col - 1] + + " Closing delimiter on the right. + for cdel in b:_l_delimitMate_right_delims + b:_l_delimitMate_quotes_list + if char == cdel + return 1 + endif + endfor + + " Closing delimiter with space expansion. + let nchar = getline('.')[col] + if b:_l_delimitMate_expand_space && char == " " + for cdel in b:_l_delimitMate_right_delims + b:_l_delimitMate_quotes_list + if nchar == cdel + return 1 + endif + endfor + endif + + " Closing delimiter with CR expansion. + let uchar = getline(line('.') + 1)[0] + if b:_l_delimitMate_expand_cr && char == "" + for cdel in b:_l_delimitMate_right_delims + b:_l_delimitMate_quotes_list + if uchar == cdel + return 1 + endif + endfor + endif + + return 0 +endfunction "}}} + +function! delimitMate#IsEmptyPair(str) "{{{ + for pair in b:_l_delimitMate_matchpairs_list + if a:str == join( split( pair, ':' ),'' ) + return 1 + endif + endfor + for quote in b:_l_delimitMate_quotes_list + if a:str == quote . quote + return 1 + endif + endfor + return 0 +endfunction "}}} + +function! delimitMate#IsCRExpansion() " {{{ + let nchar = getline(line('.')-1)[-1:] + let schar = getline(line('.')+1)[:0] + let isEmpty = getline('.') == "" + if index(b:_l_delimitMate_left_delims, nchar) > -1 && + \ index(b:_l_delimitMate_left_delims, nchar) == index(b:_l_delimitMate_right_delims, schar) && + \ isEmpty + return 1 + elseif index(b:_l_delimitMate_quotes_list, nchar) > -1 && + \ index(b:_l_delimitMate_quotes_list, nchar) == index(b:_l_delimitMate_quotes_list, schar) && + \ isEmpty + return 1 + else + return 0 + endif +endfunction " }}} delimitMate#IsCRExpansion() + +function! delimitMate#IsSpaceExpansion() " {{{ + let line = getline('.') + let col = col('.')-2 + if col > 0 + let pchar = line[col - 1] + let nchar = line[col + 2] + let isSpaces = (line[col] == line[col+1] && line[col] == " ") + + if index(b:_l_delimitMate_left_delims, pchar) > -1 && + \ index(b:_l_delimitMate_left_delims, pchar) == index(b:_l_delimitMate_right_delims, nchar) && + \ isSpaces + return 1 + elseif index(b:_l_delimitMate_quotes_list, pchar) > -1 && + \ index(b:_l_delimitMate_quotes_list, pchar) == index(b:_l_delimitMate_quotes_list, nchar) && + \ isSpaces + return 1 + endif + endif + return 0 +endfunction " }}} IsSpaceExpansion() + +function! delimitMate#WithinEmptyPair() "{{{ + let cur = strpart( getline('.'), col('.')-2, 2 ) + return delimitMate#IsEmptyPair( cur ) +endfunction "}}} + +function! delimitMate#WriteBefore(str) "{{{ + let len = len(a:str) + let line = getline('.') + let col = col('.')-2 + if col < 0 + call setline('.',line[(col+len+1):]) + else + call setline('.',line[:(col)].line[(col+len+1):]) + endif + return a:str +endfunction " }}} + +function! delimitMate#WriteAfter(str) "{{{ + let len = len(a:str) + let line = getline('.') + let col = col('.')-2 + if (col) < 0 + call setline('.',a:str.line) + else + call setline('.',line[:(col)].a:str.line[(col+len):]) + endif + return '' +endfunction " }}} + +function! delimitMate#GetSyntaxRegion(line, col) "{{{ + return synIDattr(synIDtrans(synID(a:line, a:col, 1)), 'name') +endfunction " }}} + +function! delimitMate#GetCurrentSyntaxRegion() "{{{ + let col = col('.') + if col == col('$') + let col = col - 1 + endif + return delimitMate#GetSyntaxRegion(line('.'), col) +endfunction " }}} + +function! delimitMate#GetCurrentSyntaxRegionIf(char) "{{{ + let col = col('.') + let origin_line = getline('.') + let changed_line = strpart(origin_line, 0, col - 1) . a:char . strpart(origin_line, col - 1) + call setline('.', changed_line) + let region = delimitMate#GetSyntaxRegion(line('.'), col) + call setline('.', origin_line) + return region +endfunction "}}} + +function! delimitMate#IsForbidden(char) "{{{ + if b:_l_delimitMate_excluded_regions_enabled == 0 + return 0 + endif + "let result = index(b:_l_delimitMate_excluded_regions_list, delimitMate#GetCurrentSyntaxRegion()) >= 0 + if index(b:_l_delimitMate_excluded_regions_list, delimitMate#GetCurrentSyntaxRegion()) >= 0 + "echom "Forbidden 1!" + return 1 + endif + let region = delimitMate#GetCurrentSyntaxRegionIf(a:char) + "let result = index(b:_l_delimitMate_excluded_regions_list, region) >= 0 + "return result || region == 'Comment' + "echom "Forbidden 2!" + return index(b:_l_delimitMate_excluded_regions_list, region) >= 0 +endfunction "}}} + +function! delimitMate#FlushBuffer() " {{{ + let b:_l_delimitMate_buffer = [] + return '' +endfunction " }}} + +function! delimitMate#BalancedParens(char) "{{{ + " Returns: + " = 0 => Parens balanced. + " > 0 => More opening parens. + " < 0 => More closing parens. + + let line = getline('.') + let col = col('.') - 2 + let col = col >= 0 ? col : 0 + let list = split(line, '\zs') + let left = b:_l_delimitMate_left_delims[index(b:_l_delimitMate_right_delims, a:char)] + let right = a:char + let opening = 0 + let closing = 0 + + " If the cursor is not at the beginning, count what's behind it. + if col > 0 + " Find the first opening paren: + let start = index(list, left) + " Must be before cursor: + let start = start < col ? start : col - 1 + " Now count from the first opening until the cursor, this will prevent + " extra closing parens from being counted. + let opening = count(list[start : col - 1], left) + let closing = count(list[start : col - 1], right) + " I don't care if there are more closing parens than opening parens. + let closing = closing > opening ? opening : closing + endif + + " Evaluate parens from the cursor to the end: + let opening += count(list[col :], left) + let closing += count(list[col :], right) + + "echom "–––––––––" + "echom line + "echom col + ""echom left.":".a:char + "echom string(list) + "echom string(list[start : col - 1]) . " : " . string(list[col :]) + "echom opening . " - " . closing . " = " . (opening - closing) + + " Return the found balance: + return opening - closing +endfunction "}}} + +" }}} + +" Doers {{{ +function! delimitMate#SkipDelim(char) "{{{ + if delimitMate#IsForbidden(a:char) + return a:char + endif + let col = col('.') - 1 + let line = getline('.') + if col > 0 + let cur = line[col] + let pre = line[col-1] + else + let cur = line[col] + let pre = "" + endif + if pre == "\\" + " Escaped character + return a:char + elseif cur == a:char + " Exit pair + "return delimitMate#WriteBefore(a:char) + return a:char . delimitMate#Del() + elseif delimitMate#IsEmptyPair( pre . a:char ) + " Add closing delimiter and jump back to the middle. + call insert(b:_l_delimitMate_buffer, a:char) + return delimitMate#WriteAfter(a:char) + else + " Nothing special here, return the same character. + return a:char + endif +endfunction "}}} + +function! delimitMate#ParenDelim(char) " {{{ + if delimitMate#IsForbidden(a:char) + return '' + endif + " Try to balance matchpairs + if b:_l_delimitMate_balance_matchpairs && + \ delimitMate#BalancedParens(a:char) <= 0 + return '' + endif + let line = getline('.') + let col = col('.')-2 + if b:_l_delimitMate_smart_matchpairs && + \ line[col+1] =~ '\w' + return '' + elseif (col) < 0 + call setline('.',a:char.line) + call insert(b:_l_delimitMate_buffer, a:char) + else + "echom string(col).':'.line[:(col)].'|'.line[(col+1):] + call setline('.',line[:(col)].a:char.line[(col+1):]) + call insert(b:_l_delimitMate_buffer, a:char) + endif + return '' +endfunction " }}} + +function! delimitMate#QuoteDelim(char) "{{{ + if delimitMate#IsForbidden(a:char) + return a:char + endif + let line = getline('.') + let col = col('.') - 2 + if line[col] == "\\" + " Seems like a escaped character, insert one quotation mark. + return a:char + elseif line[col + 1] == a:char && + \ index(b:_l_delimitMate_nesting_quotes, a:char) < 0 + " Get out of the string. + return a:char . delimitMate#Del() + elseif (line[col] =~ '\w' && a:char == "'") || + \ (b:_l_delimitMate_smart_quotes && + \ (line[col] =~ '\w' || + \ line[col + 1] =~ '\w')) + " Seems like an apostrophe or a smart quote case, insert a single quote. + return a:char + elseif (line[col] == a:char && line[col + 1 ] != a:char) && b:_l_delimitMate_smart_quotes + " Seems like we have an unbalanced quote, insert one quotation mark and jump to the middle. + call insert(b:_l_delimitMate_buffer, a:char) + return delimitMate#WriteAfter(a:char) + else + " Insert a pair and jump to the middle. + call insert(b:_l_delimitMate_buffer, a:char) + call delimitMate#WriteAfter(a:char) + return a:char + endif +endfunction "}}} + +function! delimitMate#JumpOut(char) "{{{ + if delimitMate#IsForbidden(a:char) + return a:char + endif + let line = getline('.') + let col = col('.')-2 + if line[col+1] == a:char + return a:char . delimitMate#Del() + else + return a:char + endif +endfunction " }}} + +function! delimitMate#JumpAny(key) " {{{ + if delimitMate#IsForbidden('') + return a:key + endif + if !delimitMate#ShouldJump() + return a:key + endif + " Let's get the character on the right. + let char = getline('.')[col('.')-1] + if char == " " + " Space expansion. + "let char = char . getline('.')[col('.')] . delimitMate#Del() + return char . getline('.')[col('.')] . delimitMate#Del() . delimitMate#Del() + "call delimitMate#RmBuffer(1) + elseif char == "" + " CR expansion. + "let char = "\" . getline(line('.') + 1)[0] . "\" + let b:_l_delimitMate_buffer = [] + return "\" . getline(line('.') + 1)[0] . "\" + else + "call delimitMate#RmBuffer(1) + return char . delimitMate#Del() + endif +endfunction " delimitMate#JumpAny() }}} + +function! delimitMate#MapMsg(msg) "{{{ + redraw + echomsg a:msg + return "" +endfunction "}}} + +function! delimitMate#ExpandReturn() "{{{ + if delimitMate#IsForbidden("") + return "\" + endif + if delimitMate#WithinEmptyPair() + " Expand: + call delimitMate#FlushBuffer() + "return "\a\x\\k$\"_xa" + return "\\\o" + else + return "\" + endif +endfunction "}}} + +function! delimitMate#ExpandSpace() "{{{ + if delimitMate#IsForbidden("\") + return "\" + endif + if delimitMate#WithinEmptyPair() + " Expand: + call insert(b:_l_delimitMate_buffer, 's') + return delimitMate#WriteAfter(' ') . "\" + else + return "\" + endif +endfunction "}}} + +function! delimitMate#BS() " {{{ + if delimitMate#IsForbidden("") + return "\" + endif + if delimitMate#WithinEmptyPair() + "call delimitMate#RmBuffer(1) + return "\" . delimitMate#Del() +" return "\\\" + elseif delimitMate#IsSpaceExpansion() + "call delimitMate#RmBuffer(1) + return "\" . delimitMate#Del() + elseif delimitMate#IsCRExpansion() + return "\\" + else + return "\" + endif +endfunction " }}} delimitMate#BS() + +function! delimitMate#Del() " {{{ + if len(b:_l_delimitMate_buffer) > 0 + let line = getline('.') + let col = col('.') - 2 + call delimitMate#RmBuffer(1) + call setline('.', line[:col] . line[col+2:]) + return '' + else + return "\" + endif +endfunction " }}} + +function! delimitMate#Finish() " {{{ + let len = len(b:_l_delimitMate_buffer) + if len > 0 + let buffer = join(b:_l_delimitMate_buffer, '') + let len2 = len(buffer) + " Reset buffer: + let b:_l_delimitMate_buffer = [] + let line = getline('.') + let col = col('.') -2 + "echom 'col: ' . col . '-' . line[:col] . "|" . line[col+len+1:] . '%' . buffer + if col < 0 + call setline('.', line[col+len2+1:]) + else + call setline('.', line[:col] . line[col+len2+1:]) + endif + let i = 1 + let lefts = "\" + while i < len + let lefts = lefts . "\" + let i += 1 + endwhile + return substitute(buffer, "s", "\", 'g') . lefts + endif + return '' +endfunction " }}} + +function! delimitMate#RmBuffer(num) " {{{ + if len(b:_l_delimitMate_buffer) > 0 + call remove(b:_l_delimitMate_buffer, 0, (a:num-1)) + endif + return "" +endfunction " }}} + +" }}} + +" Tools: {{{ +function! delimitMate#TestMappings() "{{{ + let options = sort(keys(delimitMate#OptionsList())) + let optoutput = ['delimitMate Report', '==================', '', '* Options: (-) unset, (g) global, (b) buffer',''] + for option in options + exec 'call add(optoutput, ''('.(exists('b:delimitMate_'.option) ? 'b' : exists('g:delimitMate_'.option) ? 'g' : '-').') delimitMate_''.option.'' = ''.string(b:_l_delimitMate_'.option.'))' + endfor + call append(line('$'), optoutput + ['--------------------','']) + + " Check if mappings were set. {{{ + let imaps = b:_l_delimitMate_right_delims + let imaps = imaps + ( b:_l_delimitMate_autoclose ? b:_l_delimitMate_left_delims : [] ) + let imaps = imaps + + \ b:_l_delimitMate_quotes_list + + \ b:_l_delimitMate_apostrophes_list + + \ ['', '', '', '', ''] + + \ ['', '', '', '', '', ''] + + \ ['', '', '', '', '', ''] + let imaps = imaps + ( b:_l_delimitMate_expand_cr ? [''] : [] ) + let imaps = imaps + ( b:_l_delimitMate_expand_space ? [''] : [] ) + + let vmaps = + \ b:_l_delimitMate_right_delims + + \ b:_l_delimitMate_left_delims + + \ b:_l_delimitMate_quotes_list + + let ibroken = [] + for map in imaps + if maparg(map, "i") !~? 'delimitMate' + let output = '' + if map == '|' + let map = '' + endif + redir => output | execute "verbose imap ".map | redir END + let ibroken = ibroken + [map.": is not set:"] + split(output, '\n') + endif + endfor + + unlet! output + if ibroken == [] + let output = ['* Mappings:', '', 'All mappings were set-up.', '--------------------', '', ''] + else + let output = ['* Mappings:', ''] + ibroken + ['--------------------', ''] + endif + call append('$', output+['* Showcase:', '']) + " }}} + if b:_l_delimitMate_autoclose + " {{{ + for i in range(len(b:_l_delimitMate_left_delims)) + exec "normal GGoOpen: " . b:_l_delimitMate_left_delims[i]. "|" + exec "normal oDelete: " . b:_l_delimitMate_left_delims[i] . "\|" + exec "normal oExit: " . b:_l_delimitMate_left_delims[i] . b:_l_delimitMate_right_delims[i] . "|" + exec "normal oSpace: " . b:_l_delimitMate_left_delims[i] . " |" + exec "normal oDelete space: " . b:_l_delimitMate_left_delims[i] . " \|" + exec "normal oCar return: " . b:_l_delimitMate_left_delims[i] . "\|" + exec "normal GGoDelete car return: " . b:_l_delimitMate_left_delims[i] . "\\|\GG\o" + endfor + for i in range(len(b:_l_delimitMate_quotes_list)) + exec "normal GGAOpen: " . b:_l_delimitMate_quotes_list[i] . "|" + exec "normal oDelete: " . b:_l_delimitMate_quotes_list[i] . "\|" + exec "normal oExit: " . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . "|" + exec "normal oSpace: " . b:_l_delimitMate_quotes_list[i] . " |" + exec "normal oDelete space: " . b:_l_delimitMate_quotes_list[i] . " \|" + exec "normal oCar return: " . b:_l_delimitMate_quotes_list[i] . "\|" + exec "normal GGoDelete car return: " . b:_l_delimitMate_quotes_list[i] . "\\|\GG\o" + endfor + "}}} + else + "{{{ + for i in range(len(b:_l_delimitMate_left_delims)) + exec "normal GGoOpen & close: " . b:_l_delimitMate_left_delims[i] . b:_l_delimitMate_right_delims[i] . "|" + exec "normal oDelete: " . b:_l_delimitMate_left_delims[i] . b:_l_delimitMate_right_delims[i] . "\|" + exec "normal oExit: " . b:_l_delimitMate_left_delims[i] . b:_l_delimitMate_right_delims[i] . b:_l_delimitMate_right_delims[i] . "|" + exec "normal oSpace: " . b:_l_delimitMate_left_delims[i] . b:_l_delimitMate_right_delims[i] . " |" + exec "normal oDelete space: " . b:_l_delimitMate_left_delims[i] . b:_l_delimitMate_right_delims[i] . " \|" + exec "normal oCar return: " . b:_l_delimitMate_left_delims[i] . b:_l_delimitMate_right_delims[i] . "\|" + exec "normal GGoDelete car return: " . b:_l_delimitMate_left_delims[i] . b:_l_delimitMate_right_delims[i] . "\\|\GG\o" + endfor + for i in range(len(b:_l_delimitMate_quotes_list)) + exec "normal GGoOpen & close: " . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . "|" + exec "normal oDelete: " . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . "\|" + exec "normal oExit: " . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . "|" + exec "normal oSpace: " . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . " |" + exec "normal oDelete space: " . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . " \|" + exec "normal oCar return: " . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . "\|" + exec "normal GGoDelete car return: " . b:_l_delimitMate_quotes_list[i] . b:_l_delimitMate_quotes_list[i] . "\\|\GG\o" + endfor + endif "}}} +endfunction "}}} + +function! delimitMate#OptionsList() "{{{ + return {'autoclose' : 1,'matchpairs': &matchpairs, 'quotes' : '" '' `', 'nesting_quotes' : [], 'expand_cr' : 0, 'expand_space' : 0, 'smart_quotes' : 1, 'smart_matchpairs' : 1, 'balance_matchpairs' : 0, 'excluded_regions' : 'Comment', 'excluded_ft' : '', 'apostrophes' : ''} +endfunction " delimitMate#OptionsList }}} +"}}} + +" vim:foldmethod=marker:foldcolumn=4 diff -r 662f1676bfb4 -r 90083699bcd2 vim/bundle/delimitMate/autoload/delimitMateTests.vim --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vim/bundle/delimitMate/autoload/delimitMateTests.vim Mon Nov 15 17:15:57 2010 -0500 @@ -0,0 +1,260 @@ +function! delimitMateTests#Main() + if !exists("g:delimitMate_testing") + echoerr "delimitMateTests#Main(): If you really want to use me, you must set delimitMate_testing to any value." + return + elseif g:delimitMate_testing == "fork" + !gvim -N -u NONE -U NONE -c "set backspace=eol,start" -c "set background=light" -c "syntax on" -c "let delimitMate_testing = 1" -c "so autoload/delimitMate.vim" -c "so autoload/delimitMateTests.vim" -c "so plugin/delimitMate.vim" -c "call delimitMateTests\#Main()" + return "" + endif + nmap :qall! + let nomore = &more + set nomore + let b:test_results = {} + let b:errors = 0 + let b:corrects = 0 + let b:ignores = 0 + + function! SetOptions(list) " {{{ + let b:delimitMate_autoclose = 1 + let b:delimitMate_matchpairs = &matchpairs + let b:delimitMate_quotes = "\" ' `" + let b:delimitMate_excluded_regions = "Comment" + let b:delimitMate_expand_space = 0 + let b:delimitMate_expand_cr = 0 + let b:delimitMate_smart_quotes = 1 + let b:delimitMate_apostrophes = "" + let b:delimitMate_tab2exit = 1 + " Set current test options: + for str in a:list + "echom '1:'.str + let op = strpart(str, 0, stridx(str,':')) + "echom op + let val = strpart(str, stridx(str, ':' ) + 1) + "echom val + exec "let b:delimitMate_" . op . " = " . val + endfor + DelimitMateReload + endfunction " }}} + + function! Type(name, input, output, options, ...) " {{{ + if a:0 > 0 + let ignore = a:1 + else + let ignore = 0 + endif + if a:input != "\." + " Set default options: + call SetOptions(a:options) + let CapR = "" + normal ggVG"_d + exec "normal i" . a:input . "|\" + else + let CapR = "_R" + normal gg. + endif + + exec "normal \" + call setpos('.', [0, 1, 1, 0]) + let result = len(a:output) != line('$') + for line in a:output + if getline('.') != line || result == 1 + let result = 1 + break + endif + call setpos('.', [0, line('.') + 1, 1, 0]) + endfor + let text = getline('.') + let i = 2 + while i <= line('$') + let text = text . "" . getline(i) + let i += 1 + endwhile + if ignore == 1 + let label = "Ignored" + let result = "?=" + let b:ignores += 1 + elseif result == 0 + let label = "Passed" + let result = "==" + let b:corrects += 1 + else + let label = "Failed" + let result = "!=" + let b:errors += 1 + endif + exec "let b:test_results['" . + \ substitute(a:name, "[^a-zA-Z0-9_]", "_", "g") . CapR . "'] = '" . + \ label . ": ' . a:input . ' => ' . text . ' " . + \ result . " ' . join(a:output, '')" + endfunction " }}} + + function! RepeatLast(name, output, ...) " {{{ + if a:0 > 0 + let arg1 = a:1 + else + let arg1 = '' + endif + call Type(a:name, "\.", a:output, [], arg1) + endfunction " }}} + + " Test's test {{{ + call Type("Test 1", "123", ["123|"], []) + call RepeatLast("Test 1", ["123|123|"]) + + " Auto-closing parens + call Type("Autoclose parens", "(", ["(|)"], []) + call RepeatLast("Autoclose_parens", ["(|)(|)"]) + + " Auto-closing quotes + call Type("Autoclose quotes", '"', ['"|"'], []) + call RepeatLast("Autoclose_quotes", ['"|""|"']) + + " Deleting parens + call Type("Delete empty parens", "(\", ["|"], []) + call RepeatLast("Delete empty parens", ["||"]) + + " Deleting quotes + call Type("Delete emtpy quotes", "\"\", ['|'], []) + call RepeatLast("Delete empty quotes", ["||"]) + + " Manual closing parens + call Type("Manual closing parens", "()", ["(|)"], ["autoclose:0"]) + call RepeatLast("Manual closing parens", ["(|)(|)"]) + + " Manual closing quotes + call Type("Manual closing quotes", "\"\"", ['"|"'], ["autoclose:0"]) + call RepeatLast("Manual closing quotes", ['"|""|"']) + + " Jump over paren + call Type("Jump over paren", "()", ['()|'], []) + call RepeatLast("Jump over paren", ['()|()|']) + + " Jump over quote + call Type("Jump over quote", "\"\"", ['""|'], []) + call RepeatLast("Jump over quote", ['""|""|']) + + " Apostrophe + call Type("Apostrophe", "test'", ["test'|"], []) + call RepeatLast("Apostrophe", ["test'|test'|"]) + + " Close quote + call Type("Close quote", "'\\a'", ["'|'"], []) + + " Closing paren + call Type("Closing paren", "abcd)", ["abcd)|"], []) + + " + call Type("S Tab", "(\", ["()|"], []) + call RepeatLast("S Tab", ["()|()|"]) + + " Space expansion + call Type("Space expansion", "(\\", ['(|)'], ['expand_space:1']) + call RepeatLast("BS with space expansion", ['(|)(|)']) + + " BS with space expansion + call Type("BS with space expansion", "(\", ['( | )'], ['expand_space:1']) + call RepeatLast("Space expansion", ['( | )( | )']) + + " Car return expansion + call Type("CR expansion", "(\", ['(', '|', ')'], ['expand_cr:1']) + call RepeatLast("CR expansion", ['(', '|', ')(', '|', ')'], 1) + + " BS with car return expansion + call Type("BS with CR expansion", "(\\", ['(|)'], ['expand_cr:1']) + call RepeatLast("BS with CR expansion", ['(|)(|)'], 1) + + " Smart quotes + call Type("Smart quote alphanumeric", "a\"4", ['a"4|'], []) + call RepeatLast("Smart quote alphanumeric", ['a"4|a"4|']) + + " Smart quotes + call Type("Smart quote escaped", "esc\\\"", ['esc\"|'], []) + call RepeatLast("Smart quote escaped", ['esc\"|esc\"|']) + + " Smart quotes + call Type("Smart quote apostrophe", "I'm", ["I'm|"], ['smart_quotes:0']) + call RepeatLast("Smart quote escaped", ["I'm|I'm|"]) + + " Backspace inside space expansion + call Type("Backspace inside space expansion", "(\\", ['(|)'], ['expand_space:1']) + call RepeatLast("Backspace inside space expansion", ['(|)(|)']) + + " inserts text + call Type(" inserts text", "(he\\th\\", ['(he) th|'], []) + + " Backspace inside CR expansion + call Type("Backspace inside CR expansion", "(\\", ['(|)'], ['expand_cr:1']) + call RepeatLast("Backspace inside CR expansion", ['(|)(|)'], 1) + + " FileType event + let g:delimitMate_excluded_ft = "vim" + set ft=vim + call Type("FileType Autoclose parens", "(", ["(|"], []) + unlet g:delimitMate_excluded_ft + set ft= + + " Duplicated delimiter after CR + call Type("Duplicated delimiter after CR", "(\", ['(', '|)'], []) + + " Deactivate on comments: The first call to a closing delimiter + " will not work here as expected, but it does in real life tests. + set ft=vim + call Type("Deactivate on comments", "\"()``[]''\"\"", ["\"()``[]''\"\"|"], ["autoclose:0"], 1) + set ft= + + " Deactivate parens on comments: The first call to a closing delimiter + " will not work here as expected, but it does in real life tests. + set ft=vim + call Type("Deactivate parens on comments", "\"()[]", ["\"()[]|"], ["autoclose:0"], 1) + set ft= + + " Deactivate quotes on comments: See previous note. + set ft=vim + call Type("Deactivate parens on comments", "\"(`", ["\"(``|"], [], 1) + set ft= + + " Manual close at start of line + call Type("Manual close at start of line", "m)\\)", [')|m)'], ["autoclose:0"]) + + " Use | in quotes + call Type("Use in quotes", "\bars", ['|bars|'], ["quotes:'|'"]) + + " Use | in matchpairs + call Type("Use in matchpairs", "\bars", ['|bars|$$'], ["matchpairs:'|:$'"]) + + "}}} + + " Show results: {{{ + normal ggVG"_d + call append(0, split(string(b:test_results)[1:-2], ', ')) + call append(0, "*TESTS REPORT: " . b:errors . " failed, " . b:corrects . " passed and " . b:ignores . " ignored.") + normal "_ddgg + let @/ = ".\\+Failed:.*!=" + 2,$sort /^.\+':/ + normal gg + exec search('Ignored:','nW').",$sort! /^.\\+':/" + set nohlsearch + syn match lineIgnored ".*Ignored.*" + syn match labelPassed "'\@<=.\+\(': 'Passed\)\@=" + syn match labelFailed "'\@<=.\+\(': 'Failed\)\@=" + syn match resultPassed "\('Passed: \)\@<=.\+\('$\)\@=" + syn match resultFailed "\('Failed: \)\@<=.\+\('$\)\@=" contains=resultInequal + syn match resultIgnored "\('Ignored: \)\@<=.\+\('$\)\@=" + syn match resultInequal "!=" + syn match resultSummary "^\*.\+" contains=resultSummaryNumber + syn match resultSummaryNumber "[1-9][0-9]* failed*" contained + + hi def link lineIgnored Ignore + hi def link labelPassed Comment + hi def link labelFailed Special + hi def link resultPassed Ignore + hi def link resultFailed Boolean + hi def link resultInequal Error + hi def link resultSummary SpecialComment + hi def link resultSummaryNumber Error + " }}} + + let &more = nomore +endfunction +" vim:foldmethod=marker:foldcolumn=4 + diff -r 662f1676bfb4 -r 90083699bcd2 vim/bundle/delimitMate/doc/delimitMate.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vim/bundle/delimitMate/doc/delimitMate.txt Mon Nov 15 17:15:57 2010 -0500 @@ -0,0 +1,799 @@ +*delimitMate.txt* Trying to keep those beasts at bay! v2.5.1 *delimitMate* + + + + MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM + MMMM MMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMM MMMMM MMMMMMMMMMMMMMMMMMMMM ~ + MMMM MMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMM MMM MMMMMMMMMMMMMMMMMMMMM + MMMM MMMMMMMMM MMMMMMMMMMMMMMMMMMMMM MMM M M MMMMMMMMMM MMMMMMMMM ~ + MMMM MMM MMM MM MM M M MMM MM MM MM MM MMM MMM MMM MM + MM MM M MM MMMMMM MMMMMMM MMM MMMMM MM M MMM MMM M M ~ + M M MM MM MM MM M M MM MMM MMM MMMMM MMMMM MMM MMM M + M M MM MMMMM MM MM M M MM MMM MMM MMMMM MMM MMM MMM MMMM ~ + M M MM M MM MM MM M M MM MMM MMM MMMMM MM M MMM MMM M M + MM MMM MMM MM MM M M MM MMM MM MMMMM MMM MMM MMM MM ~ + MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM + + + +============================================================================== + 0.- CONTENTS *delimitMate-contents* + + 1. Introduction____________________________|delimitMateIntro| + 2. Customization___________________________|delimitMateOptions| + 2.1 Options summary____________________|delimitMateOptionSummary| + 2.2 Options details____________________|delimitMateOptionDetails| + 3. Functionality___________________________|delimitMateFunctionality| + 3.1 Automatic closing & exiting________|delimitMateAutoClose| + 3.2 Expansion of space and CR__________|delimitMateExpansion| + 3.3 Backspace__________________________|delimitMateBackspace| + 3.4 Smart Quotes_______________________|delimitMateSmartQuotes| + 3.5 Balancing matching pairs___________|delimitMateBalance| + 3.6 FileType based configuration_______|delimitMateFileType| + 3.7 Syntax awareness___________________|delimitMateSyntax| + 4. Commands________________________________|delimitMateCommands| + 5. Mappings________________________________|delimitMateMappings| + 6. Functions_______________________________|delimitMateFunctions| + 7. TODO list_______________________________|delimitMateTodo| + 8. Maintainer______________________________|delimitMateMaintainer| + 9. Credits_________________________________|delimitMateCredits| + 10. History_________________________________|delimitMateHistory| + +============================================================================== + 1.- INTRODUCTION *delimitMateIntro* + +This plug-in provides automatic closing of quotes, parenthesis, brackets, +etc.; besides some other related features that should make your time in insert +mode a little bit easier. + +Most of the features can be modified or disabled permanently, using global +variables, or on a FileType basis, using autocommands. With a couple of +exceptions and limitations, this features don't brake undo, redo or history. + +NOTE 1: If you have any trouble with this plugin, please run |:DelimitMateTest| +in a new buffer to see what is not working. + +NOTE 2: |'timeout'| needs to be set when working in the terminal, otherwise you +might find weird behaviour with mappings including or arrow keys. + +NOTE 3: Abbreiations set with |:iabbrev| will not be expanded by delimiters +used on delimitMate, you should use (read |i_CTRL-]|) to expand them on +the go. + +============================================================================== + 2. CUSTOMIZATION *delimitMateOptions* + +You can create your own mappings for some features using the global functions. +Read |DelimitMateFunctions| for more info. + +------------------------------------------------------------------------------ + 2.1 OPTIONS SUMMARY *delimitMateOptionSummary* + +The behaviour of this script can be customized setting the following options +in your vimrc file. You can use local options to set the configuration for +specific file types, see |delimitMateOptionDetails| for examples. + +|'loaded_delimitMate'| Turns off the script. + +|'delimitMate_autoclose'| Tells delimitMate whether to automagically + insert the closing delimiter. + +|'delimitMate_matchpairs'| Tells delimitMate which characters are + matching pairs. + +|'delimitMate_quotes'| Tells delimitMate which quotes should be + used. + +|'delimitMate_nesting_quotes'| Tells delimitMate which quotes should be + allowed to be nested. + +|'delimitMate_expand_cr'| Turns on/off the expansion of . + +|'delimitMate_expand_space'| Turns on/off the expansion of . + +|'delimitMate_smart_quotes'| Turns on/off the "smart quotes" feature. + +|'delimitMate_smart_matchpairs'| Turns on/off the "smart matchpairs" feature. + +|'delimitMate_balance_matchpairs'|Turns on/off the "balance matching pairs" + feature. + +|'delimitMate_excluded_regions'| Turns off the script for the given regions or + syntax group names. + +|'delimitMate_excluded_ft'| Turns off the script for the given file types. + +|'delimitMate_apostrophes'| Tells delimitMate how it should "fix" + balancing of single quotes when used as + apostrophes. NOTE: Not needed any more, kept + for compatibility with older versions. + +------------------------------------------------------------------------------ + 2.2 OPTIONS DETAILS *delimitMateOptionDetails* + +Add the shown lines to your vimrc file in order to set the below options. +Buffer variables take precedence over global ones and can be used along with +autocmd to modify delimitMate's behavior for specific file types, read more in +|delimitMateFileType|. + +Note: Use buffer variables only to set options for specific file types using +:autocmd, use global variables to set options for every buffer. Read more in +|g:var| and |b:var|. + +------------------------------------------------------------------------------ + *'loaded_delimitMate'* + *'b:loaded_delimitMate'* +This option prevents delimitMate from loading. +e.g.: > + let loaded_delimitMate = 1 + au FileType mail let b:loaded_delimitMate = 1 +< +------------------------------------------------------------------------------ + *'delimitMate_autoclose'* + *'b:delimitMate_autoclose'* +Values: 0 or 1. ~ +Default: 1 ~ + +If this option is set to 0, delimitMate will not add a closing delimiter +automagically. See |delimitMateAutoClose| for details. +e.g.: > + let delimitMate_autoclose = 0 + au FileType mail let b:delimitMate_autoclose = 0 +< +------------------------------------------------------------------------------ + *'delimitMate_matchpairs'* + *'b:delimitMate_matchpairs'* +Values: A string with |'matchpairs'| syntax, plus support for multi-byte~ + characters.~ +Default: &matchpairs ~ + +Use this option to tell delimitMate which characters should be considered +matching pairs. Read |delimitMateAutoClose| for details. +e.g: > + let delimitMate_matchpairs = "(:),[:],{:},<:>" + au FileType vim,html let b:delimitMate_matchpairs = "(:),[:],{:},<:>" +< +------------------------------------------------------------------------------ + *'delimitMate_quotes'* + *'b:delimitMate_quotes'* +Values: A string of characters separated by spaces. ~ +Default: "\" ' `" ~ + +Use this option to tell delimitMate which characters should be considered as +quotes. Read |delimitMateAutoClose| for details. +e.g.: > + let delimitMate_quotes = "\" ' ` *" + au FileType html let b:delimitMate_quotes = "\" '" +< +------------------------------------------------------------------------------ + *'delimitMate_nesting_quotes'* + *'b:delimitMate_nesting_quotes'* +Values: A list of quotes. ~ +Default: [] ~ + +Quotes listed here will not be able to jump out of the empty pair, thus +allowing the autoclosed quotes to be nested. +e.g.: > + let delimitMate_nesting_quotes = ['"','`'] + au FileType python let b:delimitMate_nesting_quotes = ['"'] +< +------------------------------------------------------------------------------ + *'delimitMate_expand_cr'* + *'b:delimitMate_expand_cr'* +Values: 1 or 0 ~ +Default: 0 ~ + +This option turns on/off the expansion of . Read |delimitMateExpansion| +for details. NOTE This feature requires that 'backspace' is either set to 2 or +has "eol" and "start" as part of its value. +e.g.: > + let delimitMate_expand_cr = 1 + au FileType mail let b:delimitMate_expand_cr = 1 +< +------------------------------------------------------------------------------ + *'delimitMate_expand_space'* + *'b:delimitMate_expand_space'* +Values: 1 or 0 ~ +Default: 0 ~ +This option turns on/off the expansion of . Read |delimitMateExpansion| +for details. +e.g.: > + let delimitMate_expand_space = 1 + au FileType tcl let b:delimitMate_expand_space = 1 +< +------------------------------------------------------------------------------ + *'delimitMate_smart_quotes'* + *'b:delimitMate_smart_quotes'* +Values: 1 or 0 ~ +Default: 1 ~ + +This option turns on/off the smart quotes feature. Read +|delimitMateSmartQuotes| for details. +e.g.: > + let delimitMate_smart_quotes = 0 + au FileType tcl let b:delimitMate_smart_quotes = 0 +< +------------------------------------------------------------------------------ + *'delimitMate_smart_matchpairs'* + *'b:delimitMate_smart_matchpairs'* +Values: 1 or 0 ~ +Default: 1 ~ + +This option turns on/off the smart matchpairs feature. Read +|delimitMateSmartMatchpairs| for details. +e.g.: > + let delimitMate_smart_matchpairs = 0 + au FileType tcl let b:delimitMate_smart_matchpairs = 0 +< +------------------------------------------------------------------------------ + *'delimitMate_balance_matchpairs'* + *'b:delimitMate_balance_matchpairs'* +Values: 1 or 0 ~ +Default: 0 ~ + +This option turns on/off the balancing of matching pairs. Read +|delimitMateBalance| for details. +e.g.: > + let delimitMate_balance_matchpairs = 1 + au FileType tcl let b:delimitMate_balance_matchpairs = 1 +< +------------------------------------------------------------------------------ + *'delimitMate_excluded_regions'* +Values: A string of syntax group names names separated by single commas. ~ +Default: Comment ~ + +This options turns delimitMate off for the listed regions, read |group-name| +for more info about what is a region. +e.g.: > + let delimitMate_excluded_regions = "Comments,String" +< +------------------------------------------------------------------------------ + *'delimitMate_excluded_ft'* +Values: A string of file type names separated by single commas. ~ +Default: Empty. ~ + +This options turns delimitMate off for the listed file types, use this option +only if you don't want any of the features it provides on those file types. +e.g.: > + let delimitMate_excluded_ft = "mail,txt" +< +------------------------------------------------------------------------------ + *'delimitMate_apostrophes'* +Values: Strings separated by ":". ~ +Default: No longer used. ~ + +NOTE: This feature is turned off by default, it's been kept for compatibility +with older version, read |delimitMateSmartQuotes| for details. +If auto-close is enabled, this option tells delimitMate how to try to fix the +balancing of single quotes when used as apostrophes. The values of this option +are strings of text where a single quote would be used as an apostrophe (e.g.: +the "n't" of wouldn't or can't) separated by ":". Set it to an empty string to +disable this feature. +e.g.: > + let delimitMate_apostrophes = "" + au FileType tcl let delimitMate_apostrophes = "" +< +============================================================================== + 3. FUNCTIONALITY *delimitMateFunctionality* + +------------------------------------------------------------------------------ + 3.1 AUTOMATIC CLOSING AND EXITING *delimitMateAutoClose* + +With automatic closing enabled, if an opening delimiter is inserted the plugin +inserts the closing delimiter and places the cursor between the pair. With +automatic closing disabled, no closing delimiters is inserted by delimitMate, +but when a pair of delimiters is typed, the cursor is placed in the middle. + +When the cursor is inside an empty pair or located next to the left of a +closing delimiter, the cursor is placed outside the pair to the right of the +closing delimiter. + +Unless |'delimitMate_matchpairs'| or |'delimitMate_quotes'|are set, this +script uses the values in '&matchpairs' to identify the pairs, and ", ' and ` +for quotes respectively. + +The following table shows the behaviour, this applies to quotes too (the final +position of the cursor is represented by a "|"): + +With auto-close: > + Type | You get + ==================== + ( | (|) + –––––––––|–––––––––– + () | ()| + –––––––––|–––––––––– + ( | ()| +< +Without auto-close: > + + Type | You get + ===================== + () | (|) + –––––––––-|–––––––––– + ()) | ()| + –––––––––-|–––––––––– + () | ()| +< +NOTE: Abbreviations will not be expanded by delimiters used on delimitMate, +you should use (read |i_CTRL-]|) to expand them on the go. + +------------------------------------------------------------------------------ + 3.2 EXPANSION OF SPACE AND CAR RETURN *delimitMateExpansion* + +When the cursor is inside an empty pair of delimiters, and can be +expanded, see |'delimitMate_expand_space'| and +|'delimitMate_expand_cr'|: + +Expand to: > + + | You get + ==================================== + (|) | ( | ) +< +Expand to: > + + | You get + ============================ + (|) | ( + | | + | ) +< + +NOTE that the expansion of will brake the redo command. + +Since and are used everywhere, I have made the functions involved +in expansions global, so they can be used to make custom mappings. Read +|delimitMateFunctions| for more details. + +------------------------------------------------------------------------------ + 3.3 BACKSPACE *delimitMateBackspace* + +If you press backspace inside an empty pair, both delimiters are deleted. When +expansions are enabled, will also delete the expansions. NOTE that +deleting expansions will brake the redo command. + +If you type (shift + backspace) instead, only the closing delimiter +will be deleted. NOTE that this will not usually work when using Vim from the +terminal, see 'delimitMate#JumpAny()' below to see how to fix it. + +e.g. typing at the "|": > + + What | Before | After + ============================================== + | call expand(|) | call expand| + ---------|-------------------|----------------- + | call expand( | ) | call expand(|) + ---------|-------------------|----------------- + | call expand( | call expand(|) + | | | + | ) | + ---------|-------------------|----------------- + | call expand(|) | call expand(| +< + +------------------------------------------------------------------------------ + 3.4 SMART QUOTES *delimitMateSmartQuotes* + +Only one quote will be inserted following a quote, a "\" or, following or +preceding a keyword character. This should cover closing quotes after a +string, opening quotes before a string, escaped quotes and apostrophes. Except +for apostrophes, this feature can be disabled setting the option +|'delimitMate_smart_quotes'| to 0. + +e.g. typing at the "|": > + + What | Before | After + ======================================= + " | Text | | Text "|" + " | "String| | "String"| + " | let i = "| | let i = "|" + 'm | I| | I'm| +< +------------------------------------------------------------------------------ + 3.4 SMART MATCHPAIRS *delimitMateSmartMatchpairs* + +Like "smart quotes", but applied to parens (as well as [, {, etc.), only +inserting the opening delimiter if preceding a keyword character. This should +cover adding parens, etc around existing words without having to handle the +uncessary closing delimiter. This feature can be disabled by setting the +option |'delimitMate_smart_matchpairs'| to 0. + +e.g. typing at the "|": > + + What | Before | After + ======================================= + ( | function| | function(|) + ( | |var | (|var +< +------------------------------------------------------------------------------ + 3.5 BALANCING MATCHING PAIRS *delimitMateBalance* + +When inserting an opening paren and |'delimitMate_balance_matchpairs'| is +enabled, delimitMate will try to balance the closing pairs in the current +line. + +e.g. typing at the "|": > + + What | Before | After + ======================================= + ( | |) | (|) + ( | | | (|) + ( | (|) | ((|)) +< +------------------------------------------------------------------------------ + 3.6 FILE TYPE BASED CONFIGURATION *delimitMateFileType* + +delimitMate options can be set globally for all buffers using global +("regular") variables in your |vimrc| file. But |:autocmd| can be used to set +options for specific file types (see |'filetype'|) using buffer variables in +the following way: > + + au FileType mail,text let b:delimitMate_autoclose = 0 + ^ ^ ^ ^ ^ + | | | | | + | | | | - Option value. + | | | - Option name. + | | - Buffer variable. + | - File types for which the option will be set. + - Don't forget to put this event. +< +NOTE that you should use buffer variables (|b:var|) only to set options with +|:autocmd|, for global options use regular variables (|g:var|) in your vimrc. + +------------------------------------------------------------------------------ + 3.7 SYNTAX AWARENESS *delimitMateSyntax* + +The features of this plug-in might not be always helpful, comments and strings +usualy don't need auto-completion. delimitMate monitors which region is being +edited and if it detects that the cursor is in a comment it'll turn itself off +until the cursor leaves the comment. The excluded regions can be set using the +option |'delimitMate_excluded_regions'|. Read |group-name| for a list of +regions or syntax group names. + +NOTE that this feature relies on a proper syntax file for the current file +type, if the appropiate syntax file doesn't define a region, delimitMate won't +know about it. + +============================================================================== + 4. COMMANDS *delimitMateCommands* + +------------------------------------------------------------------------------ +:DelimitMateReload *:DelimitMateReload* + +Re-sets all the mappings used for this script, use it if any option has been +changed or if the filetype option hasn't been set yet. + +------------------------------------------------------------------------------ +:DelimitMateSwitch *:DelimitMateSwitch* + +Switches the plug-in on and off. + +------------------------------------------------------------------------------ +:DelimitMateTest *:DelimitMateTest* + +This command tests every mapping set-up for this script, useful for testing +custom configurations. + +The following output corresponds to the default values, it will be different +depending on your configuration. "Open & close:" represents the final result +when the closing delimiter has been inserted, either manually or +automatically, see |delimitMateExpansion|. "Delete:" typing backspace in an +empty pair, see |delimitMateBackspace|. "Exit:" typing a closing delimiter +inside a pair of delimiters, see |delimitMateAutoclose|. "Space:" the +expansion, if any, of space, see |delimitMateExpansion|. "Visual-L", +"Visual-R" and "Visual" shows visual wrapping, see +|delimitMateVisualWrapping|. "Car return:" the expansion of car return, see +|delimitMateExpansion|. The cursor's position at the end of every test is +represented by an "|": > + + * AUTOCLOSE: + Open & close: (|) + Delete: | + Exit: ()| + Space: ( |) + Visual-L: (v) + Visual-R: (v) + Car return: ( + |) + + Open & close: {|} + Delete: | + Exit: {}| + Space: { |} + Visual-L: {v} + Visual-R: {v} + Car return: { + |} + + Open & close: [|] + Delete: | + Exit: []| + Space: [ |] + Visual-L: [v] + Visual-R: [v] + Car return: [ + |] + + Open & close: "|" + Delete: | + Exit: ""| + Space: " |" + Visual: "v" + Car return: " + |" + + Open & close: '|' + Delete: | + Exit: ''| + Space: ' |' + Visual: 'v' + Car return: ' + |' + + Open & close: `|` + Delete: | + Exit: ``| + Space: ` |` + Visual: `v` + Car return: ` + |` +< + +============================================================================== + 5. MAPPINGS *delimitMateMappings* + +delimitMate doesn't override any existing map, so you may encounter that it +doesn't work as expected because a mapping is missing. In that case, the +conflicting mappings should be resolved by either disabling the conflicting +mapping or creating a custom mappings. + +In order to make custom mappings easier and prevent overwritting existing +ones, delimitMate uses the || + |hasmapto()| (|usr_41.txt|) construct +for its mappings. + +The following are the mappings alway set by delimitMate: + + is mapped to delimitMateBS + is mapped to delimitMateS-BS + is mapped to delimitMateS-Tab + is mapped to delimitMateDel + is mapped to delimitMateEsc + is mapped to delimitMateLeft + is mapped to delimitMateRight + is mapped to delimitMateHome + is mapped to delimitMateEnd + is mapped to delimitMateUp + is mapped to delimitMateDown + is mapped to delimitMatePageUp + is mapped to delimitMatePageDown + is mapped to delimitMateS-Down + is mapped to delimitMateS-Up + is mapped to delimitMateMLeftMouse + is mapped to delimitMateMRightMouse + +The rest of the mappings correspond to parens, quotes, CR, Space, etc. and they +depend on the values of the delimitMate options, they have the following form: + +delimitMate + char + +e.g.: for "(": + +( is mapped to delimitMate( + +e.g.: If you have expansion enabled, you might want to skip it on pop-up +menus: + + imap pumvisible() ? + \"\" : + \ "delimitMateCR" + + +============================================================================== + 6. FUNCTIONS *delimitMateFunctions* + +------------------------------------------------------------------------------ +delimitMate#WithinEmptyPair() *delimitMate_WithinEmptyPair()* + +Returns 1 if the cursor is inside an empty pair, 0 otherwise. +e.g.: > + + inoremap delimitMate#WithinEmptyPair() ? + \ "\=delimitMate#ExpandReturn()\" : + \ "external_mapping" +< + +------------------------------------------------------------------------------ +delimitMate#ShouldJump() *delimitMate#ShouldJump()* + +Returns 1 if there is a closing delimiter or a quote to the right of the +cursor, 0 otherwise. + +------------------------------------------------------------------------------ +delimitMate#JumpAny(key) *delimitMate#JumpAny()* + +This function returns a mapping that will make the cursor jump to the right +when delimitMate#ShouldJump() returns 1, returns the argument "key" otherwise. +e.g.: You can use this to create your own mapping to jump over any delimiter. +> + inoremap =delimitMate#JumpAny("\") +< + +============================================================================== + 7. TODO LIST *delimitMateTodo* + +- Automatic set-up by file type. +- Make block-wise visual wrapping work on un-even regions. + +============================================================================== + 8. MAINTAINER *delimitMateMaintainer* + +Hi there! My name is Israel Chauca F. and I can be reached at: + mailto:israelchauca@gmail.com + +Feel free to send me any suggestions and/or comments about this plugin, I'll +be very pleased to read them. + +============================================================================== + 9. CREDITS *delimitMateCredits* + +Contributors: ~ + + - Kim Silkebækken ~ + Fixed mappings being echoed in the terminal. + + - Eric Van Dewoestine ~ + Implemented smart matchpairs. + +Some of the code that makes this script was modified or just shamelessly +copied from the following sources: + + - Ian McCracken ~ + Post titled: Vim, Part II: Matching Pairs: + http://concisionandconcinnity.blogspot.com/ + + - Aristotle Pagaltzis ~ + From the comments on the previous blog post and from: + http://gist.github.com/144619 + + - Karl Guertin ~ + AutoClose: + http://www.vim.org/scripts/script.php?script_id=1849 + + - Thiago Alves ~ + AutoClose: + http://www.vim.org/scripts/script.php?script_id=2009 + + - Edoardo Vacchi ~ + ClosePairs: + http://www.vim.org/scripts/script.php?script_id=2373 + +This script was inspired by the auto-completion of delimiters on TextMate. + +============================================================================== + 10. HISTORY *delimitMateHistory* + + Version Date Release notes ~ +|---------|------------|-----------------------------------------------------| + 2.5.1 2010-09-30 * Current release: + - Remove visual wrapping. Surround.vim offers a much + better implementation. + - Minor mods to DelimitMateTest. +|---------|------------|-----------------------------------------------------| + 2.5 2010-09-22 * - Better handling of mappings. + - Add report for mappings in |:DelimitMateTest|. + - Allow the use of "|" and multi-byte characters in + |'delimitMate_quotes'| and |'delimitMate_matchpairs'|. + - Allow commands to be concatenated using |. +|---------|------------|-----------------------------------------------------| + 2.4.1 2010-07-31 * - Fix problem with and . + - Add missing doc on |'delimitMate_smart_quotes'|, + |delimitMateBalance| and + |'delimitMate_balance_matchpairs'|. +|---------|------------|-----------------------------------------------------| + 2.4 2010-07-29 * - Unbalanced parens: see :help delimitMateBalance. + - Visual wrapping now works on block-wise visual + with some limitations. + - Arrow keys didn't work on terminal. + - Added option to allow nested quotes. + - Expand Smart Quotes to look for a string on the + right of the cursor. + +|---------|------------|-----------------------------------------------------| + 2.3.1 2010-06-06 * - Fix: an extra is inserted after + expansion. + +|---------|------------|-----------------------------------------------------| + 2.3 2010-06-06 * - Syntax aware: Will turn off when editing comments + or other regions, customizable. + - Changed format of most mappings. + - Fix: expansion doesn't brake automatic + indentation adjustments anymore. + - Fix: Arrow keys would insert A, B, C or D instead + of moving the cursor when using Vim on a terminal. + +|---------|------------|-----------------------------------------------------| + 2.2 2010-05-16 * - Added command to switch the plug-in on and off. + - Fix: some problems with , and . + - Fix: A small problem when inserting a delimiter at + the beginning of the line. + +|---------|------------|-----------------------------------------------------| + 2.1 2010-05-10 * - Most of the functions have been moved to an + autoload script to avoid loading unnecessary ones. + - Fixed a problem with the redo command. + - Many small fixes. + +|---------|------------|-----------------------------------------------------| + 2.0 2010-04-01 * New features: + - All features are redo/undo-wise safe. + - A single quote typed after an alphanumeric + character is considered an apostrophe and one + single quote is inserted. + - A quote typed after another quote inserts a single + quote and the cursor jumps to the middle. + - jumps out of any empty pair. + - and expansions are fixed, but the + functions used for it are global and can be used in + custom mappings. The previous system is still + active if you have any of the expansion options + set. + - deletes the closing delimiter. + * Fixed bug: + - s:vars were being used to store buffer options. + +|---------|------------|-----------------------------------------------------| + 1.6 2009-10-10 * Now delimitMate tries to fix the balancing of single + quotes when used as apostrophes. You can read + |delimitMate_apostrophes| for details. + Fixed an error when |b:delimitMate_expand_space| + wasn't set but |delimitMate_expand_space| wasn't. + +|---------|------------|-----------------------------------------------------| + 1.5 2009-10-05 * Fix: delimitMate should work correctly for files + passed as arguments to Vim. Thanks to Ben Beuchler + for helping to nail this bug. + +|---------|------------|-----------------------------------------------------| + 1.4 2009-09-27 * Fix: delimitMate is now enabled on new buffers even + if they don't have set the file type option or were + opened directly from the terminal. + +|---------|------------|-----------------------------------------------------| + 1.3 2009-09-24 * Now local options can be used along with autocmd + for specific file type configurations. + Fixes: + - Unnamed register content is not lost on visual + mode. + - Use noremap where appropiate. + - Wrapping a single empty line works as expected. + +|---------|------------|-----------------------------------------------------| + 1.2 2009-09-07 * Fixes: + - When inside nested empty pairs, deleting the + innermost left delimiter would delete all right + contiguous delimiters. + - When inside an empty pair, inserting a left + delimiter wouldn't insert the right one, instead + the cursor would jump to the right. + - New buffer inside the current window wouldn't + have the mappings set. + +|---------|------------|-----------------------------------------------------| + 1.1 2009-08-25 * Fixed an error that ocurred when mapleader wasn't + set and added support for GetLatestScripts + auto-detection. + +|---------|------------|-----------------------------------------------------| + 1.0 2009-08-23 * Initial upload. + +|---------|------------|-----------------------------------------------------| + + + `\|||/´ MMM \|/ www __^__ ~ + (o o) (o o) @ @ (O-O) /(o o)\\ ~ +ooO_(_)_Ooo__ ooO_(_)_Ooo___oOO_(_)_OOo___oOO__(_)__OOo___oOO__(_)__OOo_____ ~ +_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|____ ~ +__|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_ ~ +_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|____ ~ + +vim:tw=78:et:ts=2:sw=2:ft=help:norl:formatoptions+=tcroqn:autoindent: diff -r 662f1676bfb4 -r 90083699bcd2 vim/bundle/delimitMate/plugin/delimitMate.vim --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vim/bundle/delimitMate/plugin/delimitMate.vim Mon Nov 15 17:15:57 2010 -0500 @@ -0,0 +1,427 @@ +" ============================================================================ +" File: plugin/delimitMate.vim +" Version: 2.5.1 +" Modified: 2010-09-30 +" Description: This plugin provides auto-completion for quotes, parens, etc. +" Maintainer: Israel Chauca F. +" Manual: Read ":help delimitMate". + +" Initialization: {{{ + +if exists("g:loaded_delimitMate") || &cp + " User doesn't want this plugin or compatible is set, let's get out! + finish +endif +let g:loaded_delimitMate = 1 + +if exists("s:loaded_delimitMate") && !exists("g:delimitMate_testing") + " Don't define the functions if they already exist: just do the work + " (unless we are testing): + call s:DelimitMateDo() + finish +endif + +if v:version < 700 + echoerr "delimitMate: this plugin requires vim >= 7!" + finish +endif + +let s:loaded_delimitMate = 1 +let delimitMate_version = "2.5.1" + +function! s:option_init(name, default) "{{{ + let b = exists("b:delimitMate_" . a:name) + let g = exists("g:delimitMate_" . a:name) + let prefix = "_l_delimitMate_" + + if !b && !g + let sufix = a:default + elseif !b && g + exec "let sufix = g:delimitMate_" . a:name + else + exec "let sufix = b:delimitMate_" . a:name + endif + if exists("b:" . prefix . a:name) + exec "unlockvar! b:" . prefix . a:name + endif + exec "let b:" . prefix . a:name . " = " . string(sufix) + exec "lockvar! b:" . prefix . a:name +endfunction "}}} + +function! s:init() "{{{ +" Initialize variables: + + " autoclose + call s:option_init("autoclose", 1) + + " matchpairs + call s:option_init("matchpairs", string(&matchpairs)[1:-2]) + call s:option_init("matchpairs_list", split(b:_l_delimitMate_matchpairs, ',')) + call s:option_init("left_delims", split(b:_l_delimitMate_matchpairs, ':.,\=')) + call s:option_init("right_delims", split(b:_l_delimitMate_matchpairs, ',\=.:')) + + " quotes + call s:option_init("quotes", "\" ' `") + call s:option_init("quotes_list", split(b:_l_delimitMate_quotes)) + + " nesting_quotes + call s:option_init("nesting_quotes", []) + + " excluded_regions + call s:option_init("excluded_regions", "Comment") + call s:option_init("excluded_regions_list", split(b:_l_delimitMate_excluded_regions, ',\s*')) + let enabled = len(b:_l_delimitMate_excluded_regions_list) > 0 + call s:option_init("excluded_regions_enabled", enabled) + + " excluded filetypes + call s:option_init("excluded_ft", "") + + " expand_space + if exists("b:delimitMate_expand_space") && type(b:delimitMate_expand_space) == type("") + echom "b:delimitMate_expand_space is '".b:delimitMate_expand_space."' but it must be either 1 or 0!" + echom "Read :help 'delimitMate_expand_space' for more details." + unlet b:delimitMate_expand_space + let b:delimitMate_expand_space = 1 + endif + if exists("g:delimitMate_expand_space") && type(g:delimitMate_expand_space) == type("") + echom "delimitMate_expand_space is '".g:delimitMate_expand_space."' but it must be either 1 or 0!" + echom "Read :help 'delimitMate_expand_space' for more details." + unlet g:delimitMate_expand_space + let g:delimitMate_expand_space = 1 + endif + call s:option_init("expand_space", 0) + + " expand_cr + if exists("b:delimitMate_expand_cr") && type(b:delimitMate_expand_cr) == type("") + echom "b:delimitMate_expand_cr is '".b:delimitMate_expand_cr."' but it must be either 1 or 0!" + echom "Read :help 'delimitMate_expand_cr' for more details." + unlet b:delimitMate_expand_cr + let b:delimitMate_expand_cr = 1 + endif + if exists("g:delimitMate_expand_cr") && type(g:delimitMate_expand_cr) == type("") + echom "delimitMate_expand_cr is '".g:delimitMate_expand_cr."' but it must be either 1 or 0!" + echom "Read :help 'delimitMate_expand_cr' for more details." + unlet g:delimitMate_expand_cr + let g:delimitMate_expand_cr = 1 + endif + if ((&backspace !~ 'eol' || &backspace !~ 'start') && &backspace != 2) && + \ ((exists('b:delimitMate_expand_cr') && b:delimitMate_expand_cr == 1) || + \ (exists('g:delimitMate_expand_cr') && g:delimitMate_expand_cr == 1)) + echom "delimitMate: There seems to be some incompatibility with your settings that may interfer with the expansion of . See :help 'delimitMate_expand_cr' for details." + endif + call s:option_init("expand_cr", 0) + + " smart_matchpairs + call s:option_init("smart_matchpairs", 1) + + " smart_quotes + call s:option_init("smart_quotes", 1) + + " apostrophes + call s:option_init("apostrophes", "") + call s:option_init("apostrophes_list", split(b:_l_delimitMate_apostrophes, ":\s*")) + + " tab2exit + call s:option_init("tab2exit", 1) + + " balance_matchpairs + call s:option_init("balance_matchpairs", 0) + + let b:_l_delimitMate_buffer = [] + + let b:loaded_delimitMate = 1 + +endfunction "}}} Init() + +"}}} + +" Functions: {{{ + +function! s:Map() "{{{ + " Set mappings: + try + let save_cpo = &cpo + let save_keymap = &keymap + let save_iminsert = &iminsert + let save_imsearch = &imsearch + set keymap= + set cpo&vim + if b:_l_delimitMate_autoclose + call s:AutoClose() + else + call s:NoAutoClose() + endif + call s:ExtraMappings() + finally + let &cpo = save_cpo + let &keymap = save_keymap + let &iminsert = save_iminsert + let &imsearch = save_imsearch + endtry + + let b:delimitMate_enabled = 1 + +endfunction "}}} Map() + +function! s:Unmap() " {{{ + let imaps = + \ b:_l_delimitMate_right_delims + + \ b:_l_delimitMate_left_delims + + \ b:_l_delimitMate_quotes_list + + \ b:_l_delimitMate_apostrophes_list + + \ ['', '', '', '', '', '', ''] + + \ ['', '', '', '', '', ''] + + \ ['', '', '', '', '', ''] + + for map in imaps + if maparg(map, "i") =~? 'delimitMate' + if map == '|' + let map = '' + endif + exec 'silent! iunmap ' . map + endif + endfor + + if !has('gui_running') + silent! iunmap OC + endif + + let b:delimitMate_enabled = 0 +endfunction " }}} s:Unmap() + +function! s:TestMappingsDo() "{{{ + %d + if !exists("g:delimitMate_testing") + silent call delimitMate#TestMappings() + else + let temp_varsDM = [b:_l_delimitMate_expand_space, b:_l_delimitMate_expand_cr, b:_l_delimitMate_autoclose] + for i in [0,1] + let b:delimitMate_expand_space = i + let b:delimitMate_expand_cr = i + for a in [0,1] + let b:delimitMate_autoclose = a + call s:init() + call s:Unmap() + call s:Map() + call delimitMate#TestMappings() + normal o + endfor + endfor + let b:delimitMate_expand_space = temp_varsDM[0] + let b:delimitMate_expand_cr = temp_varsDM[1] + let b:delimitMate_autoclose = temp_varsDM[2] + unlet temp_varsDM + endif + normal gg + g/\%^$/d +endfunction "}}} + +function! s:DelimitMateDo(...) "{{{ + " Initialize settings: + call s:init() + + " Check if this file type is excluded: + if exists("g:delimitMate_excluded_ft") && + \ index(split(g:delimitMate_excluded_ft, ','), &filetype, 0, 1) >= 0 + + " Remove any magic: + call s:Unmap() + + " Finish here: + return 1 + endif + + " First, remove all magic, if needed: + if exists("b:delimitMate_enabled") && b:delimitMate_enabled == 1 + call s:Unmap() + endif + + " Now, add magic: + call s:Map() + + if a:0 > 0 + echo "delimitMate has been reset." + endif +endfunction "}}} + +function! s:DelimitMateSwitch() "{{{ + call s:init() + if exists("b:delimitMate_enabled") && b:delimitMate_enabled + call s:Unmap() + echo "delimitMate has been disabled." + else + call s:Unmap() + call s:Map() + echo "delimitMate has been enabled." + endif +endfunction "}}} + +function! s:Finish() + if exists('g:delimitMate_loaded') + return delimitMate#Finish() + endif + return '' +endfunction + +function! s:FlushBuffer() + if exists('g:delimitMate_loaded') + return delimitMate#FlushBuffer() + endif + return '' +endfunction + +"}}} + +" Mappers: {{{ +function! s:NoAutoClose() "{{{ + " inoremap ) =delimitMate#SkipDelim('\)') + for delim in b:_l_delimitMate_right_delims + b:_l_delimitMate_quotes_list + if delim == '|' + let delim = '' + endif + exec 'inoremap delimitMate' . delim . ' =delimitMate#SkipDelim("' . escape(delim,'"') . '")' + exec 'silent! imap '.delim.' delimitMate'.delim + endfor +endfunction "}}} + +function! s:AutoClose() "{{{ + " Add matching pair and jump to the midle: + " inoremap ( () + let i = 0 + while i < len(b:_l_delimitMate_matchpairs_list) + let ld = b:_l_delimitMate_left_delims[i] == '|' ? '' : b:_l_delimitMate_left_delims[i] + let rd = b:_l_delimitMate_right_delims[i] == '|' ? '' : b:_l_delimitMate_right_delims[i] + exec 'inoremap delimitMate' . ld . ' ' . ld . '=delimitMate#ParenDelim("' . escape(rd, '|') . '")' + exec 'silent! imap '.ld.' delimitMate'.ld + let i += 1 + endwhile + + " Exit from inside the matching pair: + for delim in b:_l_delimitMate_right_delims + exec 'inoremap delimitMate' . delim . ' =delimitMate#JumpOut("\' . delim . '")' + exec 'silent! imap ' . delim . ' delimitMate'. delim + endfor + + " Add matching quote and jump to the midle, or exit if inside a pair of matching quotes: + " inoremap " =delimitMate#QuoteDelim("\"") + for delim in b:_l_delimitMate_quotes_list + if delim == '|' + let delim = '' + endif + exec 'inoremap delimitMate' . delim . ' =delimitMate#QuoteDelim("\' . delim . '")' + exec 'silent! imap ' . delim . ' delimitMate' . delim + endfor + + " Try to fix the use of apostrophes (kept for backward compatibility): + " inoremap n't n't + for map in b:_l_delimitMate_apostrophes_list + exec "inoremap " . map . " " . map + exec 'silent! imap ' . map . ' delimitMate' . map + endfor +endfunction "}}} + +function! s:ExtraMappings() "{{{ + " If pair is empty, delete both delimiters: + inoremap delimitMateBS =delimitMate#BS() + " If pair is empty, delete closing delimiter: + inoremap delimitMateS-BS delimitMate#WithinEmptyPair() ? "\=delimitMate#Del()\" : "\" + " Expand return if inside an empty pair: + inoremap delimitMateCR =delimitMate#ExpandReturn() + " Expand space if inside an empty pair: + inoremap delimitMateSpace =delimitMate#ExpandSpace() + " Jump out ot any empty pair: + inoremap delimitMateS-Tab =delimitMate#JumpAny("\") + " Change char buffer on Del: + inoremap delimitMateDel =delimitMate#Del() + " Flush the char buffer on movement keystrokes or when leaving insert mode: + for map in ['Esc', 'Left', 'Right', 'Home', 'End'] + exec 'inoremap delimitMate'.map.' =Finish()<'.map.'>' + if !hasmapto('delimitMate'.map, 'i') + exec 'silent! imap <'.map.'> delimitMate'.map + endif + endfor + " Except when pop-up menu is active: + for map in ['Up', 'Down', 'PageUp', 'PageDown', 'S-Down', 'S-Up'] + exec 'inoremap delimitMate'.map.' pumvisible() ? "\<'.map.'>" : "\=\Finish()\\<'.map.'>"' + if !hasmapto('delimitMate'.map, 'i') + exec 'silent! imap <'.map.'> delimitMate'.map + endif + endfor + " Avoid ambiguous mappings: + for map in ['LeftMouse', 'RightMouse'] + exec 'inoremap delimitMateM'.map.' =delimitMate#Finish()<'.map.'>' + if !hasmapto('delimitMate'.map, 'i') + exec 'silent! imap <'.map.'> delimitMateM'.map + endif + endfor + + " Map away! + if !hasmapto('delimitMateDel', 'i') + silent! imap delimitMateDel + endif + if !hasmapto('delimitMateBS','i') + silent! imap delimitMateBS + endif + if !hasmapto('delimitMateS-BS','i') + silent! imap delimitMateS-BS + endif + if b:_l_delimitMate_expand_cr != 0 && !hasmapto('delimitMateCR', 'i') + silent! imap delimitMateCR + endif + if b:_l_delimitMate_expand_space != 0 && !hasmapto('delimitMateSpace', 'i') + silent! imap delimitMateSpace + endif + if b:_l_delimitMate_tab2exit && !hasmapto('delimitMateS-Tab', 'i') + silent! imap delimitMateS-Tab + endif + " The following simply creates an ambiguous mapping so vim fully processes + " the escape sequence for terminal keys, see 'ttimeout' for a rough + " explanation, this just forces it to work + if !has('gui_running') + imap OC + endif +endfunction "}}} + +"}}} + +" Commands: {{{ + +call s:DelimitMateDo() + +" Let me refresh without re-loading the buffer: +command! -bar DelimitMateReload call s:DelimitMateDo(1) + +" Quick test: +command! -bar DelimitMateTest silent call s:TestMappingsDo() + +" Switch On/Off: +command! -bar DelimitMateSwitch call s:DelimitMateSwitch() +"}}} + +" Autocommands: {{{ + +augroup delimitMate + au! + " Run on file type change. + "autocmd VimEnter * autocmd FileType * call DelimitMateDo() + autocmd FileType * call DelimitMateDo() + + " Run on new buffers. + autocmd BufNewFile,BufRead,BufEnter * + \ if !exists("b:loaded_delimitMate") | + \ call DelimitMateDo() | + \ endif + + " Flush the char buffer: + autocmd InsertEnter * call FlushBuffer() + autocmd BufEnter * + \ if mode() == 'i' | + \ call FlushBuffer() | + \ endif + +augroup END + +"}}} + +" GetLatestVimScripts: 2754 1 :AutoInstall: delimitMate.vim +" vim:foldmethod=marker:foldcolumn=4 diff -r 662f1676bfb4 -r 90083699bcd2 vim/bundle/histwin/Makefile --- a/vim/bundle/histwin/Makefile Mon Nov 15 08:40:32 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -SCRIPT=$(wildcard plugin/*.vim) -AUTOL =$(wildcard autoload/*.vim) -DOC=$(wildcard doc/*.txt) -PLUGIN=$(shell basename "$$PWD") -VERSION=$(shell sed -n '/Version:/{s/^.*\(\S\.\S\+\)$$/\1/;p}' $(SCRIPT)) - -.PHONY: $(PLUGIN).vba README - -all: uninstall vimball install README - -vimball: $(PLUGIN).vba - -clean: - rm -f *.vba */*.orig *.~* .VimballRecord - -dist-clean: clean - -install: - vim -N -c':so %' -c':q!' $(PLUGIN)-$(VERSION).vba - -uninstall: - vim -N -c':RmVimball' -c':q!' $(PLUGIN)-$(VERSION).vba - -undo: - for i in */*.orig; do mv -f "$$i" "$${i%.*}"; done - -README: - cp -f $(DOC) README - -$(PLUGIN).vba: - rm -f $(PLUGIN)-$(VERSION).vba - vim -N -c 'ru! vimballPlugin.vim' -c ':call append("0", [ "$(SCRIPT)", "$(AUTOL)", "$(DOC)"])' -c '$$d' -c ":%MkVimball $(PLUGIN)-$(VERSION) ." -c':q!' - ln -f $(PLUGIN)-$(VERSION).vba $(PLUGIN).vba - -release: version all - -version: - perl -i.orig -pne 'if (/Version:/) {s/\.(\d*)/sprintf(".%d", 1+$$1)/e}' ${SCRIPT} ${AUTOL} - perl -i.orig -pne 'if (/g:loaded_undo_browse =/) {s/\.(\d*)/sprintf(".%d", 1+$$1)/e}' ${SCRIPT} - perl -i -pne 'if (/GetLatestVimScripts:/) {s/(\d+)\s+:AutoInstall:/sprintf("%d :AutoInstall:", 1+$$1)/e}' ${SCRIPT} ${AUTOL} - #perl -i -pne 'if (/Last Change:/) {s/\d+\.\d+\.\d\+$$/sprintf("%s", `date -R`)/e}' ${SCRIPT} - perl -i -pne 'if (/Last Change:/) {s/(:\s+).*\n/sprintf(": %s", `date -R`)/e}' ${SCRIPT} ${AUTOL} - perl -i.orig -pne 'if (/Version:/) {s/\.(\d+).*\n/sprintf(".%d %s", 1+$$1, `date -R`)/e}' ${DOC} - VERSION=$(shell sed -n '/Version:/{s/^.*\(\S\.\S\+\)$$/\1/;p}' $(SCRIPT)) diff -r 662f1676bfb4 -r 90083699bcd2 vim/bundle/histwin/README --- a/vim/bundle/histwin/README Mon Nov 15 08:40:32 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,368 +0,0 @@ -*histwin.txt* Plugin to browse the undo-tree - -Version: 0.15 Thu, 07 Oct 2010 23:47:20 +0200 -Author: Christian Brabandt -Copyright: (c) 2009, 2010 by Christian Brabandt *histwin-copyright* - The VIM LICENSE applies to histwin.vim and histwin.txt - (see |copyright|) except use histwin instead of "Vim". - NO WARRANTY, EXPRESS OR IMPLIED. USE AT-YOUR-OWN-RISK. - -============================================================================== -1. Contents *histwin-contents* - -1. Contents.................................................|histwin-contents| -2. Functionality............................................|histwin-plugin| - Opening the Undo-Tree Window.............................|histwin-browse| - Using tags...............................................|histwin-tags| -3. Keybindings..............................................|histwin-keys| -4. Configuration............................................|histwin-config| - Configuraion Variables...................................|histwin-var| - Color Configuration......................................|histwin-color| - Undolevels settings......................................|histwin-ut| -5. Feedback.................................................|histwin-feedback| -6. History..................................................|histwin-history| - -============================================================================== - *histwin-plugin* *histwin* -2. Functionality - -This plugin was written to allow an easy way of browsing the |undo-tree|, that -is available with Vim. This allows to go back to any change that has been made -previously, because these states are remembered by Vim within a branch in the -undo-history. You can use |g-| or |g+| to move in Vim within the different -undo-branches. - -Unfortunately, going back to any state isn't very comfortable and you always -need to remember at what time you did that change. Therefore the -histwin-Plugin allows to easily view the available states and branch back to -any of these states. It opens a new window, which contains all available -states and using this plugin allows you to tag a previous change or go back to -a particular state. - - *histwin-browse* *:UB* -2.1 Opening the Undo-Tree Window - -By default you can open the Undo-Tree Window by issuing :UB (Mnemonic: -UndoBrowse). If you do this, you will see a window that looks -like this: - -+------------------------------------------------------+ -|Undo-Tree: FILENAME |#!/bin/bash | -|====================== | | -| | | -|" actv. keys in this window |if [ $# -ne 2 ]; the | -|" I toggles help screen | echo "Name: $0: arg| -|" goto undo branch | echo | -|" Update view | exit 1 | -|" T Tag sel. branch |fi | -|" P Toggle view | | -|" D Diff sel. branch |if true; then | -|" R Replay sel. branch | dir="${1%/*}" | -|" C Clear all tags | file="${1##*/}" | -|" Q Quit window | target="${2}/${di | -|" | if [ ! -e "${targ | -|" Undo-Tree, v0.13 | mkdir -p "$ta | -| | mv "$1" "$tar | -|Nr Time Fl Tag | | -|1) Sep 01 /Start Editing/| | -|2) Sep 01 ! /First draft/ | | -|3) 23:01:22 | | -|4) 23:02:57 * /Release 1/ | | -|5) 23:05:04 | | -+------------------------------------------------------+ - -This shows an extract of a sample file on the right side. The window on the -left side, contains an overview of all available states that are known for -this buffer or that have been tagged to remember that change. - -The first line contains 'Undo-Tree: filename' so that the user knows, for -which file this window shows the available undo-branches. This is the heading. - -Following the heading is a small information banner, that contains the most -important key combinations, that are available in this window. - -After that list, all available undo-changes are displayed. This is a list, -that contains the number, the time this change was made, some flags and the -tags, that have been entered. - -The flags can be any of '!' or '*'. The '!' indicates, that this particular -undo branch (that was probably tagged before) isn't available any more. The -'*' indicates, if that particular undo branch has been saved before (but is -only visible in the dense view). See |histwin-ut| on why certain states might -become inaccessible and what can be done against it. - -In the detailed view, that is by default displayed, when you press 'P', the -undo branch list will possibly be much longer. That is, because in this view, -each save state will be displayed (along with it's save number). You -can imagine, that this list might become very long. - -Additionally, the Change number, that identifies each change in the undo tree -will be displayed. The change number can be used with the |:undo| command to -jump to a particular change and the save number is useful with the |:earlier| -and |:later| commands. - -The active undo-branch on the right side is highlighted with the UBActive -highlighting and the cursor will be positioned on that line. Use > - -:hi UBActive - -to see how it will be highlighted. See also |histwin-color|. - - - *histwin-tags* - -By default, tags that you enter will be volatile. That is, whenever you quit -Vim, these tags are lost. Currently there is no way, to store or retrieve old -tags. - -This behaviour was okay, until with Vim 7.3 the new permanent undo feature was -included into Vim which makes undo information available even after restarting -Vim. Starting with Vim 7.3 it is often desirable, to also store the tag -information permanently. - -There is an easy way, to store your tag information easily, though. You can -make use of the |viminfo| file, that stores states and search patterns and a -like for later use. If you include the '!' flag when setting the option, vim -will also store global variables, which then will be read back when restarting -Vim (or by use of |rviminfo|). So if you like your tags be stored permanently, -be sure, that you set your viminfo option correctly. - -(Note, currently, the viminfo file only stores global variables of type -String, Float or Number, it can't store Dictionaries of Lists. There is a -patch available, that will hopefully be soon be integrated in Vim mainline. -So even if you set up your |viminfo| file correctly, the histwin plugin won't -be able to restore your tags) - -============================================================================== - *histwin-keys* -3. Keybindings - -By default, the following keys are active in Normal mode in the Undo-Tree -window: - -'Enter' Go to the branch, on which is selected with the cursor. By default, - if switching to an older branch, the buffer will be set to - 'nomodifiable'. If you don't want that, you need to set the - g:undo_tree_nomod variable to off (see |histwin-var|). -'' Update the window -'T' Tag the branch, that is selected. You'll be prompted for a tag. - To make the tag permanent, see |histwin-tags| -'P' Toggle view (the change-number and save number will be displayed). - You can use this number to go directly to that change (see |:undo|). - Additionally the saved counter will be displayed, which can be used - to go directly to the text version of a file write using |later| or - |earlier|. -'D' Start diff mode with the branch that is selected by the cursor. - (see |08.7|) -'R' Replay all changes, that have been made from the beginning. - (see |histwin-config| for adjusting the speed) -'C' Clear all tags. -'Q' Quit window - -============================================================================== - *histwin-var* *histwin-config* -4.1 Configuration variables - -You can adjust several parameters for the Undo-Tree window, by setting some -variables in your .vimrc file. - ------------------------------------------------------------------------------- - -4.1.1 Disable printing the help - -To always show only a small information banner, set this in your .vimrc -(by default this variable is 1) > - - :let g:undo_tree_help = 0 - ------------------------------------------------------------------------------- - -4.1.2 Display more details - -To always display the detailed view (which includes the Change number and the -file save counter), set the g:undo_tree_dtl=0: -(by default, this variable is 1) > - - :let g:undo_tree_dtl = 0 - -The change number can be used to directly jump to a undo state using |:undo| -and the save counter can be used to directly go to the buffer's state when the -file was written using |:earlier| and |:later| - ------------------------------------------------------------------------------- - -4.1.3 Customize the replay speed - -The speed with which to show each change, when replaying a undo-branch can be -adjusted by setting to a value in milliseconds. If not specified, this is -100ms. > - - :let g:undo_tree_speed=200 - ------------------------------------------------------------------------------- - -4.1.4 Adjust the window size. - -You can adjust the windows size by setting g:undo_tree_wdth to the number of -columns you like. By default this is considered 30. When the change number is -included in the list (see above), this value will increase by 10. > - - :let g:undo_tree_wdth=40 - -This will change the width of the window to 40 or 50, if the change number -is included. - ------------------------------------------------------------------------------- - -4.1.5 Read-only and writable buffer states - -By default, old buffer states are set read only and you cannot modify these. -This was done, since the author of the plugin started browsing the undo -branches and started changing older versions over and over again. This is -really confusing, since you start creating even more branches and you might -end up fixing old bugs over and over. - -This is what happened to the author of this plugin, so now there is a -configuration available that will set old buffers to be only read-only. -Currently, this works, by detecting, if the cursor was on the last branch in -the histwin window, and if the cursor was not on the last branch, the buffer -will be set 'nomodifiable'. You can always set the buffer to be modifiable by -issuing: > - - :setl modifiable - -The default is to set the buffer read only. To disable this, you can set the -g:undo_tree_nomod variable in your |.vimrc| like this: > - - :let g:undo_tree_nomod = 0 - ------------------------------------------------------------------------------- - - *histwin-color* -4.2 Color configuration - -If you want to customize the colors, you can simply change the following -groups, that are defined by the Undo-Tree Browser: - -UBTitle this defines the color of the title file-name. By default this links - to Title (see |hl-Title|) -UBInfo this defines how the information banner looks like. By default this - links to Comment. -UBList this group defines the List items at the start e.g. 1), 2), This - links to Identifier. -UBTime this defines, how the time is displayed. This links to Underlined. -UBTag This defines, how the tag should be highlighted. By default this - links to Special -UBDelim This group defines the look of the delimiter for the tag. By default - this links to Ignore -UBActive This group defines how the active selection is displayed. By default - this links to PmenuSel (see |hl-PmenuSel|) -UBKey This group defines, how keys are displayed within the information - banner. By default, this links to SpecialKey (see |hl-SpecialKey|) - -Say you want to change the color for the Tag values and you think, it should -look like |IncSerch|, so you can do this in your .vimrc file: > - -:hi link UBTag IncSearch - ------------------------------------------------------------------------------- - - *histwin-ut* -4.3 Undolevel settings - -When using Vim's |persistent-undo| feature and making many changes, you might -encounter the situation, when some of your tags will be flagged with an '!'. -This happens, when these undo-states are not available any more. This happens -especially, when making so many changes, that your 'undolevels' setting -interferes. Basically you have done so many changes, that your first changes -will already be deleted. So the obvious fix is to set the 'undolevels' setting -to a much higher value, like 10,000 or even higher. This will however increase -the memory usage quite a lot. - -============================================================================== - *histwin-feedback* -5. Feedback - -Feedback is always welcome. If you like the plugin, please rate it at the -vim-page: -http://www.vim.org/scripts/script.php?script_id=2932 - -You can also follow the development of the plugin at github: -http://github.com/chrisbra/histwin.vim - -Please don't hesitate to report any bugs to the maintainer, mentioned in the -third line of this document. - -============================================================================== - *histwin-history* -6. histwin History - -0.14 - don't fix the width of the histwin window - - now use the undotree() function by default (if patch 7.3.005 is - included) - - display save states in the detailed view - - display the '!' when a state is not accessible anymore - - fixed an annoying bug, that when jumping to a particular undo state, - the plugin would jump to the wrong state (I hate octal mode) - - Make displaying the time much more reliable and also don't display - the time, if the change happened more than 24h ago (instead, display - the date, when this change was done). - - slightly improved error handling. - - prepare plugin, to permantly store the undotags in the viminfo file - (this isn't supported by a plain vanilla vim and requires a patch) - - A major rewrite (code cleanup, better documentation) -0.13 - New version that uses Vim 7.3 persistent undo features - |new-persistent-undo| - - Display saved counter in detailed view - - Display indicator for saved branches. - - in diff mode, don't set the original buffer to be nomodifiable - (so you can always merge chunks). - - Check for Vim Version 7.3 (the plugin won't work with older versions - of Vim) -0.12 - Small extension to the help file - - generate help file with 'et' set, so the README at github looks - better - - Highlight the key binding using |hl-SpecialKey| - - The help tag for the color configuration was wrong. -0.11 - Set old buffers read only (disable the setting via the - g:undo_tree_nomod variable - - Make sure, Warning Messages are really displayed using :unsilent -0.10 - Fixed annoying Resizing bug - - linebreak tags, if they are too long - - dynamically grow the histwin window, for longer tags (up - to a maximum) - - Bugfix: Always indicate the correct branch - - Added a few try/catch statements and some error handling -0.9 - Error handling for Replaying (it may not work always) - - Documentation - - Use syntax highlighting - - Tagging finally works -0.8 - code cleanup - - make speed of the replay adjustable. Use g:undo_tree_speed to set - time in milliseconds -0.7.2 - make sure, when switching to a different undo-branch, the undo-tree will be reloaded - - check 'undolevel' settings -0.7.1 - fixed a problem with mapping the keys which broke the Undo-Tree keys - (I guess I don't fully understand, when to use s: and ) -0.7 - created autoloadPlugin (patch by Charles Campbell) Thanks! - - enabled GLVS (patch by Charles Campbell) Thanks! - - cleaned up old comments - - deleted :noautocmd which could cause trouble with other plugins - - small changes in coding style ( to s:, fun instead of fu) - - made Plugin available as histwin.vba - - Check for availability of :UB before defining it - (could already by defined Blockquote.vim does for example) -0.6 - fix missing bufname() when creating the undo_tree window - - make undo_tree window a little bit smaller - (size is adjustable via g:undo_tree_wdth variable) -0.5 - add missing endif (which made version 0.4 unusuable) -0.4 - Allow diffing with selected branch - - highlight current version - - Fix annoying bug, that displays - --No lines in buffer-- -0.3 - Use changenr() to determine undobranch - - updates view - - allow switching to initial load state, before - buffer was edited -============================================================================== -vim:tw=78:ts=8:ft=help:et diff -r 662f1676bfb4 -r 90083699bcd2 vim/bundle/histwin/autoload/histwin.vim --- a/vim/bundle/histwin/autoload/histwin.vim Mon Nov 15 08:40:32 2010 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,649 +0,0 @@ -" histwin.vim - Vim global plugin for browsing the undo tree -" ------------------------------------------------------------- -" Last Change: Thu, 07 Oct 2010 23:47:20 +0200 -" Maintainer: Christian Brabandt -" Version: 0.15 -" Copyright: (c) 2009, 2010 by Christian Brabandt -" The VIM LICENSE applies to histwin.vim -" (see |copyright|) except use "histwin.vim" -" instead of "Vim". -" No warranty, express or implied. -" *** *** Use At-Your-Own-Risk! *** *** -" TODO: - make tags permanent (needs patch for Vim) -" - rewrite script and make use of undotree() functionality -" that is available since Vim 7.3 (should work now) -" - Bugfix: Sometimes the histwin window contains invalid data, -" not sure how to reproduce it. Closing and reoping is -" the workaround. -" -" Init: {{{1 -let s:cpo= &cpo -set cpo&vim - -" Show help banner? -" per default enabled, you can change it, -" if you set g:undobrowse_help to 0 e.g. -" put in your .vimrc -" :let g:undo_tree_help=0 -let s:undo_help=((exists("s:undo_help") ? s:undo_help : 1) ) -" This is a little bit confusing. If the variable is set to zero and the -" detailed view will be shown. If it is set to 1 the short view will be -" displayed. -let s:undo_tree_dtl = (exists('g:undo_tree_dtl') ? g:undo_tree_dtl : (exists("s:undo_tree_dtl") ? s:undo_tree_dtl : 1)) - -" Functions: -" -fun! s:Init()"{{{1 - if exists("g:undo_tree_help") - let s:undo_help=g:undo_tree_help - endif - if !exists("s:undo_winname") - let s:undo_winname='Undo_Tree' - endif - " speed, with which the replay will be played - " (duration between each change in milliseconds) - " set :let g:undo_tree_speed=250 in your .vimrc to override - let s:undo_tree_speed = (exists('g:undo_tree_speed') ? g:undo_tree_speed : 100) - " Set prefered width - let s:undo_tree_wdth = (exists('g:undo_tree_wdth') ? g:undo_tree_wdth : 30) - " Show detail with Change nr? - let s:undo_tree_dtl = (exists('g:undo_tree_dtl') ? g:undo_tree_dtl : s:undo_tree_dtl) - " Set old versions nomodifiable - let s:undo_tree_nomod = (exists('g:undo_tree_nomod') ? g:undo_tree_nomod : 1) - " When switching to the undotree() function, be sure to use a Vim that is - " newer than 7.3.005 - let s:undo_tree_epoch = (v:version > 703 || (v:version == 703 && has("patch005")) ? 1 : 0) - - if !exists("s:undo_tree_wdth_orig") - let s:undo_tree_wdth_orig = s:undo_tree_wdth - endif - if !exists("s:undo_tree_wdth_max") - let s:undo_tree_wdth_max = 50 - endif - - if bufname('') != s:undo_winname - let s:orig_buffer = bufnr('') - endif - - " Make sure we are in the right buffer - " and this window still exists - if bufwinnr(s:orig_buffer) == -1 - wincmd p - let s:orig_buffer=bufnr('') - endif - - " Move to the buffer, we are monitoring - exe bufwinnr(s:orig_buffer) . 'wincmd w' - if !exists("b:undo_customtags") - " TODO: Activate, when viminfo patch has been incorporated into vim - " - " let fpath=fnameescape(fnamemodify(bufname('.'), ':p')) - " if exists("g:UNDO_CTAGS") && has_key(g:UNDO_CTAGS, fpath) - " let b:undo_customtags = g:UNDO_CTAGS[fpath] - " else - let b:undo_customtags={} - " endif - endif - - " global variable, that will be stored in the 'viminfo' file - " TODO: Activate, when viminfo patch has been incorporated into vim - " (currently, viminfo only stores numbers and strings, no dictionaries) - " delete the '&& 0' to enable - if !exists("g:UNDO_CTAGS") && s:undo_tree_epoch && 0 - let filename=fnameescape(fnamemodify(bufname('.'),':p')) - let g:UNDO_CTAGS={} - let g:UNDO_CTAGS[filename]=b:undo_customtags - if (!s:ReturnLastChange(g:UNDO_CTAGS[filename]) <= changenr()) - unlet g:UNDO_CTAGS[filename] - if !len(g:UNDO_CTAGS) - unlet g:UNDO_CTAGS - endif - endif - endif -endfun "}}} -fun! histwin#WarningMsg(msg)"{{{1 - echohl WarningMsg - let msg = "histwin: " . a:msg - if exists(":unsilent") == 2 - unsilent echomsg msg - else - echomsg msg - endif - echohl Normal - let v:errmsg = msg -endfun "}}} -fun! s:ReturnHistList()"{{{1 - let histdict={} - let customtags=copy(b:undo_customtags) - redir => a - sil :undol - redir end - " First item contains the header - let templist=split(a, '\n')[1:] - - - if s:undo_tree_epoch - if empty(templist) - return {} - endif - let ut=[] - " Vim 7.3 introduced the undotree function, which we'll use to get all save - " states. Unfortunately, Vim would crash, if you used the undotree() - " function before version 7.3.005 - " - " return a list of all the changes and then use only these changes, - " that are returned by the :undolist command - " (it's hard to get the right branches, so we parse the :undolist - " command and only take these entries (plus the first and last entry) - let ut=s:GetUndotreeEntries(undotree().entries) - let templist=map(templist, 'split(v:val)[0]') - let re = '^\%(' . join(templist, '\|') . '\)$' - let first = ut[0] - let first.tag='Start Editing' - if s:undo_tree_dtl - call filter(ut, 'v:val.seq =~ re') - else - call filter(ut, 'v:val.seq =~ re || v:val.save > 0') - endif - let ut= [first] + ut - - for item in ut - if has_key(customtags, item.seq) - let tag=customtags[item.seq].tag - call remove(customtags,item.seq) - else - let tag=(has_key(item, 'tag') ? item.tag : '') - endif - let histdict[item.seq]={'change': item.seq, - \'number': item.number, - \'time': item.time, - \'tag': tag, - \'save': (has_key(item, 'save') ? item.save : 0), - \} - endfor - let first_seq = first.seq - else - " include the starting point as the first change. - " unfortunately, there does not seem to exist an - " easy way to obtain the state of the first change, - " so we will be inserting a dummy entry and need to - " check later, if this is called. - let histdict[0] = {'number': 0, 'change': 0, 'time': '00:00:00', 'tag': 'Start Editing' ,'save':0} - let first_seq = matchstr(templist[0], '^\s\+\zs\d\+')+0 - - let i=1 - for item in templist - let change = matchstr(item, '^\s\+\zs\d\+') + 0 - " Actually the number attribute will not be used, but we store it - " anyway, since we are already parsing the undolist manually. - let nr = matchstr(item, '^\s\+\d\+\s\+\zs\d\+') + 0 - let time = matchstr(item, '^\%(\s\+\d\+\)\{2}\s\+\zs.\{-}\ze\s*\d*$') - let save = matchstr(item, '\s\+\zs\d\+$') + 0 - if time !~ '\d\d:\d\d:\d\d' - let time=matchstr(time, '^\d\+') - let time=strftime('%H:%M:%S', localtime()-time) - endif - if has_key(customtags, change) - let tag=customtags[change].tag - call remove(customtags,change) - else - let tag='' - endif - let histdict[change]={'change': change, 'number': nr, 'time': time, 'tag': tag, 'save': save} - let i+=1 - endfor - endif - unlet item - " Mark invalid entries in the customtags dictionary - for [key,item] in items(customtags) - if item.change < first_seq - let customtags[key].number = -1 - endif - endfor - return extend(histdict,customtags,"force") -endfun - -fun! s:SortValues(a,b)"{{{1 - return (a:a.change+0)==(a:b.change+0) ? 0 : (a:a.change+0) > (a:b.change+0) ? 1 : -1 -endfun - -fun! s:MaxTagsLen()"{{{1 - let tags = getbufvar(s:orig_buffer, 'undo_customtags') - let d=[] - " return a list of all tags - let d=values(map(copy(tags), 'v:val["tag"]')) - let d+= ["Start Editing"] - "call map(d, 'strlen(substitute(v:val, ".", "x", "g"))') - call map(d, 'strlen(v:val)') - return max(d) -endfu - -fun! s:HistWin()"{{{1 - let undo_buf=bufwinnr('^'.s:undo_winname.'$') - " Adjust size so that each tag will fit on the screen - " 16 is just the default length, that should fit within 30 chars - "let maxlen=s:MaxTagsLen() % (s:undo_tree_wdth_max) - let maxlen=s:MaxTagsLen() -" if !s:undo_tree_dtl -" let maxlen+=20 " detailed pane -" else -" let maxlen+=13 " short pane -" endif - let rd = (!s:undo_tree_dtl ? 20 : 13) - - if maxlen > 16 - let s:undo_tree_wdth = (s:undo_tree_wdth + maxlen - rd) % s:undo_tree_wdth_max - let s:undo_tree_wdth = (s:undo_tree_wdth < s:undo_tree_wdth_orig ? s:undo_tree_wdth_orig : s:undo_tree_wdth) - endif - " for the detail view, we need more space - if (!s:undo_tree_dtl) - let s:undo_tree_wdth = s:undo_tree_wdth_orig + 10 - else - let s:undo_tree_wdth = s:undo_tree_wdth_orig - endif - "if (maxlen + (!s:undo_tree_dtl*7)) > 13 + (!s:undo_tree_dtl*7) - " let s:undo_tree_wdth+=(s:undo_tree_wdth + maxlen) % s:undo_tree_wdth_max - "endif - if undo_buf != -1 - exe undo_buf . 'wincmd w' - if winwidth(0) != s:undo_tree_wdth - exe "vert res " . s:undo_tree_wdth - endif - else - execute s:undo_tree_wdth . "vsp " . s:undo_winname - setl noswapfile buftype=nowrite bufhidden=delete foldcolumn=0 nobuflisted - let undo_buf=bufwinnr("") - endif - exe bufwinnr(s:orig_buffer) . ' wincmd w' - return undo_buf -endfun - -fun! s:PrintUndoTree(winnr)"{{{1 - let bufname = (empty(bufname(s:orig_buffer)) ? '[No Name]' : fnamemodify(bufname(s:orig_buffer),':t')) - let changenr = changenr() - let histdict = b:undo_tagdict - exe a:winnr . 'wincmd w' - setl modifiable - " silent because :%d outputs this message: - " --No lines in buffer-- - silent %d _ - call setline(1,'Undo-Tree: '.bufname) - put =repeat('=', strlen(getline(1))) - put ='' - call s:PrintHelp(s:undo_help) - if s:undo_tree_dtl - call append('$', printf("%-*s %-9s %2s %s", strlen(len(histdict)), "Nr", " Time", "Fl", "Tag")) - else - call append('$', printf("%-*s %-9s %-6s %-4s %2s %s", strlen(len(histdict)), "Nr", " Time", "Change", "Save", "Fl", "Tag")) - endif - - if len(histdict) == 0 - call append('$', "\" No undotree available") - let list=[] - else - let i=1 - let list=sort(values(histdict), 's:SortValues') - for line in list - if s:undo_tree_dtl && line.number==0 - continue - endif - let tag=line.tag - " this is only an educated guess. - " This should be calculated - let width=winwidth(0) - (!s:undo_tree_dtl ? 22 : 14) - if strlen(tag) > width - let tag=substitute(tag, '.\{'.width.'}', '&\r', 'g') - endif - let tag = (empty(tag) ? tag : '/'.tag.'/') - if !s:undo_tree_dtl - call append('$', - \ printf("%0*d) %8s %6d %4d %1s %s", - \ strlen(len(histdict)), i, - \ localtime() - line['time'] > 24*3600 ? strftime('%b %d', line['time']) : strftime('%H:%M:%S', line['time']), - \ line['change'], line['save'], - \ (line['number']<0 ? '!' : ' '), - \ tag)) - else - call append('$', - \ printf("%0*d) %8s %1s %s", - \ strlen(len(histdict)), i, - \ localtime() - line['time'] > 24*3600 ? strftime('%b %d', line['time']) : strftime('%H:%M:%S', line['time']), - \ (line['number']<0 ? '!' : (line['save'] ? '*' : ' ')), - \ tag)) - " DEBUG Version: - " call append('$', - " \ printf("%0*d) %8s %1s%1s %s %s", - " \ strlen(len(histdict)), i, - " \ localtime() - line['time'] > 24*3600 ? strftime('%b %d', line['time']) : strftime('%H:%M:%S', line['time']), - " \(line['save'] ? '*' : ' '), - " \(line['number']<0 ? '!' : ' '), - " \ tag, line['change'])) - endif - let i+=1 - endfor - %s/\r/\=submatch(0).repeat(' ', match(getline('.'), '\/')+1)/eg - endif - call s:HilightLines(s:GetLineNr(changenr,list)+1) - norm! zb - setl nomodifiable -endfun - -fun! s:HilightLines(changenr)"{{{1 - syn match UBTitle '^\%1lUndo-Tree: \zs.*$' - syn match UBInfo '^".*$' contains=UBKEY - syn match UBKey '^"\s\zs\%(\(<[^>]*>\)\|\u\)\ze\s' - syn match UBList '^\d\+\ze' nextgroup=UBDate,UBTime - syn match UBDate '\w\+\s\d\+\ze' - syn match UBTime '\d\d:\d\d:\d\d' "nextgroup=UBDelimStart - syn region UBTag matchgroup=UBDelim start='/' end='/$' keepend - if a:changenr - let search_pattern = '^0*'.a:changenr.')[^/]*' - "exe 'syn match UBActive "^0*'.a:changenr.')[^/]*"' - exe 'syn match UBActive "' . search_pattern . '"' - " Put cursor on the active tag - call search(search_pattern, 'cW') - endif - - hi def link UBTitle Title - hi def link UBInfo Comment - hi def link UBList Identifier - hi def link UBTag Special - hi def link UBTime Underlined - hi def link UBDate Underlined - hi def link UBDelim Ignore - hi def link UBActive PmenuSel - hi def link UBKey SpecialKey -endfun - -fun! s:PrintHelp(...)"{{{1 - let mess=['" actv. keys in this window'] - call add(mess, '" I toggles help screen') - if a:1 - call add(mess, "\" goto undo branch") - call add(mess, "\" \t Update view") - call add(mess, "\" T\t Tag sel. branch") - call add(mess, "\" P\t Toggle view") - call add(mess, "\" D\t Diff sel. branch") - call add(mess, "\" R\t Replay sel. branch") - call add(mess, "\" C\t Clear all tags") - call add(mess, "\" Q\t Quit window") - call add(mess, '"') - call add(mess, "\" Undo-Tree, v" . printf("%.02f",g:loaded_undo_browse)) - endif - call add(mess, '') - call append('$', mess) -endfun - -fun! s:DiffUndoBranch()"{{{1 - try - let change = s:ReturnBranch() - catch /histwin:/ - call histwin#WarningMsg("Please put the cursor on one list item, when switching to a branch!") - return - endtry - let prevchangenr=UndoBranch() - if empty(prevchangenr) - return '' - endif - let cur_ft = &ft - let buffer=getline(1,'$') - try - exe ':u ' . prevchangenr - setl modifiable - catch /Vim(undo):Undo number \d\+ not found/ - call s:WarningMsg("Undo Change not found!") - return '' - endtry - exe ':botright vsp '.tempname() - call setline(1, bufname(s:orig_buffer) . ' undo-branch: ' . change) - call append('$',buffer) - exe "setl ft=".cur_ft - silent w! - diffthis - exe bufwinnr(s:orig_buffer) . 'wincmd w' - diffthis -endfun - -fun! s:GetLineNr(changenr,list) "{{{1 - let i=0 - for item in a:list - if s:undo_tree_dtl && item.number == 0 - continue - endif - if item['change'] >= a:changenr - return i - endif - let i+=1 - endfor - return -1 -endfun - -fun! s:ReplayUndoBranch()"{{{1 - try - let change = s:ReturnBranch() - catch /histwin:/ - call histwin#WarningMsg("Please put the cursor on one list item, when replaying a branch!") - return - endtry - - let tags = getbufvar(s:orig_buffer, 'undo_tagdict') - - if empty(tags) - call histwin#WarningMsg("No Undotree available. Won't Replay") - return - endif - let tlist = sort(values(tags), "s:SortValues") - if s:undo_tree_dtl - call filter(tlist, 'v:val.number != 0') - endif - let key = (len(tlist) > change ? tlist[change].change : '') - - if empty(key) - call histwin#WarningMsg("Nothing to do") - return - endif - exe bufwinnr(s:orig_buffer) . ' wincmd w' - let change_old = changenr() - try - exe ':u ' . b:undo_tagdict[key]['change'] - exe 'earlier 99999999' - redraw - while changenr() < b:undo_tagdict[key]['change'] - red - redraw - exe ':sleep ' . s:undo_tree_speed . 'm' - endw - "catch /Undo number \d\+ not found/ - catch /Vim(undo):Undo number 0 not found/ - exe ':u ' . change_old - call s:WarningMsg("Replay not possible for initial state") - catch /Vim(undo):Undo number \d\+ not found/ - exe ':u ' . change_old - call s:WarningMsg("Replay not possible\nDid you reload the file?") - endtry -endfun - -fun! s:ReturnBranch()"{{{1 - let a=matchstr(getline('.'), '^0*\zs\d\+\ze')+0 - if a == -1 - call search('^\d\+)', 'b') - let a=matchstr(getline('.'), '^0*\zs\d\+\ze')+0 - endif - if a <= 0 - throw "histwin: No Branch" - return 0 - endif - return a-1 -endfun - -fun! s:ToggleHelpScreen()"{{{1 - let s:undo_help=!s:undo_help - exe bufwinnr(s:orig_buffer) . ' wincmd w' - call s:PrintUndoTree(s:HistWin()) -endfun - -fun! s:ToggleDetail()"{{{1 - let s:undo_tree_dtl=!s:undo_tree_dtl - call histwin#UndoBrowse() -endfun - -fun! s:UndoBranchTag()"{{{1 - - try - let change = s:ReturnBranch() - catch /histwin:/ - call histwin#WarningMsg("Please put the cursor on one list item, when tagging a branch!") - return - endtry - let tags = getbufvar(s:orig_buffer, 'undo_tagdict') - if empty(tags) - call histwin#WarningMsg("No Undotree available. Won't tag") - return - endif - let cdict = getbufvar(s:orig_buffer, 'undo_customtags') - let tlist = sort(values(tags), "s:SortValues") - if s:undo_tree_dtl - call filter(tlist, 'v:val.number != 0') - endif - let key = (len(tlist) > change ? tlist[change].change : '') - if empty(key) - return - endif - call inputsave() - let tag=input("Tagname " . (change+1) . ": ", tags[key]['tag']) - call inputrestore() - - let cdict[key] = {'tag': tag, - \'number': tags[key].number+0, - \'time': tags[key].time+0, - \'change': key+0, - \'save': tags[key].save+0} - "let cdict[key] = {'tag': tag, 'number': 0, 'time': strftime('%H:%M:%S'), 'change': key, 'save': 0} - "let tags[changenr] = {'tag': cdict[changenr][tag], 'change': changenr, 'number': tags[key]['number'], 'time': tags[key]['time']} - let tags[key]['tag'] = tag - call setbufvar(s:orig_buffer, 'undo_tagdict', tags) - call setbufvar(s:orig_buffer, 'undo_customtags', cdict) -endfun - -fun! s:UndoBranch()"{{{1 - let dict = getbufvar(s:orig_buffer, 'undo_tagdict') - if empty(dict) - call histwin#WarningMsg("No Undotree available. Can't switch to a different state!") - return - endif - try - let key = s:ReturnBranch() - catch /histwin:/ - call histwin#WarningMsg("Please put the cursor on one list item, when switching to a branch!") - return - endtry - let tlist = sort(values(dict), "s:SortValues") - if s:undo_tree_dtl - call filter(tlist, 'v:val.number != 0') - endif - let key = (len(tlist) > key ? tlist[key].change : '') - if empty(key) - call histwin#WarningMsg("Nothing to do.") - return - endif - " Last line? - if line('.') == line('$') - let tmod = 0 - else - let tmod = 1 - endif - exe bufwinnr(s:orig_buffer) . 'wincmd w' - " Save cursor pos - let cpos = getpos('.') - let cmd='' - let cur_changenr=changenr() - "let list=sort(values(b:undo_tagdict), 's:SortValues') - "let len = len(b:undo_tagdict) - " if len==1, then there is no - " undo branch available, which means - " we can't undo anyway - try - if key==0 - " Jump back to initial state - "let cmd=':earlier 9999999' - :u1 - if !&modifiable - setl modifiable - endif - norm 1u - else - exe ':u '.dict[key]['change'] - endif - if s:undo_tree_nomod && tmod - setl nomodifiable - else - setl modifiable - endif - catch /E830: Undo number \d\+ not found/ - exe ':u ' . cur_changenr - call histwin#WarningMsg("Undo Change not found.") - return - endtry - " this might have changed, so we return to the old cursor - " position. This could still be wrong, so - " So this is our best effort approach. - call setpos('.', cpos) - return cur_changenr -endfun - -fun! s:MapKeys()"{{{1 - nnoremap