Est-il possible de rendre les invites et les sorties précédentes non modifiables en mode shell / terme?

9

C'est certes une question superficielle.

Bien que ansi-termcommence à se comporter correctement lorsque je l'ouvre pour la première fois, il semble se dégrader en mode `` modifiable '' après quelques commandes, par exemple, lorsque je le fais C-a(début de la ligne) suivi de C-k(tuer la ligne), il efface toute l'invite.

Pour ma raison d'esprit, y a-t-il un moyen de rendre les invites et la sortie précédente non modifiables (pour shell)? (Mis à jour pour exclure ansi-term compte tenu des différences significatives.)

J'utilise zsh dans Emacs 24.4; Le système d'exploitation est LXDE (Ubuntu 14.04) via Virtual Box.

(Idéalement, je serais toujours en mesure de déplacer mon curseur ...)

homme de glace
la source
1
Êtes-vous sur un système d'exploitation "étrange" par hasard? Habituellement, en mode shell, Ca saute au début de la ligne de commande, après l'invite, et un deuxième Ca est nécessaire pour sauter au tout début. Sur Windows et Solaris (dans une ancienne vie), je trouvais généralement que Ca a sauté au tout début, alors que sur MacOS, Linux, etc., cela fonctionne comme prévu pour moi.
Mark Aufflick
@Mark A: J'ai mis à jour le message d'origine pour inclure quelques détails supplémentaires, y compris ma configuration actuelle.
iceman
Le comportement décrit des sons à long terme comme si vous étiez passé en mode ligne par un étrange défaut ou C-c C-j. Essayez de trouver cette valeur par défaut ou passez en mode char avec C-c C-k.
wasamasa
1
Puisque shell-mode/ term-moderespectivement ne dérivent pas de comint-mode, vous posez ici deux questions très différentes en même temps. Voulez-vous diviser cela en deux questions distinctes?
purple_arrows

Réponses:

16

COMINT modes (comme dérivée de shell, ielm, ...) les fonctions de support de filtre, l'extrait suivant rend la sortie et rapide en lecture seule:

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

Quant à ansi-term(qui n'est pas dérivé de comint ), il propose deux modes de fonctionnement, char modequi restent aussi fidèles que possible aux liaisons du shell et du logiciel qui y fonctionne et line modequi vous permettent d'éditer le tampon à votre guise. Vous devez généralement rester dans char mode(lié à C-c C-k) et parfois basculer sur line mode(lié à C-c C-j) pour modifier la sortie de la commande.

wasamasa
la source
C'était vraiment joli, mais a cessé de fonctionner… :( J'ai une solution de travail qui prend beaucoup plus de code → github.com/michalrus/dotfiles/commit/…
Michal Rus
Dunno, travaille toujours pour moi sur 25.2.
wasamasa
En un sens, vous ne pouvez pas supprimer ce texte, mais vous pouvez en insérer de nouveaux, entrelacés avec celui immuable.
Michal Rus
1
Je vois, n'a pas testé cela spécifiquement.
wasamasa
Oups, un changement de plus pour tous ceux qui cherchent. J'ai manqué quelques failles avant. Celui-ci fonctionne parfaitement pour moi. github.com/michalrus/dotfiles/blob/…
Michal Rus
2

Lors du mélange termavec shell-mode, la variable comint-use-prompt-regexpsemble être définie de temps en temps. Cela provoque un comportement un peu comme vous l'avez décrit: en mode shell C-a ira au début de la ligne, C-ktuera toute la ligne, y compris l'invite.

Une solution simple consiste à réinitialiser comint-use-prompt-regexpavec C-: (setq comint-use-prompt-regexp nil), forçant le mode shell à utiliser les propriétés de texte dont les touches de déplacement du curseur sont conscientes.

Il y a une description de comment cela fonctionne dans le manuel GNU Emacs ici: https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html

ataylor
la source
1

Essayez de personnaliser la variable comint-prompt-read-onlyen t.

Cela affectera shell-modeet d'autres dériveront comint-mode, mais pas term-mode.

purple_arrows
la source