tttmfc 2021-03-29 03:05 采纳率: 0%
浏览 30

VS插件开发,扩展Intellisense,官网示例出现以下两个问题应该怎么解决呢?

想对VS的智能感知做点扩展,在官网上找到这个示例:
https://docs.microsoft.com/zh-cn/previous-versions/visualstudio/visual-studio-2010/ee372314(v=vs.100)

环境:VS2010

经过测试,该示例有两个问题
1、当有匹配项时会显示成这样,上面多显示的那个能改成直接在下面那个选项卡里过滤吗?有没有办法直接把完成集加到默认的“全部”里面去呢(网上查了好久貌似都说不能)?

 

2、当输入字符没有匹配的补全项时,按下空格键,依然会将被框住(非选中状态)的那项提交到编辑区,演示如下:
输入完成列表中不匹配的字符时的显示,注意此时补全列表中被框住的是“addition”,此项虽被框住但是处于非选中状态的,用过VS的应该明白这两者区别就不再强调了
 

 

按下空格后,“addition”仍会上屏

而同样状态时按下回车是不会上屏的,只会换行
 

 

我跟踪过IOleCommandTarget.Exec这个方法,按空格和回车走的流程是完全一样的,而VS默认的智能补全是没有这个问题的(甚至是在这个示例中我用鼠标切到“全部”选项卡再按空格也不会出现问题),我试过修改这段:

if (m_session.SelectedCompletionSet.SelectionStatus.IsSelected)
{
    m_session.Commit();
    //also, don't add the character to the buffer
    return VSConstants.S_OK;
}
else
{
    //if there is no selection, dismiss the session
    m_session.Dismiss();//这里我各种修改不是反应不对就是还是老样子
}

请问应该怎么解决?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-23 20:46
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题涉及到几个方面,包括VS的智能补全机制以及如何处理用户输入。首先,关于第一个问题,如果想要在没有匹配项时让智能补全提示框显示完整的列表,可以尝试使用SelectionStatus变量来检查是否已经选择了某个选项。例如:

    if (!m_session.SelectedCompletionSet.SelectionStatus.IsSelected)
    {
        // 如果当前没有选择任何项目,则添加整个列表到智能补全提示框
        m_session.AddItemsToCompletionList(completionLists);
    }
    

    这将会确保在没有选择任何项的情况下,智能补全提示框中包含完整的列表。

    对于第二个问题,当你按下空格键时,智能补全提示框中的补全项会被提交到缓冲区。这是因为Commit()方法会在所有操作完成后调用,所以即使你没有点击提交按钮,它也会自动提交这些数据。

    如果你希望用户能够看到未被提交的数据,你可以考虑使用一个OnCompletionListChanged事件或者一个自定义的ICompletionList实现,以便在用户手动提交之前查看并提供反馈。然而,这种方法可能会增加一些额外的开销,因为它需要定期检查CompletionList的状态,并可能会影响到性能。

    最后,对于OnCompletionListChanged事件,你需要确保你的代码能够在用户输入过程中正确地监听变化,并且能够根据需要更新CompletionList的内容。

    评论

报告相同问题?