Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Now I see that none of the VBS scripts do not work.
Confirmed:

Code: Select all

Scripts плагин
---------------------------
Скрипт:	[...]\AkelFiles\Plugs\Scripts\Test.vbs
Строка:	17
Символ:	1
Ошибка:	Переменная использует не поддерживаемый в VBScript тип программирования объектов
Код:	800A01CA
Источник:	Ошибка выполнения Microsoft VBScript

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

Post by KDJ »

Methods AkelPad.GetMainWnd and AkelPad.GetEditWnd returns values, which VBS does not understand.

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

Post by KDJ »

In ColumnsSort.js added alphabetically sorting.

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

Post by Infocatcher »

Не прошло и года :D, фикс для опережающих проверок:
SearchReplace_mod2.js

Все оказалось весьма просто – к счастью, для BT_FINDNEXT делается lpArray=pSelText.match(oPattern), а то там много хитрого кода, моя не понимать. :)
Ну, и AkelPad.GetTextRange() теперь есть.

Code: Select all

    if (nButton == BT_REPLACE)
    {
      if (nInitialSelStart != nInitialSelEnd)
      {
        ...
        if (/\(\?[=!].*\)/.test(pFindIt)) // Lookahead assertions: x(?=y) or x(?!y)
        {
          var pEndText=AkelPad.GetTextRange(AkelPad.GetSelStart(), -1, 2 /*\n*/);
          if (!bAkelEdit)
            pEndText=pEndText.replace(/\r/g, "\n");
          if (oPattern.test(pEndText) && RegExp.lastMatch == pSelText)
          {
            pResult=pEndText.replace(oPattern, pReplaceWithEsc);
            pResult=pResult.substr(0, pResult.length - (pEndText.length - pSelText.length));

            AkelPad.ReplaceSel(pResult);

            nInitialSelStart=AkelPad.GetSelStart();
            nInitialSelEnd=AkelPad.GetSelEnd();
          }
        }
        else
        {
          // старый код
          ...
        }
[Upd]
Идея: SearchReplace.js в виде панельки, как QSearch. Можно даже поиск по мере набора попробовать сделать (и посмотреть, <del>как он будет тормозить</del> не будет ли он излишне тормозить). Можно засекать время и отключать, если предыдущий запрос слишком долго обрабатывался.

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

Post by DV »

Приблизительный скрипт OpenInNewInstance.js.
Известные проблемы: новая копия AkelPad (MDI) открывает все те же вкладки, открытые в первой копии. И не дружит с плагином Sessions.

Code: Select all

var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();
var hMainMenu = oSys.Call("user32::GetMenu", hMainWnd);

// constants
var WM_COMMAND = 273;
var MF_BYCOMMAND = 0x00;
var MF_UNCHECKED = 0x00;
var MF_CHECKED   = 0x08;
var IDM_FILE_TWICE    = 4255;
var IDM_PROGRAM_TWICE = 4256;

// uncheck menu item if checked
var nFileTwiceChanged = MenuItemState(IDM_FILE_TWICE);
// uncheck menu item if checked
var nProgramTwiceChanged = MenuItemState(IDM_PROGRAM_TWICE);

var pAkelDir = AkelPad.GetAkelDir();
var pEditFile = AkelPad.GetEditFile(0)
var WshShell = new ActiveXObject("WScript.shell");
// run new AkelPad.exe
WshShell.Run("\"" + pAkelDir + "\\AkelPad.exe\" \"" + pEditFile + "\"");
// wait for a second
oSys.Call("kernel32::Sleep", 1000);

// restore menu item's checked state
if ( nFileTwiceChanged )
{
  ChangeMenuItemState(IDM_FILE_TWICE);
}

// restore menu item's checked state
if ( nProgramTwiceChanged )
{
  ChangeMenuItemState(IDM_PROGRAM_TWICE);
}

function MenuItemState(id)
{
  var state = oSys.Call("user32::GetMenuState", hMainMenu, id, MF_BYCOMMAND);
  if ( state != -1 )
  {
    if ( state & MF_CHECKED )
    {
      ChangeMenuItemState(id);
      return 1;
    }
  }
  return 0;
}

function ChangeMenuItemState(id)
{
  AkelPad.SendMessage(hMainWnd, WM_COMMAND, id, 0);
}

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

Post by FeyFre »

Известные проблемы: новая копия AkelPad (MDI) открывает все те же вкладки, открытые в первой копии.
ЕМНИП Акел сам не открывает ничего. Это Sessions делает.

Ну и сразу же предложения/подсказки:
1. В скрипте зашито имя файла. Нужно "расшить", т.е. запускать то что запущено сейчас. Для этого пользуемся функцией kernel32::GetModuleFileName(NULL)
2. Естественно желательно запустить как-бы копию(хотя в принципе не обязательно). Это касается ключей запуска, в первую очередь выделенных(остальные процитированные нужно обдумать):
#define CLO_MSGOPENCREATEYES 0x04 //Silently create new file, if doesn't exist.
#define CLO_MSGOPENCREATENO 0x08 //Don't create new file, if doesn't exist.
#define CLO_MSGOPENBINARYYES 0x10 //Silently open file, if binary.
#define CLO_MSGOPENBINARYNO 0x20 //Don't open file, if binary.

#define CLO_MSGSAVELOSTSYMBOLSYES 0x40 //Silently save file, even if symbols will be lost.
#define CLO_MSGSAVELOSTSYMBOLSNO 0x80 //Don't save file, if symbols will be lost.
Значит AKD_GETCMDLINEOPTIONS нужен.
3. Насчет проблемы с Sessions. Думаю при запуске следует временно запретить автозагрузку файлов, а потом разрешить.(Схема такова: анализируем настройки плагина, а именно OpenOnStartEnable и OpenOnStartSession. Либо мы временно настройку разрешение меняем, а потом возвращаем назад, либо временно убираем файл сессий. Конечно есть шанс что можем напороться на read-only file-system, но тут случай особый(и вообще неюзабельный).

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher wrote:...фикс для опережающих проверок...
Добавил.

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

Post by VladSh »

Авторам скриптов: возможно нужно откорректировать:
- Calculator.js (из дистрибутива плага);
- NeO.Sort.js: if (sInput == undefined) WScript.Quit();
на предмет возвращения InputBox'ом undefined'а.
Свои скрипты я откорректировал.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

VladSh
Достаточно сравнивать так:

Code: Select all

pValue=AkelPad.InputBox(...)
if (pValue)
...
вместо:

Code: Select all

pValue=AkelPad.InputBox(...)
if (pValue != '')
...

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

Post by VladSh »

У меня на этом

Code: Select all

if (pValue != '')...
ругалось, что работаю с undefined

а это

Code: Select all

if (pValue)
работает

Спасибо!

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

Post by VladSh »

lexa
По поводу SmartBackspace.
1. Идея хорошая, но работает криво. Ожидалось, что будет стирать по количеству пробелов, указанных в настройках. Я настроил скрипт на Ctrl+Backspace, но происходит какая-то чепуха...
2. Лучше переписать алгоритм скрипта так, чтобы не было SendKeys'ов, это затупляет скрипт. Негативный опыт их использования уже большой, поэтому во всех своих скриптах я от этого избавился.
3. В самом скрипте, в комментах (вверху) лучше ставить:
///Краткий коммент
// URL сообщения на форуме, куда выложен скрипт (чтобы людям было удобно находить этот скрипт на странице и обновлять при необходимости).
// Version x.x (гггг.мм.дд)

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

Post by VladSh »

Instructor & all
Подскажите пожалуйста, можно ли в диалог (так как он создаётся в InsertFile.js) как-то изменить начальную дирректорию? Неудобно то, что используется текущая из AkelPad'а, а чаще нужна дирректория текущего файла.

Code: Select all

AkelPad.SendMessage(hWndMain, 273, 4106, 0);
как ни странно, работает правильно.
Может и в диалог, создаваемый в скрипте, можно как-то подсунуть InitialDir?

P.S. Ух, лучше бы в плаге был нормальный FileDialog...

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

Post by FeyFre »

VladSh
что-то я не совсем понял о каком именно диалоге идет речь. В файлк который в коллекции InsertFile.js никакого диалога не наблюдаю(видать устаревший), а то что у меня - там стандартный диалог открытия/сохранения файлов винды, и там можно указать в какой папке нужно открыться при создании.

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

Post by VladSh »

FeyFre wrote:стандартный диалог открытия/сохранения файлов винды, и там можно указать в какой папке нужно открыться при создании.
Да, FileDialog, который там - это стандартный виндовый.
Не подскажете, как подменить там InitialDir?

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

Post by FeyFre »

Там есть переменная lpStructure - указатель на структуру OPENFILENAME
Вот тут http://msdn.microsoft.com/en-us/library ... 85%29.aspx описаны её поля.
Вас интересует поле lpstrInitialDir - заполняйте его(и вообще почитайте о ней)
Locked