用于编辑文件的 Emacs 模式,其中缩进意味着结构

问题描述 投票:0回答:3

我想在 Emacs 中编辑一个又大又多的 YAML 文件。 文件结构由缩进隐含:如果 A 行缩进十个空格,则 A 开始一个部分,其中包括缩进十个以上空格的所有后续行。这是一个相当常见的约定,其使用远远超出了 YAML。

我真正想要的是一个具有尊重此结构的定义的 emacs 模式。 例如:

  • 我希望
    forward-sexp
    跳过 sexp,其中 sexp 是通过缩进而不是通过匹配的括号对来暗示的。 同样,我希望有其他导航命令可以移动到当前部分末尾之后的行,移动到当前部分的下一个同级部分,等等。
  • 我希望有一个命令可以折叠当前部分或除当前部分之外的所有部分,类似于大纲模式可以折叠当前大纲部分的方式,但部分是由缩进定义的。
  • 我希望模式行显示有关我所在部分的有用信息,如缩进所暗示的那样。
  • 我希望有一个选项可以自动突出显示当前行的祖先的所有行。
  • 还有其他我没想到的事情。

我看过

yaml-mode
,但它没有做任何有用的事情。 有几个人建议我尝试 Python 模式,但它对此目的效果不佳。

通用缩进线模式似乎是很久以前有人写的东西,但如果它存在,我找不到它。 或者也许有某种方法可以破解

outline-mode
以我想要的方式工作?

感谢您的任何建议。

emacs indentation
3个回答
3
投票

使用

outline-mode
并将
outline-regexp
设置为
" *"
并不能完全得到我想要的东西,但它确实得到了相当多的东西。 例如,默认情况下绑定到
hide-subtree
C-c C-d
似乎会按照我上面描述的方式折叠当前部分。
outline-forward-same-level
,绑定到
C-c C-f
,也能实现我想要的功能。

有些事情仍然不太正常。如果我找到任何其他有用的方法来调整,我会修改这个答案

outline-mode

这是对 José Antonio Ortega Ruiz 的建议的轻微修改。


2
投票

为了转到下一个/当前的同级,我编写了一个函数。加载文件并使用

M-x my-yaml-next-sibling
。这个包仍然很初级,但在我看来非常有用!

update:这个功能已经成长为一个真正的包,indent-tools。它的第一个目标是在缩进块中导航:转到相同缩进的下一个节点、父节点等。然后可以方便地缩进块、注释、折叠等。

尚未进入梅尔帕,但正在过程中。


0
投票

如果您是 yaml 模式用户,outline-yaml.el Emacs 包为 Emacs 提供了一个次要模式,可以对 YAML 文件启用代码折叠和大纲。 (对于 yaml-ts-mode / tree-sitter 用户,ts-fold 包可能是一个值得尝试的好选择。)

© www.soinside.com 2019 - 2024. All rights reserved.