Gibt es eine Möglichkeit, Eingabeaufforderungen und vorherige Ausgaben im Shell- / Term-Modus nicht mehr zu bearbeiten?

9

Dies ist zugegebenermaßen eine oberflächliche Frage.

Obwohl ansi-termsich das Verhalten beim ersten Öffnen zunächst richtig verhält, scheint es sich nach einigen Befehlen in einen bearbeitbaren Modus zu verwandeln, z. B. wenn ich C-a(Zeilenanfang) gefolgt von C-k(Zeile töten) ausführe, wird die gesamte Eingabeaufforderung gelöscht.

Gibt es für meine ästhetische Vernunft eine Möglichkeit, die Eingabeaufforderungen und die vorherige Ausgabe (für shell) unbearbeitbar zu machen ? (Aktualisiert, um Ansi-Term aufgrund der bedeutenden Unterschiede auszuschließen.)

Ich benutze zsh in Emacs 24.4; Betriebssystem ist LXDE (Ubuntu 14.04) über Virtual Box.

(Idealerweise kann ich meinen Cursor immer noch bewegen ...)

Eismann
quelle
1
Sind Sie zufällig auf einem "seltsamen" Betriebssystem? Normalerweise springt Ca im Shell-Modus nach der Eingabeaufforderung zum Anfang der Befehlszeile, und ein zweites Ca ist erforderlich, um zum Anfang zu springen. Unter Windows und Solaris (in einem früheren Leben) stellte ich normalerweise fest, dass Ca von Anfang an sprang, während es unter MacOS, Linux usw. wie erwartet für mich funktioniert.
Mark Aufflick
@Mark A: Ich habe den ursprünglichen Beitrag aktualisiert, um einige weitere Details aufzunehmen, einschließlich meiner aktuellen Einrichtung.
Iceman
Das beschriebene Verhalten von Ansi-Term klingt so, als hätten Sie entweder standardmäßig oder in den Leitungsmodus gewechselt C-c C-j. Versuchen Sie, diese Standardeinstellung herauszufinden, oder wechseln Sie mit in den Char-Modus C-c C-k.
Wasamasa
1
Da shell-mode/ term-modebzw. nicht / nicht abgeleitet sind comint-mode, stellen Sie hier gleichzeitig zwei sehr unterschiedliche Fragen. Möchten Sie dies in zwei separate Fragen aufteilen?
lila_Pfeile

Antworten:

16

comint -abgeleiteten Modi (wie shell, ielm, ...) Unterstützung Filterfunktionen, der folgende Ausschnitt macht die Ausgabe und prompte Nur - Lese-:

(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)

Was ansi-term(nicht von comint abgeleitet) betrifft , verfügt es über zwei Betriebsmodi, char modedie den Bindungen der Shell und der darin ausgeführten Software so genau wie möglich entsprechen und line modees Ihnen ermöglichen, den Puffer nach Belieben zu bearbeiten. Sie sollten im Allgemeinen in char mode(gebunden an C-c C-k) bleiben und gelegentlich zu line mode(gebunden an C-c C-j) wechseln, um die Befehlsausgabe zu bearbeiten.

Wasamasa
quelle
Das war wirklich hübsch, hat aber aufgehört zu funktionieren… :( Ich habe eine funktionierende Lösung, die wesentlich mehr Code benötigt → github.com/michalrus/dotfiles/commit/…
Michal Rus
Keine Ahnung, arbeitet immer noch für mich am 25.2.
Wasamasa
In gewissem Sinne können Sie diesen Text nicht löschen, aber Sie können einen neuen Text einfügen, der mit diesem unveränderlichen verschachtelt ist.
Michal Rus
1
Ich verstehe, habe das nicht speziell getestet.
Wasamasa
Ups, noch eine Änderung für alle, die suchen. Ich habe schon einige Lücken verpasst. Dieser funktioniert perfekt für mich. github.com/michalrus/dotfiles/blob/…
Michal Rus
2

Beim Mischen termmit scheint shell-modedie Variable comint-use-prompt-regexpgelegentlich gesetzt zu werden. Dies führt zu einem Verhalten, wie Sie es beschrieben haben: Im Shell-Modus C-a wird an den Anfang der Zeile C-kgewechselt und die gesamte Zeile einschließlich der Eingabeaufforderung beendet.

Eine einfache Lösung ist das Zurücksetzen comint-use-prompt-regexpmit C-: (setq comint-use-prompt-regexp nil), wodurch der Shell-Modus gezwungen wird, Texteigenschaften zu verwenden, die den Cursorbewegungstasten bekannt sind.

Eine Beschreibung der Funktionsweise finden Sie im GNU Emacs-Handbuch hier: https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html

ataylor
quelle
1

Versuchen Sie, die Variable comint-prompt-read-onlyan anzupassen t.

Dies wird sich auf shell-modeandere auswirken comint-mode, aber nicht term-mode.

lila_Pfeile
quelle