1 ;;; ws-mode.el --- WordStar emulation mode for GNU Emacs
3 ;; Author: Juergen Nickelsen <nickel@cs.tu-berlin.de>
4 ;; Created: 13 Feb 1991
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.
26 ;; How to install ws-mode.el:
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).
36 ;; put ws-mode.el into your directory $HOME/lib/emacs (or something
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
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)
58 (defun wordstar-mode ()
59 "Major mode with WordStar-like key bindings.
62 - Help menus with WordStar commands (C-j just calls help-for-help)
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
81 C-i indent-for-tab-command
94 C-y kill-complete-line
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
109 C-k d save-buffers-kill-emacs
111 C-k h ws-show-markers
112 C-k i ws-indent-block
117 C-k s save-some-buffers
119 C-k u ws-exdent-block
120 C-k C-u keyboard-quit
124 C-k y ws-delete-block
127 C-o b switch-to-buffer
128 C-o j justify-current-line
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
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
154 C-q k ws-to-block-end
156 C-q p ws-last-cursorp
157 C-q r beginning-of-buffer
158 C-q C-u keyboard-quit
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
)
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
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
)
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."
328 (or (bolp) (newline 1))
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."
339 (setq to from from tem
)))
342 (narrow-to-region from to
)
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'."
356 (delete-horizontal-space)
358 (delete-horizontal-space)
359 (setq line-length
(current-column))
363 (/ (- fill-column left-margin line-length
) 2))))))
365 (defun scroll-down-line ()
366 "Scroll one line down."
370 (defun scroll-up-line ()
371 "Scroll one line up."
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.")
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
)
411 (defun ws-set-marker-0 ()
412 "In WordStar mode: Set marker 0 to current cursor position."
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."
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."
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."
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."
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."
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."
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."
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."
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."
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."
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."
480 (if (or ws-block-begin-marker ws-block-end-marker
)
482 (if ws-block-begin-marker
484 (goto-char ws-block-begin-marker
)
485 (message "Block begin marker")
487 (message "Block begin marker not set")
489 (if ws-block-end-marker
491 (goto-char ws-block-end-marker
)
492 (message "Block end marker")
494 (message "Block end marker not set"))
496 (message "Block markers not set")))
499 (defun ws-indent-block ()
500 "In WordStar mode: Indent block (not yet implemeted)."
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."
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."
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."
526 (defun ws-exdent-block ()
527 "I don't know what this (C-k u) should do."
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."
534 (if (and ws-block-begin-marker ws-block-end-marker
)
536 (kill-region ws-block-begin-marker ws-block-end-marker
'silent
)
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."
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."
561 (if (and ws-block-begin-marker ws-block-end-marker
)
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."
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."
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."
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."
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."
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."
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."
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."
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."
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."
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."
663 (if ws-block-begin-marker
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)")
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."
690 (if ws-block-end-marker
692 (setq ws-last-cursorposition
(point-marker))
693 (goto-char ws-block-end-marker
))
694 (ws-error "Block end marker not set")))
697 "In WordStar mode: Undo and give message about undoing more changes."
700 (message "Repeat C-q l to undo more changes."))
702 (defun ws-goto-last-cursorposition ()
705 (if ws-last-cursorposition
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."
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)."
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)."
732 (kill-region (point) p
)))
734 (defun kill-complete-line ()
735 "Kill the complete line."
738 (if (eobp) (error "End of buffer"))
741 (kill-region beg
(point))))
743 (defun ws-repeat-search ()
744 "In WordStar mode: Repeat last search."
746 (setq ws-last-cursorposition
(point-marker))
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:
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."
765 (if (and ws-block-begin-marker ws-block-end-marker
)
767 (copy-region-as-kill ws-block-begin-marker ws-block-end-marker
)
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