Vi-läge
Inledning
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.
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
- Kate texteditor
- Kwrite: KDE:s enkla texteditor
- KDevelop: En avancerad integrerad utvecklingsmiljö för många programspråk
- 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.
- Kate:
U
ochCtrl+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å. - 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. - Kate:
Y
klipper ut till slutet av raden.
Vim:Y
klipper ut hela linjen, precis somyy
. VI:s beteende förY
-kommandot är i praktiken ett fel. För både ändrings- och raderingskommandon görcc
/dd
åtgärden på den aktuella raden ochC
/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. - 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
Tangent | Beskrivning |
---|---|
a | Gå till infogningsläge och lägg till efter |
A | Gå till infogningsläge och lägg till sist på raden |
i | Gå till infogningsläge |
I | Infoga före första tecken på raden som inte är ett blanktecken |
v | Gå till visuellt läge |
V | Gå till visuellt radläge |
<c-v> | Gå till visuellt blockläge |
gv | Välj visuellt igen |
o | Öppna ny rad under |
O | Öppna ny rad ovanför |
J | Kombinera rader |
c | Ändra |
C | Ändra till radslut |
cc | Ändra rad |
s | Ersätt tecken |
S | Ersätt rad |
dd | Ta bort rad |
d | Ta bort |
D | Ta bort till radslut |
x | Ta bort tecken |
X | Ta bort tecken bakåt |
gu | Gör om till små bokstäver |
guu | Gör om rad till små bokstäver |
gU | Gör om till stora bokstäver |
gUU | Gör om rad till stora bokstäver |
y | Klipp ut |
yy | Klipp ut rad |
Y | Klipp ut till radslut |
p | Klistra in |
P | Klistra in före |
r. | Ersätt tecken |
R | Gå till ersättningsläge |
: | Byt till kommandorad |
/ | Sök |
u | Ångra |
<c-r> | Gör om |
U | Gö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 |
zz | Centrera vyn omkring markör |
ga | Skriv 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>h | Byt till vänster vy |
<c-w><c-h> | Byt till vänster vy |
<c-w><vänsterpil> | Byt till vänster vy |
<c-w>j | Byt till vy nedanför |
<c-w><c-j> | Byt till vy nedanför |
<c-w><neråtpil> | Byt till vy nedanför |
<c-w>k | Byt till vy ovanför |
<c-w><c-k> | Byt till vy ovanför |
<c-w><uppåtpil> | Byt till vy ovanför |
<c-w>l | Byt till höger vy |
<c-w><c-l> | Byt till höger vy |
<c-w><högerpil> | Byt till höger vy |
<c-w>w | Byt till nästa vy |
<c-w><c-w> | Byt till nästa vy |
<c-w>s | Dela horisontellt |
<c-w>S | Dela horisontellt |
<c-w><c-s> | Dela horisontellt |
<c-w>v | Dela vertikalt |
<c-w><c-v> | Dela vertikalt |
gt | Byt till nästa flik |
gT | Byt till föregående flik |
gqq | Formatera rad |
gq | Formatera rader |
q. / q | Börja eller slutför inspelning av makro med namngivet makroregister. |
Förflyttningar som stöds
Tangent | Beskrivning |
---|---|
h | Vänster |
<vänsterpil> | Vänster |
<baksteg> | Vänster |
j | Ner |
<neråtpil> | Ner |
<retur> | Neråt till första som inte är tom |
k | Upp |
<uppåtpil> | Upp |
– | Uppåt till första som inte är tom |
l | Hö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 |
n | Sök igen |
N | Sök föregående |
gg | Till första raden |
G | Till sista raden |
w | Ord framåt |
W | ORD framåt |
b | Ord bakåt |
B | ORD bakåt |
e | Till ordslut |
E | Till ORDSLUT |
ge | Till föregående ordslut |
gE | Till 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 |
H | Till första raden i fönstret |
M | Till mittersta raden i fönstret |
L | Till sista raden i fönstret |
gj | Till nästa visuella rad |
gk | Till föregående visuella rad |
Testobjekt som stöds
Tangent | Beskrivning |
---|---|
iw | Inre ord |
aw | Ett ord |
iW | Inre ORD |
aW | Ett 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 |
ib | Inre parentes |
i) | Inre parentes |
i( | Inre parentes |
ab | En parentes |
a) | En parentes |
a( | En parentes |
iB | Inre klammerparentes |
o} | Inre klammerparentes |
i{ | Inre klammerparentes |
aB | En 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
Tangent | Beskrivning |
---|---|
<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.
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:
Tangent | Beskrivning |
---|---|
<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
ochCtrl+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.