【问题标题】:How do I determine why emacs indented a certain amount?如何确定emacs缩进一定量的原因?
【发布时间】:2013-01-07 15:06:41
【问题描述】:

在 Emacs 中,我正在编辑一些源代码,然后点击 。 Emacs 将行缩进到 n 个空格。我想更改这种行的缩进量。如何确定 emacs 应用什么规则将该行缩进 n 个空格?

我想更改 n,但我需要弄清楚 Emacs 刚刚使用了许多与缩进相关的变量中的哪一个。

【问题讨论】:

  • 可能不是最好的方法,但是您可以执行 C-h k 以查看在您点击选项卡时所处的模式正在调用什么函数,并查看是否可以获得变量从那里
  • 不是答案,但请尝试M-x apropos RET <part-of-name> RET。我建议尝试浏览offset 关键字。我认为每个主要模式都可能是一个变量。
  • 为了回答这个问题,您需要指定文件处于什么模式(C++、perl、Tcl、Java、R、文本等等等)。 @spike 迈出了很好的第一步,但该模式很可能会进一步细化绑定到 <tab> 键的函数(如果它是通用缩进函数)。
  • @TreyJackson 我在 ruby​​ 模式下尝试过,并且能够找到变量(埋在模式定义的函数中),但我同意这不是一个完美的答案
  • @spike 我没有不尊重的意思(我什至赞成评论),我只是希望 OP 提供更多数据,因为密钥可能没有足够的信息。例如,在某些模式下,我的 TAB 键绑定到 pabbrev-expand-maybe,如果合适,它会自动完成,如果不合适,命令会退回到执行原始绑定(缩进)。在这种情况下,返回绑定 <tab> 并没有真正的帮助。

标签: emacs elisp


【解决方案1】:

一个通用的答案是困难的。有些模式会比其他模式更明显,但在一般情况下(因为他们可以随意实现缩进)我认为你不会需要阅读一些省略号。

TAB 的绑定开始会起作用,但可能会稍微耗时,具体取决于涉及的间接层数。

如果您知道所讨论的主要模式实现了自己的缩进,那么您可以尝试帮助追踪被调用函数的一种(非严格但快速)方法是使用 ELP,即内置的 elisp 分析器. elp-instrument-package 将用于分析名称与您指定的前缀字符串参数匹配的所有函数。因此,您可能会在 PHP 文件中执行以下操作(注意 php-mode 告诉您它是从 c-mode 派生的)

M-x elp-instrument-package RET php- RET
M-x elp-instrument-package RET c- RET
M-x elp-instrument-package RET indent RET

现在在您的源代码中键入 TAB,然后运行 ​​M-x elp-results 以查看调用了哪些检测函数。

此时,您只能靠自己了——寻找可能的嫌疑人,看看代码在做什么——但这可能是一种过滤搜索的便捷方法。

完成后,使用 M-x elp-restore-all 防止任何进一步的分析。

【讨论】:

    【解决方案2】:

    如果你使用的是基于 cc-mode 的模式(例如 c-mode、c++-mode、java-mode 等),你可以点击 C-c C-s 它会告诉你你这行是什么句法类别。如果您想更改它,请点击 C-c C-o,您将被引导完成整个过程。查看关于定制的 cc-mode 文档了解更多详情:https://www.gnu.org/s/emacs/manual/html_node/ccmode/Customizing-Indentation.html

    【讨论】:

      【解决方案3】:

      如果您碰巧喜欢弄脏自己的手,那么总是有 elisp 调试器可以告诉您 Emacs 正在做什么。

      如果你点击C-h k TAB,你会发现 Emacs 正在运行的函数(例如indent-for-tab-command)然后你可以使用M-x debug-on-entry RET indent-for-tab-command RET。现在,每当您点击TAB 时,您都会弹出一个调试器并可以一步一步地观察执行情况。

      根据您对调试的喜好,这可能是令人抓狂或启发性的体验。不管怎样,完成后别忘了M-x cancel-debug-on-entry

      【讨论】:

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