Vim дергает диапазон строк


84

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

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

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


1
Вы знаете о команде ": help" в vim (1)?
Стив Эммерсон,

Да, но мне не удалось найти его во всех справочниках. Оказывается, я думал, что сделаю это из обычного режима, но hometoast показал, как это нужно делать из командного режима. Что касается команды g, я просто обнаружил, что справка не связывает все вместе, как я ожидал бы от других команд.
jnadro52

3
Кстати, я бы хотел, чтобы вы делали по одному посту на каждый вопрос.
Дана

1
Я сделаю это в будущем. Меня больше волновал первый вопрос, я просто думал о другом, когда печатал первый.
jnadro52 07

Ответы:


141

Янки строки 81-91

:81,91y<enter>

Если ваши пальцы не как найти :и ,ключи, это будет работать , а также (перейти к строке 81, дергать 11 линий)

81gg11yy 

Единственное, что я использую g- это 5gg. Перейти на 5-ю строчку. 22gg: 22-я строка. Как сказал джимбо, на самом деле это всего лишь модификатор для некоторых других команд.

Для полноты ( http://vim.wikia.com/wiki/Power_of_g ) многое объясняет, как gработает в командном режиме.


2
Использование заглавных букв также дает варианты: ggперейдет к первой строке, а Gперейдет к последней. Кроме того, 5Gпереходит к строке 5. Метки также могут использоваться вместо номеров строк (подходит для макросов), например: :'a,52y
NVRAM

1
Если не боитесь клавиши Shift, то 81G11Yдаже «короче».
Jens

1
Обратной стороной метода обычного режима является потеря «места»; вы могли бы, возможно, mxдо и 'xпосле, но тогда версия в командном режиме становится намного более лаконичной. Хм ... как только я это написал, я увидел ответ от @Asta.
Эрик Смит

1
@WilliamRoss на самом деле помещает строки в буфер для использования в vim, не обязательно в буфере обмена вашей системы, где вы могли бы вставить их, скажем, в Блокнот с помощью CTRL + V. См. Соответствующий вопрос: Как скопировать / вставить текст из vi в разные приложения
hometoast

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

23

Вы также можете скопировать текущие строки в текущее местоположение курсора с помощью 't'.

:81,91t.<enter>

Это вставит строки 81-91 под линией, на которой находится курсор.

Я узнал об этом на http://vimcasts.org, который является отличным ресурсом по VIM.


Что t.здесь значит?
CivFan

2
Насколько я понимаю, tэто можно рассматривать как till или to и .является адресом текущей строки.
Asta

1
@CivFan это синоним:copy
Д. Бен Нобл

11

Мне также нравится использовать параметр относительного номера строки vim, что означает, что я могу просто ввести:

:-10,-7ya a

чтобы скопировать текст в именованный буфер a.

NB. Указание A добавит то, что вы дергаете, к текущему содержимому буфера a.

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

:-10,-7co .

означает копирование четырех строк текста на 10 строк выше и ниже текущей строки и

:-10,-7mo .

означает перемещение четырех строк текста на 10 строк выше и ниже текущей строки.


8

Команда Gпереходит к определенному номеру строки, если он сопровождается значением счетчика. 81Gпоставит вас на строку 81.

yКоманда может сочетаться с движением, как G. Итак, чтобы дергать все до строки 91, вы можете использовать y91G.

Вместе вы получите:

81Gy91G

Перейдите к строке 81, затем дергайте, переходя к строке 91.


1
Хотел бы я проголосовать за это больше одного раза. Что-то, что мне помогло, - это использовать это для восстановления реестра (в моем случае регистр + то есть, буфер обмена):81G"+y91G
mgarey

1
@mgarey нет возможности напрямую скопировать в регистр, используя синтаксис диапазона строк? 81,91yа как-нибудь таргетировать реестр?
diplosaurus

1
@diplosaurus Возможно, но я не знаю. Это похоже на вопрос, который вы могли бы задать на vi.stackexchange.com, если он еще не там или здесь, на SO. Мне было бы интересно. Я не эксперт по Vim.
mgarey

2
@mgarey Пришлось проявить творческий подход к поиску в Google, но я нашел его здесь: stackoverflow.com/questions/16225366/… . :81,91y +
diplosaurus

@diplosaurus :81,91y +не работает. Он работает для других регистров, :81,91y aнапример, но, похоже, не нравится +регистр. Это определенно работает для других людей?
ojunk 03

4

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

z это еще одна такая команда.


Спасибо. Теперь я понимаю, что он просто используется для разных целей. Когда я пытаюсь изучить эти инструменты, я пытаюсь связать команды с чем-то, что я могу абстрагироваться, чтобы помнить, как правильно их использовать. Похоже, что команда g - лишь одна из тех вещей, которые вам нужно запомнить, чтобы правильно использовать.
jnadro52 07

2

Vim's :help indexописывает gкак:

|g|             g{char}            extended commands, see |g| below

Прокрутите вниз (или :help g) для просмотра списка.


1
Я был знаком с: help, но НЕ был знаком с: help (команда). Это будет очень полезно в будущем. Большое спасибо, сэр.
jnadro52

2

Лучшим решением будет войти в «визуальный режим», нажав v. А после выделения строк просто скопируйте их, нажав y. Затем вставьте скопированные строки, нажав p.


Не согласен, но только визуальный режим bc иногда бывает таким медленным.
Д. Бен Нобл,

1

В дополнение к тому, :91,96y aчто yanks ( 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. Это было неверно, и знак "а" yaсовершенно не нужен. В свою защиту я help yankне передаю, что yaэто возможный псевдоним yank.


1
:ya- это сокращение от :yank, поэтому я не уверен, как я отношусь к срыванию всех строк . Но хорошая работа по сжатию части разрозненной информации
Д. Бен Нобл

Я тоже так думал, пока не посмотрел :help yank. Псевдонима yaдля yank. Вы правы, aэто не означает «все», технически это означает «а». Я все же предпочитаю говорить «все», так как это имеет для меня больше смысла.
Пол Паркер

2
:[range]y[ank] [x] Yank [range] lines [into register x]квадратные скобки y[ank]указывают на то, что они не [ank]являются обязательными. :y, :yaи :yanнеявно являются псевдонимами для:yank
D. Ben Knoble

Стою исправлюсь :) А не нужно. Отредактирую ответ, чтобы отразить.
Пол Паркер

1
Ваше добавление хорошее, но я имел в виду вашу самую первую строку, где вы используете команду ex, :yaа не обычную командуy
Д. Бен Нобл

0

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

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


0

Чтобы перенести строки с 81 на 91:

подход 1: 81gg11yy

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

подход 2: 81ggтогда shift+vтогда 91ggтогдаy

ЛУЧШЕЕ, НА МОЕ МНЕНИЕ, потому что это прямолинейно, вам нужно только знать очевидную вещь, то есть с какого номера строки на какой номер строки вы хотите дёрнуть

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.