Как вставить набранный текст в командную строку Vim? - PullRequest
564 голосов
/ 22 октября 2010

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

Ответы [ 9 ]

1093 голосов
/ 22 октября 2010

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

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

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

  • 0 (регистр янки: если вы используете y в обычном режиме, без указания регистра, туда возвращается рывок и также в регистр по умолчанию),
  • 1 на 9 (смещение регистров удаления, когда вы используете такие команды, как c или d, то, что было удалено, переходит в регистр 1, то, что было в регистре 1, переходит в регистр 2, и т.д. ),
  • " (регистр по умолчанию, также известный как безымянный регистр. Здесь " входит *1039* 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, вставляется в ваш буфер.
    Давайте разберем: " - команда в обычном режиме, которая позволяет вам выбрать регистр, который будет использоваться во время следующей операции восстановления, удаления или вставки. Поэтому ": выбирает регистр двоеточия (сохраняя последнюю команду). Тогда p - это команда, которую вы уже знаете, она вставляет содержимое регистра.

    ср. :help ", :help quote_:

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

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

    ср. :help :@ и :help quote_quote

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

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

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

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

    ср. :help :put

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

    ср. :help setreg(). Функции реверса getreg() и getregtype().

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

    ср. :help q, help @

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

    ср. :help @

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

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

    ср. :help @:

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

    ср. :help quote_=

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

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

    ср. :help :let

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

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

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

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

    cf.:help :g, :help :y, :help Q

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

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

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

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

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

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

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

    ср.:help . и :help quote_number

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

    ср.:help strftime()

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

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

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

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

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

Это работает в Windows, но я предполагаю, что оно хорошо работает вЛинукс тоже.

35 голосов
/ 26 июля 2012

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

Хотя ответ с наибольшим количеством голосов очень завершен, я предпочитаю редактировать историю команд.

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

Точно, о чем просит статья, вставив строку (или что-нибудь назад) в командную строку, вставьте текст, а затем: q:p (войдите в режим редактирования истории команд, а затем (p) введите ваш текст в новую командную строку. Отредактируйте по желанию, введите , чтобы выполнить.

Чтобы выйти из истории командВ противоположном режиме в обычном режиме в истории команд введите: :q + введите

14 голосов
/ 01 апреля 2012

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

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

13 голосов
/ 11 апреля 2012

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

1 голос
/ 30 марта 2018

этот вопрос довольно старый, но так как он был просмотрен очень много раз, он кажется популярным - я поставлю его здесь для потомков. для контекста эта информация взята из коробки, без плагинов, без поведения .vimrc vim 7.4 в linux mint с параметрами по умолчанию.

Вы всегда можете выделить текст с помощью мыши (или с помощью V или v и поместить выделение в регистр "*) и вставить его в командную строку с помощью SHIFT-CTL-v.

ввод CTL-r в командной строке вызовет запрос имени регистра. введите: CTL-r * поместит регистр содержимого * в командную строку. он вставит любой регистр, а не просто "*. см .: help c_CTRL-R.

кроме того, средняя кнопка мыши будет вставлена ​​в командную строку. смотрите: help-> quote-plus для описания того, как x11 работает с выбором. даже в простом, нестандартном vim (опять же, в vim 7.4 в linux mint, во всяком случае) любой выбор, сделанный левой кнопкой мыши, может быть вставлен в командную строку средней кнопкой мыши.

кроме того, средняя кнопка мыши также вставит текст, выбранный в vim, во многие другие приложения x11, даже графические (например, firefox, thunderbird), и вставка текста в командную строку также возможна, если текст был выбран из Другие приложения.

см. Help-> x11-selection для дополнительной информации.

Т.Л., др

попробуйте сначала: CTL-r подход, затем используйте SHIFT-CTL-v или среднюю кнопку мыши, если вам нужно что-то еще.

допускается, что это может сбить с толку.

1 голос
/ 16 августа 2016

OSX

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

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

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

установить графический интерфейс vim:

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

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


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

, теперь вы можете скопировать строку в vim с помощью yy и вставить ее для всей системы.

1 голос
/ 28 июля 2014

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

:call VimuxRunCommand("python")

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

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

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

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

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

0 голосов
/ 25 августа 2018
  1. "[a-z]y копирование текста в регистр [a-z];

  2. использовать :! перейти к команде редактирования;

  3. CTRL+R следуйте идентификатору регистра, чтобы вставить то, что вы копируете.

Раньше CentOS7.

...