Page 16 of 24

Posted: Sun Oct 05, 2014 6:33 pm
by Cuprum
Вот делаю скрипт, который делает перенос и вставляет табуляцию, чтобы визуально выделить код внутри фигурных скобок. Имеет смысл использовать если включен XBrackets plugin c настройкой "Автозакрытие скобок".
К примеру, если в CSS было так

Code: Select all

a {тут курсор}
то после Enter-a будет так

Code: Select all

a {
	Тут курсор
}

Code: Select all

var path = AkelPad.GetEditFile(0),
	regPattern = /\.([^.]+)$/,
	ext = path.match(regPattern)[1],
	flieExts = "css|js",
	caret,
	beforeCaret,
	afterCaret,
	textRange;

	function insertTab() {
			AkelPad.Command(4254); // временное отключение опции "Сохранять отсупы слева"
			AkelPad.Command(4196); // вставка новой строки с сохраннием отступов слева
			AkelPad.Command(4254); // включение "Сохранять отсупы слева"
			caret = AkelPad.GetSelStart();
			AkelPad.Command(4254);
			AkelPad.Command(4196);
			AkelPad.Command(4254);
			AkelPad.SetSel(caret, caret); 
			AkelPad.Command(4164); //вставка табуляции
	}
	
	
	if ( flieExts.indexOf(ext) >= 0 ) { //является ли текущий файл *.css или *.js
		caret = AkelPad.GetSelStart();
		beforeCaret = caret - 1;
		afterCaret = caret + 1;
		textRange = AkelPad.GetTextRange(beforeCaret, afterCaret);

		if ( textRange === "{}") {
			insertTab();
		}
	}


Есть проблема: если назначаю скрипту клавишу Enter, то за пределами фигурных скобок перенос на новую строку по Enter-у не происходит. Как можно исправить? Итуитивно пытался вставлять WScript.Quit(); в конец, не помогло.

Posted: Sun Oct 05, 2014 11:47 pm
by Skif_off

Posted: Mon Oct 06, 2014 12:23 pm
by Cuprum
Skif_off
Эти скрипты "причесывают" уже готовый код, мой вариант нужен, чтобы улучшить читабельность кода, когда разработчик непосредственно пишет код (+ меньше лишних нажатий клавиш). Перенос закрывающей фигурной скобки на новую строку с отделением кода слева табуляцией/пробелами - вполне разумные рекомендации.

Posted: Mon Oct 06, 2014 2:52 pm
by Instructor
Cuprum
Можно

Code: Select all

var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();
var path = AkelPad.GetEditFile(0),
   regPattern = /\.([^.]+)$/,
   ext = path.match(regPattern)[1],
   flieExts = "css|js",
   caret,
   beforeCaret,
   afterCaret,
   textRange;

   function insertTab() {
         var bKeepSpace=AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 146 /*MI_KEEPSPACE*/, 0);

         SetRedraw(hWndEdit, false);
         if (!bKeepSpace) AkelPad.Command(4254 /*IDM_OPTIONS_KEEPSPACE*/);
         AkelPad.SendMessage(hWndEdit, 258 /*WM_CHAR*/, 13 /*VK_RETURN*/, 0);
         caret = AkelPad.GetSelStart();
         AkelPad.SendMessage(hWndEdit, 258 /*WM_CHAR*/, 13 /*VK_RETURN*/, 0);
         AkelPad.SetSel(caret, caret);
         AkelPad.Command(4164); //вставка табуляции
         if (!bKeepSpace) AkelPad.Command(4254 /*IDM_OPTIONS_KEEPSPACE*/);
         SetRedraw(hWndEdit, true);
   }

   if ( flieExts.indexOf(ext) >= 0 ) { //является ли текущий файл *.css или *.js
      caret = AkelPad.GetSelStart();
      beforeCaret = caret - 1;
      afterCaret = caret + 1;
      textRange = AkelPad.GetTextRange(beforeCaret, afterCaret);

      if ( textRange === "{}") {
         insertTab();
         WScript.Quit();
      }
   }

AkelPad.SendMessage(hWndEdit, 258 /*WM_CHAR*/, 13 /*VK_RETURN*/, 0);

function SetRedraw(hWnd, bRedraw)
{
  AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
  if (bRedraw) oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}

Posted: Mon Oct 06, 2014 3:19 pm
by Cuprum
Instructor
Большое спасибо! Теперь буду разбираться, как это работает ;)

Posted: Mon Oct 13, 2014 2:06 pm
by Cuprum
Может кто-нибудь еще подскажет как заставить работать

Code: Select all

var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();
var path = AkelPad.GetEditFile(0),
   regPattern = /\.([^.]+)$/,
   ext = path.match(regPattern)[1],
   flieExts = "css|js",
   caret,
   beforeCaret,
   afterCaret,
   textRange;

   function insertTab() {
         var bKeepSpace=AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 146 /*MI_KEEPSPACE*/, 0);

         SetRedraw(hWndEdit, false);
         if (!bKeepSpace) AkelPad.Command(4254 /*IDM_OPTIONS_KEEPSPACE*/);
         AkelPad.SendMessage(hWndEdit, 258 /*WM_CHAR*/, 13 /*VK_RETURN*/, 0);
         caret = AkelPad.GetSelStart();
         AkelPad.SendMessage(hWndEdit, 258 /*WM_CHAR*/, 13 /*VK_RETURN*/, 0);
         AkelPad.SetSel(caret, caret);
         AkelPad.Command(4164); //вставка табуляции
         if (!bKeepSpace) AkelPad.Command(4254 /*IDM_OPTIONS_KEEPSPACE*/);
         SetRedraw(hWndEdit, true);
   }

   if ( flieExts.indexOf(ext) >= 0 ) { //является ли текущий файл *.css или *.js
      caret = AkelPad.GetSelStart();
      beforeCaret = caret - 1;
      afterCaret = caret + 1;
      textRange = AkelPad.GetTextRange(beforeCaret, afterCaret);

      if ( textRange === "{}") {
         insertTab();
         WScript.Quit();
      }
   }

AkelPad.SendMessage(hWndEdit, 258 /*WM_CHAR*/, 13 /*VK_RETURN*/, 0);

function SetRedraw(hWnd, bRedraw)
{
  AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
  if (bRedraw) oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}
, чтобы Enter работал в других окнах (окнах настроек) тоже?
Случайно обнаружил, что если нажимать Enter, например, в окне настроек контекстного меню (плагины -> ContextMenu::Main -> вызвать), то возврат каретки все равно посылается во вкладку с редактируемым файлом.

Posted: Thu Oct 16, 2014 10:43 am
by Instructor
Cuprum

Code: Select all

var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var hWndFocus=AkelPad.SendMessage(hMainWnd, 1317 /*AKD_GETFOCUS*/, 0, 0);
var oSys=AkelPad.SystemFunction();
var path = AkelPad.GetEditFile(0),
   regPattern = /\.([^.]+)$/,
   ext = path.match(regPattern)[1],
   flieExts = "css|js",
   caret,
   beforeCaret,
   afterCaret,
   textRange;

   function insertTab() {
         var bKeepSpace=AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 146 /*MI_KEEPSPACE*/, 0);

         SetRedraw(hWndEdit, false);
         if (!bKeepSpace) AkelPad.Command(4254 /*IDM_OPTIONS_KEEPSPACE*/);
         AkelPad.SendMessage(hWndEdit, 258 /*WM_CHAR*/, 13 /*VK_RETURN*/, 0);
         caret = AkelPad.GetSelStart();
         AkelPad.SendMessage(hWndEdit, 258 /*WM_CHAR*/, 13 /*VK_RETURN*/, 0);
         AkelPad.SetSel(caret, caret);
         AkelPad.Command(4164); //вставка табуляции
         if (!bKeepSpace) AkelPad.Command(4254 /*IDM_OPTIONS_KEEPSPACE*/);
         SetRedraw(hWndEdit, true);
   }

if (hWndEdit == hWndFocus) {
   if ( flieExts.indexOf(ext) >= 0 ) { //является ли текущий файл *.css или *.js
      caret = AkelPad.GetSelStart();
      beforeCaret = caret - 1;
      afterCaret = caret + 1;
      textRange = AkelPad.GetTextRange(beforeCaret, afterCaret);

      if ( textRange === "{}") {
         insertTab();
         WScript.Quit();
      }
   }
}
if (hWndFocus)
  AkelPad.SendMessage(hWndFocus, 258 /*WM_CHAR*/, 13 /*VK_RETURN*/, 0);

function SetRedraw(hWnd, bRedraw)
{
  AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
  if (bRedraw) oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}

Posted: Thu Oct 16, 2014 1:44 pm
by Infocatcher
Instructor
Для несохраненных файлов и файлов без точки в имени match() вернет null, и будет ошибка.

Posted: Thu Oct 16, 2014 2:25 pm
by Instructor
Infocatcher
Эта часть написана не мной.

Posted: Thu Oct 16, 2014 2:34 pm
by Cuprum
Instructor
Спасибо!! Будем знать как ловить фокус.

Infocatcher
Учту, попытаюсь исправить.

Posted: Thu Oct 30, 2014 5:55 pm
by Cuprum
Хочу уточнить один момент.
Например, есть скрипт, которому через hotkeys-плагин назначается какая-то одна горячая клавиша из "печатных" (пусть "a"). Сам скрипт просто вставляет текст в позицию курсора

Code: Select all

AkelPad.ReplaceSel("b");
Теперь когда нажимаем "a", скрипт печатает b, а не ab.
Правильно ли я понял, что единственный способ, чтобы печаталось ab - принудительно вставлять нужный символ из скрипта?:

Code: Select all

AkelPad.SendMessage(hWndEdit, 258 /*WM_CHAR*/, 97 /*а*/, 0);
AkelPad.ReplaceSel("b");

Posted: Fri Oct 31, 2014 9:14 am
by Instructor
Cuprum
Тогда уж AkelPad.ReplaceSel("ab"); :)

Posted: Tue Nov 11, 2014 4:44 pm
by Cuprum
Есть ли способ из скрипта узнать, включен ли конкретный плагин, управлять включением/отключением этого плагина?

Posted: Tue Nov 11, 2014 5:48 pm
by Skif_off
Cuprum
AkelPad.IsPluginRunning()?

Posted: Tue Nov 11, 2014 5:49 pm
by VladSh
Cuprum wrote:Есть ли способ из скрипта узнать, включен ли конкретный плагин, управлять включением/отключением этого плагина?
AkelPad.IsPluginRunning.
Для примера см. CodeFoldSwitcher.js и FullScreenEx.js, там же есть включение/выключение плагинов.