...

понедельник, 9 декабря 2013 г.

[Из песочницы] Тюнинг mooedit

В работе использую EPIC и недавно начал пробовать Komodo IDE. Но в качестве лёгкого «повседневного» редактора в системе у меня установлен mooedit. Не всё в нём идеально, но некоторые вещи можно подкрутить, о чём и пойдёт речь.

Для начала выбираем цветовую схему. Все они берутся из 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 уже уведомлён об этом, обещал подумать :)


Ну и вешаем все эти утилиты на отдельные кнопки:




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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


Комментариев нет:

Отправить комментарий