Modalità VI
Introduzione

La modalità VI di Kate è un progetto per portare nell'editor di testo Kate e nelle estensioni degli altri programmi di KDE che condividono lo stesso componente una modalità di modifica simile a quella di Vim. È stata iniziata come progetto di Google Summer of Code nel 2008, quando sono state scritte tutte le funzionalità di base. Ho continuato a mantenere e a sviluppare ulteriormente questo codice, e il numero delle funzionalità mancanti rispetto a Vim è leggermente diminuito: la maggior parte degli utenti di Vim è già produttiva nella modalità VI di Kate. Un elenco che cosa manca si trova alla fine della pagina.
Questa pagina dà una panoramica aggiornata su questo lavoro.
Impostazioni → Configura Kate… → Modifica → Modalità di inserimento VI.
Può essere attivata e disattivata anche con l'impostazione «Modalità di inserimento VI» nel menu «Modifica» (la scorciatoia predefinita è Meta+Ctrl+V; in genere Meta è il tasto Windows).
Obiettivi
L'obiettivo della modalità Vi non è quello di essere un sostituto completo di Vim e di supportare tutte le sue funzionalità. Il suo scopo è rendere disponibile la modifica del testo "alla Vim", e le abitudini ad essa legate, ai programmi che usano al loro interno l'editor di testo Kate come editor. Tra questi ci sono
- L'editor di testo Kate
- KWrite - l'editor di testo semplice di KDE
- KDevelop - un IDE avanzato per molti linguaggi di programmazione
- Kile - un editor LaTeX
La modalità Vi punta ad integrarsi bene con i programmi, e devia dal comportamento di Vim quando ciò ha senso. Per esempio, :w
aprirà una finestra di salvataggio nella modalità Vi di Kate.
Incompatibilità con Vim
Ci sono solo solo poche funzionalità della modalità Vi di Kate che sono incompatibili con Vim (non contando quelle mancanti). Sono elencate sotto, con le rispettive motivazioni.
- Kate:
U
eCtrl+r
sono rifai
Vim:Ctrl+r
è il normale rifai, mentreU
viene usato per annullare tutte le modifiche recenti a una riga
La ragione per cui nella modalità di inserimento Vi di KateU
si comporta come rifai, è che la scorciatoiactrl+r
viene presa dalla funzione sostituisci di Kate (cerca e sostituisci). Per impostazione predefinita la modalità di inserimento VI non sostituisce le scorciatoie di Kate (ma questo può essere configurato in Impostazioni → Configura Kate... → Modifica → Modalità di inserimento Vi), quindi anche un'azione di rifai deve essere disponibile alla pressione di un tasto "normale". Inoltre il comportamento del comando U di Vim non si associa bene al sistema annulla interno di Kate, perciò non sarebbe comunque banale supportarlo. - Kate:
:print
mostra la finestra di “stampa”
Vim::print
stampa le righe dell'intervallo specificato come il suo predecessore, e i comandi come :print sono disponibili non solo nella modalità VI, ma anche per gli utenti che utilizzano Kate in versione “normale”. Ho quindi scelto di lasciare che il comando:print
apra la finestra di stampa, seguendo il principio della minima sorpresa, invece di imitare il comportamento di Vim. - Kate:
Y
sposta alla fine della riga.
Vim:Y
sposta l'intera riga, proprio comeyy
. Il comportamento di VI per il comandoY
è in pratica un bug; sia per i comandi di modifica che per quelli di cancellazione,cc
/dd
agirà sulla riga corrente, mentreC
/D
funzionerà dalla colonna del cursore alla fine della riga. Tuttavia, siayy
cheY
copiano la riga corrente. Nella modalità VI di Kate,Y
copierà fino alla fine della riga. Questo è descritto come “più logico” nella documentazione di Vim. - Kate:
:map
modifica le righe selezionate del documento utilizzando l'espressione JavaScript fornita.
Vim::map
aggiunge la mappatura fornita alle modalità Normale e Visuale. Il comando “map” era già riservato da Kate: dalla versione 4.12 puoi utilizzare una combinazione di:nmap
e:vmap
per sostituirlo.
Comandi supportati
Comandi supportati nelle modalità normale e visuale
Tasto | Descrizione |
---|---|
a | Entra nella modalità di inserimento e aggiungi |
A | Entra nella modalità di inserimento e aggiungi a fine riga |
i | Entra nella modalità di inserimento |
I | Inserisci prima del primo carattere non vuoto sulla riga |
v | Entra in modalità visuale |
V | Entra in modalità visuale di riga |
<c-v> | Entra in modalità di blocco visuale |
gv | Riseleziona Visuale |
o | Apri nuova riga sotto |
O | Apri nuova riga sopra |
J | Unisci righe |
c | Modifica |
C | Modifica in EOL |
cc | Modifica riga |
s | Sostituisci carattere |
S | Sostituisci riga |
dd | Elimina riga |
d | Elimina |
D | Cancella fino a fine riga |
x | Elimina carattere |
X | Elimina carattere all'indietro |
gu | Metti in minuscolo |
guu | Metti riga in minuscolo |
gU | Metti in maiuscolo |
gUU | Metti riga in maiuscolo |
y | Copia |
yy | Copia riga |
Y | Copia fino a fine riga |
p | Incolla |
P | Incolla prima |
r. | Sostituisci carattere |
R | Entra in modalità di sostituzione |
: | Passa alla riga di comando |
/ | Cerca |
u | Annulla |
<c-r> | Rifai |
U | Rifai |
m. | Imposta contrassegno |
>> | Fai rientrare la riga |
<< | Riduci il rientro della riga |
> | Fai rientrare le righe |
< | Riduci il rientro delle righe |
<c-f> | Scorri una pagina in giù |
<pag giù> | Scorri una pagina in giù |
<c-b> | Scorri una pagina in su |
<pag su> | Scorri una pagina in su |
<c-u> | Scorri mezza pagina in su |
<c-d> | Scorri una pagina in su |
zz | Centra la vista sul cursore |
ga | Stampa codice carattere |
. | Ripeti l'ultima modifica |
== | Allinea riga |
= | Allinea righe |
~ | Cambia maiuscole/minuscole |
<c-a> | Aggiungi a numero |
<c-x> | Sottrai da numero |
<c-o> | Vai al salto precedente |
<c-i> | Vai al salto successivo |
<c-w>h | Passa alla vista sinistra |
<c-w><c-h> | Passa alla vista sinistra |
<c-w><left> | Passa alla vista sinistra |
<c-w>j | Passa alla vista sotto |
<c-w><c-j> | Passa alla vista sotto |
<c-w><down> | Passa alla vista sotto |
<c-w>k | Passa alla vista sopra |
<c-w><c-k> | Passa alla vista sopra |
<c-w><up> | Passa alla vista sopra |
<c-w>l | Passa alla vista a destra |
<c-w><c-l> | Passa alla vista a destra |
<c-w><destra> | Passa alla vista a destra |
<c-w>w | Passa alla vista successiva |
<c-w><c-w> | Passa alla vista successiva |
<c-w>s | Dividi orizzontalmente |
<c-w>S | Dividi orizzontalmente |
<c-w><c-s> | Dividi orizzontalmente |
<c-w>v | Dividi verticalmente |
<c-w><c-v> | Dividi verticalmente |
gt | Passa alla scheda successiva |
gT | Passa alla scheda precedente |
gqq | Formatta riga |
gq | Formatta righe |
q. / q | Inizia / termina la registrazione di macro usando il registratore di macro con nome. |
Movimenti supportati
Tasto | Descrizione |
---|---|
h | Sinistra |
<sinistra> | Sinistra |
<backspace> | Sinistra |
j | Giù |
<giù> | Giù |
<invio> | Giù fino al primo non vuoto |
k | Su |
<su> | Su |
– | Su fino al primo non vuoto |
l | Destra |
<destra> | Destra |
<spazio> | Destra |
$ | A fine riga |
<fine> | A fine riga |
Alla colonna 0 | |
<home> | Alla colonna 0 |
^ | Al primo carattere della riga |
f. | Trova carattere |
F. | Trova carattere all'indietro |
t. | Al carattere |
T. | Al carattere all'indietro |
; | Ripeti l'ultimo comando t. o f. |
, | Ripeti l'ultimo comando t. o f. |
n | Trova successivo |
N | Trova precedente |
gg | Alla prima riga |
G | All'ultima riga |
w | Parola in avanti |
W | PAROLA in avanti |
b | Parola indietro |
B | PAROLA indietro |
e | Alla fine della parola |
E | Alla fine della PAROLA |
ge | Alla fine delle parola precedente |
gE | Alla fine delle PAROLA precedente |
% | Al carattere corrispondente |
`[a-zA-Z><] | Al contrassegno |
'[a-zA-Z><] | Per contrassegnare la riga |
[[ | All'inizio della sezione precedente |
]] | All'inizio della sezione successiva |
[] | Alla fine della sezione precedente |
][ | Alla fine della sezione successiva |
* | L'occorrenza successiva della parola sotto il cursore |
# | L'occorrenza precedente della parola sotto il cursore |
H | Alla prima riga della finestra |
M | Alla riga in mezzo alla finestra |
L | All'ultima riga della finestra |
gj | Alla riga visuale successiva |
gk | Alla riga visuale precedente |
Oggetti di testo supportati
Tasto | Descrizione |
---|---|
iw | Parola interna |
aw | Una parola |
iW | PAROLA interna |
aW | Una PAROLA |
i" | Virgolette doppie interne |
a" | Una virgoletta interna doppia |
i’ | Virgoletta singola interna |
a’ | Una virgoletta interna singola |
i` | Virgoletta posteriore interna |
a` | Una virgoletta posteriore |
ib | Parentesi interna |
i) | Parentesi interna |
i( | Parentesi interna |
ab | Una parentesi |
a) | Una parentesi |
a( | Una parentesi |
iB | Parentesi graffa interna |
o} | Parentesi graffa interna |
i{ | Parentesi graffa interna |
aB | Una parentesi graffa |
a} | Una parentesi graffa |
a{ | Una parentesi graffa |
i< | Segno di disuguaglianza interno |
i> | Segno di disuguaglianza interno |
a< | Un segno di disuguaglianza |
a> | Un segno di disuguaglianza |
i[ | Parentesi quadra interna |
I] | Parentesi quadra interna |
a[ | Una parentesi quadra |
a] | Una parentesi quadra |
i, | Virgola interna |
a, | Una virgola |
Comandi supportati nella modalità di inserimento
Tasto | Descrizione |
---|---|
<c-d> | Riduci rientro |
<c-t> | Rientra |
<c-e> | Inserisci da sotto |
<c-y> | Inserisci da sopra |
<c-w> | Elimina la parola |
<c-r>. | Inserisci il contenuto del registro |
<c-o> | Passa alla modalità normale per un comando |
<c-a> | Incrementa il numero sotto il cursore |
<c-x> | Decrementa il numero sotto il cursore |
L'oggetto di testo tra virgole
Questo è un aspetto che mi mancava in Vim. L'oggetto di testo virgola rende semplice la modifica di elenchi di parametri nei linguaggi simili al C e in altri elenchi separati da virgole. È sostanzialmente l'area tra due virgole, o tra una virgola e una parentesi. Nella riga mostrata nell'illustrazione a destra, i tre intervalli che questo oggetto di testo può coprire sono evidenziati in rosso.

Intervalli degli oggetti di testo tra virgole. Se il cursore è, per esempio, sopra «arg2», premendo c i, «modifica virgola interna», eliminerebbe «doppio arg2» e posizionerebbe il cursore tra le due virgole in modalità di inserimento: un modo molto comodo per modificare i parametri di una funzione.
Barra dei comandi di Vim emulata
Kate 4.11 ha introdotto un'opzione di configurazione nascosta che fa sì che /
, ?
and :
facciano comparire un nuovo comando di ricerca al posto della consueta barra di ricerca e sostituzione o riga di comando di Kate. La barra ha lo scopo di replicare molte delle caratteristiche della barra dei comandi di Vim, e anche di risolvere molti dei problemi di interazione tra la modalità Vim di Kate e la sua barra Trova/Sostituisci (la sostituzione interattiva non funziona, la ricerca incrementale non posiziona correttamente il cursore, inoltre non è utilizzabile nelle mappature, nelle macro, ecc.).
Le seguenti scorciatoie sono fornite dalla barra dei comandi emulati; come per Vim possono essere riassociate con cmap, cnoremap, ecc:
Tasto | Descrizione |
---|---|
<c-r>. | inserisci i contenuti del registro. |
<c-r><c-w> | Inserire la parola sotto il cursore (nel documento). |
<c-p> | Invoca il completamento specifico per il contesto (vedi sotto) sposta indietro o in alto nell'elenco di completamento. |
<c-p> | Spostati in avanti / indietro nell'elenco di completamento. |
<c-space> | Estensione Vim di Kate. Completa automaticamente parola del documento. |
<c-d> | Estensione Vim di Kate. In un'espressione di sostituzione sed, (ad esempio s/find/replace/[g][c][i]), cancella il termine «find» e ci posiziona il cursore. |
<c-f> | Estensione Vim di Kate. In un'espressione di sostituzione sed, (ad esempio s/find/replace/[g][c][i]), cancella il termine «replace» e ci posiziona il cursore. |
<c-g>. | Estensione di Vim per Kate. Come per ., inserisce il contenuto del registro specificato, ma lo esegue in modo tale che, quando viene utilizzato con una ricerca, viene cercato il contenuto letterale del registro, non il contenuto del registro interpretato come se fosse espressione regolare. |
Il «completamento specifico del contesto» viene deciso come segue:
- Nella barra di ricerca (
/
o?
), il completamento automatico dalla cronologia delle ricerche (che include le ricerche iniziate con*
; e#
, quelle fatte nelle espressioni di sostituzione sed, eccetera) - In una barra di ricerca vuota (
:
), il completamento automatico dalla cronologia dei comandi (NB: il completamento automatico dei nomi dei comandi viene invocato automaticamente quando inizi a digitare). - In una barra dei comandi contenente un'espressione di sostituzione sed, ad esempio
:s/find/replace/gc
, se il cursore si trova su «find» il completamento automatico avverrà dalla cronologia delle «ricerche», mentre se è sopra «replace», da quella delle «sostituzioni».
Quando si esegue un'espressione di sostituzione sed nella barra dei comandi col contrassegno «c», ad esempio `s/find/replace/gc, inizierà un'espressione di ricerca/sostituzione interattiva in stile Vim.
Alcuni esempi sull'utilizzo della barra dei comandi emulata, con animazioni GIF, sono riportati in questo blog. Nella 4.11 puoi abilitare la barra dei comandi emulata impostando a true
l'opzione di configurazione nascosta «Vi Input Mode Emulate Command Bar», che si trova in katerc/kwriterc/kdeveloprc.
Funzionalità mancanti
Come già menzionato, l'obiettivo della modalità Vi di Kate non è supportare il 100% delle funzionalità di Vim, tuttavia ci sono delle funzionalità che sono purtroppo mancanti
- Modalità blocco visivo: in particolare la possibilità di aggiungere il testo prima o dopo la selezione del blocco visivo.
- Disponibilità dei comandi ex in programmi diversi dall'applicazione Kate.
- Il codice di ricerca deve essere migliorato, inoltre i comandi * e # dovrebbero essere delle normali ricerche.
Se ti mancano altre funzionalità, o se vuoi contribuire a quelle menzionate sopra, sentiti libero di contattarmi o di inviare patch! :-)
Elenco delle modifiche
- 16/05/2010:
Versione iniziale. Ho raccolto le informazioni dalle voci del blog e dai file README per creare un'unica fonte di informazioni aggiornate. - 17/05/2010:
Sono stati aggiuntiCtrl+A
eCtrl+X
(incrementa o decrementa i numeri sotto il cursore). - 30/08/2010:
La pagina è stata spostata su kate-editor.org. - 10/09/2010:
Corretto il testo dell'oggetto di testo virgola e apportate alcune correzioni alla formattazione. - 03/02/2021:
Conversione delle tabelle di associazione dei tasti al markdown per hugo.