Рефакторинг Javascript в Vim - PullRequest
6 голосов
/ 30 августа 2011

Мне не нужно ничего сверхъестественного, но было бы неплохо провести рефакторинг с учетом объема.

Рефакторинг чего-либо в области действия функции - один из наиболее распространенных сценариев для меня:

var funyfun = function(arg1, arg2) {

    arg1 = ...arg2;
    arg2....();
}

Есть ли плагин vim, который позволил бы мне реорганизовать arg1, например, в область действия этой функции, или мне нужно изобрести собственный ярлык "выбрать блок, найти, заменить".

Для дополнительных похвал, что-то, что "рефакторинг на лету", когда я печатаю, чтобы я мог видеть, где вносятся изменения. Netbeans отлично справляется с этой задачей.

Ответы [ 7 ]

5 голосов
/ 06 ноября 2011

Это не ограничивается определенным блоком, но так я бы сделал это с простым Vim:

  1. Наведите курсор на arg1 и введите *N
  2. Введите ciw и вставьте замену.
  3. Теперь вы можете использовать n и N для навигации по вхождениям и нажатием . Vim вернет замену в текущем совпадении

Вот ярлык для него:

" Simple word refactoring shortcut. Hit <Leader>r<new word> on a word to
" refactor it. Navigate to more matches with `n` and `N` and redo refactoring
" by hitting the dot key.
map <Leader>r *Nciw
4 голосов
/ 01 июня 2014

Несколько JavaScript-команд для Vim предоставляются tern_for_vim , например :TernRename для переименования переменных с учетом области видимости, :TernDef для перехода к определению объекта под курсороми так далее.Вам нужно будет установить nodejs и npm, обязательно прочитайте инструкции по установке в репозитории.

4 голосов
/ 06 ноября 2011

Звучит так, будто вы хотите переименовать, а не рефакторинг. Полный рефакторинг сложен для Javascript, хотя некоторые IDE предоставляют приблизительные значения. Поскольку вопрос касается именно Vim, а хаки не исключаются, я просто перейду к аспекту, учитывающему область действия:

У меня есть модифицированный DoctorJS для создания тегов с поддержкой области, с плагином Vim для навигации с учетом области действия на основе этих тегов (см. сообщение в блоге / скринкаст ).

Хакерская часть заключается в том, как реализована навигация для Vim: я создаю шаблон поиска, который включает область действия переменной и исключает все вложенные области действия для одного и того же имени. Таким образом, вы можете использовать этот шаблон поиска (функция scoped_tags#FindTagInScope) для реализации переименования (только если все использования находятся в одном и том же файле и не исключают комментарии и т.п.). Или вы можете использовать навигацию по области действия, чтобы вручную перемещаться по переменным и использовать '.' переименовать их ..

3 голосов
/ 30 августа 2011

В качестве частичного решения вы можете использовать Eclim с JSDT , что позволяет вам использовать возможности рефакторинга / отладки / автоматического завершения / плагинов Eclipse с Vim.

По моему опыту, на старых машинах он может быть немного медленным, но стоит попробовать.

1 голос
/ 01 июня 2014

В дополнение к фактическому рефакторингу с учетом области видимости и т. П. Рассмотрим :%s/varName/newNav/gc.В соответствии с :help :s_c флаг c, передаваемый :s, входит в режим быстрого подтверждения операций поиска / замены, который подсказывает вам (да / нет), следует ли заменять каждое совпадение или нет.

0 голосов
/ 01 ноября 2013

У Бенуа и Эпели есть несколько хороших моментов, однако я нахожу несколько утомительным писать .,/^}/ перед моим оператором замены, и так как он только изменяет код с позиции курсора на следующую строку, начинающуюся с }, это зависит от положения курсора в начале функции или блока (и он не будет работать для всей функции с оператором if).

Так что вместо этого я использую визуальный режим в сочетании с текстовыми объектами. Например, при наборе vi{ будет выделен весь код в ближайшей соответствующей паре {}, va{ будет включать {} символов, и если вы сделаете это с визуальной линией (vi{V), вы будете получить полное объявление функции. Тогда вы можете просто сделать :s/\<arg1\>/new_name/g, чтобы переименовать arg1 в new_name, включая параметры функции.

0 голосов
/ 30 августа 2011

вы можете сделать:

:.,/^}/ s/\<arg1\>/new_name/g

.,/^}/ - это диапазон, который принимают многие команды Ex: от строки курсора до следующей строки, начинающейся с закрывающей скобки.

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