• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

vim autocmd filetype

Themenstarter #1
Hallo,

ich kaempfe gerade mit meiner minimalen .vimrc:

Code:
set nocp bs=2 is ru sm vb
filetype plugin indent on
au FileType cl setl ts=2 sw=2 sts=2 et
Wenn ich jetzt z.B. eine Datei 'test.cl' oeffne und <TAB> druecke, werden 8 Zeichen breite tabs eingefuegt und nicht, wie erwartet, 2 whitespaces. Ich habe das mit vim und nvim getestet. Hat jemand eine Idee, was noch in meiner .vimrc fehlt, damit das funktioniert?

Ist ``filetype plugin indent on'' eigentlich noetig? Wenn ich das weglasse und in vim ``:filetype'' eingebe, scheint das ja per default schon aktiv zu sein, da alles auf ON steht.

Mein Ziel ist, eine eine absolut minimale .vimrc zu erstellen, bei der nur das absolut notwendige erhalten ist.
 

Rakor

Administrator
Mitarbeiter
#2
Ich glaube du musst je cmd eine Zeile machen. Zumindest mache ich das immer so..
Also:

Code:
au FileType cl setl
au FileType cl ts=2
au FileType cl sw=2
au FileType cl sts=2
au FileType cl et
 

Rakor

Administrator
Mitarbeiter
#4
Ahh... ich kannte cl nicht.. das ist ein Lisp file? dann musst du den filetype auch so nennen. Also
au FileType lisp setl

Filetype bezieht sich immer auf den Filetype wie ihn vim erkennt und nennt. Die Dateiendung ist damit nicht explizit gemeint.
 
Themenstarter #5
Hm das ja bloed, wenns nur so funktioniert. :-)

Woran erkennt vim denn, ob "print "foo" jetzt Python oder Perl ist?

In der Doku steht das so:

Code:
1. Filetypes                    *filetypes* *file-types*

Vim can detect the type of file that is edited.  This is done by checking the
file name and sometimes by inspecting the contents of the file for specific
text.
Evtl. muss meine .vimrc noch anders angepasst werden? Oder benoetigt jede Datei einen vim-spezifischen header? Hab sowas schon oefter mal gesehen...

Waere ja auch zu einfach gewesen, wenn vim einfach nur die Dateieindung auswerten wuerde.
 

Yamagi

Possessed With Psi Powers
Mitarbeiter
#6
Also, für zuverlässige Erkennung des Filetypes brauchst du:

Code:
" Mindestens
filetype on

" Sinnvoll sind außerdem
filetype indent on
filetype plugin indent on
Die Erkennung erfolgt dann mit einer Mischung aus Dateiendung und Dateiinhalt. Der Dateiinhalt bezieht sich nicht so sehr auf Code-Syntax, sondern auf Meta-Daten wie Shebangs. Das klappt in der Praxis recht gut, zumindest wenn das jeweilige Filetype-Plugin was taugt. Problematisch ist, wenn Erkennungen nicht eindeutig möglich sind. Zum Beispiel kann eine auf .md endete Datei Modula Quellcode oder Markdown sein, Modula hat außerdem keine eindeutigen Metadaten. In dem Fall gewinnt meist die Vergangenheit. Modula gab es 20 Jahre vor Markdown, daher wird .md als Modula erkannt. In solchen Fällen kann man den Filetype überschreiben:

Code:
autocmd BufNewFile,BufReadPost *.md set filetype=markdown
 
Themenstarter #7
Schade, dass es nicht so einfach ist wie erhofft. Dennoch danke fuer eure Antworten.

Grundsaetzlich nutze ich tabs anstelle whitespaces. Nur manche Sprachen, wie z.B. Elm usw. benoetigen zwingend whitespaces, sonst kompilieren sie nicht. Ich wollte eigentlich verhindern, extra dafuer plugins zu installieren und das mit minimalen autocmd filetype regeln. Scheinbar klappt das aber nicht anhand der Dateiendung. Indent ist mir nicht wichtig, sondern nur whitespaces anstelle tabs bei gewissen Dateiendungen / Sprachen.
 
Themenstarter #9
Wieso genau funktioniert es denn nicht?
Warum Elm nicht mit tabs kompiliert? Das ist eine gute Frage. :-)

Elm-Code oder auch Elixir-Code wird beispielsweise ohne externe plugins nicht von vim erkannt. Daher wollte ich, dass z.B. test.elm (fuer Elm) oder test.ex (fuer Elixir) anhand der Dateiendung von tabs auf whitespaces "umgeschaltet" wird.

Bezogen auf mein Common Lisp Beispiel oben:

Code:
set nocp bs=2 is ru sm vb
filetype on
filetype indent on
filetype plugin indent on
au BufNewFile,BufReadPost *.cl set filetype=lisp
au FileType cl setl ts=2 sw=2 sts=2 et
Oeffne ich nun eine leere foo.cl und schreibe einigen Common Lisp Code, funktioniert weder indent noch whitespaces anstelle tabs. Irgendwie stehe ich noch auf dem Schlauch glaube ich. Getestet mit vim und nvim, in einer autocmd in einer Zeile oder in mehreren Zeilen aufgeteilt.

Gebe ich allerdings direkt in vim ":set ts=2 sw=2 sts=2" ein, funktioniert es.
 
Themenstarter #11
Habs jetzt geschafft. So sieht meine minimale .vimrc momentan aus.

Code:
set nocp ai bs=2 cot= is ru sm t_te= t_ti= vb wim=longest,list
au BufNewFile,BufReadPost *.cl,*.ex,*.exs,*.elm setl ts=2 sw=2 sts=2 et
Bei den Dateiendungen .cl, .ex, .exs und .elm setzt vim nun korrekt whitespaces anstelle tabs.

Ich habe wieder vieles gelernt. Danke fuer eure Hilfe. :-)
 
Zuletzt bearbeitet: