Изменение поведения отступов Vim в зависимости от типа файла

379

Может ли кто-нибудь объяснить мне простыми словами самый простой способ изменить поведение Vim для отступов в зависимости от типа файла? Например, если я открываю файл Python, он должен иметь отступ от 2 пробелов, но если я открываю скрипт Powershell, он должен использовать 4 пробела.

EBGreen
источник
9
Кстати, соглашение 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 , прокрутите вниз до раздела о плагинах типов файлов.

SpoonMeiser
источник
229
Вы должны вставить это ~/.vim/after/ftplugin/html.vimвместо. Но, как другие отметили ниже, гораздо приятнее просто добавить autocmd FileType html setlocal shiftwidth=2 tabstop=2к вашему .vimrc.
Аристотель Пагальцис
10
К сожалению, на самом деле, это / это / где у меня есть этот файл. Я исправлю ответ. Я не согласен, хотя, я думаю, что разделение команд для различных типов файлов на отдельные файлы делает все намного проще, особенно если у вас есть требования для многих типов файлов или много опций для некоторых типов файлов.
SpoonMeiser
3
На самом деле, нет особых причин использовать каталог after для ftplugins. Vim загрузит все они, которые он найдет в вашем пути выполнения, а не только первый, как для файлов синтаксиса.
Graywh
36
К вашему сведению: не используйте js для типа файла JavaScript. Используйте вместо этого JavaScript. ( autocmd FileType javascript setlocal shiftwidth=2 tabstop=2)
Киддо
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.

graywh
источник
1
Спасибо! Также спасибо за этот бит о «ts» и «sts». Есть ли какие-то конкретные страницы, которые вы бы порекомендовали обсудить с этим различием и как его использовать?
jvriesem
11
@jvriesem Ничего особенного: «ts» - это то, как отображаются символы табуляции; 'sts' - сколько «пробелов» вставлять при нажатии клавиши табуляции; 'sw' - сколько «пробелов» использовать для каждого уровня отступа; 'et' - использовать ли пробелы или символы табуляции; «sta» позволяет вставлять «sw» «пробелы» при нажатии клавиши tab в начале строки.
Graywh
10
Интересно, лучше ли было бы использовать полные формы для ясности, а не короткое предложение в конце.
Ледяной воды
23
swявляется коротким softwidth, stsкоротким softtabstop, etкоротким expandtab, setlкоротким setlocalи auкоротким autocmd. Вы можете использовать длинные формы вместо коротких.
Флим
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-vim (7.3+, 8.0 ...)
Сивей Шен 申思维
Да. Мой комментарий говорит, что используйте один ", то есть не закрывайте его с другим ". Не уверен, почему я это прокомментировал, хотя.
sdkks
хорошо, я не понял тебя. Я, хотя одна цитата означает, 'но не оставил "без права " @. @
Сивей Шен 申思维
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, но этот метод будет.
Марк Хилдрет
3
@digitxp - преимущество в том, что используемое расширение не соответствует определенному «FileType». Например, в моей установке * .md означает тип файла Modula2, тогда как я использую его для уценки. Я мог бы (a) изменить настройки FileType по умолчанию (b) изменить настройки типа файла с помощью пользовательской конфигурации или (c) быстро получить то, что я хочу, используя этот параметр в моем 1 .vimrc файле, с которым я пошел (c).
pdwalker
Стоит отметить, что - при условии, что я быстро прочитал документы правильно - вы можете добавить несколько команд для каждого типа файлов таким образом, и они гарантированно будут выполняться в указанном порядке.
underscore_d
23

Я обычно работаю с expandtabсетом, но это плохо для make-файлов. Я недавно добавил:

:autocmd FileType make set noexpandtab

до конца моего файла .vimrc, и он распознает Makefile, makefile и * .mk как make-файлы и не расширяет вкладки. Предположительно, вы можете продлить это.

Джонатан Леффлер
источник
Лучше всего включить: плагины файловых типов. По умолчанию Vim включает в себя: setl noet, так что вам даже не нужен этот aucmd в вашем vimrc.
Graywh
ХОРОШО. Можете ли вы объяснить преимущества этого и что для этого нужно? Почему плагины файловых типов лучше, чем autocmd? Когда следует использовать autocmd? Не используется?
Джонатан Леффлер
5
Плагины файловых типов, поставляемые с Vim, будут делать полезные вещи, например, setlocal noexpandtab для make-файлов. Автокоманды против ftplugins для личных вещей, таких как shiftwidth, не имеют значения - это просто то, как вы выбираете структуру своей конфигурации vim.
серый
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 намного проще в управлении. Кроме того, существуют фиксированные соглашения: узел.js должен иметь 2 пробела, а python фактически синтаксически недопустим с чем-либо, кроме 4 пробелов.
Феликсфью
1
@felixphew Python идеально подходит для любого количества пробелов (или даже табуляций), если он остается неизменным на протяжении всего пути.
Джеймс
@DJMcMayhem Вы правы - я должен был сказать "настоятельно рекомендует".
Феликсфью
1
+1 к Нелло. Персонаж с табуляцией имеет давнюю традицию - переходить на следующую позицию с кратностью 8 символов. Это только потому, что люди хотели использовать вкладку для «следующего отступа, который выглядит хорошо на моем языке» и потому что некоторые текстовые редакторы не удосужились сделать различие между «добавлением символа табуляции» и «добавлением пробелов для отступа», и людьми доработал их редактор, чтобы он был по-своему, теперь у нас есть этот беспорядок, где вкладки никогда не отображают намеченный путь. Исходный код - это текст, а стандарт для текста - 8-символьные вкладки.
Florian F
6

Это может быть известно большинству из нас, но в любом случае (я был озадачен в первый раз): Выполнение :set et( :setexpandtabs) не меняет вкладки, уже существующие в файле, это нужно сделать :retab. Например:

:set et
:retab

и вкладки в файле заменяются достаточным количеством пробелов. Чтобы получить вкладки назад просто сделайте:

:set noet
:retab
Хуан Ланус
источник
4

Сегодня вы можете попробовать editorconfig , для этого есть плагин vim . Благодаря этому вы можете не только изменять размер отступа в vim, но и во многих других редакторах сохранять согласованные стили кодирования.

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

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

# 2 space indentation for pug templates
[*.pug]
indent_size = 2
chengbo
источник
3

Несмотря на то, что вы можете точно настроить отступы Vim, используя плагин Indent или вручную, используя настройки, я рекомендую использовать сценарий Python под названием Vindect, который автоматически устанавливает соответствующие параметры при открытии файла Python. Используйте этот совет, чтобы сделать использование Vindect еще более эффективным. Когда я впервые начал редактировать файлы Python, созданные другими людьми с различными стилями отступов (табуляция против пробела и количество пробелов), это было невероятно сложно. Но Vindect вместе с этим файлом отступа

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

haridsv
источник
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 сообщает vim об удалении любых ранее определенных автокоманд в указанной группировке. Это предотвратит повторное определение, если .vimrcоно получено снова. Смотрите :help augroupдля получения дополнительной информации.

67Гц
источник
1

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

Это компилируется с использованием, например, gcc -O autotab.c -o autotab. Инструкции по интеграции с Vim находятся в заголовке комментария вверху.

Autotab довольно умен, но время от времени может запутаться, в частности, из-за того, что он некорректно поддерживается с использованием разных стилей отступов.

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

Он работает для различных языков программирования и прощает «внешние» элементы, которые не подчиняются приращениям, такие как директивы предварительной обработки C, метки операторов C, не говоря уже об очевидных пустых строках.

Kaz
источник