Автоматически отключать расширение аббревиатуры при вставке кода в Vim

#vim

#vim

Вопрос:

Как я могу автоматически отключить расширение аббревиатуры в терминальном экземпляре Vim при вставке кода?

Примечание: Ключевое слово здесь — автоматически, а не вручную через :set paste .

Комментарии:

1. Какое именно действие вы подразумеваете под «вставкой кода»? Вставка содержимого одного из регистров Vim? Или вставка из внешнего буфера обмена X или выделения X?

Ответ №1:

Для Vim не существует стандартного способа определить, был ли вводимый символ фактически введен пользователем или был сгенерирован для него системой X Window через буфер обмена или буферы выделения. Вот почему существует режим вставки, позволяющий вручную переключать Vim в состояние, когда весь ввод не интерпретируется как вводимый в интерактивном режиме.

Таким образом, у вас есть две альтернативы:

  1. Вставка из регистров "* или " (которые представляют буфер обмена и выделенный X соответственно), если вы используете GVim или ваш Vim скомпилирован с X11 функцией (или, по крайней мере, с xterm_clipboard одним).

  2. В случае запуска 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 .