パッケージ管理したい(use-package

(require 'package)

(setq package-archives
      '(("gnu" . "https://elpa.gnu.org/packages/")
        ("melpa" . "https://melpa.org/packages/"))
)

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package)
)

(eval-when-compile
  (require 'use-package)
)

(setq use-package-always-ensure t
      use-package-expand-minimally t
      use-package-compute-statistics t
)

use-packageはパッケージ管理を強化するパッケージです。 Emacs24から利用がはじまり、Emacs27あたりから、標準的なパッケージとして使われています。

パッケージを読み込みたい

;; before
(require 'foo)

;; after
(use-package foo)

これまでrequireしていたパッケージを、use-packageに置き換えるだけです。

変数を設定したい(:custom / :init / :config)

;; これまで
(require 'foo)
(setq foo-option t)

;; 置き換え
(use-package foo
  :custom
  (foo-custom t)
  :init
  (message "before loading foo")
  (setq foo-before t)
  :config
  (message "after loading foo")
  (setq foo-after t)
)

:customオプションで、パッケージ設定を宣言的に変更できます。 これは内部的にcustom-set-variableを使用しています。

これまでのようにsetqを使って設定することもできます。 :initオプションは、パッケージを読み込む前、 :configオプションは、パッケージを読み込んだ後に実行されます。

注釈

:init:configでは、任意のElispコードを使って自由に設定できます。 しかし、よほどのElisp上級者でない限り、:customで設定変更することをオススメします。

フックしたい(:hook

(require 'foo)
(add-hook 'foo-mode-hook #'function)

(use-package foo
  :hook
  (foo-mode . func)
)

:hookオプションで、パッケージを読み込んだときのフックを設定できます。 これはadd-hookの置き換えです。

キーバインドしたい(:bind

(require 'foo)
(global-set-key (kbd "C-key bind") 'foo-function)

(use-package foo
  :bind
  ("C-key bind" . foo-function)
)

:bindオプションで、パッケージごとにキーバインドを設定できます。 これはglobal-set-keykbd関数の置き換えです。

リポジトリ指定したい(:straight

(use-package some-package
  :straight (some-package
             :type git
             :host github
             :repo "user/repo"
             :branch "main"
             )
)

:straightオプションで、パッケージのリポジトリを設定できます。 ブランチやタグも指定できるので、バージョンを細かく管理できます。

注釈

:straightを使うにはstraight.eluse-packageの連携の設定が必要です。 straight.elpackage.elのようなパッケージ管理ツールです。

よく使うパッケージしたい

(use-package which-key
  :config
  (which-key-mode)
)

(use-package vertico
  :init
  (vertico-mode)
)

(use-package orderless
  :custom
  (completion-styles '(orderless basic))
  (completion-category-defaults nil)
  (completion-category-overrides nil)
)

(use-package marginalia
  :init
  (marginalia-mode)
)

(use-package consult
  :bind
  (("C-s" . consult-line)
   ("C-x b" . consult-buffer))
)

(use-package magit
  :bind ("C-x g" . magit-status)
)