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
的交互模式)。
我正在尝试编写一个 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
的交互模式)。