Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Workspace move editor actions #21760

Open
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

Igonato
Copy link

@Igonato Igonato commented Dec 9, 2024

Closes #20205

Release Notes:

  • Added MoveItemToPane and MoveItemToPaneInDirection actions

@cla-bot cla-bot bot added the cla-signed The user has signed the Contributor License Agreement label Dec 9, 2024
@mikayla-maki mikayla-maki marked this pull request as ready for review December 9, 2024 20:28
@mikayla-maki
Copy link
Contributor

Marked as ready for review based on this comment: #20205 (comment)

@SomeoneToIgnore
Copy link
Contributor

  • I think we should close the pane indeed, as it's not really actionable otherwise? You cannot close or create a new item in that panel without further move actions, can you?

  • Terminal splits are not covered by this PR at all, is it intended?

@Igonato
Copy link
Author

Igonato commented Dec 9, 2024

I think we should close the pane indeed, as it's not really actionable otherwise? You cannot close or create a new item in that panel without further move actions, can you?

One counterpoint I can think of, is if you start by creating all the splits the way you like and then proceed to move items around, you may close a pane when you didn't meant to. But otherwise there is no merit to keep it, it looks wrong and there is no way to close it through UI at the moment.

Terminal splits are not covered by this PR at all, is it intended

I tried moving an editor to the terminal pane with the mouse and it didn't work (I mean it pasted the file path as, I assume, intended). Now after your comment I realize that moving terminals within the terminal pane should be possible in the same fashion, right... I'll look into it and add it tomorrow. Have you thought about a more unified model to pane splitting and navigation for editors and termianls?

@SomeoneToIgnore
Copy link
Contributor

But otherwise there is no merit to keep it

That reason is good, but seems rather small compared to the inactionable panels?
I'd rather fix them first, or at least stub the movements so that they leave a blank editor open instead — but for the first version, feels that we can follow the mouse impl for now?

Have you though about a more unified model to pane splitting and navigation for editors and termianls?

I have thought about it, and decided that's hard to do given the fact that terminal panel restricts other kinds of items, and differently reacts to files being dropped inside it.
Otherwise, the logic is pretty unified already? E.g. swapping panes is implemented as a few calls to the PaneGroup:

.on_action(cx.listener(
|terminal_panel, action: &SwapPaneInDirection, cx| {
if let Some(to) = terminal_panel
.center
.find_pane_in_direction(&terminal_panel.active_pane, action.0, cx)
.cloned()
{
terminal_panel
.center
.swap(&terminal_panel.active_pane.clone(), &to);
cx.notify();
}
},
))

This PR does pretty much the same, but not in a unified way, so I can return the question back.

@Igonato
Copy link
Author

Igonato commented Dec 10, 2024

Fair enough. Foolish consistency, yada yada... I'll add similar calls to the terminal crate, and adjust the original if needed.

Found a bug in main. When trying to split terminal panel using mouse Zed crashes (tested on windows and linux). Splitting through command palette works, splitting editors with mouse works.

2024-12-10_14-56-11.mp4
Error log from the linux machine
warning: [email protected]: Info: using 'bd2087675bb137fe56f8015924b3e40ab6666c18' hash for ZED_COMMIT_SHA env var
  Finished `release` profile [optimized + debuginfo] target(s) in 4.01s
   Running `target/release/zed`
MESA-INTEL: warning: Bay Trail Vulkan support is incomplete
Thread "main" panicked with "invalid SecondaryMap key used" at /home/ignat/projects/zed/crates/gpui/src/app/entity_map.rs:120:22
 0: zed::reliability::init_panic_hook::{{closure}}
           at /home/ignat/projects/zed/crates/zed/src/reliability.rs:60:29
 1: <alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::call
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/alloc/src/boxed.rs:2084:9
    std::panicking::rust_panic_with_hook
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/panicking.rs:808:13
 2: std::panicking::begin_panic::{{closure}}
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/panicking.rs:738:9
 3: std::sys::backtrace::__rust_end_short_backtrace
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/sys/backtrace.rs:168:18
 4: std::panicking::begin_panic
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/panicking.rs:737:5
 5: <slotmap::secondary::SecondaryMap<K,V> as core::ops::index::Index<K>>::index
           at /home/ignat/.cargo/registry/src/index.crates.io-6f17d22bba15001f/slotmap-1.0.7/src/secondary.rs:866:21
    gpui::app::entity_map::EntityMap::read
           at /home/ignat/projects/zed/crates/gpui/src/app/entity_map.rs:120:22
    gpui::app::entity_map::Model<T>::read
           at /home/ignat/projects/zed/crates/gpui/src/app/entity_map.rs:397:9
    gpui::view::View<V>::read
           at /home/ignat/projects/zed/crates/gpui/src/view.rs:82:20
    terminal_view::terminal_panel::new_terminal_pane::{{closure}}::{{closure}}::{{closure}}::{{closure}}
           at /home/ignat/projects/zed/crates/terminal_view/src/terminal_panel.rs:918:64
    <gpui::window::WindowContext as gpui::VisualContext>::update_view
           at /home/ignat/projects/zed/crates/gpui/src/window.rs:3955:22
    <gpui::window::ViewContext<V> as gpui::VisualContext>::update_view
           at /home/ignat/projects/zed/crates/gpui/src/window.rs:4614:9
    gpui::view::View<V>::update
           at /home/ignat/projects/zed/crates/gpui/src/view.rs:77:12
    terminal_view::terminal_panel::new_terminal_pane::{{closure}}::{{closure}}::{{closure}}
           at /home/ignat/projects/zed/crates/terminal_view/src/terminal_panel.rs:914:44
    core::option::Option<T>::and_then
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/option.rs:1450:24
    terminal_view::terminal_panel::new_terminal_pane::{{closure}}::{{closure}}
           at /home/ignat/projects/zed/crates/terminal_view/src/terminal_panel.rs:913:68
 6: workspace::pane::Pane::handle_tab_drop
           at /home/ignat/projects/zed/crates/workspace/src/pane.rs:2543:45
 7: <workspace::pane::Pane as gpui::element::Render>::render::{{closure}}
           at /home/ignat/projects/zed/crates/workspace/src/pane.rs:2980:33
    gpui::window::ViewContext<V>::listener::{{closure}}::{{closure}}
           at /home/ignat/projects/zed/crates/gpui/src/window.rs:4536:40
    <gpui::window::WindowContext as gpui::VisualContext>::update_view
           at /home/ignat/projects/zed/crates/gpui/src/window.rs:3955:22
    gpui::view::View<V>::update
           at /home/ignat/projects/zed/crates/gpui/src/view.rs:77:9
    gpui::view::WeakView<V>::update
           at /home/ignat/projects/zed/crates/gpui/src/view.rs:193:17
    gpui::window::ViewContext<V>::listener::{{closure}}
           at /home/ignat/projects/zed/crates/gpui/src/window.rs:4536:13
    gpui::elements::div::Interactivity::on_drop::{{closure}}
           at /home/ignat/projects/zed/crates/gpui/src/elements/div.rs:421:17
 8: <alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::call
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/alloc/src/boxed.rs:2084:9
    gpui::elements::div::Interactivity::paint_mouse_listeners::{{closure}}
           at /home/ignat/projects/zed/crates/gpui/src/elements/div.rs:1777:41
    gpui::window::WindowContext::on_mouse_event::{{closure}}
           at /home/ignat/projects/zed/crates/gpui/src/window.rs:2931:21
 9: <alloc::boxed::Box<F,A> as core::ops::function::FnMut<Args>>::call_mut
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/alloc/src/boxed.rs:2077:9
    gpui::window::WindowContext::dispatch_mouse_event
           at /home/ignat/projects/zed/crates/gpui/src/window.rs:3211:17
    gpui::window::WindowContext::dispatch_event
           at /home/ignat/projects/zed/crates/gpui/src/window.rs:3177:13
10: gpui::window::Window::new::{{closure}}::{{closure}}
           at /home/ignat/projects/zed/crates/gpui/src/window.rs:777:46
    <gpui::app::AppContext as gpui::Context>::update_window::{{closure}}
           at /home/ignat/projects/zed/crates/gpui/src/app.rs:1493:26
    gpui::app::AppContext::update
           at /home/ignat/projects/zed/crates/gpui/src/app.rs:411:22
    <gpui::app::AppContext as gpui::Context>::update_window
           at /home/ignat/projects/zed/crates/gpui/src/app.rs:1484:9
    <gpui::app::async_context::AsyncAppContext as gpui::Context>::update_window
           at /home/ignat/projects/zed/crates/gpui/src/app/async_context.rs:91:14
    gpui::window::AnyWindowHandle::update
           at /home/ignat/projects/zed/crates/gpui/src/window.rs:4842:9
    gpui::window::Window::new::{{closure}}
           at /home/ignat/projects/zed/crates/gpui/src/window.rs:777:22
11: <alloc::boxed::Box<F,A> as core::ops::function::FnMut<Args>>::call_mut
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/alloc/src/boxed.rs:2077:9
    gpui::platform::linux::x11::window::X11WindowStatePtr::handle_input
           at /home/ignat/projects/zed/crates/gpui/src/platform/linux/x11/window.rs:943:17
12: gpui::platform::linux::x11::client::X11Client::handle_event
           at /home/ignat/projects/zed/crates/gpui/src/platform/linux/x11/client.rs:1043:25
13: gpui::platform::linux::x11::client::X11Client::xim_handle_event
           at /home/ignat/projects/zed/crates/gpui/src/platform/linux/x11/client.rs:1182:17
    gpui::platform::linux::x11::client::X11Client::process_x11_events
           at /home/ignat/projects/zed/crates/gpui/src/platform/linux/x11/client.rs:577:21
14: <gpui::platform::linux::x11::client::X11Client as gpui::platform::linux::platform::LinuxClient>::open_window::{{closure}}
           at /home/ignat/projects/zed/crates/gpui/src/platform/linux/x11/client.rs:1362:21
    <core::cell::RefCell<calloop::sources::DispatcherInner<S,F>> as calloop::sources::EventDispatcher<Data>>::process_events::{{closure}}
           at /home/ignat/.cargo/registry/src/index.crates.io-6f17d22bba15001f/calloop-0.13.0/src/sources/mod.rs:327:61
    <calloop::sources::timer::Timer as calloop::sources::EventSource>::process_events
           at /home/ignat/.cargo/registry/src/index.crates.io-6f17d22bba15001f/calloop-0.13.0/src/sources/timer.rs:122:38
    <core::cell::RefCell<calloop::sources::DispatcherInner<S,F>> as calloop::sources::EventDispatcher<Data>>::process_events
           at /home/ignat/.cargo/registry/src/index.crates.io-6f17d22bba15001f/calloop-0.13.0/src/sources/mod.rs:326:9
15: calloop::loop_logic::EventLoop<Data>::dispatch_events
           at /home/ignat/.cargo/registry/src/index.crates.io-6f17d22bba15001f/calloop-0.13.0/src/loop_logic.rs:445:31
    calloop::loop_logic::EventLoop<Data>::dispatch
           at /home/ignat/.cargo/registry/src/index.crates.io-6f17d22bba15001f/calloop-0.13.0/src/loop_logic.rs:559:9
    calloop::loop_logic::EventLoop<Data>::run
           at /home/ignat/.cargo/registry/src/index.crates.io-6f17d22bba15001f/calloop-0.13.0/src/loop_logic.rs:596:13
    <gpui::platform::linux::x11::client::X11Client as gpui::platform::linux::platform::LinuxClient>::run
           at /home/ignat/projects/zed/crates/gpui/src/platform/linux/x11/client.rs:1512:9
16: gpui::platform::linux::platform::<impl gpui::platform::Platform for P>::run
           at /home/ignat/projects/zed/crates/gpui/src/platform/linux/platform.rs:152:9
17: gpui::app::App::run
           at /home/ignat/projects/zed/crates/gpui/src/app.rs:161:9
18: zed::main
           at /home/ignat/projects/zed/crates/zed/src/main.rs:248:5
19: core::ops::function::FnOnce::call_once
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/ops/function.rs:250:5
    std::sys::backtrace::__rust_begin_short_backtrace
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/sys/backtrace.rs:152:18
20: std::rt::lang_start::{{closure}}
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/rt.rs:162:18
21: core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/ops/function.rs:284:13
    std::panicking::try::do_call
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/panicking.rs:557:40
    std::panicking::try
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/panicking.rs:521:19
    std::panic::catch_unwind
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/panic.rs:350:14
    std::rt::lang_start_internal::{{closure}}
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/rt.rs:141:48
    std::panicking::try::do_call
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/panicking.rs:557:40
    std::panicking::try
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/panicking.rs:521:19
    std::panic::catch_unwind
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/panic.rs:350:14
    std::rt::lang_start_internal
           at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/rt.rs:141:20
22: main
23: <unknown>
24: __libc_start_main
25: _start

Also, question from the issue thread about keybinding:

            "ctrl-shift-1": ["workspace::MoveItemToPane", 0],
            "ctrl-shift-2": ["workspace::MoveItemToPane", 1],
            "ctrl-shift-3": ["workspace::MoveItemToPane", 2],
            "ctrl-shift-4": ["workspace::MoveItemToPane", 3],
            "ctrl-shift-5": ["workspace::MoveItemToPane", 4],
            "ctrl-shift-6": ["workspace::MoveItemToPane", 5],
            "ctrl-shift-7": ["workspace::MoveItemToPane", 6],
            "ctrl-shift-8": ["workspace::MoveItemToPane", 7],
            "ctrl-shift-9": ["workspace::MoveItemToPane", 8]

These should be added to the "base_keymap": "SublimeText" defaults. May I do it in the same PR? How do those work? Just edit default-platform.json after the comment, right?

Should I also add vim defaults? If so, which exact?

@SomeoneToIgnore
Copy link
Contributor

SomeoneToIgnore commented Dec 10, 2024

  • It's not about the consistency per se, but about chunking the work: one cannot expect from the external contributor to come back with further changes, so it's better to park existing changes at something that makes sense on a general scale, and well-prepared to future changes.

For that, it's better to do incremental, potentially smaller updates instead of changing the entire mechanism at once.
Changing the whole world at once is even more dangerous in the context of a person who keeps skipping details (like an entire terminal panel split) and asks relatively basic questions.

Later, after allowing to split/move things however we like, one can go and land an approach on top, dealing with all actions that may leave the pane empty — deciding what to do in this case seems like a good task on its own.

So the only foolish thing I see here is the appearance of this word in the discussion and, overall, hastiness to slap labels on things.

  • The bug is fixed in Fix a panic when drop-splitting the terminal panel #21795, thank you for another report and the log.

  • Adding more key bindings in the same PR sounds great: unfortunately, I have no good grasp on the current bindings state, so cannot advice anything. I'd suggest to finish the impl first, and consider options later. Pinging (later) @\ConradIrwin in the issue might also help.

@Igonato
Copy link
Author

Igonato commented Dec 10, 2024

Implemented the actions for the terminal panel and cleaned things up a bit.

I think, in it's current state, it can pass as an "incremental, potentially smaller update".

Intentionally missing:

  • I like the idea from the related issue about making focusing the target pane optional, not sure about the best way to add it. Is there an example of an action with an optional parameter? Did a quick project search didn't find any.
  • Currently you can move a terminal from the terminal panel to the center panel and back using mouse. I think it can be handled in a separate PR due to mentioned terminal panel restrictions and thus the extra required complexity.

And, question about hotkeys, @ConradIrwin, please, give us your judgement about #20205 (comment) and, maybe look at the #14817 as well? I'd like to see that implemented, maybe after this PR, I'll try making that happen next. Thanks!

@Igonato Igonato force-pushed the workspace-move-editor-actions branch from a9252ae to 6ed4888 Compare December 10, 2024 19:21
@ConradIrwin
Copy link
Member

@Igonato for vim we should use ctrl-w shift-{h,j,k,l} and ctrl-w shift-{up,down,left,right} to move panes.

In the current state of things, closing the empty pane is consistent with how Zed does things (and with vim :D), so for getting this shipped, we should close them.

If we come back to #14187, I think the two questions to answer are:

  • How do we make the empty pane not look so broken (maybe it just has a placeholder tab bar with a + in it?)
  • How do we decide whether to close the pane when the last item is removed or not? (probably a setting, but maybe some actions should retain the last pane and some shouldn't)

@Igonato
Copy link
Author

Igonato commented Dec 10, 2024

so for getting this shipped, we should close them

That's how it's implemeneted right now.

If we come back to #14187

This had me confused for a minute :D

How do we decide whether to close the pane when the last item is removed or not?

If one to get an inspiration from zellij layouts, then something similar to close_on_exit, maybe close_on_empy property can be a part of layout specification. So by default close. And for defined layouts - based on the layout configuration. Seems sound?

@Igonato
Copy link
Author

Igonato commented Dec 10, 2024

Can any mac user install Sublime and post contents of the Default (OSX).sublime-keymap for reference please? Can't find it on the internet (only ones for extensions)

@SomeoneToIgnore
Copy link
Contributor

SomeoneToIgnore commented Dec 11, 2024

Sublime keymap
/*
On OS X, basic text manipulations (left, right, command+left, etc) make use of the system key bindings,
and don't need to be repeated here. Anything listed here will take precedence, however.
*/
[
  { "keys": ["super+shift+n"], "command": "new_window" },
  { "keys": ["super+shift+w"], "command": "close_window" },
  { "keys": ["super+alt+shift+n"], "command": "new_os_tab" },
  { "keys": ["ctrl+alt+tab"], "command": "next_os_tab" },
  { "keys": ["ctrl+alt+shift+tab"], "command": "prev_os_tab" },
  { "keys": ["super+o"], "command": "prompt_open" },
  { "keys": ["super+shift+t"], "command": "reopen_last_file", "args": {"source": "window"}  },
  { "keys": ["super+alt+up"], "command": "switch_file", "args": {"extensions": ["cpp", "cxx", "cc", "c", "hpp", "hxx", "hh", "h", "ipp", "inl", "m", "mm"]} },
  { "keys": ["super+alt+shift+up"], "command": "switch_file", "args": {"extensions": ["cpp", "cxx", "cc", "c", "hpp", "hxx", "hh", "h", "ipp", "inl", "m", "mm"], "side_by_side": true} },
  { "keys": ["super+n"], "command": "new_file" },
  { "keys": ["super+s"], "command": "save", "args": { "async": true } },
  { "keys": ["super+shift+s"], "command": "prompt_save_as" },
  { "keys": ["super+alt+s"], "command": "save_all" },
  { "keys": ["super+w"], "command": "close" },
  { "keys": ["super+w"], "command": "close_transient", "context":
  	[
  		{ "key": "group_has_transient_sheet", "operator": "equal", "operand": true }
  	]
  },

  { "keys": ["super+k", "super+b"], "command": "toggle_side_bar" },
  { "keys": ["super+ctrl+f"], "command": "toggle_full_screen" },
  { "keys": ["super+ctrl+shift+f"], "command": "toggle_distraction_free" },

  { "keys": ["super+z"], "command": "undo" },
  { "keys": ["super+shift+z"], "command": "redo" },
  { "keys": ["super+y"], "command": "redo_or_repeat" },
  { "keys": ["super+u"], "command": "soft_undo" },
  { "keys": ["super+shift+u"], "command": "soft_redo" },

  { "keys": ["super+x"], "command": "cut" },
  { "keys": ["super+c"], "command": "copy" },
  { "keys": ["super+v"], "command": "paste" },
  { "keys": ["super+shift+v"], "command": "paste_and_indent" },
  { "keys": ["super+k", "super+v"], "command": "paste_from_history" },
  { "keys": ["super+option+v"], "command": "paste_from_history" },

  { "keys": ["ctrl+alt+left"], "command": "move", "args": {"by": "subwords", "forward": false} },
  { "keys": ["ctrl+alt+right"], "command": "move", "args": {"by": "subword_ends", "forward": true} },
  { "keys": ["ctrl+alt+shift+left"], "command": "move", "args": {"by": "subwords", "forward": false, "extend": true} },
  { "keys": ["ctrl+alt+shift+right"], "command": "move", "args": {"by": "subword_ends", "forward": true, "extend": true} },

  { "keys": ["ctrl+left"], "command": "move", "args": {"by": "subwords", "forward": false} },
  { "keys": ["ctrl+right"], "command": "move", "args": {"by": "subword_ends", "forward": true} },
  { "keys": ["ctrl+shift+left"], "command": "move", "args": {"by": "subwords", "forward": false, "extend": true} },
  { "keys": ["ctrl+shift+right"], "command": "move", "args": {"by": "subword_ends", "forward": true, "extend": true} },

  { "keys": ["ctrl+alt+up"], "command": "scroll_lines", "args": {"amount": 1.0} },
  { "keys": ["ctrl+alt+down"], "command": "scroll_lines", "args": {"amount": -1.0} },

  { "keys": ["ctrl+shift+up"], "command": "select_lines", "args": {"forward": false} },
  { "keys": ["ctrl+shift+down"], "command": "select_lines", "args": {"forward": true} },

  { "keys": ["super+shift+["], "command": "prev_view" },
  { "keys": ["super+shift+]"], "command": "next_view" },
  { "keys": ["super+alt+left"], "command": "prev_view" },
  { "keys": ["super+alt+right"], "command": "next_view" },
  { "keys": ["super+alt+shift+left"], "command": "prev_view", "args": {"extend": true} },
  { "keys": ["super+alt+shift+right"], "command": "next_view", "args": {"extend": true} },
  { "keys": ["ctrl+pagedown"], "command": "next_view" },
  { "keys": ["ctrl+pageup"], "command": "prev_view" },
  { "keys": ["ctrl+shift+pagedown"], "command": "next_view", "args": {"extend": true} },
  { "keys": ["ctrl+shift+pageup"], "command": "prev_view", "args": {"extend": true} },

  { "keys": ["ctrl+tab"], "command": "next_view_in_stack" },
  { "keys": ["ctrl+shift+tab"], "command": "prev_view_in_stack" },

  { "keys": ["super+a"], "command": "select_all" },
  { "keys": ["super+shift+l"], "command": "split_selection_into_lines" },
  { "keys": ["escape"], "command": "single_selection", "context":
  	[
  		{ "key": "num_selections", "operator": "not_equal", "operand": 1 }
  	]
  },
  { "keys": ["escape"], "command": "clear_fields", "context":
  	[
  		{ "key": "has_next_field", "operator": "equal", "operand": true }
  	]
  },
  { "keys": ["escape"], "command": "clear_fields", "context":
  	[
  		{ "key": "has_prev_field", "operator": "equal", "operand": true }
  	]
  },
  { "keys": ["escape"], "command": "hide_panel", "args": {"cancel": true},
  	"context":
  	[
  		{ "key": "panel_visible", "operator": "equal", "operand": true }
  	]
  },
  { "keys": ["escape"], "command": "hide_overlay", "context":
  	[
  		{ "key": "overlay_visible", "operator": "equal", "operand": true },
  		{ "key": "panel_has_focus", "operator": "equal", "operand": false }
  	]
  },
  { "keys": ["escape"], "command": "hide_auto_complete", "context":
  	[
  		{ "key": "auto_complete_visible", "operator": "equal", "operand": true }
  	]
  },
  { "keys": ["escape"], "command": "hide_popup", "context":
  	[
  		{ "key": "popup_visible", "operator": "equal", "operand": true }
  	]
  },

  { "keys": ["super+]"], "command": "indent" },
  { "keys": ["super+k", "super+]"], "command": "reindent", "args": {"single_line": true} },
  { "keys": ["super+["], "command": "unindent" },


  { "keys": ["tab"], "command": "insert", "args": {"characters": "\t"} },
  { "keys": ["tab"], "command": "auto_complete", "args": {"mini": true, "default": "\t",  "commit_single": true},
  	"context":
  	[
  		{ "key": "auto_complete_visible", "operand": false },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "setting.tab_completion", "operator": "equal", "operand": true },
  		{ "key": "preceding_text", "operator": "regex_match", "operand": ".*\\w", "match_all": true },
  	]
  },

  { "keys": ["tab"], "command": "auto_complete", "args": {"snippets_only": true, "default": "\t"},
  	"context":
  	[
  		{ "key": "auto_complete_visible", "operand": false },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "setting.tab_completion", "operator": "equal", "operand": false },
  		{ "key": "preceding_text", "operator": "regex_match", "operand": ".*\\w", "match_all": true },
  	]
  },

  { "keys": ["tab"], "command": "expand_snippet", "context":
  	[{ "key": "has_snippet" }, ]
  },
  { "keys": ["tab"], "command": "reindent", "context":
  	[
  		{ "key": "setting.auto_indent", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "preceding_text", "operator": "regex_match", "operand": "^$", "match_all": true },
  		{ "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true }
  	]
  },
  { "keys": ["tab"], "command": "indent", "context":
  	[{ "key": "text", "operator": "regex_contains", "operand": "\n" } ]
  },
  { "keys": ["tab"], "command": "move", "args": {"by": "lines", "forward": true}, "context":
  	[
  		{ "key": "overlay_has_focus", "operator": "equal", "operand": true }
  	]
  },
  { "keys": ["tab"], "command": "next_field", "context":
  	[{ "key": "has_next_field", "operator": "equal", "operand": true }]
  },
  { "keys": ["tab"], "command": "commit_completion", "context":
  	[{ "key": "auto_complete_visible" }, ]
  },

  { "keys": ["shift+tab"], "command": "insert", "args": {"characters": "\t"} },
  { "keys": ["shift+tab"], "command": "unindent", "context":
  	[{ "key": "setting.shift_tab_unindent", "operator": "equal", "operand": true }]
  },
  { "keys": ["shift+tab"], "command": "unindent", "context":
  	[{ "key": "preceding_text", "operator": "regex_match", "operand": "^[\t ]*" }]
  },
  { "keys": ["shift+tab"], "command": "unindent", "context":
  	[{ "key": "text", "operator": "regex_contains", "operand": "\n" }]
  },
  { "keys": ["shift+tab"], "command": "move", "args": {"by": "lines", "forward": false}, "context":
  	[{ "key": "overlay_visible", "operator": "equal", "operand": true }]
  },
  { "keys": ["shift+tab"], "command": "prev_field", "context":
  	[{ "key": "has_prev_field", "operator": "equal", "operand": true }]
  },

  { "keys": ["super+l"], "command": "expand_selection", "args": {"to": "line"} },
  { "keys": ["super+alt+l"], "command": "expand_selection", "args": {"to": "line_prev"} },
  { "keys": ["super+d"], "command": "find_under_expand" },
  { "keys": ["super+k", "super+d"], "command": "find_under_expand_skip" },
  { "keys": ["super+shift+space"], "command": "expand_selection", "args": {"to": "scope"} },
  { "keys": ["super+shift+a"], "command": "expand_selection", "args": {"to": "smart"} },
  { "keys": ["ctrl+shift+m"], "command": "expand_selection", "args": {"to": "brackets"} },
  { "keys": ["ctrl+m"], "command": "move_to", "args": {"to": "brackets"} },
  { "keys": ["super+shift+a"], "command": "expand_selection", "args": {"to": "tag"}, "context":
  	[
  		{ "key": "selector", "operator": "equal", "operand": "(text.html, text.xml) - source", "match_all": true }
  	]
  },

  { "keys": ["super+alt+."], "command": "close_tag" },

  { "keys": ["ctrl+q"], "command": "toggle_record_macro" },
  { "keys": ["ctrl+shift+q"], "command": "run_macro" },

  { "keys": ["super+keypad_enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line.sublime-macro"}, "context":
  	[
  		{ "key": "overlay_has_focus", "operator": "equal", "operand": false },
  	],
  },
  { "keys": ["super+shift+keypad_enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line Before.sublime-macro"} },
  { "keys": ["keypad_enter"], "command": "commit_completion", "context":
  	[
  		{ "key": "auto_complete_visible" },
  		{ "key": "setting.auto_complete_commit_on_tab", "operand": false }
  	]
  },
  { "keys": ["super+enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line.sublime-macro"}, "context":
  	[
  		{ "key": "overlay_has_focus", "operator": "equal", "operand": false },
  	],
   },
  { "keys": ["super+shift+enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line Before.sublime-macro"} },
  { "keys": ["enter"], "command": "commit_completion", "context":
  	[
  		{ "key": "auto_complete_visible" },
  		{ "key": "setting.auto_complete_commit_on_tab", "operand": false }
  	]
  },

  { "keys": ["super+t"], "command": "show_overlay", "args": {"overlay": "goto", "show_files": true} },
  { "keys": ["super+p"], "command": "show_overlay", "args": {"overlay": "goto", "show_files": true} },
  { "keys": ["super+shift+p"], "command": "show_overlay", "args": {"overlay": "command_palette"} },
  { "keys": ["super+ctrl+p"], "command": "prompt_select_workspace" },
  { "keys": ["super+r"], "command": "show_overlay", "args": {"overlay": "goto", "text": "@"} },
  { "keys": ["ctrl+g"], "command": "show_overlay", "args": {"overlay": "goto", "text": ":"} },
  { "keys": ["f12"], "command": "goto_definition" },
  { "keys": ["super+f12"], "command": "goto_definition", "args": {"side_by_side": true, "clear_to_right": true} },
  { "keys": ["shift+f12"], "command": "goto_reference" },
  { "keys": ["super+shift+f12"], "command": "goto_reference", "args": {"side_by_side": true, "clear_to_right": true} },
  { "keys": ["super+alt+down"], "command": "goto_definition" },
  { "keys": ["super+alt+shift+down"], "command": "goto_reference" },
  { "keys": ["super+shift+r"], "command": "goto_symbol_in_project" },
  { "keys": ["ctrl+minus"], "command": "jump_back" },
  { "keys": ["ctrl+keypad_minus"], "command": "jump_back" },
  { "keys": ["ctrl+shift+minus"], "command": "jump_forward" },
  { "keys": ["ctrl+shift+keypad_minus"], "command": "jump_forward" },
  { "keys": ["f12"], "command": "auto_complete_open_link", "context":
  	[
  		{ "key": "auto_complete_visible", "operator": "equal", "operand": true },
  	]
  },
  { "keys": ["super+alt+down"], "command": "auto_complete_open_link", "context":
  	[
  		{ "key": "auto_complete_visible", "operator": "equal", "operand": true },
  	]
  },

  { "keys": ["super+i"], "command": "show_panel", "args": {"panel": "incremental_find", "reverse": false} },
  { "keys": ["super+shift+i"], "command": "show_panel", "args": {"panel": "incremental_find", "reverse": true} },
  { "keys": ["super+f"], "command": "show_panel", "args": {"panel": "find", "reverse": false} },
  { "keys": ["super+alt+f"], "command": "show_panel", "args": {"panel": "replace", "reverse": false} },
  { "keys": ["super+alt+e"], "command": "replace_next" },
  { "keys": ["super+g"], "command": "find_next" },
  { "keys": ["super+shift+g"], "command": "find_prev" },
  { "keys": ["super+e"], "command": "slurp_find_string" },
  { "keys": ["super+shift+e"], "command": "slurp_replace_string" },

  { "keys": ["alt+super+g"], "command": "find_under" },
  { "keys": ["shift+alt+super+g"], "command": "find_under_prev" },
  { "keys": ["ctrl+super+g"], "command": "find_all_under" },

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

  { "keys": ["ctrl+."], "command": "next_modification" },
  { "keys": ["ctrl+,"], "command": "prev_modification" },
  { "keys": ["super+k", "super+z"], "command": "revert_hunk" },
  { "keys": ["super+k", "super+shift+z"], "command": "revert_modification" },
  { "keys": ["super+k", "super+forward_slash"], "command": "toggle_inline_diff" },
  { "keys": ["super+k", "super+;"], "command": "toggle_inline_diff", "args": { "prefer_hide": true } },

  { "keys": ["f6"], "command": "toggle_setting", "args": {"setting": "spell_check"} },
  { "keys": ["ctrl+f6"], "command": "next_misspelling" },
  { "keys": ["ctrl+shift+f6"], "command": "prev_misspelling" },

  { "keys": ["ctrl+super+up"], "command": "swap_line_up" },
  { "keys": ["ctrl+super+down"], "command": "swap_line_down" },

  { "keys": ["ctrl+backspace"], "command": "delete_word", "args": { "forward": false, "sub_words": true } },
  { "keys": ["ctrl+delete"], "command": "delete_word", "args": { "forward": true, "sub_words": true } },

  { "keys": ["super+forward_slash"], "command": "toggle_comment", "args": { "block": false } },
  { "keys": ["super+alt+forward_slash"], "command": "toggle_comment", "args": { "block": true } },

  { "keys": ["super+j", "super+j"], "command": "primary_j_changed" },
  { "keys": ["super+shift+j"], "command": "join_lines" },
  { "keys": ["super+shift+d"], "command": "duplicate_line" },

  { "keys": ["ctrl+backquote"], "command": "show_panel", "args": {"panel": "console", "toggle": true} },

  { "keys": ["ctrl+space"], "command": "auto_complete" },
  { "keys": ["ctrl+space"], "command": "move", "args": {"by": "lines", "forward": true}, "context":
  	[
  		{ "key": "auto_complete_primed", "operator": "equal", "operand": true }
  	]
  },

  { "keys": ["super+alt+p"], "command": "show_scope_name" },
  { "keys": ["ctrl+shift+p"], "command": "show_scope_name" },

  { "keys": ["f7"], "command": "build" },
  { "keys": ["super+b"], "command": "build" },
  { "keys": ["super+shift+b"], "command": "build", "args": {"select": true} },

  { "keys": ["ctrl+c"], "command": "cancel_build" },

  { "keys": ["ctrl+t"], "command": "transpose" },

  { "keys": ["f5"], "command": "sort_lines", "args": {"case_sensitive": false} },
  { "keys": ["ctrl+f5"], "command": "sort_lines", "args": {"case_sensitive": true} },

  // Auto-pair quotes
  { "keys": ["\""], "command": "insert_snippet", "args": {"contents": "\"$0\""}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true },
  		{ "key": "preceding_text", "operator": "not_regex_contains", "operand": "[\"a-zA-Z0-9_]$", "match_all": true },
  		{ "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true }
  	]
  },
  { "keys": ["\""], "command": "insert_snippet", "args": {"contents": "\"${0:$SELECTION}\""}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }
  	]
  },
  { "keys": ["\""], "command": "move", "args": {"by": "characters", "forward": true}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true },
  		{ "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true },
  		{ "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true },
  	]
  },
  { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "preceding_text", "operator": "regex_contains", "operand": "\"$", "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true },
  		{ "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true },
  		{ "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true },
  	]
  },

  // Auto-pair single quotes
  { "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'$0'"}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true },
  		{ "key": "preceding_text", "operator": "not_regex_contains", "operand": "['a-zA-Z0-9_]$", "match_all": true },
  		{ "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single - punctuation.definition.string.end", "match_all": true }
  	]
  },
  { "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'${0:$SELECTION}'"}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }
  	]
  },
  { "keys": ["'"], "command": "move", "args": {"by": "characters", "forward": true}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true },
  		{ "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true },
  		{ "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single - punctuation.definition.string.end", "match_all": true },
  	]
  },
  { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "preceding_text", "operator": "regex_contains", "operand": "'$", "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true },
  		{ "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true },
  		{ "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single - punctuation.definition.string.end", "match_all": true },
  	]
  },

  // Auto-pair brackets
  { "keys": ["("], "command": "insert_snippet", "args": {"contents": "($0)"}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|;|\\}|$)", "match_all": true }
  	]
  },
  { "keys": ["("], "command": "insert_snippet", "args": {"contents": "(${0:$SELECTION})"}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }
  	]
  },
  { "keys": [")"], "command": "move", "args": {"by": "characters", "forward": true}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^\\)", "match_all": true }
  	]
  },
  { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "preceding_text", "operator": "regex_contains", "operand": "\\($", "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^\\)", "match_all": true }
  	]
  },

  // Auto-pair square brackets
  { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[$0]"}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|;|\\}|$)", "match_all": true }
  	]
  },
  { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[${0:$SELECTION}]"}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }
  	]
  },
  { "keys": ["]"], "command": "move", "args": {"by": "characters", "forward": true}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true }
  	]
  },
  { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "preceding_text", "operator": "regex_contains", "operand": "\\[$", "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true }
  	]
  },

  // Auto-pair curly brackets
  { "keys": ["{"], "command": "insert_snippet", "args": {"contents": "{$0}"}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|$)", "match_all": true }
  	]
  },
  { "keys": ["{"], "command": "wrap_block", "args": {"begin": "{", "end": "}"}, "context":
  	[
  		{ "key": "indented_block", "match_all": true },
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true },
  	]
  },
  { "keys": ["{"], "command": "insert_snippet", "args": {"contents": "{${0:$SELECTION}}"}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }
  	]
  },
  { "keys": ["}"], "command": "move", "args": {"by": "characters", "forward": true}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true }
  	]
  },
  { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context":
  	[
  		{ "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true }
  	]
  },

  { "keys": ["enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line in Braces.sublime-macro"}, "context":
  	[
  		{ "key": "setting.auto_indent", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true }
  	]
  },
  { "keys": ["shift+enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line in Braces.sublime-macro"}, "context":
  	[
  		{ "key": "setting.auto_indent", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true }
  	]
  },

  { "keys": ["enter"], "command": "auto_indent_tag", "context":
  	[
  		{ "key": "setting.auto_indent", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "selector", "operator": "equal", "operand": "punctuation.definition.tag.begin", "match_all": true },
  		{ "key": "preceding_text", "operator": "regex_contains", "operand": ">$", "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^</", "match_all": true },
  	]
  },
  { "keys": ["shift+enter"], "command": "auto_indent_tag", "context":
  	[
  		{ "key": "setting.auto_indent", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "selector", "operator": "equal", "operand": "punctuation.definition.tag.begin", "match_all": true },
  		{ "key": "preceding_text", "operator": "regex_contains", "operand": ">$", "match_all": true },
  		{ "key": "following_text", "operator": "regex_contains", "operand": "^</", "match_all": true },
  	]
  },

  { "keys": ["enter"], "command": "insert", "args": {"characters": "\n* "}, "context":
  	[
  		{ "key": "setting.auto_indent", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "selector", "operator": "equal", "operand": "source comment", "match_all": true },
  		{ "key": "preceding_text", "operator": "regex_contains", "operand": "^\\s*\\*", "match_all": true },
  		{ "key": "following_text", "operator": "regex_match", "operand": "(?!/).*", "match_all": true },
  		{ "key": "is_javadoc", "operator": "equal", "operand": true, "match_all": true },
  	]
  },
  { "keys": ["enter"], "command": "insert", "args": {"characters": "\n * "}, "context":
  	[
  		{ "key": "setting.auto_indent", "operator": "equal", "operand": true },
  		{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
  		{ "key": "selector", "operator": "equal", "operand": "source comment", "match_all": true },
  		{ "key": "preceding_text", "operator": "regex_contains", "operand": "^\\s*/\\*[*!]", "match_all": true },
  		{ "key": "following_text", "operator": "regex_match", "operand": "(?!/).*", "match_all": true },
  		{ "key": "is_javadoc", "operator": "equal", "operand": true, "match_all": true },
  	]
  },

  {
  	"keys": ["super+alt+1"],
  	"command": "set_layout",
  	"args":
  	{
  		"cols": [0.0, 1.0],
  		"rows": [0.0, 1.0],
  		"cells": [[0, 0, 1, 1]]
  	}
  },
  {
  	"keys": ["super+alt+2"],
  	"command": "set_layout",
  	"args":
  	{
  		"cols": [0.0, 0.5, 1.0],
  		"rows": [0.0, 1.0],
  		"cells": [[0, 0, 1, 1], [1, 0, 2, 1]]
  	}
  },
  {
  	"keys": ["super+alt+3"],
  	"command": "set_layout",
  	"args":
  	{
  		"cols": [0.0, 0.33, 0.66, 1.0],
  		"rows": [0.0, 1.0],
  		"cells": [[0, 0, 1, 1], [1, 0, 2, 1], [2, 0, 3, 1]]
  	}
  },
  {
  	"keys": ["super+alt+4"],
  	"command": "set_layout",
  	"args":
  	{
  		"cols": [0.0, 0.25, 0.5, 0.75, 1.0],
  		"rows": [0.0, 1.0],
  		"cells": [[0, 0, 1, 1], [1, 0, 2, 1], [2, 0, 3, 1], [3, 0, 4, 1]]
  	}
  },
  {
  	"keys": ["super+alt+shift+2"],
  	"command": "set_layout",
  	"args":
  	{
  		"cols": [0.0, 1.0],
  		"rows": [0.0, 0.5, 1.0],
  		"cells": [[0, 0, 1, 1], [0, 1, 1, 2]]
  	}
  },
  {
  	"keys": ["super+alt+shift+3"],
  	"command": "set_layout",
  	"args":
  	{
  		"cols": [0.0, 1.0],
  		"rows": [0.0, 0.33, 0.66, 1.0],
  		"cells": [[0, 0, 1, 1], [0, 1, 1, 2], [0, 2, 1, 3]]
  	}
  },
  {
  	"keys": ["super+alt+5"],
  	"command": "set_layout",
  	"args":
  	{
  		"cols": [0.0, 0.5, 1.0],
  		"rows": [0.0, 0.5, 1.0],
  		"cells":
  		[
  			[0, 0, 1, 1], [1, 0, 2, 1],
  			[0, 1, 1, 2], [1, 1, 2, 2]
  		]
  	}
  },
  { "keys": ["ctrl+1"], "command": "focus_group", "args": { "group": 0 } },
  { "keys": ["ctrl+2"], "command": "focus_group", "args": { "group": 1 } },
  { "keys": ["ctrl+3"], "command": "focus_group", "args": { "group": 2 } },
  { "keys": ["ctrl+4"], "command": "focus_group", "args": { "group": 3 } },
  { "keys": ["ctrl+5"], "command": "focus_group", "args": { "group": 4 } },
  { "keys": ["ctrl+6"], "command": "focus_group", "args": { "group": 5 } },
  { "keys": ["ctrl+7"], "command": "focus_group", "args": { "group": 6 } },
  { "keys": ["ctrl+8"], "command": "focus_group", "args": { "group": 7 } },
  { "keys": ["ctrl+9"], "command": "focus_group", "args": { "group": 8 } },
  { "keys": ["ctrl+shift+1"], "command": "move_to_group", "args": { "group": 0 } },
  { "keys": ["ctrl+shift+2"], "command": "move_to_group", "args": { "group": 1 } },
  { "keys": ["ctrl+shift+3"], "command": "move_to_group", "args": { "group": 2 } },
  { "keys": ["ctrl+shift+4"], "command": "move_to_group", "args": { "group": 3 } },
  { "keys": ["ctrl+shift+5"], "command": "move_to_group", "args": { "group": 4 } },
  { "keys": ["ctrl+shift+6"], "command": "move_to_group", "args": { "group": 5 } },
  { "keys": ["ctrl+shift+7"], "command": "move_to_group", "args": { "group": 6 } },
  { "keys": ["ctrl+shift+8"], "command": "move_to_group", "args": { "group": 7 } },
  { "keys": ["ctrl+shift+9"], "command": "move_to_group", "args": { "group": 8 } },
  { "keys": ["ctrl+0"], "command": "focus_side_bar" },

  { "keys": ["super+k", "super+up"], "command": "new_pane" },
  { "keys": ["super+k", "super+shift+up"], "command": "new_pane", "args": {"move": false} },
  { "keys": ["super+k", "super+down"], "command": "close_pane" },
  { "keys": ["super+k", "super+left"], "command": "focus_neighboring_group", "args": {"forward": false} },
  { "keys": ["super+k", "super+right"], "command": "focus_neighboring_group" },
  { "keys": ["super+k", "super+shift+left"], "command": "move_to_neighboring_group", "args": {"forward": false} },
  { "keys": ["super+k", "super+shift+right"], "command": "move_to_neighboring_group" },

  { "keys": ["super+1"], "command": "select_by_index", "args": { "index": 0 } },
  { "keys": ["super+2"], "command": "select_by_index", "args": { "index": 1 } },
  { "keys": ["super+3"], "command": "select_by_index", "args": { "index": 2 } },
  { "keys": ["super+4"], "command": "select_by_index", "args": { "index": 3 } },
  { "keys": ["super+5"], "command": "select_by_index", "args": { "index": 4 } },
  { "keys": ["super+6"], "command": "select_by_index", "args": { "index": 5 } },
  { "keys": ["super+7"], "command": "select_by_index", "args": { "index": 6 } },
  { "keys": ["super+8"], "command": "select_by_index", "args": { "index": 7 } },
  { "keys": ["super+9"], "command": "select_last_tab" },

  { "keys": ["super+j", "super+up"], "command": "unselect_others" },
  { "keys": ["super+j", "super+left"], "command": "unselect_to_left" },
  { "keys": ["super+j", "super+right"], "command": "unselect_to_right" },
  { "keys": ["super+j", "super+shift+left"], "command": "select_to_left" },
  { "keys": ["super+j", "super+shift+right"], "command": "select_to_right" },
  { "keys": ["super+j", "super+shift+["], "command": "focus_to_left" },
  { "keys": ["super+j", "super+shift+]"], "command": "focus_to_right" },

  { "keys": ["super+1"], "command": "focus_by_index", "args": { "index": 0 },
  	"context": [{ "key": "group_has_multiselect", "operator": "equal", "operand": true }]
  },
  { "keys": ["super+2"], "command": "focus_by_index", "args": { "index": 1 },
  	"context": [{ "key": "group_has_multiselect", "operator": "equal", "operand": true }]
  },
  { "keys": ["super+3"], "command": "focus_by_index", "args": { "index": 2 },
  	"context": [{ "key": "group_has_multiselect", "operator": "equal", "operand": true }]
  },
  { "keys": ["super+4"], "command": "focus_by_index", "args": { "index": 3 },
  	"context": [{ "key": "group_has_multiselect", "operator": "equal", "operand": true }]
  },
  { "keys": ["super+5"], "command": "focus_by_index", "args": { "index": 4 },
  	"context": [{ "key": "group_has_multiselect", "operator": "equal", "operand": true }]
  },
  { "keys": ["super+6"], "command": "focus_by_index", "args": { "index": 5 },
  	"context": [{ "key": "group_has_multiselect", "operator": "equal", "operand": true }]
  },
  { "keys": ["super+7"], "command": "focus_by_index", "args": { "index": 6 },
  	"context": [{ "key": "group_has_multiselect", "operator": "equal", "operand": true }]
  },
  { "keys": ["super+8"], "command": "focus_by_index", "args": { "index": 7 },
  	"context": [{ "key": "group_has_multiselect", "operator": "equal", "operand": true }]
  },
  { "keys": ["super+9"], "command": "focus_by_index", "args": { "index": 8 },
  	"context": [{ "key": "group_has_multiselect", "operator": "equal", "operand": true }]
  },
  { "keys": ["super+0"], "command": "focus_by_index", "args": { "index": 9 },
  	"context": [{ "key": "group_has_multiselect", "operator": "equal", "operand": true }]
  },

  { "keys": ["f2"], "command": "next_bookmark" },
  { "keys": ["shift+f2"], "command": "prev_bookmark" },
  { "keys": ["super+f2"], "command": "toggle_bookmark", "args": {"toggle_line": true } },
  { "keys": ["super+shift+f2"], "command": "clear_bookmarks" },
  { "keys": ["alt+f2"], "command": "select_all_bookmarks" },

  { "keys": ["ctrl+r"], "command": "next_bookmark" },
  { "keys": ["ctrl+shift+r"], "command": "toggle_bookmark" },

  { "keys": ["super+k", "super+u"], "command": "upper_case" },
  { "keys": ["super+k", "super+l"], "command": "lower_case" },
  { "keys": ["super+k", "super+m"], "command": "set_mark" },
  { "keys": ["super+k", "super+a"], "command": "select_to_mark" },
  { "keys": ["super+k", "super+w"], "command": "delete_to_mark" },
  { "keys": ["super+k", "super+x"], "command": "swap_with_mark" },
  { "keys": ["super+k", "super+g"], "command": "clear_bookmarks", "args": {"name": "mark"} },

  { "keys": ["super+equals"], "command": "increase_font_size" },
  { "keys": ["super+plus"], "command": "increase_font_size" },
  { "keys": ["super+keypad_plus"], "command": "increase_font_size" },
  { "keys": ["super+minus"], "command": "decrease_font_size" },
  { "keys": ["super+keypad_minus"], "command": "decrease_font_size" },

  { "keys": ["ctrl+shift+w"], "command": "insert_snippet", "args": { "name": "Packages/XML/Snippets/xml-long-tag.sublime-snippet" } },

  { "keys": ["ctrl+shift+k"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Line.sublime-macro"} },

  { "keys": ["super+alt+q"], "command": "wrap_lines" },

  { "keys": ["super+alt+["], "command": "fold" },
  { "keys": ["super+alt+]"], "command": "unfold" },
  { "keys": ["super+k", "super+1"], "command": "fold_by_level", "args": {"level": 1} },
  { "keys": ["super+k", "super+2"], "command": "fold_by_level", "args": {"level": 2} },
  { "keys": ["super+k", "super+3"], "command": "fold_by_level", "args": {"level": 3} },
  { "keys": ["super+k", "super+4"], "command": "fold_by_level", "args": {"level": 4} },
  { "keys": ["super+k", "super+5"], "command": "fold_by_level", "args": {"level": 5} },
  { "keys": ["super+k", "super+6"], "command": "fold_by_level", "args": {"level": 6} },
  { "keys": ["super+k", "super+7"], "command": "fold_by_level", "args": {"level": 7} },
  { "keys": ["super+k", "super+8"], "command": "fold_by_level", "args": {"level": 8} },
  { "keys": ["super+k", "super+9"], "command": "fold_by_level", "args": {"level": 9} },
  { "keys": ["super+k", "super+0"], "command": "unfold_all" },
  { "keys": ["super+k", "super+j"], "command": "unfold_all" },
  { "keys": ["super+k", "super+t"], "command": "fold_tag_attributes" },

  { "keys": ["super+alt+o"], "command": "toggle_overwrite" },

  { "keys": ["alt+f2"], "command": "context_menu" },

  { "keys": ["super+alt+c"], "command": "toggle_case_sensitive", "context":
  	[{"key": "panel_type", "operand": "find"}, {"key": "panel_has_focus"}],
  },
  { "keys": ["super+alt+r"], "command": "toggle_regex", "context":
  	[{"key": "panel_type", "operand": "find"}, {"key": "panel_has_focus"}],
  },
  { "keys": ["super+alt+w"], "command": "toggle_whole_word", "context":
  	[{"key": "panel_type", "operand": "find"}, {"key": "panel_has_focus"}],
  },
  { "keys": ["super+alt+a"], "command": "toggle_preserve_case", "context":
  	[{"key": "panel_type", "operand": "find"}, {"key": "panel_has_focus"}],
  },

  // Find panel key bindings
  { "keys": ["keypad_enter"], "command": "find_next", "context":
  	[{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["shift+keypad_enter"], "command": "find_prev", "context":
  	[{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["alt+keypad_enter"], "command": "find_all", "args": {"close_panel": true},
  	 "context": [{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["enter"], "command": "find_next", "context":
  	[{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["shift+enter"], "command": "find_prev", "context":
  	[{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["alt+enter"], "command": "find_all", "args": {"close_panel": true},
  	 "context": [{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}]
  },

  // Replace panel key bindings
  { "keys": ["keypad_enter"], "command": "find_next", "context":
  	[{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["shift+keypad_enter"], "command": "find_prev", "context":
  	[{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["alt+keypad_enter"], "command": "find_all", "args": {"close_panel": true},
  	"context": [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["ctrl+alt+keypad_enter"], "command": "replace_all", "args": {"close_panel": true},
  	 "context": [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["enter"], "command": "find_next", "context":
  	[{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["shift+enter"], "command": "find_prev", "context":
  	[{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["alt+enter"], "command": "find_all", "args": {"close_panel": true},
  	"context": [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["ctrl+alt+enter"], "command": "replace_all", "args": {"close_panel": true},
  	 "context": [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}]
  },

  // Incremental find panel key bindings
  { "keys": ["keypad_enter"], "command": "hide_panel", "context":
  	[{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["shift+keypad_enter"], "command": "chain", "args": {
  	"commands": [{"command": "find_prev"}, {"command": "hide_panel"}]},
  	"context": [{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["alt+keypad_enter"], "command": "find_all", "args": {"close_panel": true},
  	"context": [{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["enter"], "command": "hide_panel", "context":
  	[{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["shift+enter"], "command": "chain", "args": {
  	"commands": [{"command": "find_prev"}, {"command": "hide_panel"}]},
  	"context": [{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["alt+enter"], "command": "find_all", "args": {"close_panel": true},
  	"context": [{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}]
  },

  // Find in Files panel key bindings
  { "keys": ["keypad_enter"], "command": "find_all",
  	"context": [{"key": "panel", "operand": "find_in_files"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["alt+keypad_enter"], "command": "find_all",
  	"context": [{"key": "panel", "operand": "find_in_files"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["ctrl+alt+keypad_enter"], "command": "replace_all",
  	"context": [{"key": "panel", "operand": "find_in_files"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["alt+enter"], "command": "find_all",
  	"context": [{"key": "panel", "operand": "find_in_files"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["enter"], "command": "find_all",
  	"context": [{"key": "panel", "operand": "find_in_files"}, {"key": "panel_has_focus"}]
  },
  { "keys": ["ctrl+alt+enter"], "command": "replace_all",
  	"context": [{"key": "panel", "operand": "find_in_files"}, {"key": "panel_has_focus"}]
  },

  { "keys": ["super+,"], "command": "edit_settings", "args":
  	{
  		"base_file": "${packages}/Default/Preferences.sublime-settings",
  		"default": "// Settings in here override those in \"Default/Preferences.sublime-settings\",\n// and are overridden in turn by syntax-specific settings.\n{\n\t$0\n}\n"
  	}
  },

  {
  	"keys": ["shift+escape"], "command": "show_panel",
  	"args": {"panel": "output.exec"},
  	"context": [ { "key": "panel_visible", "operand": false } ]
  },

  { "keys": ["enter"], "command": "select", "context":
  	[
  		{ "key": "panel_has_focus", "operator": "equal", "operand": true },
  		{ "key": "panel_type", "operand": "input"},
  	],
  },
  { "keys": ["keypad_enter"], "command": "select", "context":
  	[
  		{ "key": "panel_has_focus", "operator": "equal", "operand": true },
  		{ "key": "panel_type", "operand": "input"},
  	],
  },

  //Overlay key bindings
  { "keys": ["enter"], "command": "select", "context":
  	[
  		{ "key": "overlay_has_focus", "operator": "equal", "operand": true }
  	],
  },
  { "keys": ["keypad_enter"], "command": "select", "context":
  	[
  		{ "key": "overlay_has_focus", "operator": "equal", "operand": true }		],
  },
  { "keys": ["super+enter"], "command": "select", "args": { "extend": true, "clear_to_right": true }, "context":
  	[
  		{ "key": "overlay_has_focus", "operator": "equal", "operand": true },
  		{ "key": "overlay_name", "operator": "equal", "operand" : "goto" }
  	],
  },
  { "keys": ["super+keypad_enter"], "command": "select", "args" : { "extend": true, "clear_to_right": true }, "context":
  	[
  		{ "key": "overlay_has_focus", "operator": "equal", "operand": true },
  		{ "key": "overlay_name", "operator": "equal", "operand" : "goto" }
  	],
  },
  { "keys": ["shift+enter"], "command": "select", "args": { "extend": true }, "context":
  	[
  		{ "key": "overlay_has_focus", "operator": "equal", "operand": true },
  		{ "key": "overlay_name", "operator": "equal", "operand" : "goto" }
  	],
  },
  { "keys": ["shift+keypad_enter"], "command": "select", "args" : { "extend": true }, "context":
  	[
  		{ "key": "overlay_has_focus", "operator": "equal", "operand": true },
  		{ "key": "overlay_name", "operator": "equal", "operand" : "goto" }
  	],
  },
  { "keys": ["alt+enter"], "command": "select", "args": { "replace": true }, "context":
  	[
  		{ "key": "overlay_has_focus", "operator": "equal", "operand": true },
  		{ "key": "overlay_name", "operator": "equal", "operand" : "goto" }
  	],
  },
  { "keys": ["alt+keypad_enter"], "command": "select", "args": { "replace": true }, "context":
  	[
  		{ "key": "overlay_has_focus", "operator": "equal", "operand": true },
  		{ "key": "overlay_name", "operator": "equal", "operand" : "goto" }
  	],
  },
  { "keys": ["escape"], "command": "hide_overlay", "context":
  	[
  		{ "key": "overlay_visible", "operator": "equal", "operand": true },
  		{ "key": "panel_has_focus", "operator": "equal", "operand": false }
  	]
  },

  // HTML, XML close tag
  { "keys": ["/"], "command": "close_tag", "args": { "insert_slash": true }, "context":
  	[
  		{ "key": "selector", "operator": "equal", "operand": "(text.html, text.xml) - string - comment", "match_all": true },
  		{ "key": "preceding_text", "operator": "regex_match", "operand": ".*<$", "match_all": true },
  		{ "key": "setting.auto_close_tags" }
  	]
  },

  { "keys": ["super+k", "super+y"], "command": "yank" },
  { "keys": ["super+k", "super+k"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete to Hard EOL.sublime-macro"} },
  { "keys": ["super+k", "super+backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete to Hard BOL.sublime-macro"} },
  { "keys": ["super+k", "super+c"], "command": "show_at_center" },

  // These are OS X built in commands, and don't need to be listed here, but
  // doing so lets them show up in the menu
  { "keys": ["ctrl+y"], "command": "yank" },
  { "keys": ["super+backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete to Hard BOL.sublime-macro"} },
  // super+delete isn't a built in command, but makes sense anyway
  { "keys": ["super+delete"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete to Hard EOL.sublime-macro"} },
  { "keys": ["ctrl+k"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete to Hard EOL.sublime-macro"} },
  { "keys": ["ctrl+l"], "command": "show_at_center" },
  { "keys": ["ctrl+o"], "command": "insert_snippet", "args": { "contents": "$0\n" } },
  { "keys": ["ctrl+super+d"], "command": "noop" },
  { "keys": ["ctrl+super+shift+d"], "command": "noop" },
]

@SomeoneToIgnore SomeoneToIgnore self-assigned this Dec 11, 2024
@Igonato Igonato force-pushed the workspace-move-editor-actions branch from 6ed4888 to 63a60f9 Compare December 11, 2024 16:31
@Igonato
Copy link
Author

Igonato commented Dec 11, 2024

Noticed something, when switching (ctrl-tab) and moving empty tabs. Everything is as smooth as butter. Once I open some files, they can interfere with switching. Sometimes quite badly (see 0:34 in the video). The window title in the taskbar switches, but the interface lags.

2024-12-11_19-42-07.mp4

@Igonato
Copy link
Author

Igonato commented Dec 11, 2024

Question: I'd like to add an option to keep the focus in the source pane (as suggested in #14817). What is the best way to add it? Is there an action that has default params I can look at? Would it be better to add as set of separate cations SendItemToPane, SendItemToPaneInDirection?

On a related note: what do you think about a set of unparameterized actions that will appear in the command palette for discoverability (MoveActiveItemLeft, MoveActiveItemRight)?

@SomeoneToIgnore
Copy link
Contributor

Not sure about the lag, one idea might be that a moved element is not redrawing timely (cx.notify() might help, that makes the cx-related view dirty and redraws it soon).

Is there an action that has default params I can look at?

I think that adding another parameter makes more sense than a setting or separate actions, as people can bind it however they like this way.

#[derive(PartialEq, Clone, Deserialize, Default)]
pub struct MoveToBeginningOfLine {
#[serde(default = "default_true")]
pub stop_at_soft_wraps: bool,
}

"cmd-shift-left": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": true }],
"shift-home": ["editor::SelectToBeginningOfLine", { "stop_at_soft_wraps": true }],

is one example of such definitions.
If we add a number of bindings in each keymap-*.json file, those will be used as defaults.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cla-signed The user has signed the Contributor License Agreement
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Move a single editor from one pane to another with vim ctrl-w
4 participants