<double-mouse-1>にバインドされた単語/シンボル選択関数とは


11

ダブルマウスクリックで現在行っている単語/記号を選択する機能が気に入っています。キーボードから実行できるようにしたいので、キーストロークにバインドしたいので(または、多分既にそうですか?)、関数の名前が必要です。関数はすでに存在しているはずだと思いますが、その名前がわかりません。

試しましたC-h kが、マウスをダブルクリックするとヘルプが<down-mouse-1>表示されます(ヘルプシステムは2回目のクリックなどを待機していないと思います)。この機能がセクション21.2で定義されているドキュメントも検索しましたが、関数の名前は示されていません。

更新:典型的なキーバインドの場合、シフトキーは後者のために保持されますが、これは、それぞれが、とに<C-left>続い<C-S-right>ているのleft-wordと同じだと思いますright-word。(私は完全に機能にシフトキーとそれらのマッピングとキーボードの指定との間の関係を理解していない、のヘルプが<C-S-right>に変換し<C-right>、それはとしてそれを識別する前にright-word


C-h bそのバッファを使用して検索すると、特定のイベントを伴う<double-mouse-1>呼び出しmouse-set-point(「mouse.el」から)が表示されます。これがどれだけ役立つかわかりません:)
VanLaser

1
シフトされたバージョンとシフトされていないバージョンのC-rightとC-leftの関係については、それが影響しますshift-selection-mode(を参照(info "(emacs) Shift Selection"))。emacs.stackexchange.com/questions/12858/…
YoungFrog

@YoungFrogそのような複雑さは、私のemacsプログラミングの大部分をキーボードマクロとして保持することが多いものです。に基づいた単純なkbdマクロ <right> <C-left> <C-S-right>は、そのリンクで詳細に説明されている微妙な問題に完全に対処する必要がないことを意味します。
チップグランディ

回答:


9

実際には少し複雑です。ダブルクリックmouse-1すると、複数のアクションがあります。<down-mouse-1>ボタンを押すと、最初に発生します。次にmouse-1、ボタンを離すと発生します。

<down-mouse-1>はcommand mouse-drag-regionにバインドされており、そのコマンドがを呼び出しますmouse-drag-track。この関数は、マウスボタンのクリックをカウントし、マウスの動きを追跡します(ダブルクリックした場合、つまり、マウスを動かしなかった場合)。

mouse-drag-trackmouse-start-end 選択するテキストの範囲を決定する関数を呼び出します。mouse-start-endクリックした位置、最初の2つの引数、およびクリック数が3番目の引数として渡されます。これはmouse-start-end

mouse-start-end is a compiled Lisp function in `mouse.el'.

(mouse-start-end START END MODE)

Return a list of region bounds based on START and END according to MODE.
If MODE is 0 then set point to (min START END), mark to (max START END).
If MODE is 1 then set point to start of word at (min START END),
mark to end of word at (max START END).
If MODE is 2 then do the same for lines.

3番目の引数(MODE)として渡されるクリック数は、ダブルクリックの場合は1です。

キーボードのキーシーケンスからこのコードの一部を呼び出すことはできませんが、コードを調べると、キーボードのキーにバインド可能なコマンドを記述して、必要な操作を行うことができます。


マウスイベントで機能しない理由 を説明していただきありがとうございC-h kます。Emacsが「マウスを処理している」方法を調査するために私が考え出した最良の方法は、キーボードマクロとして記録し、名前を付けてから、insert-kbd-macro 一般的に生成されたコードを確認することです。マクロなので、これらの一時的なマクロは、Emacsが何をしているかを確認するのに役立ちます。
チップグランディ

6

@Drewは、マウスアクションにバインドされたイベントに関連するいくつかの複雑さを説明しました。キーボードを使用してポイントに単語をマークするという最終的な目標については、expand-regionに興味があるかもしれません。

expand-regionセマンティック単位で領域を操作できます。たとえば、アクティブな領域がない場合、呼び出しer/expand-region(通常はにバインドC-=)は現在の単語をマークします。もう一度呼び出すと、リージョンが現在の文に拡張されます。そして、段落、セクションなど。実際の単位は、現在のモードに依存するため、lispモードでは、シンボル、シンボルを囲む式、その式を囲む式などになります。

リンク先のページには、詳細な説明とこれを示すビデオがあります。


1
はい、melpaのパッケージリストにexpand-regionパッケージが表示されます。非常に便利です。Emacsのデフォルトではなく、少なくともCEDETにバンドルされていないことに驚いています。先端をありがとう!
チップグランディ

チップグランディツ:それは、適切な著作権の割り当てとともにパッケージをFSFに提出する作者に依存します。作者がそれを提出していなければ、Emacsのデフォルトの部分にはなれません。
フィル2016

2

以下mouse-set-regionは、ダブルクリックしたときにマーキングを行う関数から抽出したものです。

(defun ora-mark-like-double-mouse-1 ()
  (interactive)
  (let ((bnd (mouse-start-end (point) (point) 1)))
    (goto-char (car bnd))
    (push-mark)
    (set-mark (point))
    (goto-char (cadr bnd))))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.