Программирование в Vim: Какой конкретный механизм вы * используете * для копирования-вставки переменных? - PullRequest
4 голосов
/ 09 ноября 2011

Примечание

Это было помечено как потенциально субъективный вопрос, но это не субъективно. Рекомендуется изучить различные конкретные способы использования Vim людьми, чтобы человек, работающий с текстовым редактором, ориентированным на мышь и клавиатуру, мог больше узнать о способах редактирования Vim.

Это , а не , субъективный вопрос о личных предпочтениях или о том, какой редактор или стиль редактирования лучше.

Это конкретный вопрос о механических шагах , которые необходимо предпринять для получения результата в редакторе Vim, используя альтернативные редакторы в качестве основы для перекрестных ссылок.

ПРОБЛЕМА

Предположим, у вас есть следующий код в Vim, и вы хотите получить от до до после , где раньше выглядит так:

// Before //

$mynames    = Array();
$mynames['alice'] = 'alpha';

... и после выглядит так ...

// After //

$mynames    = Array();
$mynames['alice'] = 'alpha';
$mynames['betty'] = 'bravo';
$mynames['cindy'] = 'charlie';
$mynames['deana'] = 'delta';

КАК ЭТО СДЕЛАТЬ НЕВИМ РЕДАКТОРЫ

Используя редактор без vim, программист A просто скопировал бы первую строку для alice, вставил ее несколько раз в редактор и затем заново отредактировал значения так, чтобы alice и alpha заменяются соответствующими значениями, редактируя по одной строке за раз.

Используя редактор без vim, программист B создает прямоугольную выделенную область, которая занимает четыре строки, и просто начинает набирать общий текст $ mynames [''] = ''; , а затем возвращается назад и заполните соответствующие значения, редактируя по одной строке за раз.

КАК О VIM?

Учитывая, что Vim существенно отличается от современных редакторов в стиле «мышь и клавиатура», это запрос на понимание конкретных шагов, которые нужно предпринять при редактировании с Vim. Очевидно, что можно просто печатать каждую строку по отдельности, но предполагается, что в Vim есть способ сэкономить время, что можно сравнить с тем, что делали программист A и B выше.

1) Как программист vim может выполнить эту операцию редактирования, используя метод экономии времени, подобный описанному выше?

2) Если бы кто-то искал в Интернете больше примеров конкретных «пошаговых» сравнений сеансов редактирования Vim с редактированием в стиле «мышь и клавиатура», что бы искать?

Ответы [ 3 ]

6 голосов
/ 09 ноября 2011

Я использую то же самое, сначала я копирую строку. затем вставляю все, что мне нужно.

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

    qq f[ci'<C>-<o>q  "recordes a macro to find a [block] and 
change inner quotes ' and stays in insert mode

Тогда вы можете играть в свой макрос в любое время с помощью @q. (У меня есть карта Q = @q для быстрого запуска макроса Shift + q) Так же, как вы можете использовать для значений:

 qq f=f'ci'<C>-<o>q

Макрос для поиска блока значений и перехода в режим вставки.

И ответом на сравнение я сэкономлю время, чтобы переместить мою руку с клавиатуры на время мыши = количество строк редактирования. Выбор блока для изменения. Vim, несомненно, более продуктивен.

3 голосов
/ 10 ноября 2011

Если я заранее знаю, какими будут различные значения, я перейду к окольному подходу.Я начну с этого:

$mynames    = Array();
alice alpha
betty bravo 
cindy charlie
deana delta

Затем я наведу курсор на Алису, нажму Ctrl + V , переместимся вниз на deana, затем нажмите Shift + I , чтобы перейти в режим вставки, и введите $mynames[', а затем Esc .Это вставит текст во все выделенные строки.Затем я повторяю это для '] = ', а затем, наконец, ';'

Не самый эффективный способ, но обычно первый, который приходит на ум.

1 голос
/ 10 ноября 2011

Мне нравится решение AlexRus (мне нравятся макросы Vim).

Но я думаю, что более реалистичной была бы вставка пар ключ / значение из некоторого другого приложения / документа:

betty bravo
cindy charlie
deana delta

и выполнить несколько преобразований в каждой строке.

РЕШЕНИЕ 1

Мы могли бы выбрать все три строки с помощью <S-v>jj или другим способом и применитьсерия поиска / замены по выделению:

:'<,'>s/^/$mynames['
gv to reselect
:'<,'>s/ /'] = '
gv to reselect
:'<,'>s/$/';

Вся последовательность редактирования выглядит так:

<S-v>jj:s/^/$mynames['<CR>gv:s/ /'] = '<CR>gv:s/$/';<CR>

РЕШЕНИЕ 2

Мыможно применить один поиск / замену

:'<,'>s/^\(.*\) \(.*\)$/$myname['\1'] = '\2';

, где часть поиска изолирует начало строки (^), пробел между словами () и конец строки (* 1028)*) фактически сопоставляя текст между ними и заменяемой частью, заменяет всю строку на $myname[' + первое совпадение (\1) + '] = ' + второе совпадение (\2) + ';.

Я плохо разбираюсь в регулярных выражениях, поэтому мне пришлось проверять свои записи, чтобы собрать их вместе, но я не сомневаюсь, маПользователи Vim могут набирать такие команды за один раз.Я когда-нибудь это сделаю.

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

<S-v>jj:s/^\(.*\) \(.*\)$/$myname['\1'] = '\2';<CR>

РЕШЕНИЕ 3

При той же настройке мы можем ввестиВ режиме VISUAL-BLOCK в начале первой строки с помощью <C-v>, пройдите как можно ниже вниз и введите I$myaccess['<Esc>, чтобы получить:

$mynames['betty bravo
$mynames['cindy charlie
$mynames['deana delta

переместите курсор напробел между словами с помощью f<Space>, снова нажмите <C-v>, разверните выделение до конца и введите c'] = '<Esc>, чтобы получить:

$mynames['betty'] = 'bravo
$mynames['cindy'] = 'charlie
$mynames['deana'] = 'delta

, затем перейдите в конец строки с помощью $,нажмите <C-v> еще раз, выберите то, что вы хотите снова и введите A';<Esc> для последнего касания.

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

<C-v>jjI$myaccess['<Esc>f <C-v>jjc'] = '<Esc>$<C-v>jjA';<Esc>
...