是否可以显示Emacs中的大写锁定和num lock键是否已打开?我问的原因是因为我是单手打字员并使用FrogPad。 20键设备使用多个shift键序列来具有标准qwerty键盘的全部功能。我会发现在emacs中显示shift,大写锁定和numlock键的状态非常有用。我用谷歌搜索了这个,只能找到关于重新映射密钥的帖子。这甚至可能吗?
答案 0 :(得分:2)
emacs lisp收到的键盘输入的最低级别是keyboard event,它将基本代码与emacs修饰符的开/关设置(meta
相结合, control
,shift
,hyper
,super
和alt
)。由于这种组合,当您例如按住Shift键时,似乎无法学习lisp代码。另请注意,CAPS LOCK或NUM LOCK没有任何表示。
另外,emacs确实区分了newline
和C-m
,但在lisp代码中处于非常低的水平,前者被映射到后者。如果您真的需要血腥的详细信息,请参阅lisp/term/x-win.el
(通常位于/usr/share/emacs/NN.X
下)。
所以,从emacs lisp 中的,我相信不可能做你想做的事。
但是,可以将外部命令中的文本嵌入到emacs模式行中,并定期更新。因此,原则上你可以找到一个返回大写锁定,移位和numlock状态的linux命令,并定期将其注入命令行。这可能并不能真正满足您的需求,因为当您按shift,capslock和numlock时,它不会实时更新模式。但是,如果您想要实现这一目标,请查看display-time-mode
和display-battery-mode
。
答案 1 :(得分:2)
在便携式Emacs中无法实现,但如果您使用的是X11:
(require 'dash)
(require 's)
(defun x-led-mask ()
"Get the current status of the LED mask from X."
(with-temp-buffer
(call-process "xset" nil t nil "q")
(let ((led-mask-string
(->> (buffer-string)
s-lines
(--first (s-contains? "LED mask" it))
s-split-words
-last-item)))
(string-to-number led-mask-string 16))))
(defun caps-lock-on (led-mask)
"Return non-nil if caps lock is on."
(eq (logand led-mask 1) 1))
(define-minor-mode caps-lock-show-mode
"Display whether caps lock is on."
:global t
:lighter (:eval (if (caps-lock-on (x-led-mask)) " CAPS-LOCK" "")))
答案 2 :(得分:1)
在X Server中运行emacs时,您可以编写C程序,连续监视Shift,Caps和Numlock状态,当发生更改时,将其打印到stdout。在emacs中,将此程序作为外部进程运行,使用process-filter处理其输出,最后在模式行中显示Shift,Caps和Numlock状态。