Як перемикатися між кількома конфігураціями vim за допомогою команди або локальних файлів vimrc?


85

Я працюю в декількох групах, кожна з яких має свої власні стандарти табуляції / відступу / інтервалу в C.

Чи є спосіб мати окремі вибираються конфігурації VIM для кожної так, коли я редагую файл, або:

  • Я роблю щось на зразок set group=1вибору конфігурації
  • локальний файл .vimrc, який знаходиться в робочому каталозі, використовується для автоматичного встановлення конфігурації


Див. Також питання Перемикання між двома різними конфігураціями vim на суперкористувачі.
Hotschke,

Відповіді:


40

Коротко

Є декілька способів зробити це, з яких пропонувались більшість, але я думав підсумувати їх двома додатковими:

  • Vimrc для кожного каталогу - має той недолік, що Vim потрібно запускати у правильному каталозі: якщо ваш проект є, ~/project1а у вас є ~/project1/.vim.customі є cd ~ ; vim project1/file.c, користувацькі налаштування не будуть знайдені.
  • Modelines - дуже ефективний, але має недолік необхідності додавати їх у всі файли (і пам’ятати про додавання їх до нових файлів)
  • Спеціальні автокоманди каталогу - це дуже ефективно
  • Шукайте певний заголовок у файлі (див. Нижче) - це той, який я найбільше використовував раніше, коли працював у різних компаніях або над чітко названими проектами
  • Vimrc для кожного каталогу, який перевіряється під час відкриття файлу (див. Нижче). Ще один досить простий у реалізації, особливо якщо ваш проектний код знаходиться в одному місці.

Сканування заголовка

У багатьох організаціях у верхній частині кожного вихідного файлу є стандартний заголовок (із повідомленням про авторські права та назвою проекту тощо). Якщо це так, ви можете змусити Vim автоматично сканувати перші (наприклад) 10 рядків файлу, шукаючи ключове слово. Якщо він знайде його, він може змінити ваші налаштування. Я змінив це, щоб зробити його простішим, ніж форма, яку я використовую (яка робить багато інших речей), але створіть ~/.vim/after/filetype.vim(якщо у вас її ще немає) і додайте щось подібне:

au FileType * call <SID>ConfigureFiletypes(expand("<amatch>"))

" List of file types to customise
let s:GROUPNAMETypes = ['c', 'cpp', 'vhdl', 'c.doxygen']

func! <SID>CheckForGROUPNAMECode()
    " Check if any of the first ten lines contain "GROUPNAME".

    " Read the first ten lines into a variable
    let header = getline(1)
    for i in range(2, 10)
        let header = header . getline(i)
    endfor

    if header =~ '\<GROUPNAME\>'
        " Change the status line to make it clear which
        " group we're using
        setlocal statusline=%<%f\ (GROUPNAME)\ %h%m%r%=%-14.(%l,%c%V%)\ %P
        " Do other customisation here
        setlocal et
        " etc
    endif
endfunc

func! <SID>ConfigureFiletypes(filetype)
    if index(s:GROUPNAMETypes, a:filetype) != -1
        call <SID>CheckForGROUPNAMECode()
    endif
endfunc

Щоразу, коли відкривається файл будь-якого типу та встановлюється тип файлу ( au FileType *рядок), ConfigureFiletypesвикликається функція. Це перевіряє, чи є тип файлу у списку типів файлів, пов’язаних із поточною групою (GROUPNAME), у цьому випадку 'c', 'cpp', 'vhdl' або 'c.doxygen'. Якщо це так, він викликає CheckForGROUPNAMECode (), який читає перші 10 рядків файлу, і якщо вони містять GROUPNAME, він виконує певну настройку. Окрім встановлення розширень або будь-чого іншого, це також змінює рядок стану, щоб чітко відображати назву групи, щоб ви знали, що це працює з першого погляду.

Перевірка конфігурації під час відкриття

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

au BufNewFile,BufRead *.c call CheckForCustomConfiguration()

function! CheckForCustomConfiguration()
    " Check for .vim.custom in the directory containing the newly opened file
    let custom_config_file = expand('%:p:h') . '/.vim.custom'
    if filereadable(custom_config_file)
        exe 'source' custom_config_file
    endif
endfunction

66

Я маю це в $HOME/.vimrc:

if filereadable(".vim.custom")
    so .vim.custom
endif

Це дозволяє мені розміщувати .vim.customфайл у кожному каталозі для завантаження команд та параметрів, характерних для цього каталогу. Якщо ви працюєте над кількома проектами, які мають глибокі структури каталогів, вам може знадобитися щось більш досконале (наприклад, пройдіться вгору по дереву каталогів, поки не .vim.customбуде знайдено a ), але однакова основна ідея буде працювати.

ОНОВЛЕННЯ:

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

let b:thisdir=expand("%:p:h")
let b:vim=b:thisdir."/.vim"
if (filereadable(b:vim))
    execute "source ".b:vim
endif

1
Це чудово, я ніколи цього не бачив!
Джим Мітченер,

1
Це відмінне рішення для проектів, які живуть у репозиторіях!
bradreaves

2
'exrc'Варіант вже дозволяє робити що - то дуже схоже на це. Вона буде завантажувати .vimrc/ .exrc/ .gvimrcв поточному робочому каталозі.
jamessan

Коментар про exrcмає бути правильною відповіддю. Все інше здається шаленим і складним.
silvenon

Використовувати exrcприємно, але я вдячний за отримання правильного файлу, навіть коли я не в тому ж робочому каталозі, що і файл, який я редагую.
JSB,

34

Ви також можете поставити автокоманди у свої, .vimrcякі встановлюють конкретні параметри для кожного шляху.

au BufRead,BufNewFile /path/to/project1/* setl sw=4 et
au BufRead,BufNewFile /path/to/project2/* setl sw=3 noet

Це чудово, коли ви не контролюєте сховище, тому ви не можете вставити туди файли ".vim.custom". Мені подобається, що він підтримує чистоту сховища. Дякую. Застереження: якщо шлях продовжує змінюватися нетипово, то версія ".vim.custom", можливо, приємніша, якщо можна змінити сховище.
lpapp

17

Плагін, який робить правильну справу: http://www.vim.org/scripts/script.php?script_id=441

“Цей плагін здійснює пошук локальних файлів vimrc у дереві файлової системи поточно відкритого файлу. За замовчуванням він здійснює пошук усіх файлів ".lvimrc" із каталогу файлу до кореневого каталогу та завантажує їх у зворотному порядку. Ім'я та кількість завантажених файлів можна налаштувати за допомогою глобальних змінних. "


3
І версія github також підтримує завантаження патогеном :-)
Граца,

Інший подібний плагін - localrc.vim; він також дозволяє налаштування типу файлів для кожного каталогу; Я вважаю це незамінним. vim.org/scripts/script.php?script_id=3393
Інго Каркат

12

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

/*
 * vim:ts=4:sw=4:expandtab:...
 */

int main(int argc, char **argv)
{
    ...

2
Я єдиний гм просвітлений DEV на більшості моїх команд, так що ніхто не повинен заперечувати. Це дуже акуратне рішення для кожного файлу.
bradreaves

1
Я вважаю за краще додавати їх внизу, щоб вони були ненав’язливими, але, мабуть, це питання стилю.
nyuszika7h

5

Я створив інструмент з відкритим кодом саме для цієї мети. Забудьте про заголовки, сканування, конфігурації та локальні файли vimrc.

Спробуйте поплавати.


Плавати

swimце швидкий інструмент для перемикання файлів vimrc та створення зручних псевдонімів. Ось короткий список використання. Перегляньте репозиторій Github, щоб переглянути покрокове керівництво та завантажити інструкції:


Використання

swim add ~/dotfiles/myVimrc favorite    #Add new swim alias
swim ls                                 #Show available swim aliases
swim add https://raw.githubusercontent.com/dawsonbotsford/swim/master/exampleVimrcs/vimrcWikia.vim example
swim with favorite         #Set alias favorite as primary .vimrc
swim with main             #Set alias main as primary .vimrc

Читати далі

https://github.com/dawsonbotsford/swim


4

Спробувавши плагін localvimrc, запропонований попереднім плакатом, мені дуже подобається мати контроль за налаштуваннями vim, який не відповідає кожному проекту.

Він вимагає підтвердження перед завантаженням файлу .lvimrc за замовчуванням, але є налаштування для автоматичного завантаження файлів .lvimrc. Деякі можуть сприймати це як діру в безпеці, але це працює так, як рекламується.

Я вирішив .gitignore .lvimrc файли. Крім того, ви можете перевірити їх як форму спільних налаштувань (розширення вкладки / простору, вкладки, інші налаштування для конкретного проекту).


1
Цей сценарій дивовижний: github.com/MarcWeber/vim-addon-local-vimrc . 1) Тепер він запитує лише один раз і позначає хеш файлу як ОК. 2) Він перетворює дерево каталогів з кореня в поточний каталог, отримуючи ближчі файли з вищим пріоритетом останньою.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Навіщо додавати .lvimrcфайл до .gitignore? Справа в тому, що кожен, хто використовує vim і має встановлений плагін, отримує однакові налаштування.
nyuszika7h

2
@ nyuszika7h деякі налаштування повинні бути застосовані, тоді як інші є суто особистими. Для налаштувань, які повинні бути застосовані до всіх, EditorConfig ще кращий, оскільки він є агностичним редактором: github.com/editorconfig/editorconfig-vim
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

1

Як вже згадувалося в sledge, використання цього плагіна - найкращий варіант, який я бачив і використовую. jerseyboy прокоментував, що утиліта рекомендує запитати підтвердження перед завантаженням (тобто після відкриття кожного файлу). Щоб уникнути цього, просто встановіть у головному .vimrcсписку локальні .lvimrcфайли:

let g:localvimrc_whitelist='/development/kernel/.lvimrc'


1

Ось варіація на jamessan's

function! ConditionalLoad()
    let cwd = getcwd()
    if getcwd() =~ $HOME . "/src/mobile"
        so $HOME/.vim.mobile
    endif
endfunction
autocmd VimEnter * call ConditionalLoad()

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


Саме те, що я шукав. В якості прикладу використання: Я помістив цей код ~/.vimrc, змінений /src/mobileв моєму каталог Symfony проектів (в моєму випадку це було /www/symfony) і модифіковано , .vim.mobileщоб .vim.symfonyпотім поміщають новий .vimrc конфігурація усередині ~/.vim.symfonyфайл
jmarceli

1

Я працюю в декількох групах, кожна з яких має свої власні стандарти табуляції / відступу / інтервалу в C.

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

Коли autotabналаштовано за допомогою запропонованого Vim, кожен раз, коли ви завантажуєте файл у Vim, autotabвикликається на нього, а вихідні налаштування Vim autotabпередаються :setкоманді.

autotabчитає кілька тисяч рядків з файлу, аналізує їх і визначає настройки для expandtab, tabstopі shiftwidthпараметрів.

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

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

Він також "агностичний" для типу файлу і добре працює з різними мовами. Я використовую його не тільки над C, але і сценаріями оболонки, Lisp, Makefiles, HTML і тим, що у вас є.

Зауважте, що він не обробляє інші параметри форматування, які можуть бути специфічними для проекту, наприклад, наприклад, у файлах C, незалежно від того, чи caseмітки в switchоператорі відступають чи ні, або ж обгорнуті списки аргументів функції просто відступають або вирівнюються до відкриваюча дужка списку аргументів. Vim має налаштування для такого роду речей, і тому програму можна правдоподібно розширити для аналізу стилю та виведення цих параметрів.


0

Шукаючи в основному ту ж проблему, я також знайшов плагін Sauce: http://www.vim.org/scripts/script.php?script_id=3992

Він стверджує:

Sauce - це легкий менеджер для декількох файлів vimrc, який можна використовувати для завантаження різних параметрів для різних середовищ. Коротше кажучи, ви можете підтримувати безліч різних файлів налаштувань vim і завантажувати потрібний (і) файл (и) лише тоді, коли вони вам потрібні.

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

Я все ще маю це протестувати.


0

Ви можете використовувати stow для перемикання конфігурації (будь-які крапки, не тільки .vimrc)

Встановити stow:

$ apt install stow

Створіть кілька каталогів для кожної конфігурації:

~$ ls -d ~/dotfiles/vim*
vim-all vim-webdev vim-go

Помістіть .vimrcу них різні:

$ find ~/dotfiles -name .vimrc
/home/username/vim-golang/.vimrc
/home/username/vim-webdev/.vimrc
/home/username/vim-all/.vimrc

Тепер ви можете миттєво налаштувати конфігурацію vim-golang за допомогою цієї команди (слід запускати всередині каталогу dotfiles):

~$ cd ~/dotfiles

dotfiles$ stow -v vim-golang
LINK: .vimrc => dotfiles/vim-golang/.vimrc

Тепер це пов’язано:

$ cd ~ && ls -l .vimrc 
.vimrc -> dotfiles/vim-golang/.vimrc

Якщо вам потрібно змінити конфігурацію, просто повторіть stow:

~$ cd dotfiles

dotfiles$ stow -v -D vim-golang
UNLINK: .vimrc

dotfiles$ stow -v vim-webdev
LINK: .vimrc => dotfiles/vim-webdev/.vimrc

$ cd ~ && ls -l .vimrc 
.vimrc -> dotfiles/vim-webdev/.vimrc

Детальніше про це читайте тут: Управління файлами точок за допомогою GNU stow

Плюси : досить просто, відсутність залежностей від плагінів vim, може використовуватися для управління всіма не лише файлами точок .vimrc.

Мінуси : конфігури не залежать один від одного, вам потрібно керувати / оновлювати кожен з них окремо (якщо ви не перемикаєте / оновлюєте конфігури занадто часто - це не буде проблема).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.