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

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

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

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

Вещи, которые я пробовал,

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

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

Ответ 1

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

  • Моделирование особенно ограничено: мы не можем устанавливать переменные (которые настраивают другие плагины (ft), например "если фигурные скобки для фрагмента находятся в новой строке?" ) или функция вызова из них (я не знаю, t ограничивать себя стандартами кодирования, я также устанавливаю makefile для использования в зависимости от текущего каталога)
  • DRY: с помощью modelines параметр нужно повторять в каждом файле, если слишком много вещей для настройки или настроек для изменения, это быстро станет трудно поддерживать, более того, для этого потребуется использовать шаблон-расширитель плагина (который вы должны рассмотреть, если у вас есть несколько vimmers в вашем проекте).
  • Не каждый использует vim для разработки. Я не хочу, чтобы меня беспокоили настройки редактора других людей, почему я должен их паразитировать?
  • Легче попросить vimmers установить один и тот же плагин, вместо того, чтобы просить их скопировать-вставить и сохранить те же строки в их .vimrc
  • Настройки можно сохранить с другими файлами проекта (cvs/svn/ git/whatever)
  • Очень просто иметь конфигурационный файл для каждого проекта - с плагином, у меня есть глобальный файл конфигурации для стандартов кодирования всего проекта и конкретные файлы конфигурации для каждого подпроекта (какой makefile использовать, который исполняемый для вызова,...)

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

Ответ 2

Вы можете поместить что-то вроде этого в $VIM/vimrc

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

Ответ 3

Я бы предпочел не использовать set exrc

Даже с set secure, под * nix, vim все равно будет запускать автокоманды, shell и т.д., если вы являетесь владельцем файла. Итак, если вы решили отредактировать файл в этом tarball, я отправил вам .vimrc, содержащий:

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

вы, вероятно, будете менее забавны, чем я.

Ответ 4

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Eg.

Моя локальная папка 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 файлов в Проводнике, а затем "Edit with multiple Vim", что приведет к одновременному открытию нескольких окон vim. Для моей работы я делаю это несколько раз в день, ежедневно. Все файлы обработаны тем, что я установил в своем локальном _gvimrc.

Ответ 7

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

Ответ 8

Я согласен с подходом плагина по соображениям безопасности.

Есть очень хороший плагин, который еще не упоминался. Он позволяет использовать .lvimrc в ваших каталогах проектов.

Попробуйте "localvimrc" out:

http://www.vim.org/scripts/script.php?script_id=441

https://github.com/embear/vim-localvimrc

Ответ 9

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

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

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

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

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

Ответ 11

Я посмотрел на плагины, которые существовали и на самом деле не представляли никого из них, поэтому я написал простую функцию, которая копирует на 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 опция).