" ============================================================ " HenriqueSilva.dev - Modern .vimrc (C/C++ + Python + Polyglot) " Vim 8+ | Needs: node (for coc), ripgrep (rg), fzf (optional) " ============================================================ " ---------- Basics ---------- set nocompatible filetype plugin indent on syntax on set encoding=utf-8 set hidden set mouse=a set updatetime=300 set timeoutlen=400 set ttimeoutlen=10 set signcolumn=yes set termguicolors " ============================================================ " Clipboard (macOS-friendly) " - If Vim has +clipboard: use system clipboard automatically " - If NOT: sync via pbcopy/pbpaste while keeping native y/p " ============================================================ if has('clipboard') set clipboard=unnamedplus endif if executable('pbcopy') && executable('pbpaste') " Copy yanks to macOS clipboard (keeps y/yw/yy/yap... intact) augroup mac_clipboard_yank autocmd! autocmd TextYankPost * if v:event.operator ==# 'y' | call system('pbcopy', getreg('"')) | endif augroup END " Helper: refresh unnamed register from macOS clipboard function! s:MacPasteToUnnamed() abort let l:clip = system('pbpaste') " Remove trailing newline that pbpaste often includes (optional) if l:clip =~ "\n$" let l:clip = substitute(l:clip, "\n$", "", "") endif call setreg('"', l:clip) endfunction " Make p/P paste from macOS clipboard (keeps behavior "like p", just syncs first) nnoremap p :call MacPasteToUnnamed()p nnoremap P :call MacPasteToUnnamed()P " In Visual mode, keep replacement paste behavior consistent xnoremap p :call MacPasteToUnnamed()p xnoremap P :call MacPasteToUnnamed()P endif " ---------- UI / Editing ---------- set number set relativenumber set cursorline set ruler set showcmd set showmatch set nowrap set linebreak set scrolloff=6 set sidescrolloff=6 set splitright set splitbelow set wildmenu set wildmode=longest:full,full set completeopt=menuone,noinsert,noselect " ---------- Indentation (global, neutral) ---------- " Deixe o EditorConfig e/ou FileType sobrescreverem por projeto. set tabstop=4 set shiftwidth=4 set softtabstop=4 set noexpandtab set smartindent " ---------- Search ---------- set ignorecase set smartcase set incsearch set hlsearch " ---------- Performance / Files ---------- set lazyredraw set synmaxcol=240 set nobackup set nowritebackup set noswapfile set undofile set undodir=~/.vim/undo// set directory=~/.vim/tmp// " Create dirs if missing (avoids warnings/errors on startup) if !isdirectory(expand('~/.vim/undo')) call mkdir(expand('~/.vim/undo'), 'p') endif if !isdirectory(expand('~/.vim/tmp')) call mkdir(expand('~/.vim/tmp'), 'p') endif " ---------- Leader ---------- let mapleader=" " nnoremap h :nohlsearch " ============================================================ " Plugins (vim-plug) " ============================================================ " Bootstrap vim-plug if missing (needed to load editorconfig-vim) if empty(glob('~/.vim/autoload/plug.vim')) echohl WarningMsg echom "vim-plug not found. Install it to load plugins (incl. editorconfig-vim)." echohl None endif call plug#begin('~/.vim/plugged') " --- Core UX --- Plug 'sickill/vim-monokai' Plug 'vim-airline/vim-airline' Plug 'vim-airline/vim-airline-themes' Plug 'ryanoasis/vim-devicons' " --- Navigation / Search --- Plug 'preservim/nerdtree' Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } Plug 'junegunn/fzf.vim' " --- Git --- Plug 'tpope/vim-fugitive' Plug 'airblade/vim-gitgutter' " --- Editing helpers --- Plug 'tpope/vim-surround' Plug 'tpope/vim-repeat' Plug 'preservim/nerdcommenter' Plug 'tpope/vim-commentary' " --- Syntax / Code --- Plug 'sheerun/vim-polyglot' " --- LSP/Autocomplete/Snippets (CoC) --- Plug 'neoclide/coc.nvim', {'branch': 'release'} " --- NERDTree Devicons Syntax Highlight --- Plug 'tiagofumo/vim-nerdtree-syntax-highlight' " --- EditorConfig --- Plug 'editorconfig/editorconfig-vim' call plug#end() " ============================================================ " Theme " ============================================================ set background=dark colorscheme monokai " Airline theme must be set AFTER plugins are loaded let g:airline_powerline_fonts = 1 let g:airline_theme = 'base16_monokai' " ============================================================ " NERDTree " ============================================================ nnoremap e :NERDTreeToggle let g:NERDTreeShowHidden=1 let g:NERDTreeMinimalUI=1 " ============================================================ " FZF (uses ripgrep if installed) " ============================================================ nnoremap f :Files nnoremap b :Buffers nnoremap / :Rg " ============================================================ " GitGutter " ============================================================ let g:gitgutter_map_keys = 0 nnoremap ]c :GitGutterNextHunk nnoremap [c :GitGutterPrevHunk " ============================================================ " Better defaults per filetype (C/C++ & Python) " ============================================================ augroup ft_settings autocmd! autocmd FileType c,cpp setlocal tabstop=4 shiftwidth=4 softtabstop=4 noexpandtab autocmd FileType python setlocal tabstop=4 shiftwidth=4 softtabstop=4 expandtab autocmd FileType c,cpp setlocal list listchars=tab:>\ ,trail:· augroup END " Fallback: if editorconfig isn't loaded, keep C/C++ on tabs. if empty(glob('~/.vim/autoload/plug.vim')) autocmd FileType c,cpp setlocal tabstop=4 shiftwidth=4 softtabstop=4 noexpandtab endif " ============================================================ " CoC (LSP + Autocomplete) " ============================================================ " TAB: se menu do autocomplete estiver visível, navega; senão insere TAB REAL inoremap pumvisible() ? "\" : "\\" inoremap pumvisible() ? "\" : "\" inoremap pumvisible() ? coc#_select_confirm() : "\" nmap gd (coc-definition) nmap gy (coc-type-definition) nmap gi (coc-implementation) nmap gr (coc-references) nmap rn (coc-rename) nmap ca (coc-codeaction) nmap [d (coc-diagnostic-prev) nmap ]d (coc-diagnostic-next) nnoremap K :call CocActionAsync('doHover') nnoremap fm :call CocActionAsync('format') nnoremap qf :CocList diagnostics set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')} set shortmess+=c " ============================================================ " Quality-of-life mappings " ============================================================ nnoremap w :w nnoremap q :q nnoremap Q :qa! vnoremap < >gv nnoremap h nnoremap j nnoremap k nnoremap l " Devicons in NERDTree let g:WebDevIconsUnicodeDecorateFolderNodes = 1 let g:webdevicons_enable_nerdtree = 1 let g:NERDTreeDirArrowExpandable = '▸' let g:NERDTreeDirArrowCollapsible = '▾' " ============================================================ " Copy/Paste helpers (keep; these don't override y/p anymore) " ============================================================ nnoremap v "+p inoremap v + vnoremap c "+y vnoremap C :'<,'>w !pbcopy vnoremap "+y vnoremap "+d nnoremap "+p inoremap +