Запустите скрипт для файла перед открытием файла в vim

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

Есть ли способ, с помощью которого перед открытием любого файла .C я могу запустить Lindent (сценарий отступа ядра Linux) для файла перед открытием? Таким образом, я смогу увидеть файл так, как я хочу. Закрытие файла не должно сохранять изменения отступов. Я также не должен получать сообщение об изменении файла. Использование временного файла при каждом открытии будет невозможно, так как такие вещи, как cscope, будут ломаться таким образом.

Думайте об этом как о CSS, но для вашего редактора и кода. Возможна ли вообще такая установка с vim? Я использую gvim в Linux, но я готов переключиться на любой вариант vim + плагин.

Кроме того, должно быть очевидно, что установка также должна позволять мне открывать файл без отступов. Есть ли проблеск надежды на это сложное требование? Я могу переключиться на редактор (послушайте, emacs, люди с сублимтекстом), если это можно сделать в любом другом редакторе.


person Sankar    schedule 20.12.2013    source источник


Ответы (2)


Предполагая, что lindent можно вызывать как обычный фильтр (:%! {cmd}), следующие команды будут обрабатывать текущий буфер и сбрасывать флаг модификации (чтобы файл отображался как неизмененный):

:%!lindent
:setlocal nomodified

Вы также можете :setlocal nomodifiable во избежание случайного сохранения переформатированного файла.

Поместите эти команды в ~/.vim/after/ftplugin/c.vim. (Для этого требуется, чтобы у вас был :filetype plugin on; использование каталога after позволяет вам переопределить любые настройки типа файла по умолчанию, сделанные $VIMRUNTIME/ftplugin/c.vim.) В качестве альтернативы вы можете определить :autocmd FileType c ... непосредственно в вашем ~/.vimrc, но это имеет тенденцию становиться громоздкий, если у вас много настроек.

person Ingo Karkat    schedule 20.12.2013
comment
Есть ли способ, с помощью которого я могу сделать эти флаги (неизменяемые и т. д.) применимыми только при открытии файлов по указанному пути (может быть, из моего ~/.vimrc)? Таким образом, я смогу открыть все файлы .C моего проекта с помощью Lindented, а остальные файлы .C - без проблем. - person Sankar; 20.12.2013
comment
Да, тогда используйте второй подход с :autocmd, но не на типе файла, а на файловом глобусе, т.е. :autocmd BufRead path/to/project/*.c execute '%!lindent' | setlocal nomodified - person Ingo Karkat; 20.12.2013

Это тривиально сделать в Emacs. Вот команда, которую я иногда использую:

(defun cpp-astyle()
  (interactive)
  (let (beg end)
    (if (region-active-p)
        (setq beg (region-beginning)
              end (region-end))
      (setq beg (point-min)
            end (point-max)))
    (shell-command-on-region
     beg end "astyle -A3 -U -p -k3" nil t)))

Это запустит astyle для текущего файла. Вы можете привязать это действие к клавише:

(global-set-key (kbd "f8") 'cpp-astyle)

Также возможно, чтобы эта команда запускалась автоматически для всех источников C/C++, но это может раздражать. Ключевая привязка лучше.

УПД

По запросу @Tom:

(defun cpp-astyle()
  (interactive)
  (let ((buf (get-buffer-create
              (format "--%s" (buffer-name))))
        (mode major-mode)
        beg end)
    (if (region-active-p)
        (setq beg (region-beginning)
              end (region-end))
      (setq beg (point-min)
            end (point-max)))
    (shell-command-on-region
     beg end "astyle -A3 -U -p -k3"
     buf)
    (switch-to-buffer buf)
    (funcall mode)))
person abo-abo    schedule 20.12.2013
comment
Он сказал, что изменения отступов не должны сохраняться при сохранении файла. Ваше решение изменяет отступ файла. - person Tom; 21.12.2013
comment
Я не вижу там save-buffer, а вы :)? - person abo-abo; 21.12.2013
comment
Он написал в вопросе: Закрытие файла не должно сохранять изменения отступа. Я также не должен получать сообщение об изменении файла. Удовлетворяет ли ваше решение последнему условию? - person Tom; 21.12.2013