Comment puis-je échanger deux arguments dans un appel à une fonction Python?
Si je mets point
l'espace entre ces deux arguments:
self.assertEqual(json.loads(some.data), json_data)
puis M-t
( transpose-words
), j'obtiens:
self.assertEqual(json.loads(some.json), data_data)
Par contre avec CMt ( transpose-sexps
) j'obtiens:
self.assertEqual(json.loadsjson_data, (some.data))
Ce que je veux c'est:
self.assertEqual(json_data, json.loads(some.data))
Y a-t-il une commande qui fera ça?
python
text-editing
Croad Langshan
la source
la source
transpose-subr
qui prend uneforward
fonction et la traduit entranspose
fonction. Donc, si nous avionsc-forward-arglist
(fonction pour passer d'une fonction arg à la suivante - AFAICT cela n'existe pas), nous l'aurionsc-transpose-arglist
.Réponses:
C'est quelque chose que je voulais aussi avoir depuis longtemps, et j'ai trouvé ici une motivation pour y travailler. Ce n'est probablement pas très robuste, mais au premier essai, il semble couvrir les cas que j'ai essayés:
la source
forward-sexp-function
, et qui semblait trop lourde à cause des virgules. J'ai ensuite essayé de copiertraspose-sexp
pour faire la même chose, et, encore une fois, avoir à tenir compte des virgules rend cela vraiment difficile. Je ne prétends pas que cela fait toujours la bonne chose quand il s'agit de lister les délimiteurs, peut-être seulement la moitié du temps ...(aa, bb)
lorsque le curseur est sur le premiera
. Cela ne pas non plus le travail de transpositionFOO(aaa *, bbb, ccc)
Les*
dégâts en quelque sorte jusqu'à la transposition.FOO(&aaa, bbb)
(et ne change pas).J'utilise une variation de ce
transpose-sexps
qui regarde le cas que vous décrivez et transpose les choses séparées par des virgules, ou tout simplement fait régulièrementtranspose-sexps
. Il laisse également le curseur en place au lieu de le faire glisser vers l'avant, ce qui est un peu différent mais j'aime personnellement.la source
f(a=1, b=2)
(il transpose autour)f(a=1, b=2)
- emacs.stackexchange.com/a/47930/2418Dans les modes qui utilisent SMIE,
transpose-sexp
devrait fonctionner correctement pour ce cas. Ils échoueront quand le symbole infixe (aka "séparateur") n'est pas un,
(ou un;
) mais un mot (par exempleand
).Donc, mon avis est que la commande pour cela est
transpose-sexp
et quand cela ne fonctionne pas correctement, je le considère comme un bug (mais un bug qui peut être difficile et / ou prendre du temps à corriger et à faible priorité, alors ne le faites pas ' t retenez votre souffle). La façon de le résoudre est de définirforward-sexp-function
une fonction qui saura que "après avoir vu une virgule, je saute tout autour de l'argument".la source
forward-sexp-function
mais vous auriez ajouter du code pour n'utiliser SMIE queforward-sexp-function
dans les cas où cela fonctionne assez bien, car dans de nombreux autres cas, cela entraînerait un comportement déroutant.