Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Общие вопросы о Flash (не затрагивающие ActionScript) (http://www.flasher.ru/forum/forumdisplay.php?f=60)
-   -   [FD] Удаление лишних пробелов (http://www.flasher.ru/forum/showthread.php?t=152477)

Aloran 18.03.2011 10:29

[FD] Удаление лишних пробелов
 
Подскажите как настроить FD, так что бы, при сохранении файла, удалялись все лишние пробелы?
Что бы данный код:
Код AS3:

....
    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");............
    }
....

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

 
    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.


Часовой пояс GMT +4, время: 20:15.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.