2011-06-23 2 views
30

Когда я открываю Vim с терминала, копирую текст в системный буфер обмена и выйдя из Vim, системный буфер обмена очищается.Запретить Vim очистить буфер обмена при выходе

Как сохранить скопированный текст в буфер обмена?

+0

Windows, Linux, Mac OS? – TLP

+2

Прочитайте ответы на часто задаваемые вопросы для голосования. «Программные средства, обычно используемые программистами», не в тему. –

+6

@TLP Это должен быть Linux. Если я не ошибаюсь, процесс следующий: 1. Вы копируете текст. 2. Vim сообщает X, что у него есть данные для буфера обмена («говорит, что у него есть данные», а не «помещает данные в буфер обмена»). 3. Вы выходите из vim. 4. X теперь не имеет понятия, где он может получить данные для буфера обмена: буфер обмена «очищен». – ZyX

ответ

27

синтезирующий ответы от superuser, просто добавьте следующую строку в ваш .vimrc

autocmd VimLeave * call system("xsel -ib", getreg('+')) 
+2

Он не делает точно, что хочет TS: он сохраняет значение регистра по умолчанию в буфер обмена, а не в регистре буфера обмена. Вы должны использовать 'getreg ('+')'. – ZyX

+0

Вы правы, у меня есть вещи в другом месте моего vimrc, который синхронизирует два ... – Matt

+2

Спасибо за работу вокруг Matt и Z YX. Это требует установки «xsel». Я использовал getreg ('+'). – gimley

1

Пожалуйста, исправьте меня, если я ошибаюсь, но из моего понимания Vim ...
1) Vim использует регистры вместо буфера обмена для хранения скопированных/вырезанных данных.
2) Эти регистры сохраняются при выходе из Vim в файле состояния, но не доступны за пределами запущенного процесса, если вручную открыть файл и проверить его содержимое
3) Сохранение материала в + Registre в то время как Vim работает позволяет вы можете вставить в другие приложения.
4) Подключив vim (CTRL-Z) вместо закрытия, эти регистры все еще доступны.

Помогает ли это?

+1

Я могу вставить в другое окно/терминал, когда vim все еще работает. Приостановка vim с помощью ctrl + z очищает скопированный текст, например exit. – gimley

+0

Опять же, мой опыт очень ограничен, Обычно я работаю с vi через терминал PuTTY. Суть того, что я смог узнать, заключается в том, что программа использует локальные регистры при работе для хранения данных в буфер обмена, как только приложение завершается, регистры очищаются, а данные недоступны, кроме кэш-файлы, которые он пишет при закрытии. Если это также влияет на приостановленное состояние, я ничего не могу предложить. Удачи: D – Grambot

5

Установка Parcellite или glipper для Gnome и Klipper для KDE.

Перезагрузите компьютер или запустите его вручную.

см: https://wiki.ubuntu.com/ClipboardPersistence

+0

Я не понимаю, почему люди проголосуют за этот ответ. Это показывает, что проблема связана не только с тем, как ведет себя Vim - она ​​затрагивает многие приложения. Ссылка показывает, как устранить проблему для всех затронутых приложений. Чего еще можно хотеть? –

+0

Некоторым людям, таким как я, на самом деле не нужен полный менеджер буфера обмена, потому что мы хотим, чтобы буфер обмена ушел, как только он больше не нужен (например, потому что он содержит конфиденциальные данные). К счастью, Parcellite предлагает режим демона, в котором он «просто» сохранит буфер обмена. – Kevin

+0

Спасибо, Parcellite работает хорошо. –

2

на основе Matt's answer следующее использует xclip вместо xsel:

autocmd VimLeave * call system('echo ' . shellescape(getreg('+')) . ' | xclip -selection clipboard') 
0

Я столкнулся с этой проблемой, и связанная с этим проблема, где подвешивания Vim с ctrl-z также очистить буфер обмена. Я продлил Matt's solution исправить как:

set clipboard=unnamedplus 

if executable("xsel") 

    function! PreserveClipboard() 
    call system("xsel -ib", getreg('+')) 
    endfunction 

    function! PreserveClipboadAndSuspend() 
    call PreserveClipboard() 
    suspend 
    endfunction 

    autocmd VimLeave * call PreserveClipboard() 
    nnoremap <silent> <c-z> :call PreserveClipboadAndSuspend()<cr> 
    vnoremap <silent> <c-z> :<c-u>call PreserveClipboadAndSuspend()<cr> 

endif 

if executable("xsel") охранник есть, чтобы избежать ошибок, если xsel не установлен. Отображение nnoremap сохраняет буфер обмена при приостановке в нормальном режиме, а маркеры отображения vnoremap приостанавливаются с визуальных или избранных режимов.

Я подтвердил, что это работает на vim 7.4 и 8.0.

Смежные вопросы