| |
[May. 24th, 2007|11:24 pm] |
Кому программирование забесплатно?
Я вот думал: написать что-ли про Дугина? Типа как Дугин пинает мёртвого Лимонова. Или может лучше писануть про Холмогорова? Типа как Холмогоров защищает фофудью.
А потом подумал: да ну, ёб их нахуй! Политические мандавошки, сука. Копошатся там себе, на политическом поле. Копошатся не год и не два, а толку ноль.
И решил поберечь хоть ещё и железные нервы. Заместо перемешивания политического говна, сел я писать программу - автокомпилятор ТеХа. Гораздо более полезное и приятное занятие.
В общем, смысл такой: пишу я тех-сорец. В редакторе под названием "WinEdt" почему-то. Из него компилю, а dvi просматриваю через Yap. Но это, сука, много жать кнопок надо (штук 5).
Автокомпилятор облегчает это дело так: следит за директорией, где у меня математика. За всеми *.tex и *.dvi файлами в ней. Если изменился тех-сырец (это я типа ctrl+s нажал), то в бэкграунде вызывается "latex bla-bla-bla.tex".
Программа дожидается результата компиляции, то есть, ясен хуй, обновлённого bla-bla-bla.dvi, и обновляет окошко Yap-а, которое у меня, как у настоящего кулхацкера, на втором экране.
Вот это обновление технически чутка хитрое: нужно программно на окно Япа переместить фокус, (Яп обновляется при этом, если обновлён dvi) а затем вернуть фокус в WinEdt-редактор.
Ну вот, вся шняга приводит к тому, что через пару секунд после того, как я в эдиторе сохраняюсь (нажимаю ctrl+s), на втором экране dvi-документ обновляется сам по себе, а я в это время продолжаю работать с теховым сырцом.
Сохранение у меня частое и абсолютно рефлективное уже много лет (я бы даже сказал, самопроизвольное) (тут фрейдисты сказали хехе), причём в осмысленные моменты, поэтому самый ништяк получился.
Если кому это интересно, но непонятно, спрашивайте. Там, вопросы какие, или сорец, не стесняйтесь. Кому понятно, тоже может сказать шо-нить умное, типа "а нахуя ваще ТеХ компилировать, ты шо, ламер?" |
|
|
| Comments: |
Так в winedt вроде была какая-то кнопочка, которая именно так и делает. На нее и шорткат должен быть.
там нужно нажать ctrl+shift+v, подождать пока скомпилируется, потом нажать ctrl+shift+l, чтобы перейти к yap-у, а потом alt-tab, чтобы обратно.
а так можно от сорца не отвлекаться ваще. (и следить краем глаза за результатом) а если ошибка компиляции, компьютер мне даже вслух произносит ("ерор однако"). за полтора часа однако хороший результат.
под виндовозом что-ли программа?
ага, под виндовозом. причём под последним.
покажи исходник, пожалуйста
вся работа выполняется вот этим классом:
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 } } } }
Немерле однако хуяк - отсюда позырь. | |