キーボードを使用したマウス操作のシミュレーション


8

キーボードで呼び出すことができるコマンドを使用して、Emacsが特定の場所でクリックしたと思うようにする方法はありますか(リンクをクリックしたり、メニューをポップアップしたりして、そこでクリックした場合と同じように動作します) )?または、ポイントにマウスを置いた(ツールチップがポップアップした)

[動機:一部のモードはバッファを装飾し、一部のテキストをリンクに変換します。私はマウスで何かをする方法を知っているかもしれません(たとえば、それをクリックする)が、呼び出す同等のキーボードショートカット/コマンドは知りません。もちろん、モードのドキュメントを読んで学ぶべきですが、興味深い質問だと思いました。]


2
特にキーボードでホバーをシミュレートできるかどうかに興味があります。ツールチップが、探している情報を見つけるのに最も簡単な場所であることは珍しくありません。
nispio 2014年

@nispioの場合、display-local-help
Malabarba

@Malabarba:ありがとうございます。それはうまくいくようです!
ShreevatsaR 2014年

回答:


5

多くの場合、ある場所に移動してキーを押すと、その場所をクリックするのと同じ効果があります。これを保証する組み込みのメカニズムはありません。モードが通常そのように記述されているだけです。

マウスイベントを生成できますクリックダブル/トリプル/…クリックボタンダウン/アップドラッグモーション)。すべてのマウスイベントには、(TYPE POSITION . EXTRA-DATA)TYPEがマウスボタンをエンコードする記号、アクションの性質(クリック、ドラッグなど)、および修飾子の形式があります。TYPEはmouse-movementモーションイベント用です。呼び出しposn-at-pointて、現在のバッファー内のポイントの位置のPOSITIONを生成します。

次にf11、数字を押してカーソル位置でマウスクリックをシミュレートする概念実証コードを示します。修飾子が考慮されます。

(defun make-mouse-event-at-point (base-event)
  (let ((posn (posn-at-point))
        (prefix "")
        (basic-type (event-basic-type base-event))
        (modifiers (event-modifiers base-event)))
    (cond
     ((and (integerp basic-type) (>= basic-type ?0) (<= basic-type ?9))
      ;; click
      (let* ((mouse-type (intern (format "%smouse-%d" prefix (- basic-type ?0))))
             (click-count 1)
             (type (event-convert-list (append modifiers (list mouse-type)))))
        (list type posn click-count)))
     (t
      (error "Unsupported key for mouse event: %s" (event-basic-type base-event))))))
(defun simulate-mouse-event-at-point ()
  (interactive)
  (let ((event (make-mouse-event-at-point last-input-event)))
    (setq unread-command-events (cons event unread-command-events))))

(defvar simulate-mouse-event-map (make-sparse-keymap))
(global-set-key [f11] simulate-mouse-event-map)
(define-key simulate-mouse-event-map [t] 'simulate-mouse-event-at-point)

ホバーのシミュレーションはより困難に見えます。


1
これはホバーをシミュレートしませんが、ツールチップを表示したいだけの場合は、display-local-help
Malabarba

私はまだこれを試していますが、最初の数文に応えて:この質問をした理由は、「いくつかのキー」が明確でないモードで作業しているためです(たまたまですがC-c C-, RET、そのためのモードのドキュメントを参照する必要がありました)。
ShreevatsaR 2014年

実際、これはうまくいきません。私が作業しているモードでは、コードの一部がリンクに変わり、マウスでクリックすると、その場所にメニューが開きます。上記をf11 1行うことはそれをしません(それは何かをミニバッファーに出力しますが、それはリンク上でのマウスクリックと同等ではありf11 3ません)と同等と思われます<mouse-3>
ShreevatsaR 2014年

@ShreevatsaRたぶんあなたが望むマウスクリックアクションはバインドされているのdown-mouse-1ではなくバインドされていmouse-1ますか?キーがバインドされているキーマップを確認するにはどうすればよいですか?これを調査するのに役立つかもしれません。
Gilles「SO-邪悪なことをやめよ」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.