Page 66 of 96

Posted: Sun Jan 13, 2013 2:23 am
by Infocatcher

Posted: Sun Jan 13, 2013 7:11 pm
by KDJ
FindReplaceEx.js
Added arguments:
-FR - set "Find/Replace" initial parameters:
-GT - set "Go to" initial parameter:
Changed argument name -DefBut to -RDB.

Posted: Mon Jan 14, 2013 10:11 am
by VladSh
KDJ wrote:Changed argument name -DefBut to -RDB.
RDB - Relational DataBase :)
DefBtn, in my opinion, better.

Posted: Mon Jan 14, 2013 8:13 pm
by KDJ
VladSh
In this case:
-RDB = "Replace": Default Button.
And I don't want to have to change that.

Posted: Wed Jan 16, 2013 4:24 pm
by DV
Вопрос, косвенно относящийся к скриптам и/или плагину Log...
Если есть внешняя программа, которая в результате своей работы выводит в консоль какое-то имя файла [например, через printf("%s", fileName)], то как в AkelPad потом открыть файл, соответствующий этому имени?
Если делать дубово, то как-то так:
1. выполняем "program.exe >out.txt";
2. читаем первую строчку файла out.txt и открываем в AkelPad файл, имя которого указано в этой строке.
Но можно ли обойтись без промежуточного файла out.txt?

Posted: Wed Jan 16, 2013 4:55 pm
by DV
DV wrote:Если есть внешняя программа, которая в результате своей работы выводит в консоль какое-то имя файла...
Кажеццо, я уже понял... Можно воспользоваться следующей промежуточной программкой (

Code: Select all

#include <stdio.h>
#include <stdlib.h>


#define MAX_CMDARGLEN 4096


/********  >>>>  tStringPtr functions  >>>>  ********/
typedef struct sStringPtr {
    char* begin;
    char* end;
} tStringPtr;

  void tStringPtr_Init(tStringPtr* p, char* s)
  {
    p->begin = s;
    p->end = s;
  }

  void tStringPtr_AppendN(tStringPtr* p, const char* s, int n)
  {
    if (n > 0)
    {
      strcpy(p->end, s);
      p->end += n;
    }
  }

  void tStringPtr_Append(tStringPtr* p, const char* s)
  {
    int n = s ? strlen(s) : 0;
    tStringPtr_AppendN(p, s, n);
  }

  int tStringPtr_GetLength(const tStringPtr* p)
  {
    return (int) (p->end - p->begin);
  }

  int tStringPtr_IsEmpty(const tStringPtr* p)
  {
    return ((p->begin == p->end) ? 1 : 0);
  }
/********  <<<<  tStringPtr functions  >>>>  ********/


void executeByPassingStdinAsArg(int argc, char* argv[], int quoted);
void executeByPassingArgToStdOut(int argc, char* argv[]);
void printHelp();

int main(int argc, char* argv[])
{
  if (argc > 2)
  {
    switch (argv[1][0])
    {
      case '1':
        executeByPassingStdinAsArg(argc, argv, 0);
        break;
      case '2':
        executeByPassingStdinAsArg(argc, argv, 1);
        break;
      case '3':
        executeByPassingArgToStdOut(argc, argv);
        break;
    }
  }
  else
  {
    printHelp();
  }
  return 0;
}

int hasSpecialCharacters(const char* param)
{
  while (*param)
  {
    switch (*param)
    {
      case ' ':
        return 1;
    }
    ++param;
  }
  return 0;
}

void addParam(tStringPtr* p, const char* param)
{
  if (!tStringPtr_IsEmpty(p))
  {
    tStringPtr_AppendN(p, " ", 1);
  }

  if (hasSpecialCharacters(param))
  {
    tStringPtr_AppendN(p, """, 1);
    tStringPtr_Append(p, param);
    tStringPtr_AppendN(p, """, 1);
  }
  else
  {
    tStringPtr_Append(p, param);
  }
}

void executeByPassingStdinAsArg(int argc, char* argv[], int quoted)
{
  int        i;
  tStringPtr cmd_ptr;
  char       cmdArg[MAX_CMDARGLEN];
  char       cmdToExecute[2*MAX_CMDARGLEN];

  gets(cmdArg);

  tStringPtr_Init(&cmd_ptr, cmdToExecute);
  for (i = 2; i < argc; i++)
  {
    addParam(&cmd_ptr, argv[i]);
  }

  if (quoted)
  {
    addParam(&cmd_ptr, cmdArg);
  }
  else
  {
    tStringPtr_AppendN(&cmd_ptr, " ", 1);
    tStringPtr_Append(&cmd_ptr, cmdArg);
  }

  fwrite(cmd_ptr.begin, 1, tStringPtr_GetLength(&cmd_ptr), stdout);
  system(cmd_ptr.begin);
}

void executeByPassingArgToStdOut(int argc, char* argv[])
{
  int        i;
  tStringPtr cmd_ptr;
  char       cmdToExecute[2*MAX_CMDARGLEN];

  tStringPtr_Init(&cmd_ptr, cmdToExecute);
  for (i = 2; i < argc; i++)
  {
    addParam(&cmd_ptr, argv[i]);
  }

  fwrite(cmd_ptr.begin, 1, tStringPtr_GetLength(&cmd_ptr), stdout);
}

void printHelp()
{
  const char* s = "Usage:\n" \
                  "redir.exe [mode] [command]\n" \
                  "[mode]: 1 - execute \'command contents_of_stdin\'\n" \
                  "        2 - execute \'command "contents_of_stdin"\'\n" \
                  "        3 - print \'command\' to stdout\n";
  fwrite(s, 1, strlen(s), stdout);
}
):

Code: Select all

 //redir.c
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main(int argc, char* argv[])
{
  if (argc > 1)
  {
    char arg[4096];
    char cmd[8192];

    gets(arg);
    strcpy(cmd, argv[1]);
    strcat(cmd, " "");
    strcat(cmd, arg);
    strcat(cmd, """);
    printf("%s\n", cmd);
    system(cmd);
  }
  return 0;
}
И использовать так:
cmd /c program.exe | redir.exe akelpad.exe

Posted: Wed Jan 16, 2013 5:07 pm
by FeyFre
DV, можно было бы обойтись и батничком и циклом for. (Один из вариантов for позволяет распарсить вывод произвольной программы ну и сделать всё что угодно)
(а монжно и без батничка. комманду for скормить cmd.exe в качестве параметра)
Да, в Unix/Linux это было бы сделано так:
program |xargs notepad
и никто не мешает заюзать xargs из порта GnuWin32

Posted: Wed Jan 16, 2013 8:12 pm
by KDJ
Infocatcher
measuresConverter.js
If you use the keyboard shortcut to change the type of measure (eg. Alt+M = Mass), the left panel with radiobuttons of types is not refreshed.

Posted: Wed Jan 16, 2013 8:42 pm
by DV
FeyFre wrote:можно было бы обойтись и батничком и циклом for.
Тханкс!!!
Действительно, блин, просто. Примеры:

Code: Select all

cmd /c for /F %i in ('echo 1.txt') do akelpad %i
cmd /c for /F %i in ('program.exe') do akelpad %i
У команды FOR ещё есть бомбовые модификаторы skip, delims и tokens для пропуска указанного кол-ва строк, указания разделителей и работы с подстроками. Улёт. (Подробнее: for /?)

Posted: Thu Jan 17, 2013 11:11 am
by VladSh
DV
Можно по даблклику по строке в панели Log-плагина переходить в номеру строки и позиции в строке (пример в SearchReplace.js), м.б. можно таким же образом открывать и файл, если по нему дважды клацнуть? Ну или как-то сформировать гиперссылки на именах файлов?

Posted: Thu Jan 17, 2013 4:39 pm
by Infocatcher
KDJ wrote:measuresConverter.js
If you use the keyboard shortcut to change the type of measure (eg. Alt+M = Mass), the left panel with radiobuttons of types is not refreshed.
Should be better now.

Posted: Thu Jan 17, 2013 6:20 pm
by KDJ
Infocatcher
Now is OK. Only need to change the version number.

Posted: Thu Jan 17, 2013 10:13 pm
by kadvlad
Здравствуйте.

Есть задача: с помощью скрипта SearchReplace.js автоматически заменять символы QQQ на ZZZ, с параметрами "учитывать регистр" и "заменять на функции", команда по умолчанию "заменить все".

Пробовал создать

Code: Select all

[Options]
RegExp=0
Sensitive=1
Multiline=0
EscSequences=0
ReplaceFunction=1
Direction=3
DialogWidth=678
DialogHeight=308
Template0=111=what:QQQ with:ZZZ
рядом с *.js, но изменений не видно.
В ручном режиме замена работает правильно.

Также в самом SearchReplace.js есть

Code: Select all

// Example for "Replace with function" flag:
//   What: \d+
//   With: parseInt($0) + 1;
, но непонятно, как его применить в моём случае.


Как правильно реализовать вызов такой команды (возможно, через контекстное меню или по хоткею)?
Спасибо.

AkelPad 4.1.0
Scripts 4.4.0.0
ContextMenu 5.2.0.0

Posted: Fri Jan 18, 2013 8:32 am
by Infocatcher
KDJ wrote:Now is OK. Only need to change the version number.
Of course. :)

measuresConverter.js
Fixed redraw of types, if type was changed from keyboard (eg. Alt+M = Mass)

Posted: Fri Jan 18, 2013 6:28 pm
by VladSh
kadvlad
Мне не удаётся убедить этих людей писать всё не в одном скрипте, а отделять собственно код выполнения (отдельный скрипт с функциями с параметрами в Include, который бы все использовали и благодарили бы) от UI (тоже отдельный скрипт).
Давно напрашивается идея хранить часто используемые параметры замен в отдельных файлах и из них налету генерировать меню, наподобие как работают скрипты ConsoleRun.js и ConsoleExec.js.
Если из SearchReplace.js выделить общий скрипт для всех в Include, то я обязуюсь подобным образом скрестить его с ShowMenuEx.js.