Здравствуй Храбрачеловек,
сегодня я решил поделиться с тобой 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 папку).
