Buradan X bayta git


9

Geçerli imleç konumundan başlayarak X baytlarını nasıl ileri taşıyabilirim (satır sonları dahil)?

[count]goarabellek başlangıcından itibaren X bayt ileri gitmek için kullanılabilir. Shift + V, G, [count]go(Seçimimin [count]gobaşından itibaren saymaya başlayacağını varsayarak) denedim , ancak maalesef bu işe yaramadı çünkü gosadece arabellek başından itibaren saymaya başlıyor.

Ayrıca :set rulerformat=%ogeçerli bayt uzaklığını görüntülemeye çalıştım ( bir bayt uzaklığına atlayarak ve konumu bayt uzaklığı olarak göstererek ), kafamdaki sayıları ekledim ve sonunda yayınladım [count]go. Bu işe yarıyor, ama çok pratik değil ...


Her şey tek bir satırdaysa (karakter sayısı Xlnerede X) veya karakter sayısını ve ardından Sağ ok'u kullanabilirsiniz.
Lekensteyn

Yanıtlar:


9

Bu arama 40 karakter (bayt değil) ileri taşır :

/\_.\{40}/e

\{40}newline ( \_.) dahil olmak üzere herhangi bir türde tam olarak 40 karakter ( ) arayarak ve imleci aramanın sonuna ( /e) yerleştirerek. : Bkz http://vimregex.com/#Non-Greedy , :help search-offsetve:help \_

Ayrıca, :h 23.4ikili düzenleme için bakın .


Güncelleme: Bu cevaba dayanarak, bayt ofsetine atlayan bir fonksiyon:

let s:last_jump_bytes = 0

function! JumpTo(byte_nr)
    let crt_byte = line2byte(line('.')) + col('.')
    if (a:byte_nr == 0)
        let dst_byte = crt_byte + s:last_jump_bytes
    else
        let dst_byte = crt_byte + a:byte_nr
        let s:last_jump_bytes = a:byte_nr
    endif
    let dst_line = byte2line(dst_byte)
    let dst_col = dst_byte -line2byte(dst_line)
    "remove next line if you don't want to record this for `Ctrl-O`
    execute "normal " . dst_line . "G"
    call setpos('.', [0, dst_line, dst_col])
endfunction

command! -nargs=1 JumpToOffset :call JumpTo(<f-args>)

" silly mapping to Ctrl-C (demo)
nnoremap <expr> <silent> <c-c> ":<c-u>call JumpTo(" . v:count . ")<cr>"

Bu şekilde kullanılabilir:

:JumpToOffset 400

veya eşlenen klavye eşlemesini bir sayıyla yazarak:

40CTRL-C

Bir sayı kullanmazsanız, önceki sayım numarası yeniden kullanılır. Böylece şunları yapabilirsiniz: 40CTRL-C CTRL-C CTRL-C 30CTRL-C CTRL-C40, 40, 40, 30, 30 bayt vb.

Ctrl-OGeri dönmek için tuşuna basın (işlevin içindeki yorumlara bakın).


Cevap için teşekkürler. Gerçekten X bayt ileriye gitmek için arıyorum, ancak chars değil. Arama deseninizin muhtemelen dokümantasyon referanslarıyla ne yaptığını açıklayabilir misiniz?
Rob W

Bitti. [count]goİşlemi bir vim fonksiyonunda da otomatikleştirmek de mümkündür (mevcut bayt ofsetini okuyun, goorada istenen sayıyı ekleyin ).
VanLaser

... otomatik fonksiyon ve komut eklendi.
VanLaser

Güncelleme için teşekkürler, bu iyi görünmeye başlıyor! [count]goVe yönteminiz arasında iki küçük fark vardır : 1) [count]goatlama listesine bir öğe ekler, böylece Ctrl+Ohızlı bir şekilde önceki konumuma atlamak için kullanabilirsiniz . 2) [count]goolmadan kullanılabilir , şeyleri :yapan yeni bir tanıtmak mümkün [count]GOmü? Yanıtınızı, bu davranışı ile eşleşecek şekilde düzenleyebilir misiniz go?
Rob W

her iki puan için düzenlendi
VanLaser

9

Benim sorumdan mantığı uygulayan aşağıdaki çözümü kullandım.

  • [count]GO[count]baytları ileri taşımak için .
  • [count]Go[count]baytları geri taşımak için .

Bunu şu adrese ekleyin .vimrc:

function! JumpToByte(byte_nr)
    " See https://vi.stackexchange.com/a/3911/2720 for the byte counting bug
    let crt_byte = line2byte(line('.')) + col('.') - 1
    if version < 781 && &l:binary == 1 && &l:eol == 0
        let crt_byte += 1
        let crt_byte += line('.') == 1
    endif
    let dst_byte = crt_byte + a:byte_nr
    execute "normal " . dst_byte . "go"
endfunction
nnoremap <expr> <silent> GO ":<c-u>call JumpToByte(" . v:count . ")<cr>"
nnoremap <expr> <silent> Go ":<c-u>call JumpToByte(-" . v:count . ")<cr>"

İlk uygulama için VanLaser'a teşekkürler, bu da beni doğru yöne soktu.


Bir soru, bu işlevselliğe tam olarak nerede ihtiyacınız var? (BTW Hiçbir çözüm sağlanmadıysa, çözümünüzü önceki sayıyı yeniden kullanarak birleştirdim).
VanLaser

1
@VanLaser PDF dosya biçimini daha iyi anlamak için bir PDF dosyasının ham içeriğini okuyordum. Bir PDF dosyası birçok nesneden oluşur ve bu nesnelerin çoğunun uzunluk öneki vardır. X baytını atlayabilmek hata ayıklama için kullanışlıdır. Ve neden ham PDF dosyalarını düzenlediğimi sormadan önce : PDF.js için PDF dosya formatı hakkında daha derin bir bilgi gerektiren yeni bir özellik geliştiriyorum .
Rob W

Cevabınız için teşekkürler (ve iyi şanslar)! Kombine versiyon ilgileniyorsa burada: pastebin.com/7sVyiA85
VanLaser

@VanLaser Cevabımı son sürümle güncelledim. Orijinal satır sayma yönteminizin iyi olduğu ortaya çıktı, ancak Vim'de bir hata vardı. Gönderdiğim bir yama kabul edildi amaçlanan şekilde Vim en son sürümünde, cevabın da çalışacaktır.
Rob W

Orada gerçek bir kazma yaptınız (kaynağa gidiyor) - tebrikler!
VanLaser
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.