Emacs 30からタッチ操作がサポートされました。これまでもOSによってはタッチ操作がマウス操作に変換されて操作可能だった場合もあると思いますが、Emacs 30からはEmacs自体がタッチイベントを認識してEmacs Lispからきめ細かい制御が可能になりました。
タッチスクリーンと言えばスマホやタブレットを連想しますが、PCにおいてもタッチスクリーン付きのディスプレイが搭載されていればタッチ操作が可能です。試しにタッチスクリーン付きの少し古めなノートPC(Windows 10)を使ってみたところ問題なく操作できました。
タッチスクリーンでできる操作についてはEmacs マニュアルの6.1 Using Emacs on Touchscreens(日本語訳)に書いてあります。それによればデフォルトでタップ、スクロール、ドラッグ、ピンチといった操作がサポートされています。マウスイベントへの変換も行われるので、従来のマウス用に用意された操作もタッチスクリーンからある程度実行可能です。
ある程度ということはもちろん全てではありません。マウスにはボタンが複数付いているのでかなり複雑な操作も可能ですが、現在のEmacsのタッチスクリーン操作はそれを全て再現できるようには出来ていません(加えて修飾キーとの組み合わせもサポートしていないようです)。
タッチで再現できない最たるものが右クリックでしょう。私は少し前からcontext-menu-mode
を使用しているのでPCでは右クリックでコンテキストメニューが表示されますが、タッチ操作からではそれができません。スマホにおいても長押しでメニューが出るというのはかなり一般的な操作だと思います。
というわけで次のようなコードを書いて長押しでコンテキストメニューが表示されるようにしてみました。
(defun my-touch-screen-handle-point-up:around (old-fun point prefix canceled) (when (and (null touch-screen-aux-tool) (memq (nth 3 touch-screen-current-tool) '(held drag)) (null prefix) (not canceled)) ;; 右ボタン押し下げを再現するなら次のようにする。 ;; ただ、続く解放イベント(mouse-3やdrag-mouse-3)も再現しないと色々良くない。 ;; (throw 'input-event (list 'down-mouse-3 (cdr point))) ;; なので、とりあえず単にコンテキストメニューを開くだけにしておく。 (context-menu-open) ;; 後続の処理(仮想キーボードの表示)をブロックするか少し迷う。 ) (funcall old-fun point prefix canceled)) (advice-add #'touch-screen-handle-point-up :around #'my-touch-screen-handle-point-up:around)
実際に使ってみた図:

AndroidとWindows 10の両方で動くことを確認しました。
Emacsのタッチ操作に反応する部分はtouch-screen.elに書かれています。複雑なので全部は読んでいませんが、長押し、ドラッグ、解放に関する流れを大ざっぱに追ってみました。長押しするとheldという状態に移行し、そのまま指を動かすとdragという状態に移行します。heldまたはdragの状態で指を離したとき、デフォルトではなぜか仮想キーボードを開く処理が行われるのですが(おそらく選択した範囲に対して仮想キーボードでC-wやM-wしろということなのかもしれません)、上のコードはその前に割り込んでコンテキストメニューを表示させます。
コンテキストメニューが不要ならそのままフレームをタップしたり(Windows 10)、ウィンドウ内の適当な場所をタップしたり(Android)すればコンテキストメニューは閉じます。その時ポイントやアクティブリージョンが変わったりはしません(注: Windows 10の時はウィンドウ内をタップするとメニューが閉じるだけで無くポイントも移動してしまいました。フレームのタイトルバー等をタップしましょう)。なのでコンテキストメニューを表示させることにそれほど害は無いでしょう。
むしろそのままカットやコピーが選べるのはかなり楽なはずです。
上のコードでは右クリックを再現するのでは無くcontext-menu-open
を直接呼び出しています。本来は右クリックを再現した方が良いと思うのですが、マウス右ボタン押し下げイベント(down-mouse-3)だけでなく解放イベント(mouse-3またはdrag-mouse-3)も一緒に再現するのが面倒なので止めておきました。パッケージによってはdown-mouse-3やmouse-3でメニューを表示しているものがあるので、本来ならちゃんと再現した方が用途が広がると思います。
マニュアルにも書いてありますが、より良い選択操作のため次の変数をtにしておくと良いでしょう。
(setq touch-screen-word-select t ;; 単語単位の選択 touch-screen-extend-selection t ;; 後からポイント長押しで選択範囲の拡張 touch-screen-preview-select t) ;; ミニバッファにドラッグ中の場所を表示
(相変わらずEmacsというのはこの手の便利機能をデフォルトで有効にしたがりませんね。これだから初心者が逃げていくのです。使っていて邪魔だなと思ったらnilにすれば良いだけです)
何はともあれ、AndroidでのEmacsが大分使いやすくなってきました。