diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8051b283..ccc8a9b8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -32,13 +32,20 @@ jobs: run: | sudo apt update sudo apt install -y xfce4 libxcb-xkb1 + # homebrew is not used but is required to reproduce an issue for a test case + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - - name: Test kitty-scrollback.nvim + - name: Start Xvfb run: | Xvfb :1 -screen 0 1024x768x16 & - export PATH=$HOME/.local/kitty.app/bin:$PATH + + - name: Test kitty-scrollback.nvim + run: | + # TODO: improve the env var exports, github actions are making it hard so I gave up for now + export PATH=$HOME/.local/kitty.app/bin:/home/linuxbrew/.linuxbrew/bin:$PATH export DISPLAY=:1 - echo "export PATH=$HOME/.local/kitty.app/bin:$PATH" >> "$HOME/.bashrc" + export PS1="\[\e[34m\]$ \[\e[m\]" + echo 'export PATH=$HOME/.local/kitty.app/bin:/home/linuxbrew/.linuxbrew/bin:$PATH' >> "$HOME/.bashrc" echo 'export DISPLAY=:1' >> "$HOME/.bashrc" echo 'export PS1="\[\e[34m\]$ \[\e[m\]"' >> "$HOME/.bashrc" make test diff --git a/README.md b/README.md index 7a64701f..7a59b3f8 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,8 @@ Navigate your Kitty scrollback buffer to quickly search, copy, and execute comma [![neovim: v0.9+](https://img.shields.io/static/v1?style=flat-square&label=neovim&message=v0.9%2b&logo=neovim&labelColor=282828&logoColor=8faa80&color=414b32)](https://neovim.io/) [![kitty v0.29+](https://img.shields.io/badge/v0.29%2B-352217?style=flat-square&logo=data%3Aimage%2Fjpeg%3Bbase64%2C%2F9j%2F4AAQSkZJRgABAQAAAQABAAD%2F4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb%2F2wBDACodICUgGiolIiUvLSoyP2lEPzo6P4FcYUxpmYagnpaGk5GovfLNqLPltZGT0v%2FV5fr%2F%2F%2F%2F%2Fo8v%2F%2F%2F%2F%2F%2F%2FL%2F%2F%2F%2F%2F2wBDAS0vLz83P3xERHz%2FrpOu%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwAARCAEAAQADASIAAhEBAxEB%2F8QAGgABAAMBAQEAAAAAAAAAAAAAAAECAwQFBv%2FEAC8QAQACAQIEAgkFAQEAAAAAAAABAgMEERIhMVFBYQUTFCIyUnGRoUJTgZLB4SP%2FxAAXAQEBAQEAAAAAAAAAAAAAAAAAAQID%2F8QAGxEBAQEBAQEBAQAAAAAAAAAAAAERAhIhMUH%2F2gAMAwEAAhEDEQA%2FAPHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHXix1ikTtG8rzWs9ax9mfTXlwjrtgpPht9GVtPaPhnddieaxCYmJ2mNhUAiJmdojdpXBefCI%2BppjMbxpu9vwt7NXvKbF81zDp9mr3lWdN2t%2BDYeawGlsF48In6M5iYnnEwupgBETM7RG4A2rp7T8U7NK4KR4b%2FVNi%2Ba5R2xSsdKx9lcuOs0mdoiYhPS%2BXIA0yAAAAAAAAAA7MU746z5LsNNb3Zr2bud%2FXSfgAiotWLRtaN2UaesTvO8x2bC6YiIiI2iNkggAAAAImImNpjdIDGdPWZ3jeI7Na1isbVjZIumACAplnbHafJdhqbbVivdZ%2BpfxzgOjmAAAAAABtunhnsCBPDPZALY7cF4n7u1wOnT5N68M9Y6M9RrmtgGGwAATFLW%2BGsz9IJiYnaYmPqCAAAAAiJmdoiZnyWml6xvNbR9YBUAAABx5b8eSZ8PBvnvw02jrLlb5jHV%2FgCeGezTKBPDPZG2wAAAJisgg3nutwx3TwwmrisWlaJiUcMI4T4fUzWCsTF4267o3mq1bc%2FMHYKY78Uea7DoPQ02krWItkje3afBzaOkX1Fd%2Bkc3qNcxnqit6VvG16xMeaMlprtELVneIknUtxh5uq03qZ4q86T%2BHO9jNSMmK1Z8YeOlmOnN0b6XTzmtvblSOvmwevgpFMNKx25kmnVxalK442pWIjyWRadqzKuO02336r6kuObDU6St4m2ONrdo6S87o9t5mtpFNRO36o3Oo3zXOCmTJFeUdWWnNliZy23RFY8VrW57zzlTebNua0zEKzaThTwwfD6rvPcX4YRwx3NMVEzWUKgAALRXunesdk1cU3nunilbihpSsTG8gzj3vCUxXhtE7dJbgqs0%2FXjlpS3FXdTaazvX7d167Tzjlv1ZrUdWhtFdRG%2FjGz03iRMxMTHKYepp9RXNXaZ2v4wvNZ6i2X4o%2Bi%2BP4ILVi3VPKI7RDM5s6tZRktFMdrT4Ru8Z16zUxf8A86TvXxnu5F6rfMHsYrRfFW0eMPHdWj1MY%2FcvPuz0nsc06mu7J8CuLrLTlaO8SitYrHJLzb3Kws83X2i2o2j9MbOzUaiuGve3hDy7TNrTaZ3mectdVrmKZL8Fd%2FsypT9eWf4a2iN4tPPbpCm02ne327JGqyvXjvNoidlZ93wl0DWMuXilG89296REbwz4oEUF96yiax4GmKgKgAAtjpxz5Kt8HwT9QXisVjlCQRQAAAF6zunp0YZbzSu8TtLL12T5vwnlr09GuqzVjaMk%2FwA81b5smT47zMdnB67J834PXZPm%2FBlNjsb10ma0b8G31l5sZ8kTvFua%2Ftup%2Fev9zyXp3zpM0fo3%2BksJiYnaY2mHP7bqf3r%2FAHUnPlmZmbzMz4nlJ07qZsmP4LzEdl51Wa0bTkn%2BOTzfXZPm%2FB67J834Mq%2Bo7JmZneecomdnJ67J834a4rzeJ4p3lPJ6XmdwGkABBW1K26wsA5r0mk%2BSrfP8H8sFQAAAAXx34J59JUAdUTExyndLkImYneBddYyrm5e9H2JzRtyj7g0m0R1mIVnLWPHdzzMzO89QNTe03neUAIAAAAAAAAJpaazvCAHRXLWevJaLRPSYlykTMTvAuusZVzRt70fYtm5e7H3BqiZiOs7OWZmZ3nqBq%2BS%2FHPLpCgCAAAAAAAAAAAALY8d8s7Y6WtPlCLVtS01tExMdYl6vobJj4L4%2BUZN9%2FrDp12jrqqbxtGSOk%2F5IPAFslLY7zS8TFo6xKoAAAAAAAAAAAAAAAAAAAAAAAAAAAAJpa1LRaszFo6TD3dBra6mvDfaMsdY7vBTW1qWi1ZmLR0mAe9rtHXVU3jaMkdJ%2FyXhZKWx3ml4mLR1h7eg1tdTXhvtGWOsd1tdo66qm8bRkjpP%2BSDwBOSlsd5peJi0dYQAAAAAAAAAAAAAAAAAAAAAAAAAAAACa2tS0WrMxaOkw93QayNVThtyyVjn5%2BbxcGG%2BoyxTHG8z%2BHv6XTU02Phrzmetu4M9fo66jHNo5ZKxynv5PAex6S10Y4nDine88rT2eOAAAAAAAAAAAAAAAAAAAAAAAAAAA0wYb6jLFMcbzP4MGG%2BoyxTHG8z%2BHv6XTU02Lhpzmetu4Gl01NNj4a85nrbu5fSOv9VE4sM%2B%2F4z8v%2FT0jr%2FVb4sM%2B%2FwCNvl%2F68br1A6zzAAF64ct43pjvaO8VmU%2BzZ%2F2cn9ZBmNfZs%2F7OT%2Bsns2f9nJ%2FWQZDT2bP%2Bzk%2FrKLYctI3vjvWO81mAUAAAAAAAAAAAAAAAAAAAB6vobJirjvWZiMkzvz8YX9IekIxxOLBaJvPW0eDxwDr1AAI68%2BgA%2BmwXx2xVnFMTXblsu%2BWAfVIfLAPqVM18dMVpyzEV257vmQCevIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH%2F9k%3D&label=kitty&labelColor=282828)](https://sw.kovidgoyal.net/kitty/) [![semantic-release: angular](https://img.shields.io/static/v1?style=flat-square&label=semantic-release&message=angular&logo=semantic-release&labelColor=282828&logoColor=d8869b&color=8f3f71)](https://github.com/semantic-release/semantic-release) -[![test status](https://img.shields.io/github/actions/workflow/status/mikesmithgh/kitty-scrollback.nvim/test.yml?style=flat-square&logo=github&logoColor=c7c7c7&label=tests&labelColor=282828&event=push)](https://github.com/mikesmithgh/kitty-scrollback.nvim/actions/workflows/test.yml) +[![test status](https://img.shields.io/github/actions/workflow/status/mikesmithgh/kitty-scrollback.nvim/test.yml?style=flat-square&logo=github&logoColor=c7c7c7&label=tests&labelColor=282828&event=push)](https://github.com/mikesmithgh/kitty-scrollback.nvim/actions/workflows/test.yml?query=event%3Apush) +[![nightly test status](https://img.shields.io/github/actions/workflow/status/mikesmithgh/kitty-scrollback.nvim/test.yml?style=flat-square&logo=github&logoColor=c7c7c7&label=nightly%20tests&labelColor=282828&event=schedule)](https://github.com/mikesmithgh/kitty-scrollback.nvim/actions/workflows/test.yml?query=event%3Aschedule) diff --git a/doc/kitty-scrollback.nvim_spec.txt b/doc/kitty-scrollback.nvim_spec.txt index e76f14e0..0a931bad 100644 --- a/doc/kitty-scrollback.nvim_spec.txt +++ b/doc/kitty-scrollback.nvim_spec.txt @@ -28,6 +28,7 @@ KsbKittyData *kitty-scrollback.launch.KsbKittyData* {kitty_opts} (KsbKittyOpts) relevant kitty configuration values {kitty_config_dir} (string) kitty configuration directory path {kitty_version} (table) kitty version + {kitty_path} (string) kitty executable path KsbPrivate *kitty-scrollback.launch.KsbPrivate* diff --git a/lua/kitty-scrollback/api.lua b/lua/kitty-scrollback/api.lua index 7dd9316f..9a189dbb 100644 --- a/lua/kitty-scrollback/api.lua +++ b/lua/kitty-scrollback/api.lua @@ -191,7 +191,7 @@ M.checkhealth = function() if vim.fn.has('nvim-0.9') > 0 then vim .system({ - 'kitty', + p.kitty_data.kitty_path, '@', 'kitten', kitty_scrollback_kitten, diff --git a/lua/kitty-scrollback/health.lua b/lua/kitty-scrollback/health.lua index 7f8ee83b..1d46b6c4 100644 --- a/lua/kitty-scrollback/health.lua +++ b/lua/kitty-scrollback/health.lua @@ -15,7 +15,7 @@ end local function check_kitty_remote_control() vim.health.start('kitty-scrollback: Kitty remote control') local cmd = { - 'kitty', + p.kitty_data.kitty_path, '@', 'ls', } @@ -206,8 +206,9 @@ local function check_kitty_debug_config() local kitty_debug_config_kitten = vim.api.nvim_get_runtime_file('python/kitty_debug_config.py', false)[1] local debug_config_log = vim.fn.stdpath('data') .. '/kitty-scrollback.nvim/debug_config.log' - local result = - vim.system({ 'kitty', '@', 'kitten', kitty_debug_config_kitten, debug_config_log }):wait() + local result = vim + .system({ p.kitty_data.kitty_path, '@', 'kitten', kitty_debug_config_kitten, debug_config_log }) + :wait() if result.code == 0 then if vim.fn.filereadable(debug_config_log) then vim.health.ok(table.concat(vim.fn.readfile(debug_config_log), '\n ')) diff --git a/lua/kitty-scrollback/init.lua b/lua/kitty-scrollback/init.lua index faa54253..19b5395f 100644 --- a/lua/kitty-scrollback/init.lua +++ b/lua/kitty-scrollback/init.lua @@ -26,7 +26,7 @@ M.setup = function(configs) }) ---@brief [[ - ---:KittyScrollbackGenerateKittens Run `:checkhealth kitty-scrollback` in the context of Kitty + ---:KittyScrollbackCheckHealth Run `:checkhealth kitty-scrollback` in the context of Kitty --- --- See: ~ --- |kitty.api.checkhealth| diff --git a/lua/kitty-scrollback/kitty_commands.lua b/lua/kitty-scrollback/kitty_commands.lua index d184fca2..6f9d1c27 100644 --- a/lua/kitty-scrollback/kitty_commands.lua +++ b/lua/kitty-scrollback/kitty_commands.lua @@ -121,8 +121,12 @@ end M.get_text_term = function(kitty_data, get_text_opts, on_exit_cb) local esc = vim.fn.eval([["\e"]]) - local kitty_get_text_cmd = - string.format([[kitty @ get-text --match="id:%s" %s]], kitty_data.window_id, get_text_opts) + local kitty_get_text_cmd = string.format( + [[%s @ get-text --match="id:%s" %s]], + p.kitty_data.kitty_path, + kitty_data.window_id, + get_text_opts + ) local sed_cmd = string.format( [[sed -E ]] .. [[-e 's/%s\[\?25.%s\[.*;.*H%s\[.*//g' ]] -- remove control sequence added by --add-cursor flag @@ -132,7 +136,7 @@ M.get_text_term = function(kitty_data, get_text_opts, on_exit_cb) esc, esc ) - local flush_stdout_cmd = [[kitty +runpy 'sys.stdout.flush()']] + local flush_stdout_cmd = p.kitty_data.kitty_path .. [[ +runpy 'sys.stdout.flush()']] -- start to set title but do not complete see https://github.com/kovidgoyal/kitty/issues/719#issuecomment-952039731 local start_set_title_cmd = string.format([[printf '%s]2;']], esc) local full_cmd = kitty_get_text_cmd @@ -245,7 +249,7 @@ M.send_paste_buffer_text_to_kitty_and_quit = function(execute_command) end system_handle_error({ - 'kitty', + p.kitty_data.kitty_path, '@', 'send-text', '--match=id:' .. p.kitty_data.window_id, @@ -256,7 +260,7 @@ end M.list_kitty_windows = function() return system_handle_error({ - 'kitty', + p.kitty_data.kitty_path, '@', 'ls', }) @@ -267,7 +271,7 @@ M.close_kitty_loading_window = function(ignore_error) local winid = p.kitty_loading_winid p.kitty_loading_winid = nil return system_handle_error({ - 'kitty', + p.kitty_data.kitty_path, '@', 'close-window', '--match=id:' .. winid, @@ -278,7 +282,7 @@ end M.signal_winchanged_to_kitty_child_process = function() system_handle_error({ - 'kitty', + p.kitty_data.kitty_path, '@', 'signal-child', 'SIGWINCH', @@ -290,7 +294,7 @@ M.signal_term_to_kitty_child_process = function(force) vim.cmd.quitall({ bang = true }) else system_handle_error({ - 'kitty', + p.kitty_data.kitty_path, '@', 'signal-child', 'SIGTERM', @@ -303,7 +307,7 @@ M.open_kitty_loading_window = function(env) M.close_kitty_loading_window(true) end local kitty_cmd = vim.list_extend({ - 'kitty', + p.kitty_data.kitty_path, '@', 'launch', '--type', @@ -332,7 +336,7 @@ end M.get_kitty_colors = function(kitty_data, ignore_error, no_window_id) local match = no_window_id and nil or '--match=id:' .. kitty_data.window_id local ok, result = system_handle_error({ - 'kitty', + p.kitty_data.kitty_path, '@', 'get-colors', match, @@ -351,7 +355,7 @@ end M.send_text_to_clipboard = function(text) return system_handle_error({ - 'kitty', + p.kitty_data.kitty_path, '+kitten', 'clipboard', '/dev/stdin', diff --git a/lua/kitty-scrollback/launch.lua b/lua/kitty-scrollback/launch.lua index c1a911ad..3e0503d3 100644 --- a/lua/kitty-scrollback/launch.lua +++ b/lua/kitty-scrollback/launch.lua @@ -45,6 +45,7 @@ local M = {} ---@field kitty_opts KsbKittyOpts relevant kitty configuration values ---@field kitty_config_dir string kitty configuration directory path ---@field kitty_version table kitty version +---@field kitty_path string kitty executable path ---@class KsbPrivate ---@field orig_columns number diff --git a/python/kitty_scrollback_nvim.py b/python/kitty_scrollback_nvim.py index c486d3cf..34d30eb9 100755 --- a/python/kitty_scrollback_nvim.py +++ b/python/kitty_scrollback_nvim.py @@ -8,6 +8,7 @@ import json import os import inspect +import shutil ksb_dir = os.path.dirname( os.path.dirname(os.path.abspath(inspect.getfile(lambda: None)))) @@ -30,10 +31,11 @@ def get_kitty_shell_integration(kitty_opts, w): # based on kitty source window.py -def pipe_data(w, target_window_id, config): +def pipe_data(w, target_window_id, config, kitty_path): kitty_opts = get_options() kitty_shell_integration = get_kitty_shell_integration(kitty_opts, w) return { + 'kitty_path': kitty_path, 'kitty_scrollback_config': config, 'scrolled_by': w.screen.scrolled_by, 'cursor_x': w.screen.cursor.x + 1, @@ -110,6 +112,26 @@ def parse_cwd(args): return () +def nvim_err_cmd(err_file): + return ( + 'launch', + '--copy-env', + '--type', + 'overlay', + '--title', + 'kitty-scrollback.nvim :: error', + 'nvim', + ) + parse_nvim_args() + ( + '-c', + 'set laststatus=0', + '-c', + 'set fillchars=eob:\\ ', + '-c', + 'set filetype=checkhealth', + err_file, + ) + + @result_handler(type_of_input=None, no_ui=True, has_ready_notification=False) def handle_result(args: List[str], result: str, @@ -118,28 +140,22 @@ def handle_result(args: List[str], del args[0] w = boss.window_id_map.get(target_window_id) if w is not None: + kitty_path = shutil.which('kitty') + if not kitty_path: + boss.call_remote_control( + w, + nvim_err_cmd(f'{ksb_dir}/scripts/kitty_not_found.txt')) + return + config = parse_config(args) if config == 'crying cat --config-file': - err_cmd = ( - 'launch', - '--copy-env', - '--type', - 'overlay', - '--title', - 'kitty-scrollback.nvim', - 'nvim', - ) + parse_nvim_args() + ( - '-c', - 'set laststatus=0', - '-c', - 'set fillchars=eob:\\ ', - '-c', - 'set filetype=checkhealth', - f'{ksb_dir}/scripts/breaking_change_config_file.txt', - ) - - err_winid = boss.call_remote_control(w, err_cmd) + err_winid = boss.call_remote_control( + w, + nvim_err_cmd( + f'{ksb_dir}/scripts/breaking_change_config_file.txt')) + + # window logo is overridden by new neovim colorscheme set_logo_cmd = ('set-window-logo', '--no-response', '--alpha', @@ -149,12 +165,12 @@ def handle_result(args: List[str], f'{ksb_dir}/media/sad_kitty_thumbs_up.png') err_win = boss.window_id_map.get(err_winid) - err_winid = boss.call_remote_control(err_win, set_logo_cmd) + boss.call_remote_control(err_win, set_logo_cmd) return cwd = parse_cwd(args) env = parse_env(args) - kitty_data_str = pipe_data(w, target_window_id, config) + kitty_data_str = pipe_data(w, target_window_id, config, kitty_path) kitty_data = json.dumps(kitty_data_str) if w.title.startswith('kitty-scrollback.nvim'): diff --git a/scripts/kitty_not_found.txt b/scripts/kitty_not_found.txt new file mode 100644 index 00000000..9133e4af --- /dev/null +++ b/scripts/kitty_not_found.txt @@ -0,0 +1,18 @@ +404 kitty not found ~ + +ERROR Sorry 😿 + +Failed to find kitty executable. Please check your environment variable `PATH`. + + + `|`\___/`|` + =) `^`Y`^` (= + \ *^* / If you have any issues or questions using *kitty-scrollback.nvim* then + ` )=*=( ` please create an issue at + / \ https://github.com/mikesmithgh/kitty-scrollback.nvim/issues + | | + /| | | |\ + \| | `|`_`|`/\ + /_// ___/ + \_) + diff --git a/tests/kitty-scrollback/kitty_scrollback_spec.lua b/tests/kitty-scrollback/kitty_scrollback_spec.lua index c47f1d32..3a386039 100644 --- a/tests/kitty-scrollback/kitty_scrollback_spec.lua +++ b/tests/kitty-scrollback/kitty_scrollback_spec.lua @@ -66,6 +66,21 @@ describe('kitty-scrollback.nvim', function() $ echo meow 󰄛 󰣐  meow $ +]], + 'kitty-scrollback.nvim content did not match the terminal screen' + ) + end) + + -- during brew search a, the PATH env changes. if we are not pointing to the correct kitty executable, it will error out + it('should use correct kitty path during brew command', function() + h.assert_screen_equals( + h.feed_kitty({ + [[brew search a]], + [[\n]], -- enter + [[__open_ksb]], + }), + [[ +$ brew search a 󰄛 󰣐  ]], 'kitty-scrollback.nvim content did not match the terminal screen' )