9

Я пытаюсь изменить файл выделения из 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>
(...)

Я прочитал этот вопрос [ Custom Gedit Подсветка синтаксиса для чайников? ] и я попытался сделать новый файл fortran_enhanced.lang читаемым с

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

но это не имело никакого значения.

Я должен сказать, что я никогда не делал ничего подобного раньше, и я даже не понимаю большую часть языкового файла, поэтому я открыт для любой критики, поскольку я руководствовался исключительно интуицией.

Заранее благодарю!

1 ответ1

4

Я думаю, что я узнал, что пошло не так для вас:

Решение

Хорошо, что вы изменили id_name) в <language ...> . В конце концов, это новая схема подсветки, которую вы создаете.

Однако затем вы должны изменить и другое место в файле, где используется этот идентификатор. Далее в определении языка (опущено в цитате в вопросе) вы найдете это:

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

По-видимому, у вас должен быть контекст с тем же идентификатором, что и у вашего языка, включая / ссылаясь на все используемые определения контекста, чтобы gedit / GtkSourceView использовал его при выборе конкретной схемы.

Как я это нашел

Я совсем не эксперт в этом. Вся моя квалификация в том, что я видел XML-файлы раньше;) Так что я мог только делать "образованные" догадки.

Что меня удивило, так это предупреждение при запуске gedit из окна терминала

(gedit: 6786): GtkSourceView-WARNING **: не удалось загрузить '/usr/local/share/gtksourceview-3.0/language-specs/frtrn.lang': отсутствует определение основного языка (id = "frtrn".)

(Я использовал " frtrn " в качестве идентификатора, имени и расширения файла во время тестирования, вы должны получить то же предупреждение с " fortran_enhanced ")

Это сделало меня достаточно подозрительным для поиска оригинального идентификатора в остальной части файла. После опробования вышеуказанного решения я также нашел следующую строку в поддержку моего объяснения:

[определения] Здесь мы должны определить основной контекст, который мы вводим в начале файла: для этого мы используем тег с идентификатором, равным идентификатору элемента [...]

Это из учебника по файлу определения языка в документации GtkSourceView.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .