Зміна поведінки відступу Vim за типом файлу


379

Чи міг би хтось простим чином пояснити мені найпростіший спосіб змінити поведінку відступу Vim на основі типу файлу? Наприклад, якщо я відкриваю файл Python, він повинен мати відступ з двома пробілами, але якщо я відкрию скрипт Powershell, він повинен використовувати 4 пробіли.


9
BTW - Конвенція PEP8 для Python говорить, що на табло слід 4 пробіли, а на вкладках - 4 пробіли. посилання: stackoverflow.com/questions/120926 / ...
cgseller

Відповіді:


304

Ви можете додавати .vimфайли для виконання, коли vim переходить на певний тип файлу.

Наприклад, у мене є файл ~/.vim/after/ftplugin/html.vim із таким вмістом:

setlocal shiftwidth=2
setlocal tabstop=2

Що змушує vim використовувати вкладки шириною 2 символи для відступу ( noexpandtabпараметр встановлений в усьому світі в моїй конфігурації).

Це описано тут: http://vimdoc.sourceforge.net/htmldoc/usr_05.html#05.4 , прокрутіть униз до розділу про плагіни файлів.


229
Ви повинні ~/.vim/after/ftplugin/html.vimзамість цього поставити . Але, як інші вказували нижче, набагато приємніше просто додати autocmd FileType html setlocal shiftwidth=2 tabstop=2до свого .vimrc.
Арістотель Пагальціс

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

3
Насправді, не так багато причин використовувати каталог after для ftplugins. Vim завантажить усі вони, які він знайде у вашій Runtimepath, а не лише перший, як для файлів синтаксису.
сірий

36
FYI: не використовуйте js для файлів javascript. Замість цього використовуйте javascript. ( autocmd FileType javascript setlocal shiftwidth=2 tabstop=2)
Kiddo

13
Вам також потрібно додати filetype plugin onсвій vimrc.
gatoatigrado

191

Використовуйте ftplugins або автокоманди, щоб встановити параметри.

ftplugin

В ~/.vim/ftplugin/python.vim:

setlocal shiftwidth=2 softtabstop=2 expandtab

І не забудьте ввімкнути їх ~/.vimrc:

filetype plugin indent on

( :h ftpluginдля отримання додаткової інформації)

автокоманда

В ~/.vimrc:

autocmd FileType python setlocal shiftwidth=2 softtabstop=2 expandtab

Ви можете замінити будь-якого з довгих команд або налаштувань з їх короткими версіями:
autocmd: au
setlocal: setl
shiftwidth: sw
tabstop: ts
softtabstop: sts
expandtab:et

Я б також запропонував вивчити різницю між tabstopта softtabstop. Дуже багато людей не знають про це softtabstop.


1
Дякую! Також дякую за цей трішки про "ts" та "sts". Чи є якісь конкретні сторінки, які ви б рекомендували обговорити цю різницю та як ними користуватися?
jvriesem

11
@jvriesem У цьому не так багато: 'ts' - це відображення символів на вкладках; 'sts' - скільки "пробілів", які потрібно вставити при натисканні клавіші табуляції; 'sw' - скільки "пробілів" використовувати на рівні відступу; 'et' - чи використовувати пробіли чи вкладки; 'sta' дозволяє вставити 'sw' "пробіли" при натисканні на вкладку на початку рядка.
graywh

10
Цікаво, чи було б краще використати повні форми для наочності, а не кривошеречення в кінці.
крижана вода

23
swкороткий для softwidth, stsкороткий для softtabstop, etкороткий для expandtab, setlкороткий setlocalі auкороткий для autocmd. Замість коротких можна використовувати довгі форми.
Flimm

13
Я вважаю, що swрозширюється до shiftwidth, ніж softwidth.
johncip

83

відредагуйте свої ~/.vimrcфайли та додайте різні типи файлів для різних відступів, наприклад, я хочу html/rbвідступ для 2 пробілів та js/coffeeфайли відступ для 4 пробілів:

" by default, the indent is 2 spaces. 
set shiftwidth=2
set softtabstop=2
set tabstop=2

" for html/rb files, 2 spaces
autocmd Filetype html setlocal ts=2 sw=2 expandtab
autocmd Filetype ruby setlocal ts=2 sw=2 expandtab

" for js/coffee/jade files, 4 spaces
autocmd Filetype javascript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype coffeescript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype jade setlocal ts=4 sw=4 sts=0 expandtab

див.: Налаштування параметрів пробілів Vim у форматі файлів


Коментар для vimrc є одиноким ":)
sdkks

@sdkks Я так не думаю. подвійна цитата - це коментар, одна цитата 'дає помилку на всіх моїх Linux. (7.3+, 8.0 ...)
Siwei Shen 申思维

Так. У моєму коментарі йдеться про використання одного ", тобто не закривайте його іншим ". Не впевнений, чому я це прокоментував.
sdkks

ок, я неправильно тебе зрозумів. Я хоч одна цитата означає, 'але не залишився "без правої " @. @
Siwei Shen 申思维

60

Покладіть команди autocmd на основі суфіксу файлу у вашому ~ / .vimrc

autocmd BufRead,BufNewFile   *.c,*.h,*.java set noic cin noexpandtab
autocmd BufRead,BufNewFile   *.pl syntax on

Команди, які ви шукаєте, ймовірно, ts = і sw =


18
У чому перевага цього FileType?
Кейсі Чоу

3
Чи є спосіб перевернути матч?
SystemParadox

7
У мене виникли проблеми з отриманням файлів для роботи з HTML-файлами (оскільки файл .html насправді не HTML, а HTML-шаблон шаблону з мовою шаблонів). Схоже, що типи файлів не розпізнають його як html, але цей метод буде.
Марк Хільдрет

3
@digitxp - перевага полягає в тому, що використовуване розширення не відповідає визначеному "Тип файлу". Наприклад, у моїй установці * .md означає тип файлу Modula2, тоді як я використовую його для розмітки. Я міг (а) змінити параметри FileType за замовчуванням (b) змінити налаштування файлових типів за допомогою власної конфігурації або (c) швидко отримати те, що я хочу, використовуючи це налаштування у своєму файлі 1 .vimrc, з яким я пішов (c).
pdwalker

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

23

Я зазвичай працюю з expandtabнабором, але це погано для makefiles. Нещодавно я додав:

:autocmd FileType make set noexpandtab

до кінця мого .vimrc-файлу, і він розпізнає Makefile, makefile та * .mk як makefiles та не розширює вкладки. Імовірно, ви можете продовжити це.


Кращим варіантом є ввімкнення плагінів файлів. Типовий для Vim включає: setl noet, тому вам навіть не потрібен цей aucmd у вашому vimrc.
сірий

ДОБРЕ. Чи можете ви пояснити переваги цього і що пов'язано з цим? Чому плагіни файлів краще, ніж autocmd? Коли слід використовувати autocmd? Не використовується?
Джонатан Леффлер

5
Плагіни файлів, що постачаються разом з Vim, допоможуть зробити такі корисні речі, як "setlocal noexpandtab" для makefiles, наприклад. Автокоманди та ftplugins для особистих речей, таких як "shiftwidth", не мають значення - це саме те, як ви вирішите структурувати конфігурацію vim.
Graywh

17

Особисто я використовую ці налаштування у .vimrc:

autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab

22
Багато мов давно встановили конвенції, як і деякі компанії. Візьмемо NodeJS як приклад попереднього. На вкладках має бути два пробіли. Головний біль, причому досить нерозумно, але важливо.
Пол Хазен

3
Чому вкладки повинні бути однаковими для всіх обставин? Для файлу конфігурації 8 проміжних вкладок працюють добре, але для коду з великою кількістю відступів 2 набагато простіше в управлінні. А потім є фіксовані умовні умови: node.js повинен мати 2 пробіли, а python насправді синтаксично недійсний з будь-яким іншим, ніж 4 пробіли.
felixphew

1
@felixphew Python ідеально підходить для будь-якої кількості пробілів (або навіть вкладок), якщо він залишається однаковим весь шлях.
Джеймс

@DJMcMayhem Ви маєте рацію - я повинен був сказати "настійно рекомендую".
феліксфев

1
+1 до Нелло. Персонаж вкладки має давно встановлену традицію означати перехід до наступної позиції у кратному розмірі 8 знаків. Це лише тому, що люди хотіли використовувати вкладку для "наступного відступу, який добре виглядає на моїй мові", і тому, що деякі текстові редактори не турбувались про те, щоб змінити "додавання символу вкладки" та "додавання пробілів для відступу" та людей налаштували їх редактора, щоб він мав свій шлях, і тепер у нас є цей безлад, де вкладки ніколи не відображають намічений спосіб. Вихідним кодом є текст, а стандартом для тексту є 8-символьні вкладки.
Флоріан F

6

Це може знати більшість із нас, але все одно (я був спантеличений вперше): " Додавання :set et( :setрозширення) не змінює вкладки, які вже існують у файлі, це потрібно зробити" :retab. Наприклад:

:set et
:retab

і вкладки у файлі замінюються достатньою кількістю пробілів. Щоб повернути вкладки, просто виконайте такі дії:

:set noet
:retab

4

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

Нижче наведено простий editorconfig, як ви бачите, у файлах python буде 4 пробіли для відступу, а файлів шаблонів мопсів буде лише 2.

# 4 space indentation for python files
[*.py]
indent_style = space
indent_size = 4

# 2 space indentation for pug templates
[*.pug]
indent_size = 2

3

Хоча ви можете просто налаштувати відступ Vim за допомогою плагіна відступу або вручну, використовуючи налаштування, я рекомендую використовувати сценарій python під назвою Vindect, який автоматично встановлює відповідні налаштування для вас, коли ви відкриваєте файл python. Скористайтеся цією порадою, щоб зробити використання Vindect ще більш ефективним. Коли я вперше почав редагувати файли python, створені іншими, з різними стилями відступу (вкладка проти простору та кількість пробілів), це було надзвичайно засмучує. Але Vindect разом із цим файлом відступу

Також рекомендую:


2

Для тих, хто використовує autocmd, найкраща практика групувати їх разом. Якщо групування пов'язане з виявленням типу файлів, у вас може виникнути щось подібне:

augroup filetype_c
    autocmd!
    :autocmd FileType c setlocal tabstop=2 shiftwidth=2 softtabstop=2 expandtab
    :autocmd FileType c nnoremap <buffer> <localleader>c I/*<space><esc><s-a><space>*/<esc>
augroup end

Групування допомагає зберігати .vimrcорганізований, особливо коли у файлетипу є кілька правил, пов’язаних із ним. У наведеному вище прикладі визначено ярлик коментаря, характерний для файлів .c.

Початковий виклик autocmd!вказує vim видалити будь-які раніше визначені автокоманди у зазначеній групі. Це запобіжить повторюваному визначенню, якщо .vimrcйого знову знайдуть . Для :help augroupотримання додаткової інформації див.


1

Я використовую утиліту , яку я написав в C називається autotab. Він аналізує перші кілька тисяч рядків файлу, який ви завантажуєте, та визначає значення параметрів Vim shiftwidth, tabstopта expandtab.

Це компілюється з використанням, наприклад, gcc -O autotab.c -o autotab. Інструкції щодо інтеграції з Vim знаходяться в заголовку коментаря вгорі.

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

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

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

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