?

Log in

No account? Create an account
nyaload

Журнал Пушыстого

Журнал Пушыстого

Previous Entry Share Next Entry
tabs vs spaces - autodetect
nyaload
_winnie
Периодически правлю исходники из разных источников, с разными coding conventions. Чаще всего надо переключаться между табами и спейсами, но иногда встречаются файлы с 2-пробельными и 8-пробельными отступами, например.

Я считаю, что редактор сам должен определять EOL и настройки идентации, и галочка это включающая должна быть включена по умолчанию. EOL худо-бедно некоторые редакторы научились сами выводить. Или хотя бы не мешать редактировать файл с произвольным EOL. А вот с табами и спейсами беда.

Написал автоматический определитель спейсов и табов в файле ( http://dobrokot.ru/dump/tab_space_select.py ). Сначала смотрю на статистику строк в файле, если её нет - то на соседние файлы с тем же расширением. Ещё круче, если бы текстовый редактор смотрел на соседние строки (предыдущий отступ), а не на файл целиком, но увы, это придётся слишком сильно завязаться на API редактора.
Код можно портировать под любой скриптовый язык.

По ходу тестирования нашёл в наших исходниках любителя 3-пробельных отступов. Естественно, его 3-х пробельные отступы перемешанны с 4-х пробельными правками его друзей. Ну и куча обычных банальностей "в файле 3 строчки с табами на 1000 строчек со спейсами".

Как бы мне этот скрипт приткнуть в vim, кто подскажет? Хочется как внешний процесс, так как не на всех хостах новый vim с питоном. Я могу из скрипта возвращать vim-команды, а в vimrc хочется написать что-то вроде eval(get_stdout(~/tab_space_select.py)) update: получилось вот так: http://users.livejournal.com/_winnie/332496.html?thread=4391376#t4391376
Tags: ,


  • 1
Вариант юзать pep8.py и бить по рукам за несоблюдение не подходит? :-)

1) Кроме питона есть другие языки.

2) Если в компании больше 100 человек, то не подходит даже для питона. Разные отделы, разные репозитории, разные начальники. third-party исходники.

3) Редактор не должен бить по рукам, он должен подстраиваться под то что есть.

Edited at 2012-01-06 04:33 pm (UTC)

Всё украдено до нас:
DetectIndent : Automatically detect indent (expandtab, shiftwidth, tabstop) settings
http://www.vim.org/scripts/script.php?script_id=1171

Клёво!

Автор правда полагает что на входе - неиспорченный файл с консистетными отступами. Например, если файле хотя бы одна строка начинается с пробела - считается что в файле используется пробельные отступы везде.

ИМХО, этот плагин - спорный, может принести больше зла чем добра из-за таких простых методов детекта. У меня же он более присобленный к человеческим недостаткам.

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

Не подскажешь, как сделать eval(get_stdout()) в vim rc ? Сходу не нагуглил :)

> Не подскажешь, как сделать eval(get_stdout()) в vim rc ? Сходу не нагуглил :)
Я не сильно гуру, и тоже сходу не нагуглил. Наверняка как-то делается, но чтобы задать это вопрос гуглю надо знать половину ответа :-)

Я б может просто вписывал modeline прямо в конец файла - просто, тупо. Ну или взял бы тот же DetectIndent и смысловую часть заменил питоновским блоком (я знаю что не все собирают vim с питоном, но в дистрибутивах не редкость). самое портабельное было бы переписать всю логику на vimscript - vim умеет редактировать не только локальные файлы. но это, понятно, для совсем крутых уже.

У меня вот так получилось: http://users.livejournal.com/_winnie/332496.html?thread=4391376#t4391376

напечатал в file, затем source его.

Редактор не может знать, правильный ли это формат или Вася просто не соблюдает coding style. Ну можно заморочиться и прикрутить грубую оценку на основе статистики. Но мне кажется это такая мелочь, что проще настройки хранить попроектно или даже по-репозитарно(в случае git).

Ох, боюсь я AI в пользовательском интерфейсе... В 9 случаях из 10 всё будет нормально, а в 10-м устроит такое, что ой.
Хотя, конечно, стиль индентации - не самая великая проблема.

(Deleted comment)
В смысле сочетание синтаксически значимых отступов и того, что Гвидо вовремя не запретил табы?
Ну то бишь если отступы один раз покорёжили - то, возможно, восстановить их уже не удастся?

Что-то вроде: execute(system("python ~/tab_space_select.py"))

Спасибо!

system сработал, execute или аналога не нашёл. Сделал через временный файл и source. Получилось вот так:


autocmd BufRead *.cpp,*.c,*.h,*.hpp,*.cxx,*.py,*.rb,*.xml,.vimrc call AutoDetectTabsSpaces()
fun AutoDetectTabsSpaces()
    let output=(system("python ~/bin/tab_space_select.py --vim-settings " . @% . " > ~/.tab_space_autodetect_tmp.vim"))
    source ~/.tab_space_autodetect_tmp.vim
endfun

  • 1