¿Como Personalizar Neovim?
Published: 2024-05-29 02:06:15

Personalizar neovim es una excelente manera de mejorar la productividad y la experiencia al programar. A continuación, te proporcionaré una guía para personalizar neovim para personas que se están iniciando en este tema. 


Cabe destacar que utilizaremos un único archivo para configurar neovim, el cual es el `init.vim`. Pero existen otras formas un poco más complejas, como personalizarlo con Lua, el cual es un lenguaje de programación. 


## 1. Instalar un administrador de plugins
Antes de comenzar, asegúrate de tener neovim instalado en tu computadora. Puedes descargarlo desde el repositorio oficial de neovim. Nosotros usaremos a partir de la versión `v0.8.0`.

Para personalizar neovim, necesitarás un administrador de plugins. Un administrador de plugins te permite instalar y administrar plugins de forma sencilla. Hay varios administradores de plugins disponibles, pero el más popular es vim-plug.

Para instalar vim-plug, abre una terminal y ejecuta el siguiente comando:

```bash
curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \\
    <https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim>
```

## 2. Configurar el archivo init.vim
El archivo `init.vim` es donde configurarás Neovim. Primero, vamos a crear el archivo para personalizar nvim, en la ruta `/home/.config/nvim/init.vim`.

En este archivo se estara organizado en tres secciones:

**- Configuración principal**: aquí se configuran algunas opciones importantes como el soporte de resaltado de sintaxis, el soporte de la opción de autocompletado y la configuración de los colores. 

**- Configuración de complementos:** aquí se definen y se cargan todos los complementos que se emplearán en neovim. 

**- Configuración personalizada:** esta sección contiene opciones personalizadas y mapeos de teclas. Los mapeos de teclas se emplean para definir atajos para hacer tareas específicas en neovim, como guardar archivos, buscar y reemplazar, abrir pestañas y cargar de nuevo el archivo init.vim.


###  2.1 Fuente
Personalmente recomiendo instalar la fuente JetbrainsMono. Sin embargo, si deseas otra fuente, puedes ingresar a la página oficial de NerdFonts y descargar tu favorita. A mí me gusta Hack Nerd Font o Fira Code. Es importante que sea NerdFont ya que, gracias a este tipo de fuentes, es que podremos ver los iconos en neovim.

Una vez instales la fuente, procura que la terminal que usas, utilice la fuente que descargaste.  

## 2.2 Configuración 
**1. Habilitar el número de línea**
El número de línea es útil cuando necesitas referirte a una línea específica en tu archivo. Puedes habilitar los números de línea usando el siguiente código:
`set number`

**2. Establecer el espaciado**
El espaciado adecuado ayuda a que el código sea más legible. Puedes establecer el espaciado en neovim con el siguiente código:

``` vim
set tabstop=4
set shiftwidth=4
set expandtab
```

**3. Habilitar la indentación automática**
La indentación automática es útil porque te permite identar tu código de forma rápida y sencilla. Puedes habilitar la indentación automática usando el siguiente código: `filetype indent on`


**4. Temas**
Un tema define la apariencia de Neovim. Puedes elegir entre una amplia variedad de temas, y algunos de los más populares incluyen gruvbox, dracula y nord.
Puedes instalar y establecer un tema usando vim-plug con el siguiente código:

```vim
syntax enable
set background=dark
colorscheme gruvbox
call plug#begin()
Plug 'morhetz/gruvbox'
call plug#end()
```

**5. Instalar plugins**
Una vez que hayas configurado tu archivo init.vim, puedes instalar plugins usando vim-plug. Puedes buscar plugins en sitios como vimawesome y agregarlos a tu archivo init.vim utilizando Plug 'autor/nombre_del_plugin'.

`filetype plugin indent on`

Una vez que hayas agregado tus plugins, puedes instalarlos y actualizarlos usando los siguientes comandos en Neovim:

``` vim
:PlugInstall
:PlugUpdate
```

## 3. Algunos plugins
Coc y Treesitter: es un plugin que proporciona funciones avanzadas de autocompletado y corrección de código para varios lenguajes de programación. Treesitter es un plugin que proporciona análisis sintáctico avanzado para una gran cantidad de lenguajes de programación.
Para instalar Coc, abre Neovim y escribe :CocInstall. A continuación, escribe los nombres de los plugins que deseas instalar, como **coc-tsserver** o **coc-prettier**.
Para instalar Treesitter, escribe :TSInstall en Neovim, y luego escribe los nombres de los plugins que deseas instalar, como java o php.

Algunas de las opciones y los plugin más notables que se configuran son:

**Temas de colores para neovim:**
1. gruvbox
2. onedark.vim
3. palenight.vim
4. nord-vim
5. ayu-vim

**Plugin para mejorar la apariencia de la barra de estado de neovim:**
1. vim-airline 
2. barbar.nvim: 

**Plugin para explorar y navegar por los archivos en un árbol de directorios:**
1. nerdtree 
2. nerdtree-git-plugin

**Plugin para mostrar iconos de archivo en la barra lateral de NERDTree:**
1. vim-devicons
2. nvim-web-devicons: 

**Otro Pluggins usados son:**

**1. vim-closetag**: para autocompletar etiquetas HTML y XML.
**2. vim-surround**: para agregar y cambiar los paréntesis, corchetes, llaves y comillas que rodean el texto seleccionado.
**3. nvim-autopairs**: para insertar pares de paréntesis, corchetes, llaves y comillas automáticamente mientras se escribe código.
**4. vim-prettier**: para formatear automáticamente el código JavaScript, CSS, HTML y otros lenguajes.
**5. coc.nvim**: plugin para autocompletar y proporcionar características avanzadas de edición de código para varios lenguajes de programación a través del servidor LSP.
**6. nvim-treesitter**: para un resaltado de sintaxis y análisis de código más avanzados, basado en árboles sintácticos, para muchos lenguajes de programación.
**7. lilydjwg/colorizer**: para resaltar los códigos de color en el archivo.
**8. rainbow_parentheses.vim**: para resaltar los paréntesis y corchetes coincidentes.
**9. telescope.nvim**: para buscar palabras claves. 

Aquí hay algunos ajustes básicos que puedes hacer para empezar:

## 4. Resultado


## ¿Cómo quedaría todo el archivo?

``` vim
" ---------------------
" 1. MAIN CONFIGURATION
" ---------------------
filetype plugin indent on
filetype plugin on
set termguicolors
set number
set mouse=a
set numberwidth=1
set clipboard=unnamed
set showcmd
set ruler
set cursorline
set encoding=utf8
set showmatch
set termguicolors
set sw=2
set wrap linebreak
set hlsearch                   
set incsearch                   
set ignorecase                  
set smartcase 
set laststatus=2
set noshowmode

" ------------
" 2. VIM-PLUG
" ------------
call plug#begin()

" THEME
Plug 'morhetz/gruvbox'
Plug 'joshdick/onedark.vim'
Plug 'drewtempelmeyer/palenight.vim'
Plug 'arcticicestudio/nord-vim'
Plug 'ayu-theme/ayu-vim'

" TABS
Plug 'vim-airline/vim-airline'
Plug 'romgrk/barbar.nvim'

" TREE
Plug 'scrooloose/nerdtree'
Plug 'Xuyuanp/nerdtree-git-plugin'

" ICONS
Plug 'ryanoasis/vim-devicons' 
Plug 'kyazdani42/nvim-web-devicons'

" TYPING
Plug 'alvan/vim-closetag'
Plug 'tpope/vim-surround'
Plug 'windwp/nvim-autopairs'

" PRETTIER
Plug 'prettier/vim-prettier', { 'do': 'yarn install' }

" AUTOCOMPLETE
Plug 'neoclide/coc.nvim', {'branch': 'release'}

" SYNTAX
Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'}

" COLORS
Plug 'lilydjwg/colorizer'
Plug 'junegunn/rainbow_parentheses.vim'

" TELESCOPE
Plug 'nvim-lua/plenary.nvim'
Plug 'nvim-telescope/telescope.nvim', { 'tag': '0.1.0' }

" GIT
Plug 'APZelos/blamer.nvim'

" GITHUBCOPILOT
Plug 'github/copilot.vim'

" IDE
Plug 'numToStr/Comment.nvim'
Plug 'easymotion/vim-easymotion'
Plug 'mhinz/vim-signify'
Plug 'yggdroot/indentline'
Plug 'lukas-reineke/indent-blankline.nvim'

" LSP AND MASON
Plug 'williamboman/mason.nvim'
Plug 'williamboman/mason-lspconfig.nvim'
Plug 'neovim/nvim-lspconfig'

call plug#end()

" -----------------
" 3. CONFIGURATION
" -----------------
" AYU THEME
" let ayucolor="dark" 

" MASON VIM
lua require('mason').setup()
lua require('mason-lspconfig').setup()

" GIT BLAME
let g:blamer_enabled = 1

" NERDTree
let NERDTreeQuitOnOpen=1
let g:NERDTreeGitStatusIndicatorMapCustom = {
                \ 'Modified'  :'✹',
                \ 'Staged'    :'✚',
                \ 'Untracked' :'✭',
                \ 'Renamed'   :'➜',
                \ 'Unmerged'  :'═',
                \ 'Deleted'   :'✖',
                \ 'Dirty'     :'✗',
                \ 'Ignored'   :'☒',
                \ 'Clean'     :'✔︎',
                \ 'Unknown'   :'?',
                \ }

let g:NERDTreeGitStatusUseNerdFonts = 1 
let NERDTreeMinimalUI = 1
let NERDTreeDirArrows = 1
let NERDTreeShowHidden = 1

" AIRLINE
let g:airline#extensions#tabline#enabled = 0
let g:airline_section_c_only_filename = 1
let g:airline_section_z = ' %{strftime("%-I:%M %p")}'
let g:airline_section_warning = ''
let g:airline#extensions#tabline#formatter = 'unique_tail'
let g:airline_theme = "onedark"

" PRETTIER
let g:prettier#quickfix_enabled = 0
autocmd TextChanged,InsertLeave *.js,*.jsx,*.mjs,*.ts,*.tsx,*.css,*.less,*.scss,*.json,*.graphql,*.md,*.vue,*.svelte,*.yaml,*.html PrettierAsync

"------------------
" 4. CUSTOM MAPING
"-----------------
let mapleader=" "

" SAVE
nmap <C-s> :w<CR>
nmap <C-q> :q<CR>

" ALL TEXT, PASTE, COPY, RENDO, CUT
nmap <C-v> "+P
nmap <C-a> ggVG
nmap <C-z> :undo<CR>
nmap <C-y> :redo<CR>
nmap <C-x> dd

" SEARCH AND REPLACE
nmap <C-r> :%s///gc<Left><Left>
nmap <C-f> / 

" SPLIT S
nmap <Leader>s :vsp<CR>

" INIT.VIM
nmap <leader>r :so ~/.config/nvim/init.vim<CR>

" BUFFERS
nmap <Leader>qq :NERDTreeToggle<CR>
nmap \\ <leader>qq
nmap <Tab> :bnext<CR>
nmap <Leader>t :enew<CR>
nmap <Leader>oo :Buffers<CR>
nnoremap <Leader>q :bdelete<CR>

" SPLIT
nnoremap <Leader>> 10<C-w>>
nnoremap <Leader>< 10<C-w><

" SEARCH FILES
nnoremap <leader>ff <cmd>Telescope find_files<cr>
nnoremap <leader>fg <cmd>Telescope live_grep<cr>
nnoremap <leader>fb <cmd>Telescope buffers<cr>
nnoremap <leader>fh <cmd>Telescope help_tags<cr>
nnoremap <leader>fc <cmd>Telescope colorscheme<cr>

" SCROOLLING
nnoremap <silent> <right> :vertical resize +5<CR>
nnoremap <silent> <left> :vertical resize -5<CR>
nnoremap <silent> <up> :resize +5<CR>
nnoremap <silent> <down> :resize -5<CR>

nmap <Leader>es <Plug>(easymotion-s2)

" DEFINITION.
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)

" PRETTIER
nmap <Leader>p :Prettier<CR>

" THEME TRANSPARENT
function! TransparentBackground()
    highlight Normal guibg=NONE ctermbg=NONE
    highlight LineNr guibg=NONE ctermbg=NONE
    set fillchars+=vert:\│
    highlight WinSeparator gui=NONE guibg=NONE guifg=#444444 cterm=NONE ctermbg=NONE ctermfg=gray
    highlight VertSplit gui=NONE guibg=NONE guifg=#444444 cterm=NONE ctermbg=NONE ctermfg=gray
endfunction

augroup MyColors
    autocmd!
    autocmd ColorScheme dracula call DraculaTweaks()
    autocmd ColorScheme * call TransparentBackground() 
augroup END

color onedark

syntax on
```

## Conclusión
Personalizar neovim es una excelente manera de mejorar la productividad y la experiencia al programar. Con estas configuraciones básicas, podrás comenzar a personalizar neovim según tus necesidades y preferencias. Recuerda que siempre puedes buscar en línea para encontrar más ajustes y plugins avanzados. ¡Feliz programación!