Coś, co znalazłem przydatne w innych edytorach, to możliwość:
- weź wybrany tekst
- uruchom polecenie zewnętrzne i przekaż wybór do jego
stdin
- weź zewnętrzne polecenia
stdout
i zastąp je bieżącym wyborem.
W ten sposób możesz napisać przydatne narzędzia tekstowe, które działają na zaznaczeniu, używając dowolnego języka, który potrafi wykonać podstawowe io.
Jak można to zrobić za pomocą vima przy użyciu zaznaczenia? ... pojedynczy znak, słowo, akapit ... itd.
(Bezpośrednio w wierszu polecenia lub za pomocą klawisza?)
Uwaga
Polecenia takie jak !sort
praca na poziomie linii, dlatego zadaję to pytanie, ponieważ chciałbym operować zaznaczeniem. (tzn. tekst, który zostałby usunięty, gdyby x
został naciśnięty).
źródło
sort
polecenie.:sort
?Napisałem wtyczkę o nazwie express.vim, która może w tym pomóc. Wtyczka definiuje operator,
g=
który pozwala ocenić wyrażenie VimScript na podstawie ruchu (lub wyboru wizualnego). Wyświetla monit o wyrażenie, którego można użyćv:val
jako symbolu zastępczego dla tekstu objętego ruchem (lub ponownie wyboru wizualnego).W takim przypadku przydatne wyrażenie użyłoby
system()
funkcji, która uruchamia zewnętrzne polecenie.(Tutaj użyłem
tr
jako prostego przykładowego polecenia zewnętrznego).Sposobem użycia express.vim w przypadku tego problemu byłoby wybranie tekstu w trybie Visual, następnie wpisanie,
g=
a następnie wyrażenie, a następnie naciśnięcieEnter
:Przyznaję, że nie jest łatwy w użyciu. (W rzeczywistości rzadko używam tej wtyczki!) Zastanawiam się nad dodaniem skrótu w celu wywołania zewnętrznego polecenia, na przykład uruchomienia wyrażenia
!
. Opublikuję tutaj aktualizację, jeśli to zrobię.EDYTOWAĆ
Zmodyfikowałem express.vim, aby traktować wyrażenia zaczynające się od
!
jako poleceń zewnętrznych. Trzymając siętr
przykładu, powyższe staje się znacznie prostsze. Po zaznaczeniu wizualnym wpisz następujące polecenie:Wyjaśnienie:
g=
!tr a-z A-Z
jako wyrażenieEnter
źródło
Szukasz poleceń filtrujących w Vimie. Zobaczyć
:help filter
. Oto odpowiednia dokumentacja:Więc pisanie
5!!sort
posortuje kolejne 5 wierszy, zaczynając od kursora.źródło
tr [:lower:] [:upper]
vim, vim będzie przechowywał nie tylko to słowo, ale całą linię.Pamiętaj, że można to zrobić za pomocą:
s^R=system('tr a-z A-Z', @")[:-2]^M
(z^R
CTRL + R i ^ M z ENTER)Może również działać ze wszystkim, co robi selekcję + zamienia jak
ci"^R=...
.źródło
v
i przesunięciu kursora) pojawia się błądE16: Invalid range\nE16: Invalid range\nE476: Invalid command
(w systemie Linuxtr
istnieją inne podstawowe polecenia).s
aby przejść do trybu wstawiania lub:s
polecenia?s
z trybu wizualnego, czy uderzasz:
pierwszy?:
Sekwencja kluczy, które napisałem, nie jest zaangażowana. Mapowanie będzie:vnoremap µ s<c-r>=system('tr a-z A-Z', @")[:-2]<cr>
.