我试图编写一个emacs LISP函数来取消缩进该区域
(严格)。我可以将前缀参数传递给indent-code-rigidly
或
indent-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)
。
我一定错过了一些明显的东西......?
答案 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
的交互模式)。