Vim: Einstellungen auf Dateien im Verzeichnis anwenden

103

Wie lege ich die Vim-Einstellungen für alle Dateien im aktuellen Verzeichnis fest?

Die ideale Lösung wäre, wenn Vim vor der Suche nach ~ / .vimrc nach einer .vimrc im aktuellen Verzeichnis suchen und diese lesen und dort die Einstellungen für den gesamten Baum anwenden würde.

Ich habe ein Plugin gesehen , aber dies bedeutet, dass die angewendeten Einstellungen nicht transparent sind, da das Plugin installiert werden muss. Im Gegensatz dazu ist eine Modeline transparent, da unabhängig vom vimrc oder dem spezifischen vim-Aufruf eines Benutzers die modeline-Einstellungen für diese Datei angewendet werden.

Dinge, die ich versucht habe, sind

  • Platzieren einer .vimrc im Arbeitsverzeichnis
  • :so vimrc in der modeline.

Ich nehme an, beide funktionieren aus Sicherheitsgründen nicht. Ich brauche nicht die volle Kraft eines Vimrc; Es würde ausreichen, an Einstellungen gebunden zu sein, die von einer Modeline akzeptiert werden. Mein Ziel ist es, Vimmern die Übernahme von Codierungsstandards in einem Projekt zu erleichtern.

wilhelmtell
quelle
2
Verwandte: Wie man vimrc Einstellungen für einen Verzeichnisbaum nur bei Vim SE
anwendbar macht

Antworten:

42

Ich bin ein Verfechter des Plugin-Weges . Aus verschiedenen Gründen:

  • Modelines sind besonders eingeschränkt: Wir können keine Variablen festlegen (die andere (ft) Plugins optimieren, z. B. "Sollten die geschweiften Klammern des for-Snippets in einer neuen Zeile stehen?") Oder Funktionen von ihnen aufrufen (ich beschränke mich nicht Um die Standards zu codieren, habe ich auch das Makefile so eingestellt, dass es abhängig vom aktuellen Verzeichnis verwendet wird.
  • DRY : Bei Modelines muss eine Einstellung in jeder Datei wiederholt werden. Wenn zu viele Dinge festgelegt oder Einstellungen geändert werden müssen, wird die Pflege schnell schwierig. Außerdem muss ein Template-Expander-Plugin verwendet werden . was Sie berücksichtigen sollten, wenn Sie mehrere Vimmer in Ihrem Projekt haben).
  • Nicht jeder nutzt vim, um sich zu entwickeln. Ich möchte mich nicht von den Einstellungen anderer Redakteure stören lassen. Warum sollte ich deren Einstellungen parasitieren?
  • Es ist einfacher, Vimmer zu bitten, dasselbe Plugin zu installieren, als sie zu bitten, dieselben Zeilen in ihrer .vimrc-Datei zu kopieren, einzufügen und zu pflegen
  • Die Einstellungen können mit den anderen Projektdateien (cvs / svn / git / Whatever) gespeichert werden.
  • Es ist wirklich einfach, eine Konfigurationsdatei pro Projekt zu haben - mit dem Plugin habe ich eine globale Konfigurationsdatei für die Codierungsstandards des Gesamtprojekts und spezifische Konfigurationsdateien für jedes Unterprojekt (welches Makefile verwendet werden soll, welche ausführbare Datei aufgerufen werden soll) , ...)

Übrigens kann die Lösung von etw verwendet werden, um eine einzelne Konfigurationsdatei zu erstellen. Dies ist dem Plugin-Ansatz sehr ähnlich, außer dass .vimrc mit nicht globalen Optionen parasitiert sein muss und nicht einfach mehrere / gemeinsam genutzte Konfigurationsdateien unterstützt.

Luc Hermitte
quelle
Ich habe festgestellt, dass Sie eine neue Datei im Pfad speichern müssen, bevor das Plugin korrekt ausgeführt wird
cmcginty
Tatsächlich. Diese Familie von Plugins definiert nur ein Framework. Sie müssen die projektspezifischen Definitionen noch in eine Datei schreiben, die das Framework automatisch erstellt.
Luc Hermitte
1
Bitte beachten Sie, dass Luc ein eigenes Plugin verlinkt. Dies scheint viel besser zu funktionieren als das in der Frage verknüpfte. Vielen Dank.
Daten
Gut. Ich kann es nicht sagen. Da ich meine seit Jahren benutze, habe ich mir die anderen Implementierungen nie genau angesehen. Von Zeit zu Zeit erhalte ich einen Fehlerbericht, den ich eventuell berücksichtige. Übrigens ist meine Version so implementiert, dass sie vor mu-template ausgelöst wird, um projektspezifische Variablen vor dem Erweitern von Vorlagen festzulegen (was sehr nützlich ist, um das aktuelle Projektstammverzeichnis abzurufen und es aus den erweiterten Pfadnamen zu entfernen)
Luc Hermitte
1
@JasonMcCarrell Meine Implementierung von local_vimrc und Markus "embear" Brauns unterstützt Blacklist, Whitelist ... Wenn Sie nur angeben müssen, wie das Einrücken erfolgt, ist das EditorConfig-vim-Plugin möglicherweise die bessere Wahl.
Luc Hermitte
91

Sie können so etwas eingeben $VIM/vimrc

autocmd BufNewFile,BufRead /path/to/files/* set nowrap tabstop=4 shiftwidth=4
etw
quelle
1
Dies ist rekursiv, aber nur mit dem *. Wenn Sie versuchen, es auf / path / to / files / oder / path / to / files zu reduzieren, funktioniert es nicht.
SystemParadox
Dies ist großartig, wenn Ihr Projekt einen Baum von Dateien hat, die mit "noexpandtab" geschrieben wurden, und einen anderen Baum mit allen Dateien "expandtab" (z. B. CodeIgniter). Sie können die richtige Aktion für Dateien in jedem Baum einzeln mit einer Konfigurationsdatei festlegen.
user9645
2
Seltsamerweise funktionierte dies nicht, als mein Pfad einen Symlink enthielt. Ich musste den vollständigen Pfad ohne Symlinks angeben, bevor es funktionieren würde.
Dolan Antenucci
Siehe die Antwort von joseph07 über die Verwendung eines "vertrauenswürdigen vim" als Alternative zur Umkehrung dieses Ansatzes (verteiltes .vimrc vs. zentralisiert).
Nathan Schulte
50

Ich würde dringend empfehlen, nicht zu verwenden set exrc

Selbst set secureunter * nix führt vim weiterhin Autocommands, Shell usw. aus, wenn Sie die Datei besitzen. Wenn Sie also eine Datei in diesem Tarball bearbeiten wollten, schickte ich Ihnen Folgendes .vimrc:

autocmd BufEnter * :silent! !echo rm -rf ~/

Sie werden wahrscheinlich weniger amüsiert sein als ich.

phen
quelle
6
Dies gilt auch für Plugins, die beim Laden von vim automatisch ausgeführt werden.
Luc Hermitte
31

Diese Frage ist alt, aber es scheint eine ziemlich natürliche und anhaltende Sorge zu sein.

Meine Lösung ist ziemlich einfach. Ich lege eine .vimrcDatei im Stammverzeichnis meiner Projekte ab. Die erste Zeile der .vimrcDatei enthält normalerweise Quellen ~/.vimrcund fügt dann die gewünschte Konfiguration hinzu. Ich alias tvim='vim -u .vimrc'und verwende tvimin meinen persönlichen Projektverzeichnissen. "tvim" für "vertrauenswürdiges vim", was bedeutet, dass ich, wenn ich es in einem Verzeichnis mit einer .vimrcDatei ausführe und etwas schief geht, nur mich selbst beschuldigen muss, da ich ausdrücklich gesagt habe, dass ich ihm vertraue. Außerdem bewahre ich eine Gruppe davon auf, damit ich manchmal nur den gewünschten Softlink für eine bestimmte Art von Projekt erstellen kann.

joseph07
quelle
1
Dieser Ansatz ist unkompliziert und entspricht perfekt meinen Anforderungen.
Jinxed
Wenn ich dies versuche und source $HOME/.vimrcvon meinem lokalen .vimrc, beschwert sich Vim, dass es meine systemweit installierten Plugins nicht finden kann (in diesem Fall Pathogen; der execute pathogen#infect()Befehl auf meinem $HOME/.vimrcschlägt fehl mit Unknown function ...). Wie kann ich das beheben?
Nathan Schulte
20

Das Platzieren einer .vimrc-Datei im Arbeitsverzeichnis wird tatsächlich unterstützt und nur standardmäßig deaktiviert. Siehe :h 'exrc'und :h startupfür Details 'exrc'ermöglicht die Einstellung das Lesen .vimrcaus dem aktuellen Verzeichnis.

Es wird auch empfohlen, :set securedies zu verwenden. Dadurch werden :autocmdBefehle für .vimrcdas aktuelle Verzeichnis gesperrt , Shell und Schreibvorgänge ausgeführt .

Eine andere Sache, die einen Blick wert sein könnte, ist das Einrichten einer Sitzung ( :h session) mit einer Standardansicht und Einstellungen für das Projekt.

Alles in allem würde ich mich wahrscheinlich für die von Luc Hermitte selbst beschriebene Plugin-Option entscheiden.

gravious
quelle
6
Bitte beachten Sie den Kommentar von phen. Dies kann schwerwiegende Auswirkungen auf die Sicherheit haben.
Daten
11

Darf ich Ihnen raten, die vorhandenen Funktionen von vim anstelle von Plugins (Portabilitätsgepäck) zu verwenden, um Sicherheitsrisiken mit JEDEN "Autorun" -Funktionen für ALLES heutzutage zu minimieren?

Z.B.

Die vimrc-Datei meines lokalen Ordners heißt "_gvimrc" (absichtlich). Dies verringert die Hoffnung für Menschen wie Phen, sich auf unsere Kosten zu amüsieren. :-)

In meine $ VIM / .vimrc-Datei habe ich Folgendes eingefügt:

if filereadable("_gvimrc")
    source _gvimrc
endif

Am Ende.

Ich verwende "filereadable ()" über "fileexists ()", da das letztere etwas eigenartig ist, wenn es gefoltert wird, wenn mehrere (10+) Dateien gleichzeitig geöffnet werden (nicht sicher warum).

Natürlich können Sie Ihren eigenen eindeutigen Dateinamen angeben, um potenzielle Unruhestifter weiter zu verschleiern. Wie "_mygvimrc", "_gobbledygook" usw. Sie müssen sich nur auf einen standardisierten Namen festlegen und ihn entsprechend in Ihrem $ VIM / .vimrc angeben. Wenn Sie sich dabei auf vi / vim-Interna verlassen, werden Portabilitätsprobleme ausgeschlossen. ABER nennen Sie es NICHT .vimrc (oder _vimrc), um rekursives Sourcing zu verhindern, falls Sie die Datei $ VIM / .vimrc später mit vim bearbeiten.

Ich benutze dies seit Windoze 98SE, über Windork XP Pro und jetzt Windorkier 7 (bereits ab 5 Jahren). Ich werde eine Liste von TXT-Dateien im Explorer markieren und dann "Mit mehreren Vim bearbeiten" verwenden, was dazu führt, dass mehrere Vim-Fenster gleichzeitig geöffnet werden. Für meine Arbeit mache ich das mehrmals täglich. Alle Dateien wurden mit dem behandelt, was ich in meinem lokalen _gvimrc festgelegt habe.

XEQtor
quelle
Hier hat das Misstrauen gegenüber der Portabilität von Plugins keinen Grund, da diese local_vimrc-Plugins (zumindest meine) portabel sind (sie wurden früher auf verschiedenen Betriebssystemen und sogar unter Windows 95 gepflegt). Das Problem des Sicherheitsrisikos ist ebenfalls übertrieben: Wenn wir diesen Weg gehen, werden wir niemals etwas installieren, um unsere Arbeit zu erleichtern.
Luc Hermitte
Aber für mich ist das erste wirkliche Problem, dass Sie bei Ihrem Ansatz aus dem genauen Verzeichnis heraus arbeiten müssen, das die _gvimrc-Datei enthält (was ein schlechter Name ist, da es gvim-spezifisches Material enthalten soll). Wenn Ihr Projekt aus mehreren Verzeichnissen besteht, für die möglicherweise eine gemeinsame Konfiguration erforderlich ist, und aus bestimmten Verzeichnissen (bei mehreren Modulen), zeigt dies schnell seine Einschränkungen.
Luc Hermitte
Das zweite Problem ist, dass Sie jeweils nur an einem Projekt arbeiten können. Wenn ich an OTB, openjpeg und einem Projekt arbeiten möchte, das beide Bibliotheken integriert, kann ich mit dieser Lösung nicht für jedes Projekt eine bestimmte Einstellung festlegen drei Projekte.
Luc Hermitte
Dies funktioniert auch zum Verketten einer Syntaxdatei aus einem lokalen Verzeichnis.
Maharvey67
2

Angenommen, die Benutzer fügen nicht alle paar Tage Dateien hinzu, können Sie wahrscheinlich oben in jeder Datei eine Modeline hinzufügen. Wenn Ihr Versionskontrollsystem dies zulässt, können Sie wahrscheinlich eine Regel durchsetzen, die besagt, dass jede Datei beim Einchecken eine Modeline haben muss.

Nathan Fellman
quelle
2

Verwenden Sie "editorconfig"

Wenn die Arten von Codierungsstandards, die Sie erzwingen möchten, mit dem Einrückungsstil, der Registerkartengröße, dem Dateiformat und dem Zeichensatz zusammenhängen, sollten Sie sich "editorconfig" ansehen , einen editorübergreifenden Standard, in dem diese Art von Einstellungen angegeben werden ein bestimmtes Projekt, und lassen Sie alle Editoren dieser Konfiguration folgen.

Mit der Spezifikation "editorconfig" können Projekte je nach Dateierweiterung oder Namen innerhalb des Projekts unterschiedliche Einstellungen anfordern. (Sie können also Makefiles mit TABs verwenden, Ihre Python-Skripte mit 4 Leerzeichen und Ihre Shell-Skripte mit 2 Leerzeichen zum Einrücken.)

Sie benötigen ein Plug-In, um "editorconfig" in Vim verwenden zu können. Die offizielle Website bietet eine, aber ich persönlich würde sgur / vim-editorconfig empfehlen , die in reinem Vimscript geschrieben ist, damit Sie sich nicht zu viele Gedanken über externe Abhängigkeiten machen müssen.

Da "editorconfig" auf eine Cross-Editor-Kompatibilität abzielt, ist die Funktionsweise ziemlich eingeschränkt. Wenn Sie also konsistente Leerzeichen, Dateiformate (DOS vs. Unix) und Codierungen (Unicode utf-8 usw.) wünschen, dann "editorconfig" " ist für Sie.

filbranden
quelle
0

Ich habe mir die Plugins angesehen, die es gab, und habe mir keine wirklich vorgestellt, also habe ich eine einfache Funktion geschrieben, die sich auf vim-flüchtig stützt . Dies hat den Vorteil, dass das Stammverzeichnis des Projekts immer das Stammverzeichnis des Repositorys ist und ich die Datei zusätzlich hashen kann, um eine Vertrauensstellungstabelle zu führen. Fügen Sie einfach Folgendes in Ihre .vimrcDatei ein.

function LoadRepoVimrc()
  let l:path = fugitive#repo().tree('.vimrc')
  if filereadable(l:path)
    let l:sha1 = fugitive#repo().git_chomp('hash-object',l:path)
    if !exists('g:SAFE_VIMRC') | let g:SAFE_VIMRC = {} | endif
    if has_key(g:SAFE_VIMRC,l:path) && g:SAFE_VIMRC[l:path] ==? l:sha1
      execute 'source '.fnameescape(l:path)
    elseif confirm("Trust ".l:path."?", "&Yes\n&No",2) == 1
      let g:SAFE_VIMRC[l:path] = l:sha1
      execute 'source '.fnameescape(l:path)
    else
      execute 'sandbox source '.fnameescape(l:path)
    endif
  endif
endfunction
autocmd User FugitiveBoot call LoadRepoVimrc()
set viminfo ^= !

Wenn die !Option in der viminfoEinstellung festgelegt ist, SAFE_VIMRCbleibt das Wörterbuch zwischen den Läufen erhalten (beachten Sie ^, dass Sie die Option voranstellen müssen, damit die Option nicht durcheinander gebracht wird n).

Parakleta
quelle