Я хотел бы вставить выдернутый текст в командную строку Vim. Возможно ли это?
Как вставить выдернутый текст в командную строку Vim?
Ответ 1
Да. Нажмите Ctrl - R, затем ". Если у вас есть буквальные управляющие символы в том, что вы дернули, используйте Ctrl - R, Ctrl - O, ".
Вот объяснение того, что вы можете делать с регистрами. То, что вы можете делать с регистрами, необычно, и как только вы знаете, как их использовать, вы не можете жить без них.
Регистры - это в основном места хранения строк. У Vim есть много регистров, которые работают по-разному:
-
0(регистр yank: когда вы используетеyв нормальном режиме, без указания регистра, туда держится трясущийся текст, а также регистр по умолчанию), -
1to9(сдвигая регистры удаления, когда вы используете команды, такие как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 и вставить ее в системную область.