Как я могу преобразовать пробелы в табуляции в Vim или Linux? - PullRequest
167 голосов
/ 02 февраля 2012

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

В Vim Я попытался :retab и :retab! без удачи, но яПолагаю, что они на самом деле предназначены для перехода от табуляции к пробелам.

В командной строке я безуспешно пробовал и expand, и unexpand.

Вот этот файл:

http://gdata -python-client.googlecode.com / hg-history / a9ed9edefd61a0ba0e18c43e448472051821003a / samples / docs / docs_v3_example.py

Как преобразовать ведущих пробелы во вкладках с использованием Vim или оболочки?

Ответы [ 7 ]

277 голосов
/ 02 февраля 2012

Используя Vim, чтобы развернуть все ведущие пробелы (шире, чем 'tabstop'), вы имели право использовать retab, но сначала убедитесь, что 'expandtab' сбрасывается (:verbose set ts? et? ваш друг). retab занимает диапазон , поэтому я обычно задаю % для обозначения "всего файла".

:set tabstop=2      " To match the sample file
:set noexpandtab    " Use tabs, not spaces
:%retab!            " Retabulate the whole file

Прежде чем делать что-либо подобное (особенно с файлами Python!), Я обычно устанавливаю 'list', чтобы я мог увидеть пробел и изменить.

У меня есть следующее отображение в my .vimrc для этого:

nnoremap    <F2> :<C-U>setlocal lcs=tab:>-,trail:-,eol:$ list! list? <CR>
30 голосов
/ 24 августа 2014

1 - Если у вас есть пробелы и вы хотите табуляции.

Во-первых, вам нужно решить, сколько пробелов будет иметь одна вкладка. Тем не менее, предположим, что у вас есть строки с ведущими 4 пробелами, или 8 ... Чем вы понимаете, вы, вероятно, хотите, чтобы табуляция была 4 пробелами. Теперь с этой информацией вы делаете:

:set ts=4
:set noet
:%retab!

Здесь проблема! Эта последовательность команд будет искать весь ваш текст, а не только пробелы в начале строки. Это означает, что строка типа: "Hey,␣this␣␣␣␣is␣4␣spaces" станет "Hey,␣this⇥is␣4␣spaces", но это не так! это вкладка!.

Чтобы решить эту маленькую проблему, я рекомендую search вместо retab.

:%s/^\(^I*\)␣␣␣␣/\1^I/g

Этот поиск будет искать во всем файле любые строки, начинающиеся с любого количества вкладок, за которыми следуют 4 пробела, и заменять его на любое количество найденных вкладок плюс одну.

Это, к сожалению, не запустится сразу!

Сначала файл будет иметь строки, начинающиеся с пробелов. В результате поиска будут преобразованы только первые 4 пробела во вкладку, и появится следующее ...

Вам нужно повторить команду. Сколько раз? Пока вы не получите pattern not found. Я пока не могу придумать, как автоматизировать процесс. Но если вы сделаете:

`10@:`

Вы, вероятно, сделали. Эта команда повторяет последний поиск / замену 10 раз. Вряд ли в вашей программе будет так много отступов. Если это так, просто повторите еще раз @@.

Теперь, просто чтобы завершить ответ. Я знаю, что вы просили об обратном, но никогда не знаете, когда вам нужно что-то отменить.

2 - у вас есть вкладки и вы хотите пробелы.

Во-первых, решите, во сколько мест вы хотите конвертировать ваши вкладки. Допустим, вы хотите, чтобы каждая вкладка была 2 пробела. Затем вы делаете:

:set ts=2
:set et
:%retab!

Это будет иметь ту же проблему со строками. Но так как это лучший стиль программирования, позволяющий не использовать жесткие вкладки внутри строк, вы на самом деле делаете здесь хорошую вещь. Если вам действительно нужна вкладка внутри строки, используйте \t.

11 голосов
/ 28 января 2016
:%s/\(^\s*\)\@<=    /\t/g

Перевод: поиск для каждого экземпляра 4 последовательных пробелов (после символа =), но только если вся строка до этой точки является пробелом (при этом используется обратное утверждение нулевой ширины, \@<=). Замените каждый найденный экземпляр символом табуляции.

3 голосов
/ 28 ноября 2017

Изменяет все пробелы на вкладке :% S / \ s / \ т / г

0 голосов
/ 22 января 2019

В моем случае у меня было несколько пробелов (поля были разделены одним или несколькими пробелами), которые я хотел заменить на вкладку. Следующие сделали это:

:% s/\s\+/\t/g
0 голосов
/ 16 июня 2017

Фрагмент Bash для замены отступа 4 -пространства (в сценарии два {4}) на вкладки во всех .py файлах в папке ./app (рекурсивно):

find ./app -iname '*.py' -type f \
    -exec awk -i inplace \
    '{ match($0, /^(( {4})*)(.*?)$/, arr); gsub(/ {4}/, "\t", arr[1]) }; { print arr[1] arr[3] }' {} \; 

Не изменяет 4 пробела в середине или в конце.

Был протестирован под Ubuntu 16.0x и Linux Mint 18

0 голосов
/ 29 марта 2016

Простой Python-скрипт:

import os

SOURCE_ROOT = "ROOT DIRECTORY - WILL CONVERT ALL UNDERNEATH"

for root, dirs, files in os.walk(SOURCE_ROOT):
    for f in files:
        fpath = os.path.join(root,f)
        assert os.path.exists(fpath)
        data = open(fpath, "r").read()
        data = data.replace("    ", "\t")
        outfile = open(fpath, "w")
        outfile.write(data)
        outfile.close()
...