Pull to refresh

Javascript для Notepad++

Reading time 4 min
Views 31K
Здравствуй Храбрачеловек,

сегодня я решил поделиться с тобой Plugin'ом для Notepad++, который позволит тебе спомощью JavaScript автоматизировать некоторые действия над текстом и не только.

Рождение идеи


С тех пор как я открыл для себя Notepad++, прошло довольно таки много времени. Я использую его как дома так и на работе. Иногда приходится обрабатывать рутиным образом файлы и в большинстве случаев достаточно регулярных выражений. Но бывают случаи, когда хочется немного больше логики, чтобы одним махом произвести замену или что либо подсчитать. Для полного счастья не хватает VBA :-).
Поискав не долго я нашел Plugin под названием «Simple script». Он позволяет используя определенный набор функций последовательно обработать текст. Вообщем оказался слишком ПРОСТОЙ скрипт, чтобы удовлетворить мои в принцие на тот момент небольшие потребности. Дружба с «Simple script»
так и не сложилась.

По долгу службы я познакомился с Microsoft Windows Script, c помощью которого я тогда автоматизировал генерирование и обработку XML файлов. Однажды читая документацию к нему, я обнаружил, что его можно прикрутить и к своему приложению. Поискав по интернетам дальнейшую информацию и опыт внедрения в свои приложения я обнаружил законченный пример на RSDN.ru.

Мне было ясно, что я хочу полноценный JavaScript в Notepad++ и что это возможно.

Реализация


Многочисленные попытки начать дело потерпели неудачу. Отсутствие ATL на домашнем компьютере, а так же отсутствие желания и времени разбираться с этой библиотекой, создавали относительно большой порог для начала. Но однажды готовясь к очередному набегу я набрел на две ключевые статьи:СОМ без ATL и Использование Скриптинг. Спомощью этих двух статей был переработан пример с RSDN.ru без использования ATL. Моему восторгу не было предела, когда заработал первый прототип.

Довольно быстро я реализовал первоначальную идею — выполнение выделенного или скопированного в буфер обмена JavaScript кода. Потом захотелось повесить этот код на елементы меню. Поколдовав немного и подменив функцию окна, удалось вклиниться в главное меню Npp. Возможность работать с меню расширила область применения нового плагина (смотри ниже). С появлением меню захотелось сделать его контекстно зависимым. Чтобы например при переключении с файла на файл [де]активировать определенные елементы меню. Так появилась возможность навешивать обработчики событий.

Подготавливая примеры работы с Plugin'ом я заложил основы для чтения и сохранения настроек.

Использование


Ох и надоел я тебе со своими рассказами наверное! Переходим к практике.

В глобальной области видимости из JavaScript доступен обьект Editor. Доступ к его свойствам и методам возможен так же и без указания его имени.
/* Properties of Editor */
/* read only */
firstView; // a View object
currentView;// a View object
secondView;// a View object
clipBoard;
langs; // Array of language names
pluginConfigDir;
nppDir;

/* read write, bool */
tabBarHidden;
toolBarHidden;
menuHidden;
statusBarHidden;

/* Methods */
alert(/**String*/value);
saveAll();
open(/**String*/value);
addMenu(/**String*/ text); // returns a Menu object
decodeFrom(/** Number*/ codepage, /**String*/ value);
encodeTo(/** Number*/ codepage, /**String*/ value);
runMenuCmd(/** Number*/ cmd); // Runs a standart Menu command (see MenuCmds.js)
setListener(/** Object */ cfg); // see GlobalListener in start.js
addSystemHotKey(/** Object */ cfg); // adds system hotkey (see example in run.js)

Для работы с текстовыми редакторами Editor предоставляет свойства [firs|current|second]View.
/* Properties of View */
/* read write*/
text;
file; // number of current file
selection; // currently selected text
codepage; // Number of current codepage
lang; // Number of current language (see Editor.langs)
line; // Number of current line of text
pos; // Cursor position
column; // Cursor position from line begin
anchor; // Helps to set a selection. Selection is text in interval [anchor, pos]

/* read only */
files; // Array of strings

Чтобы добавить в главное меню необходимо вызвать Editor.addMenu(«Your Sub menu»). Прямое добавление в главное меню елементов не
предусмотренно.
/* Properties of Menu */
/* read write */
text;
checked;
disabled;
/* Methods */
addMenu(/*String*/ text); // adds and returns next submenu
addMenuItem(/*Object*/cfg); // adds and returns menu item

/* Properties of MenuItem */
/* read write */
text;
checked;
disabled;
/* Methods */
remove();


Для затравки я решил привести только небольшой пример (всего на 749байт):
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
if (xmlHttp){
  // Создаю Меню
  var habrMenu = Editor.addMenu("Хабрахабр");
  xmlHttp.open('GET', 'http://habrahabr.ru/rss/1c9d5ed4f0953ded81510256ed34c9be/', true);
  xmlHttp.onreadystatechange = function () {
    if (xmlHttp.readyState == 4 && xmlHttp.responseXML) {
      var titles = xmlHttp.responseXML.selectNodes("/rss/channel/item/title");
      for(var i=0, c=titles.length; i<c; i++){
        // Создаю для каждой статьи в RSS свой пункт меню
        habrMenu.addItem({
          text: titles[i].text, // название пункта
          link: titles[i].selectSingleNode("../link").text, // сохраняю тут ссылку на статью
          cmd:function(){ // функция вызваемая по нажатию на пункт меню
            var shell = new ActiveXObject("WScript.Shell");
            if (shell && this.link){
              shell.run(this.link); // Открываю статью в Браузере
            }
        }});
      }
    }
  };
  xmlHttp.send(null);
}


Пример показывает возможности Plugin'а, а так же работу с XML и Shell используя ActiveX.
www.softwarecanoe.de/pic/nppscripting.habr.png

Дальнейшие возможности смотри в прилагаемых скриптах из папки includes.
  • run.js — добавляет меню для выполнения JavaScript,
  • clearcase.js — добавляет меню для работы с ClearCase,
  • decode.js — добавляет меню для декодирования текста (практично в не русской Windows),
  • gTranslate.js — добавляет меню для перевода текста с помощью Google Translate,
  • test.menu.js — добавляет меню с примерами и тестами,
  • dialog.js — позволяет, используя Internet Explorer, создавать диалоговые окна,
  • Zen Coding.js — Zen Coding от chikuyonok.

Пара ссылочек:
Страница проекта на Google Code,
Microsoft Windows Scripting

Happy Scripting!

UPD: Благодаря стараниям chikuyonok была обнаружена ошибочка, а так же адаптирован Zen Coding для Notepad++!!!
Ошибка уже исправлена.

UPD 2: Благодаря стараниям t0H была обнаружена ещё одна ошибочка. В скрытое главное меню не добавлялись новые подменю.
Ошибка уже исправлена.

UPD 3: Новая версия и API к ней. Пришлось переименовать plug-in из-за того что уже существовал с таким же именем для программирования на LUA. Так что не забудьте удалить предыдущую версию plug-in'a (NppScripting.dll и NppScripting папку).
Tags:
Hubs:
+41
Comments 60
Comments Comments 60

Articles