解决方案

解决方案

我正在尝试从 Gedit 更改突出显示文件。我修改了文件 /usr/share/gtksourceview-3.0/language-specs/fortran.lang,因为我想更改编辑器将语句视为注释的情况。我遇到的问题是,当我选择新的突出显示方案时,没有任何突出显示,它只是保留为纯文本。

文件 fortran.lang 以 su 权限打开,我将所有内容复制粘贴到新的 Gedit 文件中,然后将其保存为 fortran_enhanced.lang 并保存在同一文件夹中。我对原始文件所做的更改如下:

原始 fortran.lang 文件:

<language id="fortran" _name="Fortran 95" version="2.0" _section="Sources">
  <metadata>
    <property name="mimetypes">text/x-fortran</property>
    <property name="globs">*.f;*.f90;*.f95;*.for</property>
    <property name="line-comment-start">!</property>
  </metadata>
  <styles>
    <style id="comment" _name="Comment" map-to="def:comment"/>
    <style id="floating-point" _name="Floating Point" map-to="def:floating-point"/>
    <style id="keyword" _name="Keyword" map-to="def:keyword"/>
    <style id="intrinsic" _name="Intrinsic function" map-to="def:builtin"/>
    <style id="boz-literal" _name="BOZ Literal" map-to="def:base-n-integer"/>
    <style id="decimal" _name="Decimal" map-to="def:decimal"/>
    <style id="type" _name="Data Type" map-to="def:type"/>
  </styles>
  <default-regex-options case-sensitive="false"/>
  <definitions>
    <!-- Note: contains an hack to avoid considering ^COMMON a comment -->
    <context id="line-comment" style-ref="comment" end-at-line-end="true" class="comment" class-disabled="no-spell-check">
      <start>!|(^[Cc](\b|[^OoAaYy]))</start>
      <include>
        <context ref="def:escape"/>
        <context ref="def:in-line-comment"/>
      </include>
    </context>
(...)

修改的 fortran_enhanced.lang 文件:

                     <!-- Note: changed language id and name -->
<language id="fortran_enhanced" _name="Fortran 95 2.0" version="2.0" _section="Sources">
  <metadata>
    <property name="mimetypes">text/x-fortran</property>
                     <!-- Note: removed *.f and *.for from file extensions -->
    <property name="globs">*.f90;*.f95;</property>
    <property name="line-comment-start">!</property>
  </metadata>
  <styles>
    <style id="comment" _name="Comment" map-to="def:comment"/>
    <style id="floating-point" _name="Floating Point" map-to="def:floating-point"/>
    <style id="keyword" _name="Keyword" map-to="def:keyword"/>
    <style id="intrinsic" _name="Intrinsic function" map-to="def:builtin"/>
    <style id="boz-literal" _name="BOZ Literal" map-to="def:base-n-integer"/>
    <style id="decimal" _name="Decimal" map-to="def:decimal"/>
    <style id="type" _name="Data Type" map-to="def:type"/>
  </styles>
  <default-regex-options case-sensitive="false"/>
  <definitions>
                     <!-- Note: I want comments only beginning with !, not C -->
    <context id="line-comment" style-ref="comment" end-at-line-end="true" class="comment" class-disabled="no-spell-check">
      <start>!</start>
      <include>
        <context ref="def:escape"/>
        <context ref="def:in-line-comment"/>
      </include>
    </context>
(...)

我已经阅读了这个问题[https://superuser.com/questions/353391/custom-gedit-syntax-highlighting-for-dummies],并尝试使用以下方法使新的 fortran_enhanced.lang 文件可读

$ cd /usr/share/gtksourceview-3.0/language-specs
$ sudo chmod 0644 fortran_enhanced.lang

但并没有什么区别。

我不得不说,我以前从来没有做过这样的事情,甚至不理解大部分语言文件,所以我愿意接受任何批评,因为我纯粹是凭直觉行事。

提前谢谢你!

答案1

我想我已经知道你的问题出在哪里了:

解决方案

id您更改了标签中的(和_name) ,这是正确的<language ...>。毕竟,这是您创建的新突出显示方案。

但是,您还必须更改文件中使用此 id 的其他位置。在语言定义中(问题中的引号中省略)您会发现以下内容:

<context id="fortran" class="no-spell-check">

显然,您必须有一个与您的语言具有相同 id 的上下文,包括/引用所有使用的上下文定义,以便 gedit/GtkSourceView 在选择特定方案时使用它。

我如何找到它

我根本不是这方面的专家。我唯一的资格就是我以前见过 XML 文件 ;) 所以我只能做出“有根据的”猜测。

我从终端窗口启动 gedit 时显示的警告引起了我的注意

(gedit:6786): GtkSourceView-WARNING **: 无法加载‘/usr/local/share/gtksourceview-3.0/language-specs/frtrn.lang’: 缺少主语言定义(id =“frtrn”。)

(我用了 ”弗特恩在测试时使用“作为 id、名称和文件扩展名,您应该会收到相同的警告”fortran_enhanced“)

这让我非常怀疑,于是在文件的其余部分搜索原始 ID。在尝试上述解决方案后,我还发现了以下行来支持我的解释:

[定义] 这里我们应该定义一个主上下文,也就是我们在文件开头输入的上下文:为此我们使用标签,其 id 等于元素的 id [...]

它来自语言定义文件教程在 GtkSourceView 文档中。

相关内容