Как я могу поменять два аргумента при вызове функции Python?
Если я поставлю point
пространство между этими двумя аргументами:
self.assertEqual(json.loads(some.data), json_data)
и тогда M-t
( transpose-words
) я получаю:
self.assertEqual(json.loads(some.json), data_data)
С другой стороны, с CMt ( transpose-sexps
) я получаю:
self.assertEqual(json.loadsjson_data, (some.data))
Что я хочу это:
self.assertEqual(json_data, json.loads(some.data))
Есть команда, которая сделает это?
python
text-editing
Croad Langshan
источник
источник
transpose-subr
которая вызываетforward
функцию и переводит ее вtranspose
функцию. Поэтому, если бы у нас былаc-forward-arglist
(функция для перехода от одной функции arg к следующей - AFAICT, этого не существует), мы бы получилиc-transpose-arglist
.Ответы:
Это то, что я тоже хотел иметь в течение долгого времени, и здесь я нашел некоторую мотивацию для работы над этим. Это, вероятно, не очень надежно, но с первой попытки это, кажется, покрывает случаи, которые я пытался:
источник
forward-sexp-function
, и это оказалось слишком громоздким из-за запятых. Затем я попытался подражать,traspose-sexp
чтобы сделать то же самое, и, опять же, необходимость учитывать запятые делает это действительно сложно. Я не утверждаю, что это всегда делает правильно, когда дело доходит до разделителей списков, может быть, только половину времени ...(aa, bb)
когда курсор находится на первомa
. Это также не работает для транспонирования.FOO(aaa *, bbb, ccc)
Как-*
то портит транспонирование.FOO(&aaa, bbb)
(и не меняет местами).Я использую вариант,
transpose-sexps
который ищет случай, который вы описываете, и переносит вещи через запятую, или просто делает обычныеtranspose-sexps
. Он также оставляет курсор на месте, а не перетаскивает его вперед, что немного отличается, но мне лично нравится.источник
f(a=1, b=2)
(оно переносится вокруг)f(a=1, b=2)
- emacs.stackexchange.com/a/47930/2418В режимах, которые используют SMIE,
transpose-sexp
должен корректно работать для этого случая. Они по-прежнему не будут работать, когда символ инфикса (он же «разделитель») не является,
(или;
), а является словом (напримерand
).Итак, я считаю, что команда для этого есть,
transpose-sexp
и когда она не работает правильно, я рассматриваю это как ошибку (но ошибка, которая может быть сложной и / или требует времени для исправления и имеет низкий приоритет, поэтому не задержи дыхание). Способ исправить это - установитьforward-sexp-function
функцию, которая будет знать, что «после того, как я вижу запятую, я просто перебираю весь аргумент».источник
forward-sexp-function
но вы бы добавить некоторый код, чтобы использовать SMIE толькоforward-sexp-function
в тех случаях, когда он работает достаточно хорошо, поскольку во многих других случаях это может привести к путанице в поведении.