Scripts discussion (3)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 173
Joined: Mon Dec 06, 2010 9:53 am
Location: г.Харьков, Русь

Post by San_dr »

KDJ. спасибо, подошло к месту отлично.
уже сам "допетрил", что для аналогичного кода, но варианта "свернуть" такой вид:

Code: Select all

-"Панели: Основная, восстановить" Call("Scripts::Main", 1, "EvalCmd.js", `AkelPad.Call("Scripts::Main", 1, "ScreenView.js", '-View="DefaultFS" -FullScreen=0'); AkelPad.SystemFunction().Call("User32::ShowWindow", AkelPad.GetMainWnd(), 1 /*SW_RESTORE*/);`)
-------------------
AkelPadRestart.js у меня "7" (x64) работает

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

KDJ wrote:What versions of Windows and AkelPad are you using (32/64 bit)?
Win 7 x64 , AkelPad 32, вкладок всегда открыто около 50-70

Поставил в вашем скрипте паузу и заработало (то о чём я и говорил)

Code: Select all

 {
  WScript.Sleep(2000);
  RunAkelPad(WScript.Arguments(0), WScript.Arguments(1), parseInt(WScript.Arguments(2)), parseInt(WScript.Arguments(3)));
}
Но всё равно вкладки пропадают, и работает не стабильно.
Открыто 50 вкладок, после работы скрипта 12, и то в каком-то странном порядке - начальные 4 и конечные 8, середина пропала.

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

Instructor, в Scripts-Rus.txt как всегда не хватает примеров для vbs, к примеру ваш пример перевожу на vbs - и он выдаёт ошибки в WindowSubClass... смотрю справку, а примера нет(((

Code: Select all

With AkelPad
  hMainWnd=.GetMainWnd()
  Set oSys=.SystemFunction()
  If hScript=.ScriptHandle(WScript.ScriptName, 3) Or .ScriptHandle(hScript, 13) Then
    Call .ScriptHandle(hScript, 33)
  Else
    If .WindowSubClass(1, MainCallback, 16) Then
      Call .ScriptNoMutex(&H3)
      Call .WindowGetMessage()
      Call .WindowUnsubClass(1)
    End If
  End If
End With

Function MainCallback(hWnd, uMsg, wParam, lParam)
  If uMsg = 16 Then
    AkelPad.Exec("Notepad.exe")
  End If
End Function
Примеры других новых и части старых функций на vbs тоже нет.

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

Post by KDJ »

Andrey_A_A

Code: Select all

...
  Else
    If .WindowSubClass(1, GetRef("MainCallback"), 16) Then
      Call .ScriptNoMutex(&H3)
...

Offline
Posts: 30
Joined: Sat Nov 26, 2011 1:52 pm

Post by Egor »

А у меня вопрос по скрипту ActiveColumnSwitch.js (код) — он включает, отключает показ вертикальной линии. Всё, конечно, круто, но только у меня он не синхронизируется с соответствующей галкой в окне настроек. То есть если, например, сделать для этого скрипта кнопку на тулбаре и нажать её (кнопка останется в нажатом состоянии), то вертикальная линия появится, но если теперь зайти в окно настроек, то галка "Показывать активный столбец" всё равно не будет отмечена — это так и должно быть?

И еще вопрос: как сделать соответствующий пункт меню (не кнопка на тулбаре), я пробовал добавить команду аналогичную кнопке в настройки плагина ContextMenu, пункт меню работает, но не меняется галочка около него. Ну то есть, я хочу, чтобы около пункта меню была галка, отображающая текущее состояние, как это происходит с кнопкой тулбара (кнопка нажата — линия видна, кнопка отжата — линия скрыта).

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

KDJ, спасибо!

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

Post by KDJ »

San_dr wrote:

Code: Select all

-"Панели: Основная, восстановить" Call("Scripts::Main", 1, "EvalCmd.js", `AkelPad.Call("Scripts::Main", 1, "ScreenView.js", '-View="DefaultFS" -FullScreen=0'); AkelPad.SystemFunction().Call("User32::ShowWindow", AkelPad.GetMainWnd(), 1 /*SW_RESTORE*/);`)
For accuracy:
SW_RESTORE=9
SW_SHOWNORMAL=1
It seems that they works similarly.
Description is here: http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Egor wrote:А у меня вопрос по скрипту ActiveColumnSwitch.js (код)...
You should call the script with -Local=false or without this parameter.
Egor wrote:...как сделать соответствующий пункт меню (не кнопка на тулбаре)...
This modified script works on toolbar and in menu:

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=5727#p5727
// Version v1.1
//
//
//// Active column show/hide.
//
// How to use:
// Add button to Toolbar plugin:
//
// -"Active column" Call("Scripts::Main", 1, "ActiveColumnSwitch.js", `"%m" "%i"`) Icon(0)
// -"Local active column" Call("Scripts::Main", 1, "ActiveColumnSwitch.js", `"%m" "%i" -Local=true`)
//
/// Включить/выключить активный столбец.
//
// Как использовать:
// Добавляем кнопку в Toolbar плагин:
//
// -"Активный столбец" Call("Scripts::Main", 1, "ActiveColumnSwitch.js", `"%m" "%i"`) Icon(0)
// -"Активный столбец локально" Call("Scripts::Main", 1, "ActiveColumnSwitch.js", `"%m" "%i" -Local=true`)


//Arguments
var hToolbarHandle=0;
var nToolbarItemID=0;
if (WScript.Arguments.length >= 2)
{
  hToolbarHandle=parseInt(WScript.Arguments(0));
  nToolbarItemID=parseInt(WScript.Arguments(1));
}
var bLocal=AkelPad.GetArgValue("Local", false);

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var dwOptions;
var bCheckButton=true;

if (hWndEdit)
{
  if (bLocal)
  {
    dwOptions=AkelPad.SendMessage(hWndEdit, 3227 /*AEM_GETOPTIONS*/, 0, 0);
    if (dwOptions & 0x400 /*AECO_ACTIVECOLUMN*/)
    {
      AkelPad.SendMessage(hWndEdit, 3228 /*AEM_SETOPTIONS*/, 4 /*AECOOP_XOR*/, 0x400 /*AECO_ACTIVECOLUMN*/);
      bCheckButton=false;
    }
    else AkelPad.SendMessage(hWndEdit, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x400 /*AECO_ACTIVECOLUMN*/);
  }
  else
  {
    dwOptions=AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 69 /*FI_CARETOPTIONS*/, 0);
    if (dwOptions & 0x2 /*CO_CARETVERTLINE*/)
    {
      dwOptions&=~0x2 /*CO_CARETVERTLINE*/;
      bCheckButton=false;
    }
    else dwOptions|=0x2 /*CO_CARETVERTLINE*/;

    AkelPad.SetFrameInfo(0, 17 /*FIS_CARETOPTIONS*/, dwOptions);
  }

  if (hToolbarHandle && nToolbarItemID)
//    AkelPad.SendMessage(hToolbarHandle, 1026 /*TB_CHECKBUTTON*/, nToolbarItemID, bCheckButton);
  {
    if (AkelPad.SystemFunction().Call("User32::IsMenu", hToolbarHandle))
      AkelPad.SystemFunction().Call("User32::CheckMenuItem", hToolbarHandle, nToolbarItemID, bCheckButton ? 8 /*MF_BYCOMMAND|MF_CHECKED*/: 0 /*MF_BYCOMMAND|MF_UNCHECKED*/);
    else
      AkelPad.SendMessage(hToolbarHandle, 1026 /*TB_CHECKBUTTON*/, nToolbarItemID, bCheckButton);
  }
}
.
You can also use the script: CaretOptionsSwitch.js.

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

Post by Instructor »

KDJ
Updated.

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

Post by KDJ »

AkelPadRestart.js
Fixed: doesn't work in AkelPad x86 on 64-bit Windows.
Added: support for Exit plugin.
Andrey_A_A wrote:Открыто 50 вкладок, после работы скрипта 12, и то в каком-то странном порядке - начальные 4 и конечные 8, середина пропала.
It seems to me that the error is in Sessions plugin.

Offline
Posts: 30
Joined: Sat Nov 26, 2011 1:52 pm

Post by Egor »

KDJ wrote:You should call the script with -Local=false or without this parameter.
То есть

Code: Select all

# команда [1]
-"Активный столбец" Call("Scripts::Main", 1, "ActiveColumnSwitch.js", `"%m" "%i" -Local=false`)

# команда [2]
-"Активный столбец локально" Call("Scripts::Main", 1, "ActiveColumnSwitch.js", `"%m" "%i" -Local=true`)
команда [1] : значит вкл/выкл вертикальную линию с установкой соотв-го чекбокса в настройках, а команда [2] : без внесения изменений в настройки, — так что ли?

Я просто не сразу понял, что значит "локально"/"глобально", в описании скрипта это внятно не объяснено, и я сначала подумал, что "локально" — это значит включить линию только для текущего окна AkelPad, а "глобально" — для всех открытых окон сразу. Дело в том, что сначала я запустил этот скрипт на AkelPad версии 470 (так как он у меня настроен и я пользуюсь им, апдейтится что-то лениво), и там "глобальный" вариант вообще не заработал: там кнопка нажимается только 1 раз, при этом ничего не происходит — ни линия не появляется, ни галка в настройках не ставится, а повторное нажатие кнопки не меняет состояние кнопки, она так и остаётся в нажатом виде. Потом я проверил "глобальный" вариант на AkelPad 488, — там он заработал нормально, но в тот момент я почему-то решил, что "локальность" имеет отношение к режиму окон, а у меня AkelPad всё время в режиме SDI (одно окно), вот я и подумал, что "глобальность" глючит, возможно, потому, что она предназначена только для многооконных режимов, и только потом я понял, что глюки, наверное, из-за старой версии AkelPad.

Тогда ситуация приобретает другой ракурс: использование скрипта в многооконных режимах. Состояние кнопки должно синхронизироваться с состоянием вертикальной линии активного окна при перещелкивании вкладок, то есть при переходе в окно, где вертикальной линии нет, кнопка должна автоматически принимать "отжатый" вид, а при переходе в окно, где линия есть — "нажатый". А то как-то тупо выглядит, когда кнопка во всех вкладках в одном состоянии.

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

Post by DV »

Есть ли в скриптах возможность имитировать нажатия клавиш в окне редактирования? (Смотрел также на плагины Hotkeys и Macros - не поддерживают ли они такую возможность.)
Сейчас меня интересует имитация последовательности "End Enter", создающая новую строку независимо от положения каретки в текущей строке. Неужели для подобной задачи придётся использовать AkelEdit API ?

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

Post by KDJ »

DV
Maybe like this:

Code: Select all

new ActiveXObject("WScript.shell").SendKeys("{END}{ENTER}");

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

Post by Instructor »


Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

DV
1. Подходом, лаконично описанным KDJ, я руководствовался при попытке создания скрипта-переводчика макросов в код для Scripts-плагина
Macro2SendKeys.vbs. (Правда я его так с тех пор до ума и не довел).
2. "End Enter" плохо подходит при режиме с включенным переносом строк. Наверное лучше использовать "Ctrl+Down" + "Left" + "Enter" (но тоже не идеально, т.к. очевидна проблема с последней строкой в файле)

Code: Select all

Size: 64 bytes (8 keys)
----------------------------------------
VBScript template
----------------------------------------
Dim WshShell
  Set WshShell = CreateObject("WScript.Shell")
  WshShell.SendKeys "^{DOWN}"
  WshShell.SendKeys "{LEFT}"
  WshShell.SendKeys "{ENTER}"
----------------------------------------
JScript template
----------------------------------------
  var WshShell = new ActiveXObject("WScript.Shell");
  WshShell.SendKeys ("^{DOWN}");
  WshShell.SendKeys ("{LEFT}");
  WshShell.SendKeys ("{ENTER}");
----------------------------------------

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

Post by FeyFre »

Только только сегодня на RSDN отвечал: единственный легальный способ про имитировать ввод(ну кроме драйверов) это функция SendInput.
Locked