使正向表达式识别由关键字定义的块,而不仅仅是括号


10

在一种语言(茱莉亚)中,该语言具有由关键字(例如for..endbegin..end)以及括号定义的块,跳过该块的好方法是什么?另外,end它不仅是block关键字,还是在其他地方使用的有效标识符。

一种方法是查找开始/关闭正则表达式的块,并跳过所有字符串,注释和ends等,但这有点效率低下,而且有点难看。

有没有一种方法可以使emacs自己的语法解析识别出这样的块关键字,从而使其forward/backward-sexp自动工作,从而可以从例如输出中快速判断出当前块的开始syntax-ppss

[注意:我不介意自己解析文件,但是在那种情况下,我仍然想知道如何将解析器插入其余的emacs。]


1
您可以看看ruby-mode哪个对红宝石有类似的作用。另一个选择是连接到smartparens,它具有用于ruby模式的特殊配置,您可以将其用作起点
Iqbal Ansari 2014年

Answers:


9

您可以看一下内置库SMIE(代表简单思维缩进引擎)。尽管有名称,缩进只是它提供的功能之一。这是许多模式(包括ruby-mode在注释中提到的)使用的方法,用于提供sexp移动和缩进。

为一种语言部署SMIE大致分为两个步骤:

  • 为您的语言定义语法,以及识别标记的词法分析器;
  • 定义缩进规则。

为了您的目的,只需要第一步!

总体而言,以这种方式定义的解析器可以很好地插入emacs。例如,show-parens将突出显示SMIE语法中定义的类似paren的表达式(至少在最近的emacs版本中)。

请注意,您仍将无法使用syntax-ppss有关封闭环境的信息,因为它只会为您提供语法表解析器的结果。但是sexp运动函数(例如up-list后跟backward-sexp)可以替代。


2

我做了一个

一旦定义,便可以使用一系列命令,包括前进,后退,复制等。

用伪代码定义:

(put 'MY-FORM 'beginning-op-at
           (lambda () MY-FORWARD-MOVE-CODE))

(put 'MY-FORM 'end-op-at
     (lambda () MY-BACKWARD-MOVE-CODE))

完成后,它应该可用,即像这样复制并返回

(defun MY-FORM-atpt (&optional arg)
  " "
  (interactive "p")
  (ar-th 'MY-FORM arg))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.