Может ли vim автоматизировать рефакторинг этого фрагмента? это то, что макросы для? - PullRequest
1 голос
/ 27 октября 2011

У меня есть блоки кода, которые выглядят следующим образом:

ICar car = new Car<int>(10);
var result = car.Start(100);

Assert.IsTrue(result.IsValid);

Что я хочу преобразовать в это:

Assert.IsTrue((new Car<int>(10).Start(100)).IsValid);

У меня есть около 20 таких типов фрагментов с точнымтот же формат, это может быть автоматизировано в VIM?

Ответы [ 3 ]

4 голосов
/ 27 октября 2011

Сбой курса в макросах:

  • Перейти к ICar в обычном режиме.
  • Нажмите qq для запуска макроса.
  • Измените код.Попробуйте использовать движения на основе слов вместо стрелок влево / вправо.
  • Перейти к следующему фрагменту, как с /ICar.
  • Нажмите кнопку q в обычном режиме, чтобы остановить запись.

Затем вы можете набрать @q для выполнения макроса q и переформатировать один фрагмент.Если все работает как положено, введите 20 @ q для выполнения 20 раз.

3 голосов
/ 27 октября 2011

Макросы являются самыми простыми, но еще один способ сделать это с глобальными командами - :g/ регулярное выражение / Ex команда . Например (не ваш пример - мы вернемся к нему позже), вы можете использовать :g/^\s*ICar/delete удалит все строки, начинающиеся с ICar (^ для начала строки, \s* это для пропуска вкладок и пробелов, используемых для отступа).

Преимущество этого метода перед макросами состоит в том, что вы можете использовать его в диапазоне: перейдите в визуальный режим, отметьте часть, которую вы хотите реорганизовать, и используйте глобальную команду. Будут затронуты только матчи в отмеченном блоке. Если вы используете макросы, вам нужно либо нажимать @@ снова и снова до тех пор, пока вы не очистите блок, не подсчитаете точное количество раз, которое вы хотите запустить макрос, или установите большое число и заставите ошибку «без совпадения» остановить остановку. макро. Хотя третий вариант довольно прост в исполнении, он также довольно опасен - вам нужно убедиться, что шаблон отображается только в частях, которые вы хотите реорганизовать, - чтобы он не влиял на несвязанные части кода - и что рефакторинг удаляет его - в противном случае макрос будет снова и снова запускаться на одних и тех же строках.

Преимущество макросов в том, что их легче записывать. В сложном рефакторинге, подобном вашему, глобальная команда, которую вам нужно выполнить, может быть очень длинной и сложной. Макрос для выполнения того же действия такой же длинный и сложный, как и глобальная команда - но вы можете увидеть, как он работает, пока записываете его - гораздо проще, чем вычислять результат в своей голове при разработке глобальной команды.

К счастью, вы можете наслаждаться обоим миром!
Сначала вы записываете свой макрос, как объяснил в ответе cdleonard, с двумя основными отличиями.
Во-первых, первое нажатие клавиши в макросе должно быть ^ или _ - чтобы перейти к первому непробельному символу в строке (это означает, что вы начинаете с qq_, а затем записываете как обычно) , Это гарантирует, что макрос запускается из правильного места в строке каждый раз.
Второе отличие состоит в том, что вам не нужно переходить к следующему фрагменту в конце макроса. Глобальная команда позаботится об этом за вас.

После того, как вы записали макрос (я предполагаю, что вы записали его в q), отметьте все фрагменты, используя визуальный режим, и введите :g/^\s*ICar/norm @q - это будет искать в отмеченном диапазоне все строки, начинающиеся с ICar (возможно, с отступом перед ними) и выполняет макрос для них. Это предполагает, что все в диапазоне, который начинается с ICar - и только в тех местах - это фрагменты, которые вы хотите реорганизовать. Если у вас есть строки, начинающиеся с ICar, и вы не хотите выполнять рефакторинг, или если у вас есть строки, к которым вы хотите применить макрос, но они не начинаются с ICar - вам придется изменить регулярное выражение.

3 голосов
/ 27 октября 2011
:%s:^.* = \([^;]\+\);\_.[^.]\+\([^;]\+\);\n\n\+\([^(]\+\)(.*\.\(.*$\):\3((\1\2).\4

Будет делать это с точно таким же форматом (размещение . s и = и т. Д. Важно в исходном шаблоне.

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...