Отобразить состояние клавиш Caps Lock, Num Lock и Shift в Emacs - PullRequest
7 голосов
/ 10 июля 2011

Можно ли отобразить, включены ли в Emacs клавиши caps lock и num lock? Причина, по которой я спрашиваю, заключается в том, что я - машинистка, работающая одной рукой, и использую FrogPad Устройство с 20 клавишами использует несколько последовательностей клавиш Shift для полной функциональности стандартной qwerty-клавиатуры. Мне было бы очень полезно отображать состояние клавиш shift, caps lock и numlock внутри emacs. Я гуглил это и мог только найти сообщения относительно переназначения ключей. Это вообще возможно?

Ответы [ 3 ]

3 голосов
/ 08 февраля 2016

Это невозможно в переносимых 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 голосов
/ 31 августа 2011

Самый низкий уровень ввода с клавиатуры, полученный emacs lisp - это событие клавиатуры , которое объединяет базовый код с настройками включения / выключения модификаторов emacs (meta,control, shift, hyper, super и alt).Из-за этой комбинации, похоже, нет никакого способа узнать код lisp, когда вы, например, нажимаете и удерживаете клавишу Shift.Также обратите внимание, что вообще нет представления CAPS LOCK или NUM LOCK.

В примечании стороны, emacs фактически различает newline и C-m, но на очень низком уровне в lispкод, первый сопоставляется с последним.См. lisp/term/x-win.el (обычно находится под /usr/share/emacs/NN.X), если вы действительно хотите узнать кровавые подробности.

Итак, из в emacs lisp я считаю, что невозможно делать то, что вы хотите.

Однако, можно вставлять текст из внешних команд в строку режима emacs и регулярно обновлять его.Итак, в принципе вы можете найти команду linux, которая возвращает статус caps lock, shift и numlock и периодически вводит ее в командную строку.Это, вероятно, не совсем соответствует вашим потребностям, поскольку не будет обновлять модельную линию в режиме реального времени при нажатии клавиш shift, capslock и numlock.Но если вы хотите продолжить это, проверьте реализации display-time-mode и display-battery-mode.

1 голос
/ 14 августа 2011

Когда вы запускаете emacs в X Server, вы можете написать программу на C, непрерывный контроль монитора, Caps и Numlock, а когда произойдут изменения, выведите их на стандартный вывод.В emacs, запустите эту программу как внешний процесс, обработайте его выходные данные, используя фильтр процесса, и, наконец, отобразите статус Shift, Caps и Numlock в строке состояния.

...