source: project/wiki/emacs @ 31367

Last change on this file since 31367 was 31367, checked in by svnwiki, 7 years ago

Anonymous wiki edit for IP [80.145.34.132]: removed hen.el, added link to Quack, removed cluck

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