В vim многие элементы синтаксиса автоматически вставляются в следующую строку, когда я начинаю новую строку. Например, если я нахожусь внутри vim-файла и редактирую комментарий в режиме вставки, когда я перехожу на следующую строку, я вижу символ «вставленный на соответствующем уровне отступа, чтобы я мог продолжить свой комментарий. Я хочу знать, как это делается внутри файла синтаксиса vim.

В качестве более конкретного примера, давайте предположим, что я хочу создать файл синтаксиса, который распознает маркированный список (используя * в качестве маркера). Я мог бы добавить простое выражение соответствия

    syntax match Bullet /^\s*\*\ /

Затем я могу выделить эту пулю чем-то вроде

   highlight link Bullet Statement

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

2 ответа2

1

Команды в файле синтаксиса Vim управляют выделением элементов в файле в соответствии с синтаксисом языка, используемого в файле. Они не контролируют автоматическую вставку чего-либо.

Vim автоматически вставляет «в начале новой строки, если он знает, что» является лидером комментариев, он думает, что вы вводите комментарий, и действуют некоторые другие параметры, которые говорят Vim, что вы хотите, чтобы он автоматически вставлял комментарий лидер на тот момент. Увидеть

:help 30.6

для обзора комментариев. Также см

:help 'comments'
:help 'formatoptions'

Чтобы Vim распознал * в качестве маркера, вы можете выполнить это:

:set comments+=b:*

Насколько хорошо это работает, будет зависеть от «filetype» файла, который вы редактируете, и от значений параметров «comments» и «formatoptions». Трудно дать конкретную рекомендацию, не зная больше об условиях, при которых вы хотите использовать * в качестве маркера.

0

Большое спасибо Гариджону, который указал мне правильное направление. Для простого примера, о котором я спрашивал, я смог найти следующее решение.

В ~/.vim/syntax/list.vim я включил вышеупомянутую подсветку синтаксиса, а именно:

if exists("b:current_syntax)
    finish
endif

syntax match Bullet /^\s*\*\ /
highlight link Bullet SpecialChar

let b:current_syntax = 'list'

Затем, чтобы vim автоматически определял тип файла списка, я добавил файл ~/.vim/ftdetect/list.vim со следующим:

autocmd BufRead,BufNewFile *.list set filetype=list

Этот файл также сделал так, чтобы vim автоматически использовал любые плагины типов файлов, связанные со списками. В частности, я добавил ~/.vim/ftplugin/list.vim со следующим:

setlocal comments+=b:*\ 
setlocal formatoptions+=cro

Что касается этого файла, есть несколько пунктов, чтобы отметить. Прежде всего, обратите внимание, что я использовал setlocal, так что эта команда применяется только к файлам списка. Во-вторых, обратите внимание на конечный пробел, который уходит. Это делает так, что за комментарием следует *, за которым следует пробел (который соответствует регулярному выражению в файле синтаксиса). В-третьих, обратите внимание на различные вещи, которые я добавил в formatoptions, чтобы vim автоматически помогал вам с маркированным списком. Документация для них может быть найдена с

:help fo-table

Чтобы сэкономить время читателя, я кратко опишу только эти четыре варианта. 'C' автоматически оборачивает комментарии, вставляя заголовок комментария (в данном случае '*'). 'R' автоматически вставляет лидер комментариев в режиме вставки после нажатия Enter. Этот параметр учитывает отступы, поэтому он позволяет легко создавать многоуровневые маркированные списки. Наконец, 'o' вставляет лидер комментария, когда клавиша o в обычном режиме.

Очевидно, что эти маркированные списки являются простым примером, но они служат для иллюстрации того, как более сложные комментарии могут быть добавлены в ftplugins.

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