Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Sublime Text on OS X, make Cmd+F do the equivalent of Cmd+E followed by Cmd+F. Works for all selections, not just single line like "find_selected_text" setting.
// ... (existing content)
// Find selected text, even if it spans multiple lines (unlike "find_selected_text").
{ "keys": ["super+f"], "command": "run_multiple_commands", "args":
{ "commands":
// Only execute slurp if there's selected text.
{"command": "slurp_find_string", "context": "window", "condition": "selected_text"},
{"command": "show_panel", "args": {"panel": "find", "reverse": false}, "context": "window"}
{ "keys": ["super+shift+f"], "command": "run_multiple_commands", "args":
{ "commands":
// Only execute slurp if there's selected text.
{"command": "slurp_find_string", "context": "window", "condition": "selected_text"},
{"command": "show_panel", "args": {"panel": "find_in_files"}, "context": "window"}
import sublime, sublime_plugin
# Takes an array of commands (same as those you'd provide to a key binding) with
# an optional condition, context (defaults to view commands) & runs each command in order.
# Valid condition is 'selected_text'.
# Valid contexts are 'text', 'window', and 'app' for running a TextCommand,
# WindowCommands, or ApplicationCommand respectively.
class RunMultipleCommandsCommand(sublime_plugin.TextCommand):
def exec_command(self, command):
if not 'command' in command:
raise Exception('No command name provided.')
# Check that the condition for this command is met.
if 'condition' in command:
condition = command['condition']
if condition == 'selected_text':
selected_text = False
for r in self.view.sel():
if not r.empty():
selected_text = True
if selected_text == False:
args = None
if 'args' in command:
args = command['args']
# default context is the view since it's easiest to get the other contexts
# from the view
context = self.view
if 'context' in command:
context_name = command['context']
if context_name == 'window':
context = context.window()
elif context_name == 'app':
context = sublime
elif context_name == 'text':
raise Exception('Invalid command context "'+context_name+'".')
# skip args if not needed
if args is None:
context.run_command(command['command'], args)
def run(self, edit, commands = None):
if commands is None:
return # not an error
for command in commands:

This comment has been minimized.

Copy link
Owner Author

@dmitshur dmitshur commented Nov 13, 2014

In case it's not clear, the problem with the "find_selected_text" setting is that it works when your text is on one line, but doesn't work when the text happens to span more than one line.

That inconsistency in behavior is absolutely awful and breaks my flow. Sometimes I press Cmd+F and it does what I want, and sometimes it does something else, and I have to stop and think about what just happened... If it's not consistent, I can't rely on it.


This comment has been minimized.

Copy link
Owner Author

@dmitshur dmitshur commented Nov 23, 2014

I had to add a "selected_text" condition because slurp should not run if there's no text selection.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment