Вставить в режиме вставки?

385

Можно ли вставить в режиме вставки в Vim?

Амир Рахум
источник

Ответы:

466

В режиме вставки нажмите CTRL-R {register}

Примеры:

  • CTRL-R * вставит в содержимое буфера обмена
  • CTRL-R " (безымянный регистр) вставляет последнее удаление или янки.

Чтобы найти это в справке типа vim :h i_ctrl-r

Дэвид
источник
13
Да, я только недавно узнал о CTRL-R, и это чрезвычайно полезно.
Дан
16
CTRL-R *работает только в GVIM или версиях, скомпилированных для взаимодействия с x. Введите vim --versionи ищите +xterm_clipboard. Если у вас его нет, вам нужна другая версия vim. ( vim.wikia.com/wiki/Accessing_the_system_clipboard )
Conrad.Dean
10
На самом деле вам нужно только +clipboard, но если у вас есть, +xterm_clipboardвы должны иметь это в любом случае. На некоторых ОС xterm_clipboardне применяется.
Эндрю Маршалл
1
Хм, я использую C-r + для вставки из системного буфера обмена в Windows (используя GVim portable)? Никогда не слышал о * регистрации.
kitsu.eb
6
@ kitsu.eb В X системах *регистр можно вставить с помощью щелчка средней кнопкой мыши, в то время +как это традиционное копирование / вставка. standard.freedesktop.org/clipboards-spec/clipboards-latest.txt
13
235

Если вы не хотите Vim калечить форматирование поступающей вставки текста, вы можете также рассмотреть возможность использования: :set paste. Это предотвратит повторное добавление Vim вашего кода. Когда закончите вставку, :set nopasteвернетесь к нормальному поведению.

Также возможно переключить режим с помощью одной клавиши, добавив что-то вроде set pastetoggle=<F2>вашего .vimrc. Подробнее о включении автоматического отступа здесь .

Джеймс Снайдер
источник
47
:set nopasteотключит режим вставки
Джеймс Снайдер
24
@JamesSnyder Лучший способ - это, :set paste!вероятно, установка пасты очень близко к истории команд, поэтому вы можете просто нажать «:», затем стрелку вверх и добавить «!».
Рафаэль Барбоса
6
Просто любопытно - что лучше или что не так в :set paste! Спасибо :)
Майкл Даррант
33
!в конце команды в vimтумблерах команда включения и выключения. Таким образом, вам не нужно печатать, :set nopasteвместо этого вы можете прокрутить историю и :set paste!снова запустить ту же команду ( ).
바 바
3
@blockloop Вы должны включить его при вставке и отключить сразу после этого.
NieDzejkob
125

Нет не напрямую. Тем не менее, вы можете быстро выйти из режима вставки для одной операции в обычном режиме, Ctrl-Oа затем выполнить вставку, которая завершится переходом в режим вставки.

Key Combo: Ctrl-O p

РЕДАКТИРОВАТЬ: интересно. Похоже, что есть способ, как перечислили несколько других людей.

JaredPar
источник
2
ctrl-r "не работает для меня (os x, vi в терминале). ctrl-o p сделал.
Боб
4
Это самый быстрый и простой способ запомнить.
Pinpox
Как насчет esc + p?
Ситилдж
2
Определенно быстрее, чем esc + p + iи определенно легче печатать, чемCTRL-R + "
lucidbrot
На самом деле, это иногда ведет себя иначе, чем CTRL-R ". Например, хотя настройки vimrc могут изменить это, вставка чего-либо в новую строку с помощью CTRL-O pделает отступы исчезающими.
noname
30

Находясь в режиме вставки, вы можете использовать Ctrl-R {register}, где регистр может быть:

  • + для буфера обмена,
  • * для буфера обмена X (последний выделенный текст в X),
  • " для безымянного регистра (последнее удаление или восстановление в Vim),
  • или ряд других (см. :h registers).

Ctrl-R {register} вставляет текст, как если бы он был напечатан.

Ctrl-R Ctrl-O {register} вставляет текст с оригинальным отступом.

Ctrl-R Ctrl-P {register} вставляет текст и автоматически делает отступ.

Ctrl-Oможет использоваться для запуска любой команды нормального режима перед возвратом в режим вставки, поэтому
Ctrl-O "+pтакже может использоваться, например.

Для получения дополнительной информации просмотрите документацию с :h i_ctrl-r

Zaz
источник
4
Этот ответ представляется наиболее полным. Это очень понятно и, на мой взгляд, наиболее полезно. Он отвечает на вопрос ОП, а затем несколько кратко.
Деввин
26

Вы можете использовать это, чтобы вставить из буфера обмена с Ctrlv:

set pastetoggle=<F10>
inoremap <C-v> <F10><C-r>+<F10>

И это для визуального выбора в буфер обмена с помощью Ctrlc:

vnoremap <C-c> "+y

Если вы также хотите использовать буфер обмена по умолчанию для классического vim yanking / pasteing ( y/ p) в обычном режиме, вот вариант конфигурации, который делает это:

set clipboard=unnamedplus

С помощью этих конфигов вы можете, например, сначала дернуть в обычном режиме, а затем вставить Ctrlv в режиме вставки. Также вы можете вставлять текст из разных экземпляров vim и разных приложений.

Другой вариант:

set clipboard=unnamed

Затем вы сможете просто выбрать что-то, перетаскивая мышью в вашей среде X, а затем вставить его в vim. Но (по какой-то причине) вы не сможете что-то дергать ( y) в Vim иshiftinsert потом в другом месте, что, вероятно, весьма ограничивает.

Vim рассказывает об этом: http://vim.wikia.com/wiki/Accessing_the_system_clipboard

Для вставки из пользовательских регистров вы можете следовать другим ответам :). Этот ответ в основном касается интеграции Vim с вашим системным буфером обмена.


Обратите внимание, что для set clipboard=unnamedplusи set clipboard=unnamedдля работы вам нужно использовать gvim или vimx ( vim-X11): они скомпилированы +xterm_clipboard. При желании вы можете поместить это в свой .bashrcпсевдоним vimс помощью vimx:

if [ -e /usr/bin/vimx ]; then
    alias vim='/usr/bin/vimx'; # vim with +xterm_clipboard
fi

Вы можете узнать, есть ли у вашего vim +xterm_clipboardинформация, предоставленная vim --version.

климат
источник
7
Это именно то, что я искал. Это также единственный разумный ответ здесь. Вот как можно ожидать, что все будет работать. Кто-нибудь знает, почему поведение по умолчанию :set pasteи византийский <leader><leader> * yдаже отдаленно желательны? Чтобы не показаться слишком преданным, мне искренне любопытно, в какой именно философии это отражается, или это просто историческое несчастье.
Эсхил
Ваш ответ позволил мне использовать Shift + Insert в Gvim также с inoremap <S-Insert> <F12><C-r>+<F12>(я использую F12 как pastetoggle). Спасибо.
sromero
20

Если вы устанавливаете Vim на использование системного буфера обмена ( :set clipboard=unnamed), любой текст, который вы копируете в Vim, можно вставить с помощью Shift+ Insert. Shift+ Insertэто просто комбинация клавиш для вставки во всей ОС ( Ctrl+ Insert- соответствующая «копия»).

Будет
источник
1
Не знал о S-Insert :)
BandGap
Это работает наоборот? Будет ли pвставить текст в буфер обмена?
Заз
Прежде чем использовать Shift + Insertдля вставки текста, мы должны быть в режиме вставки.
января
18

Вы также можете использовать среднюю кнопку мыши для вставки в режиме вставки (только для Linux).

lcltj
источник
106
О какой мышке ты говоришь?
Джим Митченер
19
О каких операционных системах не Linux вы говорите?
Бруно Броноски
-1: Этот ответ сильно зависит от аппаратных средств и настроек терминала. В конечном счете, кнопки мыши отправляют предустановленные строки в терминал, и терминал анализирует эту строку для выполнения определенной команды. Проблема в том, что это может сильно различаться в зависимости от настроек терминала. Чтобы улучшить этот ответ, пожалуйста, предоставьте нам, по крайней мере, версию терминала, ОС, а также версию и модель мыши, которую вы используете.
мелвиньким
Вставка средней кнопки мыши довольно распространена во всех приложениях Linux, не ограничена версиями терминала или ОС.
lcltj
Не работает в Arch Linux + urxvt. Это добавляет только новую строку.
Зигимантус
5

Вы можете войти в -- INSERT (past) --режим через:

  • Клавиатура комбинированная: y p

или

  • :set pasteи вход в режим вставки ( :set nopasteчтобы отключить)

в -- INSERT (past) --режиме просто используйте функцию вставки вашей системы (например, CtrlShiftvв Linux, Cmdvв Mac OS).

Эта стратегия очень полезна при использовании vim поверх ssh.

rudolph9
источник
4

Да. В Windows Ctrl+ Vи в Linux нажатие обеих кнопок мыши практически одновременно.

В Windows я думаю, что эта строка в моем _vimrc, вероятно, делает это:

source $VIMRUNTIME/mswin.vim

В Linux я не помню, как я это сделал. Похоже, я, вероятно, удалил какую-то строку из файла .vimrc по умолчанию.

Программист Windows
источник
Могу ли я поднять голос более одного раза? Я только хочу вставить, когда я пришел из другого окна - поэтому я всегда нахожусь на мыши. Brilliant!
Дэйв
В Linux вы вставляете нажатием средней кнопки мыши. Если у вас есть двухкнопочная мышь и вы нажимаете как левую, так и правую кнопку, то для работы с ней нужно «Emulate3Buttons» или аналогичное.
Cougar
0

Вставить в режиме вставки

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

inoremap <Leader>p <ESC>pa

Мой Leaderключ здесь \; это означает, что нажатие \pв режиме вставки вставит ранее выдернутые элементы / строки.

Sheharyar
источник
0

Просто добавьте карту:

" ~/.vimrc
inoremap <c-p> <c-r>*

перезапустите vim и при нажатии Crtl+pв режиме вставки скопированный текст будет вставлен

itsnikolay
источник