Como faço para que os elementos de sintaxe sejam inseridos automaticamente na próxima linha do 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 eu for para a próxima linha, verei o "caractere inserido no nível de recuo apropriado para que eu possa continuar meu comentário. Quero saber como isso é feito dentro de um arquivo de sintaxe vim.

Como um exemplo mais concreto, vamos supor 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*\*\ /

Eu posso destacar essa bala com algo como

   highlight link Bullet Statement

No entanto, depois que eu completar um marcador, e aperte enter para ir para a próxima linha, eu 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 preciso fazer para que essa inserção de sintaxe ocorra?

    
por jlund3 09.08.2012 / 06:22

2 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 que" é um líder de comentários, acha que você está digitando um comentário e certas outras configurações estão em vigor, informando ao Vim que você quer que ele seja automaticamente insira um líder de comentário nesse ponto. Veja

:help 30.6

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

:help 'comments'
:help 'formatoptions'

Para fazer o Vim reconhecer * como ponto de bala, você pode executar isto:

:set comments+=b:*

O quanto isso funciona dependerá do "tipo de arquivo" do arquivo que você está editando e dos valores das opções "comentários" e "formações de texto". É difícil fazer uma recomendação específica sem saber mais sobre as condições em que você deseja usar * como um marcador.

    
por 09.08.2012 / 07:26
0

Muito obrigado ao garyjohn que me apontou na direção certa. Para o exemplo simples que eu perguntei, consegui encontrar a seguinte solução.

Em ~ / .vim / syntax / list.vim, incluí o realce 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 que o vim detecte automaticamente o tipo de arquivo da lista, adicionei um arquivo ~ / .vim / ftdetect / list.vim com o seguinte:

autocmd BufRead,BufNewFile *.list set filetype=list

Este arquivo também fez com que o vim utilizasse automaticamente qualquer plug-in de tipo de arquivo associado a listas. Especificamente, eu adicionei ~ / .vim / ftplugin / list.vim com o seguinte:

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

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

:help fo-table

Para economizar o tempo do leitor, descreverei brevemente essas quatro opções. O 'c' auto-envolve os comentários, inserindo o líder do comentário (neste caso '*'). O 'r' insere automaticamente o líder de comentário no modo de inserção depois de pressionar enter. Esta opção respeita o recuo, permitindo que você crie facilmente listas com marcadores de vários níveis. Finalmente, o 'o' insere o líder do comentário quando a tecla o está no modo normal.

É evidente que 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 ftplugins.

    
por 09.08.2012 / 23:23