diff --git a/src/keybind/builtin/flow.json b/src/keybind/builtin/flow.json index 6a0af6b..fa63655 100644 --- a/src/keybind/builtin/flow.json +++ b/src/keybind/builtin/flow.json @@ -52,12 +52,8 @@ ["ctrl+shift+tab", "previous_tab"], ["ctrl+page_down", "next_tab"], ["ctrl+page_up", "previous_tab"], - ["ctrl+kp_page_down", "next_tab"], - ["ctrl+kp_page_up", "previous_tab"], ["ctrl+shift+page_down", "move_tab_next"], ["ctrl+shift+page_up", "move_tab_previous"], - ["ctrl+shift+kp_page_down", "move_tab_next"], - ["ctrl+shift+kp_page_up", "move_tab_previous"], ["ctrl+shift+e", "switch_buffers"], ["alt+shift+v", "clipboard_history"], ["ctrl+0", "reset_fontsize"], @@ -107,20 +103,12 @@ ["ctrl+enter", "smart_insert_line_after"], ["ctrl+end", "move_buffer_end"], ["ctrl+home", "move_buffer_begin"], - ["ctrl+kp_end", "move_buffer_end"], - ["ctrl+kp_home", "move_buffer_begin"], ["ctrl+up", "move_scroll_up"], ["ctrl+down", "move_scroll_down"], - ["ctrl+kp_up", "move_scroll_up"], - ["ctrl+kp_down", "move_scroll_down"], ["alt+page_up", "move_scroll_page_up"], ["alt+page_down", "move_scroll_page_down"], - ["alt+kp_page_up", "move_scroll_page_up"], - ["alt+kp_page_down", "move_scroll_page_down"], ["ctrl+left", "move_word_left"], ["ctrl+right", "move_word_right"], - ["ctrl+kp_left", "move_word_left"], - ["ctrl+kp_right", "move_word_right"], ["ctrl+shift+\\", "goto_bracket"], ["ctrl+backspace", "delete_word_left"], ["ctrl+delete", "delete_word_right"], @@ -137,16 +125,10 @@ ["ctrl+shift+enter", "smart_insert_line_before"], ["ctrl+shift+end", "select_buffer_end"], ["ctrl+shift+home", "select_buffer_begin"], - ["ctrl+shift+kp_end", "select_buffer_end"], - ["ctrl+shift+kp_home", "select_buffer_begin"], ["ctrl+shift+up", "select_scroll_up"], ["ctrl+shift+down", "select_scroll_down"], - ["ctrl+shift+kp_up", "select_scroll_up"], - ["ctrl+shift+kp_down", "select_scroll_down"], ["ctrl+shift+left", "select_word_left"], ["ctrl+shift+right", "select_word_right"], - ["ctrl+shift+kp_left", "select_word_left"], - ["ctrl+shift+kp_right", "select_word_right"], ["ctrl+shift+space", "selections_reverse"], ["alt+j", "join_next_line"], ["alt+n", "goto_next_file_or_diagnostic"], @@ -164,12 +146,8 @@ ["alt+R", ["shell_execute_insert", "openssl", "rand", "-hex", "4"]], ["alt+left", "jump_back"], ["alt+right", "jump_forward"], - ["alt+kp_left", "jump_back"], - ["alt+kp_right", "jump_forward"], ["alt+up", "pull_up"], ["alt+down", "pull_down"], - ["alt+kp_up", "pull_up"], - ["alt+kp_down", "pull_down"], ["alt+enter", "insert_line"], ["alt+f10", "gutter_mode_next"], ["alt+shift+f10", "gutter_style_next"], @@ -180,12 +158,8 @@ ["alt+shift+i", "add_cursors_to_line_ends"], ["alt+shift+left", "expand_selection"], ["alt+shift+right", "shrink_selection"], - ["alt+shift+kp_left", "expand_selection"], - ["alt+shift+kp_right", "shrink_selection"], ["alt+home", "select_prev_sibling"], ["alt+end", "select_next_sibling"], - ["alt+kp_home", "select_prev_sibling"], - ["alt+kp_end", "select_next_sibling"], ["alt+{", "expand_selection"], ["alt+}", "shrink_selection", true], ["alt+[", "select_prev_sibling", true], @@ -193,32 +167,20 @@ ["alt+a", "select_all_siblings"], ["alt+shift+home", "move_scroll_left"], ["alt+shift+end", "move_scroll_right"], - ["alt+shift+kp_home", "move_scroll_left"], - ["alt+shift+kp_end", "move_scroll_right"], ["alt+shift+up", "add_cursor_up"], ["alt+shift+down", "add_cursor_down"], - ["alt+shift+kp_up", "add_cursor_up"], - ["alt+shift+kp_down", "add_cursor_down"], ["alt+shift+f12", "goto_type_definition"], ["shift+f3", "goto_prev_match"], ["shift+f10", "toggle_syntax_highlighting"], ["shift+f12", "references"], ["shift+left", "select_left"], ["shift+right", "select_right"], - ["shift+kp_left", "select_left"], - ["shift+kp_right", "select_right"], ["shift+up", "select_up"], ["shift+down", "select_down"], - ["shift+kp_up", "select_up"], - ["shift+kp_down", "select_down"], ["shift+home", "smart_select_begin"], ["shift+end", "select_end"], - ["shift+kp_home", "smart_select_begin"], - ["shift+kp_end", "select_end"], ["shift+page_up", "select_page_up"], ["shift+page_down", "select_page_down"], - ["shift+kp_page_up", "select_page_up"], - ["shift+kp_page_down", "select_page_down"], ["shift+enter", "smart_insert_line_before"], ["shift+backspace", "delete_backward"], ["ctrl+shift+k", "delete_line"], @@ -243,22 +205,13 @@ ["backspace", "smart_delete_backward"], ["left", "move_left"], ["right", "move_right"], - ["kp_left", "move_left"], - ["kp_right", "move_right"], ["up", "move_up"], ["down", "move_down"], - ["kp_up", "move_up"], - ["kp_down", "move_down"], ["home", "smart_move_begin"], ["ctrl+k home", "move_begin"], ["end", "move_end"], - ["kp_home", "smart_move_begin"], - ["ctrl+k kp_home", "move_begin"], - ["kp_end", "move_end"], ["page_up", "move_page_up"], ["page_down", "move_page_down"], - ["kp_page_up", "move_page_up"], - ["kp_page_down", "move_page_down"], ["tab", "indent"], ["ctrl+shift+a", "enter_mode", "select"], @@ -314,30 +267,16 @@ ["right", "select_right"], ["ctrl+left", "select_word_left"], ["ctrl+right", "select_word_right"], - ["kp_left", "select_left"], - ["kp_right", "select_right"], - ["ctrl+kp_left", "select_word_left"], - ["ctrl+kp_right", "select_word_right"], ["up", "select_up"], ["down", "select_down"], - ["kp_up", "select_up"], - ["kp_down", "select_down"], ["home", "select_begin"], ["end", "select_end"], - ["kp_home", "select_begin"], - ["kp_end", "select_end"], ["ctrl+home", "select_buffer_begin"], ["ctrl+end", "select_buffer_end"], - ["ctrl+kp_home", "select_buffer_begin"], - ["ctrl+kp_end", "select_buffer_end"], ["page_up", "select_page_up"], ["page_down", "select_page_down"], ["alt+page_up", "select_scroll_page_up"], ["alt+page_down", "select_scroll_page_down"], - ["kp_page_up", "select_page_up"], - ["kp_page_down", "select_page_down"], - ["alt+kp_page_up", "select_scroll_page_up"], - ["alt+kp_page_down", "select_scroll_page_down"], ["ctrl+b", "move_to_char", "select_to_char_left"], ["ctrl+t", "move_to_char", "select_to_char_right"], ["shift+space", "enter_mode", "normal"], @@ -378,8 +317,6 @@ ["q", "quit"], ["up", "home_menu_up"], ["down", "home_menu_down"], - ["kp_up", "home_menu_up"], - ["kp_down", "home_menu_down"], ["enter", "home_menu_activate"] ] }, @@ -404,8 +341,6 @@ ["ctrl+escape", "palette_menu_cancel"], ["ctrl+up", "palette_menu_up"], ["ctrl+down", "palette_menu_down"], - ["ctrl+kp_up", "palette_menu_up"], - ["ctrl+kp_down", "palette_menu_down"], ["ctrl+enter", "palette_menu_activate"], ["ctrl+backspace", "overlay_delete_word_left"], ["ctrl+shift+e", "palette_menu_up"], @@ -424,16 +359,10 @@ ["escape", "palette_menu_cancel"], ["up", "palette_menu_up"], ["down", "palette_menu_down"], - ["kp_up", "palette_menu_up"], - ["kp_down", "palette_menu_down"], ["page_up", "palette_menu_pageup"], ["page_down", "palette_menu_pagedown"], - ["kp_page_up", "palette_menu_pageup"], - ["kp_page_down", "palette_menu_pagedown"], ["home", "palette_menu_top"], ["end", "palette_menu_bottom"], - ["kp_home", "palette_menu_top"], - ["kp_end", "palette_menu_bottom"], ["enter", "palette_menu_activate"], ["shift+enter", "palette_menu_activate_alternate"], ["tab", "palette_menu_complete"], @@ -512,12 +441,8 @@ ["shift+tab", "mini_mode_reverse_complete_file"], ["up", "mini_mode_reverse_complete_file"], ["down", "mini_mode_try_complete_file"], - ["kp_up", "mini_mode_reverse_complete_file"], - ["kp_down", "mini_mode_try_complete_file"], ["left", "mini_mode_delete_to_previous_path_segment"], ["right", "mini_mode_try_complete_file_forward"], - ["kp_left", "mini_mode_delete_to_previous_path_segment"], - ["kp_right", "mini_mode_try_complete_file_forward"], ["tab", "mini_mode_try_complete_file"], ["escape", "mini_mode_cancel"], ["enter", "mini_mode_select"], @@ -549,8 +474,6 @@ ["shift+f3", "goto_prev_match"], ["up", "select_prev_file"], ["down", "select_next_file"], - ["kp_up", "select_prev_file"], - ["kp_down", "select_next_file"], ["f3", "goto_next_match"], ["f15", "goto_prev_match"], ["f9", "theme_prev"], @@ -585,8 +508,6 @@ ["shift+f3", "goto_prev_match"], ["up", "mini_mode_history_prev"], ["down", "mini_mode_history_next"], - ["kp_up", "mini_mode_history_prev"], - ["kp_down", "mini_mode_history_next"], ["f3", "goto_next_match"], ["f15", "goto_prev_match"], ["f9", "theme_prev"], diff --git a/src/keybind/builtin/helix.json b/src/keybind/builtin/helix.json index 16b679f..915fb57 100644 --- a/src/keybind/builtin/helix.json +++ b/src/keybind/builtin/helix.json @@ -47,16 +47,12 @@ ["alt+;", "flip_selections"], ["alt+o", "expand_selection"], ["alt+up", "expand_selection"], - ["alt+kp_up", "expand_selection"], ["alt+i", "shrink_selection"], ["alt+down", "shrink_selection"], - ["alt+kp_down", "shrink_selection"], ["alt+p", "select_prev_sibling"], ["alt+left", "select_prev_sibling"], - ["alt+kp_left", "select_prev_sibling"], ["alt+n", "select_next_sibling"], ["alt+right", "select_next_sibling"], - ["alt+kp_right", "select_next_sibling"], ["alt+e", "move_parent_node_end"], ["alt+b", "move_parent_node_start"], @@ -97,7 +93,6 @@ ["?", "rfind"], ["N", "goto_prev_match"], ["*", "search_selection"], - ["kp_multiply", "search_selection"], ["~", "switch_case"], ["`", "to_lower"], @@ -133,8 +128,6 @@ ["home", "move_begin"], ["end", "move_end"], - ["kp_home", "move_begin"], - ["kp_end", "move_end"], ["v", "enter_mode", "select"], @@ -206,7 +199,6 @@ ["] space", "add_newline_below"], ["/", "find"], - ["kp_divide", "find"], ["n", "goto_next_match"], ["u", "undo"], @@ -226,8 +218,6 @@ ["page_up", "move_scroll_page_up"], ["page_down", "move_scroll_page_down"], - ["kp_page_up", "move_scroll_page_up"], - ["kp_page_down", "move_scroll_page_down"], ["space F", "find_file"], ["space S", "workspace_symbol_picker"], @@ -327,10 +317,6 @@ ["alt+down", "shrink_selection"], ["alt+left", "select_prev_sibling"], ["alt+right", "select_next_sibling"], - ["alt+kp_up", "expand_selection"], - ["alt+kp_down", "shrink_selection"], - ["alt+kp_left", "select_prev_sibling"], - ["alt+kp_right", "select_next_sibling"], ["alt+e", "extend_parent_node_end"], ["alt+b", "extend_parent_node_start"], @@ -387,7 +373,6 @@ ["N", "extend_search_next"], ["*", "search_selection"], - ["kp_multiply", "search_selection"], ["r", "replace"], ["P", "paste_clipboard_before"], @@ -420,18 +405,12 @@ ["down", "select_down"], ["up", "select_up"], ["right", "select_right_helix"], - ["kp_left", "select_left_helix"], - ["kp_down", "select_down"], - ["kp_up", "select_up"], - ["kp_right", "select_right_helix"], ["%", "select_all"], ["`", "switch_to_lowercase"], ["home", "extend_to_line_start"], ["end", "extend_to_line_end"], - ["kp_home", "extend_to_line_start"], - ["kp_end", "extend_to_line_end"], ["v", "enter_mode", "normal"], ["g g", "goto_line_vim"], @@ -503,7 +482,6 @@ ["] space", "add_newline_below"], ["/", "find"], - ["kp_divide", "find"], ["n", "add_next_match_helix"], ["u", "undo"], diff --git a/src/keybind/keybind.zig b/src/keybind/keybind.zig index 0143f97..6ab0e75 100644 --- a/src/keybind/keybind.zig +++ b/src/keybind/keybind.zig @@ -435,11 +435,22 @@ pub const Binding = struct { if (self.key_events.len == 0) return .match_impossible; for (self.key_events, 0..) |key_event, i| { if (match_key_events.len <= i) return .match_possible; - if (!(key_event.eql(match_key_events[i]) or key_event.eql_unshifted(match_key_events[i]))) + if (!keyevents_eql(key_event, match_key_events[i])) return .match_impossible; } return if (self.key_events.len == match_key_events.len) .matched else .match_possible; } + + fn keyevents_eql(lhs: KeyEvent, rhs: KeyEvent) bool { + if (lhs.eql(rhs) or lhs.eql_unshifted(rhs)) return true; + if (input.map_non_input_kp_key_to_regular_key(rhs.key)) |key| { + var mapped = rhs; + mapped.key = key; + mapped.key_unshifted = key; + if (lhs.eql(mapped) or lhs.eql_unshifted(mapped)) return true; + } + return false; + } }; pub const KeybindHints = std.StringHashMapUnmanaged([]u8); diff --git a/src/renderer/vaxis/input.zig b/src/renderer/vaxis/input.zig index 8e83f69..d357cc8 100644 --- a/src/renderer/vaxis/input.zig +++ b/src/renderer/vaxis/input.zig @@ -29,7 +29,9 @@ pub const mouse = struct { /// Does this key represent input? pub fn is_non_input_key(w: Key) bool { return switch (w) { - vaxis.Key.insert...vaxis.Key.iso_level_5_shift => true, + vaxis.Key.insert...vaxis.Key.f34 => true, + // skip kp_0 to kp_separator (which are between f34 and kp_left) + vaxis.Key.kp_left...vaxis.Key.iso_level_5_shift => true, vaxis.Key.enter => true, vaxis.Key.tab => true, vaxis.Key.escape => true, @@ -247,6 +249,16 @@ pub const utils = struct { vaxis.Key.kp_insert => "kp_insert", vaxis.Key.kp_delete => "kp_delete", vaxis.Key.kp_begin => "kp_begin", + vaxis.Key.kp_0 => "kp_0", + vaxis.Key.kp_1 => "kp_1", + vaxis.Key.kp_2 => "kp_2", + vaxis.Key.kp_3 => "kp_3", + vaxis.Key.kp_4 => "kp_4", + vaxis.Key.kp_5 => "kp_5", + vaxis.Key.kp_6 => "kp_6", + vaxis.Key.kp_7 => "kp_7", + vaxis.Key.kp_8 => "kp_8", + vaxis.Key.kp_9 => "kp_9", vaxis.Key.media_play => "media_play", vaxis.Key.media_pause => "media_pause", vaxis.Key.media_play_pause => "media_play_pause", @@ -449,3 +461,20 @@ fn map_key_to_unshifed_legacy(keypress_shifted: Key, mods: Mods) struct { Key, M else => .{ keypress_shifted, mods }, }; } + +pub fn map_non_input_kp_key_to_regular_key(key_: Key) ?Key { + return switch (key_) { + vaxis.Key.kp_enter => vaxis.Key.enter, + vaxis.Key.kp_left => vaxis.Key.left, + vaxis.Key.kp_right => vaxis.Key.right, + vaxis.Key.kp_up => vaxis.Key.up, + vaxis.Key.kp_down => vaxis.Key.down, + vaxis.Key.kp_page_up => vaxis.Key.page_up, + vaxis.Key.kp_page_down => vaxis.Key.page_down, + vaxis.Key.kp_home => vaxis.Key.home, + vaxis.Key.kp_end => vaxis.Key.end, + vaxis.Key.kp_insert => vaxis.Key.insert, + vaxis.Key.kp_delete => vaxis.Key.delete, + else => null, + }; +} diff --git a/src/tui/editor.zig b/src/tui/editor.zig index bc895eb..d2166be 100644 --- a/src/tui/editor.zig +++ b/src/tui/editor.zig @@ -314,6 +314,7 @@ pub const Editor = struct { selection_drag_initial: ?Selection = null, target_column: ?Cursor = null, filter_: ?struct { + arg0: ?[]const u8, before_root: Buffer.Root, work_root: Buffer.Root, begin: Cursor, @@ -6209,7 +6210,10 @@ pub const Editor = struct { }; const reversed = sel.is_reversed(); sel.normalize(); + var arg0: []const u8 = &.{}; + _ = cmd.match(.{ tp.extract(&arg0), tp.more }) catch {}; self.filter_ = .{ + .arg0 = try self.allocator.dupe(u8, arg0), .before_root = root, .work_root = root, .begin = sel.begin, @@ -6222,7 +6226,7 @@ pub const Editor = struct { const state = &self.filter_.?; var buf: [1024]u8 = undefined; const json = try cmd.to_json(&buf); - self.logger.print("filter: start {s}", .{json}); + std.log.debug("filter: start {s}", .{json}); var sp = try tp.subprocess.init(self.allocator, cmd, "filter", .Pipe); defer { sp.close() catch {}; @@ -6232,7 +6236,7 @@ pub const Editor = struct { var writer = sp.writer(&sp_buf); try state.before_root.write_range(sel, &writer.interface, null, self.metrics); try writer.interface.flush(); - self.logger.print("filter: sent", .{}); + std.log.debug("filter: sent", .{}); state.work_root = try state.work_root.delete_range(sel, buf_a_, null, self.metrics); } @@ -6251,7 +6255,7 @@ pub const Editor = struct { } fn filter_error(self: *Self, bytes: []const u8) !void { - self.logger.print("filter: ERR: {s}", .{bytes}); + std.log.err("filter: ERR: {s}", .{bytes}); if (tui.config().ignore_filter_stderr) return; defer self.filter_deinit(); if (self.need_save_after_filter) |info| { @@ -6263,7 +6267,8 @@ pub const Editor = struct { fn filter_not_found(self: *Self) !void { defer self.filter_deinit(); - self.logger.print_err("filter", "executable not found", .{}); + if (self.filter_) |*state| + std.log.err("executable '{?s}' not found", .{state.arg0}); if (self.need_save_after_filter) |info| { try self.save(); if (info.then) |then| @@ -6280,7 +6285,7 @@ pub const Editor = struct { const primary = self.get_primary(); if (state.whole_file) |buf| { if (buf.items.len == 0) { - self.logger.print_err("filter", "empty filter result", .{}); + std.log.err("filter: no output from filter", .{}); return; } const old_hash = blk: { @@ -6309,9 +6314,9 @@ pub const Editor = struct { if (state.old_primary_reversed) sel.reverse(); primary.cursor = sel.end; } - self.logger.print("filter: done (bytes:{d} chunks:{d})", .{ state.bytes, state.chunks }); + std.log.debug("filter: done (bytes:{d} chunks:{d})", .{ state.bytes, state.chunks }); if (state.no_changes) { - self.logger.print("filter: no changes", .{}); + std.log.warn("filter: no changes", .{}); } else { try self.update_buf_and_eol_mode(state.work_root, state.eol_mode, state.utf8_sanitized); primary.cursor.clamp_to_buffer(state.work_root, self.metrics); @@ -6328,6 +6333,7 @@ pub const Editor = struct { fn filter_deinit(self: *Self) void { const state = if (self.filter_) |*s| s else return; + if (state.arg0) |arg0| self.allocator.free(arg0); if (state.whole_file) |*buf| buf.deinit(self.allocator); self.filter_ = null; } diff --git a/src/tui/tui.zig b/src/tui/tui.zig index 0707d84..c2fcf45 100644 --- a/src/tui/tui.zig +++ b/src/tui/tui.zig @@ -617,8 +617,8 @@ fn render(self: *Self) void { switch (self.hint_mode) { .prefix => if (self.config_.enable_prefix_keyhints) - @import("keyhints.zig").render_current_key_event_sequence(self.allocator, .no_keypad, self.current_theme()), - .all => @import("keyhints.zig").render_current_input_mode(self.allocator, .no_keypad, self.current_theme()), + @import("keyhints.zig").render_current_key_event_sequence(self.allocator, .all, self.current_theme()), + .all => @import("keyhints.zig").render_current_input_mode(self.allocator, .all, self.current_theme()), .none => {}, }