Pregunta:
¿Cómo puedo intercambiar dos argumentos en una llamada a una función de Python?
Si pongo un point
en el espacio entre estos dos argumentos:
self.assertEqual(json.loads(some.data), json_data)
y luego Mt
( transpose-words
), obtengo:
self.assertEqual(json.loads(some.json), data_data)
Por otro lado con CMt ( transpose-sexps
) obtengo:
self.assertEqual(json.loadsjson_data, (some.data))
Lo que quiero es:
self.assertEqual(json_data, json.loads(some.data))
¿Hay algún comando que haga eso?
Respuesta:
Utilizo una variación de transpose-sexps
que busca el caso que usted describe y transpone cosas separadas por comas, o simplemente hace transpose-sexps
regulares. También deja el cursor en su lugar en lugar de arrastrarlo hacia adelante, lo cual es un poco diferente pero a mí personalmente me gusta.
(defun my-transpose-sexps ()
"If point is after certain chars transpose chunks around that.
Otherwise transpose sexps."
(interactive "*")
(if (not (looking-back "[,]\\s-*" (point-at-bol)))
(progn (transpose-sexps 1) (forward-sexp -1))
(let ((beg (point)) end rhs lhs)
(while (and (not (eobp))
(not (looking-at "\\s-*\\([,]\\|\\s)\\)")))
(forward-sexp 1))
(setq rhs (buffer-substring beg (point)))
(delete-region beg (point))
(re-search-backward "[,]\\s-*" nil t)
(setq beg (point))
(while (and (not (bobp))
(not (looking-back "\\([,]\\|\\s(\\)\\s-*" (point-at-bol))))
(forward-sexp -1))
(setq lhs (buffer-substring beg (point)))
(delete-region beg (point))
(insert rhs)
(re-search-forward "[,]\\s-*" nil t)
(save-excursion
(insert lhs)))))