2012-12-10 50 views
7

我試圖將Emacs裏面的光標顏色動態地改爲另一種顏色。終端內的Emacs動態地改變光標顏色

我對終端Emacs使用emacs -nw。我正在使用的終端是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。有沒有人知道解決這個問題的方法?我希望能夠根據當前模式更改光標的顏色,這就是爲什麼它需要動態。如果有人有任何其他建議,我會很高興聽到他們!

+0

'shell-command'在劣質的shell中運行命令,所以它不會在包含Emacs中生效。我不知道如何讓Emacs直接回顯轉義序列......我嘗試使用(消息...)和轉義序列,但沒有運氣。 – scottfrazer

回答

5

我想你想用send-string-to-terminal

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

+0

看來這是最好的解決方案!非常感謝。讓我感到不得不接受弗朗西斯科的回答,但這個效果最好。同時感謝你們的幫助! – Attic

+0

好了,現在我感覺很愚蠢:(即使我認爲它工作(而且它確實),但是每當我運行該函數時,它都會在編輯器中打印文本本身,所以這不會起作用。這個問題沒有得到回答,但我不得不再次接受弗朗西斯科的回答。我的歉意.. – Attic

+0

這看起來似乎是正確的路要走,但我不明白爲什麼它不起作用預期...(在我的設置中,它不會更改光標顏色並在終端中輸出ANSI序列;我必須運行'M-x redraw-display'來清除它) – Francesco

2

這是一個非常hackish的解決方案 - 我希望有人會找到一個更好的:

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

它的工作原理是Emacs的過程和填充命令暫時中止到底層終端,使外殼改變光標顏色並在此之後恢復emacs。但是,這會導致屏幕閃爍,而emacs幀暫時消失。


這裏是另一個非常hackish的和依賴於系統的解決方案:

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

它的工作原理(至少在Linux上)直接發送ANSI轉義序列給終端(其通過/proc/PID訪問僞文件系統)。我沒有發現這個解決方案比上一個更優雅,但至少它不會讓屏幕閃爍。

+0

這似乎工作,屏幕閃爍有點煩人,但可能沒有更好的方法。如果有人能想出一個更好的方法,那將是很棒的。 – Attic

+0

即使它不「優雅」,它的作品!非常感謝這個解決方案! – Attic