提问人:Jeff 提问时间:8/12/2014 最后编辑:JessicaJeff 更新时间:6/21/2016 访问量:1033
Sublime Text 自动完成窗口在滚动列表时关闭
Sublime Text autocomplete window closes when scrolling off the list
问:
使用 或 滚动自动完成列表时,如果在任一方向上走得太远(例如,没有更多建议),列表将关闭。updown
我想要的行为是在到达末尾而不是关闭时让列表换行。
通过分配以下热键,向下滚动很容易解决此问题:
{ "keys": ["down"], "command": "auto_complete", "context":
[ { "key": "auto_complete_visible" } ]
},
这是因为该命令具有内置功能,每次调用时都会向下滚动,这就是热键工作的原因。auto_complete
...但向上滚动是不同的。我尝试了大约 20 种不同的热键和宏组合,但没有成功。
我几乎可以肯定实现这种行为的唯一方法是使用插件,但不幸的是,我的 Python 技能水平为零。
如果重要的话,我正在手动调用带有 + 的自动完成(自动弹出窗口被禁用)。ctrlspace
我正在使用 Sublime Text 2。
答:
最佳解决方案:使用auto_complete_cycle设置(2015 年 3 月 26 日添加):
请使用这个新的简单解决方案,而不是 python 插件
2015 年 3 月 24 日发布的 Sublime Text 新版本具有一个名为 auto_complete_cycle 的新设置,用于实现此行为。将其设置为 true 可循环访问自动完成结果。
"auto_complete_cycle": true
最糟糕的旧解决方案:这个自定义插件
我刚刚制作了这个插件,它在 Linux Mint 的 Sublime 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"
}]
}
编辑:这是一个示例结果:
评论
auto_complete_cycle