NTEmacs で lookup する備忘録

Environment
Photo by hyt.

NTEmacs で lookup する備忘録です.

NTEmacs について

Windows 版 Emacs (通称 NTEmacs) の 64bit 版 version 24.5 です.有り難いことに

GitHub - chuntaro/NTEmacs64: Windows 版 Emacs (通称 NTEmacs) の 64bit 版
Windows 版 Emacs (通称 NTEmacs) の 64bit 版. Contribute to chuntaro/NTEmacs64 development by creating an account on GitHub.

でコンパイル済みのバイナリを配布してくれています.IME パッチの当たったものを

C:\Opt\ntemacs

にインストールしています.lookup とは無関係の emacs の設定ファイルもありますが,切り分けて最低限にするのも面倒なので全て晒しておきます.なお,設定ファイルについて参照したサイトがある場合は設定ファイルの冒頭に URL を記すか,リンクとして明記しておきます.

~/.emacs.d/init.el (24.5 ではこのファイルが初期設定ファイルになった模様)

(add-to-list 'load-path "~/.emacs.d/site-lisp/")
(setq ntemacs (eq system-type 'windows-nt))

(when ntemacs
  (require 'cl)
  (load "ntemacs.fontset")
  (load "ntemacs.defaultframe")
  (load "ntemacs.transparency")
  (load "ntemacs.language")
  (load "ntemacs.w32ime")
  (load "ntemacs.fakecygpty")
  (load "ntemacs.lookup"))

~/.emacs/site-lisp/ntemacs.fontset (フォントの設定.この辺り参照)

(set-face-attribute 'default nil :family "Consolas" :height 110)

(dolist (target '(japanese-jisx0212
                  japanese-jisx0213-2
                  japanese-jisx0213.2004-1
                  katakana-jisx0201
                  ))
  (set-fontset-font (frame-parameter nil 'font)
    target
    (font-spec :family "MeiryoKe_Gothic" :registry "unicode-bmp" :lang 'ja)))

(add-to-list 'face-font-rescale-alist
             '("MeiryoKe_Console" . 1.0))

~/.emacs/site-lisp/ntemacs.defaultframe (起動時の見た目の設定)

;;; Default Theme and Alpha
(load-theme 'misterioso t)
(add-to-list 'default-frame-alist '(alpha . 90))

;;; Frame parameters
;(set-alpha '(90 80))
(setq default-frame-alist
  (append '(
    (scroll-bar-width . 14)
;   (background-color . "black")
;   (top . 10)
;   (left . 100)
    (width . 80)
    (height . 40)
    (vertical-scroll-bars . right)
    (line-spacing . 0)
    (cursor-type . box))
  default-frame-alist))

(setq initial-frame-alist default-frame-alist)

;; Tool Bar, Splash, ToolTip
(tool-bar-mode 0)
(tooltip-mode 0)
(fringe-mode (cons 0 nil))
(setq inhibit-startup-message t)
(show-paren-mode 1)

;; Display file name on the title bar
(setq frame-title-format "%b")

;; Default Directory
;(setq default-directory "~/")
;(setq command-line-default-directory "~/")

~/.emacs-lisp/site-lisp/ntemacs.transparency (画面の透過度の変更)

;; change transparency depth(M-x set-alpha)
;; http://qiita.com/marcy@github/items/ba0d018a03381a964f24
(defun set-alpha (alpha-num)
  "set frame parameter 'alpha"
  (interactive "nAlpha: ")
  (set-frame-parameter nil 'alpha (cons alpha-num '(80))))

~/.emacs-lisp/site-lisp/ntemacs.language

;;; http://www49.atwiki.jp/ntemacs/pages/16.html
;;; for UTF-8
(setenv "LANG" "ja_JP.UTF-8")
(prefer-coding-system 'utf-8-unix)
(set-file-name-coding-system 'cp932)
(setq locale-coding-system 'utf-8)

;;; for process-coding-system DECODING variable
(setq default-process-coding-system '(undecided-dos . utf-8-unix))

;;; cache ldd result
(defvar ldd-cache nil)

;;; for cygwin
(defun cygwin-program-p (filename)
  (let* ((target (and filename (executable-find filename)))
         (cache (assoc target ldd-cache)))
    (when target
      (unless cache
        (setq cache
          (cons target
            (with-temp-buffer
              (let ((w32-quote-process-args nil))
                (when (eq
                  (call-process "ldd" nil t nil (concat "\"" target "\"")) 0)
                    (goto-char (point-min))
                      (number-or-marker-p
                        (re-search-forward "cygwin[0-9]+\.dll" nil t)))))))
        (push cache ldd-cache))
      (cdr cache))))

;;; for SJIS
(defun convert-process-args (orig-fun prog-pos args-pos args)
  (let ((cygwin-quote (and w32-quote-process-args
    (cygwin-program-p (nth prog-pos args)))))
    (setf (nthcdr args-pos args)
      (mapcar (lambda (arg)
        (when w32-quote-process-args
          (setq arg
            (concat "\""
              (if cygwin-quote
                (replace-regexp-in-string "[\"\\\\]"
                                          "\\\\\\&"
                  arg)
                (replace-regexp-in-string "\\(\\(\\\\\\)*\\)\\(\"\\)"
                                          "\\1\\1\\\\\\3"
                  arg))
          "\"")))
        (if (multibyte-string-p arg)
          (encode-coding-string arg 'cp932)
          arg))
   (nthcdr args-pos args))))

  (let ((w32-quote-process-args nil))
    (apply orig-fun args)))

(cl-loop for (func args-pos) in '((call-process        4)
                                  (call-process-region 6)
                                  (start-process       3))
  do (eval `(advice-add ',func
    :around (lambda (orig-fun &rest args)
      (setf (nthcdr ,args-pos args)
        (mapcar (lambda (arg)
          (if (multibyte-string-p arg)
            (encode-coding-string arg 'cp932)
              arg))
        (nthcdr ,args-pos args)))
      (apply orig-fun args))
  '((depth . 99)))))

~/.emacs-listp/site-lisp/ntemacs.w32ime

;;;http://www49.atwiki.jp/ntemacs/pages/45.html
(setq default-input-method "W32-IME")

(setq-default w32-ime-mode-line-state-indicator "[Aa]")
(setq w32-ime-mode-line-state-indicator-list '("[Aa]" "[あ]" "[Aa]"))
(w32-ime-initialize)
(set-cursor-color "red")
(advice-add 'ime-force-on
            :before (lambda (&rest args)
                      (set-cursor-color "green")))
(advice-add 'ime-force-off
            :before (lambda (&rest args)
                      (set-cursor-color "red")))

(blink-cursor-mode 0)
(setq w32-ime-buffer-switch-p t)
(global-set-key (kbd "C-o") 'toggle-input-method)

(add-hook 'minibuffer-setup-hook
          (lambda ()
            (deactivate-input-method)))
(add-hook 'helm-minibuffer-set-up-hook
          (lambda ()
            (deactivate-input-method)))

(wrap-function-to-control-ime 'y-or-n-p nil nil)
(wrap-function-to-control-ime 'map-y-or-n-p nil nil)
(wrap-function-to-control-ime 'read-char nil nil)

(defun w32-isearch-update ()
  (interactive)
  (isearch-update))

(add-hook 'isearch-mode-hook
  (lambda ()
    (setq ime-state (ime-get-mode))
    (w32-ime-state-switch nil)
  (setq w32-ime-composition-window (minibuffer-window))))

(add-hook 'isearch-mode-end-hook
  (lambda ()
    (if ime-state
      (w32-ime-state-switch t)
    (w32-ime-state-switch nil))
  (setq w32-ime-composition-window nil)))

(define-key isearch-mode-map (kbd "<compend>") 'w32-isearch-update)
(define-key isearch-mode-map (kbd "<kanji>")   'isearch-toggle-input-method)
(define-key isearch-mode-map (kbd "C-o")       'isearch-toggle-input-method)

~/.emacs-lisp/site-lisp/ntemacs.fakecygpty

;;; http://www49.atwiki.jp/ntemacs/pages/28.html
;;; for fakecygpty
(defvar fakecygpty-program-list '("sh" "bash" "zsh" "ssh" "scp"))

(advice-add 'start-process
  :around (lambda (orig-fun &rest args)
    (when (and (nth 2 args)
          (or process-connection-type
            (member (replace-regexp-in-string "\\.exe$" ""
              (file-name-nondirectory (nth 2 args)))
                fakecygpty-program-list)))
            (push "fakecygpty" (nthcdr 2 args)))
    (apply orig-fun args))
  '((depth . 100)))

(cl-loop for (func ctrl-key) in '((interrupt-process "C-c")
                                  (quit-process      "C-\\")
                                  (stop-process      "C-z")
                                  (process-send-eof  "C-d"))
  do (eval `(advice-add ',func
    :around (lambda (orig-fun &rest args)
       (let ((process (or (nth 0 args)
         (get-buffer-process (current-buffer)))))
       (if (string= (car (process-command process)) "fakecygpty")
         (process-send-string (nth 0 args) (kbd ,ctrl-key))
           (apply orig-fun args)))))))

;;; emacs-24.4, emacs-24.5

(defconst w32-pipe-limit 4096)

(defun ad-process-send-string (orig-fun &rest args)
  (if (not (eq (process-type (nth 0 args)) 'real))
      (apply orig-fun args)
    (let* ((process (or (nth 0 args)
                        (get-buffer-process (current-buffer))))
           (send-string (encode-coding-string (nth 1 args)
             (cdr (process-coding-system (get-process process)))))
           (send-string-length (length send-string)))
      (let ((inhibit-eol-conversion t)
            (from 0)
            to)
        (while (< from send-string-length)
          (setq to (min (+ from w32-pipe-limit) send-string-length))
          (setf (nth 1 args) (substring send-string from to))
          (apply orig-fun args)
          (setq from to))))))

(advice-add 'process-send-string :around #'ad-process-send-string)

~/.emacs-lisp/site-lisp/ntemacs.lookup

(autoload 'lookup "lookup" nil t)
(autoload 'lookup-region "lookup" nil t)
(autoload 'lookup-word "lookup" nil t)
(autoload 'lookup-select-dictionaries "lookup" nil t)
(global-set-key (kbd "C-x l") 'lookup-pattern)
(global-set-key (kbd "C-x C-l") 'lookup-region)
(setq lookup-search-agents '(
  (ndeb "C:/Users/********/Documents/Epwing/英辞郎第6版")
  (ndeb "C:/Users/********/Documents/Epwing/新英和・和英中辞典")))

Cygwin64 のインストール

今回は Cygwin64 を「C:\Opt\Cygwin64」以下にインストールしているとして話を進めます.lookup は eblook コマンドを裏で呼び出しますが,このために,NTEmacs から何らかのシェルが呼び出せないといけないのですが,今回はそのシェルとして Cygwin のものを用いるということです.

~/.emacs-lisp/site-lisp/ntemacs.fakecygpty

はその為に必要な設定と言うことになります.なお,Windows の cmd.exe は使えないの?と言われそうですが,これについては試していないので使えるように設定できるかどうかは不明です.

なお,この設定を追加しておくとより幸せになれると思います.また,Cygwin から NTEmacs のフォルダを参照し易くするため,

$ ln /cygdrive/c/opt/ntemacs /usr/local/.

としています(まぁこれは気分の問題ですが…).

fakecygpty.exe と eblookup.exe のインストール

NTEmacs から幸せに Cygwin のシェルを呼び出す wrapper である fakecygpty.exe と EPWING 形式の辞書をコマンドラインから呼び出す eblookup.exe をインストールします.

まず,fakecygpty.exe の元サイトは

GitHub - d5884/fakecygpty: Support for using cygwin pty with NTEmacs.
Support for using cygwin pty with NTEmacs. Contribute to d5884/fakecygpty development by creating an account on GitHub.

ですが,自分でコンパイルしないといけないので,面倒な場合は,

fakecygpty を使うための設定 - NTEmacs @ ウィキ
■ MinGW版 Emacs 特有の設定 【お知らせ】 次のページに興味深い情報があります。

にコンパイル済みのバイナリがあります.

※ 後で検証して分かったのですが,コンパイル済みのバイナリだと何故か改行コードの処理部分がうまく働かず lookup で検索した結果に ^M が表示されてしまいます.

Cygwin 上ですので,私の場合はコンパイルしました.コンパイルした fakecygpty.exe を今回は

C:\Opt\ntemacs\24.5\bin

に入れておきます.

次に,eblookup.exe ですが,元配布元のものは既にメインテナンスされなくなってかなり経っているようで,所々リンクが切れてる状態なので,今回は

Kazuhiro's blog - eblook 1.6.1+media

の eblook-1.6.1+media-20150724-ebu-4.4.3-20150301-win64.exe を eblook.exe にファイル名を変え

C:\Opt\ntemacs\24.5\bin

に入れています.

lookup のインストール

lookup も配布元のものではなく,

Kazuhiro's blog - Lookup 1.4+media

のものを用います.配布元のものでは,色々上手くいきません.Cygwin のシェルより,以下の通りの手順でインストールします.なお,/usr/local/src フォルダ以下に

lookup-1.4+media-20160602.tar.gz

があるとしています.

$ cd /usr/local/src
$ tar -zxvf lookup-1.4+media-20160602.tar.gz
$ cd  lookup-1.4+media-20160602/
$ EMACS=/cygdrive/c/Opt/ntemacs/24.5/bin/emacs.exe ./configure --with-lispdir=/cygdrive/c/Opt/ntemacs/24.5/share/emacs/site-lisp --infodir=/cygdrive/c/Opt/ntemacs/24.5/share/info
$ make
$ make install

PATH の設定

Windows の環境変数 PATH に,

  • C:\Opt\ntemacs\24.5\bin
  • C:\Opt\ntemacs\usr\local\bin
  • C:\Opt\cygwin64\bin

を付け加えておきます.なお,Cygwin から ntemacs を起動する場合は下の2つは不要です.この設定は,

「コントロールパネル」→「システムとセキュリティ」→「システム」→「システムの詳細設定」→「詳細設定」→「環境変数」

から可能です.

辞書の配置

今回は EPWING 辞書を

C:\Users\********\Documents\Epwing

以下に配置します.これ以外の場所に配置する場合は,~/.emacs/site-lisp/ntemacs.lookupの設定を変更してください.

結果と雑感

ここまで設定すれば,NTEmacs を起動して,「ESC + x」してから lookup と打てば,「f + 検索語」で辞書を引くことができるはずです.辞書に図が含まれている場合は,以下の様に

Photo by hyt.

NTEmacs が図も表示してくれる部分が昔とは違いますね.

しかし,久しぶりにこの設定をやりましたが,EPWING 辞書は時代遅れになりつつあるのかもしれないなと感じました.と言うのも,EPWING 関係のプログラムは配布元ではほとんどメインテナンスされていないようですし,ホームページもリンク切れがたくさんあります.また,以前はEPWING 形式に変換可能だった「英辞郎」も今では変換不可能になってしまったようです.

私の場合は EPWING 辞書の資産がそれなりにあるので,あえて設定を行いましたが,これからは辞書アプリを購入するか,Webのものを使う,の2択になるのかな,という気がします.

タイトルとURLをコピーしました