Czy istnieje obiekt tekstowy dla całego bufora?

28

Często piszę polecenia takie jak gg"+yGlub ggdGi chciałbym to zrobić bardziej efektywnie, bez konieczności dwukrotnego przesuwania kursora. Czy jest jakieś polecenie, którego mogę użyć, np. y[movement]Aby skopiować cały bufor bez przesuwania kursora?

Losowo 832
źródło

Odpowiedzi:

36

Ponieważ vim używa znaku procentu do odniesienia do bieżącego bufora, możesz go użyć, aby szybko uzyskać wszystko.

:%ybędzie szarpał cały bufor :%y+szarpnie go do +rejestru (i prawdopodobnie do schowka, pod warunkiem, że vim został skompilowany z odpowiednimi opcjami).

:%di :%d+zrobi to samo dla usunięcia.

W każdym z tych przypadków kursor pozostaje na swoim miejscu.

SnoringFrog
źródło
Wow, przez cały ten czas używałem mmgg"+yG`mi nigdy o tym nie myślałem. Dzięki, dzieje się to w .vimrc.
Klamka
@Doorknob zamiast ustawiania i używania znaków, możesz po prostu użyć C-odwukrotnie, aby wrócić.
Ruslan
10

Innym rozwiązaniem jest użycie wtyczki o nazwie vim-textobj-whole . Domyślnie ta wtyczka udostępnia obiekt tekstowy aedla całego bufora, iedla całego bufora, z wyjątkiem początkowych i końcowych pustych linii.

Ta wtyczka zależy od vim-textobj-user tego samego autora, co pozwala użytkownikom wygodnie definiować dowolne obiekty tekstowe. Istnieje wiele wtyczek, które dobrze z tego korzystają.

Yosh
źródło
8

Domyślnie dla całego pliku nie ma obiektu tekstowego, ale można go utworzyć za pomocą omap. W takim przypadku wyglądałoby to mniej więcej tak:

onoremap f :<c-u>normal! mzggVG<cr>`z

Oto podział tego, jak to działa:

onoremap f " make 'f' the text object name
:<c-u> " use <c-u> to prevent vim from inserting visual selection marker at the beginning of the command automatically.
normal! " use normal to make key presses ignoring any user mappings
mzggVG<cr>`z " make a marker in register z, select the entire file in visual line mode and enter the normal command, and go back to the z marker

Uwagi:

Ctrlumoże być używany w trybie wiersza poleceń do usuwania wszystkiego po lewej stronie pozycji kursora. Powodem tego jest to, że jeśli wprowadzisz linię poleceń bezpośrednio z trybu wizualnego, zostanie ona automatycznie wstawiona '<,'>w linii poleceń, a to nie jest to, czego chcemy. Sugeruję również użycie czegoś innego f, ponieważ fzwykle służy do przejścia do następnego szukanego znaku w linii. Na przykład fiprzejdzie do następnego iw bieżącym wierszu.

Odpowiednie tematy pomocy:

:help omap-info
:help :normal
:help c_CTRL-U
:help v_:
Wiecznie zielone drzewo
źródło
Czy można to zrobić, pozostawiając kursor w spokoju?
Random832
@ Random832 Dodanie znaku ``końca spowoduje powrót kursora do poprzedniej lokalizacji.
SnoringFrog,
Obawiam się, że dzięki temu wybór nie zostanie zastosowany do polecenia szarpnięcia. Dzisiaj trochę eksperymentuję.
Random832
1
Dodałem polecenie znacznika do mapowania, powinno ono pozostawić kursor tam, gdzie jest teraz.
EvergreenTree,
2

Oto kilka szybkich i brudnych mapowań umożliwiających wykonanie zadania:

nnoremap yY :%yank <c-r>=v:register<cr><cr>
nnoremap dD :%delete <c-r>=v:register<cr><cr>

Teraz możesz odpowiednio używać yYi dDszarpać / usuwać. Nie jest to tak przyjemne, jak użycie pełnego obiektu tekstowego, ale czasami najprostsze rozwiązania są najlepsze.

Aby uzyskać więcej pomocy, zobacz:

:h :y
:h :d
:h [range]
:h v:register
:h c_ctrl-r
:h @=
Peter Rincker
źródło