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

时间:2017-02-10 22:56:06

标签: emacs indentation

我试图编写一个emacs LISP函数来取消缩进该区域 (严格)。我可以将前缀参数传递给indent-code-rigidlyindent-rigidly或缩进区域,它们都运行正常,但我不知道 我想总是要传递一个负前缀参数来改变事物 左

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

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

我一定错过了一些明显的东西......?

2 个答案:

答案 0 :(得分:2)

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

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

  • 从elisp参考中读取命令循环部分。特别是, 查看描述如何定义新命令和使用的节点 ' interactive',如果要将功能绑定到密钥,则需要它 或者用M-x调用它。

  • 阅读有关lisp参考中变量的部分 并了解变量范围(本地v全局)。看看使用' let'宁 而不是' setq'差别是什么。

  • 阅读'位置'在elisp中引用。特别要看一下 '保存冲程'和'保存限制'。了解如何定义和使用 该地区也很重要。

如果你把这个功能写成一个学习练习,那就不清楚了 不。但是,以防你这样做是因为它是你需要的东西 做而不只是学习elisp的东西,一定要通过Emacs 手册和索引。您似乎需要的是一个普遍且相当好的支持 需求。如果涉及编程模式,它可能会有点复杂 (与纯文本相对)。但是,使用emacs,如果你需要的话 这是一个常见的要求,你可以相当自信 已经存在 - 你只需要找到它(一开始可能是一个挑战)。

常见的惯例是定义函数/命令,其中包含行为 反向'当提供否定或通用参数时。任何命令 有这种能力也可以作为elisp代码中的函数调用 获得这种行为所必需的论据,因此理解相互作用 在命令,函数和调用约定之间很重要。

答案 1 :(得分:2)

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来调用它,它就会像使用参数indent-rigidly调用-n一样。如果省略prefix参数,它的行为就像你使用参数indent-rigidly调用-1(而不是进入indent-rigidly的交互模式)。