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


1265

Як зробити так, щоб vi - Vim ніколи не використовує вкладки (неправильно перетворює пробіли на вкладки!), Робить клавішу вкладки == 4 пробіли і автоматично вводить код відступу після фігурних блоків дужок, як Emacs ?

Крім того, як зберегти ці налаштування, щоб мені більше не довелося вводити їх знову?

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


Відповіді:


1882

Як було зазначено в декількох відповідях нижче, тепер кращим методом є НЕ використовувати 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: файл:

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

Файли довідки займають трохи часу, щоб звикнути, але чим більше ви читаєте, тим краще Vim отримує:

:help smartindent

Ще краще, ви можете вбудувати ці налаштування у своє джерело для переносимості:

:help auto-setting

Щоб побачити ваші поточні налаштування:

:set all

Як зазначає сірий у коментарях, smartindent був замінений на cindent, який "Розумніше працює", хоча все ще переважно для мов із синтаксисом, подібним С:

:help C-indenting


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

60
Вибачте, але smartindent був замінений на cindent, який сам по собі підходить лише для синтаксису стилю C. Увімкнення програми vimrc може бути проблемою при роботі з іншими мовами. Просто замість цього використовуйте "відступ файлу".
сірий

2
Ну, smartindent також є лише для синтаксису в стилі C і, по суті, є застарілим.
greyh

4
якщо я ввімкну розширювальну вкладку, чи існує спосіб фактичного введення символу вкладки в текст?
Даніеле Сегато

3
@DanieleSegato <ctrl v> <tab> повинен працювати у режимі вставки: stackoverflow.com/questions/4781070/…
Кен

236

Якщо пов'язано, якщо ви відкриєте файл, який використовує вкладки та пробіли, якщо припустити, що у вас є

set expandtab ts=4 sw=4 ai

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

:%retab

10
FYI, якщо ви не хочете, щоб ваша вкладка була замінена пробілами, видаліть рядок розширення.
Ено

6
Чи не пробіли вкладок? ;-)
Роб Уеллс

11
@ Роб-Уеллс: Я змінив "пробіл" на "пробіл". Ви щасливі зараз? ;-)
netjeff

Чи можете ви пояснити, що означає перший рядок?
Фонд позову Моніки

2
extensiontab визначає, чи вкладки будуть розширені на пробіли. 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, також будуть розміщені правильно з відступом (навіть lisps) .


9
ІМХО, краще, ніж відповідь, позначена правильною. відступ файлу на витіснений вивісний та розумний.
0fnt

62

Щоб мати 4-пробільні вкладки у більшості файлів, справжню 8-ти широку вкладку у Makefiles та автоматичне відступ у різних файлах, включаючи 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? Мені здається, що останні рядки перезаписують специфічний для всіх
файлів макіяж

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.


11
Не використовуйте Shift + ZZце створить .swp файл. використання wq.
шас

6
@shas: "ZZ" еквівалентно ": x" , що таке саме, як ": wq", за винятком того, що він зберігає лише, якщо файл було змінено ... ( Ctrl-Zінша історія ...)
Герт ван ден Берг

1
@shas Це просто неправда. Якщо ви не хочете, щоб файл для заміни для сесії редагування вам доведеться запустити vim -n <file>. Файл swap - це не те, що генерується під час економії; це значною мірою переможе його мету, оскільки файли підкачки стають корисними для відновлення різко припинених сеансів редагування.
Каз

32

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

Додайте наступне до свого .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, то введіть a {і натисніть Enterвідступи в наступному рядку.

Що стосується вкладок, то тут є два налаштування. В межах Vim введіть двокрапку, а потім "встановіть табулент = 4", який встановить вкладки, щоб відображатись як чотири пробіли. Знову натисніть двокрапку і введіть "set extensiontab", який буде вставляти пробіли для вкладок.

Ви можете розмістити ці налаштування в .vimrc (або _vimrc в Windows) у вашому домашньому каталозі, тому вам доведеться вводити їх лише один раз.


0

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

По-друге, ці ручні відступи не потрібно використовувати дуже сильно, якщо ви використовуєте автоматичні відступи.

Якщо Ctrl-Tзамість цього Tabвас турбує, ви можете перезавантажити:

:imap <Tab> ^T

Ви також Shift-Tabможете зробити Ctrl-Dповторний перезапис, щоб зробити деіндент:

:imap <S-Tab> ^D

Тут ^ T і ^ D є буквальними контрольними символами, які можна вставити як Ctrl-VCtrl-T.

Маючи таке зіставлення на місці, ви все одно можете вводити буквальний вкладку в буфер, використовуючи Ctrl-VTab. Зауважте, що якщо ви це зробите, навіть якщо :set expandtabвін увімкнено, ви отримаєте нерозширений символ вкладки.

Аналогічний ефект з <Tab>картою досягається за допомогою :set smarttab, що також змушує задню область в передній частині лінії поводитись розумно.

У 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-стовпців, як зазвичай.


Усі ваші відображення повинні використовувати нерекурсивні варіанти. Картографування go <C-t>може використовувати цей синтаксис, а не літерали. Нарешті, картографування <Tab>у звичайному режимі також відображатиметься <C-i>(вони однакові символи), тому я не рекомендую цього (ви втрачаєте чудовий фрагмент функціональності vim
D. Ben Knoble

@ D.BenKnoble я нічого не рекомендую; Я використовую Ctrl-T, Ctrl-D і <> себе. Це використання Vim за призначенням. Людям, які звикли використовувати Tab в інших редакторах, це може не сподобатися, ось і все.
Каз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.