To pytanie wynika bezpośrednio z odpowiedzi . W tym przypadku nie jestem w stanie zrozumieć części, która mówi:
Pod tym względem jego zachowanie jest bliższe trybowi emacs niż w trybie bash (readline) / ksh / zsh emacs, ale odbiega od wbudowanego edytora wiersza sterownika terminala (w trybie kanonicznym), w którym Ctrl-Wusuwa poprzednie słowo (werase, również w vi ).
Mówimy tutaj o powłokach, a nie edytorach, które są dwoma zupełnie różnymi programami. Co to znaczy, że shell jest w trybie edytora?
PS: Możesz oprzeć swoją odpowiedź na założeniu, że rozumiem, co to jest powłoka i jak używać vima do podstawowej edycji.
Odpowiedzi:
W trybie „vi” możesz edytować / nawigować po bieżącym znaku zachęty powłoki, jak linia w edytorze vi. Możesz na to patrzeć jak jednowierszowy plik tekstowy. Analogicznie w trybie „emacs” możesz edytować / poruszać się po bieżącym wierszu poleceń za pomocą (niektórych) skrótów Emacsa.
Przykład
Na przykład w trybie vi możesz zrobić coś takiego (w bash):
W trybie emacs można trafić np Ctrl+ Aprzeskoczyć na początku linii (VI Ctrl+ [, 0lub ESC, 0). Możesz włączyć tryb emacsa poprzez
set -o emacs
(w bash, ksh, zsh itp.).Czytaj linię
Wiele interaktywnych programów wiersza poleceń (w tym bash ) korzysta z biblioteki readline . W ten sposób możesz skonfigurować tryb wprowadzania (vi lub emacs) i inne opcje w jednym miejscu, tak aby każdy program korzystający z readline miał dokładnie ten sam interfejs edycji / nawigacji.
Na przykład moja konfiguracja readline wygląda następująco:
Na przykład zsh / ksh nie używa readline o ile wiem, ale obsługuje również tryby vi / emacs, które są bardzo podobne do trybu bash / readline.
Oczywiście tryb vi / emacs w powłoce wiersza poleceń jest tylko podzbiorem pełnego zestawu funkcji edytora. Nie każda funkcja ma sens w powłoce wiersza poleceń, a niektóre funkcje są bardziej skomplikowane w obsłudze niż inne.
Tryb kanoniczny
Przed wynalezieniem trybów interaktywnych powłok wiersza poleceń vi / emacs, twoja powłoka używałaby tylko trybu kanonicznego twojego terminala, który zapewnia jedynie ograniczony zestaw poleceń edycyjnych (np. Ctrl+ WDo usunięcia ostatniego słowa.
źródło
set -o | grep 'emacs\|vi'
. Jednak w Zsh (gdzie mam tryb vi) to nie działa.Zauważysz, że kiedy uruchamiasz się
cat
po znaku zachęty powłoki na terminalu,cat
będąc zmuszonym do pisania na standardowe wyjście tego, co czyta ze standardowego wejścia, i naciśnij a, widzisza
echo ze strony sterownika terminala, alecat
tego nie piszea
(widzisz tylko jedena
, ten powtórzony przez sterownik terminalu).Jednak jeśli wpiszesz a Backspace b Enter, nie zobaczysz danych
cat
wyjściowycha\010b\015
, aleb\012
(b
i nowa linia).Wynika to z faktu, że sterownik terminala (mówimy o oprogramowaniu w jądrze, a nie w emulatorze terminala jak
xterm
) implementuje bardzo prosty edytor linii w trybie kanonicznym . Sterownik terminala można skonfigurować przy użyciuioctl()
wywołań systemowych, takich jak przy użyciustty
polecenia. Na przykład, aby wyjść z trybu kanonicznego, możesz to zrobićstty -icanon
. Jeśli zrobisz:Następnie zobaczysz zarówno
echo
(za pomocą którego można było wyłączyćstty -echo
), jak icat
wyjście w tym samym czasie.Ten edytor jest edytorem liniowym. Oznacza to, że użytkownik powinien edytować jeden wiersz tekstu, dopóki nie zostanie przesłany do aplikacji czytającej urządzenie końcowe po naciśnięciu Enter.
Możliwości edytorskie tego edytora są bardzo ograniczone. W większości implementacji są tylko 4 klawisze edycji (w rzeczywistości znaki), które można również konfigurować za pomocą
stty
:^H
lub^?
zwykle): kasowanie poprzedniego znaku^U
zwykle): pusty (kill) wprowadzony dotychczas wiersz^W
): usuwa poprzednie słowo^V
): dosłownie wprowadź następny znak (anuluj specjalne znaczenie wszystkich powyższych)W dawnych czasach sądzono, że ten edytor linii sterowników terminali zostanie rozszerzony o bardziej zaawansowane możliwości. Dlatego żadna z wczesnych powłok nie ma żadnych możliwości edycji wiersza poleceń (uzyskasz te same możliwości edycji wiersza w wierszu poleceń powłoki, gdy działasz
cat
tak, jak to zrobiliśmy powyżej).Jednak tak naprawdę to się nigdy nie zdarzyło, być może po części przyczyną jest bałagan z różnymi terminalami, które nie wysyłają tych samych znaków po niektórych naciśnięciach klawiszy, co pokazało, że nie powinno się tego implementować w przestrzeni jądra.
Dlatego niektóre powłoki zaczęły upuszczać tryb kanoniczny sterownika terminala i implementować własny edytor linii. W tym czasie
emacs
ivi
były najbardziej popularnych edytorów wizualnych z trybu pracy klucza wiążące i zupełnie innego. Wvi
masz jeden tryb do wprowadzania tekstu i jeden do edycji. Wemacs
, zawsze wchodzisz w tryb tekstowy , ale edycja odbywa się przez naciśnięcie kombinacji klawiszy (na przykład,^b
aby przesunąć znak do tyłu).W tym czasie muszle nie miały sensu wymyślać różnych kluczy. Spowodowałoby to frustrację, ponieważ ludzie musieliby się uczyć innej. Jednak wybranie jednego (
emacs
lubvi
) stylu w stosunku do drugiego byłoby pewnym sposobem na wyobcowanie użytkowników drugiego edytora.Według https://www.usenix.org/legacy/publications/library/proceedings/vhll/full_papers/korn.ksh.a :
Zamiast tego wdrożyli oba i interfejs umożliwiający użytkownikom wybór między nimi.
ksh
był najprawdopodobniej pierwszy na początku lat 80. (ponowne użycie kodu, który został napisany osobno w celu dodania trybu vi i trybu emacs do powłoki Bourne'a, jak pokazano powyżej), a następnietcsh
(tcsh
początkowo tylkoemacs
wiązanie klawiszy,vi
tryb został dodany później) i późniejbash
izsh
na początku lat 90.Przełączać się między tymi dwoma trybami
bash
,zsh
alboksh
zset -o vi
alboset -o emacs
izbindkey -e
lubbindkey -v
wtcsh
lubzsh
.POSIX tak naprawdę określa
vi
tryb, a nieemacs
trybsh
(historia mówi, że Richard Stallman sprzeciwił się POSIX określającemacs
trybsh
).Domyślny tryb dla
bash
domena publiczna wariantyksh
(pdksh, mksh, oksh),tcsh
izsh
to w trybie emacs (choćzsh
, tovi
jeśli$EDITOR
znaczyvi
), podczas gdy w AT & Tksh
, to jest głupi tryb chyba$EDITOR
ani$VISUAL
wzmiankivi
lubemacs
.ksh
później dodano takżegmacs
tryb dostosowany do użytkowników Goslinga,emacs
które działały Ctrl+Tinaczej.Teraz obsługa
^W
w trybie emacsaemacs
lub w nimtcsh
prawdopodobnie poprzedzawerase
znak w edytorze linii terminalu, więc nie możemy ich za to winić, a moje stwierdzenie o „odejściu ...” może być postrzegane jako wprowadzające w błąd. To dlatego, że uważam, że to irytujące, gdy coś podobaemacs
,tcsh
alboinfo
zachowują się odmiennie od wszystkiego innego po wpisaniu Ctrl-W. Możesz sobie wyobrazić, że było to o wiele bardziej irytujące, gdy niektóre aplikacje zaczęły zamykać swoje okno podczas pisania Ctrl-W.źródło
pdksh
Analizuje również$EDITOR
dlavi
i przełącza tryby upon starcie; Usunąłem to dlamksh
(zwłaszcza, że i tak naprawdę utrzymuję tylko tryb Emacsa).^W
zamykaniem okien).