Mer Emacs — global-abbrev-table

Här diskuteras programmering och utveckling
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Mer Emacs — global-abbrev-table

Inlägg av Johnny Rosenberg »

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 bara

Kod: Markera allt

for
följt av mellanslag, vilket då får till följd att följande text skrivs ut:

Kod: Markera allt

for(;;){

 }
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:

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")
    ))
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:

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)
    ))
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

Kod: Markera allt

newabb
och sedan

Kod: Markera allt

M-x expand-abbrev
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

Kod: Markera allt

M-x c++-mode
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…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Mer Emacs — global-abbrev-table

Inlägg av Konservburk »

Lägg till i din ~/.emacs så borde det gå bättre:

Kod: Markera allt

(setq-default abbrev-mode t)
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Mer Emacs — global-abbrev-table

Inlägg av Johnny Rosenberg »

[quote="Konservburk"]Lägg till i din ~/.emacs så borde det gå bättre:

Kod: Markera allt

[color=#FF0040](setq-default abbrev-mode t)
Tack, det fungerade. Jag hade bara raden

Kod: Markera allt

(autoload 'expand-abbrev-hook "expand")
med förut, trodde det skulle räcka. Är den raden överflödig nu?

Vad jag nu är lite förbryllad över, är varför det fungerar utan (setq-default abbrev-mode t) när jag kör c++-mode.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Mer Emacs — global-abbrev-table

Inlägg av Konservburk »

Johnny Rosenberg skrev:Jag hade bara raden

Kod: Markera allt

(autoload 'expand-abbrev-hook "expand")
med förut, trodde det skulle räcka. Är den raden överflödig nu?
Inte om du vill kunna använda funktionen expand-abbrev-hook från filen expand.el
Johnny Rosenberg skrev:Vad jag nu är lite förbryllad över, är varför det fungerar utan (setq-default abbrev-mode t) när jag kör c++-mode.
Därför att det i c++-mode ingår att variabeln abbrev-mode är satt till t
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: Mer Emacs — global-abbrev-table

Inlägg av Johnny Rosenberg »

Kan man skapa ett eget ”mode” som automatiskt väljs för en viss filtyp eller rent av en viss fil? I så fall hur?
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Mer Emacs — global-abbrev-table

Inlägg av Konservburk »

Johnny Rosenberg skrev:Kan man skapa ett eget ”mode” som automatiskt väljs för en viss filtyp eller rent av en viss fil? I så fall hur?
http://web.archive.org/web/200208232347 ... orial.html
Skriv svar

Återgå till "Programmering och webbdesign"