Alguma maneira de tornar prompts e resultados anteriores não editáveis ​​no modo shell / termo?

9

Esta é, sem dúvida, uma questão superficial.

Embora ansi-termcomece a se comportar corretamente quando o abro pela primeira vez, parece degradar para um modo 'editável' após alguns comandos; por exemplo, quando eu faço C-a(início da linha) seguido por C-k(linha da morte), apaga todo o prompt.

Para minha sanidade estética, há alguma maneira de tornar os prompts e resultados anteriores não editáveis ​​(para shell)? (Atualizado para excluir ansi-term, dadas as diferenças significativas.)

Estou usando o zsh no Emacs 24.4; O SO é LXDE (Ubuntu 14.04) via Virtual Box.

(Idealmente, eu ainda seria capaz de mover meu cursor ...)

homem do gelo
fonte
11
Você está em um sistema operacional "estranho" por acaso? Geralmente, no modo shell, o Ca salta para o início da linha de comando, após o prompt, e um segundo Ca é necessário para saltar para o início. No Windows e Solaris (em uma vida anterior), normalmente descobri que o Ca saltou desde o início, enquanto no MacOS, Linux etc. funciona como esperado para mim.
Mark-Aufflick
@ Mark A: Atualizei a postagem original para incluir mais alguns detalhes, incluindo minha configuração atual.
iceman 31/10
O comportamento descrito do termo ansi parece que você mudou para o modo de linha por um padrão estranho ou C-c C-j. Tente descobrir esse padrão ou alterne para o modo char com C-c C-k.
wasamasa
11
Como shell-mode/ term-moderespectivamente não derivam comint-mode, você está fazendo duas perguntas muito diferentes ao mesmo tempo aqui. Mente em dividir isso em duas perguntas separadas?
purple_arrows

Respostas:

16

os modos derivados de comint (como shell, ielm...) suportam funções de filtro, o seguinte snippet torna a saída e o prompt somente leitura:

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

Quanto ao ansi-term(que não é derivado do comint ), ele possui dois modos de operação, char modeque permanecem os mais verdadeiros para as ligações do shell e o software em execução, tanto quanto possível, e line modeque permite editar o buffer como desejar. Geralmente você deve permanecer em char mode(vinculado a C-c C-k) e ocasionalmente alternar para line mode(vinculado a C-c C-j) para editar a saída do comando.

wasamasa
fonte
Este foi realmente bonito, mas parou de funcionar ... :( Eu tenho uma solução de trabalho que leva muito mais código → github.com/michalrus/dotfiles/commit/...
Michal Rus
Não sei, ainda funciona para mim em 25.2.
wasamasa
De certo modo, você não pode excluir este texto, mas pode inserir uma nova intercalação com esse texto imutável.
Michal Rus
11
Entendo, não testei isso especificamente.
Wasamasa
Opa, mais uma mudança para quem procura. Eu perdi algumas brechas antes. Este funciona perfeitamente para mim. github.com/michalrus/dotfiles/blob/…
Michal Rus
2

Ao misturar termcom shell-mode, a variável comint-use-prompt-regexpparece ser ajustada ocasionalmente. Isso causa um comportamento semelhante ao que você descreveu: no modo shell, C-a irá para o início da linha, C-kmatará toda a linha, incluindo prompt.

Uma solução simples é para repor comint-use-prompt-regexpcom C-: (setq comint-use-prompt-regexp nil), forçando modo shell para usar as propriedades de texto que chaves do movimento do cursor estão conscientes.

Há uma descrição de como isso funciona no manual do GNU Emacs aqui: https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html

ataylor
fonte
1

Tente personalizar a variável comint-prompt-read-onlypara t.

Isso afetará shell-modee outros derivados comint-mode, mas não term-mode.

purple_arrows
fonte