2011-07-10 25 views
6

Emacsでcaps lockとnum lockキーがオンになっているかどうかを表示できますか?私が尋ねる理由は、私が片手のタイピストで、FrogPadを使用しているからです。 20キーデバイスは、複数のシフトキーシーケンスを使用して、標準のQWERTYキーボードの全機能を備えています。私はシフトの状態、emacsの中のcaps lockとnumlock keyを表示することが非常に役に立ちます。私はこれをgoogledし、リマップキーに関する記事のみを見つけることができます。これも可能ですか?Emacsでcaps lock、num lock、shiftキーの状態を表示

+2

これは、Xサーバは、その情報とのemacsを提供しますという意味で、emacsののX11バージョンで可能です。しかし、ターミナルコードはEmacsの他の部分とは遠く離れていますが、Lispレベルでアクセスすることは難しいでしょう。 (例として、Emacsは、Xサーバがこの情報を与えても、ReturnキーとControl-mの違いを知らない。何かが見えるようになる前に "Newline"に翻訳される。これは、コンソールスタイルの端末*が* 2つのケースを区別できないためです)。 – jrockway

答えて

0

Xサーバでemacsを実行すると、Cプログラム、継続的なモニタShift、Caps、Numlockステータスを書き込むことができます。変更が発生した場合はstdoutに出力します。 emacsでは、このプログラムを外部プロセスとして実行し、プロセスフィルタを使用して出力を処理し、最後にShift、Caps、Numlockステータスをモードラインに表示します。

2

emacsが受信されたキーボード入力の最低レベルは、Emacs剤(metacontrolshifthypersuper、及びalt)のオン/オフ設定で基本コードを組み合わせkeyboard event、あるLISP。この組み合わせのために、たとえばシフトキーを押したままにしているときに、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 statusを返すlinuxコマンドを見つけることができ、定期的にコマンドラインに注入することができます。シフト、capslock、numlockを押すと、リアルタイムでモデルラインを更新しないため、これはおそらくあなたのニーズを満たしていないでしょう。しかし、これを追求したい場合は、display-time-modedisplay-battery-modeの実装をチェックしてください。

+0

+1のバッテリ表示チップ。電池の状態を表示するだけではありませんので、これを実装する方法のアイディアを探しているかどうか調べる価値があります(実際にはそうしていない場合)。 – tripleee

0

それは、ポータブル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" ""))) 
関連する問題