Как сохранить GtkSourceCompletion при изменении буферов в GtkSourceView? - PullRequest
0 голосов
/ 17 сентября 2018

Все,

У меня есть редактор, который хранит открытые файлы в древовидной / древовидной модели слева от главного окна и отображает буфер, связанный с выделенной записью древовидного представления в окне с фокусированным текстовым обзором (исходным видом)справа.

Каждый показанный GtkSourceView содержится в структуре экземпляра редактора, которая также содержит указатель на GtkSourceCompletionWords 'provider' (prov_words).Завершение слова прекрасно работает для первого буфера, показанного в окне, но когда я изменяю файлы и отображаю другой буфер в окне исходного кода, конкуренция слов не активна для этого буфера, даже если я отменить регистрацию первый буфер от prov_words провайдера и регистра текущего буфера для провайдера слов, чтобы использовать в качестве его источника.

По сути, я создаю объект начального завершения как:

    GtkSourceCompletion *completion;
    GtkSourceCompletionWords *prov_words;

    completion = gtk_source_view_get_completion (view);
    prov_words = gtk_source_completion_words_new (NULL, NULL);
    gtk_source_completion_words_register (prov_words,
                    gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)));
    gtk_source_completion_add_provider (completion,
                    GTK_SOURCE_COMPLETION_PROVIDER (prov_words), NULL);
    /* store a pointer to the completions words provider as part of
     * the editor instance.
     */
    einst->prov_words = prov_words;

При отображении нового буфера в текстовом представлении я использую сигнал древовидной структуры "changed", чтобы отобразить новый буфер, обновить заголовок окна и т. Д., А также отменить регистрацию текущего буфера в поставщике prov_words и затем зарегистрировать новый буферв качестве источника слова с:

    GtkSourceCompletionWords *prov_words = einst->prov_words;

    /* unregister current buffer from words completion provider */
    gtk_source_completion_words_unregister (prov_words,
                                        GTK_TEXT_BUFFER(oldbuf));

    /* register new buffer with words completion provider */
    gtk_source_completion_words_register (prov_words,
                                        GTK_TEXT_BUFFER(newbuf));

Это приводит к тому, что в новом буфере вообще не функционирует завершение, но при переключении обратно на первый буфер завершение продолжает работать просто отлично.Так что, похоже, я концептуально упускаю часть головоломки о том, что требуется для переключения буферов, связанных с окном исходного кода (где объект завершения и поставщик остаются неизменными), и имею работу завершения с новым буфером в том же окне исходного кода.

Поскольку объект завершения является частью исходного представления, часть поставщика объекта завершения и слова, предложенные поставщиком, получены из буфера, например,

    -- GtkSourceView
        |
        -- GtkSourceCompletion
        |   |
        |   -- GtkSourceCompletionWords
        |
        -- GtkSourceBuffer

, кажется, единственное требованиеотменить регистрацию слов в первом буфере у провайдера, а затем зарегистрировать слова в новом буфере у провайдера - но, похоже, это не так.В документации ничего не сказано о том, что требуется в этом случае (или оно ускользает от меня), Gtk SourceView Completion API

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

...