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.