È possibile creare comandi "set" personalizzati nel mio file rc e chiamarli da una modeline?


10

Di recente ho posto una domanda in cui ho appreso che non è possibile passare nulla tranne i parametri :setin vim modeline. Capisco i problemi di sicurezza, ma mi chiedo se non ci sia un altro modo per aggirare questo. Una recente domanda su SO sull'impostazione di grandi gruppi di parametri per conformarsi a uno standard di codifica mi ha fatto pensare: sarebbe possibile definire un "gruppo" di cose nel mio file rc che può essere attivato o disattivato dalla modeline?

Scusa lo pseudo codice, ma c'è un modo per creare una funzione che viene attivata da un parametro impostato?

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

Questo potrebbe essere innescato da una modeline come

# vim: codestyle=psr-2

Questo sarebbe in qualche modo simile alla corrispondenza del tipo di file, ma consentire sostituzioni manuali. Configurerebbe anche l'ambiente in altri modi predefiniti, evitando i problemi di sicurezza di avere un file che esegue altri comandi arbitrari in vim ma consentendo un ambiente più personalizzato. C'è un modo per fare questo?


Ciò richiederebbe la definizione della propria opzione per set; AFAIK, questo non è possibile in Vim ...
Martin Tournoij

@Carpetsmoker Significa che la risposta a questa domanda è che vimscript non può avvolgere o estendere in altro modo le funzioni integrate?
Caleb,

Risposte:


10

Hai qualche scelta.

  1. Primo: puoi scrivere il tuo tipo di decodificatore di modeline, ovvero un plugin. Questa è una risposta molto simile a quella che ho dato alla tua altra domanda.

    In effetti, non possiamo aggiungere nuove opzioni vim (che possono essere impostate con :set), ma possiamo aggiungere nuove variabili. E non possiamo usare le modeline standard per fare di più che impostare le opzioni vim.

  2. Seconda possibilità: let-modeline potrebbe essere sfruttata attraverso la funzione di callback per chiamare una funzione o un'altra. Potresti avere la tua CodeStyle()funzione nel tuo .vimrco in un plug-in (caricamento automatico?), Quindi i tuoi file contengono:

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

    Ma se il tuo bisogno è così preciso e se non vuoi davvero plugin come local_vimrc , allora scrivi il tuo decodificatore simile a una modelina .

  3. Il terzo, e IMO, migliore scelta in tal caso sarebbe definire un nuovo tipo di file e insieme 'ft'a questo tipo di file in modeline con: # vim: set ft=php.psr2. Con phpessendo il tipo di file solita globale (io non sono sicuro di questo), e psr2di essere il tipo di file specializzato che ti corrispondono ai vostri stili di codifica. Dovrai definire due ftplugins: ftplugin / psr2.vim e e ftplugin / drupal7.vim dove effettuerai le chiamate :setlocal(e non :set).


6
Votato per l'opzione 3. Penso che questo sia l'approccio più semanticamente appropriato e adatto a Vim.
Tommaso,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.