source: project/wiki/emacs @ 37556

Last change on this file since 37556 was 37556, checked in by svnwiki, 16 months ago

Anonymous wiki edit for IP [140.190.31.198]: Updated steps for setting up Geiser in Chicken 5

File size: 5.9 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
25For Chicken 5, you’ll also need SRFI-18.
26<enscript highlight="bash">
27$ chicken-install -s srfi-18
28</enscript>
29
302. Update the Chicken documentation database.
31<enscript highlight="bash">
32$ cd `csi -p '(chicken-home)'`
33$ curl http://3e8.org/pub/chicken-doc/chicken-doc-repo.tgz | sudo tar zx
34</enscript>
35
36With Chicken 5, this process has changed slightly:
37<enscript highlight="bash">
38$ cd `csi -R chicken.platform -p '(chicken-home)'`
39$ curl https://3e8.org/pub/chicken-doc/chicken-doc-repo-5.tgz | sudo tar zx
40</enscript>
41
42=== scheme-complete
43
44Particularly recommended is [[/users/alex-shinn|Alex Shinn's]]
45[[http://synthcode.com/wiki/scheme-complete|{{scheme-complete}}]], which provides intelligent autocompletion.
46
47=== Dan's Emacs Extensions
48
49[[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.
50
51Recommended for those who find themselves coding without a reliable REPL.
52
53=== paredit
54
55[[http://mumble.net/~campbell/emacs/paredit.el|{{paredit}}]] provides structural editing for Scheme and Lisp code.
56
57=== Quack
58
59Neil van Dyke's [[http://www.neilvandyke.org/quack/|Quack]] enhances Emacs support for Scheme and can be used for editing CHICKEN code.
60
61[[image://parenteses.org/mario/misc/chicken-repl+emacs.png|quack]]
62
63The 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.
64
65=== Builtin Scheme support
66
67Emacs has builtin support for syntax-highlighting of Scheme code
68and running a Scheme interpreter in an interactive buffer.
69To use it with CHICKEN, add this to your {{~/.emacs}} file:
70
71  (setq scheme-program-name "csi -:c")
72
73The {{-:c}} is to force interactive mode, which is required on some platforms (most
74notably Windows).
75
76This variable is customizable, which is the preferred way in GNU Emacs
77and XEmacs to set user preferences: menu Options -> Customize Emacs ->
78Specific Option, type in {{scheme-program-name}}. Emacs displays a form;
79fill in {{csi -:c}} for the program name, click "Set for Current Session",
80and then "Save for Future Sessions". This will update (or create if it
81does not already exist) the {{custom-set-variables}} section in your {{~/.emacs}}
82file.
83
84=== Useful elisp snippets
85
86I have these definitions in my {{~/.emacs}} file, which allow loading 
87the current buffer, optionally by compiling it first to native code:
88
89<enscript highlight=elisp>
90(define-key scheme-mode-map "\C-c\C-l" 'scheme-load-current-file)
91(define-key scheme-mode-map "\C-c\C-k" 'scheme-compile-current-file)
92
93(require 'cmuscheme)
94
95(define-key scheme-mode-map "\C-c\C-l" 'scheme-load-current-file)
96(define-key scheme-mode-map "\C-c\C-k" 'scheme-compile-current-file)
97
98(defun scheme-load-current-file (&optional switch)
99  (interactive "P")
100  (let ((file-name (buffer-file-name)))
101    (comint-check-source file-name)
102    (setq scheme-prev-l/c-dir/file (cons (file-name-directory    file-name)
103                                         (file-name-nondirectory file-name)))
104    (comint-send-string (scheme-proc) (concat "(load \""
105                                              file-name
106                                              "\"\)\n"))
107    (if switch
108      (switch-to-scheme t)
109      (message "\"%s\" loaded." file-name) ) ) )
110
111(defun scheme-compile-current-file (&optional switch)
112  (interactive "P")
113  (let ((file-name (buffer-file-name)))
114    (comint-check-source file-name)
115    (setq scheme-prev-l/c-dir/file (cons (file-name-directory    file-name)
116                                         (file-name-nondirectory file-name)))
117    (message "compiling \"%s\" ..." file-name)
118    (comint-send-string (scheme-proc) (concat "(compile-file \""
119                                              file-name
120                                              "\"\)\n"))
121    (if switch
122      (switch-to-scheme t)
123      (message "\"%s\" compiled and loaded." file-name) ) ) )
124</enscript>
125
126
127==== Tweaking stock scheme-mode indentation
128
129<enscript higlight=elisp>
130;; Indenting module body code at column 0
131(defun scheme-module-indent (state indent-point normal-indent) 0)
132(put 'module 'scheme-indent-function 'scheme-module-indent)
133
134(put 'and-let* 'scheme-indent-function 1)
135(put 'parameterize 'scheme-indent-function 1)
136(put 'handle-exceptions 'scheme-indent-function 1)
137(put 'when 'scheme-indent-function 1)
138(put 'unless 'scheme-indent-function 1)
139(put 'match 'scheme-indent-function 1)
140</enscript>
141
142
143==== Auto-inserting portable shebang boilerplate on creating a scheme file
144
145See also the [[/writing portable scripts|writing portable scripts]] page.
146
147<enscript higlight=elisp>
148(require 'autoinsert)
149(add-hook 'find-file-hooks 'auto-insert)
150
151(setq auto-insert-alist 
152      '(("\\.scm" . 
153         (insert "#!/bin/sh\n#| -*- scheme -*-\nexec csi -s $0 \"$@\"\n|#\n"))))
154</enscript>
155
156==== Mixing scheme and C code
157
158[[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.