Spacevim
Appunti su spacevim.
Installazione§
Installare Spacevim su linux è di base piuttosto semplice. Basta avere installato già vim, neovim o entrambi e lanciare un comando:
$ curl -sLf https://spacevim.org/install.sh | bash
Questo script bash riscrive i dots dimodoché sia vim che neovim se presenti siano istantaneamente riconvertiti alla filosofia space.
Ci sono due problemi:
- Potremmo desiderare di utilizzare spacevim solo in determinate circostanze, quindi sarebbe meglio lasciare che vim o neovim restino intatti.
- Spacevim rende più complessa la gestione dei dots
Al fine di installare solo su vim o neovim sono predisposti comandi specifici:
# Solo vim
$ curl -sLf https://spacevim.org/install.sh | bash -s -- --install vim
# Solo neovim
$ curl -sLf https://spacevim.org/install.sh | bash -s -- --install neovim
Resta però il problema dei dots, perché lo script scrive in automatico dei symlinks assoluti che interferiscono con l'attività di Stow (ed io uso Stow).
L'installazione, infatti, consiste banalmente nella creazione di una
nuova cartella dot sulla home (.SpaceVim
), la quale viene utilizzata per costruire
un symlink a .config/nvim
. È ovvio che Stow poi non riesca più a gestire questa
cartella, poiché la proprietà gli è stata strappata dal nostro script di installazione.
La cosa più efficace resta quindi quella di costruire il symlink con stow in prima
istanza.
- Installare spacevim (non temete per i dot, vengono backuppati dallo script e potrete recuperarli a breve.
- Lanciare Neovim
- Scegliere il dot di configurazione di partenza tra base e dark (il secondo è più neovim-oriented)
- Copiare ed incollare nella nostra cartella stow (es.
dots_spacevim
).SpaceVim
e.SpaceVim.d
- Rinominare
.SpaceVim
in.config/nvim
- Lasciar gestire il resto a Stow:
$ stow dots_spacevim
- Godersi SpaceVim e personalizzare a piacere
Per tornare al neovim classico:
$ stow -D dots_spacevim
Configurazione iniziale§
Premi SPC f v d
per aprire il file di configurazione di Spacevim all'occorrenza.
# .SpaceVim.d/init.toml
#=============================================================================
# dark_powered.toml --- dark powered configuration example for SpaceVim
# Copyright (c) 2016-2020 Wang Shidong & Contributors
# Author: Wang Shidong < wsdjeg at 163.com >
# URL: https://spacevim.org
# License: GPLv3
#=============================================================================
# All SpaceVim option below [option] section
[options]
# set spacevim theme. by default colorscheme layer is not loaded,
# if you want to use more colorscheme, please load the colorscheme
# layer
colorscheme = "onedark"
colorscheme_bg = "dark"
# Disable guicolors in basic mode, many terminal do not support 24bit
# true colors
enable_guicolors = true
# Disable statusline separator, if you want to use other value, please
# install nerd fonts
statusline_separator = "arrow"
statusline_iseparator = "arrow"
buffer_index_type = 4
enable_tabline_filetype_icon = true
enable_statusline_mode = false
# Move the file tree to the left
filetree_direction = "down"
# File manager (supported: vimfiler (default, nerdtree, defx)
filemanager = "nerdtree"
# Enable autocomplete layer
[[layers]]
name = 'autocomplete'
auto_completion_return_key_behavior = "complete"
auto_completion_tab_key_behavior = "smart"
[[layers]]
name = 'shell'
default_position = 'top'
default_height = 30
[[layers]]
name = 'colorscheme'
Colonna 80§
Ci sono due possibilità per rimanere all'interno della classica colonna 80:
- SPC + t + 8
- SPC + t + f
La prima consente di evidenziare in ogni riga tutta l'area che supera l'ottantesima colonna. È abilitata di default, ma va attivata nel buffer desiderato all'occorrenza. La documentazione non indica alcun modo per far sì che sia abilitata di default.
Anche il secondo metodo rientra tra i "toggles" (infatti sta alla voce "t"), quindi non è abilitato
di default e va azionato all'occorrenza. Questo metodo di default genera una linea alla colonna
120, ma può essere facilmente riportato alla 80 con una semplice modifica al file di configurazione,
sotto la voce [options]
:
max_column = 80
Settare la max_column
realizza la magia.
Esistono sicuramente mille modi per abilitare queste funzioni all'apertura di ogni buffer o,
addirittura, di buffer selezionati, ma sicuramente esulano dalle opzioni standard di spacevim
e bisogna andare a smanettare coi file di configurazione più a basso livello.
Coprirò questo argomento in futuro, in caso dovessi sentirne l'esigenza.
Icone§
All'inizio ho avuto problemi con le icone. Se nel terminale classico di Gnome su Manjaro andavano piuttosto bene, lo stesso non si poteva dire per il terminale classico di Gnome su Ubuntu (su un altro computer), né si poteva dire per Alacritty o tantomeno per Neovide, una GUI sviluppata in Rust appositamente per Neovim.
Ho quindi approfondito e capito che le icone "emergono" semplicemente dal font utilizzato. Spacevim adotta infatti Nerd Fonts a tal fine. Anziché lasciare che tutto sia organizzato dallo script di installazione, possiamo intervenire in prima persona per installare i font e poi configurare l'emulatore di terminale affinché utilizzi un pack di font compatibile.
- Scaricare il pack di font desiderato
- Estrarre il contenuto dell'archivio in
~/.local/share/fonts
- Lanciare:
$ sudo fc-cache -rv
Con quest'ultimo passaggio la cache viene subito riaggiornata e quindi i nostri font dovrebbero essere disponibili ovunque noi desideriamo utilizzarli.
Gnome terminal§
Per configurare l'emulatore di terminale di Gnome si fa in un attimo dal menù grafico di preferenze che troviamo in una qualunque finestra del terminale.
Alacritty§
Per Alacritty la cosa si risolve aggiungendo questo al file di configurazione yaml:
font:
normal:
family: SauceCodePro Nerd Font Mono
style: Regular
bold:
family: SauceCodePro Nerd Font Mono
style: Bold
italic:
family: SauceCodePro Nerd Font Mono
style: Italic
bold_italic:
family: SauceCodePro Nerd Font Mono
style: Bold Italic
size: 11
Laddove alla voce family
bisogna inserire il font desiderato. Io ho scelto SauceCodePro, ma vanno bene anche altri Nerd Font.
Neovide§
Infine Neovide, l'unica piattaforma ad avermi dato del filo da torcere in tal senso.
Infatti, in teoria la GUI è la più semplice da configurare.
Basta andare nel file di configurazione di spacevim (~./SpaceVim.d/init.toml
) e
aggiungere una riga alle opzioni ([options]
):
guifont = "SauceCodePro Nerd Font Mono:h11"
Non c'è altro. Il problema è che sulla macchina con Manjaro l'installazione di Neovide riesce perfettamente, ma il font non viene caricato. Sulla macchina in cui gira Ubuntu, invece, Neovide non riesce neanche ad essere lanciato per problemi coi driver. Mi toccherà lavorarci oltre, ma questi sono problemi che esulano dalla mera configurazione del font. In ogni caso questa via dovrebbe funzionare per TUTTE le GUI di vim o neovim in circolazione come, ad esempio gvim, vim-qt ecc.
Clipboard: copiare ed incollare§
Ovviamente per il testo gestito, copiato e incollato all'interno di vim/neovim valgono semplicemente le combinazioni di vim:
y
per copiare (yank)p
per incollare (put)
Questa sezione è dedicata al problema di interagire con la clipboard di sistema, quindi al fine di copiare ed incollare testo da e verso vim nell'interazione con altre applicazioni.
Usando neovim da terminale, incollare è semplice esattamente come incollare sul terminale anche al di fuori di vim:
SHIFT+CTRL+V
. Ma è un po' una scorciatoia che va bene ogni tanto: usando vim ogni giorno serve un approccio più
sistematico/sistematizzato.
Ne parlano in un Issue su Github. Anche su Reddit
Come consigliato nell'Issue, lanciare questo comando abilita la clipboard
:set mouse=r
Copiare ed incollare con il mouse diventa semplicissimo, MA questa impostazione così selezionata si perde chiudendo vim. Al riavvio bisogna nuovamente lanciare il comando per ottenere lo stesso comportamento.
Il problema potrebbe essere dato dal fatto che non stiamo sfruttando Xorg ma Wayland Da questa patch emerge la necessità di avere installato wl-clipboard.
Io, al momento, sono su Manjaro, quindi si segue la Pacman way:
$ sudo pacman -S wl-clipboard
Ora la presenza su Wayland non dovrebbe essere di alcun intralcio. Infatti ha risolto il mio problema.
Per copiare, assicurarsi di trovarsi in modalità normale, quindi premere ESC
.
- Copiare con
<LEADER> + y
- Incollare con
<LEADER> + p
Di default la leader key è \
. Quindi:
- Copiare:
\y
- Incollare:
\p
Ovviamente cambiando la leader key cambia anche la combinazione. Problema risolto.
File manager§
Neovim dispone di tre file manager:
- vimfiler
- nerdtree
- defx
Non commenterò esaustivamente, poiché ho provato solo i primi due e non troppo a lungo. La prima impressione è che, nonostante nerdtree mostri un'interfaccia più amichevole, vimfiler sia quello più stabile su spacevim e non sorprende quindi che sia la scelta di default. Inoltre, apprese le shortcut di base, a me pare anche più efficiente di nerdtree. Prendiamo ad esempio la gestione dei file nascosti:
- In vimfiler basta premere il punto ("dot") per visualizzare i file nascosti ("dotfiles"). Semplice da ricordare e da eseguire.
- In nerdtree, invece, abilitare i dots richiede l'uso di
?
seguito dallaI
(maiuscola), quindi di fatto una sequenza di due combinazioni che includono SHIFT all'atto pratico. Inoltre nel processo è probabile che si apra o chiuda la guida in alto, la quale è uno dei motivi per cui reputo nerdtree più amichevole, ma che non è affatto piacevole trovarsi tra i piedi quando non necessaria. Anche tornare alla cartella genitrice è più semplice con vimfiler, anche se qui si tratta di gusti: - Vimfiler richiede meramente la pressione di
h
, cioè che si vada indietro in vim, verso sinistra. Questo perché nella logica di vimfiler andando a sinistra si sale e andando verso destra si scende nel tracciato segnato dalle sottocartelle. - Nerdtree lascia in alto, a fianco al percorso della cartella, il classico
..
da selezionare per tornare alla cartella genitrice. Anche più semplice, perché intuitivo, ma a mio parere meno rapido.
Non è per nessuna di queste ragioni, però, che ho optato per tenere vimfiler: la vera ragione è che mi sembra più solido e meno propenso a creare casini durante l'uso.
A seguire allego una tabella di shortcut per la navigazione presa direttamente dalla documentazione di spacevim.
Key Bindings | Descriptions |
---|---|
<F3> / SPC f t |
Toggle file explorer |
with in file tree | |
<Left> / h |
go to parent node and collapse expanded directory |
<Down> / j |
select next file or directory |
<Up> / k |
select previous file or directory |
<Right> / l |
open selected file or expand directory |
N |
Create new file under cursor |
r |
Rename the file under cursor |
d |
Delete the file under cursor |
K |
Create new directory under cursor |
y y |
Copy file full path to system clipboard |
y Y |
Copy file to system clipboard |
P |
Paste file to the position under the cursor |
. |
Toggle visible ignored files |
s v |
Split edit |
s g |
Vertical split edit |
p |
Preview |
i |
Switch to directory history |
v |
Quick look |
g x |
Execute with vimfiler associated |
' |
Toggle mark current line |
V |
Clear all marks |
> |
iecrease filetree screenwidth |
< |
dncrease filetree screenwidth |
<Home> |
Jump to first line |
<End> |
Jump to last line |
Ctrl-Home |
Switch to project root directory |
Ctrl-r |
Redraw |
Apertura dei file§
A seguire invece una breve guida all'apertura dei file. Se un solo buffer è aperto al momento del lancio dei comandi, allora è lì che verrà aperta la finestra. Viceversa vim-choosewin chiederà di selezionare la finestra preferita.
Key Bindings | Descriptions |
---|---|
l / <Enter> |
open file in one window |
s g |
open file in an vertically split window |
s v |
open file in an horizontally split window |
Tema§
Sin dall'inizio io ho inserito questo schema-colore nel file di configurazione perché mi è familiare e me lo porto dietro da anni.
[options]
# ...
colorscheme = "onedark"
colorscheme_bg = "dark"
# ...
[[layers]]
name = 'colorscheme'
Il layer è assolutamente necessario perché sia abilitata la possibilità di cambiare il tema.
Subito però si è palesato un problema. Su Spacemacs basta SPC+T+n
per passare dal tema notturno
al diurno e viceversa. Su Spacevim la stessa combinazione di tasti randomizza il tema, funzione di rara utilità.
L'unico caso in cui mi viene da pensare che possa essere utile questa funzione è proprio durante la scelta del
tema, ma direi che per ottenere questo risultato si può anche fare a meno di una shortcut.
Mi pare importante riscrivere l'utilizzo di questa scorciatoia al fine di ottenere lo stesso comportamento che
ho già imparato ad apprezzare e sfruttare al meglio in Spacemacs.
Org-mode§
Senz'altro ho sempre avuto un debole per la scrittura modale di vim e quindi anche in Emacs ho (quasi) sempre utilizzato la evil mode, ma arrivo pur sempre da una più o meno confortevole presenza in Emacs ed org-mode è stato sin dall'inizio uno dei motivi più rilevanti che mi hanno ancorato al sacro editor scritto in Lisp.
Capite bene che spostarmi implica la preoccupazione di perdere tutte le comodità relative. Ho scelto spacevim, infatti, anche per non perdere la mano con le shortcut e potere utilizzare org-mode all'occorrenza aprendo Spacemacs, MA sarebbe senz'altro meglio se potessi fare almeno la maggior parte delle cose con Vim, se non proprio tutte.
Ho quindi provato ad installare un plugin per gestire org-mode.
vim-orgmode§
Aggiungere questo al file di configurazione:
[[custom_plugins]]
name = 'jceb/vim-orgmode'
Riavviare. Nel mio caso Neovim lamentava la mancanza del supporto Python.
> Unable to start orgmode. Orgmode depends on Vim >= 7.3 with Python support complied in.
Mi sono preoccupato che bisognasse ricompilare neovim integrando Python3, ma fortunatamente era più semplice di così, poiché in Arch/Manjaro neovim supporta Python3 di default. Per risolvere il problema è stato sufficiente questo:
$ pip install neovim
Ho riavviato Neovim ed ho potuto sperimentare che tutto andava per il verso giusto. Anzi, quasi tutto.
Una delle funzioni che più amo di Org-mode sono le tabelle. Costruire una tabella è semplice e finché non aggiungi troppi campi si tratta di un'esperienza assai stabile e fluida. Per "troppi" intendo oltre qualche centinaia di righe. Chi è abituato ad usare i fogli di calcolo penserà che siano pochi, ma le tabelle in org-mode non nascono per sostituire i fogli di calcolo, ma per supplire in maniera puramente testuale in semplici e portabilissimi file di testo. Sto divagando, ma volevo arrivare proprio a questa parola chiave: tabelle.
Ho davvero bisogno di org-mode per usufruire di quell'identico stile di costruzione e gestione della tabella? Ho notato che spacevim fornisce di default dei plugin per le tabelle. Bisogna approfondire, ma su due piedi sconsiglierei di scrivere in org-mode attraverso vim. Anche l'attività di esportazione del file comunque bisogna farla da Emacs, quindi perché sbattersi tanto di fare tutto in vim?
Mi sembra molto più sensata la soluzione di un utente su Reddit che dichiara di avere installato Spacemacs e di aver rimosso tutto ciò che non fosse funzionale all'utilizzo di org-mode. Alcuni utenti per ottenere questo scopo consigliano di partire da spacemacs-base
anziché da quello standard, ma anche lì tocca approfondire. L'altra cosa rilevante da notare è che usando Emacs da TUI e con l'aiuto di TMUX come multiplexer si può avere tutto in un unico schermo e con lo stesso tipo di design complessivo:
- Spacemacs (TUI) + Org Mode + Dired + HELM (sono i layer che interessano al sottoscritto, per lo meno)
- SpaceVim
Penso proprio che perseguirò questa via ibrida, sperando che il risultato non sia scomodo in termini di lievissime ma rilevanti differenze che ora non sospetto per ciò che concerne le scorciatoie.
Scrivere prosa in Markdown§
In Spacemacs utilizzo la olivetti-mode per centrare il testo nel buffer ed eliminare gli elementi di distrazione (non che ce ne fossero poi molti, ma anche quelli venivano nascosti per consentirmi di concentrarmi solo sul testo in scrittura).
Goyo§
Ottimo plugin per centrare il testo in maniera efficace e solo su richiesta, è sicuramente la cosa che ho trovato che più si avvicina alla olivetti-mode.
Per installare, aggiungere questo al nostro file di configurazione init.toml
:
[[custom_plugins]]
name = 'junegunn/goyo.vim'
Rilanciare neovim ed attendere la fulminea installazione di Goyo. Per utilizzarlo, andare su un file (preferibilmente markdown, org-mode o simili) e lanciare:
:Goyo
Scrivere.
Per uscire:
:Goyo!
Nient'altro da dire su Goyo
TOML frontmatter§
Siccome io non amo particolarmente YAML come formato per la configurazione e, in generale, scrivo preferibilmente codice in Rust, sono di recente passato a Zola, un generatore statico incredibilmente solido di cui mi sono subito innamorato. Senza approfondire i perché di questa affermazione, passo a dire subito che Zola come me preferisce adottare un frontmatter in TOML anziché in YAML per i file Markdown. Ne consegue che sarebbe gradita una funzione dell'editor che mi evidenziasse la sintassi TOML all'interno dei file Markdown. Non sono riuscito a trovare nulla di già pronto su Emacs, ma prima di mettermi a scrivere (o tentare di scrivere) un layer per Spacemacs ho pensato di fare un tentativo su vim e pare che questo supporto sia fornito da alcuni plugin.
SpaceVim al momento non offre supporto per frontmatter diversi dal classico YAML.
Sono arrivato a questa conclusione navigando tra i file del layer dedicato al supporto Markdown. Il layer organizza tutto il necessario per offrire supporto al linguaggio: sintassi, ma anche autocompletamento scorciatoie dedicate eccetera. Ne consegue, pensavo, che basterebbe sostituire il plugin che fornisce la sintassi con un altro che supporta il frontmatter in TOML. Ho trovato, a tal proposito, questo plugin di plasticboy, ma sostituirlo in maniera brutale a SpaceVim/vim-markdown
ha solo generato problemi, nonostante comunque vim non mostrasse errori di sorta. Il risultato era misto:
- I
+++
in testa ed in coda al frontmatter venivano riconosciuti, ma non tutto ciò che era compreso all'interno. - Introdotte funzioni per estendere i contenuti dei sottoparagrafi prima non previste
- Illeggibilità di alcune stringhe di testo
Ciò significa che ci stiamo avvicinando alla soluzione ma non siamo ancora arrivati.
Aggiungere entrambi i plugin? Non funziona neanche per ragioni molto simili.
La soluzione era a portata di mano§
Quelli che io pensavo fossero bug dati da qualche conflitto erano in realtà funzioni, caratteristiche del plugin di plasticboy. Il motivo per cui certe porzioni di testo sparivano era il concealing.
Il motivo per cui invece solo i +++
venivano evidenziati era la mancanza di un plugin dedicato ad evidenziare il TOML. Non pensavo fosse necessario perché avevo dato per scontato che richiamasse quello già presente in SpaceVim, ma in effetti non c'era ragione di crederlo, giacché il plugin di plasticboy nasce in un contesto differente. Il modo per risolvere facilmente quindi esiste ed è il seguente.
Editare il file .config/nvim/autoload/SpaceVim/layers/lang/markdown.vim
:
function! SpaceVim#layers#lang#markdown#plugins() abort
let plugins = []
" Add TOML support
call add(plugins, ['cespare/vim-toml',{ 'on_ft' : 'markdown'}])
" Comment out the default vim plugin
" call add(plugins, ['SpaceVim/vim-markdown',{ 'on_ft' : 'markdown'}])
" Add plasticboy vim plugin which support TOML via vim-toml added before
call add(plugins, ['plasticboy/vim-markdown',{ 'on_ft' : 'markdown'}])
" Leave the rest as before
call add(plugins, ['joker1007/vim-markdown-quote-syntax',{ 'on_ft' : 'markdown'}])
...
return plugins
endfunction
function! SpaceVim#layers#lang#markdown#config() abort
" plasticboy plugin settings
# let g:vim_markdown_conceal = 0
# let g:vim_markdown_math = 1
let g:vim_markdown_toml_frontmatter = 1
...
endfunction
Abbiamo aggiunto i due plugin necessari, eliminato quello originale e poi abilitato
il supporto toml con let g:vim_markdown_toml_frontmatter = 1
esattamente come
proposto dalla documentazione di plasticboy. Già che c'ero ho anche disabilitato la secondo me fastidiosa funzione di concealing e abilitato l'highlighting delle funzioni matematiche secondo la sintassi latex, ma nell'esempio qui sopra le ho commentate perché si tratta di una scelta meramente personale e slegata dal supporto TOML.
Uscire, rientrare su neovim ed aprire un file markdown per godere dei cambiamenti.
Il passo successivo sarebbe quello di sviluppare un layer dedicato da integrare in SpaceVim, ma lo lascio al futuro.
Questo post ti è stato utile?
Tieni a mente che questo sito è privo di tracker, analytics e pubblicità, quindi tutela la tua privacy ma non guadagna dalle visite (inoltre, è progettato per avere un impatto ambientale minimo).
Se ti piace questo blog, sostieni le mie riserve di caffeina