Как я использую Emacs для написания Perl

Этот пост о том, как я использую Emacs для написания Perl. Я не утверждаю, что у меня лучшая установка Perl всех времен и народов. Функции, которые мне нужны для эффективного написания Perl, это подсветка синтаксиса, автоиндентирование, линтинг и навигация по коду.

Мне лично нравится создавать свою собственную IDE, собирая вместе несвязанные пакеты, что контрастирует с полноценными пакетами IDE, такими как Devel::PerlySense или Perl::LanguageServer. Эти пакеты просто не для меня.

Основы

По умолчанию Emacs использует perl-mode вместо более продвинутого cperl-mode. Оба пакета являются встроенными, поэтому для использования cperl-mode вместо perl-mode достаточно добавить в конфиг следующую строку.

(fset 'perl-mode 'cperl-mode)
Войти в полноэкранный режим Выйти из полноэкранного режима

В cperl-режиме, который был выпущен вместе с Emacs 28, улучшена подсветка синтаксиса для регулярных выражений и heredocs. В нем также исправлена неприятная ошибка, когда имена переменных массива в комментариях выделялись знаком массива, а не знаком комментария.

Если вы используете Emacs версии менее 28, то я бы рекомендовал загрузить cperl-mode из ветки Emacs 28. Лично я помещаю этот файл в ~/.emacs.d/cperl-mode/cperl-mode.el, затем загружаю его следующим кодом.

(add-to-list 'load-path "~/.emacs.d/cperl-mode")
(require 'cperl-mode)
Войти в полноэкранный режим Выйти из полноэкранного режима

По умолчанию cperl-mode заменяет пробелы в конце символами подчеркивания. Я не могу представить, зачем вам это нужно. Чтобы отключить это, добавьте следующую строку в свой конфиг.

(setq cperl-invalid-face nil)
Войти в полноэкранный режим Выйти из полноэкранного режима

cperl-mode по умолчанию отступает от кода на 2 пробела. Вы можете изменить это, установив переменную cperl-indent-level.

Возможно, вы хотите, чтобы многострочные утверждения, обернутые в паренсы, были отступом как блок. Например, по умолчанию cperl-mode отступы в этом объявлении хэша выглядят странным образом.

my %hash = (
            'foo' => 1,
            'bar' => 2,
            'baz' => 3
           );
Войти в полноэкранный режим Выход из полноэкранного режима

Чтобы исправить это, добавьте в конфигурацию следующее.

(setq cperl-indent-parens-as-block t)
(setq cperl-close-paren-offset (- cperl-indent-level))
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь наша декларация хэша хорошо отступает!

my %hash = (
    'foo' => 1,
    'bar' => 2,
    'baz' => 3
);
Войти в полноэкранный режим Выйти из полноэкранного режима

Линтование

Линтинг нашего Perl-кода помогает нам легко находить ошибки, вызванные опечатками. Мой любимый пакет для линтинга в Emacs — Flycheck, который поставляется со встроенной поддержкой Perl.

По умолчанию Flycheck проверяет ваш код с помощью интерпретатора Perl, но он также поставляется с интеграцией с Perl::Critic. Лично я использовал только первый вариант.

Мне нравится выравнивать файл при каждом сохранении, и мне нравится отображать любые ошибки немедленно. Вот как я добиваюсь этого с помощью Flycheck.

(require 'flycheck)
(setq flycheck-check-syntax-automatically '(mode-enabled save))
(setq flycheck-display-errors-delay 0.1)
Войти в полноэкранный режим Выйти из полноэкранного режима

Чтобы включить режим flycheck в cperl-mode, просто включите его с помощью хука.

(add-hook 'cperl-mode-hook 'flycheck-mode)
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь Emacs будет подчеркивать все синтаксические ошибки, и вы сможете просмотреть сообщение в области эха, установив курсор на ошибочный код.

Я не могу передать, сколько простых ошибок вы поймаете, просто используя Flycheck!

Навигация по коду

Для перехода между определениями функций я использую dumb-jump, который обычно просто работает. Я настроил dumb-jump на использование ag для поиска, что позволяет ему работать очень быстро.

(require 'dumb-jump)
(setq dumb-jump-force-searcher 'ag)
(add-hook 'xref-backend-functions #'dumb-jump-xref-activate)
Вход в полноэкранный режим Выход из полноэкранного режима

Затем я могу использовать dumb-jump, вызывая функцию xref-find-definitions, когда мой курсор находится на символе, который я хочу найти. По умолчанию эта функция привязана к M-..

Shell

Многие люди используют M-x compile для запуска своего кода, и один из различных пакетов отладчика для запуска отладчика Perl. Лично я просто использую старый добрый Bash со встроенной оболочкой M-x shell. Это делает мой рабочий процесс, когда дело доходит до запуска и отладки, довольно похожим на работу классического Perl-вирмера, который делает всю свою работу в терминале.

Я использую замечательный пакет shx для превращения M-x shell в более удобный интерфейс оболочки, и я использую shell-pop для всплывающих буферов оболочки, которые автоматически сбрасываются в каталог текущих файлов.

(require 'shx)
(add-hook 'shell-mode-hook 'shx-mode)

(require 'shell-pop)
(setq shell-pop-autocd-to-working-dir t)
(global-set-key (kbd "M-SPC") 'shell-pop)
Вход в полноэкранный режим Выход из полноэкранного режима

Заключительные размышления

Каждый сторонний пакет, который я описал в этом посте, полезен не только для Perl, но и для программирования на любом языке. Это дает единообразный опыт для разных языков программирования. Если бы я вместо этого использовал один из пакетов Perl IDE, то не получил бы такого же единообразного опыта при использовании других языков.

См. также

  • Документация CPerl — Официальная документация по cperl-mode
  • Perl::LanguageServer — Языковой сервер для Perl
  • Devel::PerlySense — Возможности Perl IDE для Emacs
  • Emacs::PDE — Расширения Elisp для разработки на Perl

Оцените статью
devanswers.ru
Добавить комментарий