Bir işareti önceki değerine ayarlama


9

Bazen mA, mB... ve 'A, kullanarak farklı dosyalarda kolayca gezinmek için işaretleri kullanırım 'B.

Ve bazen (itiraf etmek istediğimden daha sık) dikkatsizlik veya nedeni ne olursa olsun, m[LETTER]istemediğimde önceki değerini silen zaten mevcut bir işaretle kullanıyorum. Çoğu zaman bunu yaptığım zaman markın işaret ettiği dosyayı açmadım.

Bu durumda hemen bir hata yaptığımı fark ettiğimde, nerede olduğumu hatırlamak, bu konuma gitmek ve tekrar ayarlamak dışında işaretimin önceki değerini almak mümkün müdür?

Dokümanda böyle bir komut bulamadım, eğer bu yoksa, bazılarınızın bu durumda kullandığı akıllı bir çözüm var mı?


1
Ayrıca daha fazla bilgi için bu
gönderiye bakabilirsiniz

@ Nobe4 bağlantınız için teşekkürler bunu bulamadım ama bunu kolayca yapmanın gerçekten mümkün olmadığını onaylıyor gibi görünüyor.
statox

Atlama komutları (kullanın ctrl-o, ctrl-ive :jumps:) kendi kişisel bellek ile)
VanLaser

Yanıtlar:


5

İşte kabaca ne istediğinizi yapan bazı temel VimScript.

Orijinali gerçekten işareti ayarlamak için çağırmadan önce geçerli değeri saklamak için mageçiş mzeşlemelerini geçersiz kılar . Biz de tanımlamak yoluyla söz konusu işareti geçmişini göstermek için.g:previous_marksm<Leader>ma<Leader>mz

Muhtemelen bilgileri g:previous_marksdaha organize bir şekilde saklamak ve bir işareti hızlı bir şekilde geri yükleme yeteneğini eklemek (sadece konumları görmek yerine) isteyeceksiniz , ancak bu örnek bunun nasıl yapılabileceğini gösteriyor, daha fazla değişiklik bir egzersiz olarak bırakılıyor okuyucuya ;-)

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()

Her zamanki gibi şaşırtıcı cevap Vay! Okuyucu için
alıştırma yapmak

2

Tam olarak ne istediğinizi değil, belki de daha kullanışlı: imza eklentisi. Mevcut işaretleri oluk kenar boşluğunda işaretler olarak gösterir ve bunları düzenlemek için basit kısayollara sahiptir. Hızlı erişim için işaret listesini bir konum listesine de koyabilir.


Kenar boşluğundaki görünür işaretin büyük bir hayranı değilim ama bazı ilginç özelliklere sahip gibi gözüküyorum.
statox

@statox Aynı şekilde, gösteriler de var . Kelimenin tam anlamıyla tüm işaretleri gösterir (yukarıdaki eklenti yalnızca alfabetik olanlarla ilgilidir) ve bir anahtarla değiştirilebilir. Ara sıra yararlı buluyorum.
Sato Katsura

Evet birkaç kez şovları kullanıyorum (imzadan farklı olarak) bu yüzden marjdaki işaretlerin hayranı değilim ama şimdi
beğenip

2

Asıl sorun birden fazla dosya / konum arasında gezinme gibi göründüğünden, Unite eklentisine dayanan bu basit çözümü öneririm :

:Unite jump -auto-preview

(Gibi bir şey eşlenebilir Bu komut <leader>j, atlama listesini gösterir örneğin) ile bir önizleme: Eğer listeyi gezinmek her zaman j/ k, bu dosyada imleç pozisyonu çevresinde birkaç satır görüntülenecektir.

resim açıklamasını buraya girin


Alternatif:

Varsayılan işaretlerin üzerine yazmak çok kolaydır: Belki de adlandırılmış yer imleri, kullanım örneğinize daha iyi uyacaktır, örneğin, simple_bookmarks eklentisi ile.


Sorunun bu tür bir gezinme olduğunu söyleyemem çünkü bu işaretleri gerçekten zaman zaman kullanıyorum ve çoğu zaman dosyalarımda farklı geziniyorum. Yine de uzun zamandır atlama listesini daha sık kullanmam gerektiğini düşünüyorum, bu yüzden bunu yapmanın güzel bir yolu gibi görünüyor!
statox

Vim oturumları arasında kaydedilse bile, işaretlerin üzerine yazmak çok kolaydır. Alternatif bir çözüm ekledim.
VanLaser

Aslında alternatif çözümünüz denemeye değer görünüyor çok teşekkürler!
statox
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.