Czy mogę przyspieszyć wklejanie do vima?

12

Skopiowałem część kodu HTML ze strony internetowej i chciałem zapisać go w pliku. W tym celu rozpocząłem nową vim sesję w oknie terminala, z (nową) nazwą pliku podaną w wierszu poleceń, naciśnij, iaby przejść do trybu wstawiania, a następnie CtrlShift+ Vi czekałem, aż [-- INSERT --]pokaże się na dole i czekałem ...

Ponieważ vimpo kilku sekundach nie reagowałem, otworzyłem „Edytor tekstu” z menu Aplikacje → Akcesoria, wkleiłem tekst (który pojawił się w ułamku sekundy, zapisałem go pod nową nazwą, zamknąłem i zabiłem sesję Vima, która nadal nie zostało zrobione, 1,5 minuty później. Ilość tekstu wynosiła 186 000 w 3200 liniach, nie powiedziałbym, że nadmiernie, ani zbyt długich linii.

Czy istnieje sposób na przyspieszenie tego rodzaju wstawiania vimi / lub czy istnieje wyjaśnienie, dlaczego jest to tak wolne w porównaniu do korzystania z edytora tekstu, który jest okropny i zorientowany myszką?

(% Procesora według topnie przekracza 5%, chociaż mam kilka procesorów wolnych w systemie, więc może to być jakiś problem związany z We / Wy, który nie występuje podczas odczytywania tego samego tekstu z pliku)

Informacje o wersji:
Ubuntu 12.04
Vim: 7.3, z łatkami dostarczonymi przez Ubuntu 12.04
bash: 4.2.25
terminal gnome: 3.4.1.1

Anthon
źródło
1
Wydaje mi się, że jest powolny, ponieważ analizuje dane wejściowe i próbuje je sformatować itp. Nie jestem pewien, czy można to zrobić, ale zakładam, że można tymczasowo wyłączyć tę funkcję w / in vim, wkleić, a następnie włącz go ponownie. Spróbuj także użyć tej :set pastefunkcji, aby sprawdzić, czy to poprawi. Zobacz :help paste, jak opisuje, w jaki sposób vimnie rozróżnia typowania i wklejania.
slm
Spodziewałbym visię też parsowania pliku podczas wczytywania (po zapisaniu sposobu @ l0b0). Ale to działa szybko.
Anthon
To prawda, ale wyobrażam sobie, że musi ponownie przeanalizować wszystko, co już zostało przeanalizowane, + nową postać w trakcie wklejania. Wydaje się, że tak się dzieje, gdy edytujesz plik do pewnego stopnia.
slm
:set pastenie wydaje się naprawdę coś zmienić (nie używam stopera, tylko ściana zegara).
Anthon
OK, to tylko myśl ...
slm

Odpowiedzi:

14

Aby szybko zapisać dużo tekstu ze schowka do pliku, możesz uruchomić cat > file.txt, wkleić zawartość, a następnie nacisnąć Ctrl- d.

Jeśli Xsel zainstalowany, można zrobić :r !xsel, aby wstawić „primary” (aka „myszy”.) Wybór w vim, lub :r !xsel -bwstawić „schowka” ( Ctrl- c) bufor. Możesz także zapisać wybór bezpośrednio do pliku za pomocą xsel >file.txtlub xsel -b >file.txt. Eliminuje to potrzebę oddzielnego wklejania + akcji EOF i pozwala uniknąć drukowania całego bufora kopiowania w terminalu.

Jeśli nie masz Xsela oprócz xclip, odpowiednie polecenia dotyczą xclip -outwyboru podstawowego lub xclip -out -selection clipboardbufora schowka.

l0b0
źródło
1
Dzięki, że to przynajmniej działa bez konieczności powrotu do myszy, a wstawianie pliku do vima (np. Kiedy nie zaczynam od pustego pliku) jest wystarczająco szybkie.
Anthon
Nie rozumiem, dlaczego nie można tego przypisać do ctrl + shift + v, nie ma to absolutnie żadnego sensu.
mchid
2

Jest to problem z opróżnianiem bufora na dysk. Vim stara się zapewnić bezpieczeństwo pracy i nie zakłada, że ​​możesz wpisać kilka tysięcy znaków na sekundę. Przeczytaj :help swap-filekilka szczegółów na temat buforowania. Rozwiązaniem Twojego problemu jest:

Wyłącz plik wymiany vima za pomocą:

vim -n <your file>

lub z poziomu vima przed wklejeniem:

:set noswapfile

Zobacz :help swapfilepo więcej szczegółów.

Inną opcją jest po prostu wyłączenie synchronizacji z dyskiem pliku wymiany, :set swapsync=ale ta opcja wymaga więcej naciśnięć klawiszy do cofnięcia i jestem leniwy. :)

Wyłączenie zamiany nie jest bezpieczne dla normalnych operacji! Natychmiast po wklejeniu użyj :set swapfilealbo, :set swapsync=fsyncaby przywrócić normalne zachowanie (choć technicznie rzecz biorąc, normalne zachowanie mogło być zsynchronizowane, a nie fsync , sprawdź :set swapsync?wcześniej, czy chcesz wybrać tę trasę).

linux_sa
źródło
1
nie przyspieszyło to dla mnie ...
elig
1

Jeśli masz xterm_clipboardfunkcję, możesz użyć rejestrów *i +. Rejestry te łączą się z głównym buforem wyboru X11 i schowkiem (odpowiednio).

Dlatego jeśli skopiowałeś coś przez CTRL+ c, możesz wkleić go w vimie "+p.

Jeśli po prostu zaznaczyłeś go bez kopiowania, możesz go wkleić "*p.
Możesz również ustawić *bufor jako domyślny :set clipboard=unnamed. Następnie dowolne yank ( y), paste ( p) itp., Które nie określają rejestru, użyją *rejestru. Dodano także Vima 7.3.74 clipboard=unnamedplus, który +domyślnie będzie korzystał z rejestru.

Można również kopiować rzeczy do pierwotnych selekcji i schowka buforów przez szarpanie, na przykład: "+yy.

 

Pamiętaj, że jak wspomniano, wszystkie te funkcje wymagają tej xterm_clipboardfunkcji. Możesz sprawdzić, czy masz tę funkcję, robiąc :versionwewnątrz vima lub vim --versionz powłoki i poszukaj +xterm_clipboard. Jeśli to mówi -xterm_clipboard, nie masz go i musiałbyś ponownie skompilować vima.

Patrick
źródło
Nie mam tej funkcji. Czy przekompilowanie pomocy nawet vim nie działa pod Xterm? (Używam terminala gnome).
Anthon
@Anthon Jeśli używasz GUI VIM, to myślę, że rejestry są również włączone. xterm_clipboardjest tylko w przypadku uruchamiania vima z terminala.
Patrick
To jest tylko tekst, bez GUI VIM, ale nie działa z xterm.
Anthon
Przepraszam, że źle odczytałem. Tak xterm_clipboarddotyczy dowolnego emulatora terminala, nie tylko xterm. Sam używam urxvt.
Patrick