mirror of
https://github.com/Raimondi/delimitMate.git
synced 2025-12-06 12:44:27 +08:00
Better handling of nested quotes. Closes #134.
This commit is contained in:
@@ -111,6 +111,22 @@ function! delimitMate#IsEmptyPair(str) "{{{
|
||||
return 0
|
||||
endfunction "}}}
|
||||
|
||||
function! delimitMate#RightQ(char) "{{{
|
||||
let i = 0
|
||||
while delimitMate#GetCharFromCursor(i) ==# a:char
|
||||
let i += 1
|
||||
endwhile
|
||||
return i
|
||||
endfunction "}}}
|
||||
|
||||
function! delimitMate#LeftQ(char) "{{{
|
||||
let i = 0
|
||||
while delimitMate#GetCharFromCursor(i - 1) ==# a:char
|
||||
let i -= 1
|
||||
endwhile
|
||||
return i * -1
|
||||
endfunction "}}}
|
||||
|
||||
function! delimitMate#GetCharFromCursor(...) "{{{
|
||||
let idx = col('.') - 1
|
||||
if !a:0 || (a:0 && a:1 >= 0)
|
||||
@@ -334,10 +350,17 @@ function! delimitMate#QuoteDelim(char) "{{{
|
||||
endif
|
||||
let char_at = delimitMate#GetCharFromCursor(0)
|
||||
let char_before = delimitMate#GetCharFromCursor(-1)
|
||||
if char_at == a:char &&
|
||||
\ index(s:g('nesting_quotes'), a:char) < 0
|
||||
" Get out of the string.
|
||||
return "\<Right>"
|
||||
let nesting_on = index(s:g('nesting_quotes'), a:char) > -1
|
||||
let left_q = nesting_on ? delimitMate#LeftQ(a:char) : 0
|
||||
if nesting_on && left_q > 1
|
||||
" Nesting quotes.
|
||||
let right_q = delimitMate#RightQ(a:char)
|
||||
let quotes = right_q > left_q + 1 ? 0 : left_q - right_q + 2
|
||||
let lefts = quotes - 1
|
||||
return repeat(a:char, quotes) . repeat("\<Left>", lefts)
|
||||
elseif char_at == a:char
|
||||
" Inside an empty pair, jump out
|
||||
return a:char . "\<Del>"
|
||||
elseif delimitMate#IsSmartQuote(a:char)
|
||||
" Seems like a smart quote, insert a single char.
|
||||
return a:char
|
||||
|
||||
@@ -182,8 +182,10 @@ e.g.: >
|
||||
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.
|
||||
When adding a third quote listed in this option is inserted, three quotes will
|
||||
be inserted to the right of the cursor and the cursor will stay in the middle.
|
||||
If more quotes are inserted the number of quotes on both sides of the cursor
|
||||
will stay balanced.
|
||||
e.g.: >
|
||||
let delimitMate_nesting_quotes = ['"','`']
|
||||
au FileType python let b:delimitMate_nesting_quotes = ['"']
|
||||
@@ -714,6 +716,7 @@ This script was inspired by the auto-completion of delimiters on TextMate.
|
||||
- Add delimitMate_eol_marker.
|
||||
- Reduce the number of mappings.
|
||||
- Stop using setline().
|
||||
- Better handling of nested quotes.
|
||||
|---------|------------|-----------------------------------------------------|
|
||||
2.6 2011-01-14 * - Add smart_matchpairs feature.
|
||||
- Add mapping to jump over contiguous delimiters.
|
||||
|
||||
@@ -30,6 +30,7 @@ let g:delimitMate_autoclose = 1
|
||||
# Handle backspace gracefully.
|
||||
set backspace=
|
||||
"'\<Esc>a\<BS>x" "'x'"
|
||||
set backspace=2
|
||||
set cpo=ces$
|
||||
"'x" "'x'"
|
||||
# Make sure smart quote works beyond first column.
|
||||
@@ -40,3 +41,10 @@ set cpo=ces$
|
||||
"}\<Home>'" "''}"
|
||||
"'\<Del>abc '" "'abc '"
|
||||
"''abc '" "''abc ''"
|
||||
# Nesting quotes:
|
||||
let g:delimitMate_nesting_quotes = split(g:delimitMate_quotes, '\s\+')
|
||||
"'''x" "'''x'''"
|
||||
"''''x" "''''x''''"
|
||||
"''x" "''x"
|
||||
"'x" "'x'"
|
||||
unlet g:delimitMate_nesting_quotes
|
||||
|
||||
Reference in New Issue
Block a user