终端内的Emacs动态更改光标颜色

时间:2012-12-10 17:50:58

标签: emacs terminal elisp

我正在尝试动态地将Emacs中的光标颜色更改为另一种颜色。

我正在使用emacs -nw作为终端Emacs。我正在使用的终端是Rxvt-Unicode(Urxvt)。

由于Emacs不能(我认为)对终端进行更改,(set-cursor-color "red")将无效。为了改变终端的光标颜色,我可以运行 echo -ne '\033]12;red\007'。这会将光标的颜色更改为红色。

我在Emacs中尝试做的是在其中运行此命令。 M-x shell-command RET echo -ne '\033]12;red\007' RET

但是,Emacs将转义回显的字符串并将其打印在窗口的底部,而不是实际对光标进行任何更改。

我真的不知道我能从这里做什么,我不想使用Emacs GUI。有没有人知道这方面的方法?我希望能够根据我当前的模式更改光标的颜色,这就是为什么它需要是动态的。如果有人有任何其他建议我会很高兴听到他们!

2 个答案:

答案 0 :(得分:5)

我认为你想使用send-string-to-terminal

E.g。 (send-string-to-terminal "\033]12;red\007")

答案 1 :(得分:2)

这是一个非常强硬的解决方案 - 我希望有人能找到更好的解决方案:

(suspend-emacs "echo -ne '\\033]12;red\\007'; fg\n")

它的工作原理是暂时将emacs进程和填充命令挂起到底层终端,以使shell更改游标颜色并在此之后恢复emacs。但是,这会导致屏幕闪烁而emacs框架暂时消失。


这是另一个非常糟糕且依赖系统的解决方案:

(shell-command (format "echo -ne '\\033]12;red\\007' > /proc/%d/fd/1" (emacs-pid)))

通过直接将ANSI转义序列发送到终端(通过/proc/PID伪文件系统访问),它(至少在Linux上)起作用。我没有发现这个解决方案比前一个更优雅,但至少它不会使屏幕闪烁。