Замініть вкладки пробілами в vim


358

Я хотів би перетворити вкладку в пробіли в gVim. Я додав наступний рядок до свого _vimrc:

set tabstop=2

Він працює, щоб зупинитися на двох пробілах, але все ще виглядає як одна клавіша вкладки (я намагався використовувати клавішу h для підрахунку пробілів після цього).

Я не впевнений, що мені робити, щоб gVim конвертував вкладки в пробіли?


1
Особисто я знайшов би табустоп = 2 занадто малий відступ; Я використовую ts = 4 і розумію, чому люди (наприклад, команда Linux ядра) використовують ts = 8 (а вони не використовують розширення - я це роблю).
— Джонатан Леффлер

4
Чи є спосіб перетворити пробіли на вкладки всередині vim?
— cwd

2
@cwd заміна пробілів символом вкладки ( ^Iякі походять Ctrl-vвідтоді Tab) працює, наприклад, якщо у ваших поточних вкладок є 4 пробіли::%s/ /^I/g
— Індра Гінджанар

Відповіді:


381

IIRC, щось на кшталт:

set tabstop=2 shiftwidth=2 expandtab

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


25
На жаль, це ":%! Expand -t2"
— Пол Томблін

368
або ви можете просто скористатися: retab
— rampion

що робити, якщо я хочу зберегти його з пробілами? прямо зараз, коли я: wq і знову відкрию файл, я повернувся до вкладок
— Gorkem Yurtseven

1
@Gorkem вводить ці команди у ваш .vimrc, щоб vim використовував ці налаштування кожен сеанс
— Krakkos


824

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

:retab

Він буде працювати над поточним буфером.


але як ми можемо змусити retab запитати підтвердження кожного виникнення TAB?
— Oculus Dexter

8
І будучи Vim, він працює і на візуально вибраних регіонах :)
— Енді

2
Дякую за те, що навчіть мене новій справі. Я вживаю нудні :%s/\t/ /gроки, перш ніж побачити ваш коментар.
— Тай Ле

Ви навіть можете зробити , :args retab | wщоб зробити всі файли , відкриті в командному рядку, наприклад, vim *.txt.
— JakeD

Хтось знає, яку версію vim має: retab? Мій 7.3.322 ні.
— бітмейкер

114

Спробуйте

set expandtab

для м'яких вкладок.

Щоб виправити наявні вкладки:

:%s/\t/  /g

Я використав два пробіли, оскільки ви вже встановили свій пробіл на 2 пробіли.


5
Це виправлення вставить два пробіли, де потрібно лише одне.
— Джонатан Леффлер

8
замість того, щоб робити заміну, ви можете робити те, що запропонував Нік вище - тобто retab. Це дозволить повторно позначити всі наявні вкладки як кількість пробілів, встановлених у вашій вкладці.
— Говри

Дивовижна порада! Vim показав мені ідеально ідентифікований файл, тоді як cat (linux cmd) показав неправильне ідентифікацію. Я просто змінив 2 пробіли на 4, якими я користуюся у Vim set ts = 4.
— karlphillip

60

Це працювало для мене:

ви можете побачити вкладки, спочатку зробивши це:

:set list

потім, щоб зробити можливою заміну вкладок, зробіть це:

:set expandtab

тоді

:retab

тепер усі вкладки були замінені пробілами, після чого можна повернутися до звичайного перегляду таким чином:

:set nolist

1
:set listпросто красиво.
— Амір А. Шабані

44

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


1
це замінює вкладки пробілами?
— likejudo

1
Дивовижно! Працював і для мене.
— Наваз

1
Чи можете ви пояснити, що gg = G робити? це робилося саме те, що я шукав. У мене є html на піднесеному, і коли я вставив його у vim, він був шалено розрізаний. Це зараз виглядає чисто.
— jes516

3
@ jes516 ggпереміщує курсор на початок буфера. =є форматом і приймає команду руху. Gпереміщує курсор на кінець буфера, тож він повідомляє формати vim від початку до кінця поточного буфера.
— Джейк Продавці

40

Додайте наступні рядки до .vimrc

set expandtab
set tabstop=4
set shiftwidth=4
map <F2> :retab <CR> :wq! <CR>

Відкрийте файл in vim та натисніть F2. Вкладки будуть перетворені на 4 пробіли, а файл буде збережено автоматично.


Напевно, варто відзначити, що також qбуде закрито поточний буфер файлу. Це може бути, а може і не бажати.
— Віллем ван Кетвіч

14

Якщо ви хочете зберегти свої \t8 пробілів, тоді подумайте про налаштування:

   set softtabstop=2 tabstop=8 shiftwidth=2

Це дасть вам два пробіли на <TAB>прес, але фактичний \tу вашому коді все ще буде розглядатися як 8 символів.


Дякую softtabstop, що згадуєте, я думаю, що одна з особливостей вбивці.
— Мартін Удінг,


4

Перший пошук вкладок у вашому файлі: / ^ I: set extensiontab: retab

буду працювати.


Першу частину ви можете пояснити, що це
— 1616

3

У цій статті є відмінний сценарій vimrc для обробки вкладок + пробілів та перетворення між ними.

Ці команди надаються:

Space2Tab Перетворення пробілів у вкладки, лише в відступах.

Tab2Space Перетворення вкладок у пробіли, лише в відступи.

RetabIndent Виконати Space2Tab (якщо встановлено 'extensiontab') або Tab2Space (інакше).

Кожна команда приймає аргумент, який визначає кількість пробілів у стовпці вкладки. За замовчуванням використовується настройка «табустоп».

Джерело: http://vim.wikia.com/wiki/Super_retab#Script

" Return indent (all whitespace at start of a line), converted from
" tabs to spaces if what = 1, or from spaces to tabs otherwise.
" When converting to tabs, result has no redundant spaces.
function! Indenting(indent, what, cols)
  let spccol = repeat(' ', a:cols)
  let result = substitute(a:indent, spccol, '\t', 'g')
  let result = substitute(result, ' \+\ze\t', '', 'g')
  if a:what == 1
    let result = substitute(result, '\t', spccol, 'g')
  endif
  return result
endfunction

" Convert whitespace used for indenting (before first non-whitespace).
" what = 0 (convert spaces to tabs), or 1 (convert tabs to spaces).
" cols = string with number of columns per tab, or empty to use 'tabstop'.
" The cursor position is restored, but the cursor will be in a different
" column when the number of characters in the indent of the line is changed.
function! IndentConvert(line1, line2, what, cols)
  let savepos = getpos('.')
  let cols = empty(a:cols) ? &tabstop : a:cols
  execute a:line1 . ',' . a:line2 . 's/^\s\+/\=Indenting(submatch(0), a:what, cols)/e'
  call histdel('search', -1)
  call setpos('.', savepos)
endfunction

command! -nargs=? -range=% Space2Tab call IndentConvert(<line1>,<line2>,0,<q-args>)
command! -nargs=? -range=% Tab2Space call IndentConvert(<line1>,<line2>,1,<q-args>)
command! -nargs=? -range=% RetabIndent call IndentConvert(<line1>,<line2>,&et,<q-args>)

Це допомогло мені трохи більше, ніж відповіді тут, коли я вперше пішов шукати рішення.


3

expandце утиліта Unix для перетворення вкладок у пробіли. Якщо ви не хочете setнічого в vim, ви можете скористатися командою shell від vim:

:!% expand -t8

1
якщо ви просто хочете розгорнути частину коду: спочатку виберіть цю частину у візуальному режимі, а потім натисніть :. Тепер показано командний рядок vim :'<,'>. Потім введіть !expand -t4для вкладки 4 місця. (Отриманий командний рядок виглядає як :'<,'>!expand -t4)
— Penghe Geng
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.