Здравствуй Храбрачеловек,
сегодня я решил поделиться с тобой 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. Доступ к его свойствам и методам возможен так же и без указания его имени.
Для работы с текстовыми редакторами Editor предоставляет свойства [firs|current|second]View.
Чтобы добавить в главное меню необходимо вызвать Editor.addMenu(«Your Sub menu»). Прямое добавление в главное меню елементов не
предусмотренно.
Для затравки я решил привести только небольшой пример (всего на 749байт):
Пример показывает возможности Plugin'а, а так же работу с XML и Shell используя ActiveX.
www.softwarecanoe.de/pic/nppscripting.habr.png
Дальнейшие возможности смотри в прилагаемых скриптах из папки includes.
Пара ссылочек:
Страница проекта на 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 папку).
сегодня я решил поделиться с тобой 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 папку).