Vim t) 。因此,为了完整起见,我确实需要两个命令:-pivot是选择的最后一个字符,-pivot是选择的最后一个字。但是,请随意重新设计命令的工作流,我的{selection}{motion}只是一个建议。谢谢你,+1。@Metz,我不太明白你的句子。我的解
Vim t) 。因此,为了完整起见,我确实需要两个命令:-pivot是选择的最后一个字符,-pivot是选择的最后一个字。但是,请随意重新设计命令的工作流,我的{selection}{motion}只是一个建议。谢谢你,+1。@Metz,我不太明白你的句子。我的解,vim,Vim,t) 。因此,为了完整起见,我确实需要两个命令:-pivot是选择的最后一个字符,-pivot是选择的最后一个字。但是,请随意重新设计命令的工作流,我的{selection}{motion}只是一个建议。谢谢你,+1。@Metz,我不太明白你的句子。我的解决方案在涉及函数参数时非常有效--di,+movement+vi,g“,并且技巧已经完成(感谢我的另一个插件知道参数是什么)。但是它没有pivot的概念。 tmp = realloc (words, sizeof (char **) * (*c
t) 。因此,为了完整起见,我确实需要两个命令:-pivot是选择的最后一个字符,-pivot是选择的最后一个字。但是,请随意重新设计命令的工作流,我的{selection}{motion}只是一个建议。谢谢你,+1。@Metz,我不太明白你的句子。我的解决方案在涉及函数参数时非常有效--
di,
+movement+vi,g“
,并且技巧已经完成(感谢我的另一个插件知道参数是什么)。但是它没有pivot的概念。
tmp = realloc (words, sizeof (char **) * (*count + 1));
#if !defined(_CONSOLE_H_) && defined (__MINGW32__)
#if [!]defined(_CONSOLE_H_) && defined (__MINGW32__)
tmp = realloc (words, [s]izeof (char **) * (*count + 1));
static char ** tokenize_input (char * input, PDWORD count);
<s> - char-wise - the pivot is the last character of the selection;
<S> - word-wise - the pivot is the last word of the selection.
function! Swap(...) "{{{
let start_v = col("'<")
let end_v = col("'>")
let mv = ''
let isMv = 0
while !isMv
let char = s:GetChar()
if char == '<Esc>'
return ''
endif
let mv .= char
let isMv = s:IsMovement(mv)
echon mv."\r"
endwhile
if isMv == 2
return ''
endif
exec "normal! ".end_v.'|'.mv
let lhs = '\%'.start_v.'c\(.\{-}\S\)'
if !a:0
let pivot = '\(\s*\%'.(end_v).'c.\s*\)'
else
let pivot = '\(\s*'.a:1.'*\%'.(end_v).'c'.a:1.'\+\s*\)'
endif
let rhs = '\(.*\%#.\)'
exec 's/'.lhs.pivot.rhs.'/\3\2\1/'
endfunction "Swap }}}
function! s:GetChar() "{{{
let char = getchar()
if type(char) == type(0) && char < 33
return '<Esc>'
elseif char
let char = nr2char(char)
endif
return char
endfunction "GetChar }}}
function! s:IsMovement(mv) "{{{
let ft = a:mv =~ '^\C\d*[fFtT].$'
let ft_partial = a:mv =~ '^\C\d*\%([fFtT].\?\)\?$'
let right = a:mv =~ '^\d*[l$|;,]\|g[m$]$'
let right_partial = a:mv =~ '^\d*\%([l$|;,]\|g[m$]\?\)\?$'
if !right_partial && !ft_partial
return 2
endif
return ft || right
endfunction "IsMovement2Right }}}
" Use last char as pivot. e.g.: the comma in the given example.
vmap <silent> <leader>s1 :<C-U>call Swap()<CR>
" Use \S\+ (WORD) as pivot. e.g.: &&
vmap <silent> <leader>ss :<C-U>call Swap('\S')<CR>
" Use \w\+ as pivot.
vmap <silent> <leader>sw :<C-U>call Swap('\w')<CR>
vnoremap <silent> <leader>m xm':<c-u>set opfunc=PasteAfter<cr>g@
function! PasteAfter(type)
let [sl, sc] = getpos("'[")[1:2]
let [cl, cc] = getpos("''")[1:2]
let back = sl < cl || (sl == cl && sc < cc)
undojoin | exe 'norm!' ['`]p`[', '`[P`]'][back]
endfunction
vmap <silent> <leader>aa :call SwapAround()<CR>
vmap <silent> <leader>a, :call SwapAround(',')<CR>
vmap <silent> <leader>a. :call SwapAround('\.')<CR>
vmap <silent> <leader>a; :call SwapAround(';')<CR>
vmap <silent> <leader>a<Space> :call SwapAround("[ \t\n]*")<CR>
function! SwapAround(...) range
if 1 == a:0
let exp = a:1
else
call inputsave()
let exp = input('pivot:')
call inputrestore()
endif
if exp !~ '[ \t\n]'
let exp = '[ \t\n]*'.exp.'[ \t\n]*'
endif
call s:SwapAroundBase(exp, getpos("'<"), getpos("'>"))
endfunction
function! s:SwapAroundBase(sepExp, start, end) range
let save_a = @a
try
let originalText = s:getText(a:start, a:end)
let sepStart = match(originalText, a:sepExp)
let sepEnd = matchend(originalText, a:sepExp)
let firstOne = strpart(originalText, 0, sepStart)
let sep = strpart(originalText, sepStart, sepEnd - sepStart)
let secondOne = strpart(originalText, sepEnd)
let @a = secondOne.sep.firstOne
let posStatus = setpos(".", a:start)
normal! v
let posStatus = setpos(".", a:end)
normal "ap
finally
let @a = save_a
endtry
endfunction
function! s:getText(start, end)
let lines = getline(a:start[1], a:end[1])
let lines[-1] = lines[-1][: a:end[2] - 1]
let lines[0] = lines[0][a:start[2] - 1:]
return join(lines, "\n")
endfunction