Клавиша Tab == 4 пробела и автоматический отступ после фигурных скобок в Vim

1266

Как заставить vi - Vim никогда не использовать вкладки (плохо переводить пробелы в табуляции!), Делать клавишу табуляции == 4 пробела и автоматически вставлять код после блоков фигурных скобок, как это делает Emacs ?

Кроме того, как мне сохранить эти настройки, чтобы мне больше никогда не приходилось их вводить?

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

mmcdole
источник
3
Связанный: Как заменить табуляцию пробелами? на Vim SE
kenorb

Ответы:

1883

Как было указано в нескольких ответах ниже, предпочтительным методом сейчас НЕ является использование smartindent, но вместо этого используйте следующее (в вашем .vimrc ):

filetype plugin indent on
" show existing tab with 4 spaces width
set tabstop=4
" when indenting with '>', use 4 spaces width
set shiftwidth=4
" On pressing tab, insert 4 spaces
set expandtab

В вашем .vimrc: file:

set smartindent
set tabstop=4
set shiftwidth=4
set expandtab

К файлам справки нужно немного времени, чтобы привыкнуть, но чем больше вы читаете, тем лучше становится Vim:

:help smartindent

Более того, вы можете встроить эти параметры в ваш источник для переносимости:

:help auto-setting

Чтобы увидеть ваши текущие настройки:

:set all

Как отмечает Graywh в комментариях, smartindent был заменен на cindent, который «работает более умно», хотя по-прежнему в основном для языков с C-подобным синтаксисом:

:help C-indenting

кругозор
источник
4
Если у вас есть комплект расширения, тогда он должен использовать пробелы. Вы также «устанавливаете совместимость»? У этого есть различные побочные эффекты, в том числе сбрасывание расширения в значение по умолчанию «выкл»
Кен,
60
Извините, но smartindent был заменен на cindent, который сам по себе подходит только для синтаксиса в стиле C. Включение любого из ваших vimrc может быть проблемой при работе с другими языками. Просто используйте вместо «filetype indent».
Graywh
2
Что ж, smartindent также предназначен только для синтаксиса в стиле C и по существу устарел.
серый
4
если я включу функцию расширения, есть ли способ ввести символ табуляции в тексте в любом случае?
Даниэле Сегато
3
@DanieleSegato <ctrl v> <tab> должен работать в режиме вставки: stackoverflow.com/questions/4781070/…
Кен
236

Связано, если вы открываете файл, который использует табуляции и пробелы, при условии, что у вас есть

set expandtab ts=4 sw=4 ai

Вы можете заменить все вкладки пробелами во всем файле с помощью

:%retab
netjeff
источник
10
К вашему сведению, если вы не хотите, чтобы ваша вкладка заменялась пробелами, удалите строку расширения.
Ино
6
Разве табуляция не является пробелом? ;-)
Роб Уэллс
11
@ Роб-Уэллс: я изменил «пробел» на «пробелы». Ты счастлив сейчас? ;-)
netjeff
Не могли бы вы объяснить, что означает эта первая строка?
Фонд Моника иск
2
expandtab определяет, будут ли вкладки расширены до пробелов. ts = tabstop = Количество пробелов, на которые рассчитывает <Tab> в файле. sw = shiftwidth = количество пробелов, используемых для каждого шага (авто) отступа. ai = autoindent = Копировать отступ из текущей строки при запуске новой строки.
mcmacerson
89

Лучший способ получить специфичный для типа файла отступ - это использовать filetype plugin indent onв вашем vimrc. Затем вы можете указать такие вещи, как, например, set sw=4 sts=4 etв .vim / ftplugin / c.vim, без необходимости делать их глобальными для всех редактируемых файлов, и другие синтаксисы не-C-типа также будут корректно сдаваться (даже шутки) .

graywh
источник
9
ИМХО, лучше, чем ответ, который был отмечен как правильный. отступ типа файла заменяет cindent и smartindent.
2010 года
62

Чтобы иметь в большинстве файлов вкладки по 4 пробела, настоящий символ табуляции шириной 8 в файлах Makefile и автоматическое отступление в различных файлах, включая C / C ++, поместите это в свой ~/.vimrcфайл:

" Only do this part when compiled with support for autocommands.
if has("autocmd")
    " Use filetype detection and file-based automatic indenting.
    filetype plugin indent on

    " Use actual tab chars in Makefiles.
    autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
endif

" For everything else, use a tab width of 4 space chars.
set tabstop=4       " The width of a TAB is set to 4.
                    " Still it is a \t. It is just that
                    " Vim will interpret it to be having
                    " a width of 4.
set shiftwidth=4    " Indents will have a width of 4.
set softtabstop=4   " Sets the number of columns for a TAB.
set expandtab       " Expand TABs to spaces.
Шервин Эмами
источник
Почему тебе не нужен else? Мне кажется, что последние строки перезаписывают специфичные для make-файла во всех случаях
lucidbrot
6
Привет @lucidbrot, оператор "autocmd FileType make" в основном говорит vim о некоторых настройках, которые следует использовать всякий раз, когда он открывает Makefile. Принимая во внимание, что линии ниже этого устанавливают значения по умолчанию. Другими словами, настройки «tabstop = 8 ...» применяются позже при открытии файла и перезаписывают настройки «tabstop = 4 ...», которые применяются при инициализации.
Шервин Эмами
56

Во многих системах Linux, таких как Ubuntu, .vimrcфайл не существует по умолчанию, поэтому рекомендуется сначала создать его.

Не используйте .viminfoфайл, который существует в домашнем каталоге. Он используется для другой цели.

Шаг 1: Зайдите в свой домашний каталог

cd ~

Шаг 2. Создайте файл

vim .vimrc

Шаг 3: Добавьте указанную выше конфигурацию

filetype plugin indent on
set tabstop=4
set shiftwidth=4
set expandtab

Шаг 3: Сохраните файл, нажав Shift+ ZZ.

Erick
источник
11
Не используйте Shift + ZZэто создаст .swp файл. использовать wq.
Шас
6
@shas: «ZZ» эквивалентно «: x» , что совпадает с «: wq», за исключением того, что оно сохраняет только если файл был изменен ... ( Ctrl-Zэто другая история ...)
Герт ван ден Берг
1
@shas Это просто неправда. Если вам не нужен файл подкачки для редактирования, вам нужно запустить vim -n <file>. Файл подкачки - это не то, что генерируется во время сохранения; это в значительной степени нарушило бы его назначение, поскольку файлы подкачки становятся полезными для восстановления внезапно прерванных сеансов редактирования.
Каз
32

Рекомендуемый способ - использовать отступы на основе типов файлов и использовать smartindent и cindent, только если этого недостаточно.

Добавьте следующее в ваш .vimrc

set expandtab
set shiftwidth=2
set softtabstop=2
filetype plugin indent on

Надеюсь, это поможет, потому что это другой ответ.

Чаудри Джунаид
источник
12

отредактируйте ваш ~ / .vimrc

$ vim ~/.vimrc

добавьте следующие строки:

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
Юсуф Ибрагим
источник
6

Авто-отступ основан на текущем режиме синтаксиса. Я знаю , что если вы редактируете Foo.java, а затем вступает в {и ударе Enterотступов следующей строки.

Что касается вкладок, есть две настройки. В Vim введите двоеточие, а затем «set tabstop = 4», в результате чего вкладки будут отображаться в виде четырех пробелов. Снова нажмите «двоеточие» и введите «set expandtab», чтобы вставить пробелы для вкладок.

Вы можете поместить эти настройки в .vimrc (или _vimrc в Windows) в вашем домашнем каталоге, так что вам нужно будет ввести их только один раз.

Джои Гибсон
источник
0

Во-первых, не используйте Tabключ в Vim для ручного отступа. Vim имеет пару команд в режиме вставки для ручного увеличения или уменьшения величины отступа. Эти команды Ctrl-Tи Ctrl-D. Эти команды соблюдать значения tabstop, shiftwidthи expandtab, и поддерживать правильную смесь пространств и вкладок (максимальное количество вкладок с последующим любым необходимым числом пробелов).

Во-вторых, эти ручные отступы в любом случае не нужно использовать очень часто, если вы используете автоматический отступ.

Если Ctrl-Tвместо того, чтобы Tabбеспокоить вас, вы можете переназначить его:

:imap <Tab> ^T

Вы также можете переназначить, Shift-Tabчтобы сделать Ctrl-Ddeindent:

:imap <S-Tab> ^D

Здесь ^ T и ^ D - буквенные управляющие символы, которые можно вставить как Ctrl-VCtrl-T.

Имея это отображение, вы все равно можете набрать литеральную Tab в буфер, используя Ctrl-VTab. Обратите внимание, что если вы сделаете это, даже если :set expandtabон включен, вы получите нерасширенный символ табуляции.

Эффект, аналогичный <Tab>карте, достигается при использовании :set smarttab, которое также заставляет backspace в передней части линии вести себя умно.

В smarttabрежиме, когда Tabиспользуется не в начале строки, это не имеет особого значения. Это отличается от моего выше отображения Tabк Ctrl-T, так как Ctrl-Tиспользуемый в любой точке линии (в режиме вставки) увеличит отступ этой линии.

Другие полезные сопоставления могут быть:

:map <Tab> >
:map <S-Tab> <

Теперь мы можем делать такие вещи, как выделение строк и нажимать, Tabчтобы отступать над ними. Или Tabдважды нажмите на строку (в командном режиме), чтобы увеличить отступ.

Если вы используете правильные команды управления отступы, то все контролируется тремя параметрами: shiftwidth, tabstopи expandtab.

shiftwidthПараметр контролирует размер отступа; если вы хотите четыре пробела, используйте :set shiftwidth=4или сокращение :set sw=4.

Если только это будет сделано, отступ будет создан с использованием комбинации пробелов и табуляций, потому что noexpandtabэто значение по умолчанию. Использование :set expandtab. Это приводит к тому, что символы табуляции, которые вы вводите в буфер, расширяются в пробелы, а для отступа, управляемого Vim, используются только пробелы.

Когда expandtabвключено, и если вы управляете своим отступом через все надлежащие механизмы Vim, значение tabstopстановится неактуальным. Он контролирует, как появляются вкладки, если они появляются в файле. Если у вас есть, set tabstop=8 expandtabа затем вставьте жесткую вкладку в файл с помощью Ctrl-VTab, он, как обычно, произведет выравнивание по следующей позиции табуляции на 8 столбцов.

Kaz
источник
Все ваши отображения должны использовать нерекурсивные варианты. Mapping go <C-t>может использовать этот синтаксис, а не литералы. Наконец, отображение <Tab>в обычном режиме также будет отображаться <C-i>(они одного и того же символа), поэтому я не рекомендую этого (вы теряете изящную функциональность vim
D. Ben Knoble
@ D.BenKnoble Я не рекомендую ничего из этого; Я использую Ctrl-T, Ctrl-D и <> сам. Это использует Vim как задумано. Людям, привыкшим использовать Tab в других редакторах, это может не понравиться, вот и все.
Каз