Лучший способ выполнить небольшой рефактор в VIM - PullRequest
3 голосов
/ 15 сентября 2011

У меня есть следующий код:

if some_cond && another
  foo_bar
end

, и я хочу изменить его на:

foo_bar if some_cond && another

каков vim способ сделать это правильно?

Ответы [ 4 ]

5 голосов
/ 15 сентября 2011

Я бы использовал следующую последовательность команд обычного режима

ddjVpkJ<<

или эту цепочку команд Ex 1 :

:m+|-j|<|+d

Здесь я предполагаю, что передрефакторинг курсора находится на линии if (необязательно в начале этой строки).


1 Сначала строка if перемещается внизодна строка по команде :move +.Команда :move обрезает заданный диапазон строк (который является текущей строкой, если не указан) и вставляет ее ниже строки, адресуемой единственным аргументом этой команды.Адрес + является сокращением для обозначения .+1, относящегося к следующей строке (см. :help {address}).Во-вторых, строка, являющаяся телом условного оператора, соединяется с только что перемещенной if -линейой.Команда :join объединяет данный диапазон строк в одну строку.Диапазон - - это сокращенная форма адреса -1, относящаяся к строке над курсором (см. :help :range).В-третьих, вновь соединенная строка сдвигается на одну shiftwidth влево с помощью команды :<.Наконец, оставшаяся строка end, адрес которой называется диапазоном +, удаляется командой :delete.

2 голосов
/ 15 сентября 2011

Еще один способ:

ddpkJjdd
  • ddp поменять две строки
  • кДж двигаться вверх и присоединиться к линии
  • == переопределить строку
  • jdd перейти вниз и удалить последнюю строку
2 голосов
/ 15 сентября 2011

Я вижу несколько (возможно, неоптимальных) решений:

  1. курсор в первом символе в первой строке:

    • D - удалить условие if, но оставить курсор в той же позиции (не удалять строку)
    • J - присоединить следующую строку к текущей
    • A - добавить пробел и выйти в обычный режим
    • p - паста if условие
    • , а затем удалите оставшийся конец с помощью jdd
  2. курсор в первом символе в первой строке, как и ранее:

    • j - перейти к следующей строке
    • dd - удалить эту строку
    • k - вернуться в if состояние
    • P - вставить удаленную строку перед реальной строкой, курсор должен быть помещен на вставленную строку
    • J - присоединить следующую строку к текущей
    • == или << </kbd> - текущая строка без отступа
    • , а затем удалите оставшийся конец с помощью jdd
  3. другое решение:

    • j - перейти ко второй строке
    • J D - соединить строку со следующей, удалить то, что было присоединено
    • dd - удалить текущую строку
    • k - перейти к предыдущей строке
    • P J << </kbd> - вставлять, объединять и отменять смещение

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

Если в конфигурации включено virtualedit вместо A , вы можете $ , но я нахожу $ труднее в использовании, чем A , за которым следует Ctrl - [ (аналогично ESC).

В качестве совета: если вы используете некоторые заглавные буквы, попробуйте объединить их, если это возможно, поэтому вам нужно только удерживать нажатой клавишу Shift, а затем выполнять некоторые команды, вместо того, чтобы смешивать верхнюю и нижнюю буквы и нажимать две клавиши в время (верхняя буква - 2 нажатия клавиши, одна - Shift). Однажды я нашел комбо полезным для перезапуска сервера в консоли Ctrl + cpj, который отправляет Ctrl + c, Ctrl + p (предыдущая команда) и Ctrl + j (клавиша Enter) одним нажатием Ctrl. С тех пор я пытаюсь найти похожую на Vim комбинацию, экономящую время, в основном с помощью Shift, так как Ctrl редко используется в Vim.

1 голос
/ 15 сентября 2011

Вероятно, есть 30 способов сделать это.

Вот один из них, если вы начинаете с конца слова end в обычном режиме:

d d (удалить последнюю строку)
" a D (удалить и скопировать foo_bar в буфер a)
d d (удалить пустую строку 2)
" a P (вставить из буфера a перед кареткой)
a Пробел Esc (вставить пробел и вернуться в нормальный режим)

Снова«правильно» редко применяется в Vim, потому что есть так много способов сделать что-то.Это настолько маленькое изменение, что даже повторный набор foo_bar может быть оправдан.

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