mirror of
https://github.com/junegunn/vim-easy-align.git
synced 2025-11-10 19:03:50 -05:00
Forgiving interactive mode: Do not terminate on invalid input
This commit is contained in:
@@ -143,7 +143,9 @@ function! s:echon(l, n, r, d, o, warn)
|
|||||||
\ [['Identifier', a:d == ' ' ? '\ ' : (a:d == '\' ? '\\' : a:d)]])
|
\ [['Identifier', a:d == ' ' ? '\ ' : (a:d == '\' ? '\\' : a:d)]])
|
||||||
if a:r == -1 | call add(tokens, ['Comment', ')']) | endif
|
if a:r == -1 | call add(tokens, ['Comment', ')']) | endif
|
||||||
call add(tokens, ['Statement', empty(a:o) ? '' : ' '.string(a:o)])
|
call add(tokens, ['Statement', empty(a:o) ? '' : ' '.string(a:o)])
|
||||||
call add(tokens, ['WarningMsg', a:warn])
|
if !empty(a:warn)
|
||||||
|
call add(tokens, ['WarningMsg', ' ('.a:warn.')'])
|
||||||
|
endif
|
||||||
|
|
||||||
call s:echon_(tokens)
|
call s:echon_(tokens)
|
||||||
endfunction
|
endfunction
|
||||||
@@ -561,7 +563,7 @@ function! s:atoi(str)
|
|||||||
return (a:str =~ '^[0-9]\+$') ? str2nr(a:str) : a:str
|
return (a:str =~ '^[0-9]\+$') ? str2nr(a:str) : a:str
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:interactive(modes, vis, opts)
|
function! s:interactive(modes, vis, opts, delims)
|
||||||
let mode = s:shift(a:modes, 1)
|
let mode = s:shift(a:modes, 1)
|
||||||
let n = ''
|
let n = ''
|
||||||
let ch = ''
|
let ch = ''
|
||||||
@@ -607,9 +609,21 @@ function! s:interactive(modes, vis, opts)
|
|||||||
elseif ch == "\<C-I>"
|
elseif ch == "\<C-I>"
|
||||||
let opts['idt'] = s:shift(vals['indentation'], 1)
|
let opts['idt'] = s:shift(vals['indentation'], 1)
|
||||||
elseif ch == "\<C-L>"
|
elseif ch == "\<C-L>"
|
||||||
let opts['lm'] = s:atoi(s:input("Left margin: ", get(opts, 'lm', ''), a:vis))
|
let lm = s:input("Left margin: ", get(opts, 'lm', ''), a:vis)
|
||||||
|
if empty(lm)
|
||||||
|
let warn = 'Set to default. Input 0 to remove it'
|
||||||
|
silent! call remove(opts, 'lm')
|
||||||
|
else
|
||||||
|
let opts['lm'] = s:atoi(lm)
|
||||||
|
endif
|
||||||
elseif ch == "\<C-R>"
|
elseif ch == "\<C-R>"
|
||||||
let opts['rm'] = s:atoi(s:input("Right margin: ", get(opts, 'rm', ''), a:vis))
|
let rm = s:input("Right margin: ", get(opts, 'rm', ''), a:vis)
|
||||||
|
if empty(rm)
|
||||||
|
let warn = 'Set to default. Input 0 to remove it'
|
||||||
|
silent! call remove(opts, 'rm')
|
||||||
|
else
|
||||||
|
let opts['rm'] = s:atoi(rm)
|
||||||
|
endif
|
||||||
elseif ch == "\<C-U>"
|
elseif ch == "\<C-U>"
|
||||||
let opts['iu'] = s:shift(vals['ignore_unmatched'], 1)
|
let opts['iu'] = s:shift(vals['ignore_unmatched'], 1)
|
||||||
elseif ch == "\<C-G>"
|
elseif ch == "\<C-G>"
|
||||||
@@ -636,24 +650,40 @@ function! s:interactive(modes, vis, opts)
|
|||||||
elseif ch == "\<C-_>" || ch == "\<C-X>"
|
elseif ch == "\<C-_>" || ch == "\<C-X>"
|
||||||
let prompt = 'Regular expression: '
|
let prompt = 'Regular expression: '
|
||||||
let ch = s:input(prompt, '', a:vis)
|
let ch = s:input(prompt, '', a:vis)
|
||||||
if !empty(ch)
|
let s:prev_echon_len = len(prompt . ch)
|
||||||
|
if !empty(ch) && s:valid_regexp(ch)
|
||||||
let regx = 1
|
let regx = 1
|
||||||
let s:prev_echon_len = len(prompt . ch)
|
|
||||||
break
|
break
|
||||||
|
else
|
||||||
|
let warn = 'Invalid regular expression: '.ch
|
||||||
endif
|
endif
|
||||||
elseif ch =~ '[[:print:]]'
|
elseif ch =~ '[[:print:]]'
|
||||||
break
|
if has_key(a:delims, ch)
|
||||||
|
break
|
||||||
|
else
|
||||||
|
let warn = 'Unknown delimiter key: '.ch
|
||||||
|
endif
|
||||||
else
|
else
|
||||||
let warn = ' - Invalid character'
|
let warn = 'Invalid character'
|
||||||
endif
|
endif
|
||||||
endwhile
|
endwhile
|
||||||
return [mode, n, ch, s:normalize_options(opts), regx]
|
return [mode, n, ch, s:normalize_options(opts), regx]
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:test_regexp(regexp)
|
function! s:valid_regexp(regexp)
|
||||||
try | call matchlist('', a:regexp)
|
try
|
||||||
catch | call s:exit("Invalid regular expression: ". a:regexp)
|
call matchlist('', a:regexp)
|
||||||
|
catch
|
||||||
|
return 0
|
||||||
endtry
|
endtry
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:test_regexp(regexp)
|
||||||
|
if !s:valid_regexp(a:regexp)
|
||||||
|
call s:exit('Invalid regular expression: '. a:regexp)
|
||||||
|
endif
|
||||||
|
return a:regexp
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:parse_args(args)
|
function! s:parse_args(args)
|
||||||
@@ -700,7 +730,7 @@ function! s:parse_args(args)
|
|||||||
|
|
||||||
" Found regexp
|
" Found regexp
|
||||||
if !empty(matches)
|
if !empty(matches)
|
||||||
return [matches[1], matches[2], opts, 1]
|
return [matches[1], s:test_regexp(matches[2]), opts, 1]
|
||||||
else
|
else
|
||||||
let tokens = matchlist(args, '^\([1-9][0-9]*\|-[0-9]*\|\*\*\?\)\?\s*\(.\{-}\)\?$')
|
let tokens = matchlist(args, '^\([1-9][0-9]*\|-[0-9]*\|\*\*\?\)\?\s*\(.\{-}\)\?$')
|
||||||
return [tokens[1], tokens[2], opts, 0]
|
return [tokens[1], tokens[2], opts, 0]
|
||||||
@@ -735,12 +765,17 @@ function! s:align(bang, first_line, last_line, expr)
|
|||||||
" Heuristically determine if the user was in visual mode
|
" Heuristically determine if the user was in visual mode
|
||||||
let vis = a:first_line == line("'<") && a:last_line == line("'>")
|
let vis = a:first_line == line("'<") && a:last_line == line("'>")
|
||||||
|
|
||||||
|
let delimiters = s:easy_align_delimiters_default
|
||||||
|
if exists('g:easy_align_delimiters')
|
||||||
|
let delimiters = extend(copy(delimiters), g:easy_align_delimiters)
|
||||||
|
endif
|
||||||
|
|
||||||
if empty(a:expr)
|
if empty(a:expr)
|
||||||
let [mode, n, ch, opts, regexp] = s:interactive(copy(modes), vis, opts)
|
let [mode, n, ch, opts, regexp] = s:interactive(copy(modes), vis, opts, delimiters)
|
||||||
else
|
else
|
||||||
let [n, ch, opts, regexp] = s:parse_args(a:expr)
|
let [n, ch, opts, regexp] = s:parse_args(a:expr)
|
||||||
if empty(n) && empty(ch)
|
if empty(n) && empty(ch)
|
||||||
let [mode, n, ch, opts, regexp] = s:interactive(copy(modes), vis, opts)
|
let [mode, n, ch, opts, regexp] = s:interactive(copy(modes), vis, opts, delimiters)
|
||||||
elseif empty(ch)
|
elseif empty(ch)
|
||||||
" Try swapping n and ch
|
" Try swapping n and ch
|
||||||
let [n, ch] = ['', n]
|
let [n, ch] = ['', n]
|
||||||
@@ -757,13 +792,7 @@ function! s:align(bang, first_line, last_line, expr)
|
|||||||
let nth = n
|
let nth = n
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let delimiters = s:easy_align_delimiters_default
|
|
||||||
if exists('g:easy_align_delimiters')
|
|
||||||
let delimiters = extend(copy(delimiters), g:easy_align_delimiters)
|
|
||||||
endif
|
|
||||||
|
|
||||||
if regexp
|
if regexp
|
||||||
call s:test_regexp(ch)
|
|
||||||
let dict = { 'pattern': ch }
|
let dict = { 'pattern': ch }
|
||||||
else
|
else
|
||||||
" Resolving command-line ambiguity
|
" Resolving command-line ambiguity
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
4Gvipjyvip
|
4Gvipjyvip
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
4Gvipjyvip:EasyAlign:
|
4Gvipjyvip:EasyAlign:
|
||||||
|
|||||||
Reference in New Issue
Block a user