Wie definiere ich Einklang in VIM auf basierend auf lockigen Zahnspangen?
-
26-10-2019 - |
Frage
ich benutze https://github.com/cakebaker/scss-syntax.vim Für die Syntax -Hervorhebung SCSS (oder Sass) Dateien auf VIM, die sehr gut für die Syntax -Hervorhebung geeignet sind. Das Plugin verfügt jedoch nicht über eine Einrückungsdatei und habe Probleme, eine zu schreiben.
Ich möchte den Einzug so einstellen, dass er so aussieht:
Wenn ich jedoch tue gg=G
, Ich bekomme:
Ich vermute, dass es keinen verschachtelten Einsatz basierend auf Zahnspangen versteht. Ich habe all die verschiedenen Kombinationen von ausprobiert
set cindent
set nocindent
set autoindent
set smartindent
und versuchte, den Code von zu verwenden Tab-Taste == 4 Leerzeichen und automatisch nach lockigen Zahnspangen in VIM , einschließlich
set tabstop=2
set shiftwidth=2
set expandtab
... aber verschachtelte Zahnspangenantrieb scheint nie zu funktionieren.
Ich glaube, ich möchte vielleicht eine benutzerdefinierte Einstelldatei schreiben, und alles, was ich brauche, ist eine Einklebung, die auf Zahnspangen mit verschachtelten Ebenen basiert. Wie soll ich das machen? Wenn jemand eine Einklebungsdatei für Filetypen mit ähnlicher Syntax hat, ist dies auch großartig.
Lösung
Dies ist ein kurzer Hack, der auf dem integrierten Perl-Eindringungscode (in "basiert indent/perl.vim
). Hoffentlich können Sie es verwenden, um das zu bekommen, was Sie tun möchten. Weitere Informationen finden Sie in den detaillierteren Kommentaren im Perl -Einrückungscode oder in einem anderen der Dateien im Einstellungsverzeichnis.
setlocal indentexpr=GetMyIndent()
function! GetMyIndent()
let cline = getline(v:lnum)
" Find a non-blank line above the current line.
let lnum = prevnonblank(v:lnum - 1)
" Hit the start of the file, use zero indent.
if lnum == 0
return 0
endif
let line = getline(lnum)
let ind = indent(lnum)
" Indent blocks enclosed by {}, (), or []
" Find a real opening brace
let bracepos = match(line, '[(){}\[\]]', matchend(line, '^\s*[)}\]]'))
while bracepos != -1
let brace = strpart(line, bracepos, 1)
if brace == '(' || brace == '{' || brace == '['
let ind = ind + &sw
else
let ind = ind - &sw
endif
let bracepos = match(line, '[(){}\[\]]', bracepos + 1)
endwhile
let bracepos = matchend(cline, '^\s*[)}\]]')
if bracepos != -1
let ind = ind - &sw
endif
return ind
endfunction
Speichern Sie diese Datei als ~/.vim/indent/something.vim
wo something
ist Ihr Dateityp (ersetzen ~/.vim
mit dem Weg zu dem Weg zu vimfiles
Wenn Sie unter Windows sind.
Möglicherweise möchten Sie dies auch zu Beginn der Datei festhalten (aber nur, wenn es keine andere Einrückungsdeklaration gibt, die zuerst geladen werden könnte):
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
finish
endif
let b:did_indent = 1