GTK TextBuffer ,查找整个单词

Posted

技术标签:

【中文标题】GTK TextBuffer ,查找整个单词【英文标题】:GTK TextBuffer , finding whole words 【发布时间】:2021-11-21 14:53:59 【问题描述】:

我正在尝试将 GTK textview 中孤立的单词与关键字列表进行比较,但似乎无法弄清楚如何做到这一点。我在 C 中工作(学习)。

gchar word[][10] = "auto", "continue", "enum".....

我在文本缓冲区中逐字移动 iters,然后尝试

gtk_text_iter_get_text(&start,&end);

so 最终会以 word[1] 作为“auto”而迭代器在 textview 中找到“auto”这个词。但无法找到一种方法来比较它们以确认匹配。尝试使用 gtk_text_iter_forward_search() 会导致在 automobile 中突出显示“auto”。

我已经尝试过 'strcmp()' 但无论文本视图中的内容是什么,它总是返回 true。

我正在研究语法高亮之类的东西,并且有 cmets、单引号/双引号、转义序列/格式说明符和数字都能够突出显示,但我坚持要突出显示单词,任何朝着正确方向的轻推都会受到赞赏。

【问题讨论】:

strcmp() 不返回布尔值。我建议阅读手册。 谢谢,我可能看错了 strcmp(),匹配时返回 0,否则返回大于/小于 0。 【参考方案1】:

我通过检查文本编辑器是否在单词的开头和结尾找到了解决方案。

  while (1)
     
     if(gtk_text_iter_forward_search(&end, word[loop], GTK_TEXT_SEARCH_TEXT_ONLY,
                                                            &start, &end, &stop))
        if (gtk_text_iter_starts_word(&start) && gtk_text_iter_ends_word(&end))
           gtk_text_buffer_apply_tag(buffer, word_tag, &start, &end);
        
        else
           gtk_text_iter_forward_word_end(&end);
           gtk_text_buffer_remove_tag(buffer, word_tag, &start, &end);
        
     
     else
        break;
  

在迭代 C 关键字数组的 for 循环中,所以现在如果我输入 'auto' 它将突出显示,但如果我继续输入 'automobile',则删除文本标记。 while 循环逐字扫描光标所在的行和上面的行。我只有一个月的时间学习 C 和 GTK,所以不是很先进,但也许发布我找到的解决方案会帮助其他正在学习的人。

【讨论】:

设置你的gtk_text_buffer_get_start_iter (buffer, &start); 现在循环直到你找到一个单词开始迭代器,例如while (!gtk_text_iter_starts_word (&start)) gtk_text_iter_forward_char (&start); 。设置end = start;。您的搜索将类似于 while (gtk_text_iter_forward_word_end (&end)) const gchar *word = gtk_text_buffer_get_text (buffer, &start, &end, FALSE); /* handle word */ start = end; /* set up for next word find */ for (;;) if (!gtk_text_iter_forward_char (&start)) goto done; if (gtk_text_iter_starts_word (&start)) break; 重复总循环以查找所有单词。 function to find each work in text-buffer 的完整示例应该可以帮助您。 谢谢,我想我以前遇到过这个例子。我在书上标明了要查看。我想我现在会坚持使用 gtk_text_iter_forward_search 因为我认为无论哪种方式我最终都会在同一个地方并且无论如何都必须仔细扫描单词,因为单词结尾和单词开头忽略下划线并且 _int 不应该突出显示。

以上是关于GTK TextBuffer ,查找整个单词的主要内容,如果未能解决你的问题,请参考以下文章

在 GTK 3.0 中更改文本的颜色

查找部分单词但替换整个单词[关闭]

在字符串中查找子字符串,但仅当整个单词?

只查找整个单词,而不是Excel Workbook中单词的一部分

正则表达式将文本查找为整个单词

C++ GTKmm - 如何获取我的 TextView (TextBuffer) 的内容