\ #+TITLE: my-lisp の読み込み手順 #+AUTHOR: Takahiro Ohkubo #+LANGUAGE: ja #+OPTIONS: toc:2 num:nil ^:nil * 概要 このディレクトリには、自作 Emacs Lisp を置きます。 想定ディレクトリは以下です。 #+begin_src sh ~/.emacs.d/site-lisp/my-lisp/ #+end_src 現在の例では、以下のファイルを読み込みます。 #+begin_src sh my-labai.el my-org-pukiwiki.el my-org-unfill-aware.el my-qrcode.el my-replace-zen-to-ascii.el my-yatex-review-highlight.el #+end_src * init.el で load-path に追加する まず、=init.el= の先頭付近に以下を追加します。 #+begin_src emacs-lisp ;; ------------------------------------------------------------ ;; local lisp ;; ------------------------------------------------------------ (add-to-list 'load-path (expand-file-name "~/.emacs.d/site-lisp/my-lisp")) #+end_src 既に以下のようにして、=~/.emacs.d/site-lisp/= 以下のサブディレクトリを 自動的に =load-path= へ追加している場合は、この設定だけでも動作します。 #+begin_src emacs-lisp (cd "~/.emacs.d/site-lisp/") (if (fboundp 'normal-top-level-add-subdirs-to-load-path) (normal-top-level-add-subdirs-to-load-path)) (cd "~") #+end_src ただし、自作 Lisp の場所を明示した方が分かりやすいので、以下を追加しておく ことを推奨します。 #+begin_src emacs-lisp (add-to-list 'load-path (expand-file-name "~/.emacs.d/site-lisp/my-lisp")) #+end_src * init.el で require する =init.el= に以下を追加します。 #+begin_src emacs-lisp ;; ------------------------------------------------------------ ;; my-lisp ;; ------------------------------------------------------------ (require 'my-labai) (require 'my-org-pukiwiki) (require 'my-org-unfill-aware) (require 'my-qrcode) (require 'my-replace-zen-to-ascii) (require 'my-yatex-review-highlight) #+end_src ただし、各 =.el= ファイルの末尾に以下のような =provide= が必要です。 #+begin_src emacs-lisp (provide 'my-org-unfill-aware) #+end_src 例えば、=my-replace-zen-to-ascii.el= の末尾には以下が必要です。 #+begin_src emacs-lisp (provide 'my-replace-zen-to-ascii) #+end_src * provide がない場合の読み込み方法 もし =provide= がない古い Lisp ファイルがある場合は、=require= ではなく =load= を使います。 #+begin_src emacs-lisp (load "my-labai") (load "my-org-pukiwiki") (load "my-org-unfill-aware") (load "my-qrcode") (load "my-replace-zen-to-ascii") (load "my-yatex-review-highlight") #+end_src ただし、今後は各ファイル末尾に =provide= を追加して、=require= で読み込む 形式に統一する方が良いです。 * 安全な読み込み方法 ファイルが存在する場合だけ読み込むには、以下のようにします。 #+begin_src emacs-lisp ;; ------------------------------------------------------------ ;; my-lisp ;; ------------------------------------------------------------ (add-to-list 'load-path (expand-file-name "~/.emacs.d/site-lisp/my-lisp")) (dolist (lib '(my-labai my-org-pukiwiki my-org-unfill-aware my-qrcode my-replace-zen-to-ascii my-yatex-review-highlight)) (when (locate-library (symbol-name lib)) (require lib))) #+end_src この方法では、ファイルが見つからない場合は無視されます。 ただし、設定ミスに気づきにくくなるため、普段使いでは単純に =require= する方が おすすめです。 * 推奨する init.el 追記例 以下を =init.el= の local lisp 設定の後ろあたりに追加します。 #+begin_src emacs-lisp ;; ------------------------------------------------------------ ;; my-lisp ;; ------------------------------------------------------------ (add-to-list 'load-path (expand-file-name "~/.emacs.d/site-lisp/my-lisp")) (require 'my-labai) (require 'my-org-pukiwiki) (require 'my-org-unfill-aware) (require 'my-qrcode) (require 'my-replace-zen-to-ascii) (require 'my-yatex-review-highlight) #+end_src * キー設定例 ** Org の改行削除 =my-org-unfill-aware.el= 用のキー設定例です。 #+begin_src emacs-lisp (bind-key "C-c u a" 'my-org-unfill-aware-ascii) (bind-key "C-c u j" 'my-org-unfill-aware-japanese) (bind-key "C-c u u" 'my-org-unfill-aware-auto) (bind-key "C-c u A" 'my-org-unfill-aware-ascii-copy) (bind-key "C-c u J" 'my-org-unfill-aware-japanese-copy) (bind-key "C-c u C" 'my-org-unfill-aware-auto-copy) #+end_src ** 全角英数字・上付き下付き数字の ASCII 化 =my-replace-zen-to-ascii.el= 用のキー設定例です。 #+begin_src emacs-lisp (bind-key "C-c h" 'replace-zen-to-ascii-region) (bind-key "C-c H" 'replace-zen-to-ascii-region-copy) #+end_src ** Org から PukiWiki 変換 =my-org-pukiwiki.el= に定義されている関数名に合わせて設定します。 例: #+begin_src emacs-lisp ;; 関数名は my-org-pukiwiki.el の定義に合わせて調整する ;; (bind-key "C-c p" 'my-org-pukiwiki-export-to-buffer) ;; (bind-key "C-c P" 'my-org-pukiwiki-copy-to-clipboard) #+end_src ** QR code 表示 =my-qrcode.el= に定義されている関数名に合わせて設定します。 例: #+begin_src emacs-lisp ;; 関数名は my-qrcode.el の定義に合わせて調整する ;; (bind-key "C-c q" 'my-qrcode-region) #+end_src * 読み込み確認 Emacs 起動後、以下を評価します。 #+begin_src emacs-lisp (locate-library "my-org-unfill-aware") #+end_src 以下のようなパスが返れば、=load-path= の設定は成功です。 #+begin_example "/Users/takahiro/.emacs.d/site-lisp/my-lisp/my-org-unfill-aware.el" #+end_example また、関数が定義されているか確認するには、以下を評価します。 #+begin_src emacs-lisp (fboundp 'my-org-unfill-aware-auto) (fboundp 'replace-zen-to-ascii-region) #+end_src =t= が返れば読み込み成功です。 * コマンドラインで起動確認する GUI を起動せずに =init.el= の読み込み確認をするには以下を実行します。 #+begin_src sh emacs --batch -l ~/.emacs.d/init.el #+end_src エラーがなければ読み込みは概ね成功です。 * よくあるエラー ** Cannot open load file 例: #+begin_example Cannot open load file: No such file or directory, my-org-unfill-aware #+end_example 原因は、=load-path= にディレクトリが入っていないことです。 対処: #+begin_src emacs-lisp (add-to-list 'load-path (expand-file-name "~/.emacs.d/site-lisp/my-lisp")) #+end_src ** Required feature was not provided 例: #+begin_example Required feature ‘my-org-unfill-aware’ was not provided #+end_example 原因は、ファイル末尾に =provide= がないことです。 対処: #+begin_src emacs-lisp (provide 'my-org-unfill-aware) #+end_src をファイル末尾に追加します。 ** Symbol's function definition is void 例: #+begin_example Symbol's function definition is void: my-org-unfill-aware-auto #+end_example 原因は、関数が定義されていない、またはファイルが読み込まれていないことです。 対処: #+begin_src emacs-lisp (require 'my-org-unfill-aware) #+end_src を確認します。 * 推奨配置 最終的には以下のような構成にします。 #+begin_example ~/.emacs.d/ ├── init.el └── site-lisp/ └── my-lisp/ ├── my-labai.el ├── my-org-pukiwiki.el ├── my-org-unfill-aware.el ├── my-qrcode.el ├── my-replace-zen-to-ascii.el └── my-yatex-review-highlight.el #+end_example * メモ =normal-top-level-add-subdirs-to-load-path= を使っている場合、 =~/.emacs.d/site-lisp/my-lisp/= は自動的に =load-path= に入るはずです。 しかし、自作 Lisp の管理を明確にするため、次の1行は入れておく方が安全です。 #+begin_src emacs-lisp (add-to-list 'load-path (expand-file-name "~/.emacs.d/site-lisp/my-lisp")) #+end_src