Замініть вкладки пробілами в 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.