Gå till innehåll

Vi-läge

Inledning

Vim-logotyp

Kates VI-läge är ett projekt för att överföra Vim-liknande redigering baserad på moder till texteditorn Kate och i förlängning till andra KDE-program som delar samma redigeringskomponent. Projektet startade som ett Google Summer of Code-projekt 2008, då all grundläggande funktionalitet skrevs. Jag har fortsatt att underhålla och vidareutveckla koden och antalet saknade funktioner från Vim minskar sakta. De flesta användare av Vim är redan produktiva med Vi-läget i Kate. En lista över vad som saknas finns längst ner på sidan.

Den här sidan är tänkt att vara en uppdaterad översikt över arbetet.

För att aktivera VI-inmatningsläget, gå till
Inställningar → Anpassa Kate... → Redigering → VI-inmatningsläge.
Det kan också sättas på eller stängas av med inställningen "Inmatningslägen" i menyn "Redigera". (Förvald snabbtangent är Meta+Ctrl+V, där Meta vanligtvis är Windows-tangenten).

Mål

Målet med VI-läget är inte att vara en komplett ersättning av Vim och stödja alla funktioner i Vim. Syftet är att göra "Vim-sättet" att redigera text, och vanorna som man lärt sig i Vim, tillgängligt för program som använder Kate texteditorn som intern editor. Programmen inkluderar

  1. Kate texteditor
  2. Kwrite: KDE:s enkla texteditor
  3. KDevelop: En avancerad integrerad utvecklingsmiljö för många programspråk
  4. Kile: En Latex-editor

VI-läget syftar till att integreras snyggt med programmen och avviker från beteendet i Vim där det är vettigt. Till exempel öppnar :w att dialogruta för att spara i Kates VI-läge.

Inkompatibilitet med Vim

Det finns bara ett fåtal funktioner i Kates VI-läge som är inkompatibla med Vim (bortsett från sådant som saknas). De listas nedan tillsammans med respektive skäl.

  1. Kate: U ​​och Ctrl+r är gör om
    Vim: Ctrl+r är normal gör om, U används för att ångra alla senaste ändringar på en rad
    Anledningen till att "U" fungerar som gör om i Kates VI-läge är att genvägen "ctrl+r" normalt används av Kates ersättningsfunktion (sök och ersätt). Normalt överskrider inte VI-läget Kates genvägar (det kan ställas in i Inställningar → Anpassa Kate... → Redigering → Vi-inmatningsläge), och därför måste åtgärden gör om också vara tillgänglig som en "vanlig" knapptryckning. Dessutom stämmer inte beteendet hos U-kommandot i Vim med Kates interna system för ångra, så det skulle inte vara trivialt att stödja ändå.
  2. Kate: :print visar utskriftsdialogrutan
    Vim: :print skriver ut raderna i det angivna intervallet som det ärvs. Kommandon som :print är inte bara tillgängliga i VI-läge utan även för användare som använder "vanlig" Kate. Jag har därför valt att låta kommandot :print öppna utskriftsdialogrutan, enligt principen om minsta överraskning istället för att efterlikna beteendet i Vim.
  3. Kate: Y klipper ut till slutet av raden.
    Vim: Y klipper ut hela linjen, precis som yy. VI:s beteende för Y-kommandot är i praktiken ett fel. För både ändrings- och raderingskommandon gör cc/dd åtgärden på den aktuella raden och C/D arbetar från markörkolumnen till slutet av raden. Men både "yy" och "Y" klipper ut den aktuella linjen. I Kates VI-läge klipper "Y" ut till slutet av raden. Det beskrivs som "mer logiskt" i Vim-dokumentationen.
  4. Kate: :map ändrar de markerade raderna i dokumentet med hjälp av det angivna Javascript-uttrycket.
    Vim: :map lägger till den medföljande avbildningen i normalt och visuellt läge. Kommandot "map" var redan reserverat av Kate; i 4.12+ kan du använda en kombination av :nmap och :vmap för att ersätta det.

Kommandon som stöds

Kommandon som stöds i normalt och visuellt läge

TangentBeskrivning
aGå till infogningsläge och lägg till efter
AGå till infogningsläge och lägg till sist på raden
iGå till infogningsläge
IInfoga före första tecken på raden som inte är ett blanktecken
vGå till visuellt läge
VGå till visuellt radläge
<c-v>Gå till visuellt blockläge
gvVälj visuellt igen
oÖppna ny rad under
OÖppna ny rad ovanför
JKombinera rader
cÄndra
CÄndra till radslut
ccÄndra rad
sErsätt tecken
SErsätt rad
ddTa bort rad
dTa bort
DTa bort till radslut
xTa bort tecken
XTa bort tecken bakåt
guGör om till små bokstäver
guuGör om rad till små bokstäver
gUGör om till stora bokstäver
gUUGör om rad till stora bokstäver
yKlipp ut
yyKlipp ut rad
YKlipp ut till radslut
pKlistra in
PKlistra in före
r.Ersätt tecken
RGå till ersättningsläge
:Byt till kommandorad
/Sök
uÅngra
<c-r>Gör om
UGör om
m.Markera
>>Indentera rad
<<Avindentera rad
>Indentera rader
<Avindentera rader
<c-f>Rulla neråt en sida
<Page Down>Rulla neråt en sida
<c-b>Rulla uppåt en sida
<Page Up>Rulla uppåt en sida
<c-u>Rulla uppåt en halv sida
<c-d>Rulla neråt en halv sida
zzCentrera vyn omkring markör
gaSkriv ut teckenkod
.Upprepa senaste ändring
==Justera rad
=Justera rader
~Ändra skiftläge
<c-a>Addera till tal
<c-x>Subtrahera från tal
<c-o>Gå till föregående hopp
<c-i>Gå till nästa hopp
<c-w>hByt till vänster vy
<c-w><c-h>Byt till vänster vy
<c-w><vänsterpil>Byt till vänster vy
<c-w>jByt till vy nedanför
<c-w><c-j>Byt till vy nedanför
<c-w><neråtpil>Byt till vy nedanför
<c-w>kByt till vy ovanför
<c-w><c-k>Byt till vy ovanför
<c-w><uppåtpil>Byt till vy ovanför
<c-w>lByt till höger vy
<c-w><c-l>Byt till höger vy
<c-w><högerpil>Byt till höger vy
<c-w>wByt till nästa vy
<c-w><c-w>Byt till nästa vy
<c-w>sDela horisontellt
<c-w>SDela horisontellt
<c-w><c-s>Dela horisontellt
<c-w>vDela vertikalt
<c-w><c-v>Dela vertikalt
gtByt till nästa flik
gTByt till föregående flik
gqqFormatera rad
gqFormatera rader
q. / qBörja eller slutför inspelning av makro med namngivet makroregister.

Förflyttningar som stöds

TangentBeskrivning
hVänster
<vänsterpil>Vänster
<baksteg>Vänster
jNer
<neråtpil>Ner
<retur>Neråt till första som inte är tom
kUpp
<uppåtpil>Upp
Uppåt till första som inte är tom
lHöger
<högerpil>Höger
<mellanslag>Höger
$Till radslut
<End>Till radslut
Till kolumn 0
<Home>Till kolumn 0
^Till radens första tecken
f.Sök efter tecken
F.Sök efter tecken bakåt
t.Till tecken
T.TIll tecken bakåt
;Upprepa senaste t. eller f. kommando
,Upprepa senaste t. eller f. kommando
nSök igen
NSök föregående
ggTill första raden
GTill sista raden
wOrd framåt
WORD framåt
bOrd bakåt
BORD bakåt
eTill ordslut
ETill ORDSLUT
geTill föregående ordslut
gETill föregående ORDSLUT
%Till matchande objekt
`[a-zA-Z><]Till markering
'[a-zA-Z><]Till markerad rad
[[Till början av föregående block med hakparentes
]]Till början av nästa block med hakparentes
[]Till slutet av föregående block med hakparentes
][Till slutet av nästa block med hakparentes
*Till nästa förekomst av ordet under markören
#Till föregående förekomst av ordet under markören
HTill första raden i fönstret
MTill mittersta raden i fönstret
LTill sista raden i fönstret
gjTill nästa visuella rad
gkTill föregående visuella rad

Testobjekt som stöds

TangentBeskrivning
iwInre ord
awEtt ord
iWInre ORD
aWEtt ORD
i"Inre dubbelt citationstecken
a"Ett dubbelt citationstecken
i’Inte enkelt citationstecken
a’Ett enkelt citationstecken
i`Inre grav accent
a`En grav accent
ibInre parentes
i)Inre parentes
i(Inre parentes
abEn parentes
a)En parentes
a(En parentes
iBInre klammerparentes
o}Inre klammerparentes
i{Inre klammerparentes
aBEn klammerparentes
a}En klammerparentes
a{En klammerparentes
i<Inre olikhetstecken
i>Inre olikhetstecken
a<Ett olikhetstecken
a>Ett olikhetstecken
i[Inre hakparentes
I]Inre hakparentes
a[En hakparentes
a]En hakparentes
i,Inre kommatecken
a,Ett kommatecken

Infogningskommandon som stöds

TangentBeskrivning
<c-d>Avindentera
<c-t>Indentera
<c-e>Infoga underifrån
<c-y>Infoga ovanifrån
<c-w>Ta bort ord
<c-r>.Infoga registerinnehåll
<c-o>Byt till normal läge för ett kommando
<c-a>Öka talet under markören
<c-x>Minska talet under markören

Textobjektet kommatecken

Det är något som jag har saknat i Vim. Textobjektet kommatecken gör det enkelt att ändra parameterlistor i C-liknande språk och andra kommaseparerade listor. Det är i princip området mellan två kommatecken eller mellan ett kommatecken och en parentes. På linjen som visas i illustrationen till höger är de tre områden som textobjektet kan spänna över markerade i rött.

kommatecken till

Intervall för textobjektet kommatecken. Om markören är över, låt oss säga "arg2", skulle en tryckning på c i, ("ändra inre kommatecken") radera "double arg2" och placera markören mellan de två kommatecknen i infogningsläge. Ett mycket bekvämt sätt att ändra en funktions parametrar.

Emulera kommandoraden i Vim

Kate 4.11 introducerade ett dolt inställningsalternativ som gör att /, ? och : visar en ny sökning eller kommando i stället för det vanliga Kommandoradsfältet i Kate Sök/Ersätt. Raden är avsedd att replikera många av funktionerna på kommandoraden i Vim, och även att rätta många av problemen med Vim-lägets interaktion med sök och ersätt i Kate (interaktiv ersättning fungerar inte, inkrementell sökning placerar inte markören korrekt, inte användbar i avbildningar/makron etc).

Följande genvägar tillhandahålls av den emulerade kommandoraden. Liksom med Vim, kan de ändras om med cmap, cnoremap, etc:

TangentBeskrivning
<c-r>.Infoga innehållet i ett register.
<c-r><c-w>Infoga ord under (dokumentets) markör.
<c-p>Anropa sammanhangsberoende komplettering (se nedan)
gå bakåt/uppåt i kompletteringslistan.
<c-p>Gå framåt/neråt i kompletteringslistan.
<c-mellanslag>Utökning av Vim i Kate.
Komplettera automatiskt ord från dokument.
<c-d>Utökning av Vim i Kate.
I ett sed-ersättningsuttryck (dvs. s/sök/ersätt/[g][c][i]),
rensa "söktermen" och placera markören där.
<c-f>Utökning av Vim i Kate.
I ett sed-ersättningsuttryck (dvs. s/sök/ersätt/[g][c][i]),
rensa "ersättningstermen" och placera markören där.
<c-g>.Utökning av Vim i Kate.
Som med ., infoga innehållet i det namngivna registret,
men formatera det på ett sådant sätt att när det används med en sökning,
söker vi efter det bokstavliga innehållet i registret;
inte innehållet i registret tolkat som ett reguljärt uttryck.

Den "sammanhangsberoende kompletteringen" bestäms på följande sätt:

  • På en sökrad (/ eller ?), fyll automatiskt i från sökhistoriken (som inkluderar sökningar initierade via *och #, sökningar gjorda i sed-ersättningsuttryck, etc.)
  • På en tom kommandorad (:), fyll i automatiskt från kommandohistoriken (observera: automatiskt komplettering av kommandonamn utförs automatiskt när man börjar skriva).
  • På en kommandorad som innehåller ett sed-ersättningsuttryck (t.ex. :s/sök/ersätt/gc), om markören är placerad över "sök", fyll automatiskt i från "sökhistoriken"; om över "ersätt", fyll i automatiskt från historiken för "ersätt" termer.

När ett sed-ersättningsuttryck används på kommandoraden med flaggan "c" (t.ex. s/sök/ersätt/gc), initieras ett interaktivt sök/ersätt-uttryck med Vim-stil.

Några exempel på användningar av den emulerade kommandoraden, med GIF-animationer, ges i den här bloggen. I 4.11 kan den emulerade kommandoraden aktiveras genom att använda det dolda inställningsalternativet "Vi Input Mode Emulate Command Bar" till "true" i katerc/kwriterc/kdeveloprc.

Saknade funktioner

Som nämnts tidigare är målet med Kates VI-läge inte att stödja 100 % av funktionerna i Vim, men det finns några funktioner som saknas mycket

  • Visuellt blockläge: Särskilt möjligheten att lägga till text före eller efter den visuella blockmarkeringen.
  • Ha ex-kommandon tillgängliga i andra program än Kate-programmet.
  • Sökkoden behöver förbättras och kommandona * och # ska bara vara vanliga sökningar.

Om du saknar andra funktioner eller vill hjälpa till med de som nämns ovan, kontakta mig gärna eller skicka programfixar!

Ändringslogg

  • 2010-05-16:
    Första versionen. Samlade informationen från blogginlägg och README-filer för att skapa en enda källa med aktuell information.
  • 2010-05-17:
    Ctrl+A och Ctrl+X tillagda (öka/minska tal under markören).
  • 2010-08-30:
    Flyttade sida till kate-editor.org.
  • 2010-09-10:
    Rättade texten om textobjektet för kommatecken och gjorde några formateringsrättningar
  • 2021-02-03:
    Konverterade tangentbindningstabeller till markdown för hugo.