2013-07-02 15 views
5

Mi piace il comando '. in vim. Da :help '.:Impedisci a Vim di ricordare una modifica

'. `. 

[Vai a] la posizione in cui è stata fatta l'ultima modifica. La posizione è ao vicino a dove è iniziata la modifica.

Ok. Ma ecco il mio problema: utilizzo una funzione autocmd per aggiungere una riga "last modified" nell'intestazione del mio file. Quindi, dopo ogni scrittura, '. non mi porta alla mia "vera" ultima modifica, ma alla mia intestazione del file. La mia soluzione attuale è che cerco di ricordare di contrassegnare il mio attuale punto di modifica con ma, così posso 'a per tornare ad esso. A volte mi dimentico, però, e anche quando ricordo, si tratta di un altro paio di sequenze di tasti.

La mia soluzione ideale sarebbe una sorta di comando che dice di non ricordare i movimenti. Potrei inviare questo comando prima che la funzione autocmd salti, scrivendo l'ultima riga modificata e quindi la annulli dopo che la funzione autocmd è terminata. In questo modo, la posizione associata a '. non verrà modificata. Tuttavia, sono aperto a qualsiasi altra opzione che sia più efficiente.

Nel caso in cui si desideri vederlo, ecco cosa fa il autocmd.

function! UpdateHeader() 
    let b:winview = winsaveview() 

    " This is where I'd put the command to ignore future movements 

    "The periods concatenate all the arguments into one command. 
    "Silent! suppresses errors, usually 'pattern not found' 
    "The 1,6g means search only lines 1 thru 6 
    "Search for File Name: followed by anything 
    "'s'ubstitute 
    "Substitute in 'File Name: ' and the results of the expand command, on the 
    "current filename 
    execute "silent! 1," . 6 . "g/File Name:.*/s//File Name: " . expand("%") 
    execute "silent! 1," . 6 . "g/Last Modified:.*/s//Last Modified: " . strftime("%d-%m-%Y") 

    " This is where I'd put the command to start remembering movements again 

    call winrestview(b:winview) 
endfunction 

risposta

4

È possibile utilizzare :keepjumps {command} nel numero autocmd.

Vedere :help :keepjumps.

+0

Perfetto. Grazie. – ravron

+0

Una nota per chiunque cerchi di implementare questa soluzione: il comando 'keepjumps' è necessario dove avviene * la modifica effettiva del testo * - cioè, nel comando': s' eseguito dal comando ': g':' execute " silenzioso! 1, ". 6. "g/Nome file:. */keepjumps s // Nome file:". ampliare ("%") '. – ravron

+0

Ancora una nota: il comando, come scritto nel commento precedente, impedisce che ''.' venga impostato. Tuttavia, aggiunge ancora al jumplist. Per prevenire * that *, aggiungi 'keepjumps' di nuovo, subito dopo' silent! '. – ravron

1

Ci possono essere modi più bella per fare questo, ma come circa semplicemente conservando la posizione in un altro marchio? Ad esempio:

" This is where I'd put the command to ignore future movements 
" go to the mark and label it as z 
`.mz 

" This is where I'd put the command to start remembering movements again 
" return to your mark and create a fake edit there to reset the most recent edit mark 
`zi <Esc>x 
+0

Interessante. Ho considerato anche questo tipo di soluzione. In effetti, la marcatura non sarebbe nemmeno necessaria, dal momento che 'winsaveview()' e in seguito 'winrestview()' conserva e ripristina la posizione del cursore. Il punto più saliente è la modifica "finta", per forzare il contrassegno '.' nel posto giusto. Dovrebbe funzionare, ma, per ora, mi proverò per una soluzione più "carina". Se non appare nessuno, ottieni l'assegno. +1 a prescindere. – ravron

3

Prova :lockmarks <command> nel vostro autocmd. L'aiuto per questo dice che '. è una delle cose che non verrà modificata dal comando.

+0

Ho scelto la risposta citando ': keepjumps' su': lockmarks' perché quel comando sembrava più limitato nella portata pur soddisfacendo l'obiettivo dichiarato. Grazie comunque. – ravron

+0

@Riley Questo ha senso. Grazie per aver fatto la domanda; Ho imparato alcune cose. –

Problemi correlati