在Emacs中显示大写锁定,num lock和shift键的状态

时间:2011-07-10 02:43:35

标签: emacs elisp

是否可以显示Emacs中的大写锁定和num lock键是否已打开?我问的原因是因为我是单手打字员并使用FrogPad。 20键设备使用多个shift键序列来具有标准qwerty键盘的全部功能。我会发现在emacs中显示shift,大写锁定和numlock键的状态非常有用。我用谷歌搜索了这个,只能找到关于重新映射密钥的帖子。这甚至可能吗?

3 个答案:

答案 0 :(得分:2)

emacs lisp收到的键盘输入的最低级别是keyboard event,它将基本代码与emacs修饰符的开/关设置(meta相结合, controlshifthypersuperalt)。由于这种组合,当您例如按住Shift键时,似乎无法学习lisp代码。另请注意,CAPS LOCK或NUM LOCK没有任何表示。

另外,emacs确实区分了newlineC-m,但在lisp代码中处于非常低的水平,前者被映射到后者。如果您真的需要血腥的详细信息,请参阅lisp/term/x-win.el(通常位于/usr/share/emacs/NN.X下)。

所以,从emacs lisp 中的,我相信不可能做你想做的事。

但是,可以将外部命令中的文本嵌入到emacs模式行中,并定期更新。因此,原则上你可以找到一个返回大写锁定,移位和numlock状态的linux命令,并定期将其注入命令行。这可能并不能真正满足您的需求,因为当您按shift,capslock和numlock时,它不会实时更新模式。但是,如果您想要实现这一目标,请查看display-time-modedisplay-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状态。