NTEmacs で lookup する備忘録です.
NTEmacs について
Windows 版 Emacs (通称 NTEmacs) の 64bit 版 version 24.5 です.有り難いことに

でコンパイル済みのバイナリを配布してくれています.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 の元サイトは

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

にコンパイル済みのバイナリがあります.
※ 後で検証して分かったのですが,コンパイル済みのバイナリだと何故か改行コードの処理部分がうまく働かず lookup で検索した結果に ^M が表示されてしまいます.
Cygwin 上ですので,私の場合はコンパイルしました.コンパイルした fakecygpty.exe を今回は
C:\Opt\ntemacs\24.5\bin
に入れておきます.
次に,eblookup.exe ですが,元配布元のものは既にメインテナンスされなくなってかなり経っているようで,所々リンクが切れてる状態なので,今回は
の eblook-1.6.1+media-20150724-ebu-4.4.3-20150301-win64.exe を eblook.exe にファイル名を変え
C:\Opt\ntemacs\24.5\bin
に入れています.
lookup のインストール
lookup も配布元のものではなく,
のものを用います.配布元のものでは,色々上手くいきません.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 + 検索語」で辞書を引くことができるはずです.辞書に図が含まれている場合は,以下の様に
NTEmacs が図も表示してくれる部分が昔とは違いますね.
しかし,久しぶりにこの設定をやりましたが,EPWING 辞書は時代遅れになりつつあるのかもしれないなと感じました.と言うのも,EPWING 関係のプログラムは配布元ではほとんどメインテナンスされていないようですし,ホームページもリンク切れがたくさんあります.また,以前はEPWING 形式に変換可能だった「英辞郎」も今では変換不可能になってしまったようです.
私の場合は EPWING 辞書の資産がそれなりにあるので,あえて設定を行いましたが,これからは辞書アプリを購入するか,Webのものを使う,の2択になるのかな,という気がします.

