diff options
Diffstat (limited to 'dot_config/nvim/lua/hypr-nav.lua')
| -rw-r--r-- | dot_config/nvim/lua/hypr-nav.lua | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/dot_config/nvim/lua/hypr-nav.lua b/dot_config/nvim/lua/hypr-nav.lua new file mode 100644 index 0000000..fc05495 --- /dev/null +++ b/dot_config/nvim/lua/hypr-nav.lua @@ -0,0 +1,56 @@ +local direction_map = { + left = "h", + right = "l", + up = "k", + down = "j" +} + +local runtime_dir = os.getenv("XDG_RUNTIME_DIR") or "/tmp" +local function get_stable_id() + local handle = io.popen("hyprctl activewindow -j 2>/dev/null") + local data = handle:read("*a") + handle:close() + local ok, json = pcall(vim.json.decode, data) + if ok and json and json.stableId then + return tostring(json.stableId) + end + return "unknown" +end + +local stable_id = get_stable_id() + +local socket_path = string.format("%s/nvim-hypr-nav-%s.sock", runtime_dir, stable_id) + +local server = vim.uv.new_pipe(false) +server:bind(socket_path) +server:listen(128, function(err) + if err then vim.notify("hypr-nav: " .. err, vim.log.levels.ERROR) end + + local conn = vim.uv.new_pipe(false) + server:accept(conn) + + conn:read_start(function(err, data) + if not data then + pcall(function() conn:close() end) + return + end + local direction = data:match("nav:(%a+)") + if not direction then + pcall(function() conn:write("invalid\n") end) + + pcall(function() conn:close() end) + return + end + + vim.schedule(function() + local before = vim.api.nvim_get_current_win() + local wincmd_dir = direction_map[direction] or direction:sub(1, 1) + vim.cmd("wincmd " .. wincmd_dir) + local after = vim.api.nvim_get_current_win() + local response = (before == after) and "failed\n" or "success\n" + + pcall(function() conn:write(response) end) + pcall(function() conn:close() end) + end) + end) +end) |
