Est-il possible de créer des commandes «set» personnalisées dans mon fichier rc et de les appeler à partir d'une modélisation?

10

J'ai récemment posé une question dans laquelle j'ai appris qu'il n'est pas possible de passer quoi que ce soit sauf des paramètres :setdans les modélisations vim. Je comprends les problèmes de sécurité, mais je me demande s'il n'y a pas d'autre solution. Une question récente sur SO sur la définition de grands lots de paramètres pour se conformer à une norme de codage m'a fait réfléchir - serait-il possible de définir un "groupe" de choses dans mon fichier rc qui peuvent être activées ou désactivées à partir de la modélisation?

Excusez le pseudo-code, mais existe-t-il un moyen de créer une fonction déclenchée à partir d'un paramètre défini?

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

Cela pourrait alors être déclenché par une modeline telle que

# vim: codestyle=psr-2

Cela serait à certains égards similaire à la correspondance de type de fichier, mais permettrait des remplacements manuels. Cela permettrait également de configurer l'environnement de manière prédéfinie, en évitant les problèmes de sécurité liés à l'exécution d'un fichier par d'autres commandes arbitraires dans vim mais en permettant un environnement plus personnalisé. Y a-t-il un moyen de faire cela?

Caleb
la source
Cela nécessiterait de définir votre propre option pour set; AFAIK, ce n'est pas possible à Vim ...
Martin Tournoij
@Carpetsmoker Cela signifie-t-il que la réponse à cette question est que vimscript ne peut pas encapsuler ou autrement étendre les fonctions intégrées?
Caleb

Réponses:

10

Vous avez quelques choix.

  1. Première: vous pouvez écrire votre propre type de décodeur de modélisation, c'est-à-dire un plugin. C'est une réponse très similaire à celle que j'ai donnée à votre autre question.

    En effet, nous ne pouvons pas ajouter de nouvelles options vim (qui peuvent être définies avec :set), mais nous pouvons ajouter de nouvelles variables. Et nous ne pouvons pas utiliser les modèles standard pour faire plus que de définir des options vim.

  2. Deuxième possibilité: let-modeline pourrait être exploitée via la fonction de rappel pour appeler une fonction ou une autre. Vous pourriez avoir votre CodeStyle()fonction dans votre .vimrcou un plugin (chargement automatique?), Puis avoir vos fichiers contient:

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

    Mais si votre besoin est aussi précis et si vous ne voulez vraiment pas de plugins comme local_vimrc , alors écrivez votre propre décodeur de type modeline.

  3. La troisième, et l' OMI, meilleur choix dans ce cas serait de définir un nouveau type de fichier et ensemble 'ft'à ce type de fichier en modelines avec: # vim: set ft=php.psr2. En phpétant le type de fichier habituel global (je ne suis pas sûr de celui-ci), et en psr2étant le type de fichier spécialisé qui correspondra à vos styles de codage. Vous devrez définir deux ftplugins: ftplugin / psr2.vim et et ftplugin / drupal7.vim où vous placerez vos appels :setlocal(et non :set).

Luc Hermitte
la source
6
A voté pour l'option 3. Je pense que c'est l'approche la plus sémantiquement appropriée et la plus adaptée à Vim.
tommcdo