Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: Majestio от Ноября 24, 2013, 18:12



Название: Плагин для Qt Creator 2.8.x
Отправлено: Majestio от Ноября 24, 2013, 18:12
Не хватает кастомных средств форматирования кода в редакторе. Вот задумался накидать свой плагин, ну и по возможности его дорабатывать. Не имея навыков в написании плагинов, разыскал в сети достаточно неплохую статью (http://"http://habrahabr.ru/post/135289/"), в которой большинство моментов прописано. Но потом "благодать Божыя" закончилась - не могу найти документацию по использованию интерфейса Core::IEditor.

А нужно всего лишь сделать четыре действия:

1) Определить выделенный блок (если точнее - номер первой и последней строки выделения)
2) Получить текст в выделенном блоке (о5 же, если точнее - группе строк)
3) Модифицировать нужным мне образом
4) Закинуть обратно в редактор

По пункту 4 - результирующих строк может быть как равно, так и меньше, и больше чем в "источнике".

Буду рад любой полезной инфе, ссылкам, примерам.


Название: Re: Плагин для Qt Creator 2.8.x
Отправлено: kai666_73 от Ноября 25, 2013, 10:29
Есть абстрактный класс уровнем пониже
Код:
class TEXTEDITOR_EXPORT ITextEditor : public Core::IEditor

Непонятно чем существующие средства форматирования кода не устраивают...


Название: Re: Плагин для Qt Creator 2.8.x
Отправлено: Majestio от Ноября 25, 2013, 10:51
Есть абстрактный класс уровнем пониже
Код:
class TEXTEDITOR_EXPORT ITextEditor : public Core::IEditor
А де про все эти классы прочитать?

Непонятно чем существующие средства форматирования кода не устраивают...

Пока хочется "научить" редактор выравнивать комментарии, которые в выделенном блоке стоят правее операторов. Например:

Код:
a = b + 1;        // Хороший комментарий
b = c + 1+34567;             // Комментарий "уехал не в туда"
d = 2;            // о5 хороший комментарий


Название: Re: Плагин для Qt Creator 2.8.x
Отправлено: alex312 от Ноября 25, 2013, 12:20
А де про все эти классы прочитать?
Боюсь что кроме исходников другой документации нет.


Название: Re: Плагин для Qt Creator 2.8.x
Отправлено: kai666_73 от Ноября 25, 2013, 13:25
Это точно, разбираться в исходниках, другого пути нету.
По поводу
Код:
ITextEditor
- искать в src/plugins/texteditor.
А смысл примерно такой: не всякий едитор текстовый, но если приведение типа к ITextEditor-у вернет не нулевой результат, то документ текстовый, и, собственно в распоряжении есть интерфейс для анализа и изменения текста.
Кстати, возможно, понадобится проверка на предмет является ли содержимое едитора сишным кодом.
Тогда надо анализировать его контекст, примерно так
Код:
if ( editor->context().contains(CppEditor::Constants::C_CPPEDITOR) ) {...}
Изучайте исходники, разбирайтесь... Успехов в общем.


Название: Re: Плагин для Qt Creator 2.8.x
Отправлено: Majestio от Ноября 25, 2013, 13:39
Пасип, спасибо за содействие!  :)


Название: Re: Плагин для Qt Creator 2.8.x
Отправлено: ViTech от Ноября 25, 2013, 14:22
Если нужно форматирование кода существующими решениями, то можно воспользоваться Uncrustify (http://uncrustify.sourceforge.net/). Можно настроить работу с ним в Qt Creator через "External Tools". На сочетание клавиш повесить форматирование всего файла или только выделенного фрагмента. Основная проблема: настроить файл конфигурации. Потому что настроек там очень много, и не всегда сразу понятно их влияние на конечный результат. Может пройти несколько дней, пока добьетесь нужного форматирования :).


Название: Re: Плагин для Qt Creator 2.8.x
Отправлено: Majestio от Ноября 25, 2013, 14:35
Если нужно форматирование кода существующими решениями, то можно воспользоваться Uncrustify (http://uncrustify.sourceforge.net/). Можно настроить работу с ним в Qt Creator через "External Tools". На сочетание клавиш повесить форматирование всего файла или только выделенного фрагмента. Основная проблема: настроить файл конфигурации. Потому что настроек там очень много, и не всегда сразу понятно их влияние на конечный результат. Может пройти несколько дней, пока добьетесь нужного форматирования :).

За совет - спасибо. Но не очень, если честно. Это как из пушки по воробьям :) Инструмент более мощный и более узконаправленный, чем мне надо. А то что я хочу, выполнять не будет. Там свой ограниченный функционал.


Название: Re: Плагин для Qt Creator 2.8.x
Отправлено: VPS от Ноября 27, 2013, 19:19
Пока хочется "научить" редактор выравнивать комментарии, которые в выделенном блоке стоят правее операторов.

Можно сделать как-то так:
Код:
bool AlignCommentsPlugin::initialize(const QStringList &arguments, QString *errorString)
{
   ...

   connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor *)),
   this, SLOT(editorChanged(Core::IEditor *)));

   ...

   return true;
}

void AlignCommentsPlugin::editorChanged(Core::IEditor *editor)
{
   m_editor = editor;
}

//метод, вызываемый при выборе пункта меню
void AlignCommentsPlugin::triggerAction()
{
   if(!m_editor)
   {
      return;
   }

   TextEditor::BaseTextEditorWidget *textEditorWidget = dynamic_cast<TextEditor::BaseTextEditorWidget *>(m_editor->widget());
   if(!textEditorWidget)
   {
      return;
   }

   QTextCursor cursor = textEditorWidget->textCursor();
   QTextDocumentFragment formattedTextFragment = cursor.selection();
   QString text = formattedTextFragment.toPlainText();

   //---------------------------------------------------------------------------
   const TextEditor::TabSettings &tabSettings = textEditorWidget->tabSettings();
   int tabSize = tabSettings.m_tabSize;

   QString spaces = QString(QLatin1Char(' ')).repeated(tabSize);
   text.replace(QRegExp(QLatin1String("\t")), spaces);
   //---------------------------------------------------------------------------

   if(text.isEmpty())
   {
      return;
   }

   //alignCommentsInText - метод, выполняющий парсинг выделенной строки, и выравнивание комментариев.
   if(alignCommentsInText(text))
   {
      cursor.insertText(text);
   }
}

П.С.: если нужен исходник, то могу выложить.


Название: Re: Плагин для Qt Creator 2.8.x
Отправлено: Majestio от Ноября 27, 2013, 19:42
Можно ещё сделать как-то так:

Пасип конешно, но времени пока нет, просто ппц. Этот плагин - пока в моих мечтах. Если есть время на эксперименты, могу подкинуть идею (то, что я хотел бы наваять), попробую ее описать в виде типа-ТЗ:

1) Плагин вызывается по горячей клавише и выводит свое меню (клавиша Ыть)
2) Плагин вызывается и сразу выполняет одно из своих действий по горячей клавише  (клавиша Ёоу)
3) То, что можно выполнять, записывается в текстовом файле настроек в виде:

полный путь к программе, либо программа доступная из окружения::блок-строка?::аргументы в кавычках-разделенные запятыми

4) При вызове действия во временный файл сбрасывается блок, либо строки от N до M
5) Все это скармливается программе
6) Читается ее вывод в STDOUT
7) Заменяется в редакторе

В качестве программы-обработчика вижу perl, первым аргументом - имя perl-скрипта, просто обожаю этот ЯП

Все. Больше ничего не надо :)

PS: "блок или строка" - просто указывает, работаем чисто с выделением, либо с совокупностью строк выделения, где N-первая строка блока, а М- последняя, это влияет на замену, иными словами - что после обработки заменяем