Mer Emacs — global-abbrev-table
Postat: 23 jun 2008, 21:13
Jag har nu börjat komma igång en del med Emacs, särskilt som ett problem jag hade och som jag skrev om i en annan tråd löste sig på ett bra sätt, men nu har jag stött på patrull igen, som man säger.
När jag programmerar i C++ vill jag gärna snabba upp arbetet en del genom att slippa skriva samma saker hela tiden. Detta gör jag genom att skapa förkortningar som jag lägger i en fil och som jag ser till laddas in varje gång jag startar Emacs. Jag ser också till att Emacs expanderar mina förkortningar automatiskt utan att jag behöver be den om det, även detta med hjälp av kod i lämplig fil.
Så, om jag exempelvis behöver skriva en for-sats, skriver jag baraföljt av mellanslag, vilket då får till följd att följande text skrivs ut:Dessutom kommer markören att ställa sig där jag helst vill ha den, nämligen precis efter första parentesen, så att jag enkelt kan mata in vad jag vill ha inom parentesen.
Här är, om någon vill veta, de förkortningar jag hittills skapat som ska fungera i C++-mode:
Information om hur man går tillväga har jag hittat på nätet, men jag är inte helt på det klara med VARFÖR man gör som man gör. Kan någon förklara för mig vad () nil gör för nytta i just där och varför expand-abbrev-hook följs av en nolla, så är jag tacksam.
Nu till mitt problem:
När jag ska skapa fler förkortningar, särskilt de där jag vill att markören ska hamna någon annanstans än på slutet, blir det en del upprepningar även där, så jag har skapat följande rader i samma fil:
När jag öppnar min förkortningsfil i Emacs, hamnar Emacs tydligen i Fundamental mode, vilket tydligen ska vara något slags ”ingenting-läge” som det inte är tänkt att man ska anpassa. Dock ska det, vad jag förstått, fungera att expandera förkortningar som är gjorde som ”globala” sådana, vilket jag också gjort, som synes ovan. Problemet är bara att det inte fungerar! Visst, jag kan skriva exempelvis och sedan vilket fungerar utmärkt, men det fungerar inte per automatik, som det gjorde med mina C++-förkortningar!
För skoj skull testade jag att skriva och då fungerade mina globala förkortningar.
Fråga: Vad behöver jag göra för att mina globala förkortningar ska fungera automatiskt i Fundamental mode? Provade även med text-mode, men inte heller då fungerade mina globala förkortningar. Känns inte helt logiskt, i alla fall inte än, innan någon förklarat vad jag missat…
När jag programmerar i C++ vill jag gärna snabba upp arbetet en del genom att slippa skriva samma saker hela tiden. Detta gör jag genom att skapa förkortningar som jag lägger i en fil och som jag ser till laddas in varje gång jag startar Emacs. Jag ser också till att Emacs expanderar mina förkortningar automatiskt utan att jag behöver be den om det, även detta med hjälp av kod i lämplig fil.
Så, om jag exempelvis behöver skriva en for-sats, skriver jag bara
Kod: Markera allt
for
Kod: Markera allt
for(;;){
}
Här är, om någon vill veta, de förkortningar jag hittills skapat som ska fungera i C++-mode:
Kod: Markera allt
(define-abbrev-table 'c++-mode-abbrev-table '(
("incl" ["#include <>" 1 () nil] expand-abbrev-hook 0)
("main" ["int main(){\n\n\nreturn 0;\n}" 13 () nil] expand-abbrev-hook 0)
("un" ["using namespace ;" 1 () nil] expand-abbrev-hook 0)
("for" ["for(;;){\n\n}" 7 () nil] expand-abbrev-hook 0)
("do" ["do{\n\n} while()" 1 () nil] expand-abbrev-hook 0)
("while" ["while(){\n\n}" 5 () nil] expand-abbrev-hook 0)
("if" ["if(){\n\n}" 5 () nil] expand-abbrev-hook 0)
("else" ["else{\n\n}" 2 () nil] expand-abbrev-hook 0)
("elseif" ["else if(){\n\n}" 5 () nil] expand-abbrev-hook 0)
("switch" ["switch(){\ncase :\nbreak;\ndefault:\n}" 27 () nil] expand-abbrev-hook 0)
("class" ["class {\nprivate:\n\npublic:\n\n};" 24 () nil] expand-abbrev-hook 0)
("op" ["operator(){\n\n}" 6 () nil] expand-abbrev-hook 0)
("iiostream" "#include <iostream>")
("istring" "#include <string>")
("icmath" "#include <cmath>")
("ifstream" "#include <fstream>")
("icstdlib" "#include <cstdlib>")
("icctype" "#include <cctype>")
("ictime" "#include <ctime>")
("cout" "cout <<")
("cin" "cin >>")
("ret" "return 0")
("std" "using namespace std")
))
Nu till mitt problem:
När jag ska skapa fler förkortningar, särskilt de där jag vill att markören ska hamna någon annanstans än på slutet, blir det en del upprepningar även där, så jag har skapat följande rader i samma fil:
Kod: Markera allt
(define-abbrev-table 'global-abbrev-table '(
("eah" "expand-abbrev-hook 0)")
("newabb" ["(\"\" [\"\" () nil] expand-abbrev-hook 0)" 36 () nil] expand-abbrev-hook 0)
))
Kod: Markera allt
newabb
Kod: Markera allt
M-x expand-abbrev
För skoj skull testade jag att skriva
Kod: Markera allt
M-x c++-mode
Fråga: Vad behöver jag göra för att mina globala förkortningar ska fungera automatiskt i Fundamental mode? Provade även med text-mode, men inte heller då fungerade mina globala förkortningar. Känns inte helt logiskt, i alla fall inte än, innan någon förklarat vad jag missat…