Wie wendet man in vim automatische Befehle für einen Dateityp auf einen Bereich einer Datei an?
-
02-01-2020 - |
Frage
Ich habe eine Art polyglotten Dateityp, in den C, Python, Ruby usw. eingebettet sein können (denken Sie an „Wiki-Seite“, wenn es hilft).Gibt es eine Möglichkeit, die automatischen Befehle für einen bekannten Dateityp in einem Bereich der Datei auszuführen?
Zum Beispiel könnte ich Folgendes haben:
#!bash
if [ a = b ]; then
echo 'equal'
fi
#!python
if a = b:
print('equal')
Und ich möchte Bash-Dateityp-Autobefehle auf den ersten Teil und Python-Dateityp-Autobefehle auf den zweiten Teil anwenden.
Ich kann nur eine Syntaxhervorhebung erreichen, indem ich eine Region mit definiere Das Methode, aber ich verstehe Autobefehle nicht genug, um sie auf ähnliche Weise anwenden zu können.
Lösung
Dies automatisch durchzuführen ist eine Herausforderung, da die Dateitypeinstellungen pufferlokal sind;Vim hat also keine Vorstellung von Regionen :autocmds
verwendet werden müssen, wie Sie richtig angegeben haben.
Schnell und einfach
Mit einem Plugin wie NrrwRgn – Ein Narrow-Region-Plugin ähnlich wie Emacs, können Sie Regionen klonen, um Arbeitspuffer zu trennen;Das Plugin synchronisiert sie beim Schreiben automatisch wieder.Jedem Puffer kann über ein separater Dateityp zugewiesen werden :setf
.
Ein noch einfacherer Ansatz besteht darin, einige Zuordnungen zu definieren, um den Dateityp schnell zu wechseln:
:nnoremap <Leader>fp :setf python<CR>
:nnoremap <Leader>fs :setf sh<CR>
Wirklich getrennte Regionen in einem einzigen Puffer
Die Skizze dazu ist einfach:
:autocmd CursorMoved,CursorMovedI <buffer> if line('.') >= 6 | setf python | else | setf sh | endif
Dies setzt voraus, dass jedes Dateityp-Plugin eine ordnungsgemäße Bereinigung durchführt (oder alle relevanten Optionen überschreibt).
So bestimmen Sie die Regionen
Sie möchten die Zeilennummern auf keinen Fall explizit angeben wie in der Skizze oben.Mein OnSyntaxChange-Plugin könnte hilfreich sein, falls Sie für jeden Block die richtigen Syntaxbereiche haben/definieren können.