VS code自动补全自定义 - 不要自动选择任何建议

8
我想自定义VScode的自动完成行为以适应我的喜好。
具体来说:
1. 当建议列表出现时,我不希望任何建议被选中。 2. 当我按下TabShift-Tab键时,我希望循环浏览建议(从而选择一个)。Esc键应取消选择的任何建议(并可以关闭建议列表,可选)。 3. 选择建议后,任何字符都应接受该建议(因此使用该建议的文本编辑我的代码)。
第2个项目通过编辑键绑定实现。
我没有找到方法来获得第1个项目的行为。
对于第3点,一个简单的方法是利用`editor.acceptSuggestionOnCommitCharacter`设置,并将所有字符用作提交字符,但我没有找到如何编辑哪些字符是提交字符。
有没有办法使用设置实现这种行为?
如果没有,是否有提供此行为的扩展?
理想情况下,我希望避免编写自己的扩展,但如果没有其他解决方案,则可能会采用这种方法。
注意:此问题与这个不同,因为我不想按Return来接受建议(除非我想接受建议并且插入新行)。
编辑:我相信这个答案可以使用上述肮脏的技巧实现第3项,我只需要为所有可能具有相同“when”条件的字符复制相同的键绑定,现在我只需要找到一种方法来获得第1项。(最好找到更好的方法来获得第3项。)
再次编辑:为了让我的问题更清晰,我记录了从vim中按下的键所产生的期望行为。 desired behaviour as experienced in vim

作为第三项的补充,是否有任何方法可以接受建议并且打印键入的字符?我尝试了 "command": "acceptSelectedSuggestion && type" 和附加参数 "args": {"text":"/"} 用于类型命令,但该命令未被接受。 acceptSelectedSuggestiontype 命令各自都能正确工作。 - Anchith Acharya
4个回答

3
在 vscode v1.75 中,有一种新的方法来处理建议,详见从 Visual Studio 实现 "建议模式"。新增设置:
Editor > Suggest: Selection Mode

控制小部件显示时是否选择建议。请注意,这仅适用于自动触发的建议(Editor: Quick SuggestionsEditor: Suggest on Trigger Characters),当明确调用建议时,例如通过Ctrl+Space,建议总是被选中。
选项:
  1. always 自动 IntelliSense 时始终选择建议
  2. never 自动 IntelliSense 时从不选择建议
  3. whenTriggerCharacter 仅在从触发字符触发 IntelliSense 时选择建议
  4. whenQuickSuggestion 仅在输入时触发 IntelliSense 时选择建议
演示1:模式neveralways - 请注意,使用never时,建议框中没有选定的项目,当我按EnterTab时,会将新行插入代码中。选项always自动选择一个建议项目,并且Enter选择并插入该建议。

suggestionMode: whenTriggerCharacter

演示2:模式whenTriggerCharacter,请注意,虽然会显示建议,但没有选择任何一个,我可以使用EnterTab键并将它们插入。只有当输入触发字符,如.时,才会选择建议,并且EnterTab将把所选的建议项插入到代码中(取决于您关于使用Enter作为建议完成的设置)。

suggestion modes: always and never

演示3:模式whenQuickSuggestion。在您输入时,您将获得已选择的建议,除了触发字符。触发字符仍会显示建议,但不会选择任何建议,因此您可以使用EnterTab

  • 请注意,在上述所有情况下,即使有建议显示但没有选择,DownArrowUpArrow键也会滚动并选择建议中的项目。

在上面的链接中还有另一个演示:https://github.com/microsoft/vscode/issues/139825#issuecomment-1364056148


1
我也在寻找同样的内容。但是我找到的最接近的是预览建议,我已经打开了:将这个放入你的settings.json中的VScode。
"editor.suggest.preview": true

但我认为VScode目前还没有实际的插入功能。

1
对于第一项,您可以按上箭头键取消选择建议。或者您可以转到VSC,从Visual Studio中选择“工具”>“选项”。在左侧窗格中选择“文本编辑器”。选择您正在使用的语言(C#,C ++,Basic等)。对于C#和Basic,请选择“IntelliSense”... 对于C#和Basic,请勾选“在键入字符后显示完成列表”以禁用它。对于第三项,您可以不写任何括号,<或>,{或},[或]或<和>。而是只写里面的内容。自动完成将把每个符号放在正确的位置。
希望我有所帮助!

0

针对第二项:

首先,您需要禁用使用 Enter 键选择建议。为此,请更改 "insertSnippet" 的键绑定。

  {
    "key": "enter",
    "command": "insertSnippet",
    "when": "editorTextFocus && hasSnippetCompletions && !editorTabMovesFocus && !inSnippetMode"
  },

然后,为了使用TabShift + Tab添加导航,请修改"selectNextSuggestion""selectPrevSuggestion"

*确保两个快捷键都有"when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus"

  {
    "key": "down",
    "command": "-selectNextSuggestion",
    "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus"
  },
  {
    "key": "shift+tab",
    "command": "selectPrevSuggestion",
    "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus"
  },

为了退出代码段选取,Esc 应该已经是默认键。如果不是这种情况,请修改 "leaveSnippet" 绑定键。

  {
    "key": "escape",
    "command": "leaveSnippet",
    "when": "editorTextFocus && inSnippetMode"
  },

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接