Come posso usare i segni per saltare alle posizioni nei file che ho aperto di recente, ma non modificato?


11

Spesso modifico un file - penso che il mio lavoro sia finito - quindi chiudo il file e passiamo alla cosa successiva. Ma poi mi rendo conto che devo tornare a quel codice e modificarlo un po 'di più.
Se apro di nuovo il file, posso usare il .segno e saltare alla posizione dell'ultima modifica con '..
Ora sto cercando di trovare un modo per usare i segni di VIM per saltare alle posizioni nei file che ho visitato di recente, ma non modificato.
So di poter impostare un segno manualmente, ma il più delle volte non mi aspetto di tornare e quindi non ho impostato un segno e devo usare un segno che VIM genera automaticamente.
Il "marchio sembra che questo potrebbe essere un modo per raggiungere questo obiettivo, da :h motion.

" Alla posizione del cursore all'ultima uscita dal buffer corrente. Il valore predefinito è il primo carattere della prima riga. Vedi | last-position-jump | per come utilizzare questo per ogni file aperto. Viene memorizzata solo una posizione per buffer, non una per ogni finestra. Finché il buffer è visibile in una finestra, la posizione non verrà modificata. {non in Vi}.

Comunque se io

  • chiude tutte le finestre che mostrano un buffer (ma il buffer è ancora presente nell'elenco dei buffer). o:
  • uccide tutte le istanze del buffer

il segno non sembra aggiornarsi, come posso usare un segno per saltare alla posizione dell'ultima posizione del cursore nel buffer / file?


2
Penso che tu stia cercando Ctrl+oe Ctrl+i... :h jump-motionsper maggiori informazioni
Sundeep

@spasic non è un brutto suggerimento, ma una volta che fai qualche dozzina di salti, la posizione verrebbe persa in un enorme elenco di salti. Puntando i segni sul buffer si ha un elenco più piccolo di segni / posizioni da gestire
the_velour_fog

Se non l'avessi già letto, penso che questo suggerimento sarebbe interessante. Forse dovrai modificare il tuoviminfo
statox

@statox grazie. Ho visto quello e la punta nella guida di Vim. Penso che queste soluzioni causino il salto automatico nel "segno quando si apre un file. Volevo davvero saltare solo all'ultima posizione del cursore manualmente. Inoltre, non riuscivo a capire quando il "marchio veniva impostato e aggiornato, quindi per me il "segno è inutilizzabile.
the_velour_fog

Risposte:


6

Ecco una soluzione classica: usare

`H

per passare all'ultimo file HTML e così via ...

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END

2
grazie, sembra che potrebbe davvero essere utile. L'ho caricato nel mio vimrc per provarlo. Ho cambiato in autocmd WinLeavecome ho notato BufLeavenon sembra attivarsi quando si chiude una divisione e il buffer è ancora aperto da qualche altra parte. So che è un po 'un caso limite, ma WinLeavesembra funzionare su una gamma più ampia di situazioni di tipo "chiusura file", ma sto ancora testando ...
the_velour_fog

3

Ho scritto questa dichiarazione di vimscript che sembra funzionare

autocmd BufLeave * :normal ml

Spiegazione

  • BufLeave comando automatico: questo sembra innescarsi quando si
    • passare a un'altra finestra
    • quando si chiude l' ultima finestra che visualizza il buffer
    • quando si chiude il buffer stesso con bd
  • :normal- sembra di default, la commandparte di autocmd è un comando ex. Quindi per dire a Vim di eseguire un normale comando in modalità, è necessario aggiungere:normal
  • ml- imposta un segno l(mnemonico: ultimo )

uso

per richiamare la posizione del cursore dall'ultima volta in cui sei stato nel buffer, premi semplicemente

'l

o

`l

0

Se desideri che il cursore ripristini l'ultima posizione nota a viminfo , puoi utilizzare

autocmd BufReadPost * call setpos(".", getpos("'\""))

La risposta di Romainl mi è stata particolarmente utile e la sto usando molto (da quando sono un web dev):

augroup VIMRC
    autocmd!
    autocmd BufLeave,WinLeave *.html normal! mH
    autocmd BufLeave,WinLeave *.css normal! mC
    autocmd BufLeave,WinLeave *.js normal! mJ
augroup end

nnoremap <space>h `Hzz
nnoremap <space>c `Czz
nnoremap <space>j `Jzz

L'ultima cosa potenzialmente utile è l'opzione :help 'nostartofline:

               *'startofline'* *'sol'* *'nostartofline'* *'nosol'*
'startofline' 'sol' boolean (default on)
            global
            {not in Vi}
    When "on" the commands listed below move the cursor to the first
    non-blank of the line.  When off the cursor is kept in the same column
    (if possible).  This applies to the commands: CTRL-D, CTRL-U, CTRL-B,
    CTRL-F, "G", "H", "M", "L", gg, and to the commands "d", "<<" and ">>"
    with a linewise operator, with "%" with a count and to buffer changing
    commands (CTRL-^, :bnext, :bNext, etc.).  Also for an Ex command that
    only has a line number, e.g., ":25" or ":+".
    In case of buffer changing commands the cursor is placed at the column
    where it was the last time the buffer was edited.
    NOTE: This option is set when 'compatible' is set.
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.