Я просмотрел несколько вопросов о переполнении стека, чтобы узнать, как преобразовать пробелы во вкладки, не найдя того, что мне нужно. Кажется, есть еще вопросы о том, как преобразовать табуляции в пробелы, но я пытаюсь сделать наоборот.
В Vim
Я пытался :retab
и :retab!
без везения, но я считаю , те , на самом деле для перехода из вкладок пространства в любом случае.
Я попробовал оба expand
и unexpand
в командной строке без какой-либо удачи.
Вот этот файл:
Как я могу преобразовать начальные пробелы во вкладки, используя либо Vim
оболочку?
sed "s/ +/`echo -e '\t'`/g" < input.py > output.py
) отображает все пробелы, а не только начальные пробелы. Во втором примере (sed "s/^ +/`echo -e '\t'`/g" < input.py > output.py
) он заменяет только первый пробел в каждой строке на вкладку и оставляет остальные из них.find
,awk
и блэкджек (слишком долго , чтобы оставить его в комментариях, хотя)Ответы:
Используя Vim, чтобы расширить все ведущие пробелы (шире, чем
'tabstop'
), вы были правы в использовании,retab
но сначала убедитесь,'expandtab'
что сброс (:verbose set ts? et?
ваш друг).retab
принимает диапазон , поэтому я обычно указываю,%
что означает «весь файл».Прежде чем делать что-то подобное (особенно с файлами Python!), Я обычно устанавливаю
'list'
, чтобы я мог видеть пробелы и вносить изменения.У меня есть следующее отображение в Моем
.vimrc
для этого:источник
:set noet
,:set tabstop=2
,:retab!
,:%retab!
,:set tabstop=1
,:retab!
,:%retab!
%
. Отображение F2 точно так, как оно напечатано .:set noet ts=2 |%retab!
:%retab!
все еще работает. Я был смущен==
, и т. Д., Который действительно уважает установку preservindent.:set tabstop=4
1 - Если у вас есть пробелы и вы хотите вкладки.
Во-первых, вам нужно решить, сколько пробелов будет иметь одну вкладку. Тем не менее, предположим, у вас есть строки с ведущими 4 пробелами, или 8 ... Чем вы понимаете, что вы, вероятно, хотите, чтобы табуляция была 4 пробелами. Теперь с этой информацией вы делаете:
Здесь есть проблема! Эта последовательность команд будет искать весь ваш текст, а не только пробелы в начале строки. Это означает, что строка, как:
"Hey,␣this␣␣␣␣is␣4␣spaces"
станет"Hey,␣this⇥is␣4␣spaces"
, но это не так! это вкладка!Чтобы решить эту маленькую проблему, я рекомендую
search
вместоretab
.Этот поиск будет искать во всем файле любые строки, начиная с любого количества вкладок, за которыми следуют 4 пробела, и заменять его на любое количество найденных вкладок плюс одну.
Это, к сожалению, не запустится сразу!
Сначала файл будет иметь строки, начинающиеся с пробелов. Затем поиск преобразует только первые 4 пробела в табуляцию, и позволяет следующее ...
Вам нужно повторить команду. Сколько раз? Пока не получишь
pattern not found
. Я пока не могу придумать, как автоматизировать процесс. Но если вы делаете:Вы, вероятно, сделали. Эта команда повторяет последний поиск / замену 10 раз. Вряд ли в вашей программе будет так много отступов. Если это так, просто повторите еще раз
@@
.Теперь просто для завершения ответа. Я знаю, что вы просили об обратном, но никогда не знаете, когда вам нужно что-то отменить.
2 - У вас есть вкладки и вы хотите пробелы.
Во-первых, решите, во сколько мест вы хотите конвертировать ваши вкладки. Допустим, вы хотите, чтобы каждая вкладка была 2 пробела. Затем вы делаете:
Это будет иметь ту же проблему со строками. Но так как это лучший стиль программирования, позволяющий не использовать жесткие вкладки внутри строк, вы на самом деле делаете здесь что-то хорошее. Если вам действительно нужна вкладка внутри строки, используйте
\t
.источник
ex command
, потому что это будет то, что находится внутри функции. И нет, это не редкость. Вам просто нужно иметь строки с пробелами, чтобы иметь беспорядок. Не редкость вообще. Я был там. Спасибо за комментарий.^
символ, чтобы начать поиск с начала строки, вы рискуете изменить пробелы внутри строк. С^
гарантией вы меняете только пробелы и табуляции с начала строки, таким образом, отступ. Кроме того, если вы уверены, что все в порядке, снимите^
и запустите только один раз::%s/\(^I*\)␣␣␣␣/\1^I/g
Перевод: Поиск для каждого экземпляра 4 последовательных пробелов (после символа =), но только в том случае, если вся строка до этой точки является пробелом (при этом используется обратное утверждение нулевой ширины,
\@<=
). Замените каждый найденный экземпляр символом табуляции.источник
:%s/\(^\s*\)\@<= /\t/g
- поставить соответствующее количество пробелов (чтобы преобразовать 4 пробела в 1 таб, поместить в 4 пробела) сразу после<=
Изменяет все пробелы на табуляцию:% s / \ s / \ t / g
источник
Linux: с
unexpand
(иexpand
)Вот очень хорошее решение: https://stackoverflow.com/a/11094620/1115187 , в основном потому, что оно использует * nix-utilities:
Linux: пользовательский скрипт
Мой оригинальный ответ
Фрагмент Bash для замены отступа в 4 пробела (
{4}
в скрипте их два ) на вкладки во всех.py
файлах в./app
папке (рекурсивно):Он не изменяет 4 пробела в середине или в конце.
Был протестирован под Ubuntu 16.0x и Linux Mint 18
источник
В моем случае у меня было несколько пробелов (поля были разделены одним или несколькими пробелами), которые я хотел заменить на вкладку. Следующие сделали это:
источник
Если вы установили GNU Coreutils, рассмотрим
%!unexpand --first-only
или 4-космических вкладок, рассмотрим%!unexpand -t 4 --first-only
(--first-only
присутствует только в случае , если вы случайно вызоваunexpand
с--all
).Обратите внимание, что это заменит только пробелы, предшествующие заданным остановкам табуляции, а не пробелы, которые следуют за ними; вы не увидите визуальной разницы в vim, если не будете отображать вкладки более буквально; например, мой
~/.vimrc
содержитset list listchars=tab:▸┈
(я подозреваю, именно поэтому вы думали,unexpand
что не работает).источник
Чтобы использовать Vim для перекомпоновки набора файлов (например, всех файлов * .ts в иерархии каталогов), скажем, от 2 до 4 пробелов, вы можете попробовать это из командной строки:
Он использует
find
для передачи всех соответствующих файловxargs
(опция -print0 в find работает с опцией -0 для xargs для обработки файлов с пробелами в имени).xargs запускает vim в ex mode (
-e
) для каждого файла, выполняя данную ex-команду, которая на самом деле состоит из нескольких команд, чтобы заменить существующие начальные пробелы на табуляцию, сбросить табуляцию табуляции и вернуть вкладки обратно на пробелы и, наконец, сохранить и выйти.Запуск в режиме ex предотвращает это:
Vim: Warning: Input is not from a terminal
для каждого файла.источник
Простой Python Script:
источник