NB to nie duplikat Jak działa „d3fg” pracę polecenia? Proszę przeczytać przed głosowaniem, aby zamknąć!
Dochodzę do impasu w mojej misji, aby małe usunięcia działały jak duże . Problem, jaki mam, polega na tym, że nie mogę wymyślić, jak zmienić mapowanie poleceń d3d. W rzeczywistości nie mogę nawet zrozumieć, jak one działają, ani znaleźć wzmianki o nich w pomocy Vima. *
d3jjest prosty: stosuje d
operatora do 3j
ruchu,
3ddjest również prosty: uruchamia dd
polecenie z „liczbą” 3.
d3d wygląda na to, że powinno być proste, stosuje d
operatora do… ale co to jest 3d
? To nie jest ruch. Jeśli 3dpiszesz sam, Vim traktuje go jako liczbę, po której następuje operator, i cierpliwie czeka na dalsze dane.
Nie można stosować operatorów do innych operatorów. ddnie jest opisany w pomocy jako ciąg dwóch operatorów. To osobne polecenie z dwoma naciśnięciami klawiszy. (por dc. nic nie robi).
Nie wydaje się również, aby pozycjonowanie licznika było elastyczne dla poleceń wymagających dwóch naciśnięć klawiszy: 2gjprzesuwa kursor w dół o dwie linie ekranu, ale g2jcałkowicie odrzuca pierwsze dwa naciśnięcia klawiszy i przesuwa kursor o jedną linię.
Jak to działa? Czy to tylko szczególny przypadek w wewnętrznym kodzie Vima? Czy jest jakiś sposób na stworzenie d[count]d
mapowania?
EDYCJA : Czy to obiekt tekstowy? :h text-objects
nie obejmuje go na liście „text poleceń wyboru obiektu”, ale to nie to dd na liście delecji „zgrupowane od małych do dużych obiektów”. I d2awusuwa słowo pod kursorem i następne. Z drugiej strony c2dnic nie robi.
* Jestem pewien, że niektóre wzmianki o nich muszą istnieć, ale nie mogę ich znaleźć. Czytałem :help deleting
, :help motion.txt
i spróbował :helpgrep dNd
dla wszystkich wartości N z 1-9 .
d
działania są potwierdzeniem; Więc to jest tak samo jakd3<CR>
.y3y
ac3c
także działają tak samo ... Nie mogę znaleźć żadnych docs na to jednak zarówno w vim: pomoc, vi (1), nvi (1) lub specyfikacji POSIX ... To nie zachowują się tak samo wvi
invi
btw .dd
jest identyczny zd_
._
przesuwa kursor do pierwszego niepustego[count]
wiersza ( -1) linii w dół, ale jest liniowy, więc po sparowaniu z operatorem działa na całych liniach. Z tego powodu sensowne może być pojawienie się liczby między dwomad
s.Odpowiedzi:
Tryb oczekiwania operatora
Pomiędzy wpisywanie operatora (jak
d
,c
lubgU
) oraz ruchu (takie jakw
,i}
lub/foo<CR>
) vim w trybie operacji rozpatrywanym. Możesz tworzyć mapowania w tym celu za pomocą:omap
i:onoremap
.W moich przykładach, idę do map Operator-pending
d
dow
. Jest to przypadkowy wybór, ponieważ nie wiem, do czego tak naprawdę chciałeś go użyć.Utwórz omap
Utwórzmy mapowanie
d
w trybie oczekiwania operatora. Zakładam, że piszemy VimScript tutaj (np. W twoim.vimrc
), więc pominę wiodące:
s.To sprawia, że
dd
zachowujesz się jakdw
. Sprawia również, że sięd[count]d
zachowujed[count]w
. Ale założę się, że nie chciałeś wpływać na zachowaniedd
(tj. Brak w zestawie[count]
).Odwzorowania wyrażeń
Odwzorowania wyrażeń umożliwiają ocenę wyrażenia VimScript w celu utworzenia odwzorowania po prawej stronie. Wyrażenie powinno być traktowane jako ciąg. Odwzorowania wyrażeń są oznaczone
<expr>
słowem kluczowym.Vim ma również wbudowane zmienne, które zapełniają się w różnych momentach i często są przydatne podczas mapowań. Jednym z nich jest
v:count
, który jest[count]
dostarczany do operatora lub ruchu.Złóżmy to wszystko razem. Jeśli nie
[count]
zostanie podany,v:count
będzie0
.d
W takim przypadku możemy powiedzieć, że nasze mapowanie ma po prostu użyć .Teraz
dd
zachowuje się jak domyślny (usuwa linię), aled[count]d
zachowuje się jakd[count]w
. Chłodny!Ogranicz go do użycia po
d
operatorzeMożesz jednak coś zauważyć. Teraz
cd
też zachowuje się jakcw
. Nie może to stanowić problemu, ale dla kompletności ograniczmy go, aby działał tylko pod
operatorze.Vim ma inną zmienną,
v:operator
która zawiera ostatnio używany operator. Sprawdźmy to również przed zrobieniem czegoś specjalnego.UWAGA: Ponieważ
:map
polecenia można łączyć|
, musimy uciec przed nimi w naszym wyrażeniu. Tak więc logiczny operator OR||
staje się\|\|
.Fajnie, więc
cd
ic[count]d
wróciliśmy do robienia nic, tak jak kiedyś. Jest to dobre, aby inne wtyczki mogły zdefiniowaćcd
.Nie chcę po prostu usunąć innego ruchu
Jeśli chcesz zmapować
d[count]d
coś zupełnie innego, co nie ma nic wspólnego z usuwaniem tekstu, możemy to zrobić.Kiedy wpisujesz polecenia w trybie normalnym i zaczynasz wpisywać polecenie przez pomyłkę, możesz nacisnąć przycisk,
<Esc>
aby anulować to polecenie. To samo dotyczy twoich mapowań.Zróbmy
d[count]d
zmienić bieżącą linię, co[count]
jest.Ostatnia część mapowania jest wyrażeniem VimScript:
<Esc>cc' . v:count . '<Esc>'
. To<Esc>
anuluje oczekująced
polecenie, następniecc
zmienia bieżący wiersz,v:count
wpisuje wartość[count]
(w trybie wstawiania) i<Esc>
powraca do trybu normalnego. Należy pamiętać, że budujemy ciąg tutaj za pomocą operatora konkatenacji VimScript,.
.Rzeczywisty przypadek użycia będzie prawdopodobnie inny niż ten, który tu opisałem, ale mam nadzieję, że pomoże ci to przetoczyć piłkę.
Happy Vimming!
źródło
:omap d d
(!), Ale niestety tryb oczekiwania operatora nigdy nie został osiągnięty z powodu mojego mapowania dla d, które ustawia niestandardową funkcję operatora. Mamy jednak nadzieję, że można tak dostosować rzeczy, abyd3d
działały tak, jak powinny. (Daj mi znać, jeśli masz jakieś pomysły lub napisz kompletne rozwiązanie drugiego pytania, jeśli wolisz.) Jeśli nie będę w stanie szybko tego zrozumieć, zaakceptuję to i opublikuję kolejne, bardziej szczegółowe pytanie. Dzięki!