Skip to navigation
Logo Penaz's Area

cat /dev/random > penaz

Analizziamo la mia configurazione di NeoVim


Diamo un'occhiata veloce a cosa sta sotto il cofano del software che produco (ed anche questo blog): la mia configurazione di NeoVim

Salve a tutti!

A differenza di alcuni sviluppatori nel mondo, ho deciso di evitare di fare uso di un IDE per il mio lavoro. Il mio flusso di lavoro richiede di saltare tra varie cartelle, aprire e chiudere file rapidamente, quindi le tab potrebbero diventare una distrazione e cambiare "workspace" può diventare lento e fastidioso.

Per questo ho deciso di usare NeoVim: ho usato Vim per un sacco di tempo, perchè inizialmente ero curioso, poi ho scoperto quant'è personalizzabile ed ho deciso di continuare: mi ha fatto compagnia per tutto il mio percorso universitario e mi sta facendo ancora compagnia nel mio lavoro.

Ecco come si presenta (in uno screenshot quasi-decente):

Una schermata del mio NeoVim, con un po' di roba dentro

Diamo un'occhiata (non tanto) veloce a cosa fa funzionare il mio editor. Ci saranno un sacco di plugin, così come alcune personalizzazioni. Diamoci dentro!

I plugin

Questa è una enorme parte del mio editor: faccio uso di un sacco di plugin, ma questo è ciò che accade quanto tenti di far fare tutto ad un singolo editor. I puristi si arrabbieranno con me, e possono pure restare arrabbiati se vogliono. Questo va bene per il mio flusso di lavoro, non ti piace? Non usarlo.

I plugin non pesano troppo sul tempo di avvio, a meno che non sia il primo avvio del giorno: quello richiede dai 4 agli 8 secondi su HDD (sempre meglio di alcuni IDE). Dopo il primo avvio, gli altri sono quasi istantanei.

"==================================================
" Plugins
"==================================================
call plug#begin('~/.config/nvim/plugged')
Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'} " New syntax highlight parser
Plug 'raimon49/requirements.txt.vim', {'for': 'requirements'}  " Syntax Highlight for Python Requirements
Plug 'Lenovsky/nuake' " Quake-Style terminal
Plug 'vim-pandoc/vim-pandoc-syntax', {'for': ['pandoc', 'markdown']} "Pandoc Syntax HL
Plug 'iamcco/markdown-preview.nvim', {'do': { -> mkdp#util#install() }, 'for': 'markdown'}
Plug 'neovim/nvim-lspconfig'  " Language Protocol Client
Plug 'ararslan/license-to-vim' "License insertion command
Plug 'norcalli/nvim-colorizer.lua'  " Highlight Color names/hex
Plug 'windwp/nvim-ts-autotag'  " Automatic Tag Closing via TreeSitter
Plug 'rhysd/committia.vim' " Better Git Commits
Plug 'tversteeg/registers.nvim'  " Registers Popup
Plug 'RRethy/vim-illuminate' " Highlight word under cursor
Plug 'tpope/vim-repeat' " Repeat Plugin commands via '.'
Plug 'svermeulen/vim-cutlass'  " Makes delete operations actually delete
Plug 'svermeulen/vim-yoink'  " YankRing
Plug 'svermeulen/vim-subversive'  " Substitution commands and visual paste+replace fixes
Plug 'tpope/vim-fugitive' " Git Support
Plug 'mhinz/vim-startify' "Start screen
Plug 'preservim/nerdcommenter' "Quick comments
Plug 'lukas-reineke/indent-blankline.nvim'  " Visual Indent Guides
Plug 'liuchengxu/vista.vim', {'on': ['Vista!!', 'Vista']}  " New tagbar plugin with LSP Support
Plug 'mbbill/undotree' " Undo tree
Plug 'tpope/vim-surround'  " Surround with quotes, parenthesis etc...
Plug 'junegunn/fzf', {'do': {-> fzf#install()}}  " Fuzzy search of files
Plug 'junegunn/fzf.vim' "FZF Integration for VIM
Plug 'Famiu/feline.nvim' " Nice Status Bar
Plug 'romgrk/barbar.nvim' " Nice Tabline
Plug 'rktjmp/lush.nvim'  " Color Scheme Assistant
Plug 'npxbr/gruvbox.nvim'  " Color Scheme
Plug 'junegunn/goyo.vim', {'on': 'Goyo'} " Zen-Style Writing
Plug 'godlygeek/tabular', {'on': 'Tabularize'} "Text Align
Plug 'lewis6991/gitsigns.nvim'  " Version Control Symbols on Rows
Plug 'matze/vim-move' "Moving rows with ALT+j and ALT+k
Plug 'wesQ3/vim-windowswap' "Swap Windows with <leader>ww
Plug 'mg979/vim-visual-multi' " Multiple Cursors (Ctrl+n)
Plug 'windwp/nvim-autopairs' "Parentheses completion
Plug 'ntpeters/vim-better-whitespace'  "Highlight and whitespace stripping
Plug 'vimlab/split-term.vim' "Split H/V Terminals
Plug 'terryma/vim-expand-region' " Expand region support
Plug 'vim-scripts/Toggle' "Toggle True/False >/<, etc...
Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'  " Snippets +  Snippet collection
Plug 'junegunn/limelight.vim', {'on': 'Goyo'} " GoYo Zen Writing extension
Plug 'tyru/open-browser.vim', {'for': 'plantuml'} " Browser preview (used for plantuml)
Plug 'weirongxu/plantuml-previewer.vim', {'for': 'plantuml'} " Plantuml browser preview
Plug 'aklt/plantuml-syntax', {'for': 'plantuml'} " Plantuml syntax HL
Plug 'kyazdani42/nvim-web-devicons'  " Icons for plugins
Plug 'roxma/nvim-yarp'  " Dependency
Plug 'ncm2/ncm2'  " Autocomplete
Plug 'ncm2/ncm2-path'  " Path Autocomplete
Plug 'ncm2/ncm2-bufword'  " Buffer AutoComplete
Plug 'ncm2/ncm2-ultisnips'  " Ultisnips Autocomplete support
Plug 'ncm2/float-preview.nvim'  " Float Preview autocomplete support
Plug 'ncm2/ncm2-html-subscope' " Detects JS/CSS subscopes in HTML
Plug 'francoiscabrol/ranger.vim'  " Ranger Integration
Plug 'tpope/vim-speeddating' " Easy date increment
Plug 'wellle/visual-split.vim', {'on': ['VSResize', 'VSSplit', 'VSSplitAbove', 'VSSplitBelow']} " Splits that adapt to visual selection
Plug 'kkoomen/vim-doge', {'do': { -> doge#install() }, 'on': ['DogeGenerate', 'DogeCreateDocStandard']} " Much Docs, such generator, very wow
Plug 'dstein64/vim-startuptime' "Startup Time Profiling
Plug 'rbgrouleff/bclose.vim'  " Creates BClose command to close buffer without closing window
Plug 'unblevable/quick-scope'  " Highlight when pressing f/F/t/T/,/;
Plug 'p00f/nvim-ts-rainbow'  " Treesitter-powered Rainbow Parentheses
Plug 'rhysd/conflict-marker.vim'  "Helper for managing manual merge conflicts
Plug 'embear/vim-localvimrc'  " Enables per-folder VimRC (editor settings)
Plug 'chrisbra/NrrwRgn' " Narrow Region
Plug 'jceb/emmet.snippets' " Emmet plugin for ultisnips, e<tab>
Plug 'edluffy/specs.nvim'  " Animazione quando il cursore si sposta di molto
Plug 'folke/trouble.nvim'  " Schermata diagnostica migliorata (richiede LSP Interno)
Plug 'nvim-lua/plenary.nvim'  " Dependency of many lua plugins
Plug 'folke/todo-comments.nvim'  " TODOs/Fixes highlight
Plug 'onsails/lspkind-nvim'  " LSP Icons
Plug 'ray-x/lsp_signature.nvim'  " Signature Auto-help for nvim LSP
Plug 'folke/lsp-colors.nvim'  " Support for LSP colors
Plug 'kosayoda/nvim-lightbulb'  " Visible code actions
Plug 'kyazdani42/nvim-tree.lua'  " Lua NerdTree Replacement
Plug 'penaz91/fzf_dym'  " My 'Did you mean?' plugin
call plug#end()

Personalizzazioni

Non si vive di soli plugin, parte del mio workflow è legata ad alcune funzioni personalizzate. Ecco qui quelle più interessanti.

Ho creato un piccolo "sistema di segnaposto", che mi consente di saltare e rimpiazzare delle etichette (usando <leader>j ) che sono evidenziate in rosso. Queste etichette hanno <+QUESTO FORMATO+> e sono veramente facili da vedere.

Il "Sistema di Segnaposto"

Ho anche creato un piccolissimo repository locale di template, che usato in combinazione con il "sistema di segnaposto" ed il plugin localvimrc mi permette di avere un bel "menu di Template" che posso usare. Il tutto è impacchettato in un menu di FZF che mi permette di selezionare quale template inserire.

Il menu "Templates"

Questo menu (legato al bottone F7) cambia a seconda del progetto ed il tipo di file che sto modificando nel buffer. Mi piacerebbe creare un plugin basato su quest'idea, ma per ora è un ammasso di VimScript orribile ed è strettamente legato alle mie necessità

Un altro menu trova origina nella mia abitudine di usare LanguageClient-NeoVim: un semplice menu LSP legato al pulsante F5. Nulla di più semplice.

Il Menu "LSP"

E siccome non ci sono mai troppi menu, eccone un altro, questa volta legato al bottone F6: questo è un menu di "operazioni miste": lo uso per aggiungere una "modeline" al file corrente, formattare XML o JSON, riparare conflitti di Git. È un cassetto dove tengo un po' tutto.

Il menu "Tutto il Resto"

Oh, ed ho anche un menu per selezionare la licenza da inserire, legato al comando :Licenses . Perchè non riesco mai a ricordare i nomi usati nel plugin license-to-vim .

L'unica personalizzazione che sono riuscito ad estrapolare in un plugin a sè stante è un set did funzioni per un menu "intendevi...?" che compare quando ho una corrispondenza parziale passata dalla shell ZSH. Originariamente era un altro plugin che ho rielaborato in un set di funzioni nel mio VimRC per far funzionare con FZF che successivamente ho estratto. L'ho chiamato fzf_dym perchè sono una persona altamente creativa.

Conclusioni e futuri aggiornamenti

Questo è semplicemente un post che volevo fare, così anche per vedere come le cose cambieranno in futuro e per "vantarmi" un pochettino (tanti sembra lo facciano, quindi perchè no).

Vedo la "luna" nel futuro della mia configurazione NeoVim, precisamente una luna portoghese/brasiliana: lua. NeoVim ha aggiunto il supporto nativo per luaJIT oltre che un punto d'accesso init.lua . Forse in futuro avrò la possibilità di riscrivere quell'ammasso di VimScript incasinato, trasformandolo in un ammasso incasinato di Lua. Vedremo cosa ci riserva il futuro.

Grazie a tutti per aver letto. State al sicuro ed in salute.

Penaz.