Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Ariomex
0 / 0 / 0
Регистрация: 17.07.2016
Сообщений: 42
1

Плагин под Notepad++

17.07.2016, 19:18. Просмотров 1604. Ответов 9
Метки нет (Все метки)

Доброго времени суток. Давно искал плагин под N++ для отображения узлов XML в TreeView и возможностью быстрого перехода, нашёл только вот это: http://www.alb42.de/projekte/xmllist.html
К сожалению исходником автор не поделился, по сему решил попробовать написать аналогичный. Взял за основу вот эту демку: https://sourceforge.net/projects/npp...2.0%20UNICODE/
Может мне кто-нибудь пояснить как загрузить весь текст текущей вкладки N++ в TXMLDocument ? На примере этой демки.
Так же интересует как отловить событие изменения текста во вкладке.

ЗЫ: Искал какие-нибудь статьи или wiki по этому делу, но там сплошь примеры только для С/С++...
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2016, 19:18
Ответы с готовыми решениями:

написать плагин
реально ли на delphi написать плагин к стороннему приложению например к такому...

DLL (плагин) на Delphi
Есть заголовочный файл для создания длл на C (.h файл). Хочу переложить...

Написать плагин для opera
Подскажите с чего лучше начать лучше.Что нужно прочитать? Добавлено через 7...

Подскажите что за плагин, модуль etc?
У меня стоит Delphi 7. С такими модами: Хотелось бы знать что это, как...

Создать дочерний процесс notepad
Доброго дня) Нуждаюсь в Вашей помощи:help:, дорогие форумчане. =) Давно не...

9
BOGG ART
577 / 445 / 146
Регистрация: 09.12.2013
Сообщений: 2,384
Записей в блоге: 2
18.07.2016, 16:16 2
Если есть примеры для Си, то какие проблемы с Делфи? Ссылки где?

Думаю написание плагинов для блокнота в принципе не популярно само по себе. Там и так функциональности с запасом.
0
Ariomex
0 / 0 / 0
Регистрация: 17.07.2016
Сообщений: 42
19.07.2016, 19:17  [ТС] 3
Основное wiki: http://docs.notepad-plus-plus.org/index.php/Plugin_Development
В демке есть вставка строки в текст текущей вкладки:
Delphi
1
2
3
4
5
6
7
procedure THelloWorldPlugin.FuncHelloWorld;
var
  s: string;
begin
  s := 'Hello World';
  SendMessage(self.NppData.ScintillaMainHandle, SCI_REPLACESEL, 0, LPARAM(PChar(s)));
end;
А чтобы скопировать оттуда текст, я так подозреваю, нужно использовать SCI_GETTEXT, и вроде как я даже нашёл пример на С++, но без понятия как сделать то же самое в Дельфи: http://www.quickmacros.com/forum/viewtopic.php?f=1&t=6010
0
BOGG ART
577 / 445 / 146
Регистрация: 09.12.2013
Сообщений: 2,384
Записей в блоге: 2
19.07.2016, 22:35 4
Вроде как SCI_GETTEXTLENGTH плюс SCI_GETTEXTRANGE с TTextRange. Под Делфи7 пришлось подправить заголовочники, но и тогда не взлетело чтот - всё AV да AV.
Длину вернуло верную, а вот получение текста валится. Надо разбираться. А другой версии у меня на данный момент нету.
Просто SCI_GETTEXT не пробовал, первую ссылку находил, там такого сообщения не описано.

Не по теме:

Кстати "self" там не надо писать, моветон как бы.

0
Ariomex
0 / 0 / 0
Регистрация: 17.07.2016
Сообщений: 42
19.07.2016, 22:48  [ТС] 5
У меня демка под Дельфи 7 запустилась сразу же, компилится без каких либо дополнительных телодвижений.
SCI_GETTEXT описан здесь: http://www.scintilla.org/ScintillaDoc
"self" - так оно уже было в демке, все вопросы к её автору .
0
BOGG ART
577 / 445 / 146
Регистрация: 09.12.2013
Сообщений: 2,384
Записей в блоге: 2
19.07.2016, 23:13 6
Лучший ответ Сообщение было отмечено Ariomex как решение

Решение

Не по теме:

А может и не надо было править... Просто непонятно где ANSI, где UTF, а где Unicode должно быть...



Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Procedure THelloWorldDockingForm.Button3Click(Sender: TObject);
Var ret: Integer; buf: String;
Begin
Inherited;
Memo1.Clear();
ret:=SendMessage(Npp.NppData.ScintillaMainHandle, SCI_GETTEXTLENGTH, 0, 0);
if ret>0 then
      ret:=ret+1
Else
      Exit;
SetLength(buf, ret);
FillChar(buf[1], ret, 32);
UpdateDisplayInfo(IntToStr(ret-1));
SendMessage(Npp.NppData.ScintillaMainHandle, SCI_GETTEXT, ret, LPARAM(PChar(@buf[1])));
Memo1.Text:=Utf8ToAnsi(buf);
SetLength(buf, 0);
End;
1
Ariomex
0 / 0 / 0
Регистрация: 17.07.2016
Сообщений: 42
28.07.2016, 14:01  [ТС] 7
Нашёл, так сказать, "золотую жилу", может кому пригодится))
Delphi
1
SendMessage(Npp.NppData.NppHandle, NPPM_MENUCOMMAND, 0, n);
Этим можно выполнить любую команду Notepad++, вписав вместо n её номер.
Номера команд можно посмотреть в xml-ках локализации (Notepad++\localization).
0
Ariomex
0 / 0 / 0
Регистрация: 17.07.2016
Сообщений: 42
06.08.2016, 22:01  [ТС] 8
Пытаюсь организовать замену текста во всём документе с использованием регулярных выражений средствами Notepad++. Нашёл пример для С++:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/////////////////////////////////////
// @mfunc Replace a text in a selection or in the complete file multiple times
// @rvalue int | number of replacements
//
int CScintillaWnd::ReplaceAll(
                              LPCSTR szFind, 
                              LPCSTR szReplace, 
                              BOOL bUseSelection)
{
   int nCount = 0;
// different branches for replace in selection or total file
   if (bUseSelection)
   {
//    get starting selection range
      long lLen = 0;
      long lStart = GetSelectionStart();
      long lEnd = GetSelectionEnd();
//    set target to selection
      SendMessage(SCI_SETTARGETSTART, lStart);
      SendMessage(SCI_SETTARGETEND, lEnd);
//    try to find text in target for the first time
       long lPos = SendMessage(SCI_SEARCHINTARGET, strlen(szFind), (long)szFind);
//    loop over selection until end of selection reached - moving the target start each time
      while (lPos < lEnd && lPos >= 0)
      {
         if (m_nSearchflags & SCFIND_REGEXP) // check for regular expression flag
            lLen = SendMessage(SCI_REPLACETARGETRE, strlen(szReplace), (long)szReplace);
         else
            lLen = SendMessage(SCI_REPLACETARGET, strlen(szReplace), (long)szReplace);
//       the end of the selection was changed - recalc the end
         lEnd = GetSelectionEnd();
//       move start of target behind last change and end of target to new end of selection
         SendMessage(SCI_SETTARGETSTART, lPos+lLen);
         SendMessage(SCI_SETTARGETEND, lEnd);
//       find again - if nothing found loop exits
          lPos = SendMessage(SCI_SEARCHINTARGET, strlen(szFind), (long)szFind);
         nCount++;
      }
   }
   else
   {
//    start with first and last char in buffer
      long lLen = 0;
      long lStart = 0;
      long lEnd = SendMessage(SCI_GETTEXTLENGTH, 0, 0);
//    set target to selection
      SendMessage(SCI_SETTARGETSTART, lStart, 0);
      SendMessage(SCI_SETTARGETEND, lEnd, 0);
//    try to find text in target for the first time
       long lPos = SendMessage(SCI_SEARCHINTARGET, strlen(szFind), (long)szFind);
//    loop over selection until end of selection reached - moving the target start each time
      while (lPos < lEnd && lPos >= 0)
      {
         if (m_nSearchflags & SCFIND_REGEXP) // check for regular expression flag
            lLen = SendMessage(SCI_REPLACETARGETRE, strlen(szReplace), (long)szReplace);
         else
            lLen = SendMessage(SCI_REPLACETARGET, strlen(szReplace), (long)szReplace);
//       the end of the selection was changed - recalc the end
         lEnd = SendMessage(SCI_GETTEXTLENGTH, 0, 0);;
//       move start of target behind last change and end of target to new end of buffer
         SendMessage(SCI_SETTARGETSTART, lPos+lLen);
         SendMessage(SCI_SETTARGETEND, lEnd);
//       find again - if nothing found loop exits
          lPos = SendMessage(SCI_SEARCHINTARGET, strlen(szFind), (long)szFind);
         nCount++;
      }
   }
   return nCount;
}
Пока что не получается даже обычный поиск:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Var
   lLen,lStart,lEnd,lPos: Integer;
   szFind,szReplace: String;
 
begin
 
   szFind:='<!--*';
   szReplace:='<!--';
 
   lLen := 0;
   lStart := 0;
   lEnd := SendMessage(Npp.NppData.ScintillaMainHandle, SciSupport.SCI_GETTEXTLENGTH, 0, 0);
   // set target to selection
   SendMessage(Npp.NppData.ScintillaMainHandle, SciSupport.SCI_SETTARGETSTART, lStart, 0);
   SendMessage(Npp.NppData.ScintillaMainHandle, SciSupport.SCI_SETTARGETEND, lEnd, 0);
   // try to find text in target for the first time
   lPos := SendMessage(Npp.NppData.ScintillaMainHandle, SciSupport.SCI_SEARCHINTARGET, length(szFind), LPARAM(PChar(szFind)));
 
   ...
 
end;
lEnd находится, а вот lPos нет...
Можете помочь ?
Все используемые SCI_* функции описаны здесь: http://www.scintilla.org/ScintillaDoc
0
Пытливый
1381 / 692 / 249
Регистрация: 29.05.2013
Сообщений: 3,120
07.08.2016, 20:53 9
А чем вас не устраивает плагин XML Tools который сам N++ предлагает загрузить? Там тоже есть форматирование с отступами по узлам документа. Да и поиск ничем не ограничен.
0
Ariomex
0 / 0 / 0
Регистрация: 17.07.2016
Сообщений: 42
08.08.2016, 20:47  [ТС] 10
Пытливый, там нет вывода XML в TreeView.

Добавлено через 23 часа 49 минут
UPD
Справился сам:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
   Var
    lLen,lStart,lEnd,lPos: Integer;
    szFind,szReplace: AnsiString;
 
   ...
 
 
      szFind:=[что ищем];
      szReplace:=[на что заменяем];
 
      lLen := 0;
      lStart := 0;
      lEnd := SendMessage(Npp.NppData.ScintillaMainHandle, SciSupport.SCI_GETTEXTLENGTH, 0, 0);
      SendMessage(Npp.NppData.ScintillaMainHandle, SciSupport.SCI_SETTARGETSTART, lStart, 0);
      SendMessage(Npp.NppData.ScintillaMainHandle, SciSupport.SCI_SETTARGETEND, lEnd, 0);
        lPos := SendMessage(Npp.NppData.ScintillaMainHandle, SciSupport.SCI_SEARCHINTARGET, length(szFind), LPARAM(PChar(szFind)));
     while ( (lPos<lEnd) and (lPos>0) ) do
      begin
         lLen := SendMessage(Npp.NppData.ScintillaMainHandle, SciSupport.SCI_REPLACETARGETRE, length(szReplace), LPARAM(PChar(szReplace)));
         lEnd := SendMessage(Npp.NppData.ScintillaMainHandle, SciSupport.SCI_GETTEXTLENGTH, 0, 0);
         SendMessage(Npp.NppData.ScintillaMainHandle, SciSupport.SCI_SETTARGETSTART, lPos+lLen, 0);
         SendMessage(Npp.NppData.ScintillaMainHandle, SciSupport.SCI_SETTARGETEND, lEnd, 0);
         lPos := SendMessage(Npp.NppData.ScintillaMainHandle, SciSupport.SCI_SEARCHINTARGET, length(szFind), LPARAM(PChar(szFind)));
      end;
0
08.08.2016, 20:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2016, 20:47

Получить все hwnd окон класса Notepad
Есть способ лучше этого? var i, k, n: integer; wnd: hwnd; begin ...

В Notepad++ под wine плагин NppFTP пишет "Unable to connect"
Система - ubuntu 12.04 classic remix. Пробовал с разными серверами, в консоли...

Плагин Notepad
Здравствуйте. Имеется плагин, который добавляет кнопку запуска блокнота,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru