Un modo per rendere non modificabili i prompt e l'output precedente in modalità shell / termine?


9

Questa è certamente una domanda superficiale.

Sebbene ansi-terminizi a comportarsi correttamente quando lo apro per la prima volta, sembra degradarsi in una modalità "modificabile" dopo alcuni comandi, ad esempio quando lo faccio C-a(inizio della linea) seguito da C-k(linea di interruzione), cancella l'intero prompt.

Per la mia sanità mentale estetica, c'è un modo per rendere le istruzioni e l'output precedente non modificabili (per shell)? (Aggiornato per escludere ansi-term date le differenze significative.)

Sto usando zsh in Emacs 24.4; Il sistema operativo è LXDE (Ubuntu 14.04) tramite Virtual Box.

(Idealmente sarei ancora in grado di spostare il cursore intorno ...)


1
Sei su un sistema operativo "dispari" per caso? Di solito in modalità shell Ca salta all'inizio della riga di comando, dopo il prompt, ed è necessario un secondo Ca per saltare all'inizio. Su Windows e Solaris (in una vita precedente) di solito ho scoperto che Ca è arrivato all'inizio, dove su MacOS, Linux ecc. Funziona come previsto per me.
Mark Aufflick,

@Mark A: ho aggiornato il post originale per includere qualche dettaglio in più, incluso il mio attuale setup.
iceman

Il comportamento descritto di un termine ansi sembra che tu sia passato alla modalità linea con uno strano default o C-c C-j. Prova a scoprire quel valore predefinito o passa alla modalità char con C-c C-k.
Wasamasa,

1
Dato che shell-mode/ term-moderispettivamente non derivano / non derivano comint-mode, qui stai ponendo due domande molto diverse allo stesso tempo. Ti dispiace dividerlo in due domande separate?
purple_arrows,

Risposte:


16

COMINT modalità -derived (come shell, ielm...) funzioni di filtro supporto, il seguente frammento rende la produzione rapida e di sola lettura:

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

Per quanto riguarda ansi-term(che non deriva da comint ), presenta due modalità operative, char modeche rimangono il più veritiere nei collegamenti della shell e nel software in esecuzione in essa e line modeche consentono di modificare il buffer come preferisci. In genere dovresti rimanere in char mode(associato a C-c C-k) e occasionalmente passare a line mode(associato a C-c C-j) per modificare l'output del comando.


Questo è stato davvero carino, ma ha smesso di funzionare ... :( Ho una soluzione funzionante che richiede molto più codice → github.com/michalrus/dotfiles/commit/…
Michal Rus,

Non so, funziona ancora per me il 25.2.
Wasamasa,

In un certo senso, non è possibile eliminare questo testo, ma è possibile inserire nuovi, interfogli con quello immutabile.
Michal Rus,

1
Vedo, non l'ho testato in modo specifico.
wasamasa,

Oops, un altro cambiamento per chiunque cerchi. Mi mancavano alcune scappatoie prima. Questo funziona perfettamente per me. github.com/michalrus/dotfiles/blob/…
Michal Rus

2

Quando si mescola termcon shell-mode, la variabile comint-use-prompt-regexpsembra essere impostata occasionalmente. Questo provoca un comportamento un po 'come hai descritto: in modalità shell C-a andrà all'inizio della riga, C-kucciderà l'intera riga, incluso il prompt.

Una soluzione semplice è quella di ripristinare comint-use-prompt-regexpcon C-: (setq comint-use-prompt-regexp nil), costringendo modalità shell di utilizzare le proprietà di testo che tasti di movimento del cursore sono a conoscenza.

C'è una descrizione di come funziona nel manuale di Emacs GNU qui: https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html


1

Prova a personalizzare la variabile comint-prompt-read-onlyin t.

Questo influenzerà shell-modee altri derivati comint-mode, ma non term-mode.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.