Vim yanking диапазон линий
Я разработчик С#, который недавно решил расширить свои знания о доступных мне инструментах. Первым инструментом, который я решил изучить, является Vi/Vim. Пока все идет хорошо, но есть несколько вопросов, на которые я, похоже, не могу найти ответ:
-
Допустим, я хотел выдернуть ряд строк. Я знаю, что есть много способов сделать это, но я хотел бы сделать это по номеру строки. Я решил, что это будет похоже на то, как работают команды замены, что-то вроде 81,91y
. Есть ли способ сделать это?
-
Я немного запутался в команде g
в обычном режиме. Кажется, это делает множество вещей, и я не могу определить, что делает команда g в своей основе. Я запутался в том, работает ли команда движения или какой-то "поймать все" для других команд в обычном режиме. Может кто-нибудь объяснить это или указать мне ссылку, которая дает хорошее объяснение команды g
?
Ответы
Ответ 1
Янки 81-91
:81,91y<enter>
Если ваши пальцы не любят находить клавиши :
и ,
, это также сработает (перейдите к строке 81, задержите 11 строк)
81gg11yy
Мое единственное использование g
- 5gg
. Пойти на 5-ю строчку. 22gg
: 22-я строка. Как сказал jimbo, это действительно только модификатор для некоторых других команд.
Для полноты (http://vim.wikia.com/wiki/Power_of_g) объясняется, как работает g
в командном режиме.
Ответ 2
Вы также можете скопировать текущие строки в текущее местоположение курсора с помощью 't'.
:81,91t.<enter>
Это приведет к вставке строк 81-91 под строкой, в которой находится курсор.
Я узнал об этом из http://vimcasts.org, который является отличным ресурсом на VIM.
Ответ 3
Я также хотел бы использовать параметр vim relative line number, который означает, что я могу просто ввести:
:-10,-7ya a
чтобы выгрузить текст в именованный буфер a.
N.B. Задание A добавит то, что вы держите в текущем содержимом буфера a.
Не забывайте, что вы также можете копировать блоки текста и перемещать блоки текста вместе с аналогичными командами:
:-10,-7co .
означает копирование четырех строк текста 10 строк выше текущей строки и
:-10,-7mo .
означает перемещение четырех строк текста на 10 строк выше текущей строки.
Ответ 4
Команда G
переходит к определенному номеру строки, если она сопровождается значением счета. 81G
помещает вас в строку 81.
Команда y
может быть объединена с движением, например G
. Поэтому, чтобы вытащить все до линии 91, вы можете использовать y91G
.
Вместе вы получаете:
81Gy91G
Перейдите к строке 81, затем держитесь, переходя к строке 91.
Ответ 5
g
ничего не делает сам по себе. Это одна из нескольких мета-команд, которая содержит кучу сортированных не связанных команд.
z
- это еще одна команда.
Ответ 6
Vim :help index
описывает g
как:
|g| g{char} extended commands, see |g| below
Прокрутите вниз (или :help g
) для списка.
Ответ 7
Лучшим решением было бы войти в "визуальный режим", нажав v. А после выбора строк просто скопируйте их, нажав y. Затем вставьте скопированные строки, нажав p.
Ответ 8
В дополнение к :91,96y a
, который объединяет (y
) строки с 91 по 96 в регистр a
(вставленный с помощью "ap
), эти строки могут быть добавлены в регистр с помощью:
:91,96y A
Т.е. заглавная буква регистра A
вызывает операцию добавления в регистр a
вместо перезаписи. Капитализация регистра всегда работает так, например: :let @A=';'
добавляет ;
для регистрации a
.
Использование линий ссылки плюс (+) или минус (-) относительно текущей позиции курсора:
:-10,+10y b
Т.е. он вытянет (y
) 21 строку вокруг текущей позиции курсора и поместит их в регистр b
.
Отсутствие ввода фактически представляет текущую позицию курсора, а это означает, что это:
:-5,y a
вытянет текст из 5 строк выше текущей позиции курсора в именованный буфер a
и:
:,+5y a
вытянет 5 строк после текущей позиции курсора в буфер a
.
Примечание: если у вас есть макрос в буфере a
, он был просто перезаписан предыдущим янки, так как регистры янки и регистры макросов действительно одно и то же. Вот почему, по совпадению, вы можете вставить макрос, отредактировать его и затем вернуть обратно в регистр. Я лично использую буквы, полученные моей левой рукой, для янки, а буквы, полученные моей правой рукой, для макросов.
Перемещение блоков текста вокруг выглядит следующим образом:
:+10,+13m.
что означает перемещение четырех строк на 10 строк впереди текущего курсора ниже текущей строки.
Добавление
Ранее я путал ya
в :91,95ya a
с каким-то синонимом ya{motion}
, где движение было предоставлено 91,95
. Это было неправильно, и "a" в ya
совершенно не нужно. В мою защиту мой help yank
не сообщает, что ya
является возможным псевдонимом yank
.
Ответ 9
Как давний пользователь Vi/Vim, я склонен использовать "отметки" вместо номеров строк (или "отметки строк"). Это работает так: m
- это символ "отметка"; затем используйте любую букву для идентификации/названия знака. Для возврата к предисловию к метке именная метка с одинарной кавычкой ('a
) Эти метки могут использоваться в качестве диапазона. Примеры:
File:
<line 1>
<line 2>
<line 3>
<line 4>
<line 5>
В командном режиме переместите курсор на строку 2, введите ma
. выделите строку 4, введите mb
.
Чтобы вырвать из отметки a, чтобы пометить b тип:
:'a,'byank
Чтобы удалить из метки a, чтобы пометить b, введите:
:'a,'bdel
Для поиска от метки a до метки b и замены 'ine' на 'ink':
:'a,'bs/ine/ink/g
Чтобы скопировать метку a через метку b и вставить ее под текущую позицию (точка всегда указывает на строку, в которой находится курсор в данный момент):
:'a,'bco .
Сдвиньте строки кода между меткой a и меткой b, одной вкладкой вправо (используйте противоположный шеврон, <
, чтобы переместиться влево):
:'a,'b>
В командном режиме вы можете вернуться к отметкам, просто набрав 'a
, чтобы вернуться к строке с пометкой a
. Нажатие ''
возвращает вас к предыдущей позиции (к сожалению, запоминает только предыдущую позицию, а не две назад).
Вы можете переключаться на именованные буферы, копировать, удалять строки, искать и заменять только части кода и т.д. Без необходимости знать номера строк.