Пользовательская подсветка синтаксиса в vim для ссылок - PullRequest
0 голосов
/ 26 августа 2009

У меня есть собственный формат файла для графиков, который выглядит следующим образом:

node1.link1 : node2
node1.attribute1 : an_attribute_for_node1
node2.my_attribute1 : an_attribute_for_node2

(в именах атрибутов нет ничего особенного, атрибут является ссылкой, если можно найти его значение слева от точки. Так что node2 является ссылкой, потому что где-то в файле есть строка, которая начинается с node2.<something>).

Я хотел бы выделить значения атрибутов, если они являются ссылками (поэтому я хотел бы выделить узел 2, но не attribute_for_node1).

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

У меня уже есть синтаксический анализатор python для файлов такого типа (который определяет dict string -> (string -> string)), но я не знаю, может ли python взаимодействовать с подсветкой синтаксиса в vim 7.

EDIT В качестве пояснения словарь, составленный для этого примера:

d = {
  'node1': {'link1' : 'node2', 'attribute1' : 'an_attribute_for_node1'},
  'node2': {'attribute2': 'an_attribute_for_node2'}
}

По определению l является ссылкой для узла n тогда и только тогда, когда:

d[n][l] in d

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

Надеюсь, теперь стало понятнее.

У кого-то есть идея?

1 Ответ

2 голосов
/ 26 августа 2009

Это должно быть очень просто, но немного сложно точно определить, как выглядит ваш диктант (что такое «строка»? Node1? Attribute1? Что-то еще?). У меня есть плагин, который я написал под названием ctags highlighter , который делает довольно похожую вещь: он использует ctags для генерации списка ключевых слов, а затем использует python для превращения этого в простой скрипт vim, который соответствующим образом выделяет эти ключевые слова .

По сути, вам нужно создать парсер (или другой модуль python, который использует ваш парсер), чтобы сгенерировать список ключевых слов (узел1, узел2 и т. Д.) И вывести их в этой форме (используйте столько строк, сколько вы нравится, но не делайте строки слишком long):

syn keyword GraphNode node1 node2
syn keyword GraphNode node3

Запишите это в файл и создайте автокоманду, которая выполняет что-то вроде:

autocmd BufRead,BufNewFile *.myextension if filereadable('nodelist.vim') | source nodelist.vim | endif

Затем выполните:

hi GraphNode guifg=blue

или что угодно. Если вы хотите получить больше информации, опубликуйте немного больше информации о вашем парсере или посмотрите код в my plugin .

Для получения дополнительной информации см.

:help :autocmd
:help syn-keyword
:help BufEnter
:help BufNewFile
:help filereadable()
:help :source
:help :highlight

Редактировать

Я все еще не совсем уверен, что знаю, чего вы хотите, но если я правильно понимаю, что-то вроде этого должно работать:

Предположим, что ваш синтаксический анализатор python называется mypyparser.py, он принимает один аргумент (текущее имя файла) и создаваемый им словарь называется MyPyDict. Вам, очевидно, придется изменить скрипт, чтобы он соответствовал фактическому использованию вашего парсера. Добавьте этот сценарий где-нибудь в вашем пути выполнения (например, в .vimrc или в ~ / .vim / ftplugin / myfiletype.vim), а затем откройте ваш файл и введите :HighlightNodes.

" Create a command for ease of use
command! HighlightNodes call HighlightNodes()
function! HighlightNodes()
    " Run the parser to create MyPyDict
    exe 'pyfile mypyparser.py ' . expand('%:p')
    " Next block is python code (indent gone to keep python happy)
    py <<EOF
# Import the Vim interface
import vim
# Iterate through the keys in the dictionary and highlight them in Vim
for key in MyPyDict.keys():
    vim.command('syn keyword GraphNode ' + key)
endfor
EOF
    " Make sure that the GraphNode is highlighted in some colour or other
    hi link GraphNode Keyword
endfunction
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...