Тюнинг mooedit

в 9:22, , рубрики: perl, Программирование, разработка, редактор кода, метки: ,

В работе использую 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"/>

Результат:

Тюнинг mooedit

Теперь добавляем проверку синтаксиса:

Тюнинг mooedit

Что-то не так… Не хватает перехода на строки с ошибками.

Тюнинг mooedit

Для этого строки в выводе должны иметь вид имя_файла: номер_строки[: позиция]. Позиция нам недоступна, но с номером строки вопрос можно решить. Кладём в ~/bin/ скрипт примерно с таким кодом:

#!/usr/bin/perl
use strict;
die "Usage: $0 filen" 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. Теперь клик мышой по строке с ошибкой будет переносить нас в нужное место окна редактора.

Тюнинг mooedit

Следующий шаг — настройка форматирования исходника с помощью perltidy. Здесь всё не так просто. Дело в том, что при наличии синтаксических ошибок исходник в окне редактора будет просто затёрт не пойми чем. Чтобы этого избежать сначала прогоняем проверку, и потом уже форматируем. Используем скрипт на Lua, так как он позволяет не безусловно выводить результат в окно редактора, а только когда нужно:

Тюнинг mooedit

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!nn%s",out:read("*a")))
end
os.remove(codefile)

У этого способа есть один недостаток: получить окно вывода мы не можем, поэтому в случае ошибок синтаксиса приходится показывать диалог. Использование аналогичного скрипта на Python вместо Lua не очень помогает: из него мы можем получить объект для вывода, но только в том случае, если он уже существует, создать новый не получится. Автор mooedit уже уведомлён об этом, обещал подумать :)

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

Тюнинг mooedit

Тюнинг mooedit

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

Автор: kloppspb

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js