Как вставить выдернутый текст в командную строку Vim?

Я хотел бы вставить выдернутый текст в командную строку Vim. Возможно ли это?

Ответ 1

Да. Нажмите Ctrl - R, затем ". Если у вас есть буквальные управляющие символы в том, что вы дернули, используйте Ctrl - R, Ctrl - O, ".

Вот объяснение того, что вы можете делать с регистрами. То, что вы можете делать с регистрами, необычно, и как только вы знаете, как их использовать, вы не можете жить без них.

Регистры - это в основном места хранения строк. У Vim есть много регистров, которые работают по-разному:

  • 0 (регистр yank: когда вы используете y в нормальном режиме, без указания регистра, туда держится трясущийся текст, а также регистр по умолчанию),
  • 1 to 9 (сдвигая регистры удаления, когда вы используете команды, такие как c или d, то, что было удалено, переходит в регистр 1, то, что было в регистре 1, переходит в регистр 2 и т.д.),
  • " (регистр по умолчанию, также известный как ненаписанный регистр. Здесь " входит Ctrl - R, "),
  • a до z для вашего собственного использования (с заглавной буквы a до z для добавления в соответствующие регистры).
  • _ (действует как /dev/null (Unix) или NUL (Windows), вы можете писать ему, но он отбрасывается, а когда вы читаете его, он всегда пуст),
  • - (небольшой регистр удаления),
  • / (регистр шаблона поиска, обновляется, если вы ищете текст с /, ?, * или # например, вы также можете записать для него динамическое изменение шаблона поиска)
  • : (сохраняет последнюю введенную команду VimL через Q или :, только для чтения),
  • + и * (регистры системного буфера обмена, вы можете написать им, чтобы установить буфер обмена и прочитать содержимое буфера обмена из них)

См. :help registers для полной справки.

В любой момент вы можете использовать :registers для отображения содержимого всех регистров. Синонимы и сокращения для этой команды: :display, :reg и :di.

В режиме "Вставка" или "Командная строка" Ctrl - R плюс имя регистра вставляет содержимое этого регистра. Если вы хотите вставить их буквально (без автоматического отступа, без преобразования управляющих символов, таких как 0x08 в backspace и т.д.), Вы можете использовать Ctrl - R, Ctrl - O, имя регистра. См. :help i_CTRL-R и последующие параграфы для дополнительной справки.

Но вы также можете сделать следующее (и я, вероятно, забыл много применений для регистров).

  • В нормальном режиме нажмите " : p. Последняя команда, которую вы использовали в vim, вставлена ​​в ваш буфер.
    Пусть разлагается: " - это команда Normal mode, которая позволяет вам выбрать, какой регистр будет использоваться во время следующего yank, удалить или вставить операцию. Поэтому " : выбирает регистр двоеточия (сохраняя последнюю команду). Тогда p - это команда, которую вы уже знаете, она вставляет содержимое регистра.

    ср. :help ", :help quote_:

  • Вы редактируете файл VimL (например, ваш .vimrc) и хотели бы выполнить пару последовательных строк прямо сейчас: y j : @ " Enter.
    Здесь y j yanks current и next line (это потому, что j является движением линии, но это выходит за рамки этого ответа) в регистр по умолчанию (также известный как неназванный регистр). Затем команда :@ Ex воспроизводит команды Ex, хранящиеся в регистре, заданном как аргумент, а " - это то, как вы ссылаетесь на неназванный регистр. Также см. Верхнюю часть этого ответа, которая связана.

    Не путайте " здесь (это имя регистра) с " из предыдущего примера, который был командой Нормального режима.

    ср. :help :@ и :help quote_quote

  • Вставьте последний шаблон поиска в свой файл в режиме Вставки или в командной строке с помощью Ctrl - R, /.

    ср. :help quote_/, help i_CTRL-R

    Следствие. Сохраните шаблон поиска, но добавьте альтернативу: / Ctrl - R, / \|alternative.

  • Вы выбрали два слова в середине строки в визуальном режиме, дернули их с помощью y, они находятся в неназванном регистре. Теперь вы хотите открыть новую строку чуть ниже, где находитесь, с этими двумя словами: :pu. Это сокращение для :put ". Команда :put, как и многие команды Ex, работает только linewise.

    ср. :help :put

    Вы также могли бы сделать: :call setreg('"', @", 'V'), затем p. Функция setreg задает регистр, имя которого задано как первый аргумент (как строка), инициализирует его содержимым второго аргумента (и вы можете использовать регистры в качестве переменных с именем @x, где x это имя регистра в VimL) и превращает его в режим, указанный в третьем аргументе, V для linewise, ничего для символьного и литерального ^V для blockwise.

    ср. :help setreg(). Обратные функции: getreg() и getregtype().

  • Если вы записали макрос с qa... Q, тогда :echo @a сообщит вам, что вы набрали, а @a воспроизведет макрос (возможно, вы знали, что он, очень полезно во избежание повторяющихся задач)

    ср. :help q, help @

    Следствие из предыдущего примера: если в буфере обмена есть 8go, то @+ будет воспроизводить содержимое буфера обмена в виде макроса и, следовательно, перейти к восьмому байту вашего файла. На самом деле это будет работать почти с каждым регистром. Если ваша последняя вставленная строка была dd в режиме Вставки, тогда @. будет (потому что в регистре . содержится последняя вставленная строка) удалите строку. (Документация Vim ошибочна в этом отношении, поскольку она заявляет, что регистры #, %, : и . будут работать только с p, p, :put и Ctrl - R).

    ср. :help @

    Не путайте :@ (команда, которая воспроизводит команды Vim из регистра) и @ (команда нормального режима, которая воспроизводит команды нормального режима из регистра).

    Известное исключение - @:. Регистр команд не содержит начальную двоеточие и не содержит окончательный возврат каретки. Однако в нормальном режиме @: будет делать то, что вы ожидаете, интерпретируя регистр как команду Ex, не пытаясь воспроизвести его в обычном режиме. Поэтому, если ваша последняя команда была :e, регистр содержит e, но @: перезагрузит файл, а не перейдет к концу слова.

    ср. :help @:

  • Покажите, что вы будете делать в обычном режиме перед запуском: @='dd' Enter. Как только вы нажмете клавишу =, Vim переключится на оценку выражения: когда вы введете выражение и нажмите Enter, Vim его вычислит, а результат будет действовать как содержимое регистра. Конечно, регистр = доступен только для чтения и одноразовый. Каждый раз, когда вы начинаете использовать его, вам нужно будет ввести новое выражение.

    ср. :help quote_=

    Следствие. Если вы редактируете команду и понимаете, что вам нужно будет вставить в свою командную строку некоторую строку из текущего буфера: не нажимайте Esc! Используйте Ctrl - R =getline(58) Enter. После этого вы вернетесь к редактированию командной строки, но он вставил содержимое 58-й строки.

  • Определите шаблон поиска вручную: :let @/ = 'foo'

    ср. :help :let

    Обратите внимание, что при этом вам не нужно выходить из / в шаблоне. Однако вам, разумеется, нужно удвоить все одинарные кавычки.

  • Скопируйте все строки, начинающиеся с foo, а затем все строки, содержащие bar в буфер обмена, соедините эти команды: qaq (сбрасывает регистр, в котором хранится пустой макрос), :g/^foo/y A, :g/bar/y A, :let @+ = @a.

    Использование имени регистра капитала делает работу регистра в режиме добавления

    Лучше, если Q не был переназначен mswin.vim, запустите режим Ex с помощью Q, соедините эти "команды двоеточия", которые на самом деле лучше называются "Ex-командами", и вернитесь в обычный режим, набрав visual.

    ср. :help :g, :help :y, :help q

  • Двойное пространство вашего файла: :g/^/put _. Это помещает содержимое регистра черной дыры (пустое при чтении, но записываемое, действующее как /dev/null) linewise, после каждой строки (потому что каждая строка имеет начало!).

  • Добавьте строку, содержащую foo перед каждой строкой: :g/^/-put ='foo'. Это умное использование регистра экспрессии. Здесь - является синонимом .-1 (см. :help :range). Поскольку :put помещает текст после строки, вы должны явно указать ему, чтобы он воздействовал на предыдущий.

  • Скопируйте весь буфер в системный буфер обмена: :%y+.

    ср. :help :range (для части %) и :help :y.

  • Если вы неверно зарегистрировали макрос, вы можете ввести :let @a=' Ctrl - R =replace(@a,"'","''",'g') Enter ' и отредактировать его. Это изменит содержимое макроса, сохраненного в регистре a, и здесь показано, как вы можете использовать регистр выражений для этого.

  • Если вы сделали dddd, вы можете сделать uu, чтобы отменить. С помощью p вы можете получить последнюю удаленную строку. Но на самом деле вы также можете восстановить до 9 удалений с помощью регистров @1 через @9.

    Еще лучше, если вы выполняете "1P, тогда . в нормальном режиме будет воспроизводиться "2P и т.д.

    ср. :help . и :help quote_number

  • Если вы хотите вставить текущую дату в режим вставки: Ctrl - R =strftime('%y%m%d') Enter.

    ср. :help strftime()

Еще раз, что может сбивать с толку:

  • :@ - команда командной строки, которая интерпретирует содержимое регистра как vimscript и передает его
  • @ в команде обычного режима, которая интерпретирует содержимое регистра как нажатия клавиш в нормальном режиме (кроме случаев, когда вы используете регистр :, который содержит последнюю проигранную команду без начального двоеточия: в этом случае он повторяет команда, как если бы вы снова набрали двоеточие и окончательный ключ возврата).

  • " в команде обычного режима, которая поможет вам выбрать регистр для yank, paste, delete, correct и т.д.

  • " также является допустимым именем регистра (по умолчанию или без имени) и поэтому может быть передан в качестве аргументов для команд, которые ожидают имена регистров

Ответ 2

Для вставки чего-то, что является системным буфером обмена, вы можете просто использовать SHIFT-INS.

Он работает в Windows, но я предполагаю, что он хорошо работает и в Linux.

Ответ 3

"Я хотел бы вставить выдернутый текст в командную строку Vim".

В то время как верхний проголосовавший ответ является очень полным, я предпочитаю редактировать историю команд.

В обычном режиме введите: q:. Это даст вам список последних команд, доступных для редактирования и поиска с помощью обычных команд vim. Вы начнете с пустой командной строки внизу.

Для точной статьи, заданной в этой статье, вставляя прямую линию (или дергая что-либо) в командной строке, дергайте текст, а затем: q:p (войдите в режим редактирования истории команд, а затем (p) yanked text в новую командную строку. Редактировать по желанию, enter выполнить.

Чтобы выйти из режима истории команд, это наоборот. В обычном режиме в истории команд введите: :q + enter

Ответ 4

Стоит также отметить, что регистры yank совпадают с макробуферами. Другими словами, вы можете просто записать всю свою команду в своем документе (включая ваш вставленный фрагмент), затем "by, чтобы вынуть его в регистр b, а затем запустите его с помощью @b.

Ответ 5

Для вставки чего-либо из системного буфера обмена в командную строку vim ( "командный режим" ) используйте Ctrl + R, за которым следует +. Для меня, по крайней мере, на Ubuntu, Shift + Ins не работает.

PS: Не знаю, почему Ctrl + R, за которым следует *, который теоретически совпадает с Ctrl + R, а затем +, кажется, не работает всегда. Я искал и обнаружил версию + и, похоже, работает всегда, по крайней мере, на моем ящике.

Ответ 6

У меня была аналогичная проблема. Я хотел, чтобы выделенный текст оказался в команде, но не полагался на его вставку. Здесь я попытался написать сопоставление для:

:call VimuxRunCommand("python")

Документы для этого плагина отображаются только с использованием строковых литералов. При попытке выбрать текст, содержащий двойные кавычки:

vnoremap y:call VimuxRunCommand("<c-r>"")<cr>

Чтобы обойти это, вы просто ссылаетесь на содержимое макроса, используя @:

vnoremap y:call VimuxRunCommand(@")<cr>

Пропускает содержимое неназванного регистра и работает с моими двойными кавычками и многострочными редакциями.

Ответ 7

OSX

Если вы используете vim в MAC OSX, к сожалению, он поставляется со старым версией и не соответствует настройкам буфера обмена. К счастью, доморощенный может легко решить эту проблему.

установить vim:

brew install vim --with-lua --with-override-system-vi

установить gui verion vim:

brew install macvim --with-lua --with-override-system-vi

перезапустите терминал, чтобы вступить в силу.


добавьте следующую строку в ~/.vimrc
set clipboard=unnamed

теперь вы можете скопировать строку в vim с помощью yy и вставить ее в системную область.