Pull to refresh

Скрипт для Notepad++ на Python

Python *
Sandbox

Введение


Думаю, многим известен Notepad++ — удобная бесплатная утилита, выступающая в качестве «продвинутой» замены стандартному Блокноту Windows. Как и при работе в любом текстовом редакторе, в Notepad++ время от времени возникает необходимость автоматизировать какие-либо повторяющиеся действия, которые в силу сложности логики невозможно записать как макрос. К счастью, для решения этой задачи нет необходимости переключаться из Notepad++ в, например, Word, дабы воспользоваться встроенным в него VB.

Среди плагинов для Notepad++ существуют расширения, реализующие возможность написания скриптов для Notepad++ на разных языках, таких как JavaScript, Lua, PHP или Python. Именно на последнем я и решил остановиться для решения своей задачи.

Постановка задачи


Предположим, перед нами стоит следующая задача (взята из жизни).

1. В выделенном фрагменте текста (если ничего не выделено — то во всём документе):
  • пронумеровать символы '@', находящиеся в начале строки, заменив '@' на '@1', '@2' и т.д.;
  • удалить пустые (включая пробелы и табуляцию) строки, идущие подряд по две и более.
2. При запуске скрипта должен выдаваться запрос — с какого номера начинать нумерацию символов '@'. По умолчанию (по нажатию «Enter»), нумерация должна начинаться с 1. Если введено не числовое значение, окно запроса должно появляться вновь, до тех пор, пока не будет введено число.

3. Если в выделенном фрагменте текста (или во всём документе — в случае если нет выделения) отсутствует символ '@', должно выводиться соответствующее сообщение об ошибке.

4. Должна присутствовать возможность запуска скрипта:
  • по нажатию соответствующей кнопки на панели инструментов;
  • с помощью клавиатурного сочетания;
  • через контекстное меню правой кнопки мыши.

Решение


Для начала нам потребуется установить плагин для Notepad++ под названием Python Script. С его помощью можно производить любые операции с редактируемым текстом, открывать/закрывать файлы, переключать вкладки, выполнять команды меню Notepad++ и т.д. — одним словом, практически всё, что вообще можно сделать в Notepad++.

Далее, выбрав в меню Notepad++ Plugins->Python Script->New Script, создаём скрипт:

# -*- coding: utf-8 -*-

#Скрипт для Notepad++, удаляющий пустые строки и нумерующий символы "@", находящиеся в начале строки

# Получаем выделенный текст
text = editor.getSelText()
isSelection = True

# Если текст не выделен, то работаем со всем документом
if not text:
	isSelection = False
	text = editor.getText()

#Находим количество вхождений символа "@", находящегося в начале строки
import re
occurrencesCount = len(re.findall('^@', text, flags=re.MULTILINE))

# Если в тексте нет ни одного символа "@" в начале строки, выводим сообщение об ошибке
if occurrencesCount == 0:
	notepad.messageBox('В тексте должен присутствовать как минимум 1 символ "@" в начале строки', 'Неверный формат входных данных', MESSAGEBOXFLAGS.ICONEXCLAMATION)
	
# Если символ "@" присутствует, то
else:
	countStartFrom = ''
	# Выдаём запрос до тех пор, пока не будет введено число
	while not countStartFrom.isdigit():
		countStartFrom = notepad.prompt('Введите число, с которого должна начинаться нумерация вхождений в тексте символа "@":', 'Нумерация вхождений символа "@"', '1')
		if countStartFrom == None:
			break
	if countStartFrom != None:
		# Удаление пустых строк
		text = re.sub('\r\n\\s*\r\n', '\r\n', text)
		# Удаление пустой строки в конце и в начале файла/выделения
		text = re.sub('\r\n\s*$|^\s*\r\n', '', text, flags=re.MULTILINE)

		# Переводим countStartFrom из строки в целочисленный тип
		countStartFrom = int(countStartFrom)

		# Функция, возвращающая символ "@" с добавленным к нему и увеличенным номером
		def addNumber(matchobj):
			global countStartFrom
			countStartFrom += 1
			return '@'+str(countStartFrom-1)

		#Добавляем нумерацию ко всем символам "@", находящимся в начале строки
		text = re.sub('^@', addNumber, text, flags=re.MULTILINE)

		#Заменяем обработанной строкой выделение или весь документ
		if isSelection:
			editor.replaceSel(text)
		else:
			editor.setText(text)

Если мы назвали скрипт «Empty Lines And Count», то запустить его можно из меню Plugins->Python Script->Scripts->Empty Lines And Count. Чтобы добавить его кнопку на панель инструментов и сделать возможным запуск по клавиатурному сочетанию, в настройках плагина (Plugins->Python Script->Configuration) выбираем созданный нами скрипт и добавляем его в меню и на панель инструментов. Теперь после перезапуска Notepad++ соответствующая кнопка появится на панели инструментов.

Назначить скрипту сочетание клавиш можно в меню Settings->Shortcut mapper в разделе Plugin commands.

Чтобы добавить скрипт в контекстное меню Notepad++, нужно в xml-файл настроек (Settings->Edit Popup ContextMenu) добавить в нужном вам месте (например, перед первым элементом) следующие строчки:

<Item PluginEntryName="Python Script" PluginCommandItemName="Empty Lines And Count"  ItemNameAs="Удалить пустые строки и пронумеровать символы '@'"/>
<Item id="0"/>



Вот и всё. Теперь даже рутинные действия со сложной логикой можно выполнять одним кликом.

Полезные ссылки:
Tags:
Hubs:
Total votes 82: ↑78 and ↓4 +74
Views 57K
Comments Comments 22