MacOSのEmacsにEPWING形式の辞書を導入する

表題に関して、こちらを参考にした。

ただ同記事はUbuntu前提だったので、Macでの導入ログを残しておく。

1. EBライブラリをダウンロードしてインストール
- http://www.mistys-internet.website/eb/
- configure, make, make install

2. eblookをダウンロードしてインストール
- http://ikazuhiro.s206.xrea.com/staticpages/index.php/eblook
- configure, make, make install

3. lookupをインストール
- http://ikazuhiro.s206.xrea.com/staticpages/index.php/lookup
- configure, make, make install
- デフォルトで /usr/local/share/emacs/site-lisp/lookup/ にインストールされる

4. lookupをロードパスの通ったところに置く
- 上記のインストール先からシンボリックリンクを貼るなりする

5. EPWING形式の辞書をダウンロードして好きな場所に置く
- WordNet EPWING https://wordnetepwing.osdn.jp/ より、
『Princeton WordNet 3.0 と日本語WordNet 1.1の統合版』をダウンロード
- 以下の設定では辞書を ~/.emacs.d/share/lookup 以下に wordnet-en-jpとして置いた

6. Emacsの設定を書く

(autoload 'lookup "lookup" nil t)
(autoload 'lookup-region "lookup" nil t)
(autoload 'lookup-pattern "lookup" nil t)

(setq lookup-enable-splash nil)
(setq lookup-search-agents
        '(
          (ndeb "~/.emacs.d/share/lookup/wordnet-en-jp")
          )))

これで使えるようになる。関数たちは以下(キーバインドは追記予定)。

関数名 機能
lookup lookupを起動し、設定した辞書のリストを表示する
lookup-region リージョンで選択した単語を対象に辞書を引く
lookup-word カーソル近くのwordを対象に辞書を引く
lookup-exit lookupを終了する

Mac OS (Big Sur)に音声認識エンジンJuliusをインストールしたときの記録

音声認識エンジンJuliusのソースコードgithubからダウンロード

解凍後、configureを掛けてmakeする

./configure
make

すると以下のエラーに遭遇した:

src/adin/adin_mic_darwin_coreaudio.c:99:3: error: implicit declaration of
      function 'jlog' is invalid in C99
      [-Werror,-Wimplicit-function-declaration]
  jlog("Stat: adin_darwin: ----- details of stream -----\n");

これを回避するため、まずportaudioをbrew経由でインストールしておく。

brew install portaudio

そしてconfigure時に追加のオプションを指定する

./configure --with-mictype=portaudio

するとコンパイル、インストールが通る。

make
make install

EmacsからOverleafを触るための設定

Atomic Chrome for Emacsというパッケージを使う。

要するに、Chrome拡張 Atomic Chromeの力を借りて、Chrome上でのテキストエリア編集をEmacsから実現できるようにしたパッケージである。Atomic Chrome for Emacsについては作者様の記事を読むのがよい。

そして以下の設定を使う。
atomic-chrome-url-major-mode-alistが、URLとEmacs編集時のメジャーモードを紐づけるための変数である。つまりOverleafはオンラインのLaTeX編集サービスなので、"overleaf.com"をlatex-modeと関連付けるわけである。

なおOverleafで編集時、atomic-chrome-enable-auto-updatenilにしておかないとsync errorが発生する。

(require 'atomic-chrome)
(atomic-chrome-start-server)

(setq atomic-chrome-enable-auto-update nil)
(setq atomic-chrome-url-major-mode-alist
      '(("overleaf\\.com" . latex-mode)))

『制御理論における数学』シリーズへのリンク

『計測と制御』誌に掲載された、『制御理論における数学』と題される一連の解説記事がある。 本記事は備忘録としてそのリンクを掲載するものである。

版元ドットコムのリンク集(理数系・理工系書籍の出版社別)

版元ドットコムという、書誌情報を検索できるWebサービスがある。
www.hanmoto.com
検索を活用することで、出版社別に書誌情報を検索することができ、特に出版予定の書籍がいち早くリストアップされるのが嬉しい。

理数系・理工系書籍の出版をメインにしている会社別に、検索結果にアクセスできるようリンクをまとめてみた。

単に岩波書店講談社で検索すると、多様な書籍がヒットするので、今回のリンクからは除外した。

consult-lineのmigemo化に向けた試作

consult-lineはswiperの代替として便利に使える。これをmigemo化したいということである。
プロンプトに続いて検索したい日本語を「ローマ字読み」入力すると、それをもとにconsult-lineが走るという、単純なラッパーである。

(defun consult-line-migemo ()
  (interactive)
  (let ((input (read-string "Input: " nil)))
    (consult-line (migemo-get-pattern input))))

isearch中に発動したいならこちら。以下の設定ではisearch中に"C-:"とすると、そのクエリをmigemo化してconsult-lineが発動する。

(define-key isearch-mode-map (kbd "C-:") 'consult-line-migemo-isearch)
(defun consult-line-migemo-isearch ()
  (interactive)
  (consult-line (migemo-get-pattern isearch-string)))


通常の"C-s"でisearch-forward, "C-u C-s"でカーソル下のシンボルを初期値にしたconsult-line、"C-u C-u C-s"でconsult-line-migemoが発動する関数も書くことができる(selectrum-modeの使用を前提)。

(defun consult-line-symbol-at-point ()
  (interactive)
  (consult-line (thing-at-point 'symbol)))

(defun my-isearch-or-consult (use-consult)
  (interactive "p")
  (cond ((eq use-consult 1)
         (call-interactively 'isearch-forward))
        ((eq use-consult 4)
         (call-interactively 'consult-line-symbol-at-point))
        ((eq use-consult 16)
         (call-interactively 'consult-line-migemo))))

(global-set-key (kbd "C-s") 'my-isearch-or-consult)

もし C-u C-sでconsult-lineにデフォルト入力されたシンボルを消したい場合は、

(define-key selectrum-minibuffer-map (kbd "C-l") #'selectrum-backward-kill-sexp)

とすると"C-l"で消せる。

selectrum/consult/marginaliaの設定

ivy/counsel系の代替として、selectrumやconsultが最近来ている。

特徴をまとめた方がいる:

  • selectrum … ivyに対応。ivyよりも実装はシンプル。
  • consult ... counselに対応。counselにはないユニーク機能を持つコマンドを提供したり。consult-bufferはその例。
  • marginalia ... ivy-richに対応。

最近使っているので設定を残す。
まずはseletrumとmarginalia-mode。

(eval-when-compile (require 'selectrum))
(eval-when-compile (require 'selectrum-prescient))
(declare-function selectrum-mode "selectrum")
(declare-function selectrum-prescient-mode "selectrum-prescient")

(require 'selectrum)
(selectrum-mode +1)
(define-key selectrum-minibuffer-map (kbd "C-l") #'selectrum-backward-kill-sexp)
(setq selectrum-max-window-height 20)

;; to make sorting and filtering more intelligent
(require 'selectrum-prescient)
(selectrum-prescient-mode +1)
(require 'prescient)
(prescient-persist-mode 1)
(setq prescient-aggressive-file-save t)
;; selectrum-prescient-enable-filtering : t
;; selectrum-prescient-enable-sorting : t

;; selectrumのivy-rich
;; https://github.com/minad/marginalia
(require 'marginalia)
(marginalia-mode +1)
(setq marginalia-align-offset 25) ; 右端にどれだけスペースを詰めるか
;; (setq marginalia-truncate-width 80)
;; (setq marginalia-margin-threshold 200)
;; (setq marginalia-separator-threshold 120)

;; marginalia-annotators 初期値およびサイクル順を指定する
(setq marginalia-annotators
      '(marginalia-annotators-light marginalia-annotators-heavy nil))

;; marginalia-annotatorsをサイクルする
(define-key minibuffer-local-map (kbd "C-M-a") #'marginalia-cycle)

;; When using Selectrum, ensure that Selectrum is refreshed
;; when cycling annotations.
(advice-add #'marginalia-cycle :after
            (lambda () (when (bound-and-true-p selectrum-mode)
                         (selectrum-exhibit 'keep-selected))))

次はconsult。

(require 'consult)

;; consult-line ... swiper の代替
;; consult-isearch ... isearch中にconsultインタフェースでクエリを再入力し、isearch再実行
;; consult-multi-occur ... multi-occurの代替
;; consult-focus-line ... クエリにヒットする部分のみを抽出して「表示」する(他が隠れる, narrowing)。
;; その後、C-uつきで呼び出すと、隠れていた部分が表示される(もとに戻る, widen)
;; consult-recent-file ... 最近開いたファイルを選択

(setq consult-async-refresh-delay 0.2)

(global-set-key (kbd "C-z C-n") 'consult-recent-file)

;; consult-buffer時などにおけるpreview機能の調整
(setq consult-preview-key nil) ; 常にプレビューOFF
;; (setq consult-preview-key 'any) ; 常にプレビューON
;; (setq consult-preview-key (kbd "C-M-p")) ; これを押したときだけプレビュー

;; 以下のコマンド群については、M-.でプレビュー
(dolist (cmd '(consult-ripgrep consult-grep consult-bookmark consult-recent-file))
    (setf (alist-get cmd consult-config) `(:preview-key ,(kbd "M-."))))

;; カーソル下のシンボルを拾ってconsult-line発動
(defun consult-line-symbol-at-point ()
  (interactive)
  (consult-line (thing-at-point 'symbol)))

(defun my-isearch-or-consult (use-consult)
  (interactive "p")
  (cond ((eq use-consult 1)
         (call-interactively 'isearch-forward))
        ((eq use-consult 4)
         (call-interactively 'consult-line-symbol-at-point))
        ((eq use-consult 16)
         (call-interactively 'consult-line))))

(global-set-key (kbd "C-s") #'my-isearch-or-consult)
(define-key isearch-mode-map (kbd "C-:") #'consult-isearch) ; 実質的な絞り込み
(define-key isearch-mode-map (kbd "C-;") #'consult-line) ; swiperに対応

;; 絞り込み対象をバッファに限定 : b SPC
;; 絞り込み対象をファイル(recentf)に限定 : f SPC
;; 絞り込み対象をブックマークに限定 : m SPC
(global-set-key (kbd "C-x b") #'consult-buffer)

;; consult--source-fileの公式実装では「現在バッファとして保持しているファイル」が
;; ファイル(recentf)の検索対象から除外されるので、
;; それをやめるため単純にitemsにrecentf-listだけを持ってくる。
;; この設定の影響範囲はconsult-bufferのみ。consult-recent-fileは影響を受けない。
(setq consult--source-file
  `(:name     "File"
    :narrow   ?f
    :category file
    :face     consult-file
    :history  file-name-history
    :action   ,#'consult--file-action
    :enabled   ,(lambda () recentf-mode)
    :items ,recentf-list))

;; consult-ripgrepがデフォルトで複数ファイルを対象にした串刺し検索なので、
;; 検索対象をカレントバッファに限定
(defun consult-ripgrep-current-buffer ()
  "Call `consult-line' for the current buffer (a single file)."
  (interactive)
  (let ((consult-ripgrep-command
         (concat "rg "
                 "--null "
                 "--line-buffered "
                 "--color=ansi "
                 "--max-columns=250 "
                 "--no-heading "
                 "--line-number "
                 ;; adding these to default
                 "--smart-case "
                 "--hidden "
                 "--max-columns-preview "
                 ;; add back filename to get parsing to work
                 "--with-filename "
                 ;; defaults
                 "-e ARG OPTS "
                 (shell-quote-argument buffer-file-name))))
    (consult-ripgrep)))