Skip to content

Commit

Permalink
feat: add command-line editing for bash, fish, zsh
Browse files Browse the repository at this point in the history
closes #245
  • Loading branch information
mikesmithgh committed May 31, 2024
1 parent 08960ad commit 9922f3d
Show file tree
Hide file tree
Showing 9 changed files with 169 additions and 9 deletions.
15 changes: 8 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ sh -c "$(curl -s https://raw.githubusercontent.com/mikesmithgh/kitty-scrollback.
'mikesmithgh/kitty-scrollback.nvim',
enabled = true,
lazy = true,
cmd = { 'KittyScrollbackGenerateKittens', 'KittyScrollbackCheckHealth' },
cmd = { 'KittyScrollbackGenerateKittens', 'KittyScrollbackCheckHealth', 'KittyScrollbackGenerateCommandLineEditing' },
event = { 'User KittyScrollbackLaunch' },
-- version = '*', -- latest stable version, may have breaking changes if major version changed
-- version = '^4.0.0', -- pin major version, include fixes and features that do not have breaking changes
Expand All @@ -263,7 +263,7 @@ sh -c "$(curl -s https://raw.githubusercontent.com/mikesmithgh/kitty-scrollback.
'mikesmithgh/kitty-scrollback.nvim',
disable = false,
opt = true,
cmd = { 'KittyScrollbackGenerateKittens', 'KittyScrollbackCheckHealth' },
cmd = { 'KittyScrollbackGenerateKittens', 'KittyScrollbackCheckHealth', 'KittyScrollbackGenerateCommandLineEditing' },
event = { 'User KittyScrollbackLaunch' },
-- tag = '*', -- latest stable version, may have breaking changes if major version changed
-- tag = 'v4.0.0', -- pin specific tag
Expand Down Expand Up @@ -742,7 +742,7 @@ require("lazy").setup({
"mikesmithgh/kitty-scrollback.nvim",
enabled = true,
lazy = true,
cmd = { "KittyScrollbackGenerateKittens", "KittyScrollbackCheckHealth" },
cmd = { 'KittyScrollbackGenerateKittens', 'KittyScrollbackCheckHealth', 'KittyScrollbackGenerateCommandLineEditing' },
event = { "User KittyScrollbackLaunch" },
config = function()
require("kitty-scrollback").setup({
Expand Down Expand Up @@ -813,10 +813,11 @@ require('kitty-scrollback').setup({
## 🫡 Commands
The API is available via the `kitty-scrollback.api` module. e.g., `require('kitty-scrollback.api')`

| Command | API | Description |
| :-------------------------------------------------- | :----------------------------------------------------- | :---------------------------------------------------------------------- |
| `:KittyScrollbackGenerateKittens [generate_modes]` | `generate_kittens(table<string\|'commands'\|'maps'>)?` | Generate Kitten commands used as reference for configuring `kitty.conf` |
| `:KittyScrollbackCheckHealth` | `checkhealth()` | Run `:checkhealth kitty-scrollback` in the context of Kitty |
| Command | API | Description |
| :-------------------------------------------------- | :------------------------------------------------------------ | :------------------------------------------------------------------------------------------------ |
| `:KittyScrollbackGenerateKittens [generate_modes]` | `generate_kittens(table<string\|'commands'\|'maps'>)?` | Generate Kitten commands used as reference for configuring `kitty.conf` |
| `:KittyScrollbackCheckHealth` | `checkhealth()` | Run `:checkhealth kitty-scrollback` in the context of Kitty |
| `:KittyScrollbackGenerateCommandLineEditing` | `generate_command_line_editing(string\|'bash'\|'fish'\|'zsh)` | Generate command-line editing commands used as reference for configuring `bash`, `fish`, or `zsh` |

## ⌨️ Keymaps
The API is available via the `kitty-scrollback.api` module. e.g., `require('kitty-scrollback.api')`
Expand Down
2 changes: 1 addition & 1 deletion doc/kitty-scrollback.nvim.txt
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ INSTALLATION *kitty-scrollback.nvim-installation*
'mikesmithgh/kitty-scrollback.nvim',
enabled = true,
lazy = true,
cmd = { 'KittyScrollbackGenerateKittens', 'KittyScrollbackCheckHealth' },
cmd = { 'KittyScrollbackGenerateKittens', 'KittyScrollbackCheckHealth', 'KittyScrollbackGenerateCommandLineEditing' },
event = { 'User KittyScrollbackLaunch' },
-- version = '*', -- latest stable version, may have breaking changes if major version changed
-- version = '^4.0.0', -- pin major version, include fixes and features that do not have breaking changes
Expand Down
4 changes: 4 additions & 0 deletions doc/kitty-scrollback.nvim_spec.txt
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,10 @@ KsbGenKittenModes *kitty-scrollback.api.KsbGenKittenModes*
M.generate_kittens() *kitty-scrollback.api.generate_kittens*


*kitty-scrollback.api.generate_edit_commands*
M.generate_edit_commands()


M.checkhealth() *kitty-scrollback.api.checkhealth*


Expand Down
90 changes: 90 additions & 0 deletions lua/kitty-scrollback/api.lua
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,96 @@ M.generate_kittens = function(generate_modes)
end
end

M.generate_command_line_editing = function(shell)
shell = (shell and next(shell)) and shell[1] or 'undefined'
local kitty_scrollback_edit_command_line = vim.fn.fnamemodify(
vim.api.nvim_get_runtime_file('scripts/edit_command_line.sh', false)[1],
':p'
)
local kitty_scrollback_edit_command_line_bash = vim.fn.fnamemodify(
vim.api.nvim_get_runtime_file('scripts/edit_command_line.bash', false)[1],
':p'
)

local configs = {
bash = {
[[# add the following environment variables to your bash config (e.g., ~/.bashrc)]],
[[# the editor defined in KITTY_SCROLLBACK_VISUAL will be used in place of VISUAL]],
[[# for other scenarios that are not editing the command-line. For example, C-xC-e]],
[[# will edit the current command-line in kitty-scrollback.nvim and pressing v in]],
[[# less will open the file in $KITTY_SCROLLBACK_VISUAL (defaults to nvim if not]],
[[# defined)]],
[[export KITTY_SCROLLBACK_VISUAL='nvim']],
[[export VISUAL=']] .. kitty_scrollback_edit_command_line_bash .. [[']],
[[]],
[[# [optional] customize your readline config (e.g., ~/.inputrc) ]],
[[# default mapping in vi mode]],
[[set keymap vi-command]],
[["v": vi-edit-and-execute-command]],
[[]],
[[# default mapping in emacs mode]],
[[set keymap emacs]],
[["\C-x\C-e": edit-and-execute-command]],
[[]],
},
fish = {
[[# add the following function and bindings to your fish config (e.g., ~/.config/fish/config.fish) ]],
[[]],
[[function kitty_scrollback_edit_command_buffer]],
[[ set -lx VISUAL ']] .. kitty_scrollback_edit_command_line .. [[']],
[[ edit_command_buffer]],
[[ commandline '']],
[[end]],
[[]],
[[bind --mode default \ee kitty_scrollback_edit_command_buffer]],
[[bind --mode default \ev kitty_scrollback_edit_command_buffer]],
[[]],
[[bind --mode visual \ee kitty_scrollback_edit_command_buffer]],
[[bind --mode visual \ev kitty_scrollback_edit_command_buffer]],
[[]],
[[bind --mode insert \ee kitty_scrollback_edit_command_buffer]],
[[bind --mode insert \ev kitty_scrollback_edit_command_buffer]],
[[]],
},
zsh = {
[[# add the following environment variables to your zsh config (e.g., ~/.zshrc)]],
[[]],
[[autoload -Uz edit-command-line]],
[[zle -N edit-command-line]],
[[]],
[[function kitty_scrollback_edit_command_line() { ]],
[[ local VISUAL=']] .. kitty_scrollback_edit_command_line .. [[']],
[[ zle edit-command-line]],
[[ zle kill-whole-line]],
[[}]],
[[zle -N kitty_scrollback_edit_command_line]],
[[]],
[[bindkey '^x^e' kitty_scrollback_edit_command_line]],
[[]],
},
}

---@type table|string
local config = configs[shell]
if not config then
config = 'no config found for: ' .. shell
end

local bufid = vim.api.nvim_create_buf(true, true)
vim.api.nvim_set_option_value('filetype', shell or '', {
buf = bufid,
})
vim.api.nvim_set_current_buf(bufid)
vim.api.nvim_buf_set_lines(bufid, 0, -1, false, config)

if #vim.api.nvim_list_uis() == 0 then -- if nvim is running in headless mode
for _, line in pairs(config) do
vim.print(line)
end
M.quit_all()
end
end

M.checkhealth = function()
local kitty_scrollback_kitten = vim.fn.fnamemodify(
vim.api.nvim_get_runtime_file('python/kitty_scrollback_nvim.py', false)[1],
Expand Down
15 changes: 15 additions & 0 deletions lua/kitty-scrollback/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,21 @@ M.setup = function(configs)
once = true,
callback = function() end,
})

---@brief [[
---:'KittyScrollbackGenerateCommandLineEditing' Generate commands used as reference for command-line editing
---
--- See: ~
--- |kitty.api.generate_edit_commands|
---@brief ]]
vim.api.nvim_create_user_command('KittyScrollbackGenerateCommandLineEditing', function(o)
require('kitty-scrollback.api').generate_command_line_editing(o.fargs)
end, {
nargs = 1,
complete = function()
return { 'bash', 'fish', 'zsh' }
end,
})
end

return M
7 changes: 7 additions & 0 deletions lua/kitty-scrollback/launch.lua
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,13 @@ M.launch = function()
opts.callbacks.after_ready(p.kitty_data, opts)
end)
end
if vim.env.KITTY_SCROLLBACK_NVIM_EDIT_INPUT then
vim.schedule(function()
local input_lines = vim.fn.readfile(vim.env.KITTY_SCROLLBACK_NVIM_EDIT_INPUT)
ksb_win.open_paste_window(#input_lines == 1 and input_lines[1] == '')
vim.api.nvim_buf_set_lines(p.paste_bufid, 0, -1, false, input_lines)
end)
end
ksb_api.close_kitty_loading_window()
if block_input_timer then
vim.fn.timer_stop(block_input_timer)
Expand Down
9 changes: 8 additions & 1 deletion lua/kitty-scrollback/windows.lua
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,15 @@ end
M.open_paste_window = function(start_insert)
vim.cmd.stopinsert()

if vim.env.KITTY_SCROLLBACK_NVIM_EDIT_INPUT then
p.pos = nil
end

if not p.pos then
if opts.kitty_get_text.extent == 'screen' or opts.kitty_get_text.extent == 'all' then
if
(opts.kitty_get_text.extent == 'screen' or opts.kitty_get_text.extent == 'all')
and vim.env.KITTY_SCROLLBACK_NVIM_EDIT_INPUT == nil
then
vim.notify(
'kitty-scrollback.nvim: missing position with extent=' .. opts.kitty_get_text.extent,
vim.log.levels.WARN,
Expand Down
8 changes: 8 additions & 0 deletions scripts/edit_command_line.bash
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/usr/bin/env bash

if [[ "$1" == *bash-fc* ]]; then
script_dir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
"$script_dir/edit_command_line.sh" "$@"
else
"${KITTY_SCROLLBACK_VISUAL:-nvim}" "$@"
fi
28 changes: 28 additions & 0 deletions scripts/edit_command_line.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#!/bin/sh

if [ -z "$1" ]; then
printf 'missing input file\n'
exit 2
fi

# set input_file to the last argument
# the last argument is used because in the case of zsh, commands maybe be passed before the filename e.g., (-c)
for input_file; do true; done

# after exiting this script and before it has been read by kitty-scrollback.nvim
# the contents of the original input_file may be altered
# avoid this by copying the input_file to a new file that will be referenced
ksb_input_dir=$(mktemp -d)
ksb_input_file="$ksb_input_dir/input.ksb_editcommand"
cp "$input_file" "$ksb_input_file"

kitty @ kitten /Users/mike/gitrepos/kitty-scrollback.nvim/python/kitty_scrollback_nvim.py \
--env "KITTY_SCROLLBACK_NVIM_EDIT_INPUT=$ksb_input_file"

# small delay before to avoid adding an extra prompt after
# this command has exited and before kitty-scrollback.nvim
# has had time to get the scrollback buffer from kitty
sleep 1

# exit non-zero so that the command is not executed in bash
exit 1

0 comments on commit 9922f3d

Please sign in to comment.