我写过的Emacs函数的“错误类型参数”

时间:2012-10-25 21:57:43

标签: emacs elisp

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

  • 如果我在迷你缓冲区中,请使用单词填写。
  • 否则,如果选择了某个区域,请缩进它。
  • 否则,在该点缩进该行(使用制表符到制表符停止)。

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

(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)

我应该做什么呢?

2 个答案:

答案 0 :(得分:2)

(defun ajf-tab-fun ()
  (interactive)     ; add interactive to let emacs know to call it interactively
   (if (minibufferp)
     (minibuffer-complete)
     (my-tab)))

你刚忘了(interactive)

答案 1 :(得分:0)

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