Определите пользовательские команды для регистров * и +

9

Если я использую сборку Vim с этой xterm_clipboardфункцией, то содержимое системного буфера обмена доступно через +реестр.

Если сборка, которую я использую, не имеет этой функции, могу ли я заставить "+регистр вызывать мои пользовательские программы для извлечения и установки системного буфера обмена ( xsel -boи / xsel -biили аналогичным образом xclip)? Аналогично с "*звонить xsel -poи xsel -pi.

Дело в том, чтобы иметь возможность набирать что-то вроде, "+pне беспокоясь о том, доступна ли эта функция. Typing :r !xsel -b<Enter>это не то , что я ищу: я хочу те же комбинации клавиш для работы, и я хочу, чтобы паста варианты следовать тому , что доступно для «истинных» регистров ( P, gp, ...).

Бонус: я могу определить пользовательские команды для других имен регистров?

Жиль "ТАК - перестань быть злым"
источник

Ответы:

7

Несколько <expr>карт должны быть в состоянии сделать работу здесь. Основная структура будет

function! ClipboardOrXclip(command, register)
    if a:register !~ '[+*]' || has('xterm_clipboard') || has('gui_running')
        " Just return the original command if the clipboard is accessible
        " or it's not a register that should be handled by xsel
        return a:command
    endif
    if a:register == '+'
        return "<Esc>:r !xsel -bo<CR>"
    else
        return "<Esc>:r !xsel -po<CR>"
    endif
endfunction

nnoremap <silent> <expr> p ClipboardOrXclip('p', v:register)

Функция будет необходимо расширить , чтобы обрабатывать все варианты p, P, gpи т.д. , но это должно быть начало хорошее.

jamessan
источник
Кажется, это на правильном пути, но это не работает. Обычный p(без предшествующего имени "и имени регистра) ничего не делает кроме "pпоявления в строке состояния. "apэквивалентно a, "bpподает звуковой сигнал, ... Я не понимаю логики. "+немедленно издает звуковой сигнал, я даже не могу сказать, что имею в виду +или *в качестве регистрационного имени.
Жиль "ТАК - перестань быть злым"
1
Предполагая, что эти фундаментальные проблемы решены, есть ли исчерпывающий список команд, которые мне нужно переопределить? Набор выглядит устрашающе, особенно если я хочу поддержать и янки.
Жиль "ТАК - перестань быть злым"
@Gilles Обновлено, чтобы исправить поведение с регистрами, отличными от - + / *. Проблема с тем, "+когда ваш vim имеет -xterm_clipboardболее сложный, потому что он никогда не добирается до этой функции. Указание неверного register ( +) отменяет команду. Итак, похоже, что поведение на самом деле должно быть инвертировано, поэтому сопоставьте "+или "*и затем обработайте команду, указанную пользователем ...
jamessan