Vim: застосувати настройки до файлів у каталозі


103

Як вказати параметри Vim для всіх файлів у поточному каталозі?

Ідеальним рішенням було б, якби Vim шукав і читав .vimrc у поточному каталозі перед тим, як шукати ~ / .vimrc, і застосовувати там налаштування для всього дерева.

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

Я спробував

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

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


Відповіді:


42

Я прихильник плагін-способу . З кількох причин:

  • Моделі особливо обмежені: ми не можемо встановлювати змінні (що налаштовують інші (ft) плагіни, як-от "чи повинні дужки for-snippet бути на новому рядку?"), Або не викликати функцію з них (я не обмежую себе для стандартів кодування, я також встановив makefile для використання залежно від поточного каталогу)
  • СУХО : для моделей налаштування потрібно повторювати в кожному файлі, якщо є занадто багато речей, які потрібно встановити, або налаштування змінити, їх швидко буде важко підтримувати, більше того, це вимагатиме використання плагіна-розширювача шаблонів ( що вам слід врахувати, якщо у вашому проекті є кілька віммерів).
  • Не кожен використовує vim для розвитку. Я не хочу, щоб мене турбували інші налаштування редактора, чому я повинен паразитувати їх?
  • Простіше попросити віммерів встановити той самий плагін, а не просити їх копіювати та вставляти та підтримувати ті самі рядки у свій .vimrc
  • Параметри можна зберегти за допомогою інших файлів проекту (cvs / svn / git / що завгодно)
  • Файл конфігурації для кожного проекту дуже просто - за допомогою плагіна я маю глобальний файл конфігурації для стандартів кодування загального проекту та конкретні файли конфігурації для кожного підпроекту (який файл файлів використовувати, який виконується для виклику , ...)

BTW, рішення sth можна використовувати для джерела одного файлу конфігурації. Це дуже схоже на підхід плагіна, за винятком того, що .vimrc повинен бути паразитований неглобальними параметрами, і він не підтримує легко множинні / спільні конфігураційні файли.


Я помітив, що ви повинні зберегти новий файл на шляху, перш ніж він буде правильно виконати плагін
cmcginty

Справді. Це сімейство плагінів просто визначає рамки. Ви все ще повинні записати конкретні визначення проекту у файл - щоб рамки автоматично надходили.
Люк Ермітт

1
Зауважте, Люк посилає свій власний плагін. Здається, це працює набагато краще, ніж те, що пов'язано з питанням. Дякую.
дані

Ну. Я не можу сказати. Оскільки я використовую моє протягом багатьох років, я ніколи не пильно дивився на інші реалізації. Час від часу я отримую звіт про помилки, який я врешті-решт враховую. До речі, моя версія реалізована для запуску перед mu-шаблоном для встановлення змінних для проекту перед розширенням шаблонів (що досить корисно для отримання поточного кореневого каталогу проекту та обрізання його з розширених
імен

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

91

Ви можете помістити щось подібне $VIM/vimrc

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

1
Це рекурсивно, але тільки з *. Якщо ви спробуєте зменшити його до / шлях / до / файлів / або / шлях / до / файлів, він не працюватиме.
SystemParadox

Це чудово, якщо у вашому проекті є дерево файлів, написане на "noexpandtab" та інше дерево з усіма файлами "extensiontab" (наприклад, CodeIgniter). Ви можете встановити належну дію для файлів у кожному дереві окремо за допомогою одного конфігураційного файла.
user9645

2
Як не дивно, це не спрацювало, коли мій шлях включав символьне посилання; Мені довелося прокласти повний шлях без жодних посилань, перш ніж це спрацює.
Dolan Antenucci

Дивіться відповідь joseph07 про використання "довіреної vim" як альтернативи, інверсії цього підходу (розподілений .vimrc vs централізований).
Натан Шульте

50

Настійно рекомендую не використовувати set exrc

Навіть при set secure, під * nix, vim все одно запустить автокоманди, оболонку тощо, якщо у вас є файл. Отже, якщо ви погодилися відредагувати файл у цій тарілці, я надіслав вам .vimrcвміст:

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

ви, мабуть, будете менш розвеселені, ніж я.


6
Це також стосується плагінів, які автоматично виконуються під час завантаження vim.
Люк Ермітт

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в поточний каталог.

Інша річ, на яку варто звернути увагу - це налаштування сеансу ( :h session) зі стандартним переглядом та налаштуваннями для проекту.

Все, що було сказано, я, мабуть, пішов би з варіантом плагіну, детально описаним самим Люком Ерміттом.


6
Будь ласка, дивіться коментар у фен. Це може призвести до серйозних наслідків для безпеки.
дані

11

Щоб мінімізувати ризики безпеки за допомогою будь-яких "автозапуску" функцій для будь-якого дня, чи можу я порадити вам використовувати наявні функції vim замість плагінів (портативний багаж)?

Напр.

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

У свій $ VIM / .vimrc файл я вставив:

if filereadable("_gvimrc")
    source _gvimrc
endif

в кінці.

Я використовую "filereadable ()" over "fileexists ()", оскільки пізніше є деяка химерність, коли його катують із відкриттям декількох (10+) файлів одночасно (не знаю, чому).

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

Використовували це з Windoze 98SE, через Windork XP Pro, а зараз Windorkier 7 (вже 5 років). Я відзначу перелік файлів .txt у Провіднику, а потім використаю "Редагувати з декількома Vim", в результаті чого одночасно відкриватимуться декілька вікон. Для своєї роботи я роблю це кілька разів на день, щодня. Усі файли обробляються тим, що я встановив у своєму локальному _gvimrc.


Тут недовіра до переносу плагінів не має жодної підстави, оскільки ці плагіни local_vimrc (принаймні мої) є портативними (раніше вони підтримувались в різних ОС, а то й у Windows 95). Питання щодо ризику для безпеки також перебільшене: якщо ми будемо слідувати цим шляхом, ми ніколи нічого не встановимо, щоб полегшити нашу роботу.
Люк Ермітт

Але, що стосується мене, перше справжнє питання полягає в тому, що з вашим підходом ви повинні працювати з точного каталогу, який містить файл _gvimrc (це неправильне ім'я, оскільки воно повинно містити конкретні речі gvim). Якщо ваш проект складається з декількох каталогів, для яких може знадобитися загальна конфігурація, та конкретних (у випадку декількох модулів), це швидко покаже свої обмеження.
Люк Ермітт

Друге питання полягає в тому, що ви можете працювати лише над одним проектом одночасно - якщо я хочу працювати над OTB, openjpeg та проектом, який інтегрує обидві бібліотеки, це рішення не дозволить мені мати конкретне налаштування для кожної з три проекти.
Люк Ермітт

Це також працює для того, щоб ланцюжок Дейзі завантажував файл синтаксису з локального каталогу.
maharvey67

2

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



2

Використовуйте "editorconfig"

Якщо типи стандартів кодування, які ви хотіли б застосувати, пов'язані зі стилем відступу, розміром вкладки, форматом файлу та діаграмою, то, можливо, ви захочете переглянути "editorconfig" , що є стандартом крос-редактора, щоб вказати такі параметри в конкретний проект, і всі редактори дотримуються цієї конфігурації.

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

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

Оскільки "editorconfig" спрямований на сумісність між редакторами, він досить обмежений у тому, що він робить, тому, якщо вам потрібно, це послідовний пробіл, формат файлу (DOS проти Unix) та кодування (Unicode utf-8 тощо), то "editorconfig "для вас.



0

Я переглянув плагіни, які існували, і не любив жодного з них, тому я написав просту функцію, що скарбничка повертається на vim-ugitive . Перевага цього в тому, що він знає, що корінь проекту - це завжди корінь сховища, і крім того, я можу хеш-файл, щоб зберегти таблицю довіри. Просто покладіть у свій .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.