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

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

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

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

(when 'this
  (process 'this))

(awhen 'this
       (process it))

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

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

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 16 декабря 2011

Это может быть не прямой ответ на ваш вопрос, но я настоятельно рекомендую вам установить плагин SlimV: http://www.vim.org/scripts/script.php?script_id=2531

Это отличный плагин, который интегрирует функциональность SLIME в vim и, помимо многих других вещей, также имеет улучшенный отступ для clisp & clojure. Впрочем, он не будет отступать так, как вы хотите.

3 голосов
/ 02 октября 2015

Для тех, кто ищет эту тему и не хочет запускать Slimv, потому что они не работают с Common Lisp или по другим причинам, вот совок.

Отступ Vim для Lisp не похож начто для других языков;у него есть специальный «режим Lisp».Этот режим включается

:set lisp

, что делается автоматически для .lisp файлов.Режим Lisp не является изобретением Vim;В классических реализациях Vi режим Lisp включен с :set lisp.(К сожалению, это не описано в POSIX).

Режим Lisp в Vim имеет простой механизм для распознавания форм, требующих отступа в стиле оператора: а именно, есть параметр с именем lispwords, который содержит список, разделенный запятымиидентификаторов.

Вы можете доказать себе, что это список идентификаторов, который используется, даже когда вы редактируете файл Common Lisp .lisp с подсветкой синтаксиса и всем.Просто сделайте :set listwords[TAB] и отредактируйте список, чтобы удалить из него что-то, например defun.Затем попробуйте переопределить отступ defun: вместо стиля оператора вы увидите отступ в стиле функции.

Поддержка подсветки синтаксиса для Common Lisp отделена от параметра lispwords режима Lisp;у него есть собственный список идентификаторов.Например, в Vim 7.3, если вы введете это:

(symbol-macrolet ((foo bar))
                 you get indented out to here!)

Это несмотря на то, что symbol-macrolet распознается и окрашивается.Зачем?Это потому, что symbol-macrolet не появляется в довольно скудном списке lispwords, тогда как действительно появляется в файле определения подсветки синтаксиса lisp.vim.

В результате вы можете броситьвместе несколько сценариев, которые сканируют ваш каталог .lisp файлов для макросов и генерируют команду set lispwords=..., которая помещается в каталог .vimrc.

Или, если вы работаете на пользовательском диалекте Лиспа, вы можетепросто заставьте его файл подсветки синтаксиса Vim настраивать lispwords при загрузке.

Вот недосмотр реализации: опция lispwords не имеет локального значения;вы не можете использовать setlocal lispwords ..., чтобы присвоить ему значение буфера .Другими словами, кажется, что (по крайней мере в Vim 7.3, который я использую под Ubuntu), вы не можете открыть два или более буферов, содержащих разные диалекты Lisp с разными идентификаторами для отступа.Содержимое по умолчанию lispwords содержит несколько символов схемы Lisp и , чтобы попытаться стать своего рода решением "один размер почти подходит всем".

1 голос
/ 15 декабря 2011

Если ваш тип файла 'lisp', то я думаю, что вам нужно добавить правила отступа для вашего особого случая в файле 'lisp.vim' в каталоге '/ vim7x / indent'. Вы можете найти немного больше информации в справке по :h indent-expr и :h indentexpr.

Кто-то может рассказать вам лучше, но я полагаю, что файл отступа lisp.vim по умолчанию ничего не делает, потому что встроенная функция lispindent () используется для получения значений отступа. Вы хотите:

(1) установить функцию, используемую для получения значений отступа (т. Е. Indentexpr) для функции в вашем собственном файле indent / lisp.vim, например, GetLispIndent ().
(2) в вашей функции GetLispIndent () вы будете использовать lispindent (), чтобы получить значения отступа для всех строк, кроме вашего особого случая. Просмотрите файлы отступов других языков и прочитайте документы, чтобы понять, как работает indentexpr, например, java.vim.

...