Я регулярно работаю с файлами Python, предоставленными мне в виде шаблонов, в которых используется отступ 2. Однако лично я предпочитаю работать с шириной отступа 4, которую я установил в своем файле .vimrc
. Однако из-за чувствительности Python к отступам типичный gg=G
способ исправить отступ до моей предпочтительной ширины отступа вообще не работает для преобразования файла с моим предпочтительным отступом. Кроме того, просто оставить отступ шириной в 2 винта с моими настройками табуляции.
Чтобы исправить это, я хотел бы иметь некоторую систему для преобразования файла с отступом в 2 пробела в файл с отступом в 4 пробела. Я не знаю, какой самый простой способ это сделать, но я думаю vmap <Tab>
увеличить ширину табуляции выбранных строк на 1 и vmap <S-Tab>
уменьшить ширину на 1. Я не знаю, есть ли там это какой-то встроенный метод для этого, или если для этого потребуется какое-то правило поиска/замены, но я думаю, что какой-то способ исправить отступ до моей предпочтительной ширины был бы полезен, учитывая, что автоотступ недостаточно умен, чтобы исправить это правильно.
Решение состоит в том, что тот, кто предоставляет вам эти шаблоны, должен делать это в соответствии с PEP-8. В Python действительно не обсуждается вопрос о том, как делать отступы в коде. Либо четыре пробела, либо неправильно.
Поскольку в качестве отступа используются пробелы (вместо табуляции), кажется, вам просто нужно удвоить количество начальных пробелов в каждой строке.
Вы можете использовать ggVG
, чтобы выбрать весь файл. Нажатие : приведет к вводу некоторых значений по умолчанию, оттуда вы можете добавить s/^(\s*)/\1\1
для удвоения начальных пробелов в строке.
Объяснение регулярного выражения: ^
указывает на начало строки. (\s*)
— группа захвата, содержащая любое количество пробелов. \1
относится к этой группе захвата, а \1\1
означает повторение этой группы дважды.
ТЛ;ДР: ggVG=:s/^(\s*)/\1\1
Чтобы :substitute
работал со всем буфером, вы можете указать ему диапазон %
, который является сокращением от 1,$
. Визуальный режим вообще не нужен. Также можно обойтись без группы захвата. В совокупности все это упрощает вашу команду до :%s/^\s*/&&/
.
Есть аналогичный пост, посвященный этому вопросу.
(Из этого поста) Вы можете использовать reindent.py, сценарий, поставляемый с вашей установкой Python, для изменения файлов Python, чтобы использовать отступы в 4 пробела и не использовать символы жесткой табуляции.
Вы можете вызвать его, используя
python3 -m reindent
(Вы даже можете запустить его без python3 -m
)
И используйте флаг справки для получения списка возможных флагов.
python3 -m reindent --help
Установите его с помощью pip (pip install reindent
), если он не существует в вашей системе по умолчанию.
Из этого ответа Криса. На самом деле вы можете использовать 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>
, что упрощает преобразование файлов всякий раз, когда я когда-либо получаю еще один из этих раздражающих файлов с отступами.
Основываясь на ответе, данном доктором наук, я решил его немного подправить и написать скрипт, который автоматически фиксирует ширину вкладки при нажатии 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>
VSCode имеет эту встроенную функцию.