2011-06-23 10 views
30

Cuando abro Vim desde un terminal, copio texto en el portapapeles del sistema y salgo de Vim, el portapapeles del sistema se borra.Evitar que Vim borre el portapapeles en la salida

¿Cómo mantener el texto copiado en el portapapeles?

+0

Windows, Linux, Mac OS? – TLP

+2

Lea las preguntas frecuentes de las personas que votan para cerrar. Las "herramientas de software comúnmente usadas por los programadores" no están fuera de tema. –

+6

@TLP Debe ser Linux. Si no me estoy equivocando, el proceso es el siguiente: 1. Usted copia el texto. 2. Vim le dice a X que tiene datos para el portapapeles («dice que tiene datos», no «pone datos en el portapapeles»). 3. Salgas de vim. 4. X ahora no tiene idea de dónde puede obtener datos para el portapapeles: el portapapeles está «despejado». – ZyX

Respuesta

27

respuestas Sintetizar de superuser, sólo tiene que añadir lo siguiente a su .vimrc

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

No hace exactamente lo que quiere TS: guarda el valor del registro predeterminado en el portapapeles, no en el registro del portapapeles. Deberías haber usado 'getreg ('+')'. – ZyX

+0

Tienes razón, tengo cosas en mi vimrc que sincronizan las dos ... – Matt

+2

Gracias por el trabajo alrededor de Matt y Z yX. Sin embargo, requiere instalar 'xsel'. Usé getreg ('+'). – gimley

1

Corrígeme si me equivoco pero según mi comprensión de Vim ...
1) Vim usa registros en lugar del portapapeles para almacenar datos copiados/cortados.
2) Estos registros se conservan al salir de vim en un archivo de estado, pero no son accesibles fuera del proceso en ejecución a menos que abrir manualmente el archivo para inspeccionar su contenido
3) Ahorro de material al + registre mientras que vim se ejecuta permite a pegar en otras aplicaciones.
4) Al suspender vim (CTRL-Z) en lugar de cerrarlo, aún se puede acceder a estos registros.

¿Eso proporciona asistencia?

+1

Puedo pegar en otra ventana/terminal cuando vim todavía está en ejecución. Suspender vim con ctrl + z es borrar el texto copiado como salir. – gimley

+0

Nuevamente, mi experiencia es muy limitada ya que Usualmente trabajo con vi a través de una terminal PuTTY. Lo esencial de lo que pude aprender es que el programa usa registros locales mientras se ejecuta para almacenar datos en el portapapeles, una vez que la aplicación finaliza, los registros se borran y los datos son inaccesibles excepto el archivos de caché que escribe de cerca. Si esto afecta también al estado suspendido, no puedo sugerir nada más. Buena suerte: D – Grambot

5

Instalar Parcellite o Glipper para Gnome y Klipper para KDE.

Reinicia tu computadora o ejecútala manualmente.

véase: https://wiki.ubuntu.com/ClipboardPersistence

+0

No entiendo por qué las personas votarían esta respuesta. Muestra que el problema no es solo por la forma en que se comporta Vim, sino que afecta a muchas aplicaciones. El enlace muestra cómo solucionar el problema para todas las aplicaciones afectadas. ¿Qué más podrías querer? –

+0

Algunas personas, como yo, realmente no queremos un administrador completo del portapapeles porque queremos que el portapapeles desaparezca tan pronto como ya no se necesite (por ejemplo, porque contiene datos confidenciales). Afortunadamente, Parcellite ofrece un modo daemon en el que "solo" mantendrá seguro el portapapeles. – Kevin

+0

Gracias, Parcellite funciona bien. –

2

Basado en Matt's answer, los siguientes usos xclip en lugar de xsel:

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

me encontré con este tema y un problema relacionado en suspensión vim con ctrl-z también borrar el portapapeles. Hemos ampliado en Matt's solution para fijar tanto:

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 

El guardia if executable("xsel") está ahí para evitar errores si xsel no está instalado. La asignación nnoremap conserva el portapapeles cuando se suspende desde el modo normal y la asignación vnoremap se encarga de suspender desde modos visuales o de selección.

He confirmado que esto funciona en vim 7.4 y 8.0.

Cuestiones relacionadas