From 612e5b312d9b0b4353b811559c7b9773eceb022d Mon Sep 17 00:00:00 2001 From: "C.D. MacEachern" Date: Fri, 24 Feb 2023 17:34:23 -0500 Subject: [PATCH 1/7] supporting python files, aka 'kittens' for kitty --- lua/Navigator/mux/kitty/neighboring_window.py | 9 ++++ lua/Navigator/mux/kitty/pass_keys.py | 46 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 lua/Navigator/mux/kitty/neighboring_window.py create mode 100644 lua/Navigator/mux/kitty/pass_keys.py diff --git a/lua/Navigator/mux/kitty/neighboring_window.py b/lua/Navigator/mux/kitty/neighboring_window.py new file mode 100644 index 0000000..4a7ece7 --- /dev/null +++ b/lua/Navigator/mux/kitty/neighboring_window.py @@ -0,0 +1,9 @@ +def main(): + pass + + +def handle_result(args, result, target_window_id, boss): + boss.active_tab.neighboring_window(args[1]) + + +handle_result.no_ui = True diff --git a/lua/Navigator/mux/kitty/pass_keys.py b/lua/Navigator/mux/kitty/pass_keys.py new file mode 100644 index 0000000..52c2b78 --- /dev/null +++ b/lua/Navigator/mux/kitty/pass_keys.py @@ -0,0 +1,46 @@ +import re + +from kittens.tui.handler import result_handler +from kitty.key_encoding import KeyEvent, parse_shortcut + + +def is_window_vim(window, vim_id): + fp = window.child.foreground_processes + print(fp) + return any(re.search(vim_id, p['cmdline'][0] if len(p['cmdline']) else '', re.I) for p in fp) + + +def encode_key_mapping(window, key_mapping): + mods, key = parse_shortcut(key_mapping) + event = KeyEvent( + mods=mods, + key=key, + shift=bool(mods & 1), + alt=bool(mods & 2), + ctrl=bool(mods & 4), + super=bool(mods & 8), + hyper=bool(mods & 16), + meta=bool(mods & 32), + ).as_window_system_event() + + return window.encoded_key(event) + + +def main(): + pass + + +@result_handler(no_ui=True) +def handle_result(args, result, target_window_id, boss): + window = boss.window_id_map.get(target_window_id) + direction = args[2] + key_mapping = args[3] + vim_id = args[4] if len(args) > 4 else "n?vim" + + if window is None: + return + if is_window_vim(window, vim_id): + encoded = encode_key_mapping(window, key_mapping) + window.write_to_child(encoded) + else: + boss.active_tab.neighboring_window(direction) From 6a4a4332c3ff26912d144ce6c889afe3fbef25d9 Mon Sep 17 00:00:00 2001 From: "C.D. MacEachern" Date: Fri, 24 Feb 2023 17:35:24 -0500 Subject: [PATCH 2/7] feat(mux): add Kitty navigator --- lua/Navigator/mux/kitty/init.lua | 53 ++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 lua/Navigator/mux/kitty/init.lua diff --git a/lua/Navigator/mux/kitty/init.lua b/lua/Navigator/mux/kitty/init.lua new file mode 100644 index 0000000..a5b075c --- /dev/null +++ b/lua/Navigator/mux/kitty/init.lua @@ -0,0 +1,53 @@ +---@mod navigator.kitty Kitty navigator +---@brief [[ +---This module provides navigation and interaction for kitty, and uses |navigator.vi| +---as a base class. This is used automatically when kitty is detected on host system +---but can also be used to manually override the mux. +--- +---Read also: https://github.com/numToStr/Navigator.nvim/wiki/kitty-Integration +---@brief ]] + +---@private +---@class Kitty: Vi +---@field private direction table +---@field private execute fun(arg: string): unknown +local Kitty = require('Navigator.mux.vi'):new() + +---Creates a new Kitty navigator instance +---@return Kitty +---@usage [[ +---local ok, kitty = pcall(function() +--- return require('Navigator.mux.kitty'):new() +---end) +--- +---require('Navigator').setup({ +--- mux = ok and kitty or 'auto' +---}) +---@usage ]] +function Kitty:new() + -- Kitty sets TERM, but not TERM_PROGRAM + assert(os.getenv('TERM') == 'xterm-kitty', '[Navigator] Kitty is not running!') + + local U = require('Navigator.utils') + + ---@type Kitty + local state = { + execute = function(arg) + return U.execute(string.format('kitty @ %s', arg)) + end, + direction = { h = 'left', j = 'bottom', k = 'top', l = 'right', }, + } + self.__index = self + return setmetatable(state, self) +end + +---Switch pane in kitty +---@param direction Direction See |navigator.api.Direction| +---@return Kitty +function Kitty:navigate(direction) + self.execute(string.format('kitten neighboring_window.py %s', self.direction[direction])) + return self +end + +return Kitty + From ee83b9b78d4f06ecd5ce1af21708f42d5ab81607 Mon Sep 17 00:00:00 2001 From: "C.D. MacEachern" Date: Fri, 24 Feb 2023 19:27:21 -0500 Subject: [PATCH 3/7] Add auto detection support for kitty --- lua/Navigator/navigate.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lua/Navigator/navigate.lua b/lua/Navigator/navigate.lua index 12af69b..84b4baf 100644 --- a/lua/Navigator/navigate.lua +++ b/lua/Navigator/navigate.lua @@ -25,6 +25,12 @@ local function load_mux() if ok_wezterm then return wezterm end + local ok_kitty, kitty = pcall(function() + return require('Navigator.mux.kitty'):new() + end) + if ok_kitty then + return kitty + end return require('Navigator.mux.vi'):new() end From 199ba638c323110385e13e02cca9cc61823d848b Mon Sep 17 00:00:00 2001 From: "C.D. MacEachern" Date: Fri, 24 Feb 2023 19:27:44 -0500 Subject: [PATCH 4/7] Add link in README to instructions for kitty integration --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ff02745..26e329a 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ vim.keymap.set({'n', 't'}, '', 'NavigatorPrevious') - [Tmux](https://github.com/numToStr/Navigator.nvim/wiki/Tmux-Integration) - [WezTerm](https://github.com/numToStr/Navigator.nvim/wiki/WezTerm-Integration) +- [Kitty](https://github.com/numToStr/Navigator.nvim/wiki/Kitty-Integration) #### Configuration (optional) From edcbdfb8dd213342573c8028f92254bb156bbf01 Mon Sep 17 00:00:00 2001 From: "C.D. MacEachern" Date: Mon, 27 Feb 2023 09:14:01 -0500 Subject: [PATCH 5/7] previous window binding works now --- lua/Navigator/mux/kitty/neighboring_window.py | 6 ++++-- lua/Navigator/mux/kitty/pass_keys.py | 19 ++++++++++++------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/lua/Navigator/mux/kitty/neighboring_window.py b/lua/Navigator/mux/kitty/neighboring_window.py index 4a7ece7..5453d9d 100644 --- a/lua/Navigator/mux/kitty/neighboring_window.py +++ b/lua/Navigator/mux/kitty/neighboring_window.py @@ -3,7 +3,9 @@ def main(): def handle_result(args, result, target_window_id, boss): - boss.active_tab.neighboring_window(args[1]) - + if args[1] == 'p': + boss.active_tab.nth_window(-1) + else: + boss.active_tab.neighboring_window(args[1]) handle_result.no_ui = True diff --git a/lua/Navigator/mux/kitty/pass_keys.py b/lua/Navigator/mux/kitty/pass_keys.py index 52c2b78..d7dbf0a 100644 --- a/lua/Navigator/mux/kitty/pass_keys.py +++ b/lua/Navigator/mux/kitty/pass_keys.py @@ -1,13 +1,14 @@ import re - from kittens.tui.handler import result_handler from kitty.key_encoding import KeyEvent, parse_shortcut def is_window_vim(window, vim_id): fp = window.child.foreground_processes - print(fp) - return any(re.search(vim_id, p['cmdline'][0] if len(p['cmdline']) else '', re.I) for p in fp) + return any( + re.search(vim_id, p["cmdline"][0] if len(p["cmdline"]) else "", re.I) + for p in fp + ) def encode_key_mapping(window, key_mapping): @@ -26,7 +27,7 @@ def encode_key_mapping(window, key_mapping): return window.encoded_key(event) -def main(): +def main(args): pass @@ -35,12 +36,16 @@ def handle_result(args, result, target_window_id, boss): window = boss.window_id_map.get(target_window_id) direction = args[2] key_mapping = args[3] - vim_id = args[4] if len(args) > 4 else "n?vim" + regex_to_match = "n?vim" if window is None: return - if is_window_vim(window, vim_id): + + if is_window_vim(window, regex_to_match): encoded = encode_key_mapping(window, key_mapping) window.write_to_child(encoded) else: - boss.active_tab.neighboring_window(direction) + if direction == "prev": + boss.active_tab.nth_window(-1) + else: + boss.active_tab.neighboring_window(direction) From f0e01ee508f159cec92737b217927f7684881b50 Mon Sep 17 00:00:00 2001 From: "C.D. MacEachern" Date: Fri, 10 Mar 2023 09:21:51 -0500 Subject: [PATCH 6/7] Remove python files and doc in wiki instead --- .../mux/{kitty/init.lua => kitty.lua} | 0 lua/Navigator/mux/kitty/neighboring_window.py | 11 ---- lua/Navigator/mux/kitty/pass_keys.py | 51 ------------------- 3 files changed, 62 deletions(-) rename lua/Navigator/mux/{kitty/init.lua => kitty.lua} (100%) delete mode 100644 lua/Navigator/mux/kitty/neighboring_window.py delete mode 100644 lua/Navigator/mux/kitty/pass_keys.py diff --git a/lua/Navigator/mux/kitty/init.lua b/lua/Navigator/mux/kitty.lua similarity index 100% rename from lua/Navigator/mux/kitty/init.lua rename to lua/Navigator/mux/kitty.lua diff --git a/lua/Navigator/mux/kitty/neighboring_window.py b/lua/Navigator/mux/kitty/neighboring_window.py deleted file mode 100644 index 5453d9d..0000000 --- a/lua/Navigator/mux/kitty/neighboring_window.py +++ /dev/null @@ -1,11 +0,0 @@ -def main(): - pass - - -def handle_result(args, result, target_window_id, boss): - if args[1] == 'p': - boss.active_tab.nth_window(-1) - else: - boss.active_tab.neighboring_window(args[1]) - -handle_result.no_ui = True diff --git a/lua/Navigator/mux/kitty/pass_keys.py b/lua/Navigator/mux/kitty/pass_keys.py deleted file mode 100644 index d7dbf0a..0000000 --- a/lua/Navigator/mux/kitty/pass_keys.py +++ /dev/null @@ -1,51 +0,0 @@ -import re -from kittens.tui.handler import result_handler -from kitty.key_encoding import KeyEvent, parse_shortcut - - -def is_window_vim(window, vim_id): - fp = window.child.foreground_processes - return any( - re.search(vim_id, p["cmdline"][0] if len(p["cmdline"]) else "", re.I) - for p in fp - ) - - -def encode_key_mapping(window, key_mapping): - mods, key = parse_shortcut(key_mapping) - event = KeyEvent( - mods=mods, - key=key, - shift=bool(mods & 1), - alt=bool(mods & 2), - ctrl=bool(mods & 4), - super=bool(mods & 8), - hyper=bool(mods & 16), - meta=bool(mods & 32), - ).as_window_system_event() - - return window.encoded_key(event) - - -def main(args): - pass - - -@result_handler(no_ui=True) -def handle_result(args, result, target_window_id, boss): - window = boss.window_id_map.get(target_window_id) - direction = args[2] - key_mapping = args[3] - regex_to_match = "n?vim" - - if window is None: - return - - if is_window_vim(window, regex_to_match): - encoded = encode_key_mapping(window, key_mapping) - window.write_to_child(encoded) - else: - if direction == "prev": - boss.active_tab.nth_window(-1) - else: - boss.active_tab.neighboring_window(direction) From 3979c931a85335fed1b0755992898b49d0d54678 Mon Sep 17 00:00:00 2001 From: "C.D. MacEachern" Date: Sat, 11 Mar 2023 08:53:37 -0500 Subject: [PATCH 7/7] Rename python file --- lua/Navigator/mux/kitty.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/Navigator/mux/kitty.lua b/lua/Navigator/mux/kitty.lua index a5b075c..bcc8d9c 100644 --- a/lua/Navigator/mux/kitty.lua +++ b/lua/Navigator/mux/kitty.lua @@ -45,7 +45,7 @@ end ---@param direction Direction See |navigator.api.Direction| ---@return Kitty function Kitty:navigate(direction) - self.execute(string.format('kitten neighboring_window.py %s', self.direction[direction])) + self.execute(string.format('kitten navigator.py %s', self.direction[direction])) return self end