Не верь, не бойся, не проси - [entries|archive|friends|userinfo]
phantom

[ website | My Website ]
[ userinfo | ljr userinfo ]
[ archive | journal archive ]

[May. 24th, 2007|11:24 pm]
Previous Entry Add to Memories Tell A Friend Next Entry
Кому программирование забесплатно?

Я вот думал: написать что-ли про Дугина?
Типа как Дугин пинает мёртвого Лимонова.
Или может лучше писануть про Холмогорова?
Типа как Холмогоров защищает фофудью.

А потом подумал: да ну, ёб их нахуй!
Политические мандавошки, сука.
Копошатся там себе, на политическом поле.
Копошатся не год и не два, а толку ноль.

И решил поберечь хоть ещё и железные нервы.
Заместо перемешивания политического говна,
сел я писать программу - автокомпилятор ТеХа.
Гораздо более полезное и приятное занятие.

В общем, смысл такой: пишу я тех-сорец.
В редакторе под названием "WinEdt" почему-то.
Из него компилю, а dvi просматриваю через Yap.
Но это, сука, много жать кнопок надо (штук 5).

Автокомпилятор облегчает это дело так:
следит за директорией, где у меня математика.
За всеми *.tex и *.dvi файлами в ней.
Если изменился тех-сырец (это я типа ctrl+s нажал),
то в бэкграунде вызывается "latex bla-bla-bla.tex".

Программа дожидается результата компиляции,
то есть, ясен хуй, обновлённого bla-bla-bla.dvi,
и обновляет окошко Yap-а, которое у меня,
как у настоящего кулхацкера, на втором экране.

Вот это обновление технически чутка хитрое:
нужно программно на окно Япа переместить фокус,
(Яп обновляется при этом, если обновлён dvi)
а затем вернуть фокус в WinEdt-редактор.

Ну вот, вся шняга приводит к тому, что через пару секунд
после того, как я в эдиторе сохраняюсь (нажимаю ctrl+s),
на втором экране dvi-документ обновляется сам по себе,
а я в это время продолжаю работать с теховым сырцом.

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

Если кому это интересно, но непонятно, спрашивайте.
Там, вопросы какие, или сорец, не стесняйтесь.
Кому понятно, тоже может сказать шо-нить умное,
типа "а нахуя ваще ТеХ компилировать, ты шо, ламер?"
LinkLeave a comment

Comments:
[User Picture]
From:[info]lolepezy
Date:May 25th, 2007 - 07:50 am
(Link)
Так в winedt вроде была какая-то кнопочка, которая именно так и делает.
На нее и шорткат должен быть.
From:[info]phantom
Date:May 25th, 2007 - 04:32 pm
(Link)
там нужно нажать ctrl+shift+v,
подождать пока скомпилируется,
потом нажать ctrl+shift+l,
чтобы перейти к yap-у,
а потом alt-tab, чтобы обратно.

а так можно от сорца не отвлекаться ваще.
(и следить краем глаза за результатом)
а если ошибка компиляции, компьютер мне
даже вслух произносит ("ерор однако").
за полтора часа однако хороший результат.
From:[info]masterofpuppets
Date:May 25th, 2007 - 05:27 pm
(Link)
под виндовозом что-ли программа?
From:[info]phantom
Date:May 25th, 2007 - 08:19 pm
(Link)
ага, под виндовозом.
причём под последним.
From:[info]masterofpuppets
Date:May 25th, 2007 - 09:38 pm
(Link)
покажи исходник, пожалуйста
From:[info]phantom
Date:May 25th, 2007 - 10:56 pm
(Link)
вся работа выполняется вот этим классом:

using System;
using System.IO;
using System.Diagnostics;
using System.Windows.Automation;

namespace VoiceOperativeMode
{
public class Supervisor
{
static desktop: AutomationElement = AutomationElement.RootElement;

//[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public Watch(): void
{
CreateWatcher("*.tex", FileUpdated);
CreateWatcher("*.dvi", FileUpdated);
}

CreateWatcher(filter: string, handler: FileSystemEventHandler): void
{
def watcher = FileSystemWatcher(@"D:\Mathematics", filter);
watcher.IncludeSubdirectories = true;
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Changed += handler;
watcher.EnableRaisingEvents = true;
}

FileUpdated(_: object, arguments: FileSystemEventArgs): void
{
def extension = Path.GetExtension(arguments.FullPath);
def handler = match (extension)
{
| ".tex" => CompileLatex;
| ".dvi" => ShowDviInYap;
| _ => throw ArgumentException($"Unknown extension: $extension");
}
_ = handler(arguments.FullPath);
}

CompileLatex(path: string): bool
{
assert(path.EndsWith(".tex"));
def info = ProcessStartInfo("latex", path);
info.WindowStyle = ProcessWindowStyle.Hidden;
info.WorkingDirectory = Path.GetDirectoryName(path);
def process = Process.Start(info);
_ = process.WaitForExit(2500);
def success = process.HasExited;
unless(success)
{
process.Kill();
Speaker.Say("Error");
}
success
}

ShowDviInYap(path: string): bool
{
assert(path.EndsWith(".dvi"));
// assume this shit is already in yap, just focus it and back
def children = desktop.FindAll(TreeScope.Children, Condition.TrueCondition).ToList();
def yaps = children.Filter(child => child.Current.Name.StartsWith("Yap"));
def editors = children.Filter(child => child.Current.Name.TrimStart().StartsWith("WinEdt"));
Console.WriteLine(editors.Length);
Console.WriteLine(editors.Map(e => e.Current.Name));
if (yaps.IsEmpty)
false
else
{
yaps.Head.SetFocus();
unless (editors.IsEmpty)
editors.Head.SetFocus();
true
}
}
}
}
From:[info]masterofpuppets
Date:May 26th, 2007 - 12:47 am
(Link)
какой это язык?
From:[info]phantom
Date:May 26th, 2007 - 01:59 am
(Link)
Немерле однако
хуяк - отсюда позырь.