2012-09-18 7 views
6

Często otwarte komplety pliku naraz od wewnątrz MacVim. Aby to zrobić, ja zazwyczaj użyć polecenia:Podświetlanie składni nie jest włączona w vim podczas otwierania wielu plików za pomocą argdo

args *PATTERN* 
argdo tabedit 

Ten ładuje wszystkie pliki w katalogu roboczym, które pasują do wzorca do listy argumentów, a następnie otwiera je wszystkie w oddzielnych zakładkach. Podświetlanie składni nie jest automatycznie włączane, kiedy to robię i muszę ustawić je ręcznie. Jak mogę to naprawić?

Odpowiedz

6

Mam już posted a workaround dla :bufdo w podobnym pytaniu; tutaj jest rozszerzona wersja, która obsługuje również przypadek użycia. Praca po automatycznym ustawieniu 'eventignore' jest dość skomplikowane, dlatego to obszernie skomentował:

" Enable syntax highlighting when buffers are displayed in a window through 
" :argdo and :bufdo, which disable the Syntax autocmd event to speed up 
" processing. 
augroup EnableSyntaxHighlighting 
    " Filetype processing does happen, so we can detect a buffer initially 
    " loaded during :argdo/:bufdo through a set filetype, but missing 
    " b:current_syntax. Also don't do this when the user explicitly turned off 
    " syntax highlighting via :syntax off. 
    " The following autocmd is triggered twice: 
    " 1. During the :...do iteration, where it is inactive, because 
    " 'eventignore' includes "Syntax". This speeds up the iteration itself. 
    " 2. After the iteration, when the user re-enters a buffer/window that was 
    " loaded during the iteration. Here is becomes active and enables syntax 
    " highlighting. Since that is done buffer after buffer, the delay doesn't 
    " matter so much. 
    " Note: When the :...do command itself edits the window (e.g. :argdo 
    " tabedit), the BufWinEnter event won't fire and enable the syntax when the 
    " window is re-visited. We need to hook into WinEnter, too. Note that for 
    " :argdo split, each window only gets syntax highlighting as it is entered. 
    " Alternatively, we could directly activate the normally effectless :syntax 
    " enable through :set eventignore-=Syntax, but that would also cause the 
    " slowdown during the iteration Vim wants to avoid. 
    " Note: Must allow nesting of autocmds so that the :syntax enable triggers 
    " the ColorScheme event. Otherwise, some highlighting groups may not be 
    " restored properly. 
    autocmd! BufWinEnter,WinEnter * nested if exists('syntax_on') && ! exists('b:current_syntax') && ! empty(&l:filetype) && index(split(&eventignore, ','), 'Syntax') == -1 | syntax enable | endif 

    " The above does not handle reloading via :bufdo edit!, because the 
    " b:current_syntax variable is not cleared by that. During the :bufdo, 
    " 'eventignore' contains "Syntax", so this can be used to detect this 
    " situation when the file is re-read into the buffer. Due to the 
    " 'eventignore', an immediate :syntax enable is ignored, but by clearing 
    " b:current_syntax, the above handler will do this when the reloaded buffer 
    " is displayed in a window again. 
    autocmd! BufRead * if exists('syntax_on') && exists('b:current_syntax') && ! empty(&l:filetype) && index(split(&eventignore, ','), 'Syntax') != -1 | unlet! b:current_syntax | endif 
augroup END 
+0

Dzięki! Ten jest zwycięzcą, ponieważ robi dokładnie to, czego potrzebuję. Doceniam również dokładną dokumentację tego, jak to działa. –

+0

Świetne; cieszę się, że mogłem pomóc. Bez dokładnej dokumentacji nie byłbym w stanie sam go zapamiętać i rozbudować. Zawsze dobrze jest poprawić własną konfigurację w oparciu o pytania dotyczące przepełnienia stosu. –

0

nie jestem zaznajomiony z args lub argdo ale jeśli trzeba otworzyć pliki pasujące do wzorca w różnych zakładkach można użyć coś takiego:

:next * 
:tab ball 

:next * otwiera wszystkie pliki maching wzór z prawidłowym podświetlaniem składni , jednak :tab ball otwiera wszystkie pliki w pamięci, które mogą stanowić problem, jeśli masz bufory, których nie trzeba otwierać w kartach.

+0

Interesting-- ten sposób otworzyć wszystkie pliki z podświetlaniem składni, która jest, co chciałbym. Ale otwiera wszystkie załadowane bufory, co jest dość dużym problemem.Celem użycia args i argdo jest określenie zestawu plików do otwarcia niezależnie od tego, co jest aktualnie ładowane. To jednak wciąż przyzwoita odpowiedź. Myślę, że powinieneś go edytować, żeby było jasne, że otwiera to je z pełnym podświetleniem składni, bo o to właśnie chodzi. –

2

argdo dodaje Syntax do ustawienia 'eventignore' (patrz :h argdo). Oznacza to, że nie ma żadnego wyróżnienia dla tych plików, ponieważ zdarzenie autokonfiguracji składni nie jest wywoływane dla tego bufora. Co sprawia, że ​​nie jest ustawiony 'filetype'. To nie jest prawda. Możesz sprawdzić, wykonując :set ft?. Możesz uruchomić :syntax on, aby ponownie włączyć podświetlanie składni. Ale to nie jest naprawdę pożądane i wydaje się kludgy.

Prawdopodobnie lepszym rozwiązaniem jest odzwyczaić się od używania kart i zamiast tego używać buforów i związanych z nimi poleceń bufora. Arglist polecenia związane z buforów: :next, :previous, :first i :last. Możesz otwierać określone pliki za pomocą :b file.c lub :sb file.c, aby otworzyć bufor w nowym podziale.

Zdaję sobie sprawę, że jest to trudna pigułka do przełknięcia i na pewno są chwile, w których naprawdę możesz chcieć każdego bufora na stronie własnej karty. Gdy zmusisz się do korzystania z buforów, więcej znajdziesz potrzebnych kart. Możesz spojrzeć na znakomity Vimcast Drew Neila na How to use tabs. Polecam również użycie Tima Pope'a unimpaired.vim, aby łatwiej poruszać się po liście argumentów.

Jeśli naprawdę musi mieć każdy w pliku na własny użytek zakładce :argdo tabe to powinieneś śledzić go z :syntax on lub :tabdo doautocmd Syntax

Więcej Pomocy Zobacz:

:h :argdo 
:h arglist 
:h buffers 
:h :b 
:h :sb 
:h :next 
:h :tabdo 
:h :doa 
:h Syntax 
:h :syn-on 
+0

Dzięki za poradę Peter. Używam buforów przez większość czasu, ale czasami karty są właśnie tam, gdzie jest. Łatwiej jest przełączać się pomiędzy plikami niż z buforami, gdy masz dobre skróty do: tabp i: tabn. Nawet z czymś takim jak unimpaired.vim, uważam, że przełączanie kart jest lepsze, ponieważ na ekranie zawsze wyświetlasz dobre nazwy buforów. –

+0

Jeśli zakładki działają dla ciebie, to w jakikolwiek sposób ich używaj, ale muszę powiedzieć, kiedy liczba plików zaczyna się skalować, a następnie robienie czegoś w rodzaju '4gt', aby uzyskać odpowiednią zakładkę wydaje się nieco głupie. Wtedy możesz znaleźć coś takiego jak 'set swb + = usetab' i zacząć używać': sb file'. W końcu, gdy dostaniesz 100 plików, może wydawać się to daremne. Jeśli kiedykolwiek znajdziesz tu siebie, mogę zasugerować rezygnację z jednego bufora na kartę. Umieść 'set hidden' w swoim pliku' vimrc', naucz się jak najwięcej poleceń do bufora, znajdź radość w splitach, oprzyj się mocno na ctags/cscope i używaj wielkich liter. –

5

Coś jak to powinno działać :

:argdo set eventignore-=Syntax | tabedit 

który usuwa Syntax z ustawieniem eventignore.

+0

Wiedziałem już, że 'argdo' usunął podświetlanie synactx, ale TIL o' eventignore'. Dzięki. – romainl

+0

Podoba mi się prostota. Całkowicie przeszklono proste rozwiązanie. Dziękuję za podzielenie się. –

+0

Jest to całkiem dobre, ale nie włącza składni pierwszego elementu w arglist. Myślę, że to dlatego, że set eventignore- = Składnia faktycznie nie działa, dopóki ten bufor nie jest już otwarty przez komendę argdo. Zasadniczo to powtarza trzy kroki dla każdego argumentu: 1) otwórz następny bufor w arglist (w bieżącym oknie); (2) set eventignore- = Składnia; (3) otwórz nową kartę (z nowym pustym buforem). Następnie, gdy cykl się powtarza, następny argument na liście jest otwierany w pustym buforze. Niefortunnym efektem ubocznym jest koniec pustych buforów. –

Powiązane problemy