From 6f0c91468a45abd78b217ad9b13896842e1322e8 Mon Sep 17 00:00:00 2001 From: Israel Chauca Fuentes Date: Thu, 15 Oct 2009 23:59:54 -0500 Subject: [PATCH] == 1.6 == Now delimitMate tries to fix the balancing of single quotes when used as apostrophes. Fixed an error when b:delimitMate_expand_space wasn't set but g:delimitMate_expand_space was. --- delimitMate.txt | 53 +++++++++++++++++------- delimitMate.vim | 105 ++++++++++++++++++++++++++++++------------------ 2 files changed, 105 insertions(+), 53 deletions(-) diff --git a/delimitMate.txt b/delimitMate.txt index 0cc693c..46c8275 100644 --- a/delimitMate.txt +++ b/delimitMate.txt @@ -1,13 +1,13 @@ -*delimitMate.txt* Trying to keep those beasts at bay! v.1.5 +*delimitMate.txt* Trying to keep those beasts at bay! v.1.6 - REFERENCE MANUAL * + REFERENCE MANUAL *delimitMate* ============================================================================== 0.- CONTENTS *delimitMate-contents* - 1. Introduction____________________________|delimitMate| + 1. Introduction____________________________|delimitMateIntro| 2. Functionality___________________________|delimitMateFunctionality| 2.1 Automatic closing & exiting________|delimitMateAutoClose| 2.2 Expansion of space and CR__________|delimitMateExpansion| @@ -16,14 +16,14 @@ 3. Customization___________________________|delimitMateOptions| 3.1 Option summary_____________________|delimitMateOptionSummary| 3.2 Options details____________________|delimitMateOptionDetails| - 4. Public commands_________________________|delimitMatePublicCommands| + 4. Commands________________________________|delimitMateCommands| 5. TODO list_______________________________|delimitMateTodo| 6. Maintainer______________________________|delimitMateMaintainer| 7. Credits_________________________________|delimitMateCredits| 8. History_________________________________|delimitMateHistory| ============================================================================== - 1.- INTRODUCTION *delimitMate* + 1.- INTRODUCTION *delimitMateIntro* The delimitMate plugin tries to provide some not so dumb help in the work with delimiters (brackets, quotes, etc.), with some optional auto-completions and @@ -41,7 +41,7 @@ expanded to follow your coding style, you just need to define a couple of options with the desired mappings for them. ============================================================================== - 2. FUNCTIONALITY PROVIDED *delimitMateFunctionality* + 2. FUNCTIONALITY *delimitMateFunctionality* ------------------------------------------------------------------------------ 2.1 AUTOMATIC CLOSING AND EXITING *delimitMateAutoClose* @@ -56,7 +56,7 @@ closing delimiter, the cursor is placed outside the pair to the right of the closing delimiter. Unless |'b:delimitMate_matchpairs'| and |'b:delimitMate_quotes'|is set, this -script uses the values in '&matchpirs' to identify the pairs, and "\" ' ` " +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 @@ -122,7 +122,7 @@ will be welcome. e.g. (selection represented between square brackets): > - Selected text | After q" + Selected text | After \" ============================================= An [absurd] example! | An "absurd" example! < @@ -155,12 +155,16 @@ specific file types, see |delimitMateOptionDetails| for examples. |'delimitMate_expand_space'| Sets the expansion for inside an empty pair of matching delimiters or quotes. -|'delimitMate_excluded_ft'| Turns off the script for the given file types. +|'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. ------------------------------------------------------------------------------ 3.2 OPTIONS DETAILS *delimitMateOptionDetails* -Add the shown lines to your vimrc files in order to set the below options. +Add the shown lines to your vimrc file in order to set the below options. Local options take precedence over global ones and can be used along with autocmd to modify delimitMate's behavior for specific file types. @@ -241,20 +245,34 @@ The value of this option will be used to expand the space character when typed inside an empty delimiter pair. Read |delimitMateExpansion| for details. e.g.: > let delimitMate_expand_space = "\\\" - au filetype tcl let b:delimitMate_expand_space = "\" + au FileType tcl let b:delimitMate_expand_space = "\" < ------------------------------------------------------------------------------ *'delimitMate_excluded_ft'* Values: A string of file type names separated by single commas. ~ -Defaul: Empty. ~ +Default: Empty. ~ This options turns delimitMate off for the listed file types, use this option only if don't want any of the features it provides. e.g.: > let delimitMate_excluded_ft = "mail,txt" < +------------------------------------------------------------------------------ + *'delimitMate_apostrophes'* +Values: Strings separated by ":". ~ +Default: "n't:'s:'re:'d:'ll:'ve:s'" ~ + +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 = "" +< ============================================================================== - 4. PUBLIC COMMANDS *delimitMatePublicCommands* + 4. COMMANDS *delimitMateCommands* ------------------------------------------------------------------------------ :DelimitMateReload *:DelimitMateReload* @@ -372,6 +390,13 @@ This script was inspired by the auto-completion of delimiters of TextMate. 8. HISTORY *delimitMateHistory* Version Date Release notes ~ +|---------|------------|-----------------------------------------------------| + 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 @@ -412,4 +437,4 @@ This script was inspired by the auto-completion of delimiters of TextMate. |---------|------------|-----------------------------------------------------| -vim:tw=78:ts=8:ft=help:norl: +vim:tw=78:ts=8:ft=help:norl:formatoptions+=tcroqn:autoindent: diff --git a/delimitMate.vim b/delimitMate.vim index ff8afd9..83e9c30 100644 --- a/delimitMate.vim +++ b/delimitMate.vim @@ -1,9 +1,10 @@ " ============================================================================ " File: delimitMate.vim -" Version: 1.5 +" Version: 1.6 " Description: This plugin tries to emulate the auto-completion of delimiters " that TextMate provides. " Maintainer: Israel Chauca F. +" Manual: Read ":help delimitMate". " Credits: Some of the code is modified or just copied from the following: " " - Ian McCracken @@ -113,12 +114,19 @@ function! s:Init() "{{{1 if !exists("b:delimitMate_expand_space") && !exists("g:delimitMate_expand_space") " {{{ let s:expand_space = "\" - elseif b:delimitMate_expand_space == "" - let s:expand_space = "\" elseif exists("b:delimitMate_expand_space") - let s:expand_space = b:delimitMate_expand_space + if b:delimitMate_expand_space == "" + let s:expand_space = "\" + else + let s:expand_space = b:delimitMate_expand_space + endif else - let s:expand_space = g:delimitMate_expand_space + if g:delimitMate_expand_space == "" + let s:expand_space = "\" + else + let s:expand_space = g:delimitMate_expand_space + endif + endif " }}} if !exists("b:delimitMate_expand_cr") && !exists("g:delimitMate_expand_cr") " {{{ @@ -138,24 +146,34 @@ function! s:Init() "{{{1 endif " }}} + if !exists("b:delimitMate_apostrophes") && !exists("g:delimitMate_apostrophes") " {{{ + let s:apostrophes = split("n't:'s:'re:'m:'d:'ll:'ve:s'",':') + + elseif exists("b:delimitMate_apostrophes") + let s:apostrophes = split(b:delimitMate_apostrophes) + else + let s:apostrophes = split(g:delimitMate_apostrophes) + endif " }}} + let s:matchpairs = split(s:matchpairs_temp, ',') let s:left_delims = split(s:matchpairs_temp, ':.,\=') let s:right_delims = split(s:matchpairs_temp, ',\=.:') let s:VMapMsg = "delimitMate: delimitMate is disabled on blockwise visual mode." - call s:ResetMappings() + call s:UnMap() if s:autoclose call s:AutoClose() else call s:NoAutoClose() endif + call s:VisualMaps() call s:ExtraMappings() let b:loaded_delimitMate = 1 endfunction "}}}1 function! s:ValidMatchpairs(str) "{{{1 - if a:str !~ '^\(.:.\)\+\(,.:.\)*$' + if a:str !~ '^.:.\(,.:.\)*$' return 0 endif for pair in split(a:str,',') @@ -188,15 +206,19 @@ endfunction "}}}1 function! s:SkipDelim(char) "{{{1 let cur = strpart( getline('.'), col('.')-2, 3 ) if cur[0] == "\\" + " Escaped character return a:char elseif cur[1] == a:char + " Exit pair return "\" elseif cur[1] == ' ' && cur[2] == a:char - " I'm leaving this in case someone likes it. + " I'm leaving this in case someone likes it. Jump an space and delimiter. return "\\" elseif s:IsEmptyPair( cur[0] . a:char ) + " Add closing delimiter and jump back to the middle. return a:char . "\" else + " Nothing special here, return the same character. return a:char endif endfunction "}}}1 @@ -205,21 +227,23 @@ function! s:QuoteDelim(char) "{{{1 let line = getline('.') let col = col('.') if line[col - 2] == "\\" - "Inserting a quoted quotation mark into the string + " Seems like a escaped character, insert a single quotation mark. return a:char elseif line[col - 1] == a:char - "Escaping out of the string + " Get out of the string. return "\" else - "Starting a string + " Insert a pair and jump to the middle. return a:char.a:char."\" endif endfunction "}}}1 function! s:ClosePair(char) "{{{1 if getline('.')[col('.') - 1] == a:char + " Same character on the rigth, jump it. return "\" else + " Insert character. return a:char endif endfunction "}}}1 @@ -244,25 +268,6 @@ function! s:NoAutoClose() "{{{1 for delim in s:right_delims + s:quotes exec 'inoremap ' . delim . ' =SkipDelim("' . escape(delim,'"') . '")' endfor - - " Wrap the selection with matching pairs, but do nothing if blockwise visual mode is active: - let s:i = 0 - while s:i < len(s:matchpairs) - " Map left delimiter: - " vnoremap q( visualmode() == "" ? MapMsg("Message") : "s(\\"\" - exec 'vnoremap ' . s:visual_leader . s:left_delims[s:i] . ' IsBlockVisual() ? MapMsg("' . s:VMapMsg . '") : "s' . s:left_delims[s:i] . '\\"' . s:right_delims[s:i] . '\:call RestoreRegister()"' - - " Map right delimiter: - " vnoremap q) visualmode() == "" ? MapMsg("Message") : "s(\\""\" - exec 'vnoremap ' . s:visual_leader . s:right_delims[s:i] . ' IsBlockVisual() ? MapMsg("' . s:VMapMsg . '") : "s' . s:left_delims[s:i] . '\\"' . s:right_delims[s:i] . '\:call RestoreRegister()"' - let s:i += 1 - endwhile - - " Wrap the selection with matching quotes, but do nothing if blockwise visual mode is active: - for quote in s:quotes - " vnoremap q' visualmode() == "" ? MapMsg("Message") : "s'\\"'\" - exec 'vnoremap ' . s:visual_leader . quote . ' IsBlockVisual() ? MapMsg("' . s:VMapMsg . '") : "s' . escape(quote,'"') .'\\"' . escape(quote,'"') . '\:call RestoreRegister()"' - endfor endfunction "}}}1 function! s:AutoClose() "{{{1 @@ -286,22 +291,31 @@ function! s:AutoClose() "{{{1 exec 'inoremap ' . delim . ' =ClosePair("\' . delim . '")' endfor + " Try to fix the use of apostrophes: + " inoremap n't n't + for map in s:apostrophes + exec "inoremap " . map . " " . map + endfor + +endfunction "}}}1 + +function! s:VisualMaps() " {{{1 " Wrap the selection with matching pairs, but do nothing if blockwise visual mode is active: let s:i = 0 while s:i < len(s:matchpairs) " Map left delimiter: - " vnoremap q( visualmode() == "" ? MapMsg("Message") : "s(\\"\" + " vnoremap \( IsBlockVisual() ? MapMsg("Message") : "s(\\")\:call RestoreRegister()" exec 'vnoremap ' . s:visual_leader . s:left_delims[s:i] . ' IsBlockVisual() ? MapMsg("' . s:VMapMsg . '") : "s' . s:left_delims[s:i] . '\\"' . s:right_delims[s:i] . '\:call RestoreRegister()"' " Map right delimiter: - " vnoremap q) visualmode() == "" ? MapMsg("Message") : "s(\\""\" + " vnoremap \) IsBlockVisual() ? MapMsg("Message") : "s(\\")\:call RestoreRegister()" exec 'vnoremap ' . s:visual_leader . s:right_delims[s:i] . ' IsBlockVisual() ? MapMsg("' . s:VMapMsg . '") : "s' . s:left_delims[s:i] . '\\"' . s:right_delims[s:i] . '\:call RestoreRegister()"' let s:i += 1 endwhile " Wrap the selection with matching quotes, but do nothing if blockwise visual mode is active: for quote in s:quotes - " vnoremap q' visualmode() == "" ? MapMsg("Message") : "s'\\"'\" + " vnoremap \' IsBlockVisual() ? MapMsg("Message") : "s'\\"'\:call RestoreRegister()" exec 'vnoremap ' . s:visual_leader . quote . ' IsBlockVisual() ? MapMsg("' . s:VMapMsg . '") : "s' . escape(quote,'"') .'\\"' . escape(quote,'"') . '\:call RestoreRegister()"' endfor endfunction "}}}1 @@ -310,33 +324,39 @@ function! s:IsBlockVisual() " {{{1 if visualmode() == "" return 1 endif + " Store unnamed register values for later use in s:RestoreRegister(). let s:save_reg = getreg('"') - echomsg s:save_reg let s:save_reg_mode = getregtype('"') - echomsg s:save_reg_mode + if len(getline('.')) == 0 + " This for proper wrap of empty lines. let @" = "\n" endif return 0 endfunction " }}}1 function! s:RestoreRegister() " {{{1 + " Restore unnamed register values store in s:IsBlockVisual(). call setreg('"', s:save_reg, s:save_reg_mode) echo "" endfunction " }}}1 function! s:ExpandReturn() "{{{1 if s:WithinEmptyPair() + " Expand: return s:expand_return else + " Don't return "\" endif endfunction "}}}1 function! s:ExpandSpace() "{{{1 if s:WithinEmptyPair() + " Expand: return s:expand_space else + " Don't return "\" endif endfunction "}}}1 @@ -346,10 +366,14 @@ function! s:ExtraMappings() "{{{1 inoremap WithinEmptyPair() ? "\\\" : "\" " Expand return if inside an empty pair: - inoremap =ExpandReturn() + if exists("b:delimitMate_expand_cr") || exists("g:delimitMate_expand_cr") + inoremap =ExpandReturn() + endif " Expand space if inside an empty pair: - inoremap =ExpandSpace() + if exists("b:delimitMate_expand_space") || exists("g:delimitMate_expand_space") + inoremap =ExpandSpace() + endif endfunction "}}}1 function! s:TestMappings() "{{{1 @@ -436,6 +460,9 @@ function! s:UnMap() " {{{ "echomsg 'iunmap ' . char endif endfor + for map in s:apostrophes + exec "silent! iunmap " . map + endfor " Visual Mappings: for char in s:right_delims + s:left_delims + s:quotes @@ -476,6 +503,7 @@ endfunction "}}}1 function! s:DelimitMateDo() "{{{1 if exists("g:delimitMate_excluded_ft") + " Check if this file type is excluded: for ft in split(g:delimitMate_excluded_ft,',') if ft ==? &filetype if !exists("s:quotes") @@ -495,10 +523,9 @@ function! s:DelimitMateDo() "{{{1 finally let &cpo = save_cpo endtry - let &cpo = save_cpo endfunction "}}}1 -" Do the real work: {{{1 +" Set some commands: {{{1 call s:DelimitMateDo() " Let me refresh without re-loading the buffer: