source: project/wiki/emacs @ 36676

Last change on this file since 36676 was 35518, checked in by Mario Domenech Goulart, 20 months ago

emacs (wiki): don't hardcoded protocol in link to image

File size: 5.6 KB
Line 
1[[tags: emacs editors]]
2
3[[toc:]]
4
5== Using CHICKEN with emacs
6
7Various packages exist for supporting Scheme programming
8with the [[http://www.gnu.org/software/emacs/|emacs]] editor.
9
10CHICKEN's git repository contains two emacs modes that can be helpful for writing CHICKEN code: [[http://code.call-cc.org/cgi-bin/gitweb.cgi?p=chicken-core.git;a=blob_plain;f=misc/chicken.el;hb=HEAD|chicken.el]] and [[http://code.call-cc.org/cgi-bin/gitweb.cgi?p=chicken-core.git;a=blob_plain;f=misc/flymake-chicken.el;hb=HEAD|flymake-chicken.el]]
11
12=== geiser
13
14[[http://www.nongnu.org/geiser/|Geiser]] is a Scheme mode that provides eldoc (modeline signatures and symbol evaluation), auto-complete and company-mode support, documentation search, et al. Chicken support for Geiser is near-complete and recommended for use.
15
16Geiser is available on [[http://www.nongnu.org/geiser/geiser_2.html#The-easy-and-quick-way|MELPA]] and via [[http://www.nongnu.org/geiser/geiser_2.html#From-the-source_0027s-mouth|Git]].
17
18Chicken support requires some additional steps:
19
201. Install the necessary support eggs.
21<enscript highlight="bash">
22$ chicken-install -s apropos chicken-doc
23</enscript>
24
252. Update the Chicken documentation database.
26<enscript highlight="bash">
27$ cd `csi -p '(chicken-home)'`
28$ curl http://3e8.org/pub/chicken-doc/chicken-doc-repo.tgz | sudo tar zx
29</enscript>
30
31=== scheme-complete
32
33Particularly recommended is [[/users/alex-shinn|Alex Shinn's]]
34[[http://synthcode.com/wiki/scheme-complete|{{scheme-complete}}]], which provides intelligent autocompletion.
35
36=== Dan's Emacs Extensions
37
38[[dans-custom-emacs]] provides a set of extensions that enable full offline auto-complete w/ chicken-doc integration, complete font-lock support including prefixed modules, and support for all presently installed chicken modules.
39
40Recommended for those who find themselves coding without a reliable REPL.
41
42=== paredit
43
44[[http://mumble.net/~campbell/emacs/paredit.el|{{paredit}}]] provides structural editing for Scheme and Lisp code.
45
46=== Quack
47
48Neil van Dyke's [[http://www.neilvandyke.org/quack/|Quack]] enhances Emacs support for Scheme and can be used for editing CHICKEN code.
49
50[[image://parenteses.org/mario/misc/chicken-repl+emacs.png|quack]]
51
52The screenshot above shows [[http://www.gnu.org/software/emacs|GNU Emacs]] using Quack to edit a "hello world" program and the CHICKEN REPL being executed from within Emacs.
53
54=== Builtin Scheme support
55
56Emacs has builtin support for syntax-highlighting of Scheme code
57and running a Scheme interpreter in an interactive buffer.
58To use it with CHICKEN, add this to your {{~/.emacs}} file:
59
60  (setq scheme-program-name "csi -:c")
61
62The {{-:c}} is to force interactive mode, which is required on some platforms (most
63notably Windows).
64
65This variable is customizable, which is the preferred way in GNU Emacs
66and XEmacs to set user preferences: menu Options -> Customize Emacs ->
67Specific Option, type in {{scheme-program-name}}. Emacs displays a form;
68fill in {{csi -:c}} for the program name, click "Set for Current Session",
69and then "Save for Future Sessions". This will update (or create if it
70does not already exist) the {{custom-set-variables}} section in your {{~/.emacs}}
71file.
72
73=== Useful elisp snippets
74
75I have these definitions in my {{~/.emacs}} file, which allow loading 
76the current buffer, optionally by compiling it first to native code:
77
78<enscript highlight=elisp>
79(define-key scheme-mode-map "\C-c\C-l" 'scheme-load-current-file)
80(define-key scheme-mode-map "\C-c\C-k" 'scheme-compile-current-file)
81
82(require 'cmuscheme)
83
84(define-key scheme-mode-map "\C-c\C-l" 'scheme-load-current-file)
85(define-key scheme-mode-map "\C-c\C-k" 'scheme-compile-current-file)
86
87(defun scheme-load-current-file (&optional switch)
88  (interactive "P")
89  (let ((file-name (buffer-file-name)))
90    (comint-check-source file-name)
91    (setq scheme-prev-l/c-dir/file (cons (file-name-directory    file-name)
92                                         (file-name-nondirectory file-name)))
93    (comint-send-string (scheme-proc) (concat "(load \""
94                                              file-name
95                                              "\"\)\n"))
96    (if switch
97      (switch-to-scheme t)
98      (message "\"%s\" loaded." file-name) ) ) )
99
100(defun scheme-compile-current-file (&optional switch)
101  (interactive "P")
102  (let ((file-name (buffer-file-name)))
103    (comint-check-source file-name)
104    (setq scheme-prev-l/c-dir/file (cons (file-name-directory    file-name)
105                                         (file-name-nondirectory file-name)))
106    (message "compiling \"%s\" ..." file-name)
107    (comint-send-string (scheme-proc) (concat "(compile-file \""
108                                              file-name
109                                              "\"\)\n"))
110    (if switch
111      (switch-to-scheme t)
112      (message "\"%s\" compiled and loaded." file-name) ) ) )
113</enscript>
114
115
116==== Tweaking stock scheme-mode indentation
117
118<enscript higlight=elisp>
119;; Indenting module body code at column 0
120(defun scheme-module-indent (state indent-point normal-indent) 0)
121(put 'module 'scheme-indent-function 'scheme-module-indent)
122
123(put 'and-let* 'scheme-indent-function 1)
124(put 'parameterize 'scheme-indent-function 1)
125(put 'handle-exceptions 'scheme-indent-function 1)
126(put 'when 'scheme-indent-function 1)
127(put 'unless 'scheme-indent-function 1)
128(put 'match 'scheme-indent-function 1)
129</enscript>
130
131
132==== Auto-inserting portable shebang boilerplate on creating a scheme file
133
134See also the [[/writing portable scripts|writing portable scripts]] page.
135
136<enscript higlight=elisp>
137(require 'autoinsert)
138(add-hook 'find-file-hooks 'auto-insert)
139
140(setq auto-insert-alist 
141      '(("\\.scm" . 
142         (insert "#!/bin/sh\n#| -*- scheme -*-\nexec csi -s $0 \"$@\"\n|#\n"))))
143</enscript>
144
145==== Mixing scheme and C code
146
147[[http://www.ironoxide.ca/|Dan Leslie]] wrote [[emacs-multi-mode]] for easy switching between scheme-mode and c-mode.
Note: See TracBrowser for help on using the repository browser.