2010-03-05 11 views
5

Ich benutze mehrere verschiedene Programmiersprachen jeden Tag, und ich möchte für jedes unterschiedliche Tab-Breiten (in Leerzeichen) haben. Zum Beispiel: Ich verwende die "Standard" 2 Leerzeichen für Ruby, aber unser gesamter Matlab-Code verwendet 4 Leerzeichen.Autokommandos für Matlab in vim?

Ich habe dies aus meiner persönlichen ~/.vimrc:

augroup lang_perl 
    au! 
    set tabstop=4 " tabstop length N in spaces 
    set shiftwidth=4 " make >> and friends (<<, ^T, ^D) shift N, not the default 8 
    set expandtab " Use spaces instead of tabs 
augroup END 

augroup lang_ruby 
    au! 
    set tabstop=2 " tabstop length N in spaces 
    set shiftwidth=2 " make >> and friends (<<, ^T, ^D) shift N, not the default 8 
    set expandtab " Use spaces instead of tabs 
augroup END 

Diejenigen Arbeit, aber die folgenden nicht:

augroup lang_matlab 
    au! 
    set tabstop=4 " tabstop length N in spaces 
    set shiftwidth=4 " make >> and friends (<<, ^T, ^D) shift N, not the default 8 
    set expandtab " Use spaces instead of tabs 
augroup END 

ich wirklich nicht verstehen, wie augroup lang_ruby Zahlen heraus, dass ich bin Bearbeiten einer Ruby-Datei. (Meine Suche ergab ftdetect, aber die Lösung war nicht offensichtlich.) Es scheint nicht vim weiß, dass ich Matlab mit augroup lang_matlab bearbeiten. Was ändere ich, damit dies funktioniert?

+0

Wenn Sie eine MATLAB-Datei (.m) bearbeiten und ': set filetype?' Eingeben, antwortet sie mit 'filetype = matlab'? Es ist möglich, dass Ihre .m-Dateien als eine andere Sprache identifiziert werden. – jagill

Antwort

2

Wenn Sie eine große Anzahl von Einstellungen für {} Dateityp haben wollen, sollten Sie sie in ~/.vim/ftplugin/{filetype}.vim oder in der Datei setzen, die ~/.vim/ftplugin/{filetype}/**/*.vim (Beispiele: ~/.vim/ftplugin/ruby/foo.vim, ~/.vim/ftplugin/ruby/foo/bar.vim) übereinstimmt. In diesem Fall benötigen Sie überhaupt keine Autokommandos. Wenn Sie weiterhin Autokommandos verwenden möchten, verwenden Sie Folgendes:

augroup lang_matlab 
    autocmd! 
    autocmd FileType matlab  setlocal ts=4 sw=4 et 
augroup END 

. Beachten Sie zwei Dinge: FileType-Ereignis (es ist da und es ist nicht BufRead, BufNewFile) und setlocal anstelle von einfach set. Erstens soll es für Dateitypeinstellungen verwendet werden, zweitens müssen pufferspezifische Optionen festgelegt werden.

über warum Perl und Ruby-Einstellungen funktionieren und warum Matlab Einstellungen nicht: Ihr Beispielcode ist genau die gleiche wie

augroup lang_perl 
    autocmd! 
augroup END 
augroup lang_ruby 
    autocmd! 
augroup END 

set tabstop=4 " tabstop length N in spaces 
set shiftwidth=4 " make >> and friends (<<, ^T, ^D) shift N, not the default 8 
set expandtab " Use spaces instead of tabs 

set tabstop=2 " tabstop length N in spaces 
set shiftwidth=2 " make >> and friends (<<, ^T, ^D) shift N, not the default 8 
set expandtab " Use spaces instead of tabs 

Also, Sie effektiv ts=2 sw=2 et gesetzt. Aber die $VIMRUNTIME/ftplugin/perl.vim enthält den folgenden Code:

setlocal tabstop=4 
setlocal shiftwidth=4 

so, ts=4 sw=4 für Perl gesetzt in ftplugin/perl.vim, nicht in Ihrem vimrc (wenn Sie Perl-Unterstützung Plugin installiert ist). Sie können es überprüfen, indem Sie tabstop=4 durch tabstop=8 in vimrc ersetzen.

0

Ich kann Ihnen nicht sagen, wie es festgestellt wird, dass lang_perl oder lang_ruby gelesen werden soll. Aber bei der automatischen Befehl Dokumentation suchen bringt ein Beispiel für gzip-Dateien auf (:he gzip-example):

augroup gzip 
    autocmd! 
    autocmd BufReadPre,FileReadPre  *.gz set bin 
    autocmd BufReadPost,FileReadPost  *.gz '[,']!gunzip 
    autocmd BufReadPost,FileReadPost  *.gz set nobin 
    autocmd BufReadPost,FileReadPost  *.gz execute ":doautocmd BufReadPost " . expand("%:r") 
    autocmd BufWritePost,FileWritePost *.gz !mv <afile> <afile>:r 
    autocmd BufWritePost,FileWritePost *.gz !gzip <afile>:r 
    autocmd FileAppendPre    *.gz !gunzip <afile> 
    autocmd FileAppendPre    *.gz !mv <afile>:r <afile> 
    autocmd FileAppendPost    *.gz !mv <afile> <afile>:r 
    autocmd FileAppendPost    *.gz !gzip <afile>:r 
augroup END 

es sehen? Jede autocmd, die angegeben wird, trägt ein Ereignis (BufReadPre, FileReadPre) und die Erweiterung, für die es ausgeführt werden soll (*.gz). Dies bestätigt meine bisherige Meinung, dass Sie einen beliebigen Namen für Ihre augroup verwenden können, müssen aber eine Erweiterung angeben, die die augroup verantwortlich sein soll, damit es richtig funktioniert.

Noch ein Zitat von :he autocmd-groups:

Normalerweise, wenn automatischen Befehle automatisch, Vim verwendet die automatischen Befehle für alle Gruppen ausgeführt werden. Die Gruppe spielt nur bei der Ausführung von Autokommandos mit ": doautocmd" oder ": doautoall" oder beim Definieren oder Löschen von Autokommandos eine Rolle.

Also, um eine augroup für Matlab Dateien zu machen, sollte dieser den Trick:

augroup lang_matlab 
    autocmd! 
    autocmd BufRead  *.m set ts=4 sw=4 expandtab 
augroup END 

Und stellen Sie sicher, dass diese Einstellungen von irgendwelchen augroup s überschrieben werden das nicht tun etwas bedingungslos (dh ändern Sie auch die anderen augroup Definitionen).

+0

'autocmd BufRead * .m set ts = 4 sw = 4 expandtab' enthält zwei Fehler: 1) verwende' setlocal' für Dateityp-spezifische Einstellungen wie jedes Plugin in '$ VIMRUNTIME/ftplugin' tut; 2) Job nicht wiederholen, der bereits von '$ VIMRUNTIME/filetype.vim' ausgeführt wurde: Verwenden Sie' FileType matlab' anstelle von 'BufRead * .m'. – ZyX

+0

@ZyX: Da die hier eingestellten Einstellungen (ts, sw, expandtab) puffer-lokal sind, sollte es kein Problem sein, denke ich. Und * Fehler * ist IMHO ein zu großes Wort. – eckes

+0

@ZyX: Und wenn die Antwort nicht 100% korrekt ist, kann ich zumindest behaupten, dass ** es funktioniert ** und ich brachte die Frage zurück, die seit März letzten Jahres verhungert ist :-) – eckes