source: project/wiki/emacs @ 37533

Last change on this file since 37533 was 37533, checked in by svnwiki, 19 months ago

Anonymous wiki edit for IP [92.0.225.139]: Add documentation install instructions for Chicken 5.

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