Подтвердить что ты не робот

Vim yanking диапазон линий

Я разработчик С#, который недавно решил расширить свои знания о доступных мне инструментах. Первым инструментом, который я решил изучить, является Vi/Vim. Пока все идет хорошо, но есть несколько вопросов, на которые я, похоже, не могу найти ответ:

  • Допустим, я хотел выдернуть ряд строк. Я знаю, что есть много способов сделать это, но я хотел бы сделать это по номеру строки. Я решил, что это будет похоже на то, как работают команды замены, что-то вроде 81,91y. Есть ли способ сделать это?

  • Я немного запутался в команде g в обычном режиме. Кажется, это делает множество вещей, и я не могу определить, что делает команда g в своей основе. Я запутался в том, работает ли команда движения или какой-то "поймать все" для других команд в обычном режиме. Может кто-нибудь объяснить это или указать мне ссылку, которая дает хорошее объяснение команды g?

4b9b3361

Ответ 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. Нажатие '' возвращает вас к предыдущей позиции (к сожалению, запоминает только предыдущую позицию, а не две назад).

Вы можете переключаться на именованные буферы, копировать, удалять строки, искать и заменять только части кода и т.д. Без необходимости знать номера строк.