Como obtenho elementos de sintaxe para serem inseridos automaticamente na próxima linha no vim?

0

No vim, muitos elementos de sintaxe são inseridos automaticamente na próxima linha quando inicio uma nova linha. Por exemplo, se eu estiver dentro de um arquivo vim editando um comentário no modo de inserção, quando for para a próxima linha, verei o caractere "inserido no nível de recuo apropriado para poder continuar meu comentário. Quero saber como isso é feito dentro de um arquivo de sintaxe vim.

Como um exemplo mais concreto, suponha que eu queira criar um arquivo de sintaxe que reconheça uma lista com marcadores (usando * como marcador). Eu poderia adicionar uma expressão de correspondência simples

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

Posso destacar essa bala com algo como

   highlight link Bullet Statement

No entanto, depois de concluir um marcador e pressionar enter para ir para a próxima linha, preciso adicionar outra coisa para que ele adicione automaticamente um * antes do meu cursor. Obviamente, isso deve ocorrer dentro do contexto do recuo automático. O que exatamente eu preciso fazer para que essa inserção de sintaxe ocorra?

jlund3
fonte

Respostas:

1

Os comandos em um arquivo de sintaxe do Vim controlam o realce de elementos em um arquivo de acordo com a sintaxe do idioma usado no arquivo. Eles não controlam a inserção automática de nada.

O Vim insere automaticamente um "no início de uma nova linha, se souber". É um líder de comentários, ele pensa que você está digitando um comentário e algumas outras configurações estão em vigor que informam ao Vim que você deseja que ele insira automaticamente um comentário. líder nesse ponto. Vejo

:help 30.6

para uma visão geral dos comentários. Veja também

:help 'comments'
:help 'formatoptions'

Para fazer o Vim reconhecer * como um marcador, você pode executar o seguinte:

:set comments+=b:*

O quão bem isso funcionará dependerá do 'tipo de arquivo' do arquivo que você está editando e dos valores das opções 'comentários' e 'formatação'. É difícil fazer uma recomendação específica sem saber mais sobre as condições sob as quais você deseja usar * como um marcador.

garyjohn
fonte
0

Muito obrigado a Garyjohn, que me indicou a direção certa. Para o exemplo simples sobre o qual perguntei, consegui encontrar a solução a seguir.

Em ~ / .vim / syntax / list.vim, incluí o destaque de sintaxe mencionado anteriormente, a saber:

if exists("b:current_syntax)
    finish
endif

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

let b:current_syntax = 'list'

Em seguida, para o vim detectar automaticamente o tipo de arquivo da lista, adicionei um arquivo ~ / .vim / ftdetect / list.vim com o seguinte:

autocmd BufRead,BufNewFile *.list set filetype=list

Esse arquivo também foi criado para que o vim usasse automaticamente qualquer plug-in de tipo de arquivo associado às listas. Especificamente, adicionei ~ / .vim / ftplugin / list.vim com o seguinte:

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

Com relação a este arquivo, há alguns itens a serem observados. Primeiro, observe que usei setlocal para que este comando seja aplicado apenas aos arquivos da lista. Segundo, observe o espaço em branco à direita que está sendo escapado. Isso faz com que o comentário seja um * seguido por um espaço (que corresponde à regex no arquivo de sintaxe). Terceiro, observe as várias coisas que adicionei às formações para que o vim o ajude automaticamente na lista com marcadores. A documentação para estes pode ser encontrada com

:help fo-table

Para economizar tempo do leitor, descreverei brevemente apenas essas quatro opções. O 'c' quebra automaticamente os comentários, inserindo o líder do comentário (neste caso '*'). O 'r' insere automaticamente o líder do comentário no modo de inserção após pressionar Enter. Essa opção respeita a indentação, permitindo que você faça facilmente listas com marcadores em vários níveis. Finalmente, o 'o' insere o líder do comentário quando a tecla o no modo normal.

Claramente, essas listas com marcadores são um exemplo simples, mas servem para ilustrar como continuações de comentários mais complexas podem ser adicionadas aos plugins de ft.

jlund3
fonte