教程

autoload

  • 使用 :commands 关键字

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    (use-package color-moccur
      :commands (isearch-moccur isearch-all) ;; 自动 autoload
      :bind (("M-s O" . moccur)
             :map isearch-mode-map
             ("M-o" . isearch-moccur)
             ("M-O" . isearch-moccur-all))
      :init
      (setq isearch-lazy-highlight t)
      :config
      (use-package moccur-edit))

key-binding 绑定

  • 参考

  • 功能

    • :bind

      • command 绑定
    • :bind-keymap

      • keymap 绑定
  • 使用 :bind 关键字

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    (use-package color-moccur
      :commands (isearch-moccur isearch-all)
      :bind (("M-s O" . moccur) 			;; 全局绑定
    
             :map isearch-mode-map			;; mode 内绑定
             ("M-o" . isearch-moccur)
             ("M-O" . isearch-moccur-all))
      :init
      (setq isearch-lazy-highlight t)
      :config
      (use-package moccur-edit))

特性

  • 自动创建 autoload

    1
    2
    
    (use-package ace-jump-mode
      :bind ("C-." . ace-jump-mode))
    • 自动创建 autoload –> ace-jump-mode
    • 等价实现

      1
      2
      3
      4
      
      (use-package ace-jump-mode
        :commands ace-jump-mode
        :init
        (bind-key "C-." 'ace-jump-mode))

绑定 全局 :bind

  • eg:

    1
    2
    3
    4
    5
    6
    7
    
      (use-package my-package
        :bind
        (
         ("key-1" . fun1)
         ("key-2" . fun2)
         )
        )

keymap 绑定 :bind-keymap

  • 使用 :bind-keymap 关键字
  • 原因解释

    • keymap 不是 function, 因此不能使用 :bind
  • eg: projectile keymap

    1
    2
    3
    
      (use-package projectile
        :bind-keymap
        ("C-c p" . projectile-command-map))

local keymap 绑定

  • local keymap 特点

    • local keymap 必须在 package 加载后,才能存在
  • 用法

    • :bind 内部嵌套 :map 关键字
  • 解释

    • 绑定 keymap 内部存在的 command
  • 特性

    • 加载 package 完成后,再 完成绑定
  • eg: 单个绑定

    1
    2
    3
    
      (use-package helm
        :bind (:map helm-command-map
               ("C-c h" . helm-execute-persistent-action)))
  • eg: 多组绑定

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      (use-package term
        :bind (("C-c t" . term)
               :map term-mode-map
               ("M-p" . term-send-up)
               ("M-n" . term-send-down)
               :map term-raw-map
               ("M-o" . other-window)
               ("M-p" . term-send-up)
               ("M-n" . term-send-down)))

auto-mode-alist (文件 Mode 列表) 和 interpreter-mode-alist (解释器 Mode 列表)

auto-mode-alist

  • 使用 :mode 实现

interpreter-mode-alist

  • 使用 :interpreter 实现

例子

  • eg:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
      ;; package 名 和 mode 名 一致
      (use-package ruby-mode
        :mode "\\.rb\\'"
        :interpreter "ruby")
    
      ;; package 名 和 mode 名 不一致
      ;; The package is "python" but the mode is "python-mode":
      (use-package python
        :mode ("\\.py\\'" . python-mode)
        :interpreter ("python" . python-mode))

异步加载 :defer

  • 隐式自动调用 :defer 的关键字

    • :bind, :bind*, :bind-keymap, :bind-keymap*, :mode, :interpreter, :hook

shell bang 探测 (类似 #!/bin/bash -e)

  • 使用 :magic 关键字
  • 作用

    • 类似 :mode 和 auto-mode-alist 指定文件 的 mode
  • :magic 和 :magic-fallback 比较

    • 优先级 :mode > :magic-fallback
  • eg:

    1
    2
    3
    4
    5
    
      (use-package pdf-tools
        :load-path "site-lisp/pdf-tools/lisp"
        :magic ("%PDF" . pdf-view-mode)
        :config
        (pdf-tools-install :no-query))
    • 文件开头匹配 %PDF, 自动启用 pdf-view-mode

Hook 钩子

  • 作用:绑定 当前 pakcage 提供的 hook 到 给定的 mode-hook
  • :hook 实现
  • 注意

    • :hook 到的 mode 不可以添加上 *-hook 后缀

例子

eg: 绑定到单个 mode

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
(use-package ace-jump-mode
  :hook prog-mode)

(use-package ace-jump-mode
  :hook (prog-mode . ace-jump-mode))

(use-package ace-jump-mode
  :commands ace-jump-mode
  :init
  (add-hook 'prog-mode-hook #'ace-jump-mode))

eg: 绑定到 多个 mode

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
(use-package ace-jump-mode
  :hook (prog-mode text-mode))

(use-package ace-jump-mode
  :hook ((prog-mode text-mode) . ace-jump-mode))

(use-package ace-jump-mode
  :hook ((prog-mode . ace-jump-mode)
         (text-mode . ace-jump-mode)))

(use-package ace-jump-mode
  :commands ace-jump-mode
  :init
  (add-hook 'prog-mode-hook #'ace-jump-mode)
  (add-hook 'text-mode-hook #'ace-jump-mode))

强制加载 hack 方法

  1. :ensure t

    • 强制在开始时加载

多个 use-package 代码块

  • 异常问题

    • win10 中,第二个 use-package 中的代码,不被执行
    • 解决办法

      • 第二个代码块添加 语句 :defer t

:hook 无效问题

  • 使用传统方法

    1
    2
    
    (with-eval-after-load 'python
      (add-hook 'python-mode-hook 'eglot-ensure))