Emacs: Büyük bir dosyadan X ile Y arasındaki tüm satırları içeren bir arabellek aç


10

Bu diğer soru ile aynı ruhla: büyük bir dosyada X çizgi X'dan Y çizgisine :

Büyük bir metin dosyasından belirli bir satır kümesini (örn. Satır ve arasındaki tüm satırlar) Emacs içinden açmanın (ve bir arabellekte göstermenin) bir yolu var mı ?XY

Örneğin, dosyadan 57890000 ve 57890010 satırları arasındaki tüm satırları bir arabellekte açın ve gösterin huge.txt

Güncelleme: Satırları da düzenleyebilmem (ve orijinal dosyaya kaydetmem) harika olsa da, en azından satırları salt okunur olarak açabilen bir çözümle ilgileniyorum (sadece görüntüleme amaçlı).


Sadece görmek, hatta düzenlemek mi istiyorsun?
choroba

1
İçerden ne dersin ed? 57890000,57890010p
Kevin

Yanıtlar:


7

Dosyanın tamamını (gerektirir) açmak, ancak yalnızca bir kısmını editör penceresinde göstermek istiyorsanız, daralmayı kullanın . Tamponun üzerinde çalışmak istediğiniz bölümünü seçin ve C-x n n( narrow-to-region) tuşuna basın . Devre dışı bırakılmış bir komut hakkında bilgi alırsanız “evet” deyin. Tüm arabelleği tekrar görmek için C-x n w( widen) tuşuna basın . Arabelleği kaydederseniz, tam dosya seçilir: tüm veriler hala oradadır, daraltmak yalnızca gördüklerinizi kısıtlar.

Dosyanın bir bölümünü görüntülemek istiyorsanız, shell-commandöneki argümanı ( M-1 M-!) ile geçerli arabelleğe ekleyebilirsiniz . İstenen satırları çıkarmak için uygun komutu çalıştırın , örn <huge.txt tail -n +57890001 | head -n 11.

insert-file-contentsBayt aralığı alabilen bir Lisp işlevi de vardır . M-:( eval-expression) İle çağırabilirsiniz :

(insert-file-contents "huge.txt" nil 456789000 456791000)

Tamsayı boyut sınırına girebileceğinizi unutmayın (sürüme ve platforma bağlı, değerini kontrol edin most-positive-fixnum).

Teorik olarak, dosyaların parçalarını gerektiği gibi şeffaf bir şekilde yükleyen ve kaydeden bir Emacs modu yazmak mümkün olacaktır (tamsayı boyutlarındaki sınır 32-bit makinelerde gerçek dosya ofsetleri kullanmayı imkansız hale getirecektir). Bildiğim kadarıyla bu yönde sadece çabadır VLF (GitHub bağlantı burada ).


1

Bu perl ve elisp kombinasyonunu yararlı bulabilirsiniz. Verileri bir tampona aktarmanızı sağlar. Aynı arabellek adını kullanan sonraki çağrılar yeni satırları aynı ara belleğe ekler.

Arabelleği "düzenleyebilirsiniz" , ancak düzenleme hiçbir şekilde kaynağa (bir pipo ) geri yansımaz ... Herhangi bir satır numarası göstermez, ancak her biri için numaralı bir önek eklemek üzere girişi düzenleyebilirsiniz. hat.

from=50000000
  to=50000010
<file_50 head -n "$to" | tail -n +"$from" | e-sink.pl

Tamponda:

<<<<< start: 2012-09-09T01:39:49
1000000
VSjU K97X5Z dFcc ZZd2OqQ PzbnphT
yQBTt LOic Ks sPXrq tty oy
dA8 SD BvO daZ KFPr44X
X0m3BI eR4go YjFp7e vbJr3oe Y0OGgH3 uPfz yfq59
we rm L9iD ugcJBND daS

7pO lwUFzNE HPlPW fmPZ vpRs Rx EFeHaFM
b0 1B ncr Db324 vwO Un34R
HDZS wq9zg W013 5JGly
kAfP QPpjjyh pXMAw I1 CGKDc23 qCBnP
<<<<<   end: 0.630s

Veya satır numaraları eklenmiş olarak:

from=50000000
  to=50000010
<file_50 head -n "$to" | tail -n +"$from" | nl -v$from -ba -w${#to} | e-sink.pl

Tamponda:

<<<<< start: 2012-09-09T01:53:44
50000000    1000000
50000001    VSjU K97X5Z dFcc ZZd2OqQ PzbnphT
50000002    yQBTt LOic Ks sPXrq tty oy
50000003    dA8 SD BvO daZ KFPr44X
50000004    X0m3BI eR4go YjFp7e vbJr3oe Y0OGgH3 uPfz yfq59
50000005    we rm L9iD ugcJBND daS
50000006    
50000007    7pO lwUFzNE HPlPW fmPZ vpRs Rx EFeHaFM
50000008    b0 1B ncr Db324 vwO Un34R
50000009    HDZS wq9zg W013 5JGly
50000010    kAfP QPpjjyh pXMAw I1 CGKDc23 qCBnP
<<<<<   end: 0.768s

Bunu bir StackOverflow Q / A'da buldum


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.