PDA

Просмотр полной версии : [FD] Удаление лишних пробелов


Aloran
18.03.2011, 10:29
Подскажите как настроить FD, так что бы, при сохранении файла, удалялись все лишние пробелы?
Что бы данный код:

....
private function function1():uint
{
var var1:uint = 0;....
var var2:uint = 1;
........
return var1 + var2;
}
....
private function function2():void....
{
var var1:uint = function1();
........
function3(var1, "string");............
}
....

превратился в такой:


private function function1():uint
{
var var1:uint = 0;
var var2:uint = 1;

return var1 + var2;
}

private function function2():void
{
var var1:uint = function1();

function3(var1, "string");
}



. - пробел который надо удалить
P.S.: код написан от балды =)

iNils
18.03.2011, 12:10
Добавьте в меню новый макрос LiteFormat.cs
using System;
using PluginCore;
using System.Text.RegularExpressions;

public class LiteFormat {
public static void Execute () {
ScintillaNet.ScintillaControl sci = PluginBase.MainForm.CurrentDocument.SciControl;
if (sci == null) {
/// document not editable
return;
}
/// WARNING: reading/writing sci.Text property is slow
string src = sci.Text;
src = new Regex (@"( )(?<!\r\n)").Replace (src, " ");
src = new Regex (@"\r\n([\t ]+)?\r\n").Replace (src, "\r\n");
src = new Regex (@"( +)?\r\n(\t+)?{").Replace (src, " {");
src = new Regex (@"}\r\n([\t ]+)?(catch|else|finally)").Replace (src, "} $2");
src = new Regex (@"}([\t ]*)(else|finally)([\t ]*){").Replace (src, "} $2 {");
src = new Regex (@"([\w\d$])\(").Replace (src, "$1 (");
sci.Text = src;
}
}

Запускается через ExecuteScript|Development;$(BaseDir)\Macros\LiteFormat.cs

В принципе, вам нужны только первые два Regex, они отвечают за пробелы и пустые строки.
Следующие три за положение {} на одной строке, а не на новой.
Последний ставит пробел между именем метода и ()

Aloran
18.03.2011, 13:12
Что то не выходит.
- создаю LiteFormat.cs с вашим кодом
- сохраняю его в $(BaseDir)\Macros\LiteFormat.cs, где $(BaseDir) корень FD
- ctrl+F10 в FD, создаю новый макрос
- открываю entries нового макроса и пишу туда ExecuteScript|Development;$(BaseDir)\Macros\LiteFormat.cs
- юзаю этот макрос в файле и ничего не происходит

что я делаю не так?

iNils
18.03.2011, 14:05
А другие макросы работают?
Данный макрос рабочий, сам для себя делал, чтобы делать код читабельным.

Aloran
18.03.2011, 14:16
Разобрались... дело в том что у нас в классах конец строки только LF.
Пришлось кое что изменить, вот наш рабочий макрос:

using System;
using PluginCore;
using System.Text.RegularExpressions;

public class LiteFormat
{
public static void Execute ()
{
ScintillaNet.ScintillaControl sci = PluginBase.MainForm.CurrentDocument.SciControl;
if (sci == null)
{
/// document not editable
return;
}

/// WARNING: reading/writing sci.Text property is slow
string src = sci.Text;
src = new Regex (@"\t", RegexOptions.Multiline).Replace (src, " ");
src = new Regex (@" +$", RegexOptions.Multiline).Replace (src, "");
sci.Text = src;
}
}

Вопрос теперь в том как сделать так, что бы сей макрос работал всегда перед сохранением, а не только от хоткеев?

iNils
18.03.2011, 14:33
дело в том что у нас в классах конец строки только LF.Ааа ) Я то работают с \r\n :)

Легко :) Написать макрос, который вызывает этот макрос и делает сохранение, а потом отобрать Control|S у Label.Save в MainMenu.xml и назначить его этому макросу)

Aloran
18.03.2011, 18:16
спасибо большое iNils !!!

Добавлено через 18 часов 46 минут
iNils вдогонку еще один маленький вопрос: какой код надо дописать в макрос, что бы курсор остался на прежнем месте, а не убегал в начало файла? (а то с С# я не дружу)

iNils
20.03.2011, 10:04
какой код надо дописать в макрос, что бы курсор остался на прежнем месте, а не убегал в начало файла? (а то с С# я не дружу)Я так понимаю, что строки пустые вы не удаляете?

Aloran
20.03.2011, 12:29
нет не удаляю, т.к. они служат для визуального разделения блоков кода внутри функций

iNils
20.03.2011, 22:36
Значит так. Запоминаем текущую строку перед заменой.
int line = sci.LineFromPosition(sci.CurrentPos);
Потом, после установки текста, ее возвращаем.
sci.Text = src;
sci.GotoLine (line);
Но! Курсор будет в начале строки. Почему? Потому, что у нас будут изменения в числе общих символов (например табы на пробелы сменили), и чтобы позиционировать курсор по символам, надо будет производить ряд манипуляций, по запоминанию текста строки и восстановлении по нему позиции, а мне сейчас эти делать лень :)
Если вам нужно точное восстановление позиции, то скачайте исходники FD, найдите там файл trunk\FD3\PluginCore\ScintillaNet\ScintillaControl.cs и получите все методы и свойства Scintilla.

Aloran
20.03.2011, 23:55
Спасибо!!! Этого за глаза достаточно!!! Удивляет одно почему сей функционал не заложен в сам FD?

iNils
21.03.2011, 01:46
Есть какой-то плагин по форматированию. В FD4 я видел, что что-то подобное встроено в сам FD, но его возможности мне не понравились, слишком скудно. В MS VS, система форматирования более гибкая и наглядная, меняешь параметр и тебе сразу показывают пример воздействия. Вообще, раньше в Flash IDE был простой, но надежный форматер, после выхода AS3, он не выдерживает ни какой критики. Сдается мне, что причина этого в E4X, там код пишется вперемешку с xml и порой легко запутаться, код это или часть xml. Специально придумывал примеры, когда один и тот же код воспринимался компилятором по разному в зависимости от наличия пробелов или переноса строк.

Aloran
21.03.2011, 01:51
В том же FDT все это есть... По крайней мере мой коллега периодически ухмыляется, глядя на FD слегка с высока =))) При парном программировании он оценил только автокомплит =))

iNils
21.03.2011, 03:19
Если послушать фдтшников, они только и занимаются рефакторингом, форматированием и тп:) А на самом деле, это лишь вспомогательные фишки. Тот же автокомплит гораздо более важен, потому что используется почти на каждому шагу. При том, что FD уже сделал большие шаги в эту сторону.

Но это уже холивар ) А если смотреть объективно, то тут большую роль играет собственное ощущение удобства и нужности той или иной фичи.

Возьмем тот же MS VS. Плагины для FD я пишу именно за его версией для C# (Microsoft Visual C# 2008 Express Edition, причем бесплатной). Сижу на нем уже 2 года, но... за это время я так и не смог привыкнуть к самому набору кода. Той части, где находится мой курсор и где я стучу клавишами. Он для меня неудобен. Как и FDT, как FB. Их поведение в ряде операций, противоречит моему пониманию и это перечеркивает все остальные их плюсы. А вот FD для меня самое то. Вернее не сам FD, а движок редактора, который он использует - Scintilla. Вот в нем я летаю и порхаю. Познакомился я с ним в SciTE, 7 лет назад. И когда перешел на as2, мой выбор пал на FD. Рассматривал я тогда разные редакторы, в том числе и FDT, но он сидит на Eclipse, как и FB, а вот FD оказался на Scintilla и я сразу на в нем освоился. А "начав" писать для него плагины, я познакомился и с C#.

Короче. Надо попробовать все и работать там, где будет удобно. А к тем кто смотрит с высока на твой выбор, надо подходить с сочувствием, они не способны воспринимать чужие взгляды и не поэтому не выходят за рамки своего Я.