Emacsforum var super sjovt - men ikke helt færdig

Det var super sjovt at holde Emacsforum - en "lillebror-konference" i forhold til Open Source Days - som jeg ellers har været med til et par gange eller ti. Det var meget forskellige foredrag, og i særklasse var som ventet Jesper Pedersen - som bare er en klasse bedre end nogen af os andre til at styre Emacs. Kenneth Geisshirt fik en sjov ide efterfølgende - vi skal da have lavet den perfekte .emacs-opsætningsfil sammen[1]. Kanon god ide.

I som ikke deltog kan hygge nu jer med video og efter par slidesæts på http://www.emacsforum.dk

Derfor vil jeg opfordre jer til at dele

  • smarte key-bindings
  • smarte procedurer
  • smarte måder at arbejde på i emacs

Men husk at forklare hvorfor og hvordan jeres bidrag bruges i Emacs/XEmacs.

Jeg vil gerne lægge ud med en grund-del til en ".emacs"-fil. Efter ";;" nedenfor er der kommentarer til funktionen, der defineres direkte efter.

Jeg skal prøve at få samlet jeres bidrag til en cool .emacs til slut.

;; home hhv. end hopper til start/slut af fil
(global-set-key [home] 'beginning-of-buffer)
(global-set-key [end] 'end-of-buffer)
;; Alt-g hopper til en given line
(global-set-key "\M-g" 'goto-line)
;; Control + venstre musetast giver menu over buffere
(global-set-key [\C-down-mouse-3] 'imenu)
;; Control + højre musetast vider index over funktioner i C/C++ mv.
(global-set-key [\C-down-mouse-1] 'mouse-buffer-menu)
;; Lad Control + musehjul op/ned skrue op/ned for font størrelse
(global-set-key [C-mouse-4] 'text-scale-increase)
(global-set-key [C-mouse-5] 'text-scale-decrease)
;;; Brug "Alt-z" til at hoppe mellem to matchende paranteser
(defun goto-match-paren (arg)
  "Go to the matching parenthesis if on parenthesis, otherwise insert the character typed."
  (interactive "p")
  (cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1))
    ((looking-at "\\s\)") (forward-char 1) (backward-list 1))
    (t                    (self-insert-command (or arg 1))) ))
(global-set-key "\M-z" `goto-match-paren)
;; Lad Emacs vise hvilke parenteser, der passer sammen
;; Sæt blot cursor hen over en parentes
(setq show-paren-mode 1)
(setq show-paren-style "parenthesis")

/pto

[1] jeg skal nok tage vim op bagefter.

P.S. Hvis I vil kommentere så kig lige her angående formattering - fokuser på scheme

Peter Tofts billede
Peter Toft er algoritme-designer hos Fingerprints Cards. Han har blogget om open source og Linux siden Version2's begyndelse. Blogger også jævnligt om andre sjove teknologi-områder.

Kommentarer (27)

Adam Sjøgren

En af de ting jeg virkelig savnede da jeg efter mange års voksende frustration skiftede fra XEmacs til GNU Emacs er at cursoren bliver smallere når den er sidst på linien. Med lidt hjælp fik jeg dette hack, som virker nogenlunde, bikset sammen:

; Narrow cursor at end of line:  
(defun asjo-indicate-end-of-line ()  
  "Change the cursor to a narrow one when at the end of line"  
  (if (eq (point) (line-end-position))  
      (setq cursor-type '(bar . 6))  
    (setq cursor-type t)))  
(add-hook 'post-command-hook 'asjo-indicate-end-of-line)

Bedre løsninger modtages med kyshånd. Specielt virker det ikke rigtigt i mmm-mode når jeg redigerer HTML-Mason komponenter.

Anders Mikkelsen

;; Alt-g hopper til en given line  
(global-set-key "\M-g" 'goto-line)

Det er vist problemet med Emacs. Den kan alt, men i standardkonfigurationen er det en editor, som ikke kan hoppe til et givent linjenummer.

Ja, man kan prøve at slæbe rundt på den perfekte .emacs fil, men hvis man bevæger sig rundt på mange systemer er det ikke holdbart.

Og så savner jeg en major mode som bare lader min indrykning være.

Paw Møller

Ja Jesper Pedersen var fantastisk.

Der er begyndt at skyde en del 'emacs starter kit' op rundt omkring, hvor der er gjort en del ud af at gøre emacs mere 'brugervenlig' (begyndervenlig). Dem er der meget godt i. Se fx https://github.com/pdee/pdee for en 'out of the box'-virkende python opsætning.

En god ting er det nye pakke-system(yep!). Det er vidst indbygget i emacs24, men kan også tilføjes til emacs23 ved at downloade package.el fra http://tromey.com/elpa/

Og så tilføje følgnede til init.el

(require 'package)  
(setq package-archives '(("ELPA" . "http://tromey.com/elpa/")   
             ("gnu" . "http://elpa.gnu.org/packages/")  
             ("marmalade" . "http://marmalade-repo.org/packages/")  
             ))  
; nedenstående indlæser pakker.  
(package-initialize)

Så kan tilføjelser til emacs installeres nemt(automatisk download og compilering) ved 'M-x package-list-package'

Lars Madsen

Det hook, skal jeg vist kigge nærmere på til et forsøg en dag. Jeg retter meget LaTeX kode som andre har skrevet, og retter tit størrelser af hegn (parenteser og lignende), så jeg kunne godt bruge en genvej som for et givet sæt af hegn (uanset om man er ved starten eller enden), kigger på hvad der står foran de to hegn, og så giver muligheden for at rette dette til noget andet (hvis der var tale om makroer der skalerer hegn). Det ville spare en hel del tid for mit vedkommende.

Paw Møller


Ang. emacs på flere systemer:

Put dog .emacs.d/ på dropbox/git osv. Ved dropbox er det nemt at lave symbolic link fra ~/.emacs.d/ til dropbox. Det virker også fint på windows. OG put alle udvidelser i en lisp-mappe inden i .emacs.d. Ikke noget med en obskur /usr/ sti. Så virker det!:)

Og brug så

(defun linux-p ()  
  (interactive)  
  "Return true if system is GNU/Linux-based"  
  (string-equal system-type "gnu/linux"))  
   
(defun windows-p ()  
  (interactive)  
  (string-equal system-type "windows-nt"))

Så kan system specifikke indstillinger loades med(pas på med if; den er, som Jesper viste, drisk!)

(when (linux-p)  
   ...  
)
Paw Møller

En killer-feature. Giver både en menu med senest åbnede filer, og en søgbar liste. http://www.emacswiki.org/emacs/RecentFiles

Put dette i init.el

;; recent file menu  
(require 'recentf)  
(recentf-mode 1)  
(setq recentf-auto-cleanup 'never)  
(setq recentf-max-saved-items 1000)  
(setq recentf-max-menu-items 100)

Og dernæst dette
http://pastebin.com/TG9rEdbB

Adam Sjøgren

Det er vist problemet med Emacs. Den kan alt, men i standardkonfigurationen er det en editor, som ikke kan hoppe til et givent linjenummer.

I GNU Emacs er default-genvejen for hop til linie bare upraktisk (M-g M-g); det er ikke fordi den ikke findes - XEmacs har den genvej som Peter Toft ændrer til (M-g) som default.

Ja, man kan prøve at slæbe rundt på den perfekte .emacs fil, men hvis man bevæger sig rundt på mange systemer er det ikke holdbart.

Her kan TRAMP hjælpe en del, men min løsning er normalt at bruge en "letvægts-Emacs" til småtingene (jove; den sidder i fingrene).

Og så savner jeg en major mode som bare lader min indrykning være.

Kan du uddybe lidt?

Andreas Bach Aaen

Hvis der er nogen af jer emacsguroer, der kan lave en mode hvor den viste tekst ikke springer en halv vindueshøjde frem i teksten hvis man trykker pil ned på den nederste linje i vinduet. Det er bestemt ikke altid en fordel at have cursoren cirka midt i vinduet. Det er vigtigere at kunne overskue den C funktion, man retter i. Jeg har set flere forsøg på at fikse dette - og på dette punkt få emacs til at ligne de fleste andre editorer, men jeg har endnu til gode at se en løsning hvor det virker hver gang - og ikke holde rop med at virke hvis der er blanke linjer eller ombrudte linjer i synsefeltet. Pil ned på nederste linje skal altså scrolle vinduet een tekstlinje op, hverken mere eller mindre. Hvis man vil hava centreret cursoren, så brug ctrl-l.

Jacob Nielsen

Interface til GNU Global som understøtter C, C++, Yacc, Java and PHP4 og endda også virker i ... vim :-)

Nu er svaret på spørgsmålet "hvor kaldes funktion_x() fra" blot et "\M-," væk ;-) Genialt!

Mange key-mappings men "\M-." (find funktion), "\M-*" (pop stak) og nu også "\M-," (find refererede steder) er dem jeg bruger mest.

(setq gtags-suggested-key-mapping 't) ; Keymap? Yes, please  
(require 'gtags)  
(add-hook 'gtags-mode-hook  
      (lambda()  
        (define-key gtags-mode-map "\M-," 'gtags-find-rtag)  
        ))
Jacob Nielsen

Man kan godt blive lidt misundelig på vim og letheden i at tælle tal op.

Til det kan man vel kun sige:

(require 'evil-numbers)

Kombineret med en lille remap af Control-z (et guldkorn fra Emacsforum)

;; Free Control-z from minimizing emacs  
;; and make it into a sparce keymap (prefix key)  
(defvar ctrl-z-map (make-sparse-keymap))  
(global-set-key [(control ?z)] ctrl-z-map)
(define-key ctrl-z-map "+" 'evil-numbers/inc-at-pt)  
(define-key ctrl-z-map "-" 'evil-numbers/dec-at-pt)
Jules Colding

(defvar point-start (make-marker))  
(defvar point-end (make-marker))  
   
(defun indent-buffer ()  
  "Indent the buffer according to mode."  
  (interactive)  
  (save-excursion  
    (goto-char (point-min))  
    (set-marker point-start (point))  
    (goto-char (point-max))  
    (set-marker point-end (point))  
    (indent-region point-start point-end nil))  
  )
Adam Sjøgren

Jeg ønsker at Tab indsætter fire mellemrum og at Enter hopper ned på næste linje med samme indrykning som den nuværende.

I stedet sker der alt muligt andet, afhængigt af hvilken filtype, jeg tilfældigvis har åbnet.

Ah, på den måde - ja, der bliver man vist nød til at tage dem en-for-en efterhånden som de irriterer.

cperl-mode gør som jeg gerne vil, men nogle af de modes jeg sjældnere brugere kan jeg genkende problemet fra (f.eks. når man redigerer C, der virker enter lidt for "smart" til min smag, men jeg skriver ikke nok til at jeg har gidet finde ud af hvordan man slår det fra).

En ting der forøvrigt undrer mig er at M-← og M-→ ikke er bundet til at hoppe "paranteser" i GNU Emacs, sådan som de er i XEmacs.

Kenneth Geisshirt

Jeg har (server-start) stående i min .emacs. Så kan jeg nemlig hurtig åbne alle filer som er ændret i et (SVN) projekt med kommandoen emacsclient $(svn stat * | grep ^M | cut -c9-) &

Peter Juhl Christiansen

Har også et lille trick jeg bruger

   
(defun google(string)  
  (interactive "sGoogle search:")  
  (shell-command  
   (concat "open http://www.google.dk/search?q="  
           (replace-regexp-in-string " " "+" string ))))

Det ovenfor er OSX udgaven, "open" skal skiftes ud med hvordan man starter en browser fra en shell i det system man har.

Man kan naturligvis også wrappe et kald til alle mulige andre scripts i ruby/perl/python mv.

Med lidt elisp gymnastik kan man også fange det der måtte komme "ud" af det man kalder og fx sætte det ind i sin buffer.

Arne Jørgensen

Jeg har smidt nedenstående i min .emacs.

Så får jeg kun startet en server hvis der ikke allerede er en.

;; server-start unless it is already running somewhere  
(unless (= 0 (call-process "emacsclient" nil nil nil "--eval" "nil" "-a" "false"))  
  (server-start))
Arne Jørgensen

Hej Peter. Her er min variant af det samme.

Den googler din region (hvis en sådan er sat) og ellers spørger den dig hvad du vil google.

Og så anvender den browse-url til at browse med - så skal du kun fortælle din emacs én gang hvilken browser du bruger :-)

(defun google nil  
  "Google something."  
  (interactive)  
  (let (arg)  
    (if mark-active  
        (setq arg (buffer-substring (region-beginning) (region-end)))  
      (setq arg (read-from-minibuffer "Search term: ")))  
    (browse-url (format "http://www.google.dk/search?q=%s" arg))))
Peter Juhl Christiansen

Hej Arne

Hvor var du da vi andre Emacs nørdede??

Ja din google er lidt snediger end min, men ville også nævne at man kan mange frække ting med shell-command, eller eshell-commnand-result .

Har selv brugt at lave en masse ruby scripts og wrappe dem som emacs funktioner, fiks hvis man iforvejen har et shell-script der gør noget man gerne vil kunne fra emacs, eller hvis man ikke er en elisp haj.

Benny Simonsen

Hej

Jeg er glad for mine print genveje:
Med faces
- C-p b (Print buffer)
- C-p r (Print region)
- C-p 1 (Print (ca) 1 side fra curser og frem)
Uden faces
- C-p B (Print buffer)
- C-p R (Print region)
- C-p ! (Print (ca) 1 side fra curser og frem)

(defun ps-print-onePageFromHere-with-faces ()  
  (interactive)  
  (let ((beg (point))) (forward-line 70) (ps-print-region-with-faces beg (point))  
  (goto-char beg)))  
   
(defun ps-print-onePageFromHere ()  
  (interactive)  
  (let ((beg (point))) (forward-line 70) (ps-print-region beg (point))  
  (goto-char beg)))  
   
(define-key global-map "\C-p" 'mode-specific-command-prefix)  
(define-key global-map "\C-pb" 'ps-print-buffer-with-faces)  
(define-key global-map "\C-pr" 'ps-print-region-with-faces)  
(define-key global-map "\C-pB" 'ps-print-buffer)  
(define-key global-map "\C-pR" 'ps-print-region)  
(define-key global-map "\C-p1" 'ps-print-onePageFromHere-with-faces)  
(define-key global-map "\C-p!" 'ps-print-onePageFromHere)
Kåre Jensen

Jeg ønsker at Tab indsætter fire mellemrum og at Enter hopper ned på næste linje med samme indrykning som den nuværende.

Det med mellemrum istedet for tabs kan ordnes med

(setq-default indent-tabs-mode nil)

Og tab-bredden kan styres med

(setq default-tab-width 4)

Det var den nemme del :)

Hvad det sker når du trykker Enter eller Tab afhænger af den major-mode der knyttet til den filtype du har åbnet. Den nemme løsning er vel at nulstille den liste der associerer filtype og modes, men så ryger syntaks highlight jo også:

(setq auto-mode-alist nil)

Den eneste vej jeg kan se er ligesom Adam Sjøgren nævner, at ændre indenteringen for hver mode som du bruger. Alle fornuftige major-modes har hooks som netop tillader customisering. En beskrivelse kan findes her:
http://www.gnu.org/s/libtool/manual/emacs/Hooks.html

Log ind eller opret en konto for at skrive kommentarer

IT Businesses