ちょっとルーズな操作や移動の長さにも反応してくれるxyzzyのマウスジェスチャー

mouse-action.l

右クリックの4方向のみに対応したマウスジェスチャー機能です。

mousearrow-min

xyzzyにマウスジェスチャー機能を追加します  

概要

右クリックの4方向のみに対応したマウスジェスチャー機能です。

機能

右クリックでマウスを動かすと、それに完全マッチしたアクションを実行します。 (*mouse-action-list* のリスト参照) 機能一覧

  • 正規表現対応
  • アナログI/F追加(定量的操作)
  • キャンセル機能追加
  • Selection修飾子追加

1つ目と2つ目に書いたように、正規表現に対応し、アナログ的な I/Fも搭載しました。 これによって、正規表現では微妙な誤操作も吸収でき、きっちりジェスチャーしなくても良くなります。

また、一つのコマンドに対して複数のアクションリストパターンを書く必要が減ります。

これらの特徴をもたせたので筆記体のようなアクションでもかなり楽に指定できます。 またアナログ的なI/Fによって →→も可能になりました。

たとえば、↓スクロールする時に ↓と↓↓で別のアクションを定義してもよいですし、1画面スクロールか、2画面スクロールかのように移動量を変えることができます。(下の例参照)

また、マウスでウインドウを切った位置で横分割したり、ウインドウを斜めに切ることで閉じるジェスチャにしたり、文字のようなジェスチャも設定出来ます。

例えば、Oを描くとフォルダをオープンをすることもできます。 キャンセル機能(マウスをぐちゃぐちゃ操作する:方向アクション20個分ぐらい)をつけたので間違った操作をしても、コマンドがトリガーされないようにできます。

 

セレクション範囲対応コマンドは先頭に "S"をコマンドにつけてください。 アクションを作るときは 実行後*mouse-action-history*の変数にアクションが入っているので、そこからアクションを作ると楽です。

ファイル名や URLが書かれている位置から、マウスを下にドラッグするとファイルやURLにジャンプします(find-file-string)。

影響

global-keymapの右マウスボタンの press , up ,move 3つを潰します。 (セレクション範囲は残してます。また、コンテキストメニューも今まで通り表示されます)

設定

おすすめ設定例(アクションパターン活用例)

マウスジェスチャーの基本的な部分は省略して、 ちょっとサンプルの解読は面倒だったり意図が通じないと思うので (正規表現がいまいち苦手な人も含めて )説明します。

文字ジェスチャ

  • 例えば Pの文字を左下から一筆で書くようにジェスチャーすると ペースト関数が発動します。
  • 左下から筆記体のtを書くと 時刻挿入が実行されます(独自関数ですが)。

文字や丸などは、程良い大きさの感覚を掴む必要があるかもしれません

記号ジェスチャ

  • 時計回りに下から丸(O)をひとつ書くとエクスプローラが、二つ丸を書くと関数移動ダイアログが、3つ丸を書くとバッファ選択ダイアログが表示されます。

window アクションジェスチャ

  • 画面を横切る様に左から右にジェスチャを書いて、少し左に戻るとウインドウを上下に分割します。その時にドラッグ開始windowのマウスジェスチャー位置によって分割場所を変えられます! つまり分割箇所を グラフィカルに指定可能です。
  • 画面右上から左下に向かって切るとその windowを閉じます(C-x 0のような動作)。

アナログ的ボリューム ジェスチャ

  • 上から下にジェスチャした時、移動量によってスクロール量をアナログチックに変更します。 "↓"だと1ページ、"↓↓↓"だと3ページ分、"↓↓↓↑"だと2ページ分移動します!!
  • バッファ移動についてもスクロールと同様な移動が可能です

セレクション用 ジェスチャ

  • セレクションして(下側から←に)丸を書くと grep , ファイル名やURLをセレクションしてJ(→↑)を書くと Jumpになります。 なので、対象の単語をダブルクリックしてJを書くとそのファイルを一瞬で開けます(かなり楽になります)
  • ↑↓で全選択して、Cを描くと全選択コピーが一瞬でできます。

設定方法

・ファイルを site-lispフォルダ配下に格納
・.xyzzyなどに読み込み処理を記載
(load-library "mouse-action.l")

実際のアクション設定例は下記を参照ください。
・*mouse-action-list*: マウスジェスチャーリスト
   [構造]
   *mouse-action-list* = (list アクションリスト)
   アクションリスト = (list ジェスチャーコマンド、表示 、コマンド)

・*mouse-action-threshhold* :マウス無反応距離
・*mouse-action-popup* ;マウスジェスチャーpopup表示 / t:popup-string   nil:message

Selectionがある場合はコマンドの先頭に "S"がつく
;設定例:simple版
(load-library "mouse-action.l")
(setq *mouse-action-list*
      '(
        ;(".\\{10,\\}$" "quit" (lambad()(message "quit:mouse-action")) t);正規表現ストッパー 10アクション以上でキャンセル
        ("^↓↓?→→?$" "タブを閉じる" delete-current-buffer-force t);独自関数
        ("←↑" "バッファの最初" beginning-of-buffer)
        ("←↓" "バッファの最後" end-of-buffer)

        ("←→" "共通設定" option-property-sheet)
        ("↑↓" "全て選択(A)" selection-whole-buffer) ;A文字のイメージ


        ("^.\\{,2\\}\\(↓+←+\\)\\{2,\\}.\\{,3\\}$" "windowを閉じる"  (lambda () (if (> (count-windows) 1) (delete-window) (delete-current-buffer-force))) t) ;右上から斜め45度で

        ("↓" "file jump" find-file-string) ;独自関数
        ("S↓" "file jump" find-file-string) ;独自関数
        ("^\\(←+↑+→+↓+\\)\\{1\\}.\\{,3\\}$" "エクスプローラ(O)" open-directory-where-current-buffer-file-be t) ;O文字のイメージ,独自関数

        ("^[↑↓]+$" "上下スクロール" (lambda ()(next-page(- (length-mouse-action "↓") (length-mouse-action "↑"))))t)
        ))



;設定例:詳細
(load-library "mouse-action.l")
(setq *mouse-action-list*
      '(
        ;(".\\{10,\\}$" "quit" (lambad()(message "quit:mouse-action")) t);正規表現ストッパー 10アクション以上でキャンセル
        
         ("^↓↓?→→?$" "タブを閉じる" delete-current-buffer-force t);独自関数
        ("→←→←" "保存" save-buffer)
        ("↑←" "保存" save-buffer)
        ("←↑" "バッファの最初" beginning-of-buffer)
        ("←↓" "バッファの最後" end-of-buffer)
 
        ("←→" "共通設定" option-property-sheet)
        ("↑↓" "全て選択(A)" selection-whole-buffer) ;A文字のイメージ
        ("S←↓→" "Copy Selection(C)" copy-selection-to-clipboard);C文字のイメージ
        ("↑↓↑↓" "Memo (M)" memo-start);M文字のイメージ、独自関数
 
        ("^S?↑+→↓←$" "Paste (P)" paste-from-clipboard t);P文字のイメージ
        ("^S?←↓+→↑←$" "Grep(G)" grep-dialog t);G文字のイメージ
        ("^S?→+↑←↓↓*→↑$" "Filer(F)" open-filer t);筆記体fのイメージ
        ("^→+↑+↓+→+$" "時刻挿入(t)" insert-date t);筆記体のt : 独自関数
        ("^S→+↑+↓+→+$" "セレクションインデント(i)" (lambda () (selection-start-end (start end) (indent-region start end))) t);筆記体のi
 
        ("^→→→→+←+$" "split-window" (lambda () (split-window (- *last-mouse-line* (get-window-start-line)))) t)
        ("^↓↓↓+↑+$" "split-window" (lambda () (split-window-vertically *last-mouse-column*)) t)
        ("→←" "split-window" split-window)
        ("↓↑" "split-window" split-window-vertically)
 
		("^.\\{,2\\}\\(↓+←+\\)\\{2,\\}.\\{,3\\}$" "windowを閉じる"  (lambda () (if (> (count-windows) 1) (delete-window) (delete-current-buffer-force))) t) ;右上からウインドウ全体斜め45度で切るように
        ("^.\\{,2\\}\\(↓+→+\\)\\{1,3\\}.\\{,3\\}$" "囲み文字"  enclose-braces t) ;左上から斜め45度で、独自関数

        ("↓" "file jump" find-file-string) ;独自関数
        ("S↓" "file jump" find-file-string) ;独自関数

        ("^S\\(←+↑+→+↓+\\)\\{1\\}.\\{,3\\}$" "grep(O)" (lambda ()(grep (selection-start-end (start end) (buffer-substring start end)))) t) ;Selection中に下からO文字を描くのイメージ
        ("^S\\(←+↑+→+↓+\\)\\{2\\}.\\{,3\\}$" "grepd(O)" (lambda ()(ed::scan-files (selection-start-end (start end) (buffer-substring start end)) nil (directory-namestring (get-buffer-file-name)))) t);O文字を2つ下から描く
 
        ("^\\(←+↑+→+↓+\\)\\{1\\}.\\{,3\\}$" "エクスプローラ(O)" open-directory-where-current-buffer-file-be t) ;真下からO文字を描くイメージ,独自関数
        ("^\\(←+↑+→+↓+\\)\\{2\\}.\\{,3\\}$" "関数一覧:◎" list-function t) ;2重丸(下から)
        ("^\\(←+↑+→+↓+\\)\\{3\\}.\\{,3\\}$" "バッファ一覧:3重丸" select-buffer t) ;3重丸(下から)
 
        ("^[→←]+$" "前後のバッファ" (lambda ()(dotimes (i (length-mouse-action "→")) (next-buffer))(dotimes (i (length-mouse-action "←")) (previous-buffer)))t)
        ("^[↑↓]+$" "上下スクロール" (lambda ()(next-page(- (length-mouse-action "↓") (length-mouse-action "↑"))))t)

一度の覚えるのは大変なので、1,2個ずつ好きなものを覚えていって、自分用にカスタマイズすれば良いと思います。

ソース

mouse-action.l | 旧mouse-action.l

機能的未完なところ

まだ、曲がるところのジェスチャ反応がイマイチ未完成です。

ひとこと

よく使っていたマウスジェスチャー機能がなくなったので、 しばらく我慢していたけれども、再開発しました。 web archiveがありました。→MicroTips(xyzzy dept) - zauberer.at.infoseek.co.jp

履歴

2010/08/01 一つのファイルにして公開
Delicious にシェア
Digg にシェア
reddit にシェア
LinkedIn にシェア
LINEで送る
email this
Pocket

409 views.



One thought on “ちょっとルーズな操作や移動の長さにも反応してくれるxyzzyのマウスジェスチャー

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です