¿Es posible crear comandos personalizados "set" en mi archivo rc y llamarlos desde una línea de modelo?

10

Hace poco hice una pregunta en la que aprendí que no es posible pasar nada excepto parámetros :seten vim modelines. Entiendo las preocupaciones de seguridad, pero me pregunto si no hay otra forma de evitar esto. Una pregunta reciente sobre SO sobre la configuración de grandes lotes de parámetros para cumplir con un estándar de codificación me hizo pensar: ¿sería posible definir un "grupo" de cosas en mi archivo rc que pueda activarse o desactivarse desde la línea de modelos?

Disculpe el pseudocódigo, pero ¿hay alguna forma de crear una función que se active desde un parámetro establecido?

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

Esto podría ser activado por una línea de modelo como

# vim: codestyle=psr-2

De alguna manera, esto sería similar a la coincidencia de tipo de archivo, pero permitiría anulaciones manuales. También configuraría el entorno de otras formas predefinidas, evitando los problemas de seguridad de tener un archivo ejecutando otros comandos arbitrarios en vim, pero permitiendo un entorno más personalizado. ¿Hay alguna forma de hacer esto?

Caleb
fuente
Esto requeriría definir su propia opción para set; AFAIK, esto no es posible en Vim ...
Martin Tournoij
@Carpetsmoker ¿Eso significa que la respuesta a esta pregunta es que vimscript no puede envolver o extender las funciones integradas?
Caleb

Respuestas:

10

Tienes algunas opciones.

  1. Primero: puede escribir su propio tipo de decodificador modeline, es decir, un complemento. Esta es una respuesta muy similar a la que le di a tu otra pregunta.

    De hecho, no podemos agregar nuevas opciones de vim (que se pueden configurar con :set), pero podemos agregar nuevas variables. Y no podemos usar las modelinas estándar para hacer más que configurar las opciones de vim.

  2. Segunda posibilidad: let-modeline podría explotarse a través de la función de devolución de llamada para llamar a una función u otra. Puede tener su CodeStyle()función en su .vimrco en un complemento (¿carga automática?), Luego sus archivos contienen:

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

    Pero si su necesidad es tan precisa y si realmente no desea complementos como local_vimrc , escriba su propio decodificador tipo modeline.

  3. La tercera, y la OMI, la mejor opción en ese caso sería definir un nuevo tipo de archivo y el conjunto 'ft'de este tipo de archivo en modelines con: # vim: set ft=php.psr2. Con phpser el tipo de archivo habitual mundial (no estoy seguro acerca de esto), y psr2siendo el tipo de archivo especializado que va corresponden a sus estilos de codificación. Tendrá que definir dos ftplugins: ftplugin / psr2.vim y ftplugin / drupal7.vim donde pondrá sus llamadas :setlocal(y no :set).

Luc Hermitte
fuente
66
Votó a favor de la opción 3. Creo que este es el enfoque semánticamente apropiado y más adecuado para Vim.
tommcdo