我想在 Emacs 中编辑一个又大又多的 YAML 文件。 文件结构由缩进隐含:如果 A 行缩进十个空格,则 A 开始一个部分,其中包括缩进十个以上空格的所有后续行。这是一个相当常见的约定,其使用远远超出了 YAML。
我真正想要的是一个具有尊重此结构的定义的 emacs 模式。 例如:
forward-sexp
跳过 sexp,其中 sexp 是通过缩进而不是通过匹配的括号对来暗示的。 同样,我希望有其他导航命令可以移动到当前部分末尾之后的行,移动到当前部分的下一个同级部分,等等。我看过
yaml-mode
,但它没有做任何有用的事情。 有几个人建议我尝试 Python 模式,但它对此目的效果不佳。
通用缩进线模式似乎是很久以前有人写的东西,但如果它存在,我找不到它。 或者也许有某种方法可以破解
outline-mode
以我想要的方式工作?
感谢您的任何建议。
使用
outline-mode
并将 outline-regexp
设置为 " *"
并不能完全得到我想要的东西,但它确实得到了相当多的东西。 例如,默认情况下绑定到 hide-subtree
的 C-c C-d
似乎会按照我上面描述的方式折叠当前部分。 outline-forward-same-level
,绑定到C-c C-f
,也能实现我想要的功能。
有些事情仍然不太正常。如果我找到任何其他有用的方法来调整,我会修改这个答案
outline-mode
。
这是对 José Antonio Ortega Ruiz 的建议的轻微修改。
为了转到下一个/当前的同级,我编写了一个函数。加载文件并使用
M-x my-yaml-next-sibling
。这个包仍然很初级,但在我看来非常有用!
update:这个功能已经成长为一个真正的包,indent-tools。它的第一个目标是在缩进块中导航:转到相同缩进的下一个节点、父节点等。然后可以方便地缩进块、注释、折叠等。
尚未进入梅尔帕,但正在过程中。
如果您是 yaml 模式用户,outline-yaml.el Emacs 包为 Emacs 提供了一个次要模式,可以对 YAML 文件启用代码折叠和大纲。 (对于 yaml-ts-mode / tree-sitter 用户,ts-fold 包可能是一个值得尝试的好选择。)