Emacs: Otwórz bufor ze wszystkimi liniami między liniami X do Y z dużego pliku


10

W tym samym duchu, co inne pytanie: linia kota X do linii Y dużego pliku :

Czy istnieje sposób na otwarcie z poziomu Emacsa (i wyświetlenie w buforze) danego zestawu linii (np. Wszystkich linii między linią Xa Y) z dużego pliku tekstowego?

Np. Otwórz i pokaż w buforze wszystkie linie między liniami 57890000 i 57890010 z pliku huge.txt

Aktualizacja: Interesuje mnie rozwiązanie, które przynajmniej może otwierać linie tylko do odczytu (tylko do celów wyświetlania), chociaż byłoby świetnie, gdybym mógł również edytować linie (i zapisać do oryginalnego pliku).


Czy chcesz tylko to zobaczyć, a nawet edytować?
choroba

1
A może od wewnątrz ed? 57890000,57890010p
Kevin

Odpowiedzi:


7

Jeśli chcesz otworzyć cały plik (co wymaga), ale pokaż tylko jego część w oknie edytora, użyj zawężania . Wybierz część bufora, nad którą chcesz pracować, i naciśnij C-x n n( narrow-to-region). Powiedz „tak”, jeśli pojawi się monit o wyłączonym poleceniu. Naciśnij C-x n w( widen), aby ponownie zobaczyć cały bufor. Jeśli zapiszesz bufor, wybierany jest cały plik: wszystkie dane wciąż tam są, zwężenie ogranicza tylko to, co widzisz.

Jeśli chcesz wyświetlić część pliku, możesz wstawić go do bieżącego bufora za shell-commandpomocą przedrostka argument ( M-1 M-!); uruchom odpowiednią komendę, aby wyodrębnić pożądane linie , np <huge.txt tail -n +57890001 | head -n 11.

Istnieje również funkcja Lisp, insert-file-contentsktóra może przyjmować zakres bajtów. Możesz go wywołać za pomocą M-:( eval-expression):

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

Pamiętaj, że możesz napotkać limit wielkości całkowitych (zależnie od wersji i platformy, sprawdź wartość most-positive-fixnum).

Teoretycznie byłoby możliwe napisanie trybu Emacsa, który ładuje i zapisuje części plików w sposób przezroczysty w razie potrzeby (choć ograniczenie wielkości całkowitych uniemożliwiłoby użycie rzeczywistych przesunięć plików na komputerach 32-bitowych). Jedyny wysiłek w tym kierunku, jaki znam, to VLF (link do GitHub tutaj ).


1

Może ci się przydać ta kombinacja perla i elisp . Umożliwia przesyłanie danych do bufora. Kolejne wywołania przy użyciu tej samej nazwy bufora dołączą nowe wiersze do tego samego bufora.

Możesz „edytować” bufor , ale edycja w żaden sposób nie odzwierciedla powrotu do źródła (którym jest potok ) ... Nie pokazuje żadnych numerów linii, ale możesz dostosować dane wejściowe, aby zawierały numerowany prefiks dla każdego linia.

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

W buforze:

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

Lub z dodanymi numerami linii:

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

W buforze:

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

Znalazłem to na StackOverflow Q / A


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.