【问题标题】:indent-[code-]rigidly called from emacs LISP functionindent-[code-] 从 emacs LISP 函数中严格调用
【发布时间】:2017-02-10 22:56:05
【问题描述】:

我正在尝试编写一个 emacs LISP 函数来取消缩进该区域 (僵硬地)。我可以将前缀参数传递给indent-code-rigidlyindent-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)

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

【问题讨论】:

    标签: emacs indentation


    【解决方案1】:

    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 的交互模式)。

    【讨论】:

    • 啊!谢谢,现在我明白了。我开始寻找一种“拦截”前缀 arg 并否定它的方法,但没能找到它并最终变得不必要地复杂。非常感谢!
    【解决方案2】:

    您的函数存在许多问题,包括一些不同的问题 基本的 elisp 要求。强烈推荐阅读 Emacs Lisp 参考手册(与 emacs 捆绑)。如果您是编程和 lisp 新手, 您可能还会发现 An Introduction to Emacs Lisp 很有用(也与 Emacs)。

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

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

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

    • 阅读 elisp 参考中的“职位”部分。特别是看 “保存游览”和“保存限制”。了解如何定义和使用 该地区也很重要。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多