有什么方法可以使提示和先前输出在shell / term-mode下不可编辑?


9

诚然,这是一个肤浅的问题。

尽管ansi-term在我第一次打开它时开始表现正确,但是在执行一些命令后,它似乎会降级为“可编辑”模式,例如,当我执行C-a(行首)后紧接着是C-k(杀死行)时,它会清除整个提示。

出于我的审美习惯,是否有任何方法可以使提示和以前的输出不可编辑(用于shell)?(鉴于有意义的差异,已更新以排除ansi-term。)

我在Emacs 24.4中使用zsh;通过Virtual Box的操作系统是LXDE(Ubuntu 14.04)。

(理想情况下,我仍然可以移动光标...)


1
您是否正在使用“奇数”操作系统?通常在shell模式下,Ca会在提示跳到命令行的开始,并且需要第二个Ca才能跳到最开始。在Windows和Solaris上(以前的生活中),我通常发现Ca从一开始就起步,在MacOS,Linux等上狂奔。它按我的预期工作。
2014年

@Mark A:我已经更新了原始帖子,以包括更多详细信息,包括当前的设置。
iceman

所描述的ansi-term行为听起来就像您已通过怪异的default或切换到线路模式C-c C-j。尝试找出默认值或使用切换到char模式C-c C-k
wasamasa 2014年

1
由于shell-mode/ term-mode分别不是/不从派生的comint-mode,因此您在此处同时询问两个非常不同的问题。介意将此分为两个独立的问题吗?
Purple_arrows 2014年

Answers:


16

comint派生的模式(如shell,,ielm...)支持过滤器功能,以下代码段使输出和提示为只读:

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

至于ansi-term(不是从comint派生而来的),它具有两种操作模式,char mode它们与外壳和其中运行的软件的绑定保持真实,并line mode允许您根据需要编辑缓冲区。通常,您应该停留在char mode(绑定到C-c C-k),偶尔切换到line mode(绑定到C-c C-j)以编辑命令输出。


这真的很漂亮,但是停止了工作……:(我有一个工作解决方案,需要更多的代码→ github.com/michalrus/dotfiles/commit/…
Michal Rus

Dunno,仍然在25.2上为我工作。
wasamasa

从某种意义上说,确实可以删除该文本,但是可以插入新的文本,并与该不可变的文本进行交织。
Michal Rus

1
我知道,没有专门测试。
wasamasa '17

糟糕,任何寻找的人都可以再换一次。我以前错过了一些漏洞。这对我来说很完美。github.com/michalrus/dotfiles/blob/…–
米歇尔·鲁斯

2

term与混合时shell-mode,变量comint-use-prompt-regexp似乎偶尔会被设置。这会导致行为有点像您描述的那样:在shell模式下, C-a将转到行的开头,C-k将杀死整行,包括提示。

一个简单的解决方法是重新comint-use-prompt-regexpC-: (setq comint-use-prompt-regexp nil),迫使壳方式使用文本属性,其光标移动键都知道的。

在GNU Emacs手册中,有关于此工作原理的描述:https : //www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html


1

尝试将变量自定义comint-prompt-read-onlyt

这将影响shell-mode和其他人衍生出来的comint-mode,但不会term-mode

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.