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 »

FindReplaceEx.js
Added arguments:
-FR - set "Find/Replace" initial parameters:
-GT - set "Go to" initial parameter:
Changed argument name -DefBut to -RDB.

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

Post by VladSh »

KDJ wrote:Changed argument name -DefBut to -RDB.
RDB - Relational DataBase :)
DefBtn, in my opinion, better.

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

Post by KDJ »

VladSh
In this case:
-RDB = "Replace": Default Button.
And I don't want to have to change that.

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

Post by DV »

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

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

Post 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
Last edited by DV on Fri Jan 18, 2013 3:25 pm, edited 1 time in total.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

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

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

Post 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.

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

Post 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 /?)

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

Post by VladSh »

DV
Можно по даблклику по строке в панели Log-плагина переходить в номеру строки и позиции в строке (пример в SearchReplace.js), м.б. можно таким же образом открывать и файл, если по нему дважды клацнуть? Ну или как-то сформировать гиперссылки на именах файлов?

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

Post 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.

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

Post by KDJ »

Infocatcher
Now is OK. Only need to change the version number.

Offline
Posts: 27
Joined: Sun Mar 16, 2008 10:26 pm

Post 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

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

Post 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)

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

Post by VladSh »

kadvlad
Мне не удаётся убедить этих людей писать всё не в одном скрипте, а отделять собственно код выполнения (отдельный скрипт с функциями с параметрами в Include, который бы все использовали и благодарили бы) от UI (тоже отдельный скрипт).
Давно напрашивается идея хранить часто используемые параметры замен в отдельных файлах и из них налету генерировать меню, наподобие как работают скрипты ConsoleRun.js и ConsoleExec.js.
Если из SearchReplace.js выделить общий скрипт для всех в Include, то я обязуюсь подобным образом скрестить его с ShowMenuEx.js.
Locked