Czy jest jakiś sposób, aby monity i poprzednie wyniki były nieedytowalne w trybie powłoki / term?

9

To z pewnością pytanie powierzchowne.

Chociaż ansi-termzaczyna się zachowywać poprawnie, gdy go otwieram po raz pierwszy, wydaje się, że po kilku poleceniach przechodzi w tryb „edytowalny”, np. Kiedy to zrobię C-a(początek linii), a następnie C-k(zabijanie linii), wymazuje cały monit.

Jeśli chodzi o moje zdrowie psychiczne, czy istnieje sposób, aby podpowiedzi i poprzednie wyniki były nieedytowalne (dla shell)? (Zaktualizowano, aby wykluczyć ansi-term z uwagi na znaczące różnice).

Używam zsh w Emacs 24.4; System operacyjny to LXDE (Ubuntu 14.04) przez Virtual Box.

(Idealnie nadal byłbym w stanie poruszać kursorem ...)

lodziarz
źródło
1
Czy przypadkiem używasz „dziwnego” systemu operacyjnego? Zwykle w trybie powłoki Ca przeskakuje na początek wiersza poleceń, po monicie, a drugi Ca jest potrzebny, aby przejść do samego początku. W systemach Windows i Solaris (w poprzednim życiu) zwykle stwierdziłem, że Ca od samego początku, w MacOS, Linux itp. Działa zgodnie z oczekiwaniami.
Mark Aufflick
@Mark A: Zaktualizowałem oryginalny post, aby zawierał kilka dodatkowych szczegółów, w tym moją obecną konfigurację.
lodeman
Opisane zachowanie ansi-term brzmi, jakbyś przeszedł do trybu liniowego przez dziwne ustawienie domyślne lub C-c C-j. Spróbuj dowiedzieć się, czy to ustawienie domyślne, lub przejdź do trybu char za pomocą C-c C-k.
wasamasa
1
Ponieważ shell-mode/ term-modeodpowiednio nie / nie pochodzą comint-mode, zadajesz tutaj dwa bardzo różne pytania jednocześnie. Może podzielisz to na dwa osobne pytania?
purple_arrows

Odpowiedzi:

16

tryby generowane przez komendę (takie jak shell, ielm...) obsługują funkcje filtrów, następujący fragment kodu powoduje, że dane wyjściowe i monit są tylko do odczytu:

(setq comint-prompt-read-only t)

(defun my-comint-preoutput-turn-buffer-read-only (text)
  (propertize text 'read-only t))

(add-hook 'comint-preoutput-filter-functions 'my-comint-preoutput-turn-buffer-read-only)

Jeśli chodzi o ansi-term(który nie pochodzi z komendy ), ma dwa tryby działania, char modektóry pozostaje jak najbardziej zgodny z powiązaniami powłoki i uruchomionego w niej oprogramowania i line modektóry pozwala ci edytować bufor, jak chcesz. Zasadniczo powinieneś pozostać w char mode(związany z C-c C-k) i czasami przełączyć się na line mode(związany z C-c C-j) w celu edycji danych wyjściowych polecenia.

wasamasa
źródło
To było naprawdę ładne, ale przestało działać… :( Mam działające rozwiązanie, które wymaga znacznie więcej kodu → github.com/michalrus/dotfiles/commit/…
Michal Rus
Dunno, nadal działa dla mnie na 25.2.
wasamasa,
W pewnym sensie nie można usunąć tego tekstu, ale można wstawić nowy, przeplatając z tym niezmiennym.
Michał Rus
1
Rozumiem, nie testowałem tego specjalnie.
wasamasa
Ups, jeszcze jedna zmiana dla każdego, kto szuka. Wcześniej brakowało mi kilku luk. Ten działa dla mnie idealnie. github.com/michalrus/dotfiles/blob/…
Michal Rus
2

Po zmieszaniu termz shell-modezmienna comint-use-prompt-regexpwydaje się ustawić sporadycznie. Powoduje to zachowanie trochę tak, jak opisałeś: w trybie powłoki C-a przejdzie na początek linii, C-kzabije całą linię, łącznie z pytaniem.

Prostym rozwiązaniem jest zresetowanie comint-use-prompt-regexpz C-: (setq comint-use-prompt-regexp nil)zmuszając trybie powłoki do wykorzystania właściwości tekstu, które klawisze przemieszczania kursora są świadomi.

Opis tego, jak to działa, znajduje się w podręczniku GNU Emacs: https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html

ataylor
źródło
1

Spróbuj dostosować zmienną comint-prompt-read-onlydo t.

Wpłynie to na shell-modeinne i wywodzą się z nich comint-mode, ale nie na ich podstawie term-mode.

strzałki fioletowe
źródło