Page 49 of 97

Posted: Sat Jan 08, 2011 3:24 pm
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

Posted: Sat Jan 08, 2011 5:08 pm
by KDJ
Methods AkelPad.GetMainWnd and AkelPad.GetEditWnd returns values, which VBS does not understand.

Posted: Sat Jan 08, 2011 9:13 pm
by KDJ
In ColumnsSort.js added alphabetically sorting.

Posted: Sun Jan 09, 2011 6:14 am
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> не будет ли он излишне тормозить). Можно засекать время и отключать, если предыдущий запрос слишком долго обрабатывался.

Posted: Tue Jan 11, 2011 2:31 pm
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);
}

Posted: Tue Jan 11, 2011 3:40 pm
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, но тут случай особый(и вообще неюзабельный).

Posted: Thu Jan 13, 2011 6:42 am
by Instructor
Infocatcher wrote:...фикс для опережающих проверок...
Добавил.

Posted: Thu Jan 13, 2011 11:08 am
by VladSh
Авторам скриптов: возможно нужно откорректировать:
- Calculator.js (из дистрибутива плага);
- NeO.Sort.js: if (sInput == undefined) WScript.Quit();
на предмет возвращения InputBox'ом undefined'а.
Свои скрипты я откорректировал.

Posted: Thu Jan 13, 2011 1:40 pm
by Instructor
VladSh
Достаточно сравнивать так:

Code: Select all

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

Code: Select all

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

Posted: Thu Jan 13, 2011 2:27 pm
by VladSh
У меня на этом

Code: Select all

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

а это

Code: Select all

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

Спасибо!

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

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

Code: Select all

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

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

Posted: Fri Jan 14, 2011 11:03 am
by FeyFre
VladSh
что-то я не совсем понял о каком именно диалоге идет речь. В файлк который в коллекции InsertFile.js никакого диалога не наблюдаю(видать устаревший), а то что у меня - там стандартный диалог открытия/сохранения файлов винды, и там можно указать в какой папке нужно открыться при создании.

Posted: Fri Jan 14, 2011 11:54 am
by VladSh
FeyFre wrote:стандартный диалог открытия/сохранения файлов винды, и там можно указать в какой папке нужно открыться при создании.
Да, FileDialog, который там - это стандартный виндовый.
Не подскажете, как подменить там InitialDir?

Posted: Fri Jan 14, 2011 3:18 pm
by FeyFre
Там есть переменная lpStructure - указатель на структуру OPENFILENAME
Вот тут http://msdn.microsoft.com/en-us/library ... 85%29.aspx описаны её поля.
Вас интересует поле lpstrInitialDir - заполняйте его(и вообще почитайте о ней)