Tetapkan tanda ke nilai sebelumnya

9

Terkadang saya menggunakan tanda untuk menavigasi dengan mudah melalui berbagai file menggunakan mA, mB... dan 'A, 'B...

Dan kadang-kadang (lebih sering daripada yang ingin saya akui) karena kurangnya perhatian atau apa pun alasannya, saya gunakan m[LETTER]dengan tanda yang sudah ada yang menghapus nilai sebelumnya ketika saya tidak mau. Sebagian besar waktu ketika saya melakukan itu saya tidak membuka file yang awalnya ditunjuk oleh tanda.

Dalam hal ini ketika saya menyadari bahwa saya melakukan kesalahan, apakah mungkin untuk mendapatkan nilai sebelumnya dari tanda saya selain mengingat ke mana arahnya, menavigasi ke lokasi ini dan mengaturnya lagi?

Saya belum menemukan perintah seperti itu di dokumen jadi jika itu tidak ada apakah ada solusi cerdas yang Anda gunakan dalam situasi ini?

statox
sumber
1
Anda juga dapat melihat posting ini untuk informasi lebih lanjut: superuser.com/questions/687441/…
nobe4
@ Nobe4 terima kasih untuk tautan Anda, saya belum menemukannya, tetapi sepertinya mengkonfirmasi bahwa itu tidak mungkin dilakukan dengan mudah.
statox
Gunakan perintah lompat ( ctrl-o, ctrl-idan :jumps) dengan memori pribadi Anda :)
VanLaser

Jawaban:

5

Berikut adalah beberapa VimScript dasar yang kira-kira melakukan apa yang Anda inginkan.

Kami mengganti pemetaan mamelalui mzuntuk menyimpan nilai saat ini g:previous_markssebelum memanggil yang asli muntuk benar-benar menetapkan tanda. Kami juga mendefinisikan <Leader>mamelalui <Leader>mzuntuk menunjukkan sejarah untuk tanda kata.

Anda mungkin ingin menyimpan info dengan g:previous_markscara yang lebih terorganisir, dan menambahkan kemampuan untuk dengan cepat mengembalikan tanda (bukan hanya melihat lokasi), tetapi contoh ini menunjukkan bagaimana hal itu dapat dilakukan, penyesuaian lebih lanjut dibiarkan sebagai latihan kepada pembaca ;-)

let g:previous_marks = {}
fun! MyMark(mark)
    let l:marks = ''
    redir => l:marks
        try
            silent! execute 'marks ' . a:mark
        catch
        endtry
    redir END

    if l:marks != ''
        if !has_key(g:previous_marks, a:mark)
            let g:previous_marks[a:mark] = []
        endif
        call add(g:previous_marks[a:mark], split(l:marks, "\n")[1])
    endif

    execute 'normal! m' . a:mark
endfun

fun! ShowHistory(mark)
    if !has_key(g:previous_marks, a:mark)
        echoerr 'No history for ' . a:mark
        return
    endif

    for l:line in g:previous_marks[a:mark]
        echo l:line
    endfor
endfun

fun! MakeMappings()
    for l:char in range(97, 122)
        let l:char = nr2char(l:char)

        execute 'nnoremap <silent> m' . l:char . ' :call MyMark("' . l:char . '")<CR>'
        execute 'nnoremap <silent> <Leader>m' . l:char . ' :call ShowHistory("' . l:char . '")<CR>'
    endfor
endfun

call MakeMappings()
Martin Tournoij
sumber
Wow seperti biasa jawaban yang luar biasa! Saya akan mencoba meluangkan waktu akhir pekan ini untuk mengimplementasikan latihan untuk pembaca;)
statox
2

Tidak persis apa yang Anda inginkan, tetapi mungkin lebih bermanfaat: plugin tanda tangan . Ini menunjukkan tanda saat ini sebagai tanda di margin selokan, dan memiliki pintasan sederhana untuk mengeditnya. Itu juga dapat menempatkan daftar tanda di daftar lokasi untuk akses cepat.

Sato Katsura
sumber
Saya bukan penggemar besar tanda yang terlihat di margin tetapi tampaknya memiliki beberapa fitur menarik saya akan melihatnya.
statox
@statox Dalam nada yang sama, ada juga tanda-tanda . Ini menunjukkan secara harfiah semua tanda (plugin di atas hanya berurusan dengan yang alfabet), dan dapat diaktifkan dengan kunci. Saya menemukan itu berguna sesekali.
Sato Katsura
Ya saya telah menggunakan tanda untuk beberapa waktu (tidak seperti tanda tangan) itu sebabnya saya katakan saya bukan penggemar tanda di margin tetapi saya mencoba tanda tangan sekarang untuk melihat apakah saya suka :-)
statox
2

Karena masalah sebenarnya tampaknya adalah navigasi antara banyak file / posisi, saya sarankan solusi sederhana ini, yang didasarkan pada plugin Unite :

:Unite jump -auto-preview

Perintah ini (yang dapat dipetakan ke sesuatu seperti <leader>jmisalnya) akan menampilkan daftar lompatan, dengan pratinjau: setiap kali Anda menavigasi daftar dengan j/ k, beberapa baris di sekitar posisi kursor dalam file itu akan ditampilkan.

masukkan deskripsi gambar di sini


Alternatif:

Tanda default sangat mudah untuk ditimpa: mungkin bookmark yang dinamai akan lebih cocok dengan kasus penggunaan Anda, misalnya dengan plugin simple_bookmarks .

VanLaser
sumber
Saya tidak dapat mengatakan bahwa masalahnya adalah jenis navigasi ini karena saya menggunakan tanda-tanda itu sungguh-sungguh dan sebagian besar waktu saya menavigasi secara berbeda melalui file-file saya. Namun demikian saya sudah lama berpikir bahwa saya harus menggunakan daftar lompatan lebih sering sehingga sepertinya cara yang bagus untuk melakukannya!
statox
Bahkan jika mereka dapat disimpan di antara sesi vim, terlalu mudah untuk menimpa tanda. Saya menambahkan solusi alternatif.
VanLaser
Memang solusi alternatif Anda tampaknya patut dicoba, terima kasih banyak!
statox