Отступы Python в vim изменяют семантику кода

Я пытаюсь изучить vim :-) Возникли серьезные проблемы с автоматическим отступом, меняющим смысл моего кода на Python. Есть ли способ добиться совершенства автоотступа, не сталкиваясь с поведением, подобным приведенному ниже?

Я начинаю с файла python:

me@host:/tmp$ cat pytest.py 
if False:
    print('Never',
          'print this line')

print 'Always print this line.'

Автоматический отступ с vim pytest.py, gg=G, :wq

Да, я испортил свой сценарий:

me@host:/tmp$ cat pytest.py 
if False:
    print('Never',
            'print this line')

    print 'Always print this line.'

Пытаемся сохранить настоящую ваниль:

me@host:/tmp$ cat ~/.vimrc 
filetype plugin on
filetype indent on
autocmd FileType python set sw=4
autocmd FileType python set ts=4
autocmd FileType python set sts=4
autocmd FileType python set textwidth=79

person Bosh    schedule 14.12.2011    source источник
comment
По этой причине я никогда не использую автоматические отступы, даже когда пишу на языках, где отступы не важны. Я предлагаю сохранять код в чистоте во время его написания и избегать любых автоматических манипуляций.   -  person redShadow    schedule 14.12.2011


Ответы (2)


Чтобы сделать автоматический отступ в vim, нужно просто согласовать настройки табуляции, сдвига, softtabstop и expandtab с редактируемым файлом. Я использую этот плагин:

http://freecode.com/projects/vindect

Это работает с этими настройками из файла python, который вы редактируете, и гарантирует, что vim ведет себя правильно, даже если вы случайно редактируете файл другого человека, который настраивает свое пустое пространство иначе, чем вы.

РЕДАКТИРОВАТЬ: Если вы хотите полностью восстановить исходный файл python (чтобы заменить gg = G), вам понадобится специальный переопределитель для Python, подобный этому: http://svn.python.org/проекты/doctools/trunk/utils/reindent.py, которые можно легко превратить в команда vim.

person Benj    schedule 14.12.2011
comment
Не самоубийство доставляет ему неприятности, а его команда. Но это удобная ссылка. - person MikeyB; 14.12.2011
comment
Приношу свои извинения, теперь, когда я нашел время, чтобы запустить тест, предоставленный OP, я понимаю, что полное восстановление не работает. Выглядит это примерно так: svn.python.org/projects/ doctools / trunk / utils / reindent.py можно легко превратить в плагин python / vim. Вместо этого, возможно, стоит взглянуть на это. - person Benj; 14.12.2011

Да, не делай этого.

Вся суть автоотступа в VIM состоит в том, чтобы дать редактору возможность угадать, где должен располагаться пробел в соответствии с правилами языкового форматирования. Тем не мение:

введите описание изображения здесь

Как вы знаете, пробелы в Python важны. Как сказал бы врач: Не Сделай это потом.

person MikeyB    schedule 14.12.2011
comment
Достаточно честно, @MikeyB. Это примерно то, что я подозревал. (Но существует достаточно пакетов, руководств и т. Д., И я подумал, что, возможно, уровень техники продвинулся вперед ...) - person Bosh; 14.12.2011