Я разработчик C #, который совсем недавно решил расширить свои знания об имеющихся у меня инструментах. Первый инструмент, который я решил изучить, - это Vi / Vim. Пока все идет хорошо, но есть пара вопросов, на которые я не могу найти ответа:
Допустим, я хотел дёрнуть ряд строк. Я знаю, что есть много способов сделать это, но я бы хотел сделать это по номеру строки. Я подумал, что это будет похоже на то, как работают замещающие команды, что-то вроде
81,91y
. Есть ли способ сделать это?Немного запутался в
g
команде в обычном режиме. Кажется, он делает множество вещей, и я не могу точно определить, что делает команда g по своей сути. Я не понимаю, является ли это командой движения или своего рода «поймать все» для других команд, выполняемых в обычном режиме. Может кто-нибудь объяснить это или указать мне ссылку, которая дает хорошее объяснениеg
команды?
Ответы:
Янки строки 81-91
Если ваши пальцы не как найти
:
и,
ключи, это будет работать , а также (перейти к строке 81, дергать 11 линий)Единственное, что я использую
g
- это5gg
. Перейти на 5-ю строчку.22gg
: 22-я строка. Как сказал джимбо, на самом деле это всего лишь модификатор для некоторых других команд.Для полноты ( http://vim.wikia.com/wiki/Power_of_g ) многое объясняет, как
g
работает в командном режиме.источник
gg
перейдет к первой строке, аG
перейдет к последней. Кроме того,5G
переходит к строке 5. Метки также могут использоваться вместо номеров строк (подходит для макросов), например::'a,52y
81G11Y
даже «короче».mx
до и'x
после, но тогда версия в командном режиме становится намного более лаконичной. Хм ... как только я это написал, я увидел ответ от @Asta.Вы также можете скопировать текущие строки в текущее местоположение курсора с помощью 't'.
Это вставит строки 81-91 под линией, на которой находится курсор.
Я узнал об этом на http://vimcasts.org, который является отличным ресурсом по VIM.
источник
t.
здесь значит?t
это можно рассматривать какt
ill илиt
o и.
является адресом текущей строки.:copy
Мне также нравится использовать параметр относительного номера строки vim, что означает, что я могу просто ввести:
чтобы скопировать текст в именованный буфер a.
NB. Указание A добавит то, что вы дергаете, к текущему содержимому буфера a.
Не забывайте, что вы также можете копировать блоки текста и перемещать блоки текста с помощью аналогичных команд:
означает копирование четырех строк текста на 10 строк выше и ниже текущей строки и
означает перемещение четырех строк текста на 10 строк выше и ниже текущей строки.
источник
Команда
G
переходит к определенному номеру строки, если он сопровождается значением счетчика.81G
поставит вас на строку 81.y
Команда может сочетаться с движением, какG
. Итак, чтобы дергать все до строки 91, вы можете использоватьy91G
.Вместе вы получите:
Перейдите к строке 81, затем дергайте, переходя к строке 91.
источник
81G"+y91G
81,91y
а как-нибудь таргетировать реестр?:81,91y +
:81,91y +
не работает. Он работает для других регистров,:81,91y a
например, но, похоже, не нравится+
регистр. Это определенно работает для других людей?g
сам по себе ничего не делает. Это одна из пары мета-команд, которые содержат кучу не связанных между собой команд.z
это еще одна такая команда.источник
Vim's
:help index
описываетg
как:Прокрутите вниз (или
:help g
) для просмотра списка.источник
Лучшим решением будет войти в «визуальный режим», нажав v. А после выделения строк просто скопируйте их, нажав y. Затем вставьте скопированные строки, нажав p.
источник
В дополнение к тому,
:91,96y a
что yanks (y
) строки с 91 по 96 в регистрa
(вставлены с помощью"ap
), выдернутые строки могут быть добавлены в регистр с помощью:Т.е. использование
A
регистра в регистре вызывает операцию добавления в регистрa
вместо перезаписи. Использование заглавных букв в регистре всегда работает так, например,:let @A=';'
добавляет;
в регистрa
.Использование плюса (+) или минуса (-) указывает строки относительно текущей позиции курсора:
Т.е. он выдернет (
y
) 21 строку вокруг текущей позиции курсора и поместит их в регистрb
.Отсутствие ввода фактически также представляет текущую позицию курсора, что означает, что это:
перетянет текст с 5 строк выше до текущей позиции курсора в именованный буфер
a
и:перетащит 5 строк после текущей позиции курсора в буфер
a
.Примечание: если у вас есть макрос в буфере,
a
он был просто перезаписан предыдущим восстановлением, поскольку регистры восстановления и регистры макроса - это одно и то же. Вот почему по совпадению вы можете вставить макрос, отредактировать его, а затем вернуть обратно в регистр. Я лично использую буквы, до которых доходит моя левая рука, для рывков, а буквы, до которых доходила моя правая рука, для макросов.Перемещение блоков текста выглядит так:
что означает переместить четыре строки, расположенные на 10 строк впереди текущего курсора, ниже текущей строки.
Дополнение
Я ранее спутать
ya
в:91,95ya a
быть как - то синонимом ,ya{motion}
где движение было поставлено91,95
. Это было неверно, и знак "а"ya
совершенно не нужен. В свою защиту яhelp yank
не передаю, чтоya
это возможный псевдонимyank
.источник
:ya
- это сокращение от:yank
, поэтому я не уверен, как я отношусь к срыванию всех строк . Но хорошая работа по сжатию части разрозненной информации:help yank
. Псевдонимаya
дляyank
. Вы правы,a
это не означает «все», технически это означает «а». Я все же предпочитаю говорить «все», так как это имеет для меня больше смысла.:[range]y[ank] [x] Yank [range] lines [into register x]
квадратные скобкиy[ank]
указывают на то, что они не[ank]
являются обязательными.:y
,:ya
и:yan
неявно являются псевдонимами для:yank
:ya
а не обычную командуy
Как давний пользователь Vi / Vim, я предпочитаю использовать «метки» вместо номеров строк (или «маркеров строк»). Это работает так:
m
это символ «метки»; затем используйте любую букву для обозначения / названия знака. Чтобы вернуться к метке, введите именованную метку в одинарную кавычку ('a
). Эти метки можно использовать как диапазон. Примеры:В командном режиме переместите курсор на строку 2, введите
ma
. прокрутите до строки 4, введитеmb
. Чтобы перейти от отметки a к отметке b, введите:Чтобы удалить от отметки a до отметки b, введите:
Чтобы выполнить поиск от метки a до метки b и заменить «ine» на «ink»:
Чтобы скопировать отметку a через отметку b и вставить под текущей позицией («точка» всегда указывает на строку, в которой в данный момент находится курсор):
Сдвиньте строки кода между отметкой a и отметкой b на одну табуляцию вправо (используйте противоположный шеврон,,
<
для перемещения влево):В командном режиме вы можете вернуться к отметкам, просто набрав,
'a
чтобы вернуться к отмеченной строкеa
. Печатать''
возвращает вас к предыдущей позиции (к сожалению, запоминается только предыдущая позиция, а не две назад).Вы можете переходить к именованным буферам, копировать, удалять строки, искать и заменять только части вашего кода и т. Д. Без необходимости знать номера строк.
источник
Чтобы перенести строки с 81 на 91:
подход 1:
81gg11yy
подход 2:
81gg
тогдаshift+v
тогда91gg
тогдаy
источник