【2024年版】Emacs Lisp を開発するための基本パッケージ

https://qiita.com/javacommons/items/40cc831b1a6315387a63

# はじめに

Emacs Lisp のコードやパッケージを開発するために便利な設定を紹介します。
staraight.el (git にパスが通っていることが必要) を使って設定する場合には以下の設定を .emacs または .emacs.d/init.el に追加してください。

```elisp
(defvar bootstrap-version)
(let ((bootstrap-file
       (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
      (bootstrap-version 6))
  (unless (file-exists-p bootstrap-file)
    (with-current-buffer
        (url-retrieve-synchronously
         "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el"
         'silent 'inhibit-cookies)
      (goto-char (point-max))
      (eval-print-last-sexp)))
  (load bootstrap-file nil 'nomessage))

;; c-quick
(straight-use-package '(c-quick :type git :host github :repo "emacs-pkg/c-quick"))
(require 'c-quick)

;; xprint
(straight-use-package '(xprint :type git :host github :repo "emacs-pkg/xprint"))
(require 'xprint)

;; company
(straight-use-package 'company)
(require 'company)
(setq company-idle-delay 0) ; デフォルトは0.5
(setq company-minimum-prefix-length 1) ; デフォルトは4
(setq company-selection-wrap-around nil) ; 候補の一番下でさらに下に行こうとすると一番上に戻る
(add-hook 'emacs-lisp-mode-hook '(lambda () (company-mode 1)))
(add-hook 'lisp-interaction-mode-hook '(lambda () (company-mode 1)))
(add-hook 'lisp-mode-hook '(lambda () (company-mode 1)))
```

staraight.el を使わない場合には、c-quick と xprint は以下の設定を書けば追加できます。

```elisp
(unless (featurep 'get-feature)
  (defun get-feature (feature-name &optional url file-name)
    (if (featurep feature-name) t
      (unless url (setq url (format "https://github.com/emacs-pkg/%s/raw/main/%s.el"
                                    feature-name feature-name)))
      (unless file-name (setq file-name (format "%s.el" feature-name)))
      (let ((make-backup-files nil)
            (file-path (expand-file-name file-name user-emacs-directory)))
        (ignore-errors
          (url-copy-file url file-path 'ok-if-already-exists))
        (ignore-errors
          (load file-path nil 'nomessage))
        (featurep feature-name))))
  (get-feature 'get-feature))

(get-feature 'c-quick)
(get-feature 'xprint)
```

straight.el なしで company をインストールするには以下の記事などを参考にお願いします。

https://qiita.com/emacs_hhkb/items/748f84de7a963e29412f

# 使い方 (開発手順)

上記の設定で、c-quick, xprint, company が設定されていれば、次のようなことができます。

## 1. 関数名の入力補完 (company)

Emacs を開いて、`*scratch*` バッファを開きます。

M-x switch-to-buffer (C-x b) するか、C-TAB (or C-ENTER) でタブを回転させます(c-quick の機能)。

例えば、以下のようなコードを入力したいとします。

```elisp
(defun add2 (a b)
  (xdump a b)
  (+ 11 22))
```

`defun` や `xdump` という関数名を入力しようとすると自動的に候補が表示されます。
TAB or ENTER で確定できます。候補が複数ある場合は、上下キーで選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/69ed8332-1ee6-f0de-ec3c-5288fbf43292.png)


## 2. 関数定義へのジャンプ (1)

xdump という関数(実際はマクロ)の上にカーソルを置いて、F12 を押すと、xprint.el というファイルが開いて、xdump マクロが位置付けられます。ネイティブ関数などの場合はヘルプが開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/32483711-e1a9-e6d6-583f-14d7e8bfae8c.png)

## 3. 関数定義へのジャンプ (2)

(Lisp コードを開いてない場合でも) C-S-F12 (or C-M-F12) を押すと、ミニバッファに
「File Name or Function Name (Completion):」と表示されます。
コンプリーションを使いながら、「shell」と入力して ENTER を押すと、M-x shell の定義である shell 関数の定義が位置付けられます(shell.el 内)。

## 4. 任意の Emacs Lisp ファイルへジャンプ

C-S-F12 (or C-M-F12) を押すと、ミニバッファに
「File Name or Function Name (Completion):」と表示されますが、この際に、load-path 上にある emacs lisp ファイルもコンプリーションの一覧に含まれます。
「shell.el」「c-quick.el」「xprint.el」等を入力して ENTER を押すと、それぞれのファイルが開かれます。

また、「init.el」と入力して ENTER を押すと、.emacs.d/init.el が開きます。

## 以上です

# 最後に

このようにして、Emacs Lisp の関数名(マクロ名)の入力補完や、関数のクロスリファレンスや、任意の elisp ファイルへのジャンプ機能を駆使すれば開発効率があがるでしょう。
C-S-F12 (or C-M-F12) で init.el をすぐに開けるのも便利です。

ぜひ試してみてください。

c-quick や xprint については以下の記事等をご覧ください。

https://qiita.com/javacommons/items/9d8d50987eff76637f7c

https://qiita.com/javacommons/items/b7fc1f6db519d2046ea9


それでは！