на маленьком текстовом документе - скрипт свою работу сделал, но AkelPad вылетел в ошибку что память не получается прочитать и всё, AkelPad только закрыть остается... что опять не так!? может из-за WinXP?
Posted: Tue Mar 08, 2016 8:59 pm
by Kley
InFive
Вернул, пока (наверное), все, как было. Попробуйте. Сейчас, вроде, работает.
Skif_off
Простите, не прокатил вариант. Почти постоянное сообщение, особенно на XP:
AppName akelpad.exe AppVer 4.9.7.0 ModName lineboard.dll Offset 000042a4 ModVer 12.4.0.0
Может Instructor подскажет, что к чему.
Posted: Tue Mar 08, 2016 9:05 pm
by Skif_off
Kley
Это та ссылка с Version: 2015-01-04 или есть где-то в коллекции? На предыдущей странице вижу только закомментированную строку
InFive
На WinXP SP2/SP3, 4.9.7 и 4.9.8, оригинальный скрипт Kley (Version: 2015-01-04), дополненный - нет проблем. (У меня английская версия с Russian.dll, но не думаю, что это имеет значение).
// ============================================================================
// Version: 2015-01-04
// Author: Kley
//
// *** Удаление строк содержащих/не содержащих выделенную фразу ***
//
// Параметры:
// -toempty=1 -действие со строкой:
// 0 удаление (по умолчанию);
// 1 замена на пустую.
// -nophrase=1 -поиск строк по содержимому:
// 0 строки с фразой (по умолчанию);
// 1 строки без фразы.
// -ignorecase=1 -метод сравнения строк:
// 0 с учетом регистра (по умолчанию);
// 1 без учета регистра.
// -clipboard=1 -фраза (текст для поиска):
// 0 выделенный текст (по умолчанию);
// 1 текст из буфера обмена.
//
// Применение:
// Заменить строки с фразой из буфера на пустую
// Call("Scripts::Main", 1, "DeletePhrasesInText.js", "-toempty=1 -clipboard=1 -ignorecase=1")
// Удалить строки не содержащие фразу (с учетом регистра)
// Call("Scripts::Main", 1, "DeletePhrasesInText.js", "-nophrase=1")
//
// Примечание:
// Поиск и замена ведется во всем тексте
// ============================================================================
var argClipBoard = AkelPad.GetArgValue("clipboard", 0);
var argEmptyString = AkelPad.GetArgValue("toempty", 0);
var argNoPhrase = AkelPad.GetArgValue("nophrase", 0);
var argIgnoreCase = AkelPad.GetArgValue("ignorecase", 0);
var hWndEdit = AkelPad.GetEditWnd();
var nSelStart = AkelPad.GetSelStart();
var pEditText = AkelPad.GetTextRange(0, -1);
var aText;
var aNewText = []; // добавлять в новый массив быстрее, чем удалять из существующего.
var pSearchText;
var pCurLine;
var bFaind = false;
if (hWndEdit)
{
pSearchText = (argClipBoard != 0)
? AkelPad.GetClipboardText()
: AkelPad.GetSelText();
if (pEditText && pSearchText)
{
pSearchText = GetIgnoreCase(pSearchText);
aText = pEditText.split("\r");
for (var i = 0; i < aText.length; i++)
{
pCurLine = GetIgnoreCase(aText[i]);
if (argNoPhrase != 0)
bFaind = pCurLine.indexOf(pSearchText) == -1;
else
bFaind = pCurLine.indexOf(pSearchText) != -1;
AddInNewArrey(aText[i], bFaind);
}
pEditText = aNewText.join("\n");
ScrollLock(hWndEdit, true);
SetRedraw(hWndEdit, false);
AkelPad.SetSel(0, -1);
AkelPad.ReplaceSel(pEditText);
AkelPad.SetSel(nSelStart, nSelStart);
ScrollLock(hWndEdit, false);
SetRedraw(hWndEdit, true);
}
}
function AddInNewArrey(sTxt, bEmpty)
{
if (bEmpty)
{
if (argEmptyString != 0)
aNewText.push("");
}
else
aNewText.push(sTxt);
}
function GetIgnoreCase(sTxt)
{
return (argIgnoreCase != 0) ? sTxt.toLowerCase() : sTxt;
}
function SetRedraw(hWnd, bRedraw)
{
AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
if (bRedraw) AkelPad.SystemFunction().Call("user32::InvalidateRect", hWnd, 0, true);
}
function ScrollLock(hWnd, bLock)
{
AkelPad.SendMessage(hWnd, 3185 /*AEM_LOCKSCROLL*/, 3 /*SB_BOTH*/, bLock);
}
: добавлена ScrollLock() и чуть отформатирован код (из эстетических соображений )
Добавлено:
Ага, спровоцировал: нужно сразу после дёрнуть вниз полосу прокрутки как можно ниже - там, где строк уже нет - валится.
Добавлено:
Если отключить плаг LineBoard - не валится.
Posted: Tue Mar 08, 2016 10:50 pm
by InFive
Kley wrote:InFive
Вернул, пока (наверное), все, как было. Попробуйте. Сейчас, вроде, работает.
да, вот такой вариант у меня работает...
Skif_off
лично у меня, ваш вариант валит AkelPad, с отключенным плагином да, работает, но я оставил пока вариант Kley, а плагин LineBoard оставил включенным...
Posted: Wed Mar 09, 2016 4:55 pm
by Kley
Skif_off wrote:Это та ссылка с Version: 2015-01-04 или есть где-то в коллекции?
Добавил DeletePhrasesInText.js в "Scripts collection".
Может кому понадобится. И путаницы меньше.
Posted: Wed Mar 09, 2016 11:06 pm
by Skif_off
Любопытно, подумал, что у AEM_LOCKSCROLL трудности в WinXP (воспроизвёл проблему и с 4.9.6, ниже не пробовал), но в FindReplaceEx.js тоже используется - нет падений.
В Win7 пока оставил (чтобы и не забыть в т.ч.): если
сразу после дёрнуть вниз полосу прокрутки как можно ниже - там, где строк уже нет
постараться до конца документа - выглядит так же, только не валится. Как будто AkelPad слишком долго "убирает" то пространство в конце документа, которое остаётся после удаления строк. И WM_SETREDRAW и AEM_LOCKSCROLL по отдельности не роняют.
В общем, подождём Instructor
Posted: Thu Mar 10, 2016 11:15 am
by InFive
Skif_off wrote:скрипт Andrey_A_ADeletePhrasesInText.vbs не работает уже несколько версий AkelPad
по моему обращению, Andrey_A обновил свой скрипт DeletePhrasesInText.vbs... кому он нужен, надо обновить вручную этот скрипт по указанной ссылке
Posted: Thu Mar 10, 2016 12:50 pm
by Skif_off
InFive
Там необходима регистрация. Здесь всё ещё старая версия.
' DeletePhrasesInText.vbs
'======================== Описание =====================================
' Удаление/замещение строк содержащих/не содержащих фразу в выделенном. А так же добавление к найденным строкам...
' (если ничего не выделено преобразовывается весь текст)
' В диалоговом окне вводится фраза для поиска удаления строк
' При втором параметре =2 выделенное является фразой, строки ищутся во всём тексте
'======================= Параметры ======================================
' 1-й параметр:
' 0 - замещение пустой строкой строк содержащих фразу с учётом регистра (по умолчанию)
' 1 - замещение пустой строкой строк содержащих фразу без учёта регистра
' 2 - удаление строк содержащих фразу с учётом регистра
' 3 - удаление строк содержащих фразу без учёта регистра
'
' 4 - замещение пустой строкой строк НЕ содержащих фразу с учётом регистра
' 5 - замещение пустой строкой строк НЕ содержащих фразу без учёта регистра
' 6 - удаление строк НЕ содержащих фразу с учётом регистра
' 7 - удаление строк НЕ содержащих фразу без учёта регистра
'
'
' 8 - добавление в начало строк содержащих фразу с учётом регистра (по умолчанию)
' 9 - добавление в начало строк строк содержащих фразу без учёта регистра
' 10 - добавление в начало строк строк НЕ содержащих фразу с учётом регистра
' 11 - добавление в начало строк НЕ содержащих фразу без учёта регистра
' (вставка берётся из условий 3-го параметра)
'
' 12 - добавление в конец строк содержащих фразу с учётом регистра (по умолчанию)
' 13 - добавление в конец строк строк содержащих фразу без учёта регистра
' 14 - добавление в конец строк строк НЕ содержащих фразу с учётом регистра
' 15 - добавление в конец строк НЕ содержащих фразу без учёта регистра
' (вставка берётся из условий 3-го параметра)
'
'
' 2-й параметр:
' 0 - фраза берётся из буфера
' 1 - фразой является слово под курсором
' 2 - фразой является выделенное
' 3 - фраза вводится в диалоге
' "фраза" - в параметре прописывается фраза для поиска
'
' 3-й параметр: текст для вставки
' 0 - текст берётся из буфера
' 1 - текст является слово под курсором
' 2 - текст является выделенное
' 3 - текст вводится в диалоге
' "текст" - в параметре прописывается текст для вставки
'
'======================== Примеры ======================================
' -"Замещение строк содержащих выделенную фразу (учитывать регистр)" Call("Scripts::Main", 1, "DeletePhrasesInText.vbs", `0 2`)
' -"Замещение строк содержащих выделенную фразу (без регистра)" Call("Scripts::Main", 1, "DeletePhrasesInText.vbs", `1 2`)
' -"Вставить текст в начало найденных строк, содержащих фразу (фраза и текст вводится диалогах)" Call("Scripts::Main", 1, "DeletePhrasesInText.vbs", `9 3 3`)
' используется Functions.vbs, который следует положить в ...AkelFiles\Plugs\Scripts\Include\
' Автор: Аверин Андрей
' Версия: 1.8 (07.06.2012 - 10.03.2016)
' Mail: Averin-And@yandex.ru
' Site: http://tc-image.3dn.ru/forum/9-494-2010-16-1339069198
'===========================================================================
With AkelPad If .GetEditWnd = 0 Then WScript.Quit
.Include("Functions.vbs") : Sum = 0 : RG = 0 : A = 0 : S = 1 : V = 0 : Curs = .GetSelStart : Text = .GetSelText : sText = Text
Cnt = WScript.Arguments.Count
If Cnt > 0 Then
RG = CInt(WScript.Arguments(0))
If Cnt > 1 Then
P = WScript.Arguments(1) : S = 0
Select Case P
Case "0" FStr = .GetClipboardText
Case "1" FStr = GetWord : Text = ""
Case "2" FStr = sText : Text = ""
Case "3" S = 1
Case Else FStr = P
End Select
If Cnt > 2 Then
P = WScript.Arguments(2)
Select Case P
Case "0" sLine = .GetClipboardText
Case "1" sLine = GetWord : Text = ""
Case "2" sLine = sText : Text = ""
Case "3" V = 1
Case Else sLine = P
End Select
End If
End If
End If
Select Case RG
Case 0, 1 T1 = "Замещение строк" : S1 = "Введите фразу для поиска строк. Пустой строкой" & vb & "будут заменены строки, в которых есть эта фраза."
Case 4, 5 T1 = "Замещение строк" : S1 = "Введите фразу для поиска строк. Пустой строкой" & vb & "будут заменены строки, в которых нет этой фразы."
Case 2, 3 T1 = "Удаление строк" : S1 = "Введите фразу для поиска строк." & vb & "Будут удалены строки, в которых есть эта фраза."
Case 6, 7 T1 = "Удаление строк" : S1 = "Введите фразу для поиска строк." & vb & "Будут удалены строки, в которых нет этой фразы."
Case 8, 9 T1 = "Вставка в начало строк" : S1 = "Введите фразу для поиска строк. В начало строк, в" & vb & "которых есть эта фраза, будет вставлен заданный текст."
Case 10, 11 T1 = "Вставка в начало строк" : S1 = "Введите фразу для поиска строк. В начало строк, в" & vb & "которых нет этой фразы, будет вставлен заданный текст."
Case 12, 13 T1 = "Вставка в конец строк" : S1 = "Введите фразу для поиска строк. В конец строк, в" & vb & "которых есть эта фраза, будет вставлен заданный текст."
Case 14, 15 T1 = "Вставка в конец строк" : S1 = "Введите фразу для поиска строк. В конец строк, в" & vb & "которых нет этой фразы, будет вставлен заданный текст."
End Select
SetRedraw .GetEditWnd, False
If Len(Text) = 0 Then : Text = .GetTextRange(0, -1) : A = 1 : End If
If Len(Text) = 0 Then EndRedraw
If S = 1 Then
FStr = .InputBox(.GetMainWnd, T1, S1, "фраза")
If IsEmpty(FStr) Then EndRedraw
End If
If Len(FStr) = 0 Then EndRedraw
If V = 1 Then
sLine = .InputBox(.GetMainWnd, T1, "Введите текст для вставки в найденные строки", "текст")
If IsEmpty(sLine) Then EndRedraw
End If
If Cnt > 2 And Len(sLine) = 0 Then EndRedraw
If A = 1 Then cmd 4157
Txt = Split(Text, Chr(13)) : Txt2 = Txt
Select Case RG : Case 1, 3, 5, 7, 9, 11, 13, 15 Txt2 = Split(LCase(Text), Chr(13)) : FStr = LCase(FStr) : End Select
C = Ubound(Txt)
For k = 0 To C
Select Case RG
Case 0, 1, 2, 3
If InStr(Txt2(k), FStr) = 0 Then
T = T & Txt(k) : If k <> C Then T = T & vb
Else
If (RG = 0 Or RG = 1) And k <> C Then T = T & vb
End If
Case 4, 5, 6, 7
If InStr(Txt2(k), FStr) > 0 Then
T = T & Txt(k) : If k <> C Then T = T & vb
Else
If (RG = 4 Or RG = 5) And k <> C Then T = T & vb
End If
Case 8, 9
If InStr(Txt2(k), FStr) > 0 Then T = T & sLine & Txt(k) Else T = T & Txt(k) End If
If k <> C Then T = T & vb
Case 10,11
If InStr(Txt2(k), FStr) = 0 Then T = T & sLine & Txt(k) Else T = T & Txt(k) End If
If k <> C Then T = T & vb
Case 12,13
If InStr(Txt2(k), FStr) > 0 Then T = T & Txt(k) & sLine Else T = T & Txt(k) End If
If k <> C Then T = T & vb
Case 14,15
If InStr(Txt2(k), FStr) = 0 Then T = T & Txt(k) & sLine Else T = T & Txt(k) End If
If k <> C Then T = T & vb
End Select
Next
.SendMessage .GetEditWnd, 3185, 3, True
.ReplaceSel T : .SetSel Curs, Curs
SaveEditFile : EndRedraw
End With
Posted: Fri Mar 11, 2016 2:01 pm
by Cuprum
Instructor
Раскладка программно не меняется (зачем? Smile). Элемент управления EDIT стандартный.
Понятно. Значит, у меня какой-то особый случай
Posted: Fri Mar 11, 2016 7:36 pm
by KDJ
TextReplace_function.js
In ReplaceWith function added to array of parameters:
n2 - offset of first character matched text,
n3 - offset of last character matched text + 1.
TextReplace.js
Added:
- templates,
- context menu in edit controls What and With.
Posted: Fri Mar 11, 2016 11:51 pm
by YuS
KDJ wrote:
TextReplace.js
Added:
- templates,
- context menu in edit controls What and With.