Лучший способ настроить автоматическое форматирование / автоматический отступ в vim для Common Lisp

Я хотел бы знать, как лучше всего настроить автоматическое форматирование / автоматический отступ в vim для Common Lisp.

Автоформатирование (я обычно делаю это, набирая '==' в командном режиме для каждой строки) очень хорошо работает для базового языка Lisp в vim (например, defmacro, defun, lambda, if, with-output-to- string), но каждый раз, когда определяются новые языковые конструкции (например, с использованием макросов), я обнаруживаю, что форматирование для новой конструкции часто не то, что мне хотелось бы.

Например, вот как vim форматирует 'when (стандартная конструкция lisp) и' awhen (обычно используемая анафорическая версия 'when; не является частью стандарта lisp)

(when 'this
  (process 'this))

(awhen 'this
       (process it))

Я бы хотел' awhen для автоматического форматирования как ' когда. Есть идеи, как я могу это сделать?

Edit: Спасибо Гиллиган и Тамас за рекомендацию Slimv. В качестве теста я загрузил MacVim (он понадобится для работы с терминалом vim, но это другая проблема) и slimv, синхронизировал загрузку slimv в ~ / .vim, запустил MacVim и загрузил файл .lisp.

Затем я запустил Lisp-сервер (через графический интерфейс с MacVim), который загрузил мой исполняемый файл lisp и файл ядра по умолчанию.

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

Мне очень нравится это решение.Вместо того, чтобы [1] научиться указывать vim, как правильно выполнять отступ для определенных функций, и [2] писать код, который делает это явно для каждого расширения языка, которое я определяю, и [3] обновляя этот код каждый раз, когда я добавляю новый языковая конструкция. Вместо этого я использую slimv для форматирования за меня. Slimv может «изучать» новые языковые расширения, если эти макросы уже загружены в ядро ​​lisp, которое использует сеанс сервера. Довольно ловко!

Я обнаружил, что это хорошо работает для определенного класса языковых расширений. Обычно они определяются как макрос с использованием ключевого слова & body. В большинстве случаев это кажется «правильным», но есть макросы, которые я использую, которые по-прежнему не форматируются должным образом. Хотя я бы сказал, что это, скорее, проблема с тем, как написан макрос (нестандартное расширение языка), чем с чем-либо еще.

Таким образом, это решение хорошо работает для меня в большинстве случаев, и мне не пришлось ничего кодировать (и поддерживать). Отличный материал!

6
задан Clayton Stanley 20 December 2011 в 22:23
поделиться