Можно ли создавать собственные команды «set» в моем файле rc и вызывать их из модельной строки?

10

Недавно я задал вопрос, в котором я узнал, что невозможно передать ничего, кроме параметров, :setв vim modelines. Я понимаю проблемы безопасности, но мне интересно, нет ли другого способа обойти это. Недавний вопрос о SO о создании крупных партий параметров в соответствии с кодирующим стандартом заставил меня думать, было бы возможно определить «группу» вещи в моем файле гс , которые могут быть включены или выключен из режимных?

Извините за псевдокод, но есть ли способ создать функцию, которая запускается из заданного параметра?

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

Это может быть вызвано такой модельной линией, как

# vim: codestyle=psr-2

В некотором смысле это будет похоже на сопоставление типов файлов, но допускает ручное переопределение. Это также настроило бы окружение другими предопределенными способами, избегая проблем безопасности, связанных с тем, что файл запускал другие произвольные команды в vim, но позволяя более настраиваемую среду. Есть ли способ сделать это?

Калеб
источник
Это потребует определения вашего собственного варианта для set; AFAIK, это невозможно в Vim ...
Мартин Турной
@Carpetsmoker Означает ли это, что ответ на этот вопрос заключается в том, что vimscript не может упаковывать или иным образом расширять встроенные функции?
Калеб

Ответы:

10

У вас есть несколько вариантов.

  1. Первый: вы можете написать свой собственный вид моделин-декодера, то есть плагин. Это очень похожий ответ на тот, который я дал на ваш другой вопрос.

    Действительно, мы не можем добавлять новые опции vim (которые можно установить с помощью :set), но мы можем добавлять новые переменные. И мы не можем использовать стандартные модели, чтобы делать больше, чем просто устанавливать параметры vim.

  2. Вторая возможность: let-modeline может быть использована через функцию обратного вызова для вызова той или иной функции. Вы могли бы иметь свою CodeStyle()функцию в вашем .vimrcплагине или (автозагрузке?), Тогда ваши файлы содержат:

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

    Но если вам нужна такая точность и если вы действительно не хотите подключаемых модулей , таких как local_vimrc , напишите свой собственный моделеподобный декодер.

  3. Третий, и ИМО, лучший выбор в этом случае было бы определить новый тип файла и набор 'ft'для этого типа файла в ModeLines с: # vim: set ft=php.psr2. С phpбудучи глобальной обычный (тип файла я не уверен насчет этого), и psr2будучи специализированным Filetype , который будет соответствовать вашим кодирования стилей. Вам нужно определить два ftplugins: ftplugin / psr2.vim и и ftplugin / drupal7.vim, куда вы будете звонить :setlocal(а не :set).

Люк Эрмитт
источник
6
Проголосовал за вариант 3. Я думаю, что это наиболее семантически подходящий и Vim-подходящий подход.
Tommcdo