Jak mogę zamienić dwa argumenty w wywołaniu funkcji Python?
Jeśli wstawię point
spację między tymi dwoma argumentami:
self.assertEqual(json.loads(some.data), json_data)
a następnie M-t
( transpose-words
) otrzymuję:
self.assertEqual(json.loads(some.json), data_data)
Z drugiej strony dzięki CMt ( transpose-sexps
) otrzymuję:
self.assertEqual(json.loadsjson_data, (some.data))
Chcę to:
self.assertEqual(json_data, json.loads(some.data))
Czy istnieje polecenie, które to zrobi?
python
text-editing
Croad Langshan
źródło
źródło
transpose-subr
która bierzeforward
funkcję i tłumaczy ją natranspose
funkcję. Więc gdybyśmy mielic-forward-arglist
(funkcja przechodzenia z jednej funkcji arg do następnej - AFAICT to nie istnieje), mielibyśmyc-transpose-arglist
.Odpowiedzi:
To też chciałem mieć od dłuższego czasu, a tutaj znalazłem motywację do pracy nad tym. Prawdopodobnie nie jest zbyt solidny, ale przy pierwszej próbie wydaje się, że obejmuje przypadki, które próbowałem:
źródło
forward-sexp-function
, i to wydawało się zbyt kłopotliwe z powodu przecinków. Następnie próbowałem naśladować,traspose-sexp
aby zrobić to samo i znowu, konieczność uwzględnienia przecinków sprawia, że jest to naprawdę trudne. Nie twierdzę, że zawsze robi to dobrze, jeśli chodzi o ograniczniki listy, może tylko przez połowę czasu ...(aa, bb)
gdy kursor znajduje się na pierwszyma
. To również nie działa w przypadku transpozycjiFOO(aaa *, bbb, ccc)
.*
Jakoś to popsuło transpozycję.FOO(&aaa, bbb)
(i nie zamienia).Używam odmiany
transpose-sexps
tego wyglądu opisanego przypadku i transponuje rzeczy oddzielone przecinkami lub po prostu regularnietranspose-sexps
. Pozostawia również kursor w miejscu zamiast przeciągania go do przodu, co jest nieco inne, ale ja osobiście lubię.źródło
f(a=1, b=2)
(transponuje wokół)f(a=1, b=2)
- emacs.stackexchange.com/a/47930/2418W trybach, które używają SMIE,
transpose-sexp
powinny działać poprawnie w tym przypadku. Nadal nie powiedzie się, gdy symbol infix (aka „separator”) nie jest a,
(lub a;
), ale jest słowem (npand
.).Moim zdaniem jest to polecenie,
transpose-sexp
a gdy to nie działa poprawnie, uważam to za błąd (ale błąd, który może być trudny i / lub wymaga czasu, aby go naprawić i mieć niski priorytet, więc nie wstrzymaj oddech). Aby to naprawić, należy ustawićforward-sexp-function
funkcję, która będzie wiedziała, że „po zobaczeniu przecinka po prostu przeskakuję cały argument”.źródło
forward-sexp-function
ale będziesz miał dodać kod, aby używać SMIE tylkoforward-sexp-function
w tych przypadkach, w których działa wystarczająco dobrze, ponieważ w wielu innych przypadkach spowodowałoby to zamieszanie.