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:
dW excluir o Word atual (argumento)
W vá para o primeiro caractere do próximo argumento
P cole antes do cursor
Troque os dois últimos argumentos
function func(foo[0], bar()|, baz.spam, qux->norf)
Passos:
dt, excluir até a próxima vírgula
E vá para o último caractere do próximo argumento
P cole antes do cursor
Troque dois argumentos
function func(|foo[0], bar(), baz.spam, qux->norf)
Passos:
vt,d excluir visualmente até vírgula
W várias vezes até chegar ao argumento com o qual deseja trocar
gP cole antes do cursor e coloque o cursor no caractere após o conteúdo colado
dt,exclua até a próxima vírgula. substitua ,por )se este for o último argumento
`< volte ao início da última área visual (o cursor será colocado na vírgula)
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:
dw excluir ,␣
dt) excluir último argumento
%p pule para abrir parênteses e cole o último argumento
a,␣ insira vírgula e espaço
<Esc> retornar ao modo normal
Ou, se você não quiser sair do modo normal:
"rdwexcluir ,␣em um registror
dt) excluir último argumento
%p pule para abrir parênteses e cole o último argumento
"rp colar o conteúdo do registro r
Bônus: um GIF para cada caso:
swap1 , swap2 , swap3 e rotação