Apakah mungkin untuk membuat perintah "set" kustom di file rc saya dan memanggil mereka dari modeline?

10

Saya baru-baru ini mengajukan pertanyaan di mana saya belajar bahwa tidak mungkin untuk melewatkan apa pun kecuali parameter ke :setdalam modelm vim. Saya memahami masalah keamanan, tetapi saya bertanya-tanya apakah tidak ada cara lain untuk mengatasi ini. Sebuah pertanyaan baru - baru ini tentang SO tentang pengaturan sejumlah besar parameter untuk memenuhi standar pengkodean membuat saya berpikir — apakah mungkin untuk mendefinisikan "grup" hal-hal dalam file rc saya yang dapat dihidupkan atau dimatikan dari modeline?

Maafkan kode pseudo, tetapi apakah ada cara untuk membuat fungsi yang dipicu dari parameter yang ditetapkan?

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

Ini kemudian dapat dipicu oleh seorang modeline seperti

# vim: codestyle=psr-2

Ini dalam beberapa hal akan mirip dengan pencocokan jenis file, tetapi memungkinkan penggantian manual. Itu juga akan mengatur lingkungan dengan cara lain yang telah ditentukan, menghindari masalah keamanan memiliki file menjalankan perintah sewenang-wenang lainnya di vim tetapi memungkinkan lingkungan yang lebih khusus. Apakah ada cara untuk melakukan ini?

Caleb
sumber
Ini akan membutuhkan mendefinisikan opsi Anda sendiri untuk set; AFAIK, ini tidak mungkin di Vim ...
Martin Tournoij
@Carpetsmoker Apakah itu berarti jawaban untuk pertanyaan ini adalah bahwa vimscript tidak dapat membungkus atau memperluas fungsi bawaan?
Caleb

Jawaban:

10

Anda punya beberapa pilihan.

  1. Yang pertama: Anda dapat menulis dekoder modeline sendiri, yaitu sebuah plugin. Ini adalah jawaban yang sangat mirip dengan jawaban yang saya berikan pada pertanyaan Anda yang lain.

    Memang, kami tidak dapat menambahkan opsi vim baru (yang dapat diatur dengan :set), tetapi kami dapat menambahkan variabel baru. Dan kita tidak dapat menggunakan modelines standar untuk melakukan lebih dari pengaturan opsi vim.

  2. Kemungkinan kedua: biarkan-modeline dapat dieksploitasi melalui fitur callback untuk memanggil satu fungsi atau lainnya. Anda dapat memiliki CodeStyle()fungsi di .vimrcplugin Anda atau (autoload?), Lalu minta file Anda berisi:

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

    Tetapi jika kebutuhan Anda tepat dan jika Anda benar-benar tidak ingin plugin seperti local_vimrc , tulislah dekoder seperti modeline Anda sendiri.

  3. , Dan IMO, pilihan ketiga yang lebih baik dalam kasus itu akan menentukan filetype baru dan set 'ft'ke filetype ini di modelines dengan: # vim: set ft=php.psr2. Dengan phpmenjadi tipe file global biasa (saya tidak yakin tentang yang ini), dan psr2menjadi tipe file khusus yang akan sesuai dengan gaya pengkodean Anda. Anda harus mendefinisikan dua ftplugins: ftplugin / psr2.vim dan dan ftplugin / drupal7.vim di mana Anda akan melakukan panggilan :setlocal(dan tidak :set).

Luc Hermitte
sumber
6
Terpilih untuk opsi 3. Saya pikir ini adalah pendekatan yang paling tepat secara semantik dan cocok untuk Vim.
tommcdo