Argumentos da função de troca


19

Ao refatorar o código, seria útil poder trocar argumentos de função.

Mudando para, por exemplo:

func(foo[0], bar(), baz.spam)

para dentro

func(baz.spam, foo[0], bar())

Existe alguma maneira de trocar argumentos para a esquerda / direita, mantendo parênteses e vírgulas de função no lugar?


Observe que isso pode se tornar bastante envolvido se você quiser explicar argumentos que são chamadas de função com seus próprios argumentos - por exemplo: func(baz->spam, foo[0], bar(a, b, c))- apoiar esses casos provavelmente envolveria uma análise mais abrangente.

Respostas:


23

Sem plugins

| indica a posição do cursor

func(foo[0], bar(), |baz.spam)

Passos:

  1. dt) irá excluir baz.spam
  2. Ff moverá o cursor para o caractere f em foo[0]
  3. vt,p irá excluir foo [0] e substituí-lo por baz.spam
  4. $P vai colar o foo [0] antes do parens
  5. Repita as etapas de 1 a 4 para outros.

With plugins

  • vim-argumentative de Peter Rincker : fornece objetos de texto para mover argumentos de função (mapeamentos padrão: <,e >,).
  • vim-exchange de Tom McDonald : fornece mapeamentos úteis para trocar duas seleções (mapeamentos padrão: cxno modo normal e Xno modo visual).
  • vim-lateralmente por Andrew Radev : Mova argumentos de função (e outros itens delimitados por algo) para a esquerda e direita (mapeamentos padrão:) NA.
  • vim-swap by machakann : Reordene itens delimitados (mapeamentos padrão: g<e g>).

6
a solução não-plugin é muito específico para o caso ...
Elyashiv

3
@elyashiv A ideia é que você possa usar uma técnica semelhante para qualquer argumento de função. Basicamente, puxe uma palavra, selecione visualmente outra palavra, cole, da qual o Vim puxará o caractere excluído para o registro e, em seguida, cole de onde você primeiro puxou.
Akshay

1
+1 para vim lateralmente! A última seção descreve um recurso muito interessante: cia "mudar de argumento". ❤️
Martijn Courteaux

5

Eu apresento 3 métodos. Os dois primeiros são casos particulares, que exigem menos pressionamentos de tecla. O último é genérico. |representa a posição do cursor.


Trocar argumentos adjacentes (não funciona nos dois últimos)

function func(foo[0], |bar(), baz.spam, qux->norf)

Passos:

  1. dW excluir o Word atual (argumento)
  2. W vá para o primeiro caractere do próximo argumento
  3. P cole antes do cursor

Troque os dois últimos argumentos

function func(foo[0], bar()|, baz.spam, qux->norf)

Passos:

  1. dt, excluir até a próxima vírgula
  2. E vá para o último caractere do próximo argumento
  3. P cole antes do cursor

Troque dois argumentos

function func(|foo[0], bar(), baz.spam, qux->norf)

Passos:

  1. vt,d excluir visualmente até vírgula
  2. W várias vezes até chegar ao argumento com o qual deseja trocar
  3. gP cole antes do cursor e coloque o cursor no caractere após o conteúdo colado
  4. dt,exclua até a próxima vírgula. substitua ,por )se este for o último argumento
  5. `< volte ao início da última área visual (o cursor será colocado na vírgula)
  6. P cole antes do cursor

Edit: como apontado por @ aharris88, o OP quer que o último argumento seja o primeiro e mova todos os outros para a direita.

Girar argumentos para a direita

function func(foo[0], bar(), baz.spam|, qux->norf)

Passos:

  1. dw excluir ,␣
  2. dt) excluir último argumento
  3. %p pule para abrir parênteses e cole o último argumento
  4. a,␣ insira vírgula e espaço
  5. <Esc> retornar ao modo normal

Ou, se você não quiser sair do modo normal:

  1. "rdwexcluir ,␣em um registror
  2. dt) excluir último argumento
  3. %p pule para abrir parênteses e cole o último argumento
  4. "rp colar o conteúdo do registro r

Bônus: um GIF para cada caso: swap1 , swap2 , swap3 e rotação


Embora essa resposta troque argumentos, ela não responde à pergunta, que é como mover o último argumento para o início.
precisa saber é o seguinte

@ aharris88, você está certo. Eu editei minha resposta.
Gonçalo Ribeiro
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.