*** empty log message ***
[emacs.git] / lisp / emulation / ws-mode.el
blob2dd39df74b7289c2e8ab82cf0b39cc2af117fc79
1 ;;; ws-mode.el --- WordStar emulation mode for GNU Emacs
3 ;; Author: Juergen Nickelsen <nickel@cs.tu-berlin.de>
4 ;; Created: 13 Feb 1991
5 ;; Version: 0.7
7 ;; Copyright (C) 1991 Free Software Foundation, Inc.
9 ;; This file is distributed in the hope that it will be useful,
10 ;; but WITHOUT ANY WARRANTY. No author or distributor
11 ;; accepts responsibility to anyone for the consequences of using it
12 ;; or for whether it serves any particular purpose or works at all,
13 ;; unless he says so in writing. Refer to the GNU Emacs General Public
14 ;; License for full details.
16 ;; Everyone is granted permission to copy, modify and redistribute
17 ;; this file, but only under the conditions described in the
18 ;; GNU Emacs General Public License. A copy of this license is
19 ;; supposed to have been given to you along with GNU Emacs so you
20 ;; can know your rights and responsibilities. It should be in a
21 ;; file named COPYING. Among other things, the copyright notice
22 ;; and this notice must be preserved on all copies.
24 ;;; Commentary:
26 ;; How to install ws-mode.el:
28 ;; either you
29 ;; put the following line into your default.el (usually
30 ;; /usr/local/emacs/lisp/default.el):
31 ;; (autoload 'wordstar-mode "ws-mode.el" "WordStar emulation mode." t)
32 ;; put ws-mode.el into a directory in your Emacs load-path (usually
33 ;; /usr/local/emacs/local/lisp).
35 ;; or you
36 ;; put ws-mode.el into your directory $HOME/lib/emacs (or something
37 ;; like that)
38 ;; put the following two lines into your file $HOME/.emacs
39 ;; (autoload 'wordstar-mode (expand-file-name "~/lib/emacs/ws-mode.el")
40 ;; "WordStar emulation mode." t)
42 ;; You can then invoke wordstar-mode for a buffer by typing
43 ;; M-x wordstar-mode
45 ;; If you want to use Emacs in wordstar-mode by default, put the
46 ;; following line in addition into your file $HOME/.emacs :
47 ;; (setq default-major-mode 'wordstar-mode)
49 ;; If you want to use Emacs *always* in wordstar-mode, even when the
50 ;; file type would indicate another mode, put the follwoing line in
51 ;; addition into your file $HOME/.emacs :
52 ;; (setq auto-mode-alist nil)
54 ;; Enjoy!
56 ;;; Code:
58 (defun wordstar-mode ()
59 "Major mode with WordStar-like key bindings.
61 BUGS:
62 - Help menus with WordStar commands (C-j just calls help-for-help)
63 are not implemented
64 - Options for search and replace
65 - Show markers (C-k h) is somewhat strange
66 - Search and replace (C-q a) is only available in forward direction
68 No key bindings beginning with ESC are installed, they will work
69 Emacs-like.
71 The key bindings are:
73 C-a backward-word
74 C-b fill-paragraph
75 C-c scroll-up-line
76 C-d forward-char
77 C-e previous-line
78 C-f forward-word
79 C-g delete-char
80 C-h backward-char
81 C-i indent-for-tab-command
82 C-j help-for-help
83 C-k ordstar-C-k-map
84 C-l ws-repeat-search
85 C-n open-line
86 C-p quoted-insert
87 C-r scroll-down-line
88 C-s backward-char
89 C-t kill-word
90 C-u keyboard-quit
91 C-v overwrite-mode
92 C-w scroll-down
93 C-x next-line
94 C-y kill-complete-line
95 C-z scroll-up
97 C-k 0 ws-set-marker-0
98 C-k 1 ws-set-marker-1
99 C-k 2 ws-set-marker-2
100 C-k 3 ws-set-marker-3
101 C-k 4 ws-set-marker-4
102 C-k 5 ws-set-marker-5
103 C-k 6 ws-set-marker-6
104 C-k 7 ws-set-marker-7
105 C-k 8 ws-set-marker-8
106 C-k 9 ws-set-marker-9
107 C-k b ws-begin-block
108 C-k c ws-copy-block
109 C-k d save-buffers-kill-emacs
110 C-k f find-file
111 C-k h ws-show-markers
112 C-k i ws-indent-block
113 C-k k ws-end-block
114 C-k p ws-print-block
115 C-k q kill-emacs
116 C-k r insert-file
117 C-k s save-some-buffers
118 C-k t ws-mark-word
119 C-k u ws-exdent-block
120 C-k C-u keyboard-quit
121 C-k v ws-move-block
122 C-k w ws-write-block
123 C-k x kill-emacs
124 C-k y ws-delete-block
126 C-o c center-line
127 C-o b switch-to-buffer
128 C-o j justify-current-line
129 C-o k kill-buffer
130 C-o l list-buffers
131 C-o m auto-fill-mode
132 C-o r set-fill-column
133 C-o C-u keyboard-quit
134 C-o wd delete-other-windows
135 C-o wh split-window-horizontally
136 C-o wo other-window
137 C-o wv split-window-vertically
139 C-q 0 ws-find-marker-0
140 C-q 1 ws-find-marker-1
141 C-q 2 ws-find-marker-2
142 C-q 3 ws-find-marker-3
143 C-q 4 ws-find-marker-4
144 C-q 5 ws-find-marker-5
145 C-q 6 ws-find-marker-6
146 C-q 7 ws-find-marker-7
147 C-q 8 ws-find-marker-8
148 C-q 9 ws-find-marker-9
149 C-q a ws-query-replace
150 C-q b ws-to-block-begin
151 C-q c end-of-buffer
152 C-q d end-of-line
153 C-q f ws-search
154 C-q k ws-to-block-end
155 C-q l ws-undo
156 C-q p ws-last-cursorp
157 C-q r beginning-of-buffer
158 C-q C-u keyboard-quit
159 C-q w ws-last-error
160 C-q y ws-kill-eol
161 C-q DEL ws-kill-bol
163 (interactive)
164 (kill-all-local-variables)
165 (use-local-map wordstar-mode-map)
166 (setq mode-name "WordStar")
167 (setq major-mode 'wordstar-mode))
169 (defvar wordstar-mode-map nil "")
170 (defvar wordstar-C-j-map nil "")
171 (defvar wordstar-C-k-map nil "")
172 (defvar wordstar-C-o-map nil "")
173 (defvar wordstar-C-q-map nil "")
175 (if wordstar-mode-map
177 (setq wordstar-mode-map (make-keymap))
178 ;; (setq wordstar-C-j-map (make-keymap)) ; later, perhaps
179 (setq wordstar-C-k-map (make-keymap))
180 (setq wordstar-C-o-map (make-keymap))
181 (setq wordstar-C-q-map (make-keymap))
183 (define-key wordstar-mode-map "\C-a" 'backward-word)
184 (define-key wordstar-mode-map "\C-b" 'fill-paragraph)
185 (define-key wordstar-mode-map "\C-c" 'scroll-up)
186 (define-key wordstar-mode-map "\C-d" 'forward-char)
187 (define-key wordstar-mode-map "\C-e" 'previous-line)
188 (define-key wordstar-mode-map "\C-f" 'forward-word)
189 (define-key wordstar-mode-map "\C-g" 'delete-char)
190 (define-key wordstar-mode-map "\C-h" 'backward-char)
191 (define-key wordstar-mode-map "\C-i" 'indent-for-tab-command)
192 (define-key wordstar-mode-map "\C-j" 'help-for-help)
193 (define-key wordstar-mode-map "\C-k" wordstar-C-k-map)
194 (define-key wordstar-mode-map "\C-l" 'ws-repeat-search)
195 (define-key wordstar-mode-map "\C-n" 'open-line)
196 (define-key wordstar-mode-map "\C-o" wordstar-C-o-map)
197 (define-key wordstar-mode-map "\C-p" 'quoted-insert)
198 (define-key wordstar-mode-map "\C-q" wordstar-C-q-map)
199 (define-key wordstar-mode-map "\C-r" 'scroll-down)
200 (define-key wordstar-mode-map "\C-s" 'backward-char)
201 (define-key wordstar-mode-map "\C-t" 'kill-word)
202 (define-key wordstar-mode-map "\C-u" 'keyboard-quit)
203 (define-key wordstar-mode-map "\C-v" 'overwrite-mode)
204 (define-key wordstar-mode-map "\C-w" 'scroll-down-line)
205 (define-key wordstar-mode-map "\C-x" 'next-line)
206 (define-key wordstar-mode-map "\C-y" 'kill-complete-line)
207 (define-key wordstar-mode-map "\C-z" 'scroll-up-line)
209 ;; wordstar-C-k-map
211 (define-key wordstar-C-k-map " " ())
212 (define-key wordstar-C-k-map "0" 'ws-set-marker-0)
213 (define-key wordstar-C-k-map "1" 'ws-set-marker-1)
214 (define-key wordstar-C-k-map "2" 'ws-set-marker-2)
215 (define-key wordstar-C-k-map "3" 'ws-set-marker-3)
216 (define-key wordstar-C-k-map "4" 'ws-set-marker-4)
217 (define-key wordstar-C-k-map "5" 'ws-set-marker-5)
218 (define-key wordstar-C-k-map "6" 'ws-set-marker-6)
219 (define-key wordstar-C-k-map "7" 'ws-set-marker-7)
220 (define-key wordstar-C-k-map "8" 'ws-set-marker-8)
221 (define-key wordstar-C-k-map "9" 'ws-set-marker-9)
222 (define-key wordstar-C-k-map "b" 'ws-begin-block)
223 (define-key wordstar-C-k-map "\C-b" 'ws-begin-block)
224 (define-key wordstar-C-k-map "c" 'ws-copy-block)
225 (define-key wordstar-C-k-map "\C-c" 'ws-copy-block)
226 (define-key wordstar-C-k-map "d" 'save-buffers-kill-emacs)
227 (define-key wordstar-C-k-map "\C-d" 'save-buffers-kill-emacs)
228 (define-key wordstar-C-k-map "f" 'find-file)
229 (define-key wordstar-C-k-map "\C-f" 'find-file)
230 (define-key wordstar-C-k-map "h" 'ws-show-markers)
231 (define-key wordstar-C-k-map "\C-h" 'ws-show-markers)
232 (define-key wordstar-C-k-map "i" 'ws-indent-block)
233 (define-key wordstar-C-k-map "\C-i" 'ws-indent-block)
234 (define-key wordstar-C-k-map "k" 'ws-end-block)
235 (define-key wordstar-C-k-map "\C-k" 'ws-end-block)
236 (define-key wordstar-C-k-map "p" 'ws-print-block)
237 (define-key wordstar-C-k-map "\C-p" 'ws-print-block)
238 (define-key wordstar-C-k-map "q" 'kill-emacs)
239 (define-key wordstar-C-k-map "\C-q" 'kill-emacs)
240 (define-key wordstar-C-k-map "r" 'insert-file)
241 (define-key wordstar-C-k-map "\C-r" 'insert-file)
242 (define-key wordstar-C-k-map "s" 'save-some-buffers)
243 (define-key wordstar-C-k-map "\C-s" 'save-some-buffers)
244 (define-key wordstar-C-k-map "t" 'ws-mark-word)
245 (define-key wordstar-C-k-map "\C-t" 'ws-mark-word)
246 (define-key wordstar-C-k-map "u" 'ws-exdent-block)
247 (define-key wordstar-C-k-map "\C-u" 'keyboard-quit)
248 (define-key wordstar-C-k-map "v" 'ws-move-block)
249 (define-key wordstar-C-k-map "\C-v" 'ws-move-block)
250 (define-key wordstar-C-k-map "w" 'ws-write-block)
251 (define-key wordstar-C-k-map "\C-w" 'ws-write-block)
252 (define-key wordstar-C-k-map "x" 'save-buffers-kill-emacs)
253 (define-key wordstar-C-k-map "\C-x" 'save-buffers-kill-emacs)
254 (define-key wordstar-C-k-map "y" 'ws-delete-block)
255 (define-key wordstar-C-k-map "\C-y" 'ws-delete-block)
257 ;; wordstar-C-j-map not yet implemented
259 ;; wordstar-C-o-map
261 (define-key wordstar-C-o-map " " ())
262 (define-key wordstar-C-o-map "c" 'center-line)
263 (define-key wordstar-C-o-map "\C-c" 'center-line)
264 (define-key wordstar-C-o-map "b" 'switch-to-buffer)
265 (define-key wordstar-C-o-map "\C-b" 'switch-to-buffer)
266 (define-key wordstar-C-o-map "j" 'justify-current-line)
267 (define-key wordstar-C-o-map "\C-j" 'justify-current-line)
268 (define-key wordstar-C-o-map "k" 'kill-buffer)
269 (define-key wordstar-C-o-map "\C-k" 'kill-buffer)
270 (define-key wordstar-C-o-map "l" 'list-buffers)
271 (define-key wordstar-C-o-map "\C-l" 'list-buffers)
272 (define-key wordstar-C-o-map "m" 'auto-fill-mode)
273 (define-key wordstar-C-o-map "\C-m" 'auto-fill-mode)
274 (define-key wordstar-C-o-map "r" 'set-fill-column)
275 (define-key wordstar-C-o-map "\C-r" 'set-fill-column)
276 (define-key wordstar-C-o-map "\C-u" 'keyboard-quit)
277 (define-key wordstar-C-o-map "wd" 'delete-other-windows)
278 (define-key wordstar-C-o-map "wh" 'split-window-horizontally)
279 (define-key wordstar-C-o-map "wo" 'other-window)
280 (define-key wordstar-C-o-map "wv" 'split-window-vertically)
282 ;; wordstar-C-q-map
283 (define-key wordstar-C-q-map " " ())
284 (define-key wordstar-C-q-map "0" 'ws-find-marker-0)
285 (define-key wordstar-C-q-map "1" 'ws-find-marker-1)
286 (define-key wordstar-C-q-map "2" 'ws-find-marker-2)
287 (define-key wordstar-C-q-map "3" 'ws-find-marker-3)
288 (define-key wordstar-C-q-map "4" 'ws-find-marker-4)
289 (define-key wordstar-C-q-map "5" 'ws-find-marker-5)
290 (define-key wordstar-C-q-map "6" 'ws-find-marker-6)
291 (define-key wordstar-C-q-map "7" 'ws-find-marker-7)
292 (define-key wordstar-C-q-map "8" 'ws-find-marker-8)
293 (define-key wordstar-C-q-map "9" 'ws-find-marker-9)
294 (define-key wordstar-C-q-map "a" 'ws-query-replace)
295 (define-key wordstar-C-q-map "\C-a" 'ws-query-replace)
296 (define-key wordstar-C-q-map "b" 'ws-goto-block-begin)
297 (define-key wordstar-C-q-map "\C-b" 'ws-goto-block-begin)
298 (define-key wordstar-C-q-map "c" 'end-of-buffer)
299 (define-key wordstar-C-q-map "\C-c" 'end-of-buffer)
300 (define-key wordstar-C-q-map "d" 'end-of-line)
301 (define-key wordstar-C-q-map "\C-d" 'end-of-line)
302 (define-key wordstar-C-q-map "f" 'ws-search)
303 (define-key wordstar-C-q-map "\C-f" 'ws-search)
304 (define-key wordstar-C-q-map "k" 'ws-goto-block-end)
305 (define-key wordstar-C-q-map "\C-k" 'ws-goto-block-end)
306 (define-key wordstar-C-q-map "l" 'ws-undo)
307 (define-key wordstar-C-q-map "\C-l" 'ws-undo)
308 (define-key wordstar-C-q-map "p" 'ws-last-cursorp)
309 (define-key wordstar-C-q-map "\C-p" 'ws-last-cursorp)
310 (define-key wordstar-C-q-map "r" 'beginning-of-buffer)
311 (define-key wordstar-C-q-map "\C-r" 'beginning-of-buffer)
312 (define-key wordstar-C-q-map "s" 'beginning-of-line)
313 (define-key wordstar-C-q-map "\C-s" 'beginning-of-line)
314 (define-key wordstar-C-q-map "\C-u" 'keyboard-quit)
315 (define-key wordstar-C-q-map "w" 'ws-last-error)
316 (define-key wordstar-C-q-map "\C-w" 'ws-last-error)
317 (define-key wordstar-C-q-map "y" 'ws-kill-eol)
318 (define-key wordstar-C-q-map "\C-y" 'ws-kill-eol)
319 (define-key wordstar-C-q-map "\177" 'ws-kill-bol))
322 (defun center-paragraph ()
323 "Center each line in the paragraph at or after point.
324 See center-line for more info."
325 (interactive)
326 (save-excursion
327 (forward-paragraph)
328 (or (bolp) (newline 1))
329 (let ((end (point)))
330 (backward-paragraph)
331 (center-region (point) end))))
333 (defun center-region (from to)
334 "Center each line starting in the region.
335 See center-line for more info."
336 (interactive "r")
337 (if (> from to)
338 (let ((tem to))
339 (setq to from from tem)))
340 (save-excursion
341 (save-restriction
342 (narrow-to-region from to)
343 (goto-char from)
344 (while (not (eobp))
345 (center-line)
346 (forward-line 1)))))
348 (defun center-line ()
349 "Center the line point is on, within the width specified by `fill-column'.
350 This means adjusting the indentation to match
351 the distance between the end of the text and `fill-column'."
352 (interactive)
353 (save-excursion
354 (let (line-length)
355 (beginning-of-line)
356 (delete-horizontal-space)
357 (end-of-line)
358 (delete-horizontal-space)
359 (setq line-length (current-column))
360 (beginning-of-line)
361 (indent-to
362 (+ left-margin
363 (/ (- fill-column left-margin line-length) 2))))))
365 (defun scroll-down-line ()
366 "Scroll one line down."
367 (interactive)
368 (scroll-down 1))
370 (defun scroll-up-line ()
371 "Scroll one line up."
372 (interactive)
373 (scroll-up 1))
375 ;;;;;;;;;;;
376 ;; wordstar special variables:
378 (defvar ws-marker-0 nil "Position marker 0 in WordStar mode.")
379 (defvar ws-marker-1 nil "Position marker 1 in WordStar mode.")
380 (defvar ws-marker-2 nil "Position marker 2 in WordStar mode.")
381 (defvar ws-marker-3 nil "Position marker 3 in WordStar mode.")
382 (defvar ws-marker-4 nil "Position marker 4 in WordStar mode.")
383 (defvar ws-marker-5 nil "Position marker 5 in WordStar mode.")
384 (defvar ws-marker-6 nil "Position marker 6 in WordStar mode.")
385 (defvar ws-marker-7 nil "Position marker 7 in WordStar mode.")
386 (defvar ws-marker-8 nil "Position marker 8 in WordStar mode.")
387 (defvar ws-marker-9 nil "Position marker 9 in WordStar mode.")
389 (defvar ws-block-begin-marker nil "Beginning of \"Block\" in WordStar mode.")
390 (defvar ws-block-end-marker nil "End of \"Block\" in WordStar mode.")
392 (defvar ws-search-string nil "String of last search in WordStar mode.")
393 (defvar ws-search-direction t
394 "Direction of last search in WordStar mode. T if forward, NIL if backward.")
396 (defvar ws-last-cursorposition nil
397 "Position before last search etc. in WordStar mode.")
399 (defvar ws-last-errormessage nil
400 "Last error message issued by a WordStar mode function.")
402 ;;;;;;;;;;;
403 ;; wordstar special functions:
405 (defun ws-error (string)
406 "Report error of a WordStar special function. Error message is saved
407 in ws-last-errormessage for recovery with C-q w."
408 (setq ws-last-errormessage string)
409 (error string))
411 (defun ws-set-marker-0 ()
412 "In WordStar mode: Set marker 0 to current cursor position."
413 (interactive)
414 (setq ws-marker-0 (point-marker))
415 (message "Marker 0 set"))
417 (defun ws-set-marker-1 ()
418 "In WordStar mode: Set marker 1 to current cursor position."
419 (interactive)
420 (setq ws-marker-1 (point-marker))
421 (message "Marker 1 set"))
423 (defun ws-set-marker-2 ()
424 "In WordStar mode: Set marker 2 to current cursor position."
425 (interactive)
426 (setq ws-marker-2 (point-marker))
427 (message "Marker 2 set"))
429 (defun ws-set-marker-3 ()
430 "In WordStar mode: Set marker 3 to current cursor position."
431 (interactive)
432 (setq ws-marker-3 (point-marker))
433 (message "Marker 3 set"))
435 (defun ws-set-marker-4 ()
436 "In WordStar mode: Set marker 4 to current cursor position."
437 (interactive)
438 (setq ws-marker-4 (point-marker))
439 (message "Marker 4 set"))
441 (defun ws-set-marker-5 ()
442 "In WordStar mode: Set marker 5 to current cursor position."
443 (interactive)
444 (setq ws-marker-5 (point-marker))
445 (message "Marker 5 set"))
447 (defun ws-set-marker-6 ()
448 "In WordStar mode: Set marker 6 to current cursor position."
449 (interactive)
450 (setq ws-marker-6 (point-marker))
451 (message "Marker 6 set"))
453 (defun ws-set-marker-7 ()
454 "In WordStar mode: Set marker 7 to current cursor position."
455 (interactive)
456 (setq ws-marker-7 (point-marker))
457 (message "Marker 7 set"))
459 (defun ws-set-marker-8 ()
460 "In WordStar mode: Set marker 8 to current cursor position."
461 (interactive)
462 (setq ws-marker-8 (point-marker))
463 (message "Marker 8 set"))
465 (defun ws-set-marker-9 ()
466 "In WordStar mode: Set marker 9 to current cursor position."
467 (interactive)
468 (setq ws-marker-9 (point-marker))
469 (message "Marker 9 set"))
471 (defun ws-begin-block ()
472 "In WordStar mode: Set block begin marker to current cursor position."
473 (interactive)
474 (setq ws-block-begin-marker (point-marker))
475 (message "Block begin marker set"))
477 (defun ws-show-markers ()
478 "In WordStar mode: Show block markers."
479 (interactive)
480 (if (or ws-block-begin-marker ws-block-end-marker)
481 (save-excursion
482 (if ws-block-begin-marker
483 (let ()
484 (goto-char ws-block-begin-marker)
485 (message "Block begin marker")
486 (sit-for 2))
487 (message "Block begin marker not set")
488 (sit-for 2))
489 (if ws-block-end-marker
490 (let ()
491 (goto-char ws-block-end-marker)
492 (message "Block end marker")
493 (sit-for 2))
494 (message "Block end marker not set"))
495 (message ""))
496 (message "Block markers not set")))
499 (defun ws-indent-block ()
500 "In WordStar mode: Indent block (not yet implemeted)."
501 (interactive)
502 (ws-error "Indent block not yet implemented"))
504 (defun ws-end-block ()
505 "In WordStar mode: Set block end marker to current cursor position."
506 (interactive)
507 (setq ws-block-end-marker (point-marker))
508 (message "Block end marker set"))
510 (defun ws-print-block ()
511 "In WordStar mode: Print block."
512 (interactive)
513 (message "Don't do this. Write block to a file (C-k w) and print this file."))
515 (defun ws-mark-word ()
516 "In WordStar mode: Mark current word as block."
517 (interactive)
518 (save-excursion
519 (forward-word)
520 (sit-for 1)
521 (ws-end-block)
522 (backward-word)
523 (sit-for 1)
524 (ws-begin-block)))
526 (defun ws-exdent-block ()
527 "I don't know what this (C-k u) should do."
528 (interactive)
529 (ws-error "This won't be done -- not yet implemented."))
531 (defun ws-move-block ()
532 "In WordStar mode: Move block to current cursor position."
533 (interactive)
534 (if (and ws-block-begin-marker ws-block-end-marker)
535 (let ()
536 (kill-region ws-block-begin-marker ws-block-end-marker 'silent)
537 (yank)
538 (save-excursion
539 (goto-char (region-beginning))
540 (setq ws-block-begin-marker (point-marker))
541 (goto-char (region-end))
542 (setq ws-block-end-marker (point-marker))))
543 (ws-error (cond (ws-block-begin-marker "Block end marker not set")
544 (ws-block-end-marker "Block begin marker not set")
545 (t "Block markers not set")))))
547 (defun ws-write-block ()
548 "In WordStar mode: Write block to file."
549 (interactive)
550 (if (and ws-block-begin-marker ws-block-end-marker)
551 (let ((filename (read-file-name "Write block to file: ")))
552 (write-region ws-block-begin-marker ws-block-end-marker filename))
553 (ws-error (cond (ws-block-begin-marker "Block end marker not set")
554 (ws-block-end-marker "Block begin marker not set")
555 (t "Block markers not set")))))
558 (defun ws-delete-block ()
559 "In WordStar mode: Delete block."
560 (interactive)
561 (if (and ws-block-begin-marker ws-block-end-marker)
562 (let ()
563 (kill-region ws-block-begin-marker ws-block-end-marker)
564 (setq ws-block-end-marker nil)
565 (setq ws-block-begin-marker nil))
566 (ws-error (cond (ws-block-begin-marker "Block end marker not set")
567 (ws-block-end-marker "Block begin marker not set")
568 (t "Block markers not set")))))
570 (defun ws-find-marker-0 ()
571 "In WordStar mode: Go to marker 0."
572 (interactive)
573 (if ws-marker-0
574 (let ()
575 (setq ws-last-cursorposition (point-marker))
576 (goto-char ws-marker-0))
577 (ws-error "Marker 0 not set")))
579 (defun ws-find-marker-1 ()
580 "In WordStar mode: Go to marker 1."
581 (interactive)
582 (if ws-marker-1
583 (let ()
584 (setq ws-last-cursorposition (point-marker))
585 (goto-char ws-marker-1))
586 (ws-error "Marker 1 not set")))
588 (defun ws-find-marker-2 ()
589 "In WordStar mode: Go to marker 2."
590 (interactive)
591 (if ws-marker-2
592 (let ()
593 (setq ws-last-cursorposition (point-marker))
594 (goto-char ws-marker-2))
595 (ws-error "Marker 2 not set")))
597 (defun ws-find-marker-3 ()
598 "In WordStar mode: Go to marker 3."
599 (interactive)
600 (if ws-marker-3
601 (let ()
602 (setq ws-last-cursorposition (point-marker))
603 (goto-char ws-marker-3))
604 (ws-error "Marker 3 not set")))
606 (defun ws-find-marker-4 ()
607 "In WordStar mode: Go to marker 4."
608 (interactive)
609 (if ws-marker-4
610 (let ()
611 (setq ws-last-cursorposition (point-marker))
612 (goto-char ws-marker-4))
613 (ws-error "Marker 4 not set")))
615 (defun ws-find-marker-5 ()
616 "In WordStar mode: Go to marker 5."
617 (interactive)
618 (if ws-marker-5
619 (let ()
620 (setq ws-last-cursorposition (point-marker))
621 (goto-char ws-marker-5))
622 (ws-error "Marker 5 not set")))
624 (defun ws-find-marker-6 ()
625 "In WordStar mode: Go to marker 6."
626 (interactive)
627 (if ws-marker-6
628 (let ()
629 (setq ws-last-cursorposition (point-marker))
630 (goto-char ws-marker-6))
631 (ws-error "Marker 6 not set")))
633 (defun ws-find-marker-7 ()
634 "In WordStar mode: Go to marker 7."
635 (interactive)
636 (if ws-marker-7
637 (let ()
638 (setq ws-last-cursorposition (point-marker))
639 (goto-char ws-marker-7))
640 (ws-error "Marker 7 not set")))
642 (defun ws-find-marker-8 ()
643 "In WordStar mode: Go to marker 8."
644 (interactive)
645 (if ws-marker-8
646 (let ()
647 (setq ws-last-cursorposition (point-marker))
648 (goto-char ws-marker-8))
649 (ws-error "Marker 8 not set")))
651 (defun ws-find-marker-9 ()
652 "In WordStar mode: Go to marker 9."
653 (interactive)
654 (if ws-marker-9
655 (let ()
656 (setq ws-last-cursorposition (point-marker))
657 (goto-char ws-marker-9))
658 (ws-error "Marker 9 not set")))
660 (defun ws-goto-block-begin ()
661 "In WordStar mode: Go to block begin marker."
662 (interactive)
663 (if ws-block-begin-marker
664 (let ()
665 (setq ws-last-cursorposition (point-marker))
666 (goto-char ws-block-begin-marker))
667 (ws-error "Block begin marker not set")))
669 (defun ws-search (string)
670 "In WordStar mode: Search string, remember string for repetition."
671 (interactive "sSearch for: ")
672 (message "Forward (f) or backward (b)")
673 (let ((direction
674 (read-char)))
675 (cond ((equal (upcase direction) \070)
676 (setq ws-search-string string)
677 (setq ws-search-direction t)
678 (setq ws-last-cursorposition (point-marker))
679 (search-forward string))
680 ((equal (upcase direction) \066)
681 (setq ws-search-string string)
682 (setq ws-search-direction nil)
683 (setq ws-last-cursorposition (point-marker))
684 (search-backward string))
685 (t (keyboard-quit)))))
687 (defun ws-goto-block-end ()
688 "In WordStar mode: Go to block end marker."
689 (interactive)
690 (if ws-block-end-marker
691 (let ()
692 (setq ws-last-cursorposition (point-marker))
693 (goto-char ws-block-end-marker))
694 (ws-error "Block end marker not set")))
696 (defun ws-undo ()
697 "In WordStar mode: Undo and give message about undoing more changes."
698 (interactive)
699 (undo)
700 (message "Repeat C-q l to undo more changes."))
702 (defun ws-goto-last-cursorposition ()
703 "In WordStar mode: "
704 (interactive)
705 (if ws-last-cursorposition
706 (let ()
707 (setq ws-last-cursorposition (point-marker))
708 (goto-char ws-last-cursorposition))
709 (ws-error "No last cursor position available.")))
711 (defun ws-last-error ()
712 "In WordStar mode: repeat last error message.
713 This will only work for errors raised by WordStar mode functions."
714 (interactive)
715 (if ws-last-errormessage
716 (message ws-last-errormessage)
717 (message "No WordStar error yet.")))
719 (defun ws-kill-eol ()
720 "In WordStar mode: Kill to end of line (like WordStar, not like Emacs)."
721 (interactive)
722 (let ((p (point)))
723 (end-of-line)
724 (kill-region p (point))))
726 (defun ws-kill-bol ()
727 "In WordStar mode: Kill to beginning of line
728 (like WordStar, not like Emacs)."
729 (interactive)
730 (let ((p (point)))
731 (beginning-of-line)
732 (kill-region (point) p)))
734 (defun kill-complete-line ()
735 "Kill the complete line."
736 (interactive)
737 (beginning-of-line)
738 (if (eobp) (error "End of buffer"))
739 (let ((beg (point)))
740 (forward-line 1)
741 (kill-region beg (point))))
743 (defun ws-repeat-search ()
744 "In WordStar mode: Repeat last search."
745 (interactive)
746 (setq ws-last-cursorposition (point-marker))
747 (if ws-search-string
748 (if ws-search-direction
749 (search-forward ws-search-string)
750 (search-backward ws-search-string))
751 (ws-error "No search to repeat")))
753 (defun ws-query-replace (from to)
754 "In WordStar mode: Search string, remember string for repetition."
755 (interactive "sReplace:
756 sWith: " )
757 (setq ws-search-string from)
758 (setq ws-search-direction t)
759 (setq ws-last-cursorposition (point-marker))
760 (query-replace from to))
762 (defun ws-copy-block ()
763 "In WordStar mode: Copy block to current cursor position."
764 (interactive)
765 (if (and ws-block-begin-marker ws-block-end-marker)
766 (let ()
767 (copy-region-as-kill ws-block-begin-marker ws-block-end-marker)
768 (yank)
769 (save-excursion
770 (goto-char (region-beginning))
771 (setq ws-block-begin-marker (point-marker))
772 (goto-char (region-end))
773 (setq ws-block-end-marker (point-marker))))
774 (ws-error (cond (ws-block-begin-marker "Block end marker not set")
775 (ws-block-end-marker "Block begin marker not set")
776 (t "Block markers not set")))))
778 ;;; ws-mode.el ends here