Emacsをタッチスクリーン端末でドキュメントビューアとして使う設定(PDF,EPUB,画像)

Doc-View , Nov , Image に対応。
PDF,EPUBに対応したので大抵のNo DRM文書は見れる。
画像にも対応したので自炊で書籍を電子化したやつも大丈夫だろう。
以下のようにDoc-View,Nov,Imageのモードフックを設定

(defun touch-scroll-by-click-event (fn-scroll-down ddown fn-scroll-up dup fn-scroll-right dright fn-scroll-left dleft)
  "Mouse Click Scrool
Click Upper  Window     -> Scroll Up
Click Lower Window      -> Scroll Down
Click Window Right Side -> Scroll Right
Click Window Left  Side -> Scroll Left
Non-Sensitive Zone -> Center and 4 corners"
  (interactive)
  (let* ((pos     (cdr (mouse-position)))
	 (x       (car pos))
	 (y       (cdr pos))
	 (wh      (window-total-height))
	 (ww      (window-total-width))
	 (upper   (/ wh 4))
	 (lower   (- wh upper))
	 (left    (/ ww 4))
	 (right   (- ww left)))
    (message "wh=%d ww=%d x=%d y=%d" wh ww x y)
    (message "upper=%d lower=%d left=%d right=%d" upper lower left right)
    (cond ((or (and (< x left ) (or (< y upper) (> y lower)))
	       (and (> x right) (or (< y upper) (> y lower))))
	   ;; non-sensitive zone -> 4 corners
	   ())
	  ((> y lower)
	   (funcall fn-scroll-down  ddown))
	  ((< y upper)
	   (funcall fn-scroll-up    dup))
	  ((> x right)
	   (funcall fn-scroll-right dright))
	  ((< x left)
	   (funcall fn-scroll-left  dleft))
	  (t
	   ()))))

(defun touch-scroll-up-down (fn-scroll-down down fn-scroll-up up)
  "Mouse Click Scrool
Click Upper Window -> Scroll Up
Click Lower Window -> Scroll Down"
  (interactive)
  (let* ((pos    (cdr (mouse-position)))
	 (y      (cdr pos))
	 (center (/ (window-total-height) 2)))
    (if (> y center)
	(funcall fn-scroll-down down)
      (funcall fn-scroll-up up))))

(defun touch-scroll-right-left (fn-scroll-right right fn-scroll-left left)
  "Mouse Click Scrool
Click Window Right Side -> Previous Page
Click Window Left  Side -> Next Page"
  (interactive)
  (let* ((pos    (cdr (mouse-position)))
	 (x      (car pos))
	 (center (/ (window-total-width) 2)))
    (if (> x center)
	(funcall fn-scroll-right right)
      (funcall fn-scroll-left left))))

(defun touch-null ()
  "Null function"
  (interactive))

(defun doc-view-touch-scroll ()
  "Mouse Click Scrool when Doc-View
Click Upper Window      -> Scroll Up or Previous Page
Click Lower Window      -> Scroll Down or Next Page
Click Window Right Side -> Previous Page
Click Window Left  Side -> Next Page"
  (interactive)
  (touch-scroll-by-click-event #'doc-view-next-line-or-next-page 50 #'doc-view-previous-line-or-previous-page 50 #'doc-view-previous-page 1 #'doc-view-next-page 1))

(add-hook 'doc-view-mode-hook
	  (lambda ()
	    (setf doc-view-continuous t)
	    (local-set-key (kbd "<down-mouse-1>") 'doc-view-touch-scroll)))

(defun nov-touch-scroll-up-down ()
  "Mouse Click Scrool when Nov
Click Upper Window -> Scroll Up
Click Lower Window -> Scroll Down"
  (interactive)
  (touch-scroll-up-down #'nov-scroll-up 10 #'nov-scroll-down 10))

(add-hook 'nov-mode-hook
	  (lambda ()
	    (local-set-key (kbd "<down-mouse-1>") 'nov-touch-scroll-up-down)
	    (local-set-key (kbd "<up-mouse-1>")   'touch-null)
	    (local-set-key (kbd "<drag-mouse-1>") 'touch-null)))

(defun image-touch-scroll ()
  "Mouse Click Scrool when Image
Click Upper Window      -> Previous Page
Click Lower Window      -> Next Page
Click Window Right Side -> Previous Page
Click Window Left  Side -> Next Page"
  (interactive)
  (touch-scroll-by-click-event #'image-next-file 1 #'image-previous-file 1 #'image-previous-file 1 #'image-next-file 1))

(add-hook 'image-mode-hook
	  (lambda ()
	    (local-set-key (kbd "<mouse-1>")      'touch-null)
	    (local-set-key (kbd "<down-mouse-1>") 'image-touch-scroll)))

タッチスクリーンではタッチがマウスクリックとして扱われるのを利用した。

Doc-Viewと画像の場合:
画面の上のほうをタッチすると上へスクロール、または前のページ
画面の下のほうをタッチすると下へスクロール、または次のページ
画面の右のほうをタッチすると前のページ
画面の下のほうをタッチすると次のページ

Novの場合(基本的にウェブページと同じなのでシンプルにした):
画面の上のほうをタッチすると10行上へスクロール、または前のページ
画面の下のほうをタッチすると10行下へスクロール、または次のページ

Surface Pro 7 を文書ビューアとして使いたいが、オンラインのPDFビューアーとかだと状態保存されないし不便なので、Emacsを使うことにした。

なお、Doc-Viewは解像度(DPI)設定しないと見ずらいので設定した方がいい(doc-view-resolution)。
Surface Pro 7 だと120が見やすい。

この記事が気に入ったらサポートをしてみませんか?