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.