Scripts discussion (2)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

FindFiles.js
Changed: double click on file - open file for editing and select the found text (or close file if is currently edited)

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Question:
how to get RichOffset from ByteOffset and vice versa?

For example we have the string:
a\r\r\nb\nc\r\nd\r
(\r - carriage return 0x0D,
\n - line feed 0x0A).
This string is displayed as follows:

Code: Select all

a
b
c
d

If ByteOffset is 8, what is the value of RichOffset?

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Answer:

Code: Select all

function ByteOffsetToRichOffset(nByteOffset)
{
  var hEditWnd      = AkelPad.GetEditWnd();
  var lpIndexOffset = AkelPad.MemAlloc(16 /*sizeof(AEINDEXOFFSET)*/);
  var lpCharIndex1  = AkelPad.MemAlloc(12 /*sizeof(AECHARINDEX)*/);
  var lpCharIndex2  = AkelPad.MemAlloc(12 /*sizeof(AECHARINDEX)*/);
  var nRichOffset;

  AkelPad.MemCopy(lpIndexOffset,      lpCharIndex1, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpIndexOffset +  4, lpCharIndex2, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpIndexOffset +  8, nByteOffset, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpIndexOffset + 12, 3 /*AELB_ASIS*/, 3 /*DT_DWORD*/);

  AkelPad.SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 1 /*AEGI_FIRSTCHAR*/, lpCharIndex1);
  AkelPad.SendMessage(hEditWnd, 3135 /*AEM_INDEXOFFSET*/, 0, lpIndexOffset);

  nRichOffset = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpCharIndex2);

  AkelPad.MemFree(lpIndexOffset);
  AkelPad.MemFree(lpCharIndex1);
  AkelPad.MemFree(lpCharIndex2);

  return nRichOffset;
}

Code: Select all

function RichOffsetToByteOffset(nRichOffset)
{
  var hEditWnd        = AkelPad.GetEditWnd();
  var lpIndexSubtract = AkelPad.MemAlloc(16 /*sizeof(AEINDEXSUBTRACT)*/);
  var lpCharIndex1    = AkelPad.MemAlloc(12 /*sizeof(AECHARINDEX)*/);
  var lpCharIndex2    = AkelPad.MemAlloc(12 /*sizeof(AECHARINDEX)*/);
  var nByteOffset;

  AkelPad.MemCopy(lpIndexSubtract,      lpCharIndex1, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpIndexSubtract +  4, lpCharIndex2, 3 /*DT_DWORD*/);
  AkelPad.MemCopy(lpIndexSubtract + 12, 3 /*AELB_ASIS*/, 3 /*DT_DWORD*/);

  AkelPad.SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 1 /*AEGI_FIRSTCHAR*/, lpCharIndex1);
  AkelPad.SendMessage(hEditWnd, 3137 /*AEM_RICHOFFSETTOINDEX*/, nRichOffset, lpCharIndex2);

  nByteOffset = -AkelPad.SendMessage(hEditWnd, 3134 /*AEM_INDEXSUBTRACT*/, 0, lpIndexSubtract);

  AkelPad.MemFree(lpIndexSubtract);
  AkelPad.MemFree(lpCharIndex1);
  AkelPad.MemFree(lpCharIndex2);

  return nByteOffset;
}

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Обновил RunMe.js.
Что нового:
- расширения файлов сравниваются регистро-независимо;
- добавлен Python и Free Pascal (предполагается, что при установке они зарегистрировались в системе - иначе в файле RunMe.js нужно указать к ним полный путь);
- добавлен внешний вызов Call("Scripts::Main", 1, "RunMe.js", "1"), позволяющий изменить строку запуска - например, добавить какие-то параметры. Изменённая строка запуска сохраняется для последующего использования.
Вот такие вот пироги с котятами :)

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

DV
Вопрос по Вашему скрипту.
Лучше бы сделать задание параметров в обычном ini-файле:

Code: Select all

ext=parameters
а уже внутри скрипта считывать их в oCommands, чтобы пользователи не переколбашивали скрипт или не делали себе копий...
А так параметры ini-файла по опыту пользователей постепенно бы добавлялись (можно вести его там же, рядом со скриптом, чтобы каждый мог выбрать те строки, что ему подходят).

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

В oCommands задаются не только пары "расширение" : "команда", но и пары "расширение" : ":внутренняя_функция", для которых пишется реализация внутренней функции. Как пример, немаленькая функция run_cpp(filePathName). Сейчас это всё находится в одном файле RunMe.js. Выносить эти вещи в отдельный файл, который затем ещё надо как-то обработать? Не уверен.

P.S.
Благодаря этому вопросу заметил, что сейчас (пока) нет возможности передавать аргументы в тот же run_cpp(). Похоже, надо будет показывать окно запроса командной строки непосредственно перед запуском команды на исполнение, а не для строки из oCommands непосредственно.

P.P.S.
Ответ по поводу Паскаля. Реализация мне представляется похожей на используемую в run_cpp() - конкретнее см. переменные cmd1 и cmd2.
В случае Паскаля это будет выглядеть предположительно так:

Code: Select all

var cmd1 = "fpc.exe \"%f\""; // compile
var cmd2 = "cd \"%d\" && \"%n.exe\""; // current dir = file dir && run .exe
var cmd = "cmd /c" + cmd1 + " && " + cmd2;
cmd = prepareCommand(cmd, filePathName); // pre-process %f, %n etc.
runCommand(cmd); // run
Наличие "&&" между cmd1 и cmd2 - т.е. между компиляцией и запуском файла - предполагает, что в случае ошибки компиляции fpc возвратит код ошибки и следующая часть команды (cmd2) не будет вызвана.
Last edited by DV on Thu Nov 29, 2012 12:40 pm, edited 1 time in total.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Просто хотел как бы поудобнее. Карячить скрипт, по моему, плохая идея. Тогда уж ограничить задачи скрипта компиляцией (у Infocatcher'а есть прекрасный скрипт для запуска обычных прог), и для каждого колбасить отдельные файлы. Можно даже в тех же ini задавать частоиспользуемые списки параметров и выводить их в диалоге либо меню для выбора. А используемый тэг-компитятор-ini-файл задавать в параметрах запуска скрипта. Это было бы удобно.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

FindFiles.js
Bugs fixed:
- detection of binary files,
- selection of text in a file opened by double click.

Offline
Posts: 366
Joined: Mon Jan 10, 2011 5:28 pm
Contact:

Post by Lenchik »

Хотелось бы скрипт, вставляющий дату в формате RFC822 (только с четырёхциферной записью года). Может быть модификацию стандартного InsertDate или unixTime.

Пока обхожусь insertDateTemplateExample с такими настройками (в итоге часовой пояс прописан жестко вручную):

Code: Select all

-"RFC822 подобие" Call("Scripts::Main", 1, "insertDateTemplateExample.js", `/t=<day>,\s<date>\s<monthName>\s<fullYear>\s<hours>:<minutes>:<seconds>\s+0400 /w=Sun,Mon,Tue,Wed,Thu,Fri,Sat /m=Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec`, "", 0)
А может уже есть на просторах форума готовенькое, а я не нашёл?

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

FindFiles.js
Added: ability to limit the size of files to search.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Lenchik wrote:Хотелось бы скрипт, вставляющий дату в формате RFC822 (только с четырёхциферной записью года).
Как-то так:
insertDateTemplateExample.js
Add <timezone> placeholder

И заодно:
unixTime.js
Correctly show timezones with minutes

Offline
Posts: 20
Joined: Wed Mar 07, 2012 10:27 am

Post by booleg »

DV wrote: P.P.S.
Ответ по поводу Паскаля. Реализация мне представляется похожей на используемую в run_cpp() - конкретнее см. переменные cmd1 и cmd2.
В случае Паскаля это будет выглядеть предположительно так:

Code: Select all

var cmd1 = "fpc.exe "%f""; // compile
var cmd2 = "cd "%d" && "%n.exe""; // current dir = file dir && run .exe
var cmd = "cmd /c" + cmd1 + " && " + cmd2;
cmd = prepareCommand(cmd, filePathName); // pre-process %f, %n etc.
runCommand(cmd); // run
.
Попробовал.

1) Если паскалевский файл в корне диска, то получаем следующее сообщение - ""cels1e.exe"" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
2) Если паскалевском файле есть операторы ввода данных с клавиатуры, то он компилируется и зависает в процессах без вывода чего либо на экран.

Offline
Posts: 20
Joined: Wed Mar 07, 2012 10:27 am

Post by booleg »

DV wrote: P.P.S.
Ответ по поводу Паскаля. Реализация мне представляется похожей на используемую в run_cpp() - конкретнее см. переменные cmd1 и cmd2.
В случае Паскаля это будет выглядеть предположительно так:

Code: Select all

var cmd1 = "fpc.exe "%f""; // compile
var cmd2 = "cd "%d" && "%n.exe""; // current dir = file dir && run .exe
var cmd = "cmd /c" + cmd1 + " && " + cmd2;
cmd = prepareCommand(cmd, filePathName); // pre-process %f, %n etc.
runCommand(cmd); // run
.
Попробовал.

1) Если паскалевский файл в корне диска, то получаем следующее сообщение - ""cels1e.exe"" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
2) Если паскалевском файле есть операторы ввода данных с клавиатуры, то он компилируется и зависает в процессах без вывода чего либо на экран.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

booleg,
Вызов ":run_pas(\"%f\")" должен использовать параметр %f, чтобы передать полный путь к файлу, а не только имя и расширение.
В качестве cmd2 (внутри function run_pas(filePathName)) можно попробовать
"rundll32.exe shell32,ShellExec_RunDLL \"%d\%n.%e\"". Не бойтесь проявлять фантазию :)

Offline
Posts: 20
Joined: Wed Mar 07, 2012 10:27 am

Post by booleg »

DV wrote:booleg,
В качестве cmd2 (внутри function run_pas(filePathName)) можно попробовать
"rundll32.exe shell32,ShellExec_RunDLL "%d\%n.%e"". Не бойтесь проявлять фантазию :)
Так как скрипты никогда не писал, то именно фантазия и интуиция меня и направляет :)
Такой вариант я пробовал раньше. Компилировал отдельно, а запускал так:

Code: Select all

"pas PAS Pas" : 
    ":run_Pasfile("%d\\%n.exe")" ,
и

Code: Select all

function run_Pasfile(filePathName) 
{ 
  var cmd = "rundll32.exe shell32,ShellExec_RunDLL "" + filePathName + """; 
  runCommand(cmd, "", 0); // do not capture output 
} 
На WinServer2003 - работало, а на Win7(32) нет.
Предполагаю, что Win7 "rundll32.exe shell32,ShellExec_RunDLL" не нравиться.
Locked