interactive 参数的含义

若一个函数带有交互模式声明,则它是一个命令函数。即可以通过 M-x(execute-command) 来调用。

声明格式

(defun kumo-interactive-func ()
  (interactive "code-string")
  ;; do something...)

种类

  • Completion: 提供补全。TAB,SPC 和 RET 完成补全。
  • Existing: 必须是存在的对象名。不接受无效名称。如果输入无效则不会退出 minibuffer。
  • Default: 如果未输入则使用默认值。
  • No I/O: 不读取任何输入。因此不会使用提示符。
  • Prompt: 放在提示符或\n之前。
  • Special: 只能放在交互式字符参数前。

含义

  • 接收多个输入以 \n 来分隔。

  • *: 如果当前buffer处于read-only-mode时提示。 [Special]

  • @: 在第一个鼠标事件触发的window调用。[Special]

  • ^: 通过 shift 调用前需要标记区域,没有公共 shift 调用则停止标记。[Special]

  • a: 一个函数定义的符号名。[Existing, Completion, Prompt]

    (defun with-func-arg (arg)
      (interactive "aEnter a function:")
      (funcall arg))
    
  • b: buffer名(已存在)。[Existing, Completion, Default, Prompt]

  • B: buffer名(可以不存在)。[Completion, Default, Prompt]

  • c: 字符。(接收任意输入,不用回车,不能使用输入法)。[Prompt]

  • C: 一个interactive函数的符号名。即满足(commandp xx)为t。[Existing, Completion, Prompt]

  • d: 光标位置,提供 int 类型的参数。[No I/O]

  • D: 目录。[Existing, Completion, Default, Prompt]

  • e: 必须绑定一个非键盘事件。提供event的list形式参数。Input Events [No I/O]

    (defun with-not-keyboard-event-arg (arg)
      (interactive "e")
      (print arg)) ;; ((down-mouse-1 (#<window 130 on a.el> 2845 (664 . 365) 460355375 nil 2845 (94 . 15) nil (664 . 19) (7 . 23))))
    
    (global-set-key (kbd "<down-mouse-1>") 'with-not-keyboard-event-arg)
    
  • f: 文件名(已存在)。[Existing, Completion, Default, Prompt]

  • F: 文件名(可以不存在)。[Completion, Default, Prompt]

  • G: 文件名(可以不存在),如果只输入目录名不含有文件名则使用目录名。[Completion, Default, Prompt]

  • i: 总是提供nil作为参数。[No I/O]

  • k: 按键序列。一直读取知道触发按键映射的指令,或直到没定义的按键序列。提供 string 或 vector 的参数。k 只会读取down-event事件,而忽律之后的up-event(主要是指鼠标点击后松开的event)。可以使用 U code 读取up-event事件。[Prompt]

    (kbd "C-x")  "\C-x"
    (kbd "C-x C-f")  "\C-x\C-f"
    (kbd "C-x 4 C-f")  "\C-x4\C-f"
    (kbd "X")  "X"
    (kbd "RET")  "\^M"
    (kbd "C-c SPC")  "\C-c "
    (kbd "<f1> SPC")  [f1 32]
    (kbd "C-M-<down>")  [C-M-down]
    
  • K: 和 k 类似。改变已定义的按键序列。

  • m: mark位置。提供 int 类型的参数。[No I/O]

  • M: 任意文本。使用当前 buffer 的输入法在 minibuffer 中读取,并作为 string 返回。[Prompt]

  • n: int 类型参数。如果输入的不是 int 会提示再次输入。n 之前几乎不使用前缀参数。[Prompt]

  • N: 读取数字前缀参数。如果没有前缀参数则读取一个 int 作为参数。Prefix Command Arguments [Prompt]

  • p: 数字前缀参数。也可以不用p参数,直接在代码中判断 current-prefix-arg 的值。[No I/O]

    (defun with-num-arg (arg)
      (interactive "p")
      (print arg)) ;; 4 (numberp arg) t
    
    
    (defun with-expression-arg (arg)
      (interactive
       (list (prefix-numeric-value current-prefix-arg)))
      (print arg)) ;; 4 (numberp arg) t
    ;; Same as 'with-num-arg
    
  • P: 原始前缀参数。[No I/O]

    (defun with-num-arg (arg)
      (interactive "P")
      (print arg)) ;; (4) (lisp arg) t
    
  • r: region 的开始/结束位置。提供两个参数(beg end),唯一提供两个参数的code。如果调用该命令时没有触发 region 则会报错[No I/O]

  • s: 任意文本。读入 minibuffer 并作为 string 返回。使用 C-j 或 RET 终止输入。[Prompt]

  • S: 在 minibuffer 中读取输入的 interned symbol 名。使用 C-j 或 RET 终止输入。[Prompt]

  • U: 一个按键序列或者 nil。可以在 k 或 K 之后使用,以获取在 k 或 K 读取down-event后被忽略的up-event(如果有。主要是指鼠标点击后松开的event)。如果没有up-event被忽略则提供 nil 参数。[No I/O]

  • v: 一个用户声明的变量。即满足(custom-variable-p)为t。[Existing, Completion, Prompt]

  • x: 一个 list。不会被 evaluated。使用C-j 或 RET 终止输入。[Prompt]

    (defun with-list-arg (arg)
      (interactive "x")
      (print arg))
    ;; M-x with-list-arg is invoked; input (+ 1 2), print "(+ 1 2)"
    
  • x: 一个 list。会被 evaluated。使用C-j 或 RET 终止输入。[Prompt]

    (defun with-list-arg (arg)
      (interactive "X")
      (print arg))
    ;; M-x with-list-arg is invoked; input (+ 1 2), print "3"
    
  • z: 一个 code system 名(symbol)。如果输入为无效 code system,则参数为 nil。 [Completion, Existing, Prompt]

    (defun save-buffer-as-utf8 (coding-system)
      "Revert a buffer with `CODING-SYSTEM' and save as UTF-8."
      (interactive "zCoding system for visited file (default nil):")
      (revert-buffer-with-coding-system coding-system)
      (set-buffer-file-coding-system 'utf-8))
    
  • Z: 一个 code system 名(symbol)。仅当该命令有前缀参数时,否则参数为 nil。 [Completion, Existing, Prompt]