indent-[code-] 从 emacs LISP 函数中严格调用

indent-[code-]rigidly called from emacs LISP function

我正在尝试编写一个 emacs LISP 函数来取消缩进该区域 (严格地)。我可以将前缀参数传递给 indent-code-rigidly 或者 indent-rigidly 或 indent-region 它们都能正常工作,但我没有 想要总是传递一个负前缀参数来改变事物 离开了。

我目前的代码如下,但似乎什么也没做:

(defun undent ()
    "un-indent rigidly."
    (interactive)
    (list
        (setq fline (line-number-at-pos (region-beginning)))
        (setq lline (line-number-at-pos (region-end)))
        (setq curIndent (current-indentation))
        ;;(indent-rigidly fline lline (- curIndent 1))
        (indent-region fline lline 2)
        ;;(message "%d %d" curIndent (- curIndent 1))
    )
)

我想 (current-indentation) 不会让我得到第一行的缩进 该区域的第一行跟随该区域(因此第二个问题是 如何获得它!)。但即使我只对列使用常量(如图所示, 我没有看到此功能有任何改变。 尽管如果我取消注释 (message) 调用,它会显示合理的数字。

GNU Emacs 24.3.1,在 Ubuntu。如果重要的话,我会使用 (setq-default indent-tabs-mode nil)(cua-mode).

我一定是遗漏了一些明显的东西... ?

你的功能有很多问题,包括一些变化 基本的elisp要求。强烈推荐阅读 Emacs Lisp 参考手册(与 emacs 捆绑在一起)。如果您不熟悉编程和 lisp, 您可能还会发现 An Introduction to Emacs Lisp 有用(也与 Emacs).

阅读一些可能会有所帮助的内容

  • 阅读 elisp 参考中关于命令循环的部分。特别是, 查看描述如何定义新命令和使用的节点 'interactive',如果你想将你的函数绑定到一个键上,你将需要它 或者用 M-x.

  • 来调用它
  • 阅读 lisp 参考中关于变量的部分 并了解变量范围(局部 v 全局)。看看使用 'let' 而不是 比 'setq' 有什么区别。

  • 阅读 elisp 参考中关于 'positions' 的部分。特别是,看看 'save-excursion' 和 'save-restriction'。了解如何定义和使用 该地区也很重要。

不清楚您编写此函数是作为学习练习还是 不是。但是,以防万一您这样做是因为这是您需要做的事情 学elisp而不仅仅是做点什么,一定要通过Emacs 手册和索引。您似乎需要的是一个常见且得到很好支持的 要求。如果涉及编程模式,它会变得有点复杂 (与纯文本相反)。但是,对于 emacs,如果您需要的看起来像 这是一个常见的要求,你可以相当有信心它是 已经在那里 - 你只需要找到它(一开始可能是一个挑战)。

一个共同的约定是 functions/commands 被定义为“在 reverse' 当提供否定或通用参数时。任何命令 具有此功能也可以在 elisp 代码中作为函数调用 获得该行为所必需的参数,因此了解 inter-play 命令、函数和调用约定之间的关系很重要。

Tim X 所说的所有内容都是正确的,但如果您只需要一些有用的东西,或者一个示例来向您展示您自己的代码的方向,我认为您正在寻找这样的东西:

(defun unindent-rigidly (start end arg &optional interactive)
  "As `indent-rigidly', but reversed."
  (interactive "r\np\np")
  (indent-rigidly start end (- arg) interactive))

所有这一切都是用适当转换的前缀参数调用 indent-rigidly。如果您使用前缀参数 n 调用它,它将像您使用参数 -n 调用 indent-rigidly 一样工作。如果您省略前缀参数,它的行为就像您使用参数 -1 调用 indent-rigidly(而不是进入 indent-rigidly 的交互模式)。