Привет, коллеги. Мы уже обсуждали раскраску синтаксиса, равно как и распознавание типа файла. Вим может определить, что за файл, и применить возможности терминала для выделения элементов текста цветом и иными способами. Это полезно в языках программирования (легче читать размеченный код) и в языках разметки (как Латех, в котором выделены команды), но не только.
В этой заметке я поделюсь своей наработкой, чтобы показать, как всё это просто делается, если умеешь.
Итак, в Фортране есть технология NAMELIST, позволяющая с удобством считать набор переменных из файла (или записать в файл). Переменные надо объявить, например:
INTEGER:: a, b
REAL:: x, y
CHARACTER(len=*):: name
LOGICAL, DIMENSION(3):: massiv
Потом надо объявить нэймлист, список имен:
NAMELIST /spisok/ a, b, x, y, name, massiv
Открыть файл:
open(1, file='file.nml')
Считать значения переменных:
read(1, nml=spisok)
и можно закрыть файл:
close(1)
Сам файл имеет такой вид:
&SPISOK
a=1
b=2
x=42.0
y=666.
name = 'Silver'
massiv = T T F
/
На самом деле, вольностей очень много. Можно комментарии добавлять, в самом разном формате писать данные, в любом порядке, элементы массива через запятую или через пробелы... Но про эту технологию я в другой раз подробно расскажу. Она правда удобная.
Однако, NML-файлы, которых в большом проекте много, не раскрашены. А почему бы и нет? Я хочу четко видеть левую и правую части! Тем более, что в одном файле таких списков может быть несколько.
Итак.
В папке .vim/ftdetect в вашем домашнем каталоге (нет нужды беспокоить сисадмина) создаете файл nml.vim с одной строкой:
au BufRead,BufNewFile *.nml set filetype=nml nowrap
Она создает автокоманду на события "прочесть буфер" или "новый файл", файл с расширением nml, которая выставляет значение опции filetype в nml. Заодно еще сбрасывает флаг wrap, так что длинные строки уходят за край. Это обычно комментарии, так что пусть уходят.
Кстати, другая автокоманда у меня задает тип файла для одного файла, с заданным именем, без маски *. Тут полная свобода, можете задавать любые шаблоны.
Если папки нет, создайте. Далее, в папке .vim/syntax создайте файл с таким же именем nml.vim, но с другим содержимым:
syntax clear
syntax match nmlsection /&\w\+/
syntax match nmlendsect /^\s*\zs\//
syntax match nmlvar /^\s*\zs\w\+/
syntax match nmlvalue /=\s*\zs[^!]*/
syntax match nmlcomment /!.*/
highlight nmlsection term=underline
highlight nmlendsect term=underline
highlight nmlvar ctermfg=3
highlight nmlvalue ctermfg=2
highlight nmlcomment ctermfg=6
Первая команда обнуляет правила раскраски. syntax match определяют элементы регулярными выражениями. Так, nmlsection состоит из символа & и потом один или более словных символов; например, &spisok
Левая часть присваивания описана так: начало строки, потом могут быть пробелы, потом начнется совпадение (только оно раскрашено!), состоящее из словных символов. А значение должно содержать знак =, пробелы, потом начнется совпадение, в котором идет что угодно, кроме восклицательного знака (он начинает комментарий). Сам комментарий тоже описан.
Описав синтаксические элементы, мы определяем раскраску для них. Для этого служат команды highlight. Указывается синтаксический элемент и, собственно, выделение. Ключ term задает список эффектов шрифта, которые может поддерживает терминал. Например, bold, underline, italic. Ключ ctermfg задает цвет шрифта, кодом, см. справку и экспериментируйте. Есть еще ctermbg для цвета фона.
Для графической версии вариантов несколько больше.
Надо, чтобы были включены
syntax on
filetype plugin on
Можете вставить эти строки в .vimrc в вашем домашнем каталоге.
И всё! У вас всегда будут распознаваться и раскрашиваться nml-файлы, а если у файла вдруг другое расширение, можно всегда задать filetype вручную.
Последнее. Я задал цвета жестко, независимо от выбранной цветовой схемы. В данном случае это нормально. Но иногда неудобно, например, на черном фоне хорошо виден светлый текст, а вот на белом он будет плохо заметен. Есть возможность использовать цветовые группы, но это сложнее и совсем другая тема. Я хотел попроще. На этом прощаюсь. Удачи, коллеги!