直接调用命令和使用键绑定之间的区别

时间:2013-07-12 13:33:50

标签: emacs elisp

我是elisp的新手,如果以下方法完全笨拙,请原谅我。

在我目前正在使用的团队中,通常会使用pass语句关闭python块(如果它们不是通过关闭else或{{1等关键字来结束或者这样)。虽然不寻常,但这样做的好处是,如果无意中更改了程序的原始缩进(使用emacs except),可以随时恢复该程序的原始缩进。

为了使现有代码符合这个约定,我写了一个小的elisp函数:

indent-region

这个想法只是测试点击TAB是否会改变缩进,并在这种情况下插入(defun python-check-indent () "Check if automatic indentation changes current indent, insert pass keyword if it does." (interactive) (move-beginning-of-line 1) (skip-chars-forward " ") (if (< 0 (let (original) (setq original (point)) (indent-for-tab-command) (- (point) original) ) ) (progn (insert "pass") (newline) (indent-for-tab-command) ) ) (next-line) ) (global-set-key (kbd "C-`") 'python-check-indent) 语句。为了便于处理更长的代码块,它会前进到下一行。

当我使用pass运行它时,它会执行我想要的操作(除了它会略微移动空行),同时重复运行它以处理多行。但是,当我使用C-`键绑定重复运行它时,它会开始搞乱第二次调用时的代码。

以下是我的问题:使用M-x python-check-indent调用命令和使用其键绑定有什么区别?我怎么能改变这个功能不受这种差异影响呢?

emacs-version:2011-03-10的GNU Emacs 23.3.1(x86_64-apple-darwin,NS apple-appkit-1038.35)on black.porkrind.org

(编辑)当前的解决方法:我现在将它包装在键盘宏中,因此它“绑定”到C-x e,并且行为正常。

1 个答案:

答案 0 :(得分:3)

一般规则是最好避免复杂的交互 函数中的命令,因为它们可能会受到所有类型的影响 选项。

(defun python-check-indent ()
  "Check if automatic indentation changes current indent, insert pass keyword if it does."
  (interactive)
  (goto-char (line-beginning-position))
  (skip-chars-forward " ")
  (when (< 0
           (let (original)
             (setq original (point))
             (python-indent-line)
             (- (point) original)))
    (insert "pass\n")
    (python-indent-line))
  (forward-line))

然而,即使这可能也不好,因为python-indent-line的行为取决于last-commandpython-indent-trigger-commands。我认为最好将python-indent-line的第一次调用替换为计算目标缩进的代码而不是实际缩进,例如(nth python-indent-current-level python-indent-levels)

PS。如果您仍有问题,我建议您使用edebug并逐步执行该功能。