Vim: aplica la configuración a los archivos del directorio

103

¿Cómo especifico la configuración de Vim para todos los archivos en el directorio actual?

La solución ideal sería que Vim buscara y leyera un .vimrc en el directorio actual antes de buscar ~ / .vimrc, y aplicara la configuración allí para todo el árbol.

He visto un complemento , pero esto significa que la configuración aplicada no es transparente, ya que requiere la instalación del complemento. Por el contrario, una línea de modelo es transparente, ya que independientemente del vimrc de un usuario o la invocación de vim específica, la configuración de la línea de modelo se aplicará a ese archivo.

Las cosas que probé son

  • colocando un .vimrc en el directorio de trabajo
  • :so vimrc en la línea de modelos.

Supongo que ambos no funcionan por razones de seguridad. No necesito todo el poder de un vimrc; sería suficiente estar vinculado a configuraciones aceptables por una línea de modelo. Mi objetivo es facilitar que los vimmers adopten estándares de codificación en un proyecto.

Wilhelmtell
fuente

Respuestas:

42

Soy un defensor de la forma de los complementos . Por varias razones:

  • Las modelinas son particularmente limitadas: no podemos establecer variables (que sintonicen otros complementos (ft), como "¿deberían las llaves del for-snippet estar en una nueva línea?"), O llamar a la función desde ellas (no me limito a los estándares de codificación, también configuro el archivo MAKE para usar dependiendo del directorio actual)
  • SECO : con modelines, se debe repetir una configuración en cada archivo, si hay demasiadas cosas que configurar o afinaciones que cambiar, rápidamente será difícil de mantener, además, requerirá el uso de un complemento de expansión de plantilla ( que debe considerar si tiene varios vimmers en su proyecto).
  • No todo el mundo usa vim para desarrollarse. No quiero que me molesten las configuraciones del editor de otras personas, ¿por qué debería parasitar las de ellos?
  • Es más fácil pedir a los vimmers que instalen un mismo complemento, en lugar de pedirles que copien, peguen y mantengan las mismas líneas en su .vimrc.
  • La configuración se puede guardar con los otros archivos del proyecto (cvs / svn / git / lo que sea)
  • Es realmente fácil tener un archivo de configuración por proyecto: con el complemento, tengo un archivo de configuración global para los estándares de codificación del proyecto en general y archivos de configuración específicos para cada subproyecto (qué makefile usar, qué ejecutable llamar , ...)

Por cierto, la solución de sth se puede utilizar para obtener un solo archivo de configuración. Esto es muy similar al enfoque del complemento, excepto que el .vimrc tiene que ser parasitado con opciones no globales y no admite archivos de configuración múltiples / compartidos fácilmente.

Luc Hermitte
fuente
Noté que debe guardar un nuevo archivo en la ruta antes de que se ejecute correctamente el complemento
cmcginty
En efecto. Esta familia de complementos solo define un marco. Aún tiene que escribir las definiciones específicas del proyecto en un archivo, que el marco obtendrá automáticamente.
Luc Hermitte
1
Tenga en cuenta que Luc vincula un complemento propio. Esto parece funcionar mucho mejor que el vinculado en la pregunta. Gracias.
datos
Bien. No puedo decirlo. Como he estado usando el mío durante años, nunca he examinado de cerca las otras implementaciones. De vez en cuando recibo un informe de error que eventualmente tengo en cuenta. Por cierto, mi versión está implementada para activarse antes de mu-template para establecer variables específicas del proyecto antes de expandir las plantillas (lo cual es bastante útil para buscar el directorio raíz del proyecto actual y recortarlo de los nombres de ruta expandidos)
Luc Hermitte
1
@JasonMcCarrell Mi implementación de local_vimrc y Markus "embear" Braun tiene soporte para lista negra, lista blanca ... Si solo necesita especificar cómo se hace la sangría, puede ser que el complemento EditorConfig-vim sea una mejor opción.
Luc Hermitte
91

Puedes poner algo como esto en $VIM/vimrc

autocmd BufNewFile,BufRead /path/to/files/* set nowrap tabstop=4 shiftwidth=4
algo
fuente
1
Esto es recursivo, pero solo con *. Si intenta reducirlo a / ruta / a / archivos / o / ruta / a / archivos, no funcionará.
SystemParadox
Esto es genial si su proyecto tiene un árbol de archivos escritos con "noexpandtab" y otro árbol con todos los archivos "expandtab" (por ejemplo, CodeIgniter). Puede establecer la acción adecuada para los archivos de cada árbol individualmente con un archivo de configuración.
user9645
2
Curiosamente, esto no funcionó cuando mi ruta incluía un enlace simbólico; Tuve que poner la ruta completa sin enlaces simbólicos antes de que funcionara.
Dolan Antenucci
Vea la respuesta de joseph07 sobre el uso de un "vim confiable" como alternativa, inversión de este enfoque (.vimrc distribuido frente a centralizado).
Nathan Schulte
50

Recomiendo encarecidamente no usar set exrc

Incluso con set secure, bajo * nix, vim seguirá ejecutando autocomandos, shell, et al, si es el propietario del archivo. Entonces, si sucedió que editó un archivo en ese tarball que le envié con un .vimrccontenido:

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

probablemente te divertirás menos que a mí.

Fen
fuente
6
Esto también es cierto con los complementos que se ejecutan automáticamente cuando se carga vim.
Luc Hermitte
31

Esta pregunta es antigua, pero parece una preocupación bastante natural y persistente.

Mi solución es bastante simple. Coloco un .vimrcarchivo en el directorio raíz de mis proyectos. La primera línea del .vimrcarchivo generalmente se origina ~/.vimrcy luego agrega la configuración particular que quiero. Alias I tvim='vim -u .vimrc', y el uso tvimen mis directorios de proyectos personales. "tvim" para "confiable vim", lo que significa que si lo ejecuto en un directorio con un .vimrcarchivo y algo sale mal, no tengo a nadie a quien culpar más que a mí mismo, ya que dije explícitamente que confiaba en él. Además, guardo un grupo de estos almacenados para que a veces pueda simplemente vincular el que quiero para un tipo de proyecto en particular.

joseph07
fuente
1
Este enfoque es sencillo y se adapta perfectamente a mis necesidades.
Jinxed
Cuando intento esto y source $HOME/.vimrcdesde mi local .vimrc, Vim se queja de que no puede encontrar mis complementos instalados en todo el sistema (patógeno en este caso; el execute pathogen#infect()comando encima de mi $HOME/.vimrcfalla Unknown function ...). ¿Cómo puedo arreglar esto?
Nathan Schulte
20

En realidad, se admite colocar un .vimrc en el directorio de trabajo, solo que está deshabilitado de forma predeterminada. Consulte :h 'exrc'y :h startuppara obtener más detalles, la configuración 'exrc'permitirá leer .vimrcdesde el directorio actual.

También se recomienda :set secureal usar esto. Esto bloquea :autocmd, shell y escribe comandos .vimrcen el directorio actual.

Otra cosa que podría valer la pena considerar es configurar una sesión ( :h session) con una vista y configuraciones estándar para el proyecto.

Dicho todo esto, probablemente optaría por la opción de complemento detallada por Luc Hermitte.

gravísimo
fuente
6
Por favor vea el comentario de phen. Esto puede tener graves consecuencias para la seguridad.
datos
11

Para minimizar los riesgos de seguridad con CUALQUIER característica de "ejecución automática" para CUALQUIER COSA en estos días, ¿puedo recomendarle que utilice las características existentes de vim en lugar de complementos (equipaje de portabilidad)?

P.ej.

El archivo vimrc de mi carpeta local se llama "_gvimrc" (a propósito). Esto reduce la esperanza de que personas como phen se diviertan a costa nuestra. :-)

En mi archivo $ VIM / .vimrc, inserté:

if filereadable("_gvimrc")
    source _gvimrc
endif

al final.

Utilizo "filereadable ()" sobre "fileexists ()" ya que el último tiene algunas peculiaridades cuando se tortura al abrir varios archivos (10+) simultáneamente, (no estoy seguro de por qué).

Por supuesto, puede dar su propio nombre de archivo único para ocultar aún más a los posibles alborotadores. Como "_mygvimrc", "_gobbledygook", etc. Solo necesita elegir un nombre estandarizado y obtenerlo en consecuencia en su $ VIM / .vimrc. Confiar en los componentes internos de vi / vim para esto descarta problemas de portabilidad. PERO, NO lo nombre .vimrc (o _vimrc) para evitar el origen recursivo en caso de que esté editando el archivo $ VIM / .vimrc con vim más tarde.

He estado usando esto desde Windoze 98SE, a través de Windork XP Pro, y ahora Windorkier 7 (más de 5 años ya). Marcaré una lista de archivos .txt en el Explorador y luego usaré "Editar con múltiples Vim", lo que resultará en la apertura de múltiples ventanas vim simultáneamente. Para mi trabajo, hago esto varias veces al día, todos los días. Todos los archivos se trataron con lo que configuré en mi _gvimrc local.

XEQtor
fuente
Aquí, la desconfianza por la portabilidad de los complementos no tiene fundamento, ya que estos complementos local_vimrc (al menos los míos) son portátiles (solían mantenerse en varios sistemas operativos diferentes, e incluso en Windows 95). El tema del riesgo de seguridad también es exagerado: si seguimos este camino, nunca instalaremos nada para facilitar nuestro trabajo.
Luc Hermitte
Pero, en lo que a mí respecta, el primer problema real es que, con su enfoque, tiene que trabajar desde el directorio exacto que contiene el archivo _gvimrc (que es un mal nombre ya que debe contener cosas específicas de gvim). Si su proyecto está compuesto por varios directorios, que pueden requerir una configuración común, y específicos (en caso de múltiples módulos), esto mostrará rápidamente sus limitaciones.
Luc Hermitte
El segundo problema es que solo puede trabajar en un proyecto a la vez: si quiero trabajar en OTB, openjpeg y un proyecto que integra ambas bibliotecas, esta solución no me permitirá tener una configuración específica para cada una de las tres proyectos.
Luc Hermitte
Esto también funciona para encadenar la carga de un archivo de sintaxis desde un directorio local.
maharvey67
2

Suponiendo que las personas no agregan archivos cada pocos días, probablemente pueda agregar una línea de modelo en la parte superior de cada archivo. De hecho, si su sistema de control de versiones lo permite, probablemente podría aplicar una regla que diga que cada archivo debe tener una línea de modelo cuando se registra.

Nathan Fellman
fuente
2

Utilice "editorconfig"

Si los tipos de estándares de codificación que le gustaría hacer cumplir están relacionados con el estilo de sangría, el tamaño de la pestaña, el formato de archivo y el juego de caracteres, entonces es posible que desee buscar en "editorconfig" , que es un estándar de editor cruzado para especificar este tipo de configuraciones en un proyecto específico y que todos los editores sigan esa configuración.

La especificación "editorconfig" permite que los proyectos soliciten diferentes configuraciones según las extensiones de archivo o los nombres dentro del proyecto. (Para que pueda tener Makefiles usando TAB, sus scripts de Python usando 4 espacios y sus scripts de shell usando 2 espacios para la sangría).

Necesita un complemento para usar "editorconfig" en Vim. El sitio web oficial proporciona uno, pero personalmente recomendaría sgur / vim-editorconfig , que está escrito en Vimscript puro, por lo que no necesita preocuparse demasiado por las dependencias externas.

Dado que "editorconfig" apunta a la compatibilidad entre editores, es bastante limitado en lo que hace, por lo que si desea un espacio en blanco consistente, formato de archivo (DOS vs.Unix) y codificación (Unicode utf-8, etc.), entonces "editorconfig " es para ti.

filbranden
fuente
0

Miré los complementos que existían y realmente no me gustó ninguno de ellos, así que escribí una función simple que se aplica a vim-fugitive . La ventaja de esto es que sabe que la raíz del proyecto es siempre la raíz del repositorio y, además, puedo aplicar un hash al archivo para mantener una tabla de confianza. Simplemente ponga lo siguiente en su .vimrcarchivo.

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 ^= !

Si la !opción está configurada en la viminfoconfiguración, el SAFE_VIMRCdiccionario se conservará entre ejecuciones (tenga en cuenta que ^debe anteponer la opción para que no estropee la nopción).

Parakleta
fuente