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