Wie kann ich mit einem Befehl oder lokalen vimrc-Dateien zwischen mehreren vimrc-Konfigurationen wechseln?

85

Ich arbeite in mehreren Gruppen, von denen jede ihre eigenen Tab- / Einrückungs- / Abstandsstandards in C hat.

Gibt es eine Möglichkeit, separate auswählbare VIM-Konfigurationen für jede zu haben, wenn ich eine Datei bearbeite, entweder:

  • Ich mache so etwas wie set group=1eine Konfiguration auszuwählen
  • Eine lokale .vimrc, die sich im Arbeitsverzeichnis befindet, wird verwendet, um die Konfiguration automatisch festzulegen
Bradreaves
quelle
Überprüfen Sie dies: stackoverflow.com/a/14407951/1099240
Dmitry Frank
Siehe auch die Frage Zwischen zwei verschiedenen VIM-Konfigurationen im Superuser wechseln.
Hotschke

Antworten:

40

Zusammenfassend

Es gibt einige Möglichkeiten, dies zu tun, von denen die meisten vorgeschlagen wurden, aber ich dachte, ich würde sie mit zwei zusätzlichen zusammenfassen:

  • Pro-Verzeichnis vimrc - hat den Nachteil, dass Vim im richtigen Verzeichnis gestartet werden muss: Wenn sich Ihr Projekt in befindet ~/project1und Sie haben ~/project1/.vim.customund tuncd ~ ; vim project1/file.c , werden die benutzerdefinierten Einstellungen nicht gefunden.
  • Modelines - sehr effektiv, hat jedoch den Nachteil, dass sie allen Dateien hinzugefügt werden müssen (und denken Sie daran, sie neuen Dateien hinzuzufügen).
  • Verzeichnisspezifische automatische Befehle - dies ist sehr effektiv
  • Suchen Sie nach einem bestimmten Header in der Datei (siehe unten) - dies ist der Header, den ich in der Vergangenheit am häufigsten verwendet habe, wenn ich für verschiedene Unternehmen oder für klar benannte Projekte gearbeitet habe
  • Vimrc pro Verzeichnis, das beim Öffnen der Datei überprüft wird (siehe unten). Eine weitere ziemlich einfach zu implementierende, insbesondere wenn sich Ihr Projektcode an einem Ort befindet.

Nach einem Header suchen

In vielen Organisationen befindet sich oben in jeder Quelldatei ein Standardheader (mit einem Copyright-Hinweis, einem Projektnamen usw.). In diesem Fall kann Vim die ersten (z. B.) 10 Zeilen der Datei automatisch nach einem Schlüsselwort durchsuchen. Wenn es es findet, kann es Ihre Einstellungen ändern. Ich habe dies geändert, um es einfacher zu machen als das von mir verwendete Formular (das viele andere Dinge erledigt), aber erstelle ein ~/.vim/after/filetype.vim(falls Sie noch keines haben) und füge so etwas hinzu:

au FileType * call <SID>ConfigureFiletypes(expand("<amatch>"))

" List of file types to customise
let s:GROUPNAMETypes = ['c', 'cpp', 'vhdl', 'c.doxygen']

func! <SID>CheckForGROUPNAMECode()
    " Check if any of the first ten lines contain "GROUPNAME".

    " Read the first ten lines into a variable
    let header = getline(1)
    for i in range(2, 10)
        let header = header . getline(i)
    endfor

    if header =~ '\<GROUPNAME\>'
        " Change the status line to make it clear which
        " group we're using
        setlocal statusline=%<%f\ (GROUPNAME)\ %h%m%r%=%-14.(%l,%c%V%)\ %P
        " Do other customisation here
        setlocal et
        " etc
    endif
endfunc

func! <SID>ConfigureFiletypes(filetype)
    if index(s:GROUPNAMETypes, a:filetype) != -1
        call <SID>CheckForGROUPNAMECode()
    endif
endfunc

Immer wenn eine Datei eines beliebigen Typs geöffnet und der Dateityp festgelegt wird (die au FileType *Zeile), wird dieConfigureFiletypes Funktion aufgerufen. Hiermit wird überprüft, ob der Dateityp in der Liste der Dateitypen enthalten ist, die der aktuellen Gruppe (GROUPNAME) zugeordnet sind, in diesem Fall 'c', 'cpp', 'vhdl' oder 'c.doxygen'. Wenn dies der Fall ist, wird CheckForGROUPNAMECode () aufgerufen, das die ersten 10 Zeilen der Datei liest, und wenn sie GROUPNAME enthalten, werden einige Anpassungen vorgenommen. Neben dem Festlegen von expandtabs oder was auch immer wird auch die Statusleiste geändert, um den Gruppennamen klar anzuzeigen, sodass Sie wissen, dass er auf einen Blick funktioniert.

Beim Öffnen auf Konfiguration prüfen

Ähnlich wie bei JS Bangs kann es nützlich sein, eine benutzerdefinierte Konfigurationsdatei zu haben. Anstatt es in vimrc zu laden, sollten Sie Folgendes in Betracht ziehen, um zu überprüfen, wann eine .c-Datei für eine .vim.custom im selben Verzeichnis wie die .c-Datei geöffnet wird.

au BufNewFile,BufRead *.c call CheckForCustomConfiguration()

function! CheckForCustomConfiguration()
    " Check for .vim.custom in the directory containing the newly opened file
    let custom_config_file = expand('%:p:h') . '/.vim.custom'
    if filereadable(custom_config_file)
        exe 'source' custom_config_file
    endif
endfunction
DrAl
quelle
65

Ich habe das in $HOME/.vimrc:

if filereadable(".vim.custom")
    so .vim.custom
endif

Auf diese Weise kann ich .vim.customin jedes Verzeichnis eine Datei einfügen, um Befehle und Optionen zu laden, die für dieses Verzeichnis spezifisch sind. Wenn Sie an mehreren Projekten mit tiefen Verzeichnisstrukturen arbeiten, benötigen Sie möglicherweise etwas Anspruchsvolleres (z. B. den Verzeichnisbaum hochgehen, bis ein .vim.customgefunden wird), aber die gleiche Grundidee funktioniert.

AKTUALISIEREN:

Ich mache jetzt so etwas, um eine .vimDatei aus demselben Verzeichnis wie die Datei zu lesen, die ich bearbeite, unabhängig davon, um welches aktuelle Verzeichnis es sich handelt.

let b:thisdir=expand("%:p:h")
let b:vim=b:thisdir."/.vim"
if (filereadable(b:vim))
    execute "source ".b:vim
endif
JSB ձոգչ
quelle
1
Das ist großartig, ich habe das noch nie gesehen!
Jim Mitchener
1
Dies ist eine großartige Lösung für Projekte, die in Repos leben!
Bradreaves
2
Mit dieser 'exrc'Option können Sie bereits ähnliche Aktionen ausführen. Es wird ein Laden .vimrc/ .exrc/ .gvimrcim aktuellen Arbeitsverzeichnis.
Jamessan
Der Kommentar zu exrcsollte die richtige Antwort sein. Alles andere scheint o hacky und kompliziert.
Silvenon
Die Verwendung exrcist nett, aber ich schätze es, die richtige Datei zu erhalten, auch wenn ich mich nicht im selben Arbeitsverzeichnis wie die Datei befinde, die ich bearbeite.
JSB 20
34

Sie können auch automatische Befehle in Ihre einfügen,.vimrc die bestimmte Optionen pro Pfad festlegen.

au BufRead,BufNewFile /path/to/project1/* setl sw=4 et
au BufRead,BufNewFile /path/to/project2/* setl sw=3 noet
Jamessan
quelle
Dies ist ideal, wenn Sie nicht die Kontrolle über das Repository haben, sodass Sie dort keine ".vim.custom" -Dateien ablegen können. Ich mag es, dass es das Repository sauber hält. Vielen Dank. Haftungsausschluss: Wenn sich der Pfad nicht musterfreundlich ändert, ist die Version ".vim.custom" möglicherweise besser geeignet, vorausgesetzt, man kann das Repository ändern.
lpapp
17

Plugin macht das Richtige: http://www.vim.org/scripts/script.php?script_id=441

„Dieses Plugin sucht im Dateisystembaum der aktuell geöffneten Datei nach lokalen vimrc-Dateien. Standardmäßig sucht es nach allen ".lvimrc" -Dateien vom Verzeichnis der Datei bis zum Stammverzeichnis und lädt sie in umgekehrter Reihenfolge. Der Dateiname und die Anzahl der geladenen Dateien können über globale Variablen angepasst werden. “

Schlitten
quelle
3
Und die Github-Version unterstützt auch das Laden mit Krankheitserregern :-)
Graza
Ein anderes ähnliches Plugin ist localrc.vim; Es ermöglicht auch filetypspezifische Einstellungen pro Verzeichnis. Ich finde es unverzichtbar. vim.org/scripts/script.php?script_id=3393
Ingo Karkat
12

Vorausgesetzt, Ihre Entwicklerkollegen beschweren sich nicht darüber, können Sie jeder Datei in den Kommentaren jederzeit vim-Einstellungen hinzufügen.

/*
 * vim:ts=4:sw=4:expandtab:...
 */

int main(int argc, char **argv)
{
    ...
Jim Mitchener
quelle
2
Ich bin der einzige aufgeklärte Entwickler in den meisten meiner Teams, also sollte es niemanden stören . Dies ist eine wirklich nette Lösung pro Datei.
Bradreaves
1
Ich ziehe es vor, sie unten hinzuzufügen, damit sie unauffällig sind, aber ich denke, das ist eine Frage des Stils.
Nyuszika7h
5

Zu diesem Zweck habe ich ein Open-Source-Tool erstellt. Vergessen Sie die Header, Scans, Konfigurationen und lokalen vimrc-Dateien.

Versuchen Sie zu schwimmen.


Schwimmen

swimist ein schnelles Tool zum Wechseln von vimrc-Dateien und zum Erstellen praktischer Aliase. Hier ist eine kurze Verwendungsliste. Im Github-Repo finden Sie ein exemplarisches GIF und Anweisungen zum Herunterladen:


Verwendung

swim add ~/dotfiles/myVimrc favorite    #Add new swim alias
swim ls                                 #Show available swim aliases
swim add https://raw.githubusercontent.com/dawsonbotsford/swim/master/exampleVimrcs/vimrcWikia.vim example
swim with favorite         #Set alias favorite as primary .vimrc
swim with main             #Set alias main as primary .vimrc

Weiterlesen

https://github.com/dawsonbotsford/swim

Dawson B.
quelle
4

Nachdem ich das im vorherigen Poster vorgeschlagene localvimrc-Plugin ausprobiert habe, mag ich es sehr, wenn die vim-Einstellungen pro Projekt nicht unübersichtlich gesteuert werden.

Vor dem Laden einer .lvimrc-Datei wird standardmäßig eine Bestätigung angefordert, es gibt jedoch eine Einstellung zum automatischen Laden von .lvimrc-Dateien. Einige sehen dies möglicherweise als Sicherheitslücke, aber es funktioniert wie angekündigt.

Ich habe mich dafür entschieden, die .lvimrc-Dateien .gitignore. Alternativ können Sie sie als gemeinsame Einstellungen einchecken (Tab / Space-Erweiterung, Tabstops, andere projektspezifische Einstellungen).

Jerseyboy
quelle
1
Dieses Skript ist erstaunlich: github.com/MarcWeber/vim-addon-local-vimrc . 1) Es fragt jetzt nur noch einmal und markiert den Datei-Hash als OK. 2) Der Verzeichnisbaum wird vom Stammverzeichnis in das aktuelle Verzeichnis übertragen, wobei zuletzt Dateien mit höherer Priorität bezogen werden.
Ciro Santilli 法轮功 冠状 病 六四 事件 28
Warum die .lvimrcDatei hinzufügen .gitignore? Der Punkt ist, dass jeder, der vim verwendet und das Plugin installiert hat, die gleichen Einstellungen erhält.
Nyuszika7h
2
@ nyuszika7h Einige Einstellungen müssen erzwungen werden, während andere rein persönlich sind. Für Einstellungen, die für alle erzwungen werden müssen, ist EditorConfig sogar noch besser, da es vom Editor
unabhängig
1

Wie von sledge erwähnt, ist die Verwendung dieses Plug- Ins die beste Option, die ich je gesehen und verwendet habe. jerseyboy kommentierte, dass das Dienstprogramm empfohlen habe, vor dem Laden um Bestätigung zu bitten (dh nach dem Öffnen jeder Datei). Um dies zu vermeiden, legen Sie einfach .vimrcdie Liste der lokalen .lvimrcDateien an:

let g:localvimrc_whitelist='/development/kernel/.lvimrc'

Jekik
quelle
1

Hier ist eine Variation von Jamessan

function! ConditionalLoad()
    let cwd = getcwd()
    if getcwd() =~ $HOME . "/src/mobile"
        so $HOME/.vim.mobile
    endif
endfunction
autocmd VimEnter * call ConditionalLoad()

Ich werde vi häufig ohne eine bestimmte Datei starten, zu der ich springe, damit das Laden der Konfiguration basierend auf dem aktuellen Arbeitsverzeichnis bedingt möglich ist. Nachteil ist, dass die Konfiguration nicht basierend auf der Datei angewendet wird, sondern außerhalb des Arbeitsverzeichnisses.

Michael Wasser
quelle
Genau das, wonach ich gesucht habe. Als Beispiel für die Verwendung: Ich habe diesen Code abgelegt ~/.vimrc, /src/mobilein mein Symfony- Projektverzeichnis /www/symfonygeändert (in meinem Fall ) und geändert, .vim.mobileum .vim.symfonydann eine neue .vimrc-Konfiguration in der ~/.vim.symfonyDatei
abzulegen
1

Ich arbeite in mehreren Gruppen, von denen jede ihre eigenen Tab- / Einrückungs- / Abstandsstandards in C hat.

Ich arbeite mit allen Arten von Open Source gleichzeitig. Es ist nicht praktisch, separate .vimrcDateien zu erstellen und die Formatierungsstandards neu zu konfigurieren. Vor mehr als einem Jahrzehnt hatte ich es endlich satt, mich mit der Editor-Konfiguration zu beschäftigen, und schrieb ein Programm, das aufgerufen wurde autotab, um damit umzugehen .

Wenn autotabdie Einrichtung mit Vim vorgeschlagen wird, wird jedes Mal, wenn Sie eine Datei in Vim laden, diese autotabaufgerufen und die Ausgabe der Vim-Einstellungen autotaban einen :setBefehl übergeben.

autotabliest mehrere tausend Zeilen aus der Datei, analysiert sie und stellt fest , die Einstellungen für die expandtab, tabstopund shiftwidthParameter.

Es wird ermittelt, ob die Datei harte Tabulatoren oder nur Leerzeichen zum Einrücken verwendet, und es wird die Einrückungsgröße ermittelt. Wenn die Datei mit Registerkarten eingerückt ist, wird die richtige Registerkartengröße ermittelt, basierend auf dem Rendern des Dateibeispiels unter Verwendung verschiedener Registerkartengrößen und der Beurteilung anhand von Heuristiken wie der zeilenweisen Ausrichtung interner Elemente.

Es funktioniert gut genug, dass ich vor Jahren aufgehört habe, den Algorithmus zu optimieren. Wenn es verwirrt wird, liegt dies fast immer daran, dass die Datei Formatierungsprobleme aufweist, z. B. die gleichzeitige Verwendung mehrerer Konventionen.

Es ist auch "Agnostiker" des Dateityps und funktioniert gut mit einer Vielzahl verschiedener Sprachen. Ich benutze es nicht nur über C, sondern auch über Shell-Skripte, Lisp, Makefiles, HTML und was haben Sie.

Beachten Sie, dass andere Formatierungsparameter, die projektspezifisch sein können, wie z. B. in C-Dateien, nicht behandelt werden, ob caseBeschriftungen in einer switchAnweisung eingerückt sind oder nicht, oder ob umschlossene Funktionsargumentlisten einfach eingerückt oder an der ausgerichtet sind Klammer der Argumentliste öffnen. Vim hat Einstellungen für solche Dinge, und so könnte das Programm plausibel erweitert werden, um den Stil zu analysieren und diese Parameter auszugeben.

Kaz
quelle
0

Auf der Suche nach dem gleichen Problem habe ich auch das Sauce-Plug-In gefunden: http://www.vim.org/scripts/script.php?script_id=3992

Es behauptet:

Sauce ist ein kompakter Manager für mehrere vimrc-Dateien, mit dem verschiedene Einstellungen für verschiedene Umgebungen geladen werden können. Kurz gesagt, Sie können viele verschiedene vim-Einstellungsdateien verwalten und nur die benötigten Dateien laden, wenn Sie sie benötigen.

Ich finde es besonders interessant, dass die Konfiguration in seinem Datenverzeichnis gespeichert bleibt, anstatt zu erwarten, dass der Benutzer Punktdateien über das Dateisystem streut. Dies ist jedoch oft eher eine Mischung aus persönlichem Geschmack.

Ich muss es allerdings noch testen.

rfindeis
quelle
0

Sie können mit versenkbaren für Schaltkonfiguration (keine dotfiles, nicht nur.vimrc )

Installieren stow:

$ apt install stow

Erstellen Sie mehrere Verzeichnisse für jede Konfiguration:

~$ ls -d ~/dotfiles/vim*
vim-all vim-webdev vim-go

Setzen Sie verschiedene .vimrcin sie:

$ find ~/dotfiles -name .vimrc
/home/username/vim-golang/.vimrc
/home/username/vim-webdev/.vimrc
/home/username/vim-all/.vimrc

Jetzt können Sie die vim-golang-Konfiguration mit diesem Befehl instanziieren (sollte im Verzeichnis dotfiles ausgeführt werden):

~$ cd ~/dotfiles

dotfiles$ stow -v vim-golang
LINK: .vimrc => dotfiles/vim-golang/.vimrc

Jetzt ist es verbunden:

$ cd ~ && ls -l .vimrc 
.vimrc -> dotfiles/vim-golang/.vimrc

Wenn Sie die Konfiguration wechseln müssen, wiederholen stowSie den Vorgang :

~$ cd dotfiles

dotfiles$ stow -v -D vim-golang
UNLINK: .vimrc

dotfiles$ stow -v vim-webdev
LINK: .vimrc => dotfiles/vim-webdev/.vimrc

$ cd ~ && ls -l .vimrc 
.vimrc -> dotfiles/vim-webdev/.vimrc

Lesen Sie hier mehr darüber: Verwalten von Punktedateien mit GNU stow

Vorteile : ziemlich einfach, keine vim-Plugin-Abhängigkeiten, kann nicht nur zum Verwalten aller Punktedateien verwendet werden .vimrc.

Nachteile : Konfigurationen sind unabhängig voneinander. Sie müssen sie einzeln verwalten / aktualisieren (wenn Sie die Konfigurationen nicht zu oft wechseln / aktualisieren, ist dies nicht das Problem).

Kiba
quelle