aboutsummaryrefslogtreecommitdiffstats
path: root/modules/by-name/nv/nvim/plgs/flatten-nvim
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-11-09 12:35:44 +0100
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-11-09 12:54:51 +0100
commit2122a01f99c6da466b8f0f55c965c11a9043d117 (patch)
tree6c1697afc30a5bb72635bda7db9b5610386a5b71 /modules/by-name/nv/nvim/plgs/flatten-nvim
parentfix(pkgs/stamp): Fallback to `dot-license` (diff)
downloadnixos-config-2122a01f99c6da466b8f0f55c965c11a9043d117.zip
refactor(modules/legacy/conf/nvim): Move to `by-name`
Diffstat (limited to 'modules/by-name/nv/nvim/plgs/flatten-nvim')
-rw-r--r--modules/by-name/nv/nvim/plgs/flatten-nvim/default.nix23
-rw-r--r--modules/by-name/nv/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua104
2 files changed, 127 insertions, 0 deletions
diff --git a/modules/by-name/nv/nvim/plgs/flatten-nvim/default.nix b/modules/by-name/nv/nvim/plgs/flatten-nvim/default.nix
new file mode 100644
index 00000000..c1ace4ac
--- /dev/null
+++ b/modules/by-name/nv/nvim/plgs/flatten-nvim/default.nix
@@ -0,0 +1,23 @@
+{
+ pkgs,
+ lib,
+ config,
+ ...
+}: let
+ cfg = config.soispha.programs.nvim;
+in {
+ home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
+ # TODO: package flatten-nvim though a module
+
+ extraConfigLuaPre = ''
+ ${lib.strings.fileContents ./lua/flatten-nvim.lua}
+ if os.getenv("NVIM") ~= nil then
+ -- Avoid loading plugins because the host will take control of the instance anyways
+ return
+ end
+ '';
+ extraPlugins = [
+ pkgs.vimPlugins.flatten-nvim
+ ];
+ };
+}
diff --git a/modules/by-name/nv/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua b/modules/by-name/nv/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua
new file mode 100644
index 00000000..2cdbcdde
--- /dev/null
+++ b/modules/by-name/nv/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua
@@ -0,0 +1,104 @@
+---Types:
+--
+-- Passed to callbacks that handle opening files
+---@alias BufInfo { fname: string, bufnr: buffer }
+--
+-- Needed aliases
+---@alias buffer integer: Buffer id
+---@alias window integer: Window id
+--
+-- The first argument is a list of BufInfo tables representing the newly opened files.
+-- The third argument is a single BufInfo table, only provided when a buffer is created from stdin.
+--
+-- IMPORTANT: For `block_for` to work, you need to return a buffer number OR a buffer number and a window number.
+-- The `winnr` return value is not required, `vim.fn.bufwinid(bufnr)` is used if it is not provided.
+-- The `filetype` of this buffer will determine whether block should happen or not.
+--
+---@alias OpenHandler fun(files: BufInfo[], argv: string[], stdin_buf: BufInfo, guest_cwd: string):window, buffer
+--
+require("flatten").setup({
+ callbacks = {
+ ---Called to determine if a nested session should wait for the host to close the file.
+ ---param argv: a list of all the arguments in the nested session
+ ---@type fun(argv: table): boolean
+ should_block = require("flatten").default_should_block,
+
+ ---If this returns true, the nested session will be opened.
+ ---If false, default behavior is used, and
+ ---config.nest_if_no_args is respected.
+ ---@type fun(host: channel):boolean
+ should_nest = require("flatten").default_should_nest,
+
+ ---Called before a nested session is opened.
+ pre_open = function() end,
+
+ ---Called after a nested session is opened.
+ ---@param bufnr buffer
+ ---@param winnr window
+ ---@param filetype string
+ ---@param is_blocking boolean
+ ---@param is_diff boolean
+ post_open = function(bufnr, winnr, filetype, is_blocking, is_diff)
+ -- If the file is a git commit, create one-shot autocmd to delete its buffer on write
+ if filetype == "gitcommit" or filetype == "gitrebase" then
+ vim.api.nvim_create_autocmd("BufWritePost", {
+ buffer = bufnr,
+ once = true,
+ callback = vim.schedule_wrap(function() vim.api.nvim_buf_delete(bufnr, {}) end),
+ })
+ end
+ end,
+
+ ---Called when a nested session is done waiting for the host.
+ ---@param filetype string
+ block_end = function(filetype) end,
+ },
+ -- <String, Bool> dictionary of filetypes that should be blocking
+ block_for = {
+ gitcommit = true,
+ },
+ -- Command passthrough
+ allow_cmd_passthrough = true,
+ -- Allow a nested session to open if Neovim is opened without arguments
+ nest_if_no_args = false,
+ -- Window options
+ window = {
+ -- Options:
+ -- current -> open in current window (default)
+ -- alternate -> open in alternate window (recommended)
+ -- tab -> open in new tab
+ -- split -> open in split
+ -- vsplit -> open in vsplit
+ -- smart -> smart open (avoids special buffers)
+ -- OpenHandler -> allows you to handle file opening yourself (see Types)
+ --
+ -- TODO: Open gitcommit filetypes in the current buffer, everything else in a new tab <2023-08-29>
+ open = "split",
+
+ -- Options:
+ -- vsplit -> opens files in diff vsplits
+ -- split -> opens files in diff splits
+ -- tab_vsplit -> creates a new tabpage, and opens diff vsplits
+ -- tab_split -> creates a new tabpage, and opens diff splits
+ -- OpenHandler -> allows you to handle file opening yourself (see Types)
+ diff = "tab_vsplit",
+
+ -- Affects which file gets focused when opening multiple at once
+ -- Options:
+ -- "first" -> open first file of new files (default)
+ -- "last" -> open last file of new files
+ focus = "first",
+ },
+ -- Override this function to use a different socket to connect to the host
+ -- On the host side this can return nil or the socket address.
+ -- On the guest side this should return the socket address
+ -- or a non-zero channel id from `sockconnect`
+ -- flatten.nvim will detect if the address refers to this instance of nvim, to determine if this is a host or a guest
+ pipe_path = require("flatten").default_pipe_path,
+ -- The `default_pipe_path` will treat the first nvim instance within a single kitty/wezterm session as the host
+ -- You can configure this behaviour using the following:
+ one_per = {
+ kitty = true, -- Flatten all instance in the current Kitty session
+ wezterm = true, -- Flatten all instance in the current Wezterm session
+ },
+})