Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 267
Joined: Mon Mar 12, 2007 3:45 pm

Post by [Yustas.NeO] »

Подскажите, пожалуйста, можно ли как-то через скрипт изменить размер табуляции? Я хочу подвесить на хоткей...

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

[Yustas.NeO]
И что, постоянно дёргать? Это ж настройки постоянно будут изменяться!
Зачем это?

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Зачем это?
Человек нужно. Он же остальных не заставляет.
[Yustas.NeO], нашел способ как взять только в (P)MDI режимах(см AkelDll.h), но изменять пока не получится.

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

FeyFre wrote:Человек нужно. Он же остальных не заставляет.
Я не перекрещиваю)) Мне интересно для чего? А вдруг что-то мега-полезное, так чего бы и самому не пользоваться? :D

Offline
Posts: 267
Joined: Mon Mar 12, 2007 3:45 pm

Post by [Yustas.NeO] »

Ну, например, я привык к размеру табуляции 4, а файлы *.coder сохранены с размером 8 - вот и хотел для оперативности повесить на хоткей...
Может тогда есть еще какой-нибудь способ?

Offline
Posts: 267
Joined: Mon Mar 12, 2007 3:45 pm

Post by [Yustas.NeO] »

С помощью скрипта нужно ближайшую вверх по тексту "единичку" заменить на "двойку", а ближайшую вниз по тексту "тройку" заменить на "четверку".

Пишу:
var nSelStart=AkelPad.GetSelStart();
var nSelEnd=AkelPad.GetSelEnd();
AkelPad.SetSel(nSelStart, nSelStart);
q=AkelPad.TextReplace(AkelPad.GetEditWnd(), '1', '2', 0x00100000, false);
AkelPad.SetSel(nSelEnd, nSelEnd);
a=AkelPad.TextReplace(AkelPad.GetEditWnd(), "3", "4", 0x00000001, false);
AkelPad.MessageBox(AkelPad.GetMainWnd(), q+ ' : ' + a, "", 64 /*MB_ICONINFORMATION*/);


Вбиваю текст:
1313131313131313131313

Итого:
q и w вроде бы возвращаются не нулевые, а заменять ничего не заменяет :( Я, может, неправильно понял назначение этих операторов?

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

[Yustas.NeO] wrote:Ну, например, я привык к размеру табуляции 4, а файлы *.coder сохранены с размером 8 - вот и хотел для оперативности повесить на хоткей...
Может тогда есть еще какой-нибудь способ?
Размер табуляции, если это табуляция, роли не играет. Если у меня я ставил табы размером 8, то у Вас они же будут отображаться размером 4.

Если это не табуляция (у того, кто редактировал файл, стоит галка "Пробелы"), тогда можно сделать замену. Т.е. заменить 4 пробела на 1 символ табуляции. Для этого подойдёт скрипт SpacesToTabs.js. Вызываете диалог, задаёте 4.

Если всё же табуляции, тогда значит надо их уменьшить вдвое, т.е. примитивный скрипт (можно написать настраиваемый):

Code: Select all

AkelPad.SetSel(0, -1);
pContent = AkelPad.GetSelText();
pContent = pContent.replace(/\t\t/g, "\t");
AkelPad.ReplaceSel(pContent);

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

[Yustas.NeO] wrote:С помощью скрипта нужно ближайшую вверх по тексту "единичку" заменить на "двойку", а ближайшую вниз по тексту "тройку" заменить на "четверку".

Пишу:
var nSelStart=AkelPad.GetSelStart();
var nSelEnd=AkelPad.GetSelEnd();
AkelPad.SetSel(nSelStart, nSelStart);
q=AkelPad.TextReplace(AkelPad.GetEditWnd(), '1', '2', 0x00100000, false);
AkelPad.SetSel(nSelEnd, nSelEnd);
a=AkelPad.TextReplace(AkelPad.GetEditWnd(), "3", "4", 0x00000001, false);
AkelPad.MessageBox(AkelPad.GetMainWnd(), q+ ' : ' + a, "", 64 /*MB_ICONINFORMATION*/);


Вбиваю текст:
1313131313131313131313
Try this:
var nSelStart=AkelPad.GetSelStart();
var nSelEnd=AkelPad.GetSelEnd();
AkelPad.SetSel(nSelStart, nSelStart);
q=AkelPad.TextReplace(AkelPad.GetEditWnd(), "1", "2", 0x00100000, true);
AkelPad.SetSel(nSelEnd, nSelEnd);
a=AkelPad.TextReplace(AkelPad.GetEditWnd(), "3", "4", 0x00000001, true);
AkelPad.MessageBox(AkelPad.GetMainWnd(), q+ ' : ' + a, "", 64 /*MB_ICONINFORMATION*/);

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

[Yustas.NeO] wrote:...
a=AkelPad.TextReplace(AkelPad.GetEditWnd(), "3", "4", 0x00000001, false);
...
UI-примочки надо использовать в крайнем случае, это хороший тон.
Разобраться можно, но мне лень)))

Code: Select all

pContent = AkelPad.GetSelText();
pContent = pContent.replace(/1/, "2");
pContent = pContent.replace(/3/, "4");
AkelPad.ReplaceSel(pContent);

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Code: Select all

AkelPad.SetSel(nSelStart, nSelStart);
=>

Code: Select all

AkelPad.SetSel(nSelStart, nSelStart+1);

Code: Select all

AkelPad.SetSel(nSelEnd, nSelEnd);
=>

Code: Select all

AkelPad.SetSel(nSelEnd, nSelEnd+1);
То есть если аргументы SetSel одинаковы то выделение пустое(только курсор туда установится). Т.е. с этими исправлениями у Вас будет выделен 1 символ(Только зачем это нужно в контексте задачи я не понял). Справка пишет:
Start position - number of first selected character
End position - number of first non-selected character immediately after selection
А если подумать, то для ближайшей вверх Вам нужно делать выделение

Code: Select all

AkelPad.SetSel(0, nSelStart);
а для ближайшей вниз

Code: Select all

AkelPad.SetSel(nSelEnd, -1);

Offline
Posts: 267
Joined: Mon Mar 12, 2007 3:45 pm

Post by [Yustas.NeO] »

KDJ wrote:q=AkelPad.TextReplace(AkelPad.GetEditWnd(), "1", "2", 0x00100000, true);
a=AkelPad.TextReplace(AkelPad.GetEditWnd(), "3", "4", 0x00000001, true);
Thanks, but i need to replace only nearest, not all.

FeyFre wrote:(Только зачем это нужно в контексте задачи я не понял)
Это нужно чтобы учесть и выделение и просто постановку курсора, и заменить ближайшие вверх-вниз символы.
Тоесть, если есть выделение (красным отмечено то, что выделено):
131313131313
То третий символ должен стать "2", а десятый "4".
А если есть курсор (он красный)
131313|131313
То пятый символ должен стать "2", а восьмой - "4".

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

[Yustas.NeO] wrote:
FeyFre wrote:(Только зачем это нужно в контексте задачи я не понял)
Это нужно чтобы учесть и выделение и просто постановку курсора, и заменить ближайшие вверх-вниз символы.
...
А для чего это всё? :)

Offline
Posts: 267
Joined: Mon Mar 12, 2007 3:45 pm

Post by [Yustas.NeO] »

VladSh wrote:Если у меня я ставил табы размером 8, то у Вас они же будут отображаться размером 4.
Да, но при этом потеряется табличный вид. Вот и приходится каждый раз менять туда-сюда.

VladSh wrote:pContent = pContent.replace(/1/, "2");
Я правильно понимаю, что replace() заменяет только первое вхождение?

VladSh wrote:А для чего это всё? :)
Тренируюсь :)
В данном случае пытаюсь написать скрипт комментирования строк задействованных в выделении.

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

[Yustas.NeO] wrote:Да, но при этом потеряется табличный вид. Вот и приходится каждый раз менять туда-сюда.
Потому и говорю - лучше обработать скриптом под себя 1 раз.

[Yustas.NeO] wrote:

Code: Select all

pContent = pContent.replace(/1/, "2");
Я правильно понимаю, что replace() заменяет только первое вхождение?
Такая запись - да.
По всему тексту будет так:

Code: Select all

pContent = pContent.replace(/1/g, "2");
[Yustas.NeO] wrote:В данном случае пытаюсь написать скрипт комментирования строк задействованных в выделении.
Уже написаны: CommentsAdd.js и toggleComments.js.
Last edited by VladSh on Tue Aug 03, 2010 2:32 pm, edited 2 times in total.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

[Yustas.NeO] wrote:Thanks, but i need to replace only nearest, not all.
Sorry, I misunderstood.
I guess your problem solved:

Code: Select all

var nSelStart=AkelPad.GetSelStart();
var nSelEnd=AkelPad.GetSelEnd();
AkelPad.SetSel(nSelStart, nSelStart);
var q=AkelPad.TextReplace(AkelPad.GetEditWnd(), "1", "2", 0x00100000, false);
if (q > -1)
	AkelPad.TextReplace(AkelPad.GetEditWnd(), "1", "2", 0x00500000, false);
AkelPad.SetSel(nSelEnd, nSelEnd);
var a=AkelPad.TextReplace(AkelPad.GetEditWnd(), "3", "4", 0x00000001, false);
if (a > -1)
	AkelPad.TextReplace(AkelPad.GetEditWnd(), "3", "4", 0x00400001, false);
AkelPad.SetSel(nSelStart, nSelEnd);
Locked