【问题标题】:"wrong-type-argument" on an Emacs function I've written我编写的 Emacs 函数上的“错误类型参数”
【发布时间】:2012-10-16 04:31:57
【问题描述】:

我希望我的 Tab 键执行以下操作:

  • 如果我在 minibuffer 中,请使用单词补全。
  • 否则,如果选择了某个区域,则缩进它。
  • 否则,在该点缩进行(使用制表符到制表位)。

这是代码,其中一些是基于我在互联网上其他地方找到的片段:

(defun my-tab ()
  "If region is selected, indent it and keep it selected, else indent current line."
  (interactive)
       (if (use-region-p)
           (increase-left-margin (region-beginning) (region-end) nil)
           (tab-to-tab-stop))
        (setq deactivate-mark nil))
(defun my-untab ()
  "If region is selected, unindent it and keep it selected, else unindent current line."
  (interactive)
       (if (use-region-p)
           (decrease-left-margin (region-beginning) (region-end) nil)
         (indent-rigidly (line-beginning-position) (line-end-position) (- tab-width)))
        (setq deactivate-mark nil))
;; AJF: wrote this one myself
(defun ajf-tab-fun ()
   (if (minibufferp)
     (minibuffer-complete)
     (my-tab)))

(global-set-key (kbd "TAB") 'ajf-tab-fun)

问题是我按tab键的时候报错:

Wrong type argument: commandp, ajf-tab-fun

我将 debug-on-error 设置为 t 以便进行调试。这是输出:

Debugger entered--Lisp error: (wrong-type-argument commandp ajf-tab-fun)
  call-interactively(ajf-tab-fun nil nil)

我应该怎么做?

【问题讨论】:

标签: emacs elisp


【解决方案1】:

实际上,您描述的行为几乎已经是默认行为,除了“缩进”,默认是“根据主要模式缩进规则缩进”而不是“将文本向右(或向左)移动一个固定金额”。

【讨论】:

  • 是的,但我真的很喜欢有一种方法来控制我的缩进量。如果我想简单地要求代码为我决定,我可以调用其他函数。
【解决方案2】:
(defun ajf-tab-fun ()
  (interactive)     ; add interactive to let emacs know to call it interactively
   (if (minibufferp)
     (minibuffer-complete)
     (my-tab)))

你只是忘记了(interactive)

【讨论】:

  • 我将实际使用您的代码/您找到的代码并自己使用它:)
  • 酷!很高兴它对你有用。您的解决方案对我绝对有用!
猜你喜欢
  • 2011-01-05
  • 2013-12-31
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2018-03-26
相关资源
最近更新 更多