【问题标题】:Display the status of caps lock, num lock and shift keys in Emacs在 Emacs 中显示 caps lock、num lock 和 shift 键的状态
【发布时间】:2016-02-08 19:14:45
【问题描述】:

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

【问题讨论】:

  • 在 X11 版本的 emacs 中是可能的,因为 X 服务器将为 emacs 提供该信息。然而,终端代码与 Emacs 的其余部分相距甚远,以至于在 Lisp 级别上不太可能访问。 (例如,Emacs 不知道 X 中的 Return 键和 Control-m 之间的区别,即使 X 服务器向它提供了此信息。它们在任何有机会查看之前被翻译为“换行符”。这是因为控制台式终端无法区分这两种情况。)

标签: emacs elisp


【解决方案1】:

这在便携式 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】:

    emacs lisp 接收的最低级别的键盘输入是keyboard event,它结合了 基本代码 与 emacs 修饰符的开/关设置(metacontrolshifthypersuperalt)。由于这种组合,当您按住 shift 键时,lisp 代码似乎无法学习。另请注意,CAPS LOCK 或 NUM LOCK 根本没有表示形式。

    顺便说一句,emacs 实际上确实区分了newlineC-m,但是在 lisp 代码中的非常低的级别,前者映射到后者。如果你真的想要血淋淋的细节,请参阅lisp/term/x-win.el(通常在/usr/share/emacs/NN.X 下找到)。

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

    但是,可以将来自外部命令的文本嵌入到 emacs 模式行中,并定期对其进行更新。因此,原则上您可以找到一个返回 caps lock、shift 和 numlock 状态的 linux 命令,并定期将其注入命令行。这可能并不能真正满足您的需求,因为它不会在您按下 shift、capslock 和 numlock 时实时更新模式行。但如果你想追求这一点,请查看display-time-modedisplay-battery-mode 的实现。

    【讨论】:

    • +1 为电池显示提示;它不仅仅是显示电池状态,所以如果你正在寻找如何实现它的想法(如果它实际上还没有这样做的话)可能值得研究。
    【解决方案3】:

    在 X Server 中运行 emacs 时,可以编写一个 C 程序,持续监控 Shift、Caps 和 Numlock 状态,当发生变化时,打印到 stdout。在 emacs 中,将该程序作为外部进程运行,使用 process-filter 处理其输出,最后在 mode-line 中显示 Shift、Caps 和 Numlock 状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 2016-12-26
      • 2016-12-18
      • 1970-01-01
      • 2013-06-05
      相关资源
      最近更新 更多