Замените табуляцию пробелами в vim

358

Я хотел бы преобразовать табуляцию в пробелы в gVim. Я добавил следующую строку в мой _vimrc:

set tabstop=2

Это работает, чтобы остановиться на двух пробелах, но все равно похоже, что вставлена ​​одна клавиша табуляции (я пытался использовать клавишу h для подсчета пробелов впоследствии).

Я не уверен, что мне нужно сделать, чтобы gVim преобразовывал табуляцию в пробелы?

David.Chu.ca
источник
1
Лично я бы нашел tabstop = 2 слишком маленьким отступом; Я использую ts = 4 и понимаю, почему люди (например, команда ядра Linux) используют ts = 8 (а они не используют expandtab - я так делаю).
Джонатан Леффлер
4
Есть ли способ конвертировать пробелы во вкладки внутри vim?
cwd
2
@cwd замена пробелов символом табуляции ( ^Iкоторые появятся Ctrl-vпотом Tab) будет работать, например, если ваши текущие табуляции имеют 4 пробела::%s/ /^I/g
Индра Гинанджар

Ответы:

381

IIRC, что-то вроде:

set tabstop=2 shiftwidth=2 expandtab

должен сделать свое дело. Если у вас уже есть вкладки, добавьте к ним хороший глобальный RE, чтобы заменить их на двойные пробелы.

D.Shawley
источник
25
Ой, это ":%! Expand -t2"
Пол Томблин
369
или вы можете просто использовать: retab
rampion
Что делать, если я хочу сохранить его с пробелами? прямо сейчас, когда я: WQ и снова открыть файл, я вернулся к вкладкам
Gorkem Yurtseven
1
@Gorkem помещает эти команды в ваш .vimrc, так что vim использует эти настройки каждый сеанс
Krakkos
5
Что все это значит, хорошо объяснено в вики Vim .
Серж Строобандт
825

После того, как вы получили расширение в соответствии с другими ответами, чрезвычайно удобный способ конвертировать существующие файлы в соответствии с вашими новыми настройками:

:retab

Он будет работать с текущим буфером.

ʞɔıu
источник
но как мы можем сделать повторное запросить подтверждение каждого вхождения TAB?
Окулус Декстер
8
Будучи Vim, он работает и в визуально выбранных регионах :)
Andy
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
Serup
источник
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>

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

Аниш
источник
Вероятно, стоит отметить, что qон также закроет текущий буфер файла. Это может или не может быть желательным.
Виллем ван
14

Если вы хотите оставить \tравным 8 пробелов, подумайте об установке:

   set softtabstop=2 tabstop=8 shiftwidth=2

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

рк.
источник
Спасибо за упоминание softtabstop, я думаю, одна из особенностей убийцы.
Мартин Уединг,
6

Это заставило меня работать:

:set tabstop=2 shiftwidth=2 expandtab | retab
Виллем ван Кетвич
источник
4

первый поиск вкладок в вашем файле: / ^ I: установить expandtab: retab

будет работать.

Shekar
источник
первая часть не могли бы вы объяснить это
serup
3

В этой статье есть отличный скрипт vimrc для обработки вкладок + пробелов и преобразования между ними.

Эти команды предоставляются:

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

Tab2Space Преобразование вкладок в пробелы, только в отступах.

RetabIndent Выполнить Space2Tab (если установлено 'expandtab') или Tab2Space (в противном случае).

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

Источник: 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, вы можете использовать команду оболочки из vim:

:!% expand -t8
qwr
источник
1
если вы просто хотите расширить часть кода: сначала выберите эту часть в визуальном режиме, затем нажмите :. Теперь командная строка vim показывает :'<,'>. Затем введите !expand -t4для табуляции 4 пробела. (Приведенная командная строка похожа :'<,'>!expand -t4)
Penghe Geng