Czy można utworzyć niestandardowe polecenia „set” w moim pliku rc i wywoływać je z modeliny?

10

Niedawno zadałem pytanie, w którym dowiedziałem się, że nie można przekazywać niczego oprócz parametrów do :setmodeli in vim. Rozumiem obawy związane z bezpieczeństwem, ale zastanawiam się, czy nie ma innego rozwiązania. Ostatnie pytanie na SO o ustawienie dużych partii parametrów zgodne ze standardem kodowania mnie do myślenia, że byłoby możliwe określenie „grupa” rzeczy w moim pliku rc, które mogą być włączone lub wyłączone z modeline?

Przepraszam, pseudo kod, ale czy istnieje sposób na utworzenie funkcji uruchamianej z ustawionego parametru?

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

Może to być następnie uruchomione przez modeline, taką jak

# vim: codestyle=psr-2

W pewnym sensie byłoby to podobne do dopasowywania typu pliku, ale zezwalało na ręczne zastępowanie. Skonfigurowałby również środowisko na inne wstępnie zdefiniowane sposoby, unikając problemów bezpieczeństwa związanych z uruchamianiem pliku w vimie przez inne arbitralne polecenia, ale umożliwiając bardziej dostosowane środowisko. Czy jest na to sposób?

Caleb
źródło
Wymagałoby to zdefiniowania własnej opcji set; AFAIK, nie jest to możliwe w Vimie ...
Martin Tournoij
@Carpetsmoker Czy to oznacza, że ​​odpowiedź na to pytanie jest taka, że ​​vimscript nie może zawijać ani w żaden inny sposób rozszerzać wbudowanych funkcji?
Caleb,

Odpowiedzi:

10

Masz kilka możliwości.

  1. Po pierwsze: możesz napisać własny modelowy dekoder, tj. Wtyczkę. To bardzo podobna odpowiedź do tej, którą udzieliłem na twoje drugie pytanie.

    Rzeczywiście, nie możemy dodawać nowych opcji vima (które można ustawić za pomocą :set), ale możemy dodawać nowe zmienne. I nie możemy używać standardowych modeline do więcej niż ustawiania opcji vima.

  2. Druga możliwość: let-modeline może być wykorzystany poprzez funkcję zwrotną do wywołania jednej lub innej funkcji. Możesz mieć swoją CodeStyle()funkcję we .vimrcwtyczce lub wtyczce (autoload?), A następnie mieć pliki zawierające:

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

    Ale jeśli twoja potrzeba jest taka precyzyjna i jeśli naprawdę nie chcesz wtyczek takich jak local_vimrc , to napisz własny modelowy dekoder.

  3. Trzeci i IMO, lepszym rozwiązaniem w tym przypadku byłoby zdefiniować nowy typ pliku oraz zestaw 'ft'do tego typu pliku w Modelines z: # vim: set ft=php.psr2. Z phpbycia globalną zwykły typ pliku (Nie jestem pewien o tym), i psr2jest wyspecjalizowanym filetype że będziemy odpowiadać swoimi stylami kodowania. Będziesz musiał zdefiniować dwa ftplugins: ftplugin / psr2.vim i ftplugin / drupal7.vim, do których będziesz dzwonić :setlocal(i nie :set).

Luc Hermitte
źródło
6
Głosowano za opcją 3. Myślę, że jest to najbardziej semantycznie odpowiednie i odpowiednie dla Vima podejście.
tommcdo