Для начала выбираем цветовую схему. Все они берутся из Gtk-шных, поэтому идём сюда и выбираем. Почему-то не перевариваю белый фон, останавливаюсь на синем. И допиливаем по вкусу, получая нечто среднее а-ля Midnight Commander, FAR-овский Colorer и, чего греха таить, Turbo Vision времён борландсей. Сразу бросается в глаза отсутствие отдельного цвета для скобок. Поправляем это за счёт def:special-constant в perl.lang (для других языков, наверное, аналогично — с учётом использования там def:special-constant). Копируем файл в ~/.local/share/medit-1/language-specs/ и добавляем:
<styles> <!-- ... --> <style id="special-constant" _name="Brackets" map-to="def:special-constant"/>
<definitions> <context id="perl" class="no-spell-check"> <include> <!-- ... --> <context ref="special-constant"/>
<define-regex id="special-constant" extended="true"> \( | \) | \[ | \] | \{ | \} </define-regex> <context id="special-constant" style-ref="special-constant"> <match>\%{special-constant}</match> </context>
Соответственно, в файле ~/.local/share/medit-1/language-specs/наш-стиль.xml:
<style name="perl:special-constant" foreground="#66FFFF"/>
Результат:
Теперь добавляем проверку синтаксиса:
Что-то не так… Не хватает перехода на строки с ошибками.
Для этого строки в выводе должны иметь вид имя_файла: номер_строки[: позиция]. Позиция нам недоступна, но с номером строки вопрос можно решить. Кладём в ~/bin/ скрипт примерно с таким кодом:
#!/usr/bin/perl use strict; die "Usage: $0 file\n" unless $ARGV[0]; my $out = `/usr/bin/perl -c $ARGV[0] 2>&1`; $out =~ s|^(.*) at (($ARGV[0]) line (\d+))(.*)$|$3:$4 $1$5|gm; print $out;
Прописываем его в качестве утилиты вместо perl -c. Теперь клик мышой по строке с ошибкой будет переносить нас в нужное место окна редактора.
Следующий шаг — настройка форматирования исходника с помощью perltidy. Здесь всё не так просто. Дело в том, что при наличии синтаксических ошибок исходник в окне редактора будет просто затёрт не пойми чем. Чтобы этого избежать сначала прогоняем проверку, и потом уже форматируем. Используем скрипт на Lua, так как он позволяет не безусловно выводить результат в окно редактора, а только когда нужно:
filename = doc.get_filename() codefile = os.tmpname() rc = os.execute(string.format("/usr/bin/perl -c \"%s\" > \"%s\" 2>&1",filename,codefile)) if rc == 0 then tidyfile = os.tmpname() os.execute(string.format("/usr/bin/perltidy -nsak=\"if elsif unless for while\" -pt=0 -i=4 -bl -vt=2 -vtc=2 -boc -st \"%s\" > \"%s\"",filename,tidyfile)) out = io.open(tidyfile,"r") doc.select_all() doc.replace_selected_text(out:read("*a")) doc.save() os.remove(tidyfile) else out = io.open(codefile,"r") moo.error_dialog(string.format("Run syntax check!\n\n%s",out:read("*a"))) end os.remove(codefile)
У этого способа есть один недостаток: получить окно вывода мы не можем, поэтому в случае ошибок синтаксиса приходится показывать диалог. Использование аналогичного скрипта на Python вместо Lua не очень помогает: из него мы можем получить объект для вывода, но только в том случае, если он уже существует, создать новый не получится. Автор mooedit уже уведомлён об этом, обещал подумать 🙂
Ну и вешаем все эти утилиты на отдельные кнопки:
Точно так же можно добавить и запуск скрипта с выводом в область уведомлений редактора (тут всё тривиально), и запуск внешнего отладчика (но это уже отдельные слёзы отдельный разговор), и что-нибудь ещё.
ссылка на оригинал статьи http://habrahabr.ru/post/205328/
Добавить комментарий