É possível criar comandos "set" personalizados no meu arquivo rc e chamá-los de uma modeline?


10

Recentemente, fiz uma pergunta na qual aprendi que não é possível passar nada, exceto parâmetros, :setnas modelines do vim. Entendo as preocupações de segurança, mas estou me perguntando se não há outra maneira de contornar isso. Uma pergunta recente sobre o SO sobre a definição de grandes lotes de parâmetros para obedecer a um padrão de codificação me fez pensar: seria possível definir um "grupo" de coisas no meu arquivo rc que podem ser ativadas ou desativadas a partir da modelagem?

Desculpe o pseudo-código, mas existe uma maneira de criar uma função que é acionada a partir de um parâmetro definido?

set_function! codestyle()
    if &1 == 'psr-2'
        set ts=4
        set sw=4
    endfi
    if &1 == 'drupal7'
        set ts=2
        set sw=2
        iab D8 Drupal 8
    endif
endset_function

Isso poderia ser acionado por uma modelagem como

# vim: codestyle=psr-2

De certa forma, isso seria semelhante à correspondência de tipo de arquivo, mas permitirá substituições manuais. Ele também configuraria o ambiente de outras maneiras predefinidas, evitando os problemas de segurança de um arquivo executar outros comandos arbitrários no vim, mas permitindo um ambiente mais personalizado. Existe uma maneira de fazer isso?


Isso exigiria definir sua própria opção para set; AFAIK, isso não é possível no vim ...
Martin Tournoij

@Carpetsmoker Isso significa que a resposta a esta pergunta é que o vimscript não pode envolver ou estender as funções internas?
Caleb

Respostas:


10

Você tem poucas escolhas.

  1. Primeiro: você pode escrever seu próprio tipo de decodificador de modelagem, ou seja, um plugin. Essa é uma resposta muito semelhante à que eu dei à sua outra pergunta.

    De fato, não podemos adicionar novas opções do vim (que podem ser definidas com :set), mas podemos adicionar novas variáveis. E não podemos usar os modelos padrão para fazer mais do que definir opções do vim.

  2. Segunda possibilidade: let-modeline poderia ser explorado através do recurso de retorno de chamada para chamar uma função ou outra. Você pode ter sua CodeStyle()função no seu .vimrcou em um plug-in (carregamento automático?), E seus arquivos contêm:

    # VIM: let b:codestyle='psr-2' b:ModeLine_CallBack='CodeStyle'
    

    Mas se sua necessidade é precisa e se você realmente não deseja plug-ins como local_vimrc , escreva seu próprio decodificador tipo modeline .

  3. A terceira, e IMO, escolha melhor, nesse caso, seria a de definir um novo tipo de arquivo e conjunto 'ft'a esse tipo de arquivo em modelines com: # vim: set ft=php.psr2. Com phpsendo o filetype habitual global (não tenho certeza sobre este), e psr2sendo o filetype especializado que vai corresponder a seus estilos de codificação. Você terá que definir dois ftplugins: ftplugin / psr2.vim e ftplugin / drupal7.vim onde você fará suas chamadas :setlocal(e não :set).


6
Votado para a opção 3. Eu acho que essa é a abordagem mais semanticamente apropriada e adequada ao Vim.
21415 Tommcdo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.