Since command outputs are easily mutable, I have to be careful when I work with eshell and REPL buffers.
Is there a way to protect them?
Emacs Stack Exchange is a question and answer site for those using, extending or developing Emacs. It only takes a minute to sign up.Sign up to join this community
Modes that communicate with external shells should inherit from
eshell is an exception w.r.t this principle since it emulates almost all commands on elisp-base. First, setting output read-only is described for
eshell afterwards for
The following lisp snippet demonstrates the usage of
eshell-output-filter-functions for setting the output read-only.
It is not very sophisticated and not thoroughly tested.
(defun eshell-interactive-output-readonly () "Make output of interactive commands in eshell read-only. This should be the last entry in eshell-output-filter-functions!" (let ((end eshell-last-output-end)) (save-excursion (goto-char end) (end-of-line 0) (setq end (point))) (when (< eshell-last-output-block-begin end) (put-text-property eshell-last-output-block-begin end 'read-only "Read-only interactive eshell output")))) (defun eshell-make-interactive-output-readonly () (add-hook 'eshell-output-filter-functions 'eshell-interactive-output-readonly 'append)) (add-hook 'eshell-mode-hook 'eshell-make-interactive-output-readonly)
It looks like one cannot use
comint-output-filter-functions for setting the command output read-only in
The reason is that
comint-output-filter sets unconditionally the
rear-nonsticky text property to
t. Therefore you can insert text into the output despite of the
read-only-property even if already existing output characters cannot be modified.
The only chance to protect the output is an
comint-output-filter. The following code-snippet demonstrates the principle.
(defadvice comint-output-filter (after output-readonly activate) "Set last process output read-only." (add-text-properties comint-last-output-start (line-end-position 0) '(read-only "Process output is read-only." rear-nonsticky (inhibit-line-move-field-capture))))