Ciao Emacs
1 Conventions
Emacs is built on a LisP interpreter called elisp. Within an emacs session, you can run any elisp command by typing Alt-x which will put the cursor into a minibuffer at the bottom of the screen where you enter the command (e.g. isearch-forward) followed by RETURN. Alternatively most commands have bindings to Control key or Metakey sequences. When you type a key-binding sequence, emacs executes the elisp command bound to the key. Emacs documentation uses the convention that
-
C-c means: Hold down the Control or CTRL key and simultaneously hit c
-
M-c means: Hold down your systems Meta-key (usually labelled Alt) and simultaneously hit c. As an alternative to the meta-key (e.g. if you do not have one), emacs will accept ESC followed by c as the same as M-c. If using the ESC key you release ESC before hitting the next character. On the Mac the Meta key is the key labelled option.
-
C-M-c means: Hold down both CTRL and Alt (the Meta key) while typing c
2 Emacs
GNU Emacs is a text editor written by Richard Smallman of GNU fa,e. Emacs is build on a LisP interpreter called elisp. Whereas vi(m) has 2 modes: command and insert, emacs is always in insert mode and relies on conrtol key-bindings to execute commands (which are implemented in the underlying elisp language). But emacs has many so-called major modes which set behavious considered appropriate for editing different languages and/or applications such as C, perl, mail, shell, etc. The Ciao Development Environment (CiaoDE) has created a ciao-mode to facilitate Constraint Logic Programming(CLP) for Ciao Prolog and other Prologs. The ciao-mode will be invoked whenever you edit a file suffixed the .pl from an emacs session.
2.1 Minibuffer
2.1.1 M-x and C-q
Withib an emacs session, you can run any elisp command by typing M-x which will put you into a minibuffer at the bottom of the screen where you enter the command (e.g. isearch-forward) followed by RETURN. While in the minibuffer if you wish to embed or TAB with C-q (for quote) otherwise emacs will attempt to complete or lookjup the string sa far typed in.
Alternatively most commands have binding to Control key or Metakey sequences. When you type a key-binding sequence, emacs executes the eliosp command bound to the key.
3 Elisp args
You can prefix an elisp command with a numeric argument. e.g. to arrow down 5 lines, you want to supply the argument 5 to the C-n command. You type either of the following
Note: C-u not followed by a numeric argument defaults its argument to 4. So for example, C-u C-n move the cursor down 4 lines. A numeric argument is a sequence of digits optionally preceded by a - sign.
4 Emacs help
Within emacs you can invoke emacs documentation by hitting C-h followed one of several possible letters:
|
Binding
|
elisp
|
Action
|
|
C-h ?
|
|
List all possible help options
|
|
C-h b
|
describe-bindings
|
List all key-bindings for this buffer
|
|
C-h t
|
help-with-tutorial
|
Run the emacs tutorial
|
|
C-h m
|
describe-mode
|
Describe the mode for the current buffer
|
|
C-h c
|
describe-key-briefly
|
What elisp command does this key run
|
|
C-h k
|
describe-key
|
What elisp command and action
|
|
C-h a
|
command-apropos
|
Which command involves this concept
|
|
C-h v
|
describe-variable
|
Show value of variable
|
5 Major Modes
Emacs has several major modes which offer customised support for different languages and file formats (such as C, perl, python, pascal, ruby, etc). Emacs tries to guess from builtin file properties such as suffices which mode is suitable. People who develop in emacs tend to live in the emacs program instead of leaving it to run shell commands, send and receive mail, etc. For instance you can run a shell session from within emacs by typing M-x shell
The buffer created by the emacs shell major mode melds the shell prompt, the shell command you type in, and the output of shell command into the shell buffer. This mostly behaves just like the command line shell except that the up arrow goes to the previous line in the buffer rather than the previous command entered. To get the previous command type: M-p
5.2 Other major modes
Emacs has over the years developed and distributed major modes for all the common development languages such as C, pascal, perl, python, ruby, etc. as well as for builtin apps such as mail, shell etc. These offer syntax highlighting, appropriate indentation, auto-completion of keywords and so on.
6 Ciao
Ciao has created an emacs major mode (i.e. its own set of bindings for the purposes of Ciao programming, debugging, compiling, etc). They are mostly keyed with a prefix of C-c. Editing any file with a .pl suffix should cause emacs to load the Ciao bindings and display a Ciao menu. If not, type M-x ciao-mode
|
Binding
|
Mnemonic
|
Action
|
|
C-c t
|
top
|
(Re)Start top level
|
|
C-c l
|
load
|
(Re)Load buffer to top level
|
|
C-c f
|
fix?
|
(Re)Load & Check buffer to top level
|
|
C-c L
|
Load
|
(Re)Load main and other buffers to top level
|
|
C-c x
|
xecute
|
Make executable buffer if main
|
|
C-c ‘
|
|
goto next error
|
|
C-c e
|
erase
|
remove error mark(s) from buffer
|
|
C-c q
|
query
|
Set default query
|
|
C-c Q
|
Query
|
Call default query
|
|
C-c s
|
set
|
(Un)Set current buffer as main
|
|
C-c I S
|
Insert Script
|
Insert Unix script header
|
|
C-c o
|
object
|
compile current buffer to .o file
|
|
C-c a
|
active
|
make current buffer active?
|
|
|
|
|
|
C-c d
|
debug
|
(Un)debug buffer source
|
|
C-c m
|
mode
|
Select debugging mode
|
|
C-c M m
|
Multi-mode
|
Select multiple buffers for debug
|
|
C-c S b
|
source break
|
set breakpoint on current symbol
|
|
C-c S v
|
|
remove breakpoint from current symbol
|
|
C-c S n
|
source none?
|
remove all breakpoints
|
|
C-c S l
|
source list
|
list all breakpoints
|
|
C-c S d
|
source debug
|
toggle debug mode
|
|
C-c r
|
region
|
load region for debug?
|
|
C-c p
|
predicate
|
load predicate for debug
|
|
C-c D ...
|
|
LPDoc commands
|
|
C-c D B
|
document buffer
|
generate documentation for buffer
|
|
C-c D V
|
document view
|
view documentation for this buffer
|
|
C-c D F
|
document format
|
change format of document (e.g. html, info, )
|
|
C-c D S
|
document settings
|
visit/create LPSETTINGS.pl file
|
|
C-c D G
|
document generate
|
generate documentation
|
|
|
|
|
|
C-c C-a
|
activate
|
Activate version control for file
|
|
C-c C-s
|
set
|
Insert a changelog entry
|
|
C-c n
|
no
|
Increase version no
|
|
C-c C-n
|
next
|
goto next changelog entry
|
|
|
|
|
|
C-c TAB
|
|
Find help for symbol under cursor
|
|
C-c /
|
|
Find a completion for symbol under cursor
|
|
C-c C-M
|
manual
|
goto info dir containing Ciao manuals
|
|
C-h m
|
mode
|
emacs help for modes
|
|
|
|
|
|
C-c C-u
|
Undo
|
kill all text from last stuff output to point
|
|
C-c C-w
|
word
|
kill backwards to enf of word (arg times)
|
|
C-c C-c
|
like bash ^C
|
interrupt current job
|
|
C-c C-Z
|
like bash ^Z
|
stop current sub-job
|
|
C-c C-\
|
like bash ^\
|
send quit signal
|
|
|
|
|
6.1 Trouble Shooting
If editing a .pl file does not cause emacs to invoke ciao-mode then you need to do the following:
-
Type C-h v then in the minibuffer type process-environment. This displays the environment vars that emacs has inherited. Look especially for the CIAO vars:
-
CIAOLIB
-
CIAODOCDIR
-
CIAOARCH
-
INFOPATH
Test that the ciao-mode has been defined (in elisp) and is available to emacs by running the command:
M-x ciao-mode
This should result in the word (ciao) showing in the emacs frame header. If not there may be an error message hinting at what is wrong. When ciao-mode is running you should see a Ciao set of menu options on the menubar of emacs.
7 Standard Emacs
7.1 Cursor and Point
Emacs executes its commands at the point (which is an imaginary point just before (i.e. to the left of) the cursor).
7.2 Cut and Paste (or Copy and Paste)
7.2.1 Cut or Copy
To identify chunks of text, you place a mark using C-@ then move the cursor to another position and execute a copy (M-w) or delete (C-w) command to save or move the text into emacs’ kill-ring. You can then move the point elsewhere (say to another file buffer). With a mouse, you can click and drag to select a region for copying or deleting.
To paste what is in the kill-ring, you use emacs’ yank command C-y to copy. In both cases the contents of the kill-ring are inserted at the point (just before the cursor).
7.2.3 Cut, Copy, and Paste on the Mac
On the Mac if you are using Aquamacs, the Command key can be used in ways consistent with OS X. Specifically Command with C, X, and V can be used for copy, delete, and paste.
8 Files and Buffers
When you edit a file with emacs using the File menu or C-x C-f, emacs creates a frame buffer in which the changes you make are done. Nothing happens to the file until you Save with C-x C-s.
The buffer has a menu on its top line with options Buffers, Files, Tools, Edit, Search, Help and others if a major mode such as Ciao is invoked.
The buffer has a status line at the bottom which is in inverse video and has the following format:
-----Emacs: filename (major minor)--Ln--All----------------------------------
where
-
filename is the name of the file
-
major is the name of the major mode (e.g. Fundamental, Text, Mail, Shell, LaTeX, Perl, C, or in our case Ciao)
-
minor is the minor mode (e.g. Auto-fill, Overwrite, Auto-save, Outline, etc)
-
Ln indicates the point is at Line n
-
All describes how much of the file in visible in the buffer (as a percentage or All).
You will have a buffer for each file you are editing with emacs.
8.2.1 Minibuffer
At the bottom of the screen there is also a one line buffer called the minibuffer where error messages and emacs prompts for input are displayed or where you can execute elisp command with M-x.
9 Standard Emacs
9.1 Navigation
You can use the usual cursor keys (left and right, up and down arrows) or mouse click to place the cursor somewhere in a buffer. In addition there are the following key-bindings:
|
Binding
|
elisp
|
Action
|
|
C-f
|
forward-char
|
as right arrow
|
|
C-b
|
backward-char
|
as left arrow
|
|
C-p
|
previous-line
|
as up arrow
|
|
C-n
|
next-line
|
as down arrow
|
|
M-f
|
forward-word
|
|
|
M-b
|
backward-word
|
|
|
C-a
|
beginning-of-line
|
|
|
C-e
|
end-of-line
|
|
|
C-v
|
scroll-up
|
|
|
M-v
|
scroll-down
|
|
|
M-<
|
beginning-of-buffer
|
|
|
M->
|
end-of-buffer
|
|
|
C-l
|
recenter
|
|
9.2 Yank and Put
The emacs equivalent of vi’s y and p are kill and yank. (Note yank is the opposite of vi’s yank and pulls from the kill ring into the buffer). Emac’s various kill commands move the string killed into a kill ring.
|
Binding
|
elisp
|
Action
|
|
C-d
|
delete-char
|
Delete char (not into kill ring)
|
|
DEL
|
delete-backward-char
|
Delete previous char (not into kill ring)
|
|
|
|
|
|
M-d
|
kill-word
|
Delete next word into kill ring
|
|
M-DEL
|
backward-kill-word
|
Delete previous word
|
|
C-k
|
kill-line
|
Delete from cursor to eol
|
|
M-k
|
kill-sentence
|
Delete next sentence
|
|
C-x DEL
|
backward-kill-sentence
|
Delete prev sentence
|
|
C-w
|
kill-region
|
Delete a region (if marked)
|
|
M-w
|
kill-ring-save
|
Copy region to kill ring
|
|
|
kill-paragraph
|
Delete next paragraph
|
|
|
backward-kill-paragraph
|
Delete previous paragraph
|
|
|
|
|
|
C-y
|
yank
|
copy from kill ring to point
|
|
M-y
|
yank-pop
|
delete from kill ring to point
|
For the 2 commands where there is no binding you have to use M-x then type the elisp command into the minibuffer.
9.3 Marks & Regions
You can place a single mark in a buffer using the binding: C-@ (or C-SPACE). When you navigate elsewhere, the area between your current cursor and the mark is a region. To apply commands to the region you use the binding C-w to delete or M-w to save to the kill ring. Subsequent C-y will paste (yank) to the current cursor. To check the region (if your version of emacs does not mark it on the screen, use C-x C-x to jump back and forth (elisp: exchange-mark-and-point).
With the mouse, left click and drag to mark a region.
|
Binding
|
elisp
|
Action
|
|
C-@
|
set-mark-command
|
Mark boundary of region
|
|
M-@
|
mark-word
|
Set mark after next word
|
|
C-x C-x
|
exchange-point-and-mark
|
Exchange location of cursor and mark
|
|
C-x u
|
undo
|
|
|
M-h
|
mark-paragraph
|
Set mark at eop, cursor at bop
|
|
C-x h
|
mark-whole-buffer
|
Set mark at eob, cursor at bob
|
|
C-x C-p
|
mark-page
|
|
|
|
|
|
|
C-w
|
kill-region
|
Delete marked region into kill ring
|
|
M-w
|
kill-ring-save
|
Copy maked region into kill ring
|
|
M-! cmd RET
|
shell-command
|
Run shell cmd (no input)
|
|
M-1 M-! cmd RET
|
shell-command
|
As above inserting output at point
|
|
M-| cmd RET
|
shell-command-on-region
|
pipe region to shell cmd
|
|
M-1 M-| cmd RET
|
shell-command-on-region
|
As above replacing region with output
|
|
|
|
|
9.4 Searches
Whereas vi has the / n . sequence for search and replace, Emacs has different kind of searches, each with its own bindings.
-
You can search forward from the cursor with C-s
-
You can search backward from the cursoe with C-r
-
You can search for next instance of the word under the cursor with C-w
-
Searches can be Simple or Incrementable. An incrementable search starts searching immediately as you type successive letters of the search string. A simple search waits until the string is complete.
-
Simple search: C-s RET string RET (or C-r RET string RET for reverse)
-
Incremental search: C-s string RET (or C-r string RET for reverse)
-
Regexp search: As any above but use C-M-s or C-M-r instead of C-s or C-r, and C-M-% instead of M-%
-
In all of the above C-s (or C-r) will repeat the search for the next instance of the search string.
-
Query Replace loop: Enters a loop finding successive instances and letting you decide whether to replace. Syntax is
M-% searchstring RET replacement RET -% instead of M-%
9.5 Query-Replace loop
M-% string RET replacement RET: puts you into a search loop, stopping at next instance each time. Within the loop you are prompted for the action you want or you can leave the loop for some other action with C-r ... C-M-c which returns you to the loop.
Within the loop:
|
Char
|
Action
|
|
y
|
Yes, replace
|
|
n
|
No skip to next instance
|
|
.
|
Replace and exit loop
|
|
,
|
Replace and stay (until I hit y)
|
|
!
|
Replace all the rest and don’t ask
|
|
C-r
|
Create a subsession for other emacs commands. Return to query loop using C-M-c
|
|
q
|
Exit loop
|
You can use SPACE, DEL, and RETURN respectively for y, n, and q inside the query loop.