2010-03-31 18 views
16

Quando incollo gli elementi dagli Appunti, sono normalmente (sempre) multilineati e, in quei casi (e solo in questi casi), vorrei che venga attivato :set paste, poiché altrimenti il ​​tabbing aumenterà con ogni linea (l'avete visto tutti!).Incollare dagli Appunti e alternare automaticamente: set paste

Anche se il problema con :set paste è che non si comporta bene con set smartindent, facendo sì che il cursore salti all'inizio di una nuova riga anziché al rientro corretto. Quindi mi piacerebbe abilitarlo solo per questa istanza.

Sto usando Mac, sshing su una macchina Debian con vim, e quindi incollando in modalità di inserimento usando cmd-v.

Cheers.

+1

Non penso ci sia alcun motivo per migrare questa domanda: non solo le domande vim sono accettate come appartenenti a SO (http://meta.stackexchange.com/questions/25925/vim-questions-so-or-su), si tratta di una domanda sull'editor di testo di un programmatore, utilizzata per eseguire un'attività comune durante la programmazione. – Cascabel

+1

@Jefromi: incollare è comune quando si fa qualsiasi forma di modifica del testo, ma concederò che le domande Vim/Emacs sono state ritenute accettabili per SO anche quando non sono direttamente correlate alla programmazione. @Jonatan: Consiglio vivamente di non usare "smartindent". Vedi http://vim.wikia.com/wiki/Restoring_indent_after_typing_hash#Using_filetype_indentation per una spiegazione del perché. – jamessan

+0

@jamessan: Il punto è che incollare con questo specifico problema di formattazione è un'attività di programmazione molto, molto comune. Da nessun'altra parte si incolla regolarmente blocchi di testo con rientranze che variano da linea a linea. – Cascabel

risposta

7

Non uso un mac, ma credo di avere il prefisso proprio qui: <D-v> dovrebbe significare cmd-v. Per la modalità di inserimento:

:imap <D-v> ^O:set paste<Enter>^R+^O:set nopaste<Enter> 

o realmente, solo fare questo:

:imap <D-V> ^O"+p 

Il^O e^R sono letterale di controllo-O e controllo-R, che è possibile digitare con^V^O (control-v control-o) e^V^R (control-v control-r). Control-O in modalità di inserimento consente di eseguire un comando quindi tornare alla modalità di inserimento; qui puoi usarlo per mettere dal registro degli appunti.

Questo ha funzionato per me quando li ho testati mappati su una chiave diversa, quindi dovresti essere tutto pronto.

Non è necessario mappare nulla quando non in modalità di inserimento; puoi semplicemente usare "+p.

+0

Per quanto riguarda '" + p' ... a seconda del sistema operativo, potrebbe essere necessario cambiarlo in "" * p'. Per il mio computer (osx) avevo bisogno di usare la seconda versione. – agbodike

1

Hai ragione, devi solo abilitare 'paste' quando ti serve. Fa molto più che influenzare il rientro. Puoi leggere tutto ciò che influenza nel suo documentation. Un'opzione correlata che è molto utile per facilitare l'uso di 'paste' è 'pastetoggle'.

Se si utilizza l'inoltro X e un terminale che può comunicare correttamente le azioni del mouse, è anche possibile sfruttare l'opzione 'mouse'. Con :set mouse=a, Vim è a conoscenza di ciò che il mouse sta facendo e pertanto non eseguirà il rientro automatico quando riceve una stampa multi-linea tramite un clic del mouse con il pulsante centrale.

Anche senza la funzionalità del mouse, l'inoltro X può essere d'aiuto poiché Vim farà la stessa cosa quando si incolla manualmente dagli Appunti o dai registri di selezione (rispettivamente "+ e "*).

+0

Grazie. Ho chiesto aiuto per ottenere X-forwarding e Mouse e cosa non funziona (http://superuser.com/questions/98350/vim-and-mouse-with-ssh-from-mac-to-linux), ma non ha mai risolto tutto. Guarderò in pastetoggle, che dovrebbe risolverlo. La documentazione di Vim (e il set di funzionalità) è davvero enorme. –

3

Ho il seguente nel mio Vimrc:

inoremap <S-Insert> <ESC>:setl paste<CR>gi<C-R>+<ESC>:setl nopaste<CR>gi 

gi è quello di avviare la modalità di inserimento nella stessa posizione in cui la modalità di inserimento è stato fermato l'ultima volta nel buffer corrente.

Upd:

Jefromi postato una migliore soluzione. L'ho armeggiato un po '

Inserisce il testo di clilpboard e posiziona il cursore subito dopo.

+0

È bello, ma funziona solo su Shift-Insert, giusto? E questo non funzionerebbe dal mio Mac, a meno che non mi sbagli. –

+0

Potrebbe essere facilmente mappato a qualsiasi cosa tu preferisca. per esempio. –

+0

@Jonatan Littke: La mia risposta mostra come mappare ciò a command-v e come farlo in modo più efficiente. – Cascabel

0

Questo dovrebbe essere risolvibile con uno script vim. (Odio lo scripting vim, quindi dovrebbe essere un'invenzione molto più seria da indurmi a risolverlo da solo.) Anche con iTerm2's "paste slowly" mode, l'impostazione predefinita è di interrompere i dati da incollare in blocchi da 16 byte e inviarne uno ogni 0.125 secondi . Pertanto, dovresti essere in grado di rilevare a livello di codice un chunk di 16 byte di "sequenze di tasti" e fare qualcosa al riguardo.

In pseudocodice che sarebbe simile:

if too_fast_too_be_human(): 
    set('pastemode', True) 
else 
    set('pastemode', False) 

# where either 
def too_fast_too_be_human 
    char_threshold = 16 
    return len(input_buffer) > char_threshold 

# or 
def too_fast_too_be_human 
    static byte_times = [] 
    char_threshold = 16 
    time_threshold = 0.125 
    byte_times.append(now()) 
    while(len(byte_times) > char_threshold): 
     byte_times.unshift() 
    return (byte_times[-1] - byte_times[0]) < time_threshold 

ci sono punti deboli a questo, ma avrebbe funzionato per la maggior parte dei casi.

Problemi correlati