Russian Qt Forum
Ноябрь 23, 2024, 11:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Плагин для Qt Creator 2.8.x  (Прочитано 6491 раз)
Majestio
Гость
« : Ноябрь 24, 2013, 18:12 »

Не хватает кастомных средств форматирования кода в редакторе. Вот задумался накидать свой плагин, ну и по возможности его дорабатывать. Не имея навыков в написании плагинов, разыскал в сети достаточно неплохую статью, в которой большинство моментов прописано. Но потом "благодать Божыя" закончилась - не могу найти документацию по использованию интерфейса Core::IEditor.

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

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

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

Буду рад любой полезной инфе, ссылкам, примерам.
Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #1 : Ноябрь 25, 2013, 10:29 »

Есть абстрактный класс уровнем пониже
Код:
class TEXTEDITOR_EXPORT ITextEditor : public Core::IEditor

Непонятно чем существующие средства форматирования кода не устраивают...
Записан
Majestio
Гость
« Ответ #2 : Ноябрь 25, 2013, 10:51 »

Есть абстрактный класс уровнем пониже
Код:
class TEXTEDITOR_EXPORT ITextEditor : public Core::IEditor
А де про все эти классы прочитать?

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

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

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

Сообщений: 606



Просмотр профиля
« Ответ #3 : Ноябрь 25, 2013, 12:20 »

А де про все эти классы прочитать?
Боюсь что кроме исходников другой документации нет.
Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #4 : Ноябрь 25, 2013, 13:25 »

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

Пасип, спасибо за содействие!  Улыбающийся
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #6 : Ноябрь 25, 2013, 14:22 »

Если нужно форматирование кода существующими решениями, то можно воспользоваться Uncrustify. Можно настроить работу с ним в Qt Creator через "External Tools". На сочетание клавиш повесить форматирование всего файла или только выделенного фрагмента. Основная проблема: настроить файл конфигурации. Потому что настроек там очень много, и не всегда сразу понятно их влияние на конечный результат. Может пройти несколько дней, пока добьетесь нужного форматирования Улыбающийся.
Записан

Пока сам не сделаешь...
Majestio
Гость
« Ответ #7 : Ноябрь 25, 2013, 14:35 »

Если нужно форматирование кода существующими решениями, то можно воспользоваться Uncrustify. Можно настроить работу с ним в Qt Creator через "External Tools". На сочетание клавиш повесить форматирование всего файла или только выделенного фрагмента. Основная проблема: настроить файл конфигурации. Потому что настроек там очень много, и не всегда сразу понятно их влияние на конечный результат. Может пройти несколько дней, пока добьетесь нужного форматирования Улыбающийся.

За совет - спасибо. Но не очень, если честно. Это как из пушки по воробьям Улыбающийся Инструмент более мощный и более узконаправленный, чем мне надо. А то что я хочу, выполнять не будет. Там свой ограниченный функционал.
Записан
VPS
Гость
« Ответ #8 : Ноябрь 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);
   }
}

П.С.: если нужен исходник, то могу выложить.
« Последнее редактирование: Ноябрь 28, 2013, 08:21 от vps » Записан
Majestio
Гость
« Ответ #9 : Ноябрь 27, 2013, 19:42 »

Можно ещё сделать как-то так:

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

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

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

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

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

Все. Больше ничего не надо Улыбающийся

PS: "блок или строка" - просто указывает, работаем чисто с выделением, либо с совокупностью строк выделения, где N-первая строка блока, а М- последняя, это влияет на замену, иными словами - что после обработки заменяем
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 23.