Преобразование всего файла (Python) из отступа в 2 пробела в отступ в 4 пробела

Я регулярно работаю с файлами Python, предоставленными мне в виде шаблонов, в которых используется отступ 2. Однако лично я предпочитаю работать с шириной отступа 4, которую я установил в своем файле .vimrc. Однако из-за чувствительности Python к отступам типичный gg=G способ исправить отступ до моей предпочтительной ширины отступа вообще не работает для преобразования файла с моим предпочтительным отступом. Кроме того, просто оставить отступ шириной в 2 винта с моими настройками табуляции.

Чтобы исправить это, я хотел бы иметь некоторую систему для преобразования файла с отступом в 2 пробела в файл с отступом в 4 пробела. Я не знаю, какой самый простой способ это сделать, но я думаю vmap <Tab> увеличить ширину табуляции выбранных строк на 1 и vmap <S-Tab> уменьшить ширину на 1. Я не знаю, есть ли там это какой-то встроенный метод для этого, или если для этого потребуется какое-то правило поиска/замены, но я думаю, что какой-то способ исправить отступ до моей предпочтительной ширины был бы полезен, учитывая, что автоотступ недостаточно умен, чтобы исправить это правильно.

VSCode имеет эту встроенную функцию.

matszwecja 14.03.2024 15:00

Решение состоит в том, что тот, кто предоставляет вам эти шаблоны, должен делать это в соответствии с PEP-8. В Python действительно не обсуждается вопрос о том, как делать отступы в коде. Либо четыре пробела, либо неправильно.

Friedrich 14.03.2024 16:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
210
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Поскольку в качестве отступа используются пробелы (вместо табуляции), кажется, вам просто нужно удвоить количество начальных пробелов в каждой строке.

Вы можете использовать ggVG, чтобы выбрать весь файл. Нажатие : приведет к вводу некоторых значений по умолчанию, оттуда вы можете добавить s/^(\s*)/\1\1 для удвоения начальных пробелов в строке.

Объяснение регулярного выражения: ^ указывает на начало строки. (\s*) — группа захвата, содержащая любое количество пробелов. \1 относится к этой группе захвата, а \1\1 означает повторение этой группы дважды.

ТЛ;ДР: ggVG=:s/^(\s*)/\1\1

Чтобы :substitute работал со всем буфером, вы можете указать ему диапазон %, который является сокращением от 1,$. Визуальный режим вообще не нужен. Также можно обойтись без группы захвата. В совокупности все это упрощает вашу команду до :%s/^\s*/&&/.

Friedrich 15.03.2024 07:39

redent.py

Есть аналогичный пост, посвященный этому вопросу.

(Из этого поста) Вы можете использовать reindent.py, сценарий, поставляемый с вашей установкой Python, для изменения файлов Python, чтобы использовать отступы в 4 пробела и не использовать символы жесткой табуляции.

Вы можете вызвать его, используя

python3 -m reindent

(Вы даже можете запустить его без python3 -m)

И используйте флаг справки для получения списка возможных флагов.

python3 -m reindent --help

Установите его с помощью pip (pip install reindent), если он не существует в вашей системе по умолчанию.

Использование в vim

Из этого ответа Криса. На самом деле вы можете использовать reindent.py внутри vim:

:%! reindent

Из командной строки его можно использовать для изменения отступов нескольких файлов (например, всех файлов в каталоге или даже рекурсивно вниз по дереву каталогов).

Ответ принят как подходящий

В ВИМ:

" Convert 2-spaces indent to tabs
:set noexpandtab tabstop=2
:retab!

" Convert tabs to 4-spaces indent
:set expandtab tabstop=4
:retab

Ниже я добавил еще один ответ с коротким vimscript для .vimrc, чтобы он автоматически запускался при нажатии 2<Tab>, что упрощает преобразование файлов всякий раз, когда я когда-либо получаю еще один из этих раздражающих файлов с отступами.

Joeytje50 01.04.2024 12:58

Основываясь на ответе, данном доктором наук, я решил его немного подправить и написать скрипт, который автоматически фиксирует ширину вкладки при нажатии 2<Tab> для перехода от 2 до 4 вкладок, а также позволяет исправлять смешанные вкладки/ Отступ в 4 пробела нажатием 4<Tab. Он использует глобальную переменную, чтобы предотвратить многократное выполнение команды, но в противном случае просто выполняет команды, указанные в ответе phd. Нажатие цифровой клавиши, а затем Tab в обычном режиме приведет к изменению отступа с этого числа на настройку табуляции по умолчанию.

let g:retab_done = 0
function Retab()
    if !v:count || g:retab_done
        return
    endif
    let g:retab_done = 1
    let current_width = &tabstop
    execute "set noexpandtab tabstop = " . v:count
    retab!
    execute "set expandtab tabstop = " . current_width
    retab
    return
endfunction
nmap <Tab> :call Retab()<CR>

Другие вопросы по теме