Jak wyświetlić bieżący tryb Vi podczas używania skrótów klawiszowych Vi w powłoce?


15

Używam skrótów klawiszowych vi w mojej powłoce tcsh.

Teraz nie wiem, w którym trybie vi jestem ( inserttryb lub commandtryb), co prowadzi do dużej frustracji.

Czy ktoś zna sposób na pokazanie bieżącego trybu vi w powłoce? (poprzez włączenie do pytania lub czegoś)

Odpowiedzi:


4

Nie sądzę, aby można było wizualnie określić, w jakim trybie jesteś, ale jeśli trochę zmodyfikujesz swoje zachowanie, nie będzie to miało znaczenia.

Jeśli chcesz być w trybie poleceń, naciśnij klawisz ESC przed wpisaniem polecenia.

Jeśli chcesz być w trybie wstawiania, naciśnij ESC i i przed wpisaniem zawartości.

Skończysz naciskać ESC, ale każdy użytkownik vi, którego kiedykolwiek spotkałem, robi to.


1
Problem polega na tym, że w powłoce dodatkowe ESC nie są ignorowane - kiedy dam dodatkowe ESC, a następnie wpisz polecenie (powiedz h, aby przejść w lewo), po prostu wyda sygnał dźwiękowy i nic nie robi.
sundar

2
Przez „dodatkowe ESC” mam na myśli naciśnięcie ESC, gdy jestem już w trybie poleceń - co robię dużo, ponieważ nie wiem, w jakim trybie jestem.
sundar

Masz rację. Używałem go tak długo, że nawet nie zauważam tego zachowania. Ponownie najprostsza odpowiedź. Jeśli naciśniesz ESC ih i nic się nie stanie, naciśnij h ponownie. Myślę, że to otwiera kolejne pytanie. Dlaczego naciśnięcie klawisza ESC w trybie „poleceń” skrótów klawiszowych vi powoduje, że kolejny znak nie jest poprawnie interpretowany? sama vi tego nie robi. Mogę wpisać ESC 10 razy, a następne polecenie nadal działa zgodnie z oczekiwaniami.
Bob Weber,

Kolejna wskazówka, wyłącz dzwonek. Jest to niezwykle denerwujące tylko z powodu, który opisujesz - i ponieważ emituje sygnał dźwiękowy po zakończeniu zakładki. Istnieją różne sposoby wykonania tego w zależności od środowiska.
Bob Weber,

1
Ok, obecnie próbuję tego rozwiązania. Mapowanie Caps Lock to Escape ułatwiło implementację, ale jeszcze nie przyzwyczaiłem się do ESC-i w trybie wstawiania. Mam nadzieję, że wkrótce. > Jeśli wciśniesz ESC ih i nic się nie stanie, wciśnij ponownie h Problem polega na tym, że jest to dość frustrujące i bardzo zakłóca przepływ. To dodatkowa rzecz, o której muszę pomyśleć oprócz polecenia, które formuję. Wolę skróty klawiszowe vi z tego samego powodu, że są one w mojej pamięci mięśniowej i daję jedną rzecz do przemyślenia - tego rodzaju przerwy same w sobie
celują

3

Przejrzałem dokumentację i muszę powiedzieć, że nie mogłem znaleźć sposobu na wykrycie i wyświetlenie bieżącego trybu vi. Mam nadzieję, że masz miłą niespodziankę i ktoś wymyśli rozwiązanie, ale z pewnością nie widzę sposobu na zrobienie tego, o co prosisz.

Myślę, że istnieje sposób, aby to zrobić, ale jest to ogromna przesada dla drobnej irytacji i nie sądzę, że o to ci chodziło, zadając to pytanie. Jeśli to prawda, przestań czytać teraz i ciesz się życiem.

OTOH, jeśli to naprawdę jest twój wkurzony zwierzak i to doprowadza cię do szaleństwa, a ty naprawdę absolutnie desperacko chcesz rozwiązać ten problem, oto mój pomysł, jak to zrobić:

  1. Uzyskaj kopię Advanced Programming in the UNIX (R) Environment autorstwa W. Richarda Stevensa.
  2. Przeczytaj rozdziały o strumieniach i terminalach I / O.
  3. Pobierz kod źródłowy do wyżej wymienionej książki, która zawiera przykład strumienia, który można nakładać warstwami na terminal.
  4. Zaimplementuj obsługę kombinacji klawiszy Esc (lub obu klawiszy zmiany trybu) i wskaż to za pomocą dzwonka lub manipulacji w tle bieżącej linii.

W skrócie, Unix implementuje terminal I / O jako pełny dupleks we / wy między sterownikiem urządzenia a procesem użytkownika, do którego można wstawić moduły. Jest on zorganizowany jako stos, dzięki czemu można warstwować dowolną liczbę strumieni. Suma wstrzykiwanych strumieni tworzy zachowanie terminala we / wy.

Po wprowadzeniu znaku pierwszy moduł może go sprawdzić i przekazać dalej (jeśli chce). Gdy odpowiedź dotrze w przeciwnym kierunku, znów ma szansę ją sprawdzić i przekazać dalej. W ten sposób Ctrl-C jest obsługiwany na wyższym poziomie do normalnego klawisza postaci.

Możesz utworzyć plik binarny implementujący moduł strumienia, który po wywołaniu działa cicho na pierwszym planie, sprawdzając i przekazując wszystkie naciśnięcia klawiszy, wykonując preferowaną akcję na naciśniętych klawiszach. Dla wszystkich celów i celów będzie wyglądało to tak, jakbyś pracował nad powłoką. Oooch Możesz wywołać ten plik binarny w ostatnim (lub pierwszym lub dowolnym) wierszu pliku .tcshrc i nawet nie wiedziałbyś, że tam jest.

Jest to dobry grunt tutaj , ale nie mogłem znaleźć wiele informacji na ten temat, prawdopodobnie dlatego, że jest przeszłości jego prime.


2

Ta strona ma dość szczegółowy skrypt, który ustawia to, co chcesz (i więcej) w Zsh . Być może można go zaadaptować do pracy z tcsh (nie jestem zbytnio zaznajomiony z tą powłoką).


Nie znam też tcsh, ale myślę, że strona, którą pokazałeś, używa widżetów zsh (z zle). Nie sądzę, że inne pociski mają to, ale jeśli tak, zdecydowanie by to załatwiło sprawę.
BrianH

0

Edycja z wiersza poleceń za pomocą tcsh

Istnieją dwa główne tryby edycji wiersza poleceń,
oparte na dwóch najczęściej używanych edytorach tekstu, Emacsie i vi.

W przypadku powiązań vi należy przełączać się między trybami wstawiania i poleceń ;
różne polecenia są przydatne w każdym trybie.

Tryb vi ma dwa tryby podrzędne,tryb wstawiania i polecenia .

  • Domyślnym trybem jest wstawianie .
  • Możesz przełączać się między trybami, naciskającEsc .
  • Alternatywnie, w trybie komend ,
    wpisanie „a” (append) lub „i” (insert) spowoduje powrót do trybu wstawiania
    .

Więcej notatek na stronie tcshdostosowywania, do której prowadzi już link powyżej.


2
Twoje linki prowadzą do książek chronionych prawem autorskim O'Reilly ...
BrianH

0

Miałem dokładnie ten sam problem i przez przypadek znalazłem rozwiązanie. Chociaż ten wątek jest stary, nie mogłem znaleźć żadnej innej witryny, która oferowałaby rozwiązanie, więc zakładam, że publikowanie w tym wątku jest w porządku.

Wystarczy zresetować ustawienia programu terminalowego lub powłoki. Obecnie używam PuTTY i właśnie usunąłem zapisane ustawienia dla zapisanego połączenia i odtworzyłem zapisaną sesję. Działa jak urok.

Mam nadzieję że to pomoże!


0

Proszę zobaczyć moją odpowiedź na SO . Bash 4.4 / Readline 7.0 doda obsługę tej funkcjonalności, aw międzyczasie opublikowałem łatane wersje Bash 4.3 / Readline 6.3 do github .


0

Dla każdego, kto ma dokładnie ten problem (jak ja): Znalazłem rozwiązanie w Stackoverflow . Najwyraźniej istnieje natywna obsługa tego w readline, więc możesz po prostu dodać następujące elementy do ~/.inputrc:

set show-mode-in-prompt on

Aby dostosować rzeczywiste użycie postaci:

set vi-ins-mode-string "custom-ins"
set vi-cmd-mode-string "custom-cmd"
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.