Używanie kluczy VI do edycji poleceń powłoki w systemie UNIX


28

Kiedyś miałem współpracownika, który był naprawdę dobry w UNIX.

Pokazał mi, jak używać skrótów klawiszowych Vi do edytowania poleceń powłoki.

Umieścił polecenie w pliku, który był uruchamiany przy każdym logowaniu.

Od tego czasu przeprowadziłem się do innego projektu.

Niestety nie pamiętam, jak to skonfigurować.

Czy jest tu ktoś, kto wie, jak używać powiązań klawiszy Vi do edytowania poleceń w terminalu?

Jak mogę ustawić to ustawienie na stałe?

Odpowiedzi:


31

Mówisz o najlepszej funkcji w historii!

Możesz użyć poleceń vi do edycji poleceń powłoki (i historii poleceń), dodając to do swojego .bashrcpliku:

set -o vi

Możesz także uruchomić to polecenie z wiersza poleceń, aby wpłynąć tylko na bieżącą sesję.

Jeśli nie używasz bash, zamień odpowiedni plik rc na swoją powłokę.


To pozwala używać komend vi do edycji dowolnego polecenia ...

Możesz także używać ji, kaby poruszać się po swojej historii (po naciśnięciu ESC).

Możesz także użyć /(po naciśnięciu ESC), aby wyszukać stare polecenia.

Innymi słowy, aby znaleźć to bardzo długie cppolecenie, które wykonałeś dziesięć minut temu:

ESC/cpENTER

Następnie możesz przewijać wszystkie pasujące polecenia w historii za pomocą ni N.

Wszystko to sprawia, że ​​jestem 10 trylionów razy wydajniejszy w linii poleceń!


4
Cóż, tak naprawdę to nie używa vi, używa poleceń klawiaturowych w stylu vi do edycji linii.

4
Jasne ... Wydaje mi się, że odpowiednia terminologia to vi bindings in the shellnajlepsza funkcja, jaką kiedykolwiek wymyślono!
jahroy

Przełączałbym się z powiązań emacsa na powiązania vi, gdyby istniał sposób wyświetlenia tego trybu. Czy wiesz jak to zrobić?
iconoclast

Czy istnieje sposób, aby się jjz nimi związać, ESCjak to zwykle robimy w vimie?
steveyang

@yangchenyun - Może to pytanie pomoże w tym: stackoverflow.com/questions/844862/… Nie osobiście wiążę / zmieniam żadnych poleceń, więc nie jestem pewien, o co pytasz.
jahroy

12

Jeśli używasz basha, ponieważ jahroy i evil otto już odpowiedziały, możesz użyć

set -o vi

spowodować, aby bash używał poleceń edycji w stylu vi.

Gdy to zrobisz, możesz wpisać, Esc vaby uruchomić edytor vi z plikiem tymczasowym zawierającym kopię bieżącego wiersza poleceń. Możesz edytować polecenie, nawet zastępując je wieloma wierszami; po zapisaniu pliku ( :wq) powłoka wykona edytowane polecenia.

Jeśli wolisz

set -o emacs

możesz użyć, Ctl-XCtl-Eaby zrobić to samo. Będzie używać preferowanego edytora $EDITOR, niekoniecznie emacsa.

(Osobiście używam vi (właściwie vim) do większości moich edycji, ale wolę set -o emacsw powłoce; włączanie i wyłączanie trybu wstawiania jest świetne do edycji plików, ale niewygodne dla poleceń interaktywnych. YMMV.)


znasz sposób powrotu do normalnego trybu edycji, unikając stylu vi? Pamiętam, jak odniosłem sukces z bł. Numem, ale teraz już nie; czego mi brakuje?
piertoni

@piertoni: Nie set -o emacsrobi tego, co chcesz?
Keith Thompson,

Tak, działa, nie trafiłem w sedno, dzięki
piertoni

10

Możesz użyć set -o vido zmiany poleceń edycji wiersza, jak napisano @jahroy, ale możesz myśleć o fcpoleceniu (dostępne w bash i myślę, że ksh, ale prawdopodobnie nie tcsh), który umieści poprzednie polecenie w edytorze (FCEDIT lub EDITOR , który prawdopodobnie ustawiłeś na vi), a następnie wykonuje polecenie po wyjściu z edytora. Zobacz stronę podręcznika lub help fcszczegóły, lub po prostu wypróbuj.


5
alias r='fc -e -'jest cennym aliasem do ponownego uruchomienia poprzednich poleceń. fcsama w sobie pochodzi z powłoki Korna. Możesz określić polecenia według numeru ( fc 123 129aby edytować numery poleceń 123 do 129 w historii). Możesz podać liczby względne ( fc -10 -1aby edytować 10 ostatnio wprowadzonych poleceń). Możesz wyświetlić listę poprzednich poleceń za pomocą fc -l. Możesz podać polecenie za pomocą prefiksu z raliasem ( r makeuruchamia ostatnie wywołanie make; tak samo, r mjeśli nie uruchomiłeś mvpolecenia od ostatniego uruchomienia makeitp.).
Jonathan Leffler,

6

Aby edytować ostatnio używane polecenie w vimie i wywołać edytowaną wersję po zapisaniu i zamknięciu edytora, użyj fcwbudowanej powłoki. Bez żadnych argumentów wykona następujące czynności:

  1. Tworzy plik tymczasowy /tmpi wypełnia go ostatnio wpisanym poleceniem
  2. Po normalnym wyjściu edytora (z kodem wyjścia 0) wykonuje polecenie znalezione w tym pliku tymczasowym i usuwa ten plik. Edytowana wersja jest zapisywana w historii jako zwykłe polecenie (przynajmniej w Zsh). Nie wykonuje niczego, jeśli edytor kończy działanie kodem innym niż zero (vim można to osiągnąć przez zabicie go lub użycie :cquit).

Polecenie działa zarówno w bash, jak i zsh.


5

Rzeczywiście, jest to w rzeczywistości największa funkcja w historii. Jest jednak więcej:

Utwórz plik o nazwie

.editrc

zawierający linię

bind -v

Editline , to biblioteka wersji na licencji BSD, która zapewnia usługi podobne do readline. To .editrc ustawi twoje skróty klawiszowe w tryb vi w powłoce wiersza poleceń MySQL lub w dowolnej aplikacji, która nie używa readline.

Z biegiem lat trochę zapomniałem, więc mój .zshrc pozyskuje niektóre opakowania dla trybu vi, aby pokazać mi, w jakim trybie jestem w wierszu poleceń. To miłe.

Wiem, że w Zsh możesz pisać

bindkey -L

i uzyskaj listę skrótów klawiszowych. Jestem pewien, że bash musi mieć coś podobnego. Nie wszystkie klucze vi są domyślnie powiązane. Powiąż ich, jak uważasz za stosowne, i ruszasz do wyścigów.


Żałuję, że nie mogłem jeszcze 5 razy zagłosować za powiązaniami vi w MySQL!
jahroy

1

w swoim terminalu wpisz export EDITOR=vi.

Aby zapisać to ustawienie. umieść tę linię w pliku ~ / .profile


5
To ustawia domyślny edytor (dla poleceń, na które należy zwrócić uwagę $EDITOR) vi. Nie pozwala edytować poleceń powłoki vi(przynajmniej nie bezpośrednio).
Keith Thompson,

2
@KeithThompson Zsh domyślnie przechodzi w tryb edycji vi, jeśli $EDITORzawiera vi. Myślę, że to jedyna powłoka, która to robi.
Gilles „SO- przestań być zły”
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.