Bagaimana saya bisa menggunakan tanda untuk melompat ke lokasi dalam file yang baru saja saya buka, tetapi tidak berubah?

11

Sering kali saya mengedit file - berpikir pekerjaan saya sudah selesai - kemudian tutup file dan beralih ke hal berikutnya. Tapi kemudian saya sadar bahwa saya harus kembali ke kode itu dan mengubah sedikit lagi.
Jika saya membuka file lagi, saya dapat menggunakan .tanda dan melompat ke posisi edit terakhir dengan '..
Sekarang saya mencoba menemukan cara untuk menggunakan tanda vim untuk melompat ke lokasi dalam file yang baru-baru ini saya kunjungi, tetapi tidak diubah.
Saya tahu saya dapat menetapkan tanda secara manual, tetapi sebagian besar waktu, saya tidak berharap untuk kembali dan jadi saya tidak menetapkan tanda dan perlu menggunakan tanda yang vim hasilkan secara otomatis.
The "mark tampaknya seperti ini bisa menjadi cara untuk mencapai hal ini, dari :h motion.

" Ke posisi kursor saat terakhir keluar dari buffer saat ini. Default ke karakter pertama dari baris pertama. Lihat | posisi-terakhir-lompat | untuk cara menggunakan ini untuk setiap file yang dibuka. Hanya satu posisi yang diingat per buffer, bukan satu untuk setiap jendela. Selama buffer terlihat di jendela posisi tidak akan berubah. {tidak dalam Vi}.

Namun jika saya

  • tutup semua jendela yang menunjukkan buffer (tetapi buffer masih ada dalam daftar buffer). atau:
  • bunuh semua instance buffer

tanda tampaknya tidak memperbarui, bagaimana saya bisa menggunakan tanda untuk melompat ke lokasi posisi kursor terakhir di buffer / file?

the_velour_fog
sumber
2
Saya pikir Anda sedang mencari Ctrl+odan Ctrl+i... :h jump-motionsuntuk info lebih lanjut
Sundeep
@spasic itu bukan saran yang buruk, tetapi begitu Anda melakukan lusin loncatan, posisinya akan hilang dalam daftar lompatan besar. Dengan meringkas tanda ke buffer, Anda memiliki daftar tanda / lokasi yang lebih kecil untuk dikelola
the_velour_fog
Jika Anda belum membacanya, saya pikir tip ini akan menarik. Mungkin Anda harus men-tweak Andaviminfo
statox
@statox terima kasih. Saya melihat itu dan tip dalam bantuan vim. Saya pikir solusi tersebut menyebabkan lompatan otomatis ke "tanda ketika Anda membuka file. Saya benar-benar ingin hanya melompat ke posisi kursor terakhir secara manual. Juga, saya hanya tidak bisa memahami kapan "tanda itu diatur dan diperbarui sehingga bagi saya "tanda itu tidak dapat digunakan.
the_velour_fog

Jawaban:

6

Berikut ini adalah solusi klasik: gunakan

`H

untuk melompat ke file HTML terakhir dan seterusnya ...

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
romainl
sumber
2
terima kasih, ini sepertinya sangat berguna. Saya telah memuatnya ke vimrc saya untuk mencobanya. Saya telah berubah menjadi autocmd WinLeavekarena saya perhatikan BufLeavesepertinya tidak menyala ketika Anda menutup split dan buffer masih terbuka di tempat lain. Saya tahu ini sedikit dari kasus tepi, tetapi WinLeavetampaknya bekerja pada rentang yang lebih luas dari situasi jenis "penutupan file", tapi saya masih hanya menguji ...
the_velour_fog
3

Saya menulis pernyataan vimscript ini yang sepertinya berhasil

autocmd BufLeave * :normal ml

Penjelasan

  • BufLeave perintah otomatis: ini tampaknya memicu ketika Anda
    • pindah ke jendela lain
    • ketika Anda menutup jendela terakhir yang menampilkan buffer
    • ketika Anda menutup buffer itu sendiri bd
  • :normal- tampaknya secara default, commandbagian dari autocmd adalah perintah ex. Jadi untuk memberitahu vim untuk menjalankan perintah mode normal, Anda perlu menambahkan:normal
  • ml- menetapkan tanda l(mnemonik: terakhir )

Pemakaian

untuk mengingat posisi kursor dari terakhir kali Anda berada di buffer cukup tekan

'l

atau

`l
the_velour_fog
sumber
0

Jika Anda ingin kursor Anda mengembalikan posisi terakhir yang dikenal ke viminfo , Anda dapat menggunakannya

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

Jawaban romainl sangat berguna bagi saya, dan saya sudah sering menggunakan ini (karena saya seorang 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

Final Hal berpotensi berguna adalah pilihan, :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.
dylnmc
sumber