我是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,并且行为正常。
答案 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-command
和python-indent-trigger-commands
。我认为最好将python-indent-line
的第一次调用替换为计算目标缩进的代码而不是实际缩进,例如(nth python-indent-current-level python-indent-levels)
。
PS。如果您仍有问题,我建议您使用edebug
并逐步执行该功能。