Vim: применить настройки к файлам в каталоге


103

Как мне указать настройки Vim для всех файлов в текущем каталоге?

Идеальным решением было бы, если бы Vim искал и читал .vimrc в текущем каталоге перед поиском ~ / .vimrc и применял настройки для всего дерева.

Я видел плагин , но это означает, что применяемые настройки не прозрачны, поскольку они требуют установки плагина. Напротив, модельная строка прозрачна, поскольку независимо от vimrc пользователя или конкретного вызова vim, настройки модельной строки будут применяться для этого файла.

Я пробовал

  • размещение .vimrc в рабочем каталоге
  • :so vimrc в моделине.

Полагаю, оба не работают по соображениям безопасности. Мне не нужна полная мощность vimrc; привязки к настройкам, приемлемым для модельной линии, было бы достаточно. Моя цель - облегчить vimmers принятие стандартов кодирования в проекте.


Ответы:


42

Я сторонник плагинов . По нескольким причинам:

  • Модели особенно ограничены: мы не можем устанавливать переменные (которые настраивают другие (ft) плагины, например, «должны ли фигурные скобки for-snippet быть на новой строке?») Или вызывать из них функцию (я не ограничиваю себя в соответствии со стандартами кодирования, я также установил make-файл для использования в зависимости от текущего каталога)
  • СУХОЙ : с моделями настройку необходимо повторять в каждом файле, если слишком много вещей, которые нужно установить или настройки, которые нужно изменить, это быстро станет трудным в обслуживании, более того, потребуется использование плагина расширения шаблона ( что следует учитывать, если в вашем проекте несколько виммеров).
  • Не все используют vim для разработки. Я не хочу, чтобы меня беспокоили настройки редактора других людей, зачем мне паразитировать на их?
  • Легче попросить vimmers установить один и тот же плагин, вместо того, чтобы просить их копировать и вставлять те же строки в их .vimrc и поддерживать их.
  • Настройки можно сохранить с другими файлами проекта (cvs / svn / git / something)
  • Очень легко иметь файл конфигурации для каждого проекта - с помощью плагина у меня есть глобальный файл конфигурации для стандартов кодирования всего проекта и конкретные файлы конфигурации для каждого подпроекта (какой файл makefile использовать, какой исполняемый файл вызывать , ...)

Кстати, решение sth можно использовать для создания одного файла конфигурации. Это очень похоже на подход к плагину, за исключением того, что .vimrc должен быть паразитирован неглобальными параметрами, и он не поддерживает легкую поддержку нескольких / общих файлов конфигурации.


Я заметил, что вы должны сохранить новый файл в пути, прежде чем он правильно запустит плагин
cmcginty

На самом деле. Это семейство плагинов просто определяет структуру. Вам все равно нужно записать определения для конкретного проекта в файл, который будет автоматически исходить от фреймворка.
Люк Эрмитт

1
Обратите внимание: Люк подключает собственный плагин. Кажется, это работает намного лучше, чем тот, который указан в вопросе. Спасибо.
данные

Хорошо. Я не могу сказать. Поскольку я использую свою в течение многих лет, я никогда внимательно не смотрел на другие реализации. Время от времени я получаю отчеты об ошибках, которые в конечном итоге принимаю во внимание. Кстати, моя версия реализована так, чтобы запускаться перед mu-шаблоном, чтобы установить переменные для конкретного проекта перед расширением шаблонов (что весьма полезно для извлечения текущего корневого каталога проекта и обрезки его из расширенных имен путей)
Люк Эрмитт,

1
@JasonMcCarrell Моя реализация local_vimrc и Markus "embear" у Брауна поддерживают черный список, белый список ... Если вам просто нужно указать, как выполняется отступ, возможно, плагин EditorConfig-vim будет лучшим выбором.
Люк Эрмитт,

91

Вы можете вставить что-то подобное в $VIM/vimrc

autocmd BufNewFile,BufRead /path/to/files/* set nowrap tabstop=4 shiftwidth=4

1
Это рекурсивно, но только с расширением *. Если вы попытаетесь уменьшить его до / path / to / files / или / path / to / files, это не сработает.
SystemParadox

Это замечательно, если в вашем проекте есть дерево файлов, написанное с помощью «noexpandtab», и другое дерево со всеми файлами «expandtab» (например, CodeIgniter). Вы можете установить правильное действие для файлов в каждом дереве индивидуально с помощью одного файла конфигурации.
user9645

2
Как ни странно, это не сработало, когда мой путь включал символическую ссылку; Мне пришлось указать полный путь без символических ссылок, чтобы он заработал.
Долан Антенуччи

См. Ответ joseph07 об использовании «доверенного vim» в качестве альтернативы, инверсии этого подхода (распределенный .vimrc против централизованного).
Натан Шульте

50

Я настоятельно рекомендую не использовать set exrc

Даже с set secure* nix vim все равно будет запускать автокоманды, оболочку и т. Д., Если файл принадлежит вам. Так что, если вы отредактировали файл в этом архиве, я отправил вам следующее .vimrc:

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

Вы, вероятно, будете менее удивлены, чем я.


6
Это также верно для плагинов, которые автоматически запускаются при загрузке vim.
Люк Эрмитт 01

31

Это старый вопрос, но он кажется довольно естественным и постоянным.

Мое решение довольно простое. Я помещаю .vimrcфайл в корневой каталог своих проектов. Первая строка .vimrcфайла обычно содержит исходный код ~/.vimrc, а затем добавляет нужную мне конфигурацию. Я использую псевдоним tvim='vim -u .vimrc'и использую tvimв своих личных каталогах проектов. «tvim» означает «доверенный vim», что означает, что если я запустил его в каталоге с .vimrcфайлом и что-то пойдет не так, мне некого винить, кроме себя, поскольку я прямо сказал, что доверяю ему. Кроме того, я храню группу из них подальше, чтобы иногда я мог просто софтлинковать тот, который мне нужен для определенного типа проекта.


1
Этот подход прост и полностью соответствует моим потребностям.
Jinxed

Когда я пробую это source $HOME/.vimrcс моего локального компьютера .vimrc, Vim жалуется, что не может найти мои общесистемные установленные плагины (в данном случае патоген; execute pathogen#infect()команда поверх моей $HOME/.vimrcне работает Unknown function ...). Как я могу это исправить?
Натан Шульте

20

Размещение .vimrc в рабочем каталоге на самом деле поддерживается, но по умолчанию отключено. См :h 'exrc'и :h startupдля деталей, установка 'exrc'позволит чтение .vimrcиз текущего каталога.

Также рекомендуется :set secureпри использовании этого. Это блокирует :autocmd, обрабатывает команды и записывает их .vimrcв текущий каталог.

Еще одна вещь, на которую, возможно, стоит обратить внимание, - это настройка session ( :h session) со стандартным представлением и настройками для проекта.

С учетом всего сказанного, я, вероятно, выбрал бы вариант плагина, подробно описанный самим Люком Эрмиттом.


6
См. Комментарий фен. Это может привести к серьезным последствиям для безопасности.
данные

11

Чтобы свести к минимуму риски безопасности с ЛЮБЫМИ функциями "автозапуска" для НИЧЕГО в наши дни, могу ли я посоветовать вам использовать существующие функции vim вместо плагинов (переносимость багажа)?

Например.

Файл vimrc моей локальной папки называется "_gvimrc" (специально). Это снижает вероятность того, что такие люди, как фен, будут развлекаться за наш счет. :-)

В свой файл $ VIM / .vimrc я вставил:

if filereadable("_gvimrc")
    source _gvimrc
endif

в конце.

Я использую «filereadable ()» вместо «fileexists ()», так как последний имеет некоторую причуду при попытке открыть несколько (10+) файлов одновременно (не знаю почему).

Конечно, вы можете указать свое собственное уникальное имя файла, чтобы еще больше запутать потенциальных нарушителей спокойствия. Например, "_mygvimrc", "_gobbledygook" и т. Д. Вам просто нужно выбрать одно стандартизированное имя и соответственно указать его в вашем $ VIM / .vimrc. Использование внутренних компонентов vi / vim исключает проблемы с переносимостью. НО, НЕ НАЗЫВАЙТЕ его .vimrc (или _vimrc), чтобы предотвратить рекурсивный поиск источников, если вы позже редактируете файл $ VIM / .vimrc с помощью vim.

Использую его с Windoze 98SE, через Windork XP Pro, а теперь и Windorkier 7 (уже 5+ лет). Я отмечу список файлов .txt в проводнике, а затем использую «Редактировать с несколькими Vim», что приведет к одновременному открытию нескольких окон vim. По работе я делаю это несколько раз в день, ежедневно. Все файлы обрабатывались тем, что я установил в моем локальном _gvimrc.


Здесь недоверие к переносимости плагинов не имеет оснований, поскольку эти плагины local_vimrc (по крайней мере, мой) переносимы (раньше они поддерживались в различных ОС и даже в Windows 95). Вопрос о риске безопасности также преувеличен: если мы пойдем по этому пути, мы никогда не будем устанавливать что-либо, чтобы облегчить нашу работу.
Люк Эрмитт 02

Но, насколько мне известно, первая реальная проблема заключается в том, что при вашем подходе вы должны работать с точным каталогом, содержащим файл _gvimrc (что является плохим именем, поскольку он предназначен для содержания специфических для gvim вещей). Если ваш проект состоит из нескольких каталогов, для которых может потребоваться общая конфигурация, и определенных (в случае нескольких модулей), это быстро покажет его ограничения.
Люк Эрмитт

Вторая проблема заключается в том, что вы можете работать только над одним проектом одновременно - если я хочу работать с OTB, openjpeg и проектом, который объединяет обе библиотеки, это решение не позволит мне иметь определенные настройки для каждой из три проекта.
Люк Эрмитт 02

Это также работает для последовательной загрузки файла синтаксиса из локального каталога.
maharvey67

2

Предполагая, что люди не добавляют файлы каждые несколько дней, вы, вероятно, можете добавить модельную строку вверху каждого файла. Фактически, если ваша система контроля версий позволяет это, вы, вероятно, могли бы применить правило, согласно которому каждый файл должен иметь модельную строку при его регистрации.



2

Используйте "editorconfig"

Если типы стандартов кодирования, которые вы хотели бы применить, связаны со стилем отступа, размером табуляции, форматом файла и кодировкой, то вы можете изучить «editorconfig» , который является стандартом для разных редакторов, чтобы указать такие настройки в конкретный проект, и пусть все редакторы следуют этой конфигурации.

Спецификация "editorconfig" позволяет проектам запрашивать различные настройки в зависимости от расширений файлов или имен в рамках проекта. (Таким образом, у вас могут быть файлы Makefile с использованием TAB, ваши сценарии Python с использованием 4 пробелов и сценарии оболочки с использованием 2 пробелов для отступов.)

Вам понадобится плагин для использования "editorconfig" в Vim. Официальный сайт предоставляет один, но лично я бы рекомендовал sgur / vim-editorconfig , который написан на чистом Vimscript, поэтому вам не нужно слишком беспокоиться о внешних зависимостях.

Поскольку "editorconfig" нацелен на совместимость с несколькими редакторами, он довольно ограничен в том, что он делает, поэтому, если вы хотите, чтобы были согласованные пробелы, формат файла (DOS против Unix) и кодировка (Unicode utf-8 и т. Д.), Тогда "editorconfig" " для вас.



0

Я посмотрел на существующие плагины, и мне не понравился ни один из них, поэтому я написал простую функцию, которая использует vim-fugitive . Преимущество этого заключается в том, что он знает, что корень проекта всегда является корнем репозитория, и, кроме того, я могу хэшировать файл, чтобы сохранить таблицу доверия. Просто поместите в свой .vimrcфайл следующее.

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

Если !параметр установлен в viminfoнастройке, то SAFE_VIMRCсловарь будет сохраняться между запусками (обратите внимание на ^добавление параметра, чтобы он не испортил nпараметр).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.