From 00fed568233d3885a393de3ab816cdc4a48c82c1 Mon Sep 17 00:00:00 2001 From: Max Bucknell Date: Sun, 10 Mar 2019 11:12:32 +0000 Subject: [PATCH] Update Tmux configuration and integrate Vim --- nvim/nvim.symlink/init.vim | 35 ++++++++++++++++---- tmux/tmux.conf.symlink | 66 ++++++++++++++++++++++++++++++-------- 2 files changed, 82 insertions(+), 19 deletions(-) diff --git a/nvim/nvim.symlink/init.vim b/nvim/nvim.symlink/init.vim index ac14a67..246678b 100644 --- a/nvim/nvim.symlink/init.vim +++ b/nvim/nvim.symlink/init.vim @@ -6,6 +6,9 @@ set updatetime=100 call plug#begin() +" Pane Navigation (Tmux integration) +Plug 'christoomey/vim-tmux-navigator' + " Colours Plug 'morhetz/gruvbox' @@ -116,12 +119,6 @@ set autowrite set splitbelow set splitright -" Just remove an extra keystroke -nnoremap j -nnoremap k -nnoremap h -nnoremap l - " Make searches case sensitive only if an upper case character has been typed set ignorecase smartcase @@ -190,6 +187,29 @@ set shiftwidth=4 set softtabstop=4 set autoindent +" Zoom the current split +function! ZoomOrUnzoom() + if exists('g:is_zoomed') + unlet g:is_zoomed + execute "wincmd =" + else + let g:is_zoomed = 'true' + execute "wincmd _" + execute "wincmd \|" + endif +endfunc + +function! HandleResize() + if exists('g:is_zoomed') + execute "wincmd _" + execute "wincmd \|" + else + execute "wincmd =" + endif +endfunc + +nnoremap :call ZoomOrUnzoom() + function! RunTypeScript() silent !clear execute "!tsc % --outFile /dev/stdout | node" @@ -234,6 +254,9 @@ augroup vimrcEx " Automatically enter terminal mode when summoning a terminal autocmd TermOpen term://* startinsert + " Lay out splits when Vim gets resized + autocmd VimResized * :call HandleResize() + augroup END " Make directories in a filename if they don't exist. diff --git a/tmux/tmux.conf.symlink b/tmux/tmux.conf.symlink index 162bc24..7a7c519 100644 --- a/tmux/tmux.conf.symlink +++ b/tmux/tmux.conf.symlink @@ -1,16 +1,56 @@ -# pane switching -bind C-h select-pane -L -bind C-j select-pane -D -bind C-k select-pane -U -bind C-l select-pane -R -bind C-\ select-pane -l +# Reload Tmux configuration +bind-key r source-file ~/.tmux.conf \; display-message "~/.tmux.conf reloaded" -# easily toggle synchronization (mnemonic: e is for echo) -bind e setw synchronize-panes on -bind E setw synchronize-panes off +# Enable Tmux's mouse mode. +# +# In iTerm, this mostly does what I want, in that it allows me to click on +# things to bring them into focus (windows, panes). It also handles scrolling +# more elegantly. +set-option -g mouse on -# start a pane in the right fucking folder -bind c new-window -c "#{pane_current_path}" -bind % split-window -h -c '#{pane_current_path}' -bind '"' split-window -v -c '#{pane_current_path}' +# Mouse mode isn't perfect. By default, ending a drag cancels the selection, +# which is a jarring on non-default behaviour. This makes sure this doesn't +# happen anymore. +unbind-key -T copy-mode MouseDragEnd1Pane +# Because we cancelled the mouse drag ending a selection, we don't have an +# easy and convenient way to make get back to normal. When using a GUI, a +# single click usually does the trick. This command restores that behaviour. +bind-key -T copy-mode MouseUp1Pane send-keys -X cancel + +# Use the Vim yank mnemonic to commit a copy when in copy mode. +# I don't actually hit "y" to copy, though. In iTerm, I have Cmd+C set up +# to send the hexcode for y to the terminal, which means the normal macOS +# copy shortcut does the right thing, so long as I'm in Tmux. +bind-key -T copy-mode y send-keys -X copy-pipe "pbcopy" + +# When I delete a window, relabel them automatically. +set-option -g renumber-windows on + +# Pane switching. These interface with Vim to ensure that pane switching is +# both consistent and sensible. +# +# Borrowed from Chris Toomey: https://github.com/christoomey/vim-tmux-navigator +is_vim="ps -o state= -o comm= -t '#{pane_tty}' \ + | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'" +bind-key -n C-h if-shell "$is_vim" "send-keys C-h" "select-pane -L" +bind-key -n C-j if-shell "$is_vim" "send-keys C-j" "select-pane -D" +bind-key -n C-k if-shell "$is_vim" "send-keys C-k" "select-pane -U" +bind-key -n C-l if-shell "$is_vim" "send-keys C-l" "select-pane -R" +bind-key -n C-\ if-shell "$is_vim" "send-keys C-\\" "select-pane -l" + +# When zooming a pane in a window, also zoom the vim split +bind-key z if-shell "$is_vim" "resize-pane -Z \; send-keys C-z" "resize-pane -Z" + +# All pane and window creations use the same path as the current process, +# which I have found to be a good default. +# +# I don't typically hit c to open a new window, I have that bound +# to Cmd+T in iTerm the same way I manage the clipboard. I also add the +# tab traversal shortcuts to move between Tmux windows. +bind-key c new-window -c "#{pane_current_path}" + +# Backslash is the unshifted version of | +bind-key \ split-window -h -c '#{pane_current_path}' +# Ditto, hyphen is the unshifted version of _ +bind-key - split-window -v -c '#{pane_current_path}'