2013-07-02 12 views
5

Vim'de '. komutunu beğeniyorum. :help '. Gönderen:Vim'in bir değişikliği hatırlamasını engelleme

'. `. 

[e atla] son ​​değişiklik yapıldığı pozisyon. Konum, değişikliğin başladığı yerdedir.

Tamam. Ama benim sorunum: Dosya başlığımda "son değiştirilmiş" satır eklemek için autocmd işlevini kullanıyorum. Yani, her yazmadan sonra, '. beni "gerçek" son değişikliğime değil, dosya başlığımma getiriyor. Şu anki çözümüm şu anki düzenleme noktasını ma ile işaretlemeyi hatırlıyorum, bu yüzden ona geri dönmek için 'a yapabilirim. Bazen unutuyorum, hatta hatırladığımda, başka bir çift tuş vuruşu.

İdeal çözümüm, hareketleri hatırlamamayı söyleyen bir tür komut olurdu. autocmd işlevinin etrafında atlama yapmadan, son değiştirilen satırı yazmadan önce bu komutu gönderebilir ve autocmd işlevi bittikten sonra iptal edebilirim. Bu şekilde, '. ile ilişkili konum değiştirilmeyecektir. Ancak, daha verimli olan diğer seçeneklere açığım.

Bunu görmek isterseniz, autocmd'un :w numaralı telefonunda ne var.

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 

cevap

4

:keepjumps {command}, autocmd sayfanızda kullanabilirsiniz.

Bkz. :help :keepjumps.

+0

Mükemmel. Teşekkürler. – ravron

+0

Bu çözümü uygulamaya çalışan herkes için bir not: "keepjumps" komutu, metnin gerçek modifikasyonunun gerçekleştiği yerde, yani ": s" komutunda ": g" komutuyla çalıştırılır: "execute" sessiz! 1, ". 6. "g/Dosya Adı:. */keepjumps s // Dosya Adı:". ("%") 'Genişletme. – ravron

+0

Bir not daha: önceki yorumda yazılan komut, ''. '' Nin ayarlanmasını engelliyor. Bununla birlikte, yine de atlama listesine ekliyor. Bunu önlemek için * sessiz kaldıktan hemen sonra "keepjumps" ı tekrar ekleyin! – ravron

1

Bunu yapmanın daha iyi yolları olabilir, ancak konumu başka bir işarette saklamaya ne dersiniz? Ör:

" 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

İlginç. Ben de bu tür bir çözümü düşündüm. Aslında, winsaveview() 've daha sonra' winrestview() 'imleç konumunu koruyarak ve geri yüklediğinden işaretleme bile gerekli değildir. Daha göze çarpan nokta, "." Işaretini doğru yere zorlamak için "sahte" düzenlemedir. Bu işe yarayacak, ama şimdilik, daha "güzel" bir çözüm için dışarıda kalacağım. Hiçbiri görünmezse, kontrolü alırsınız. +1 ne olursa olsun. – ravron

3

sizin autocmd içinde :lockmarks <command> deneyin. Bunun yardımı, '.'un komut tarafından değiştirilmeyecek şeylerden biri olduğunu söylüyor.

+0

Yanıtı ': keepjumps' yerine ': lockmarks' olarak seçtim çünkü bu amaç, belirtilen amaç yerine getirilirken, kapsamda daha sınırlı görünüyordu. Yine de teşekkürler. – ravron

+0

@Riley Bu mantıklı. Soruyu sorduğunuz için teşekkür ederiz; Birkaç şey öğrendim. –