Smetti di incollare le selezioni come testo!


10

Uso VI e VIM da anni (30 o più) (in xterms, non nella propria finestra, gvim) e ho una vasta libreria di comandi vim che do a vim usando il pulsante centrale del mouse come selezione.

Ad esempio, spesso farei cose come ...

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

La selezione includerebbe molti comandi VIM per eseguire operazioni come la sostituzione di test, formattazione, spostamento di righe, ecc. Ecc. Ecc. E in genere termina con: w e: i comandi VIM successivi, al termine della selezione, quindi vim è pronto per essere incollato di nuovo nel file successivo. Questo mi consente di aggiornare un numero enorme di file in modi MOLTO complessi, senza bisogno di script speciali (come la modifica sul posto perl) per farlo.

Alcune di queste paste di comando vim sono lunghe più di 200 righe (memorizzate in file di testo che pop-up sullo schermo e "copia tutto"! Queste apportano MOLTE modifiche al set di migliaia di file che sto riformattando. Ma solo per il set specifico di file, non per il mio lavoro quotidiano di vim. EG: riformattazione in blocco di file di testo / dati.

Il problema...

Durante la mia ultima patch di sistema (Fedora 25) vim ora incolla la selezione del mouse AS TEXT e non come comandi vim, e non riesco a fermarlo!

Funziona ancora bene su un altro sistema (Fedora 24).

Se voglio incollare come testo, accedo alla modalità di inserimento prima di incollare! Non voglio che VIM incolli automaticamente le selezioni come testo quando non è in modalità inserimento. Capisco che si intendesse come funzionalità di sicurezza, ma per me è un problema di usabilità PRINCIPALE.

Ho provato a risalire voci terminfo (xterm-256color) da una macchina che non lo fa (in particolare la voce terminfo "kmous"). Ho anche guardato l'impostazione vim ": set mouse =" (che è nulla!). Non so se si tratta dell'xterm (dubbio) o di qualcosa che è cambiato in VIM (probabilmente) e che i registri delle modifiche e Google non sono stati utili.

Nulla però sembra farmi il vecchio comportamento.


Trovato un altro utente con lo stesso problema, meno dettagli, nessuna soluzione unix.stackexchange.com/questions/346293/…
anthony

1
Dubito che sia più probabile un vimcambiamento: come può sapere vimall'interno di xtermqualcosa che è stato inserito tramite la tastiera o incollato tramite il pulsante del mouse? Non conosco un tale meccanismo. D'altra parte, xtermsa che si sta eseguendo in vimmodo da poter decidere di circondare l'incollaggio con ie <esc>. Prova (a) con un diverso tipo di finestra terminale e (b) una copia vimcon un nome diverso. Ciò dovrebbe aiutare a restringere la causa del problema.
Philippos,

Sono d'accordo con @philippos. Forse qualcos'altro oltre a vimdirottare il tuo metodo incolla. Magari prova a scrivere o fare telnet nella tua macchina e incollare in quel modo. Se hai una finestra di Windows, usa putty per ssh nella tua macchina Fedora25 e incolla in quel modo.
Jim U,

Non direttamente correlato, ma gvim su Windows si è comportato in questo modo per anni. Quando installi gvim, ottieni due eseguibili, gvim.exe(graphical-vim) e riga di comando vim.exe. Incolla "itext" in gvim.exe e otterrai itext. Incollalo nel vim.exe e otterraitext
Jim U,

1
@Philippos Quel meccanismo potrebbe essere tra parentesi . Non so come potrebbe supportarlo Vim, forse l' pastetoggleopzione?
Gilles 'SO- smetti di essere malvagio'

Risposte:


12

Bene, dopo aver esaminato MOLTE pagine Web, molte delle quali hanno dato alcuni suggerimenti che non sembravano funzionare, ho trovato un suggerimento (testo extra attorno a un incolla) che mi ha portato alla causa e alla soluzione del problema.

Sembra che vim abbia incorporato in esso una serie di voci "finte" di termcap che utilizza quando riconosce terminali specifici (e talvolta si sbaglia, anche se in questo caso non era sbagliato).

Le impostazioni di Termcap in vim sono numerose come tali NON vengono visualizzate in un normale elenco di impostazioni ": imposta tutto". Per vederli devi usare ": set termcap". L'impostazione del termcap specifica "non standard" è "t_BE" (vedi vim ": help t_BE"). La guida integrata "xterm-bracketed-paste" spiega questa impostazione di termcap da interno a Vim.

Fondamentalmente se questa impostazione è definita (in questo caso da Vim non termcap / terminfo) allora vim lo invierà a xterm quando si avvia, il che dice a xterm di aggiungere codici speciali attorno a qualsiasi testo che l'utente incolla da una fonte esterna. Quando vim li vede, passa automaticamente non solo alla modalità di inserimento ma imposta anche la "modalità di incollaggio" in modo da non formattare il testo.

La modalità successiva (incolla) è MOLTO utile! Il primo è quello che mi ha dato tutti i problemi.

La soluzione della forza bruta è disabilita bracketing-paste aggiungendo questo al ".vimrc"

:set t_BE=

Una soluzione alternativa ....

Invece di disabilitare completamente il bracketing-paste, interrompi l'azione di vim quando vede la sequenza iniziale di una pasta terminale (dal mouse), mentre è in comando o in modalità normale.

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

L'uso di questo significa che se si incolla il testo mentre si è in modalità di inserimento, vim non proverà a formattare (rientrare) il testo che è molto probabilmente già rientrato.

Questo non significa che non ho più bisogno di attivare / disattivare la modalità incolla, poiché uso anche la modalità incolla in modalità incolla (mappata su F2) per disabilitare "showbreak" e "listchars" (visualizzazione di righe, tab, spazi senza interruzioni e spazi extra alla fine delle linee). Avrei ancora bisogno di mettere VIM in quella modalità quando voglio fare selezioni del mouse per incollare altrove.

Commenti e suggerimenti sulle soluzioni sono i benvenuti.


Questo sembra funzionare anche in Cygwin Vm ma purtroppo non risolve il problema in VS Vim
James Robinson

@JamesRobinson Molto probabilmente è un terminale integrato diverso per VS
anthony il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.