Клавіша 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.