Vim e tmux

Minha configuração de trabalho.

Posted by Raffael Tancman on November 23, 2018

Sempre programando com outras ferramentas de fato resolvi dar uma chance ao Vim. Com os plugins ele vira uma baita de uma ferramenta para se trabalhar. Sobre o tmux foi um caso de amor e ódio. Comecei acompanhar os amigos aqui do time quando estávamos “pareando” e resolvi de fato testar no dia a dia.

Vim

Wiki: https://en.wikipedia.org/wiki/Vim_(text_editor)

É um editor de texto clonado a partir do Vi que pode ser utilizado tanto no terminal ou como uma aplicação gráfica como no gvim além de ser um software livre de código aberto.

Para aprender sobre o vim recomendo os seguintes sites:

A parte que eu gosto desse editor a sua simplicidade, leveza e o além de facilmente rodar a minha configuração em um servidor ou em outra máquina. Outro ponto favorável é sua gama de plugins. Neste site vim awesome você consegue buscar e encontrar plugins. Esta parte pode se tornar um pouco trabalhosa e por este motivo eu comecei configurando o meu Vim com base no projeto vim-bootstrap. Este projeto facilita a configuração sugerindo plugins ideias a várias linguagem de programação.

Toda sua configuração do vim fica em um arquivo na sua home que é o ~/.vimrc . Aqui eu acabei automatizando esse processo de instalação do vim-bootsrap onde ele gera essas configurações e salva no .vimrc na home da sua máquina. Além desse arquivo eu crio mais 2 arquivos que são os ~/.vimrc.local e o ~/.vimrc.local.bundles . Eu gerei estes arquivos para facilitar a alteração de algumas configurações além do vim-bootstrap sem correr o risco de um sobrescrever o outro.

Conteúdo do meu ~/.vimrc.local Neste arquivo eu coloco outras configurações para o meu vim além das que existem no ~/.vimrc.

" Config
" set relativenumber
set nrformats+=alpha
let g:NERDTreeMapOpenInTabSilent = 'T'

" Ruby Syntastic
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*
let g:syntastic_check_on_open = 0
let g:syntastic_check_on_wq = 1
let g:syntastic_ruby_checkers = ['rubocop', 'reek']
let g:vimrubocop_config = '.rubocop.yml'
let g:reek_on_loading = 0

" Remove Trailing Whitespace
nnoremap <silent> <F5> :let _s=@/ <Bar> :%s/\s\+$//e <Bar> :let @/=_s <Bar> :nohl <Bar> :unlet _s <CR>

" vim-javascript
augroup vimrc-javascript
autocmd!
autocmd FileType javascript,javascript.jsx set tabstop=2|set shiftwidth=2|set expandtab softtabstop=2
augroup END

" Vim autoresize
autocmd VimResized * :wincmd =
" zoom a vim pane, <C-w>= to re-balance
nnoremap <leader>- :wincmd _<cr>:wincmd \|<cr>
nnoremap <leader>= :wincmd =<cr>

Conteúdo do meu ~/.vimrc.local.bundles Neste arquivo eu inclou outros plugins além das que existem no ~/.vimrc.

" Plugins
Plug 'wakatime/vim-wakatime'
Plug 'ngmy/vim-rubocop'
Plug 'rainerborene/vim-reek'
Plug 'terryma/vim-multiple-cursors'
Plug 'mxw/vim-jsx'
" Plug 'w0rp/ale'
Plug 'christoomey/vim-tmux-navigator'

Tmux

É um multiplexador de terminais para sistemas Unix like. Ou seja conseguimos abrir vários terminais no mesmo terminal. Além disso, conseguimos “salvar” o estado atual de cada sessão aberta no terminal e retomar de onde paramos. No nosso dia a dia abrimos varios terminais para executar diversas ações e é ae que o tmux entra para facilitar a sua vida. Ele se torna uma ferramenta muito poderosa usada em conjunto com o Vim.

Para aprender sobre o tmux recomendo os seguintes sites:

Como o vim ele suporta diversas configurações e isso que faz ele ficar bem produtivo no seu dia a dia. Abaixo eu estou compartilhando as minhas que acabei adotando após finalizar o curso da Upcase.

Conteúdo do meu ~/.tmux.conf

unbind C-b
set -g prefix C-s
set -g base-index 1
set -g renumber-windows on
bind-key -r C-s send-prefix
bind-key r source-file ~/.tmux.conf \; display-message "~/.tmux.conf reloaded"
set-option -g default-terminal "screen-256color"
set-option -g status-keys "emacs"
#set-option -g status-bg '#666666'
#set-option -g status-fg '#aaaaaa'
set-option -g status-left-length 50
set-option -g status-right " #(date '+%a, %b %d - %I:%M') "
bind-key - split-window -v -c '#{pane_current_path}'
bind-key \ split-window -h -c '#{pane_current_path}'

# Fine adjustment (1 or 2 cursor cells per bump)
bind -n S-Left resize-pane -L 2
bind -n S-Right resize-pane -R 2
bind -n S-Down resize-pane -D 1
bind -n S-Up resize-pane -U 1

# Coarse adjustment (5 or 10 cursor cells per bump)
bind -n C-Left resize-pane -L 10
bind -n C-Right resize-pane -R 10
bind -n C-Down resize-pane -D 5
bind -n C-Up resize-pane -U 5
bind c new-window -c "#{pane_current_path}"
bind-key b break-pane -d
bind-key C-j choose-tree

# Use vim keybindings in copy mode
setw -g mode-keys vi

# Setup 'v' to begin selection as in Vim
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'

# Smart pane switching with awareness of Vim splits.
# See: https://github.com/christoomey/vim-tmux-navigator
is_vim='echo "#{pane_current_command}" | grep -iqE "(^|\/)g?(view|n?vim?)(diff)?$"'
bind -n C-h if-shell "$is_vim" "send-keys C-h" "select-pane -L"
bind -n C-j if-shell "$is_vim" "send-keys C-j" "select-pane -D"
bind -n C-k if-shell "$is_vim" "send-keys C-k" "select-pane -U"
#bind -n C-l if-shell "$is_vim" "send-keys C-l" "select-pane -R"
bind -n C-\ if-shell "$is_vim" "send-keys C-\\" "select-pane -l"

# Quickly view system & process info in htop
bind-key h split-window -h "htop"

# Quickly edit todo list
bind-key t split-window -h "vim ~/todo.md"

# Prompted join-pane
bind-key j command-prompt -p "join pane from: " "join-pane -h -s '%%'"

# Easily swap a pane (targeted by pane number) with the current pane
bind-key s display-panes\; command-prompt -p "pane #: " "swap-pane -t '%%'"

# Breaking Out Sessions
bind-key C-b send-keys 'tat && exit' 'C-m'

Neste post eu trouxe essas duas ferramentas que me ajudam bastante no meu dia a dia caso você tenha alguma configuração legal para o tmux ou vim compartilhe nos comentários.

Grande abraço!