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


601

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


Для особого случая непосредственного выполнения восстановленного текста см .: Как вы запускаете команду vim, которая является текстом внутри буфера? - Супер пользователь .
user202729

Ответы:


1157

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

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

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

  • 0(регистр янки: когда вы используете yв обычном режиме, без указания регистра, янк текст переходит туда, а также в регистр по умолчанию),
  • 1в 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плюс имя регистра, вставляет содержимое этого регистра. Если вы хотите вставить их буквально (без автоматического отступа, без преобразования контрольных символов, таких как 0x08backspace и т. Д.), Вы можете использовать Ctrl- R, Ctrl- O, имя регистра. См. :help i_CTRL-RИ следующие параграфы для дополнительной ссылки.

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

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

    ср :help ",:help quote_:

  • Вы редактируете файл VIML (например ваш .vimrc) и хотели бы выполнить несколько последовательных строки прямо сейчас: yj:@"Enter.
    Здесь yjвставляет текущую и следующую строки (это потому, что 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в режиме вставки, то @.(поскольку .регистр содержит последнюю вставленную строку) удалят строку. (Вим документация неправильно в этом отношении, так как в нем говорится , что регистры #, %, :и .будет работать только с 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) также после каждой строки (потому что каждая строка имеет начало!).

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

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

    ср :help :range(со %стороны) и :help :y.

  • Если вы misrecorded макрос, вы можете набрать :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, вставить, удалить, исправить и т. д.

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

205
Нет ли значка «соотношение длины к ответу 100/1?» :)
Бенуа

8
Это отличный ответ, но примерно на 900 слов меньше 1400. :)

19
Этот ответ изменил способ использования vim. Спасибо Бенуа
П. Майер Нор

11
Не забывайте: reg, в котором будут перечислены все регистры вместе с их содержимым
eugenevd

3
В последних версиях vim удаления, длина которых меньше одной строки, заносятся в «регистр небольших удалений», а не в пронумерованные регистры. Ссылки: Ви и Вим , Ви и Вим , Reddit
Кристиан Лонг

48

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

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


7
Да, работает в Linux тоже. Протестировано под GNOME в Vim и GVim.
Теулас

3
Это на самом деле подает данные в Vim как ввод с клавиатуры, поэтому, если вы находитесь в обычном режиме и вставляете :!rm -rf /<cr>, он выполнит это. Вместо этого используйте регистры!
Лериксон

4
@lericson Разве я не сказал в своем ответе, что это полезно для чего-то, что находится в системной клавиатуре? Я не понимаю отрицательный голос. А для тебя пример, серьезно? У вас действительно есть это в буфере обмена? И вы не думаете, что печатать shift-insлегче, чем ctrl-R+*? Это конечно если ты в гвим. Если вы находитесь в терминале, подключенном к другой машине, и хотите вставить что-то из буфера обмена, знаете ли вы что-нибудь лучше, чем shift-ins? потому что регистры не работают в этой ситуации. Пожалуйста, подумайте, прежде чем комментировать и делать другие вещи (например, понижение голоса).
записано

Я думаю, что это дезинформация, и я действовал согласно этому решению.
lericson

1
Не работает для меня Я просто добавил <S-Insert> в мою командную строку. Возможно, я что-то упустил. (Ubuntu 19.04 / 2: 8.1.0320-1ubuntu3.1).
Макс Уотерман

39

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

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

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

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

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


1
если вы уже изменяете существующую команду и не нажимаете «q:», нажмите ctrl + f, и у вас появится возможность редактировать историю команд.
Глина

14

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

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


2
Разница между Ctrl-r + и Ctrl-r * заключается в том, что первый является обычным буфером обмена, но в Linux существует второй тип буфера обмена, называемый «основной», который представляет самый последний выделенный текст (вставка из него средней кнопки мыши) , Это не доступно в Windows или MAC, хотя
Матиас Тейер

13

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


1

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

:call VimuxRunCommand("python")

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

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

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

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

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


Я думаю, что в вашем последнем примере отсутствует ". Возможно, вы имели в виду VimuxRunCommand (" @ ").
kd8azz

Это отправит @персонажа в команду vimux. думать о том, чтобы @избежать следующей двойной кавычки и рассматривать ее как регистр, а не как обычный символ. vnoremapЯ определил активно в визуальном режиме, поэтому он дергает выделенный текст, а затем вставляет его в команду vimux, отправив его к работающему переводчику в смежной области. действительно отлично подходит для работы над сценарием и тестирования его небольших частей парой нажатий клавиш.
Conrad.Dean

1

OS X

Если вы используете Vim в Mac OS X, к сожалению, он поставляется с более старой версией и не соответствует параметрам буфера обмена. К счастью, 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

Для контекста эта информация взята из коробки, без плагинов, без поведения .vimrc Vim 7.4 в Linux Mint с опциями по умолчанию.

Вы всегда можете выделить текст с помощью мыши (или, используя Vили vи поместив выделение в регистр "*"), и вставить его в командную строку с помощью Shift+ Ctrl+ v.

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

Кроме того, средняя кнопка мыши будет вставлена ​​в командную строку.

Смотрите :help->quote-plusописание того, как X Window работает с выбором. Даже в простом встроенном Vim (опять же, в Vim 7.4 в Linux Mint, в любом случае) любой выбор, сделанный левой кнопкой мыши, может быть вставлен в командную строку средней кнопкой мыши.

Кроме того, средняя кнопка мыши также вставит текст, выбранный в Vim, во многие другие приложения X Window, даже в приложения с графическим интерфейсом (например, Firefox и Thunderbird ), и вставка текста в командную строку также возможна, если текст был выбран из других приложений. ,

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

ТЛ; др

Сначала попробуйте: CTRL-r, а затем используйте Shift+ Ctrl+ vили среднюю кнопку мыши, если вам нужно что-то еще.

Признано, что это может сбить с толку.


0
  1. "[a-z]y: Скопировать текст в регистр [az]

  2. Используйте, :!чтобы перейти к команде редактирования

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

Раньше для CentOS 7.


Что подразумевается под «Он привык к CentOS 7». ?
Питер Мортенсен

0

Если у вас есть два значения, объединенные в два разных регистра (например, регистр aи регистр b), вы можете просто установить переменную cи выполнить операцию с ней.

Например, :set c = str2float(@a) + str2float(@b)а затем вы можете вставить содержимое в cлюбом месте.

Например, находясь в режиме INSERT, CTRL + Rзатем введите =для ввода в регистр выражений и просто введите cпосле знака равенства и нажмите клавишу ВВОД. Готово, теперь вы должны иметь общее количество aи bрегистров.

Все это можно записать в макрос и повторить заново!

str2floatФункция используется , если вы работаете с поплавками, если вы этого не сделаете, вы получите целые числа вместо этого.

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

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