¡Deje de pegar las selecciones como texto!


10

He estado usando VI y VIM durante años (30 o más) (en xterms, no en su propia ventana, gvim) y tengo una gran biblioteca de comandos vim que le doy a vim usando el botón central del mouse como selección.

Por ejemplo, a menudo hacía cosas como ...

 vi {many_hundreds_of_files}
   paste vim commands using mouse - one paste per file.

La selección incluiría muchos comandos VIM para hacer cosas como reemplazar la prueba, formatear, mover líneas, etc., etc., etc., y generalmente termina con: w y: próximos comandos VIM, al final de la selección, entonces vim está listo para que lo pegue nuevamente en el siguiente archivo. Esto me permite actualizar una gran cantidad de archivos de maneras MUY complejas, sin necesidad de secuencias de comandos especiales (como la edición in situ de Perl) para hacerlo.

¡Algunas de estas pastas de comando vim tienen más de 200 líneas de largo (almacenadas en archivos de texto que aparecen en la pantalla, y 'copiar todo'! Estas hacen MUCHOS cambios en el conjunto de miles de archivos que estoy formateando. Pero solo para el conjunto específico de archivos, no para mi trabajo diario de vim. EG: Reformateo masivo para archivos de texto / datos.

El problema...

Durante mi último parche del sistema (Fedora 25), vim ahora pega la selección del mouse como TEXTO y no como comandos de vim, ¡y parece que no puedo detenerlo!

Todavía funciona bien en otro sistema (Fedora 24).

Si quiero pegar como texto, entro en modo insertar antes de pegar. No quiero que VIM pegue automáticamente las selecciones como texto cuando no está en modo de inserción. Entiendo que esto se entiende como una característica de seguridad, pero para mí es un problema de usabilidad MAYOR.

He intentado retroceder las entradas de terminfo (xterm-256color) desde una máquina que no hace esto (especialmente la entrada de terminfo "kmous"). También he mirado la configuración vim ": set mouse =" (¡que es nula!). No sé si es el xterm (dudoso), o algo que cambió en VIM (probable), y los registros de cambios y google no han sido útiles.

Sin embargo, nada parece captarme el viejo comportamiento.


Encontré otro usuario con el mismo problema, menos detalles, sin solución unix.stackexchange.com/questions/346293/…
anthony

1
Dudo que sea más probable que un vimcambio: ¿Cómo puede vimel interior de un xtermsaber algo se introduce a través del teclado o pegar a través del botón del ratón? No conozco tal mecanismo. Por otro lado, xtermsabe que se está ejecutando, vimpor lo que podría decidir rodear el pegado con iy <esc>. Pruebe (a) con un tipo diferente de ventana de terminal y (b) una copia de vimcon un nombre diferente. Esto debería ayudar a reducir la causa del problema.
Philippos

Estoy de acuerdo con @philippos. Quizás otra cosa que no vimsea ​​secuestrar su método de pegar. Tal vez intente enviar mensajes de texto o telonear a su máquina y pegar de esa manera. Si tiene una caja de Windows, use masilla para ssh en su máquina Fedora25 y pegue de esa manera.
Jim U

No está directamente relacionado, pero gvim en Windows se ha comportado de esta manera durante años. Cuando instala gvim, obtiene dos ejecutables, gvim.exe(graphical-vim) y la línea de comandos vim.exe. Pegue "itext" en gvim.exe y obtendrá itext. Péguelo en el vim.exe y obtendrátext
Jim U

1
@Philippos Ese mecanismo podría ser una pasta entre corchetes . No sé cómo Vim podría soportarlo, ¿tal vez la pastetoggleopción?
Gilles 'SO- deja de ser malvado'

Respuestas:


12

Bueno, después de pasar por MUCHAS páginas web, muchas dando algunas pistas que no parecían funcionar, encontré una pista (texto adicional alrededor de una pasta) que me llevó a la causa y la solución al problema.

Parece que vim ha incorporado en él una serie de entradas de captación de términos 'falsas' que utiliza cuando reconoce terminales específicos (y a veces se equivoca, aunque no fue incorrecto en este caso).

La configuración de Termcap en vim es una suma numérica como tal NO se muestra en una lista de configuración normal ": establecer todo". Para verlos necesitas usar ": set termcap". La configuración específica del término 'no estándar' es "t_BE" (ver vim ": ayuda t_BE"). La ayuda incorporada "xterm-bracketed-paste" explica esta configuración de terminación interna a vim.

Básicamente, si esta configuración está definida (en este caso por Vim, no termcap / terminfo), entonces vim la enviará a xterm cuando se inicie, lo que le indica a xterm que agregue códigos especiales alrededor de cualquier texto que el usuario pegue desde una fuente externa. Cuando vim los ve, automáticamente no solo entra en modo de inserción sino que también establece 'modo de pegado' para no formatear el texto.

¡El último (modo de pegado) es MUY útil! Lo primero es lo que me ha estado causando problemas.

La solución de fuerza bruta es deshabilitar la pasta entre corchetes agregando esto al ".vimrc"

:set t_BE=

Una solución alternativa ...

En lugar de deshabilitar completamente la pasta entre corchetes, deje de que vim tome medidas cuando vea la secuencia de inicio de una pasta terminal (desde el mouse), mientras está en modo comando o normal.

:nmap <PasteStart>  <NOP>
:nmap <PasteEnd>    <NOP>
:cmap <PasteStart>  <NOP>
:cmap <PasteEnd>    <NOP>

Usar esto significa que si pega texto mientras está en modo de inserción, vim no intentará formatear (sangrar) el texto que probablemente ya esté sangrado.

Esto no significa que ya no necesito alternar el modo de pegar, ya que también uso el modo de pegar (asignado a F2) para deshabilitar "showbreak" y "listchars" (mostrar líneas, pestañas, espacios sin interrupción y espacios adicionales al final de las líneas). Todavía necesitaría poner vim en ese modo cuando quiero hacer selecciones de mouse para pegar en otro lugar.

Comentarios y sugerencias sobre las soluciones son bienvenidas.


Esto también parece funcionar en Cygwin Vm pero lamentablemente no resuelve el problema en VS Vim
James Robinson

@JamesRobinson Es más que probable que sea un terminal integrado diferente para VS
anthony
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.