Помогите написать скрипт

Russian main discussion
  • Author
  • Message
Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post 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(); в конец, не помогло.
Last edited by Cuprum on Mon Oct 06, 2014 12:07 pm, edited 1 time in total.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »


Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

Skif_off
Эти скрипты "причесывают" уже готовый код, мой вариант нужен, чтобы улучшить читабельность кода, когда разработчик непосредственно пишет код (+ меньше лишних нажатий клавиш). Перенос закрывающей фигурной скобки на новую строку с отделением кода слева табуляцией/пробелами - вполне разумные рекомендации.

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

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

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

Instructor
Большое спасибо! Теперь буду разбираться, как это работает ;)

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post 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 -> вызвать), то возврат каретки все равно посылается во вкладку с редактируемым файлом.

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

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

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

Post by Infocatcher »

Instructor
Для несохраненных файлов и файлов без точки в имени match() вернет null, и будет ошибка.

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

Post by Instructor »

Infocatcher
Эта часть написана не мной.

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

Instructor
Спасибо!! Будем знать как ловить фокус.

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

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

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

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

Post by Instructor »

Cuprum
Тогда уж AkelPad.ReplaceSel("ab"); :)

Offline
Posts: 381
Joined: Wed Sep 28, 2011 3:05 pm

Post by Cuprum »

Есть ли способ из скрипта узнать, включен ли конкретный плагин, управлять включением/отключением этого плагина?

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Cuprum
AkelPad.IsPluginRunning()?

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

Post by VladSh »

Cuprum wrote:Есть ли способ из скрипта узнать, включен ли конкретный плагин, управлять включением/отключением этого плагина?
AkelPad.IsPluginRunning.
Для примера см. CodeFoldSwitcher.js и FullScreenEx.js, там же есть включение/выключение плагинов.
Post Reply