#vim
#vim
Вопрос:
Как я могу автоматически отключить расширение аббревиатуры в терминальном экземпляре Vim при вставке кода?
Примечание: Ключевое слово здесь — автоматически, а не вручную через :set paste
.
Комментарии:
1. Какое именно действие вы подразумеваете под «вставкой кода»? Вставка содержимого одного из регистров Vim? Или вставка из внешнего буфера обмена X или выделения X?
Ответ №1:
Для Vim не существует стандартного способа определить, был ли вводимый символ фактически введен пользователем или был сгенерирован для него системой X Window через буфер обмена или буферы выделения. Вот почему существует режим вставки, позволяющий вручную переключать Vim в состояние, когда весь ввод не интерпретируется как вводимый в интерактивном режиме.
Таким образом, у вас есть две альтернативы:
-
Вставка из регистров
"*
или"
(которые представляют буфер обмена и выделенный X соответственно), если вы используете GVim или ваш Vim скомпилирован сX11
функцией (или, по крайней мере, сxterm_clipboard
одним). -
В случае запуска Vim в терминале вы можете вручную синхронизировать один из регистров (например, безымянный,
""
) с буфером обмена или выделенным X. Например, поскольку я использую Vim только в терминале, я определяю для себя следующие сопоставления:nmap <silent> <leader>y :call system('xclip', @")<cr> nmap <silent> <leader>p :call XClipRead()<cr> function! XClipRead() let s = system('xclip -o') if v:shell_error return endif call setreg('"', s) endfunction
Чтобы вставить содержимое буфера выделения X, используя эти
для сопоставления необходимо ввести клавишу выноски, за которой следуетp
, и
затем соответствующая команда вставки Vim. Если вы соглашаетесь потерять
возможность использования различных команд вставки (таких как
P
,gp
]p
и т.д.), Вы можете определить сопоставление, которое выполняет оба
вещи:nmap <silent> <leader>P :call XClipRead()<cr>p
Комментарии:
1. Терминал vim может быть скомпилирован с поддержкой регистров буфера обмена X11. Я не знаю ни одного дистрибутива, в котором не крошечный консольный vim компилировался бы без него.
2. @ZyX Vim имеет две функции, связанные с поддержкой буферов обмена:
X11
иxterm_clipboard
. Первый обеспечивает как буфер обмена X, так и регистр буфера выбора, в то время как второй предоставляет поддержку только буфера обмена XTerm. И есть много ситуаций, когда эти функции отключены (или нецелесообразно перекомпилировать Vim с ними). Что касается дистрибутивов, то это совсем не редкая ситуация. Например,vim
(неgvim
) пакет в Arch Linux имеет Vim, скомпилированный без обоихX11
иxterm_clipboard
.