Sublime Text 自动完成窗口在滚动列表时关闭

Sublime Text autocomplete window closes when scrolling off the list

提问人:Jeff 提问时间:8/12/2014 最后编辑:JessicaJeff 更新时间:6/21/2016 访问量:1033

问:

使用 或 滚动自动完成列表时,如果在任一方向上走得太远(例如,没有更多建议),列表将关闭。updown

我想要的行为是在到达末尾而不是关闭时让列表换行。

通过分配以下热键,向下滚动很容易解决此问题:

{ "keys": ["down"], "command": "auto_complete", "context":
    [ { "key": "auto_complete_visible" } ]
},

这是因为该命令具有内置功能,每次调用时都会向下滚动,这就是热键工作的原因。auto_complete

...但向上滚动是不同的。我尝试了大约 20 种不同的热键和宏组合,但没有成功。

我几乎可以肯定实现这种行为的唯一方法是使用插件,但不幸的是,我的 Python 技能水平为零。

如果重要的话,我正在手动调用带有 + 的自动完成(自动弹出窗口被禁用)。ctrlspace

我正在使用 Sublime Text 2。

自动完成 SublimeText2 SublimeText3 SublimeText

评论

0赞 sergioFC 8/16/2014
当您尝试该插件时,请告诉我。
0赞 sergioFC 8/18/2014
我刚刚测试了它,它也适用于 Sublime Text 2。
0赞 Jeff 8/18/2014
很抱歉耽搁了。我今天下午会尝试你的插件。如果很好,我会按照你的方式滑动这 50 点。谢谢你的努力!
0赞 sergioFC 3/26/2015
现在有一种使用新设置的好方法。我已经更新了我的答案。auto_complete_cycle

答:

12赞 sergioFC 8/15/2014 #1

最佳解决方案:使用auto_complete_cycle设置(2015 年 3 月 26 日添加):

请使用这个新的简单解决方案,而不是 python 插件

2015 年 3 月 24 日发布的 Sublime Text 新版本具有一个名为 auto_complete_cycle 的新设置,用于实现此行为。将其设置为 true 可循环访问自动完成结果。

"auto_complete_cycle": true

最糟糕的旧解决方案:这个自定义插件

我刚刚制作了这个插件,它在 Linux MintSublime Text 3 上运行良好。我没有在 Sublime Text 2 中测试过它,但我认为插件系统是相同的,所以,它也应该适用于该版本。使用的解决方法不是太漂亮,但有效。

import sublime, sublime_plugin

class UpArrowInAutoCompleteCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        self.view.settings().set('autoCompleteFlag',True)
        self.view.settings().set('initialPoint', self.view.sel()[0].begin())

        """ Move one line up """
        self.view.run_command('move', {"by": "lines", "forward": False});
        """ Auto-complete was opened and up arrow was pressed, so if the cursor changes
        (on_selection_modified will be triggered) we have gone outside the list. 
        If we were not in the first element on_selection_modified will not be triggered, so
        we turn of the flag"""
        sublime.set_timeout(lambda: self.view.settings().set('autoCompleteFlag', False),300)


class AutoCompleteSelectionModifiedTriggerCommand(sublime_plugin.EventListener):
    def on_selection_modified(self, view):
        if view.settings().get('autoCompleteFlag'):
            """ If the up arrow was pressed and on_selection_modified 
            has been triggered, then we know that we were in the first element
            of the list and we hitted the up arrow"""
            view.settings().set('autoCompleteFlag', False)
            initialPoint = view.settings().get('initialPoint')

            """ We don't know how many words the auto_complete has, so, 
            in order to calculate that number, we move down in the list
            till we get outside the list. After that we make the list appear
            again and move down n-1 times to go (and stay) to the last line """
            view.sel().clear()
            view.sel().add(initialPoint)
            view.run_command('auto_complete')

            numLines = 0
            while view.sel()[0].begin() == initialPoint:
                view.run_command('move', {"by": "lines", "forward": True})
                numLines += 1
                if numLines == 401:
                    return

            if numLines == 0:
                return

            view.sel().clear()
            view.sel().add(initialPoint)
            view.run_command('auto_complete')

            numLine = 0
            while numLine < (numLines-1):
                view.run_command('move', {"by": "lines", "forward": True})
                numLine += 1

要制作插件,请使用 Tools>new 插件并粘贴代码。然后将其保存在 Packages/User 文件夹中。您可以使用“首选项”>“浏览包”来查找“包”部分,用户文件夹位于其中。

为了使它工作,我在我的用户键绑定文件中添加了这个绑定(第二个是你自己的绑定):

{
    "keys": ["up"],
    "command": "up_arrow_in_auto_complete",
    "context": [{
        "key": "auto_complete_visible",
        "operator": "equal",
        "operand": true
    }]
}, {
    "keys": ["down"],
    "command": "auto_complete",
    "context": [{
        "key": "auto_complete_visible"
    }]
}

编辑:这是一个示例结果:

Result

评论

0赞 Jeff 8/19/2014
它没有用。我尝试了 Sublime Text 2.0.1 和 2.0.2,x86 和 x64 版本(总共 4 个不同的版本)。一旦上滚动轴应该换行,光标就会消失,Sublime Text 需要单击鼠标才能重新获得焦点。下面是生成的两条错误消息:error-pic-1、error-pic-2
0赞 sergioFC 8/21/2014
我无法重现该错误(在 Windows 7 上的 ST2.0.2 x64 和 Linux Mint 上的 ST3 x64 中测试)。那么,当您在列表的第一个元素中并按下向上箭头时,列表永远不会换行?或者列表不会仅在出现该错误窗口时换行?您是否尝试过禁用第二张图片中提到的设置?
0赞 Jeff 8/21/2014
当我找到空闲时间时,我一定会再试一次。第二张图片描述了这个插件。我不介意听到其他尝试过的人的反馈。到目前为止,有两次赞成票告诉我,不知何故,问题出在我身上。
1赞 Jeff 8/22/2014
它适用于 2.0.2!我的问题出在 2.0.1(x86 和 x64)上。我尝试了 2.0.2,但来自沙盒,这可能是我的问题。由于我仍在使用 2.0.1,因此是时候升级了。我讨厌升级。感谢您的努力,非常感谢!
1赞 user1767754 7/18/2015
加 1 - 对于图像示例,这给出了答案的提示