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

84

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

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

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

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

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

BentChainRing
источник
0

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

подход 1: 81gg11yy

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

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

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

Фиродж Сиддики
источник