From 0bf61de37d77e0c17106d40f8dddf2828b8b76be Mon Sep 17 00:00:00 2001 From: Stephen Waits Date: Wed, 25 Oct 2023 21:31:28 -0600 Subject: [PATCH] initial commit --- LICENSE | 21 +++++++++ README.md | 97 +++++++++++++++++++++++++++++++++++++++++ lua/zellij-nav/init.lua | 43 ++++++++++++++++++ 3 files changed, 161 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 lua/zellij-nav/init.lua diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2fad05a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright © 2023 Stephen Waits + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..523c350 --- /dev/null +++ b/README.md @@ -0,0 +1,97 @@ +# zellij-nav.nvim + +This is a Neovim plugin which integrates window navigation with +[zellij](https://github.com/zellij-org/zellij). + +It creates four new commands which will move between windows inside Neovim +(like `^w h` et. al.), but once it hits the edge of your editor it will attempt +to switch to the next zellij pane. + +Commands: + +- `ZellijNavigateLeft` +- `ZellijNavigateDown` +- `ZellijNavigateUp` +- `ZellijNavigateRight` + +It also exports the lua versions, which you can call like this: + +- `require("zellij-nav").left()` +- `require("zellij-nav").down()` +- `require("zellij-nav").up()` +- `require("zellij-nav").right()` + +This is written in the spirit of +[vim-tmux-navigator](https://github.com/alexghergh/nvim-tmux-navigation/), but +for zellij instead, while also staying as simple and lightweight as possible. + +## Installing + +### [lazy](https://github.com/folke/lazy.nvim) (recommended) + +```lua +{ + "https://git.sr.ht/~swaits/zellij-nav.nvim", + lazy = true, + event = "VeryLazy", + keys = { + { "", "ZellijNavigateLeft", { silent = true, desc = "navigate left" } }, + { "", "ZellijNavigateDown", { silent = true, desc = "navigate down" } }, + { "", "ZellijNavigateUp", { silent = true, desc = "navigate up" } }, + { "", "ZellijNavigateRight", { silent = true, desc = "navigate right" } }, + }, + opts = {}, +} +``` + +### [pckr](https://github.com/lewis6991/pckr.nvim) + +```lua +{ + "https://git.sr.ht/~swaits/zellij-nav.nvim", + config = function() + require("zellij-nav").setup() + + local map = vim.keymap.set + map("n", "", "ZellijNavigateLeft", { desc = "navigate left" }) + map("n", "", "ZellijNavigateDown", { desc = "navigate down" }) + map("n", "", "ZellijNavigateUp", { desc = "navigate up" }) + map("n", "", "ZellijNavigateRight", { desc = "navigate right" }) + + end +} +``` + +### [vim-plug](https://github.com/junegunn/vim-plug) + +```vim +Plug 'https://git.sr.ht/~swaits/zellij-nav.nvim' +lua require("zellij-nav").setup() + +nnoremap ZellijNavigateLeft +nnoremap ZellijNavigateDown +nnoremap ZellijNavigateUp +nnoremap ZellijNavigateRight +``` + +## MIT License + +Copyright © 2023 Stephen Waits + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/lua/zellij-nav/init.lua b/lua/zellij-nav/init.lua new file mode 100644 index 0000000..ab0d53c --- /dev/null +++ b/lua/zellij-nav/init.lua @@ -0,0 +1,43 @@ +local M = {} + +local function nav(short_direction, direction) + -- get window ID, try switching windows, and get ID again to see if it worked + local cur_winnr = vim.fn.winnr() + vim.api.nvim_command("wincmd " .. short_direction) + local new_winnr = vim.fn.winnr() + + -- if the window ID didn't change, then we didn't switch + if cur_winnr == new_winnr then + vim.fn.system("zellij action move-focus " .. direction) + if vim.v.shell_error ~= 0 then + error("zellij executable not found in path") + end + end +end + +function M.up() + nav("k", "up") +end + +function M.down() + nav("j", "down") +end + +function M.right() + nav("l", "right") +end + +function M.left() + nav("h", "left") +end + +-- create our exported setup() function +function M.setup(opts) + -- create our commands + vim.api.nvim_create_user_command("ZellijNavigateUp", M.up, {}) + vim.api.nvim_create_user_command("ZellijNavigateDown", M.down, {}) + vim.api.nvim_create_user_command("ZellijNavigateLeft", M.left, {}) + vim.api.nvim_create_user_command("ZellijNavigateRight", M.right, {}) +end + +return M