From 68f807ecf2ab9287a9e498157f09221e73e48005 Mon Sep 17 00:00:00 2001
From: Matei Adriel <rafaeladriel11@gmail.com>
Date: Wed, 9 Mar 2022 20:03:04 +0200
Subject: [PATCH] feat: vimux

---
 dotfiles/fish/config.fish                   |  3 ++
 dotfiles/neovim/init.lua                    | 34 +--------------
 dotfiles/neovim/lua/my/helpers.lua          |  9 ++++
 dotfiles/neovim/lua/my/keymaps.lua          | 11 ++---
 dotfiles/neovim/lua/my/options.lua          | 39 +++++++++++++++++
 dotfiles/neovim/lua/my/plugins/arpeggio.lua | 21 +++++++++
 dotfiles/neovim/lua/my/plugins/init.lua     |  1 +
 dotfiles/neovim/lua/my/plugins/vimux.lua    |  9 ++++
 dotfiles/tmux/tmux.conf                     | 48 ++++++++++-----------
 modules/applications/neovim.nix             |  2 +
 modules/applications/tmux.nix               |  6 +--
 11 files changed, 118 insertions(+), 65 deletions(-)
 create mode 100644 dotfiles/neovim/lua/my/options.lua
 create mode 100644 dotfiles/neovim/lua/my/plugins/arpeggio.lua
 create mode 100644 dotfiles/neovim/lua/my/plugins/vimux.lua

diff --git a/dotfiles/fish/config.fish b/dotfiles/fish/config.fish
index e690851..570ca9f 100644
--- a/dotfiles/fish/config.fish
+++ b/dotfiles/fish/config.fish
@@ -2,6 +2,9 @@ set fish_cursor_default block # Set the normal and visual mode cursors to a bloc
 set fish_cursor_insert line # Set the insert mode cursor to a line
 set fish_cursor_replace_one underscore # Set the replace mode cursor to an underscore
 
+# Force fish to skip some checks (I think)
+set fish_vi_force_cursor 
+
 function fish_user_key_bindings
   # Use the vim keybinds
   fish_vi_key_bindings
diff --git a/dotfiles/neovim/init.lua b/dotfiles/neovim/init.lua
index 4838477..4e3bf89 100644
--- a/dotfiles/neovim/init.lua
+++ b/dotfiles/neovim/init.lua
@@ -1,36 +1,4 @@
-local cmd = vim.cmd -- to execute Vim commands e.g. cmd('pwd')
-local fn = vim.fn -- to call Vim functions e.g. fn.bufnr()
-local g = vim.g -- a table to access global variables
-local opt = vim.opt -- to set options
-
--- Basic options
-opt.joinspaces = false -- No double spaces with join
-opt.list = true -- Show some invisible characters
-
-opt.number = true -- Show line numbers
-opt.relativenumber = true -- Relative line numbers
-
-opt.scrolloff = 4 -- Lines of context
-opt.shiftround = true -- Round indent
-opt.shiftwidth = 2 -- Size of an indent
-opt.termguicolors = true -- True color support
-
-opt.ignorecase = true -- Ignore case
-opt.smartcase = true -- Do not ignore case with capitals
-
-opt.smartindent = true -- Insert indents automatically
-
-opt.splitbelow = true -- Put new windows below current
-opt.splitright = true -- Put new windows right of current
-
-opt.wrap = false -- Disable line wrap
-opt.wildmode = {'list', 'longest'} -- Command-line completion mode
-
-opt.completeopt = {"menu", "menuone", "noselect"}
-
--- Set theme
-require('github-theme').setup({theme_style = "light", dark_float = true})
-
 -- Import my other files
+require("my.options").setup()
 require('my.keymaps').setup()
 require('my.plugins').setup()
diff --git a/dotfiles/neovim/lua/my/helpers.lua b/dotfiles/neovim/lua/my/helpers.lua
index e127a43..1db593d 100644
--- a/dotfiles/neovim/lua/my/helpers.lua
+++ b/dotfiles/neovim/lua/my/helpers.lua
@@ -4,4 +4,13 @@ function M.global(name, value)
     vim.g[name] = value
 end
 
+function M.mergeTables(t1, t2)
+    local t3 = {}
+
+    for k, v in pairs(t1) do t3[k] = v end
+    for k, v in pairs(t2) do t3[k] = v end
+
+    return t3
+end
+
 return M
diff --git a/dotfiles/neovim/lua/my/keymaps.lua b/dotfiles/neovim/lua/my/keymaps.lua
index 32a377e..8b4c187 100644
--- a/dotfiles/neovim/lua/my/keymaps.lua
+++ b/dotfiles/neovim/lua/my/keymaps.lua
@@ -1,20 +1,21 @@
+local helpers = require("my.helpers")
+
 local M = {}
 
 function M.map(mode, lhs, rhs, opts)
-    local options = {noremap = true}
-    if opts then options = vim.tbl_extend('force', options, opts) end
+    local options = helpers.mergeTables(opts, {noremap = true})
     vim.api.nvim_set_keymap(mode, lhs, rhs, options)
 end
 
 function M.mapSilent(mode, lhs, rhs, opts)
-    local options = {silent = true}
-    if opts then options = vim.tbl_extend('force', options, opts) end
-    M.map(mode, lhs, rhs, opts)
+    local options = helpers.mergeTables(opts, {silent = true})
+    M.map(mode, lhs, rhs, options)
 end
 
 function M.setup()
     M.map("i", "jj", "<Esc>") -- Remap Esc to jj
     M.map("n", "<Space><Space>", ":w<cr>") -- Double space to sace
+    M.map("n", "vv", "<C-w>v") -- Create vertical split
 end
 
 return M
diff --git a/dotfiles/neovim/lua/my/options.lua b/dotfiles/neovim/lua/my/options.lua
new file mode 100644
index 0000000..5c6d04e
--- /dev/null
+++ b/dotfiles/neovim/lua/my/options.lua
@@ -0,0 +1,39 @@
+local helpers = require("my.helpers")
+
+local M = {}
+
+function M.setup()
+    local opt = vim.opt -- to set options
+
+    -- Basic options
+    opt.joinspaces = false -- No double spaces with join
+    opt.list = true -- Show some invisible characters
+
+    opt.number = true -- Show line numbers
+    opt.relativenumber = true -- Relative line numbers
+
+    opt.scrolloff = 4 -- Lines of context
+    opt.shiftround = true -- Round indent
+    opt.shiftwidth = 2 -- Size of an indent
+    opt.termguicolors = true -- True color support
+
+    opt.ignorecase = true -- Ignore case
+    opt.smartcase = true -- Do not ignore case with capitals
+
+    opt.smartindent = true -- Insert indents automatically
+
+    opt.splitbelow = true -- Put new windows below current
+    opt.splitright = true -- Put new windows right of current
+
+    opt.wrap = false -- Disable line wrap
+    opt.wildmode = {'list', 'longest'} -- Command-line completion mode
+    opt.completeopt = {"menu", "menuone", "noselect"}
+
+    -- Set leader
+    helpers.global("mapleader", "<Space>")
+
+    -- Set theme
+    require('github-theme').setup({theme_style = "light", dark_float = true})
+end
+
+return M
diff --git a/dotfiles/neovim/lua/my/plugins/arpeggio.lua b/dotfiles/neovim/lua/my/plugins/arpeggio.lua
new file mode 100644
index 0000000..8e98120
--- /dev/null
+++ b/dotfiles/neovim/lua/my/plugins/arpeggio.lua
@@ -0,0 +1,21 @@
+local helpers = require("my.helpers")
+local arpeggio = vim.fn["arpeggio#map"]
+
+local M = {}
+
+function M.chord(mode, lhs, rhs, opts)
+    local options = helpers.mergeTables(opts, {noremap = true})
+
+    local settings = ""
+
+    if options.silent then settings = settings .. "s" end
+
+    arpeggio(mode, settings, options.noremap, lhs, rhs)
+end
+
+function M.chordSilent(mode, lhs, rhs, opts)
+    local options = helpers.mergeTables(opts, {silent = true})
+    M.chord(mode, lhs, rhs, options)
+end
+
+return M
diff --git a/dotfiles/neovim/lua/my/plugins/init.lua b/dotfiles/neovim/lua/my/plugins/init.lua
index 68655d4..74776e6 100644
--- a/dotfiles/neovim/lua/my/plugins/init.lua
+++ b/dotfiles/neovim/lua/my/plugins/init.lua
@@ -17,6 +17,7 @@ function M.setup()
     require("my.plugins.nvim-tree").setup()
     require("my.plugins.vimtex").setup()
     require("my.plugins.telescope").setup()
+    require("my.plugins.vimux").setup()
 end
 
 return M
diff --git a/dotfiles/neovim/lua/my/plugins/vimux.lua b/dotfiles/neovim/lua/my/plugins/vimux.lua
new file mode 100644
index 0000000..794ea3a
--- /dev/null
+++ b/dotfiles/neovim/lua/my/plugins/vimux.lua
@@ -0,0 +1,9 @@
+local arpeggio = require("my.plugins.arpeggio")
+
+local M = {}
+
+function M.setup()
+    arpeggio.chordSilent("n", "<Leader>vp", ":VimuxPromptCommand<CR>")
+end
+
+return M
diff --git a/dotfiles/tmux/tmux.conf b/dotfiles/tmux/tmux.conf
index 993e059..5fe8340 100644
--- a/dotfiles/tmux/tmux.conf
+++ b/dotfiles/tmux/tmux.conf
@@ -3,37 +3,37 @@ set -g prefix C-a
 unbind C-b
 bind C-a send-prefix
 
-# More colors
-set-option -g default-terminal "tmux-256color"
-set -g -a terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'
+# don't rename windows automatically
+set-option -g allow-rename off
 
-# force a reload of the config file (I don't think this works on nixos)
-unbind r
-bind r source-file ~/.tmux.conf
+# Visual stuff
+set -g -a terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q' # Supposedly helps with cursor shapes under vim (spoiler: it does not)
 
-# quick pane cycling
-unbind ^A
-bind ^A select-pane -t :.+
+# Split panes with \ and -
+bind \\ split-window -h
+bind - split-window -v
+unbind '"'
+unbind %
+
+# Zooming
+unbind C-z
+bind -n C-z resize-pane -Z
 
 # Vim-like keybinds for switching between panes
-bind -n m-h select-pane -L
-bind -n m-l select-pane -R
-bind -n m-k select-pane -U
-bind -n m-j select-pane -D
+bind -n C-h select-pane -L
+bind -n C-l select-pane -R
+bind -n C-k select-pane -U
+bind -n C-j select-pane -D
 
 # Vim-mode
 set-window-option -g mode-keys vi
 
-# Vim like keybinds for copying 
-bind -t vi-copy v begin-selection # begin selection
-bind -t vi-copy V rectangle-toggle # square selection (?)
-
-bind -t vi-copy y copy-pipe 'xclip -in -set clipboard' # copy
-
-unbind p
-bind p run "tmux set-buffer \"$(xclip -o -set clipboard)\"; tmux paste-buffer" # paste
-
 # Vim like mode for leaving insert mode
 unbind [ # unbind the default way to copy text
-bind Escape copy-mode # allow exiting insert mode with Escape
-bind jj copy-mode # allow exiting insert mode with jj (?)
+bind -T prefix j copy-mode # allow exiting insert mode with C-a j
+
+# Vim like keybinds for copying and pasting
+bind -T copy-mode-vi p paste-buffer
+bind -T copy-mode-vi V send-keys -X rectangle-toggle # Check if this works
+bind -T copy-mode-vi v send-keys -X begin-selection
+bind -T copy-mode-vi y send-keys -X copy-selection
diff --git a/modules/applications/neovim.nix b/modules/applications/neovim.nix
index da66474..b457bba 100644
--- a/modules/applications/neovim.nix
+++ b/modules/applications/neovim.nix
@@ -57,6 +57,8 @@ in
         telescope-file-browser-nvim # file creation/deletion using telescope
         lspkind-nvim # show icons in lsp completion menus
         # symbols-outline-nvim # tree view for symbols in document
+        vimux # interact with tmux from within vim
+        vim-tmux-navigator # easly switch between tmux and vim panes
 
         # Cmp related stuff. See https://github.com/hrsh7th/nvim-cmp
         cmp-nvim-lsp
diff --git a/modules/applications/tmux.nix b/modules/applications/tmux.nix
index 8ef5034..b70107c 100644
--- a/modules/applications/tmux.nix
+++ b/modules/applications/tmux.nix
@@ -16,11 +16,11 @@
       ];
 
       extraConfig = ''
-        # load the rest of the config
-        source-file ${../../dotfiles/tmux/tmux.conf}
-
         # Use github light theme
         source-file ${pkgs.githubNvimTheme}/terminal/tmux/github_light.conf
+
+        # load the rest of the config
+        source-file ${../../dotfiles/tmux/tmux.conf}
       '';
     };
   };