【问题标题】:Sublime Text: How to jump to file from Find Results using keyboard?Sublime Text:如何使用键盘从查找结果跳转到文件?
【发布时间】:2013-05-21 23:44:01
【问题描述】:

如果你 File > Find in Files... ++F 你会被带到Find Results,列出文件和突出显示的匹配项。您可以双击文件名/路径或匹配的行以在右侧打开文件。

我想知道是否有办法通过键盘完成双击的操作?

凭借 Sublimes 强大的文件切换功能,我认为在执行 Find in Files... 时必须有一种方法可以让您的手保持在键盘上。

【问题讨论】:

  • @wdso:您对此问题的编辑和接受的答案添加了非常有用的细节,但最好将它们保留为 cmets。 :)

标签: find sublimetext2 sublimetext sublimetext3


【解决方案1】:

尝试 Shift+F4fn+Shift+F4铝键盘)。

【讨论】:

  • ⇧F4 映射到prev_result 命令比next_result 效果好得多,但它并不总是产生相同的效果。如果您在“查找结果”缓冲区中并反复转到相同的搜索结果,则不会将您带到光标下方的结果。然后它将像名称建议的命令一样运行,并为您提供先前的结果。虽然这是一个小问题,但我会坚持使用 @skuroda 的插件,它总是表现得像预期的那样。无论如何,谢谢你的回答!
  • 这应该是公认的答案,因为它不需要插件就可以满足用户的要求。希望默认值比 shift-F4 更直观。
  • 我正在测试,用纯 F4 打开下一个结果文件
  • @KatLimRuiz +1 不需要 shift
  • 对于那些有自定义键绑定的解决方案/按键看起来像这样: { "keys": ["super+shift+n"], "command": "next_result" },
【解决方案2】:

似乎已经创建了一个插件来执行此操作。快速浏览了一下,插件中有一些附加功能。虽然我在下面的原始答案会起作用,但安装现有插件会容易得多。

https://sublime.wbond.net/packages/BetterFindBuffer


可以通过插件实现。

import sublime
import sublime_plugin
import re
import os
class FindInFilesGotoCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        view = self.view
        if view.name() == "Find Results":
            line_no = self.get_line_no()
            file_name = self.get_file()
            if line_no is not None and file_name is not None:
                file_loc = "%s:%s" % (file_name, line_no)
                view.window().open_file(file_loc, sublime.ENCODED_POSITION)
            elif file_name is not None:
                view.window().open_file(file_name)

    def get_line_no(self):
        view = self.view
        if len(view.sel()) == 1:
            line_text = view.substr(view.line(view.sel()[0]))
            match = re.match(r"\s*(\d+).+", line_text)
            if match:
                return match.group(1)
        return None

    def get_file(self):
        view = self.view
        if len(view.sel()) == 1:
            line = view.line(view.sel()[0])
            while line.begin() > 0:
                line_text = view.substr(line)
                match = re.match(r"(.+):$", line_text)
                if match:
                    if os.path.exists(match.group(1)):
                        return match.group(1)
                line = view.line(line.begin() - 1)
        return None

使用命令find_in_files_goto 设置键绑定。这样做时要小心。理想情况下,会有一些设置将此视图标识为“在文件中查找”视图,因此您可以将其用作上下文。但我不知道一个。当然,如果你找到了,请告诉我。

编辑 将示例键绑定拉到答案的主体中。

{
    "keys": ["enter"],
    "command": "find_in_files_goto",
    "context": [{
        "key": "selector",
        "operator": "equal",
        "operand": "text.find-in-files"
    }]
}

【讨论】:

  • 耶! ..奇迹般有效! \o/ 我不使用“在文件中查找”视图...始终将其与“使用缓冲区”选项一起使用。
  • 抱歉不清楚。只是指出执行 goto 操作的用户键绑定也将尝试在没有任何上下文的普通文件中运行。理想情况下,您可以将绑定限制为“查找结果”视图。然后,这将允许您在其他地方重用该键绑定。当我一直在说视图时,我的意思也是“缓冲区”选项。 :)
  • 哦...当然您可以将键绑定限制为仅适用于“查找结果”视图。您可以检查范围text.find-in-files。例如{ "keys": ["enter"], "command": "find_in_files_goto", "context": [{"key": "selector", "operator": "equal", "operand": "text.find-in-files" }]}
  • 嗯,为什么我没有看到范围。那好吧 :)。我知道您可以检查视图的名称,但这并不能真正让您轻松地将键绑定重用于其他事情。无论如何,很高兴它帮助您解决了您的问题!
  • 很棒的插件。有没有可能有人将它作为 Monokai 的主题?
【解决方案3】:

SublimeText 3 上,我必须使用F4(用于转到当前结果文件)和Shift +F4(用于上一个结果)。

从默认键盘映射...

{ "keys": ["super+shift+f"], "command": "show_panel", "args": {"panel": "find_in_files"} },
{ "keys": ["f4"], "command": "next_result" },
{ "keys": ["shift+f4"], "command": "prev_result" },

希望这篇文章对你有帮助。

SP

【讨论】:

    【解决方案4】:

    命令“next_result”将执行此操作。使用 muhqu 发布的关于使用范围的简洁想法,您可以制作它,以便您可以在要转到的行上按“输入”:

    ,{ "keys": ["enter"], "command": "next_result", "context": [{"key": "selector", 
    "operator": "equal", "operand": "text.find-in-files" }]}
    

    【讨论】:

    • 刚刚试了一下,但它并没有完全按预期工作。 'next_result' 命令遍历搜索结果的完整列表,并且不会打开当前关注的搜索结果。例如有一个包含 3 个结果的搜索结果并将光标移动到第 3 个结果行,点击“输入”,它仍然会将您带到第一个结果......对我来说,skuroda 的脚本就像一个魅力。无论如何,谢谢你的回答!
    • 这对结合 skuroda 的插件很有帮助
    • @muhqu 是正确的。这不会做你期望它做的事情。它将打开 next 结果,而不是光标当前所在的 current 结果。很混乱。您需要创建一个插件才能正确执行此操作,如下所示:stackoverflow.com/a/41567906/293280
    【解决方案5】:

    尝试 Ctrl+P - 这会在您的项目中按名称快速打开文件,有关键盘快捷键的完整列表,请参阅 here

    【讨论】:

    • 哈!多么可爱的黑客:)
    • 这对找到的结果有何帮助?
    • @Mi-La 使用缓冲区时“查找结果”列在“按名称的文件”弹出窗口中,因此很容易从那里到达
    【解决方案6】:

    可以通过执行带有"by": "words" 参数的drag_select 命令来模拟Sublime Text 中的双击(如默认sublime-mousemap 文件中所示)。

    但是,对于这项工作,您需要假设鼠标是插入符号所在的位置。以下插件将执行此操作:

    import sublime
    import sublime_plugin
    
    
    class DoubleClickAtCaretCommand(sublime_plugin.TextCommand):
        def run(self, edit, **kwargs):
            view = self.view
            window_offset = view.window_to_layout((0,0))
            vectors = []
            for sel in view.sel():
                vector = view.text_to_layout(sel.begin())
                vectors.append((vector[0] - window_offset[0], vector[1] - window_offset[1]))
            for idx, vector in enumerate(vectors):
                view.run_command('drag_select', { 'event': { 'button': 1, 'count': 2, 'x': vector[0], 'y': vector[1] }, 'by': 'words', 'additive': idx > 0 or kwargs.get('additive', False) })
    

    与以下键绑定结合使用:

    { "keys": ["alt+/"], "command": "double_click_at_caret" },
    

    【讨论】:

    • 像魅力一样工作!!!比只使用next_result 命令要好得多。我确实将"context": [ {"key": "selector", "operator": "equal", "operand": "text.find-in-files" } ] 添加到我的键绑定中,因此它只绑定在“查找结果”选项卡中,但不确定是否有必要。
    猜你喜欢
    • 2016-12-05
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    相关资源
    最近更新 更多