annotate lisp/mule/visual-mode.el @ 143:50e7fedfe353

Added tag r20-2b5 for changeset 1856695b1fa9
author cvs
date Mon, 13 Aug 2007 09:33:20 +0200
parents 6608ceec7cf8
children 5a88923fcbfe
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1 ;; visual.el -- cursor motion, insertion, deletion, etc. in visual order
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
2 ;; Copyright (C) 1992 Free Software Foundation, Inc.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
3
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
4 ;; This file is part of XEmacs.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
5
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
6 ;; XEmacs is free software; you can redistribute it and/or modify it
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
7 ;; under the terms of the GNU General Public License as published by
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
8 ;; the Free Software Foundation; either version 2, or (at your option)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
9 ;; any later version.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
10
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
11 ;; XEmacs is distributed in the hope that it will be useful, but
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
12 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
13 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
14 ;; General Public License for more details.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
15
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
16 ;; You should have received a copy of the GNU General Public License
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
17 ;; along with XEmacs; see the file COPYING. If not, write to the
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
18 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
19 ;; Boston, MA 02111-1307, USA.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
20
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
21 ;;; 94.5.15 created for Mule Ver.1.1 by Takahashi N. <ntakahas@etl.go.jp>
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
22
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
23 ;;;###autoload
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
24 (defvar visual-mode nil "non-nil if in visual-mode.")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
25
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
26 (make-variable-buffer-local 'visual-mode)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
27
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
28 (defvar visual-use-lr-commands nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
29 "If non-nil, use visual-left-* and visual-right-* commands instead of
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
30 visual-forward-* and visual-backward-* commands.")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
31
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
32 (defvar visual-mode-map
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
33 (let ((map (make-keymap)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
34 (substitute-key-definition 'self-insert-command
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
35 'visual-self-insert-command
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
36 map global-map)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
37 ; visual basic commands
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
38 (define-key map [(control d)] 'visual-delete-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
39 (define-key map [(control k)] 'visual-kill-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
40 (define-key map [(control m)] 'visual-newline)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
41 (define-key map [(control o)] 'visual-open-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
42 (define-key map [(control p)] 'visual-previous-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
43 (define-key map [(control w)] 'visual-kill-region)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
44 (define-key map [(control y)] 'visual-yank)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
45 (define-key map [delete] 'visual-backward-delete-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
46 (define-key map [(meta <)] 'visual-beginning-of-buffer)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
47 (define-key map [(meta >)] 'visual-end-of-buffer)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
48 (define-key map [(meta d)] 'visual-kill-word)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
49 (define-key map [(meta w)] 'visual-kill-ring-save)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
50 (define-key map [(meta y)] 'visual-yank-pop)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
51 (define-key map [(meta delete)] 'visual-backward-kill-word)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
52 (define-key map [up] 'visual-previous-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
53 (define-key map [down] 'visual-next-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
54 (define-key map [home] 'visual-beginning-of-buffer)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
55 (define-key map [end] 'visual-end-of-buffer)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
56 (define-key map [left] 'visual-move-to-left-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
57 (define-key map [right] 'visual-move-to-right-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
58 (define-key map [(meta left)] 'visual-move-to-left-word)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
59 (define-key map [(meta right)] 'visual-move-to-right-word)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
60 (define-key map [(control c) (control c)] 'exit-visual-mode)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
61 (define-key map [(control c) <] 'l2r-mode)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
62 (define-key map [(control c) >] 'r2l-mode)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
63 ; LR commands
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
64 (if visual-use-lr-commands
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
65 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
66 (define-key map [(control a)] 'visual-left-end-of-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
67 (define-key map [(control b)] 'visual-move-to-left-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
68 (define-key map [(control e)] 'visual-right-end-of-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
69 (define-key map [(control f)] 'visual-move-to-right-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
70 (define-key map [(meta b)] 'visual-move-to-left-word)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
71 (define-key map [(meta f)] 'visual-move-to-right-word))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
72 (define-key map [(control a)] 'visual-beginning-of-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
73 (define-key map [(control b)] 'visual-backward-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
74 (define-key map [(control e)] 'visual-end-of-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
75 (define-key map [(control f)] 'visual-forward-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
76 (define-key map [(meta b)] 'visual-backward-word)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
77 (define-key map [(meta f)] 'visual-forward-word))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
78 map)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
79 "minor-mode-keymap for visual-mode.")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
80
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
81 (if (not (assq 'visual-mode minor-mode-map-alist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
82 (setq minor-mode-map-alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
83 (cons (cons 'visual-mode visual-mode-map)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
84 minor-mode-map-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
85
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
86 (defvar visual-mode-indicator nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
87 "string displayed in mode line. \" l2r\" or \" r2l\".")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
88 (make-variable-buffer-local 'visual-mode-indicator)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
89
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
90 (if (not (assq 'visual-mode minor-mode-alist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
91 (setq minor-mode-alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
92 (cons '(visual-mode visual-mode-indicator)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
93 minor-mode-alist)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
94
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
95 (setq auto-mode-alist
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
96 (append '(("\\.l2r$" . l2r-mode) ("\\.r2l$" . r2l-mode))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
97 auto-mode-alist))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
98
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
99 (defvar visual-mode-hooks nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
100
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
101 ;;;###autoload
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
102 (defun visual-mode (&optional arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
103 "Toggle visual-mode. With ARG, turn visual-mode on iff ARG is positive."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
104 (interactive "P")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
105 (if (null arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
106 (if visual-mode (exit-visual-mode) (enter-visual-mode))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
107 (if (> (prefix-numeric-value arg) 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
108 (enter-visual-mode)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
109 (exit-visual-mode))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
110
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
111 (defun enter-visual-mode nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
112 "Enter visual-mode. Cursor moves in visual order."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
113 (interactive)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
114 (if (not visual-mode)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
115 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
116 (setq visual-mode t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
117 visual-mode-indicator (if display-direction " r2l" " l2r"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
118 (redraw-display)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
119 (run-hooks 'visual-mode-hooks))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
120
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
121 (defun exit-visual-mode nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
122 "Exit visual-mode. Cursor moves in logical order."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
123 (interactive)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
124 (if visual-mode
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
125 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
126 (setq visual-mode nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
127 (redraw-modeline t))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
128
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
129 (defun l2r-mode nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
130 "Set display-direction left to right."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
131 (interactive)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
132 (if (not visual-mode)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
133 (enter-visual-mode))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
134 (setq display-direction nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
135 (setq visual-mode-indicator " l2r")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
136 (redraw-display))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
137
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
138 (defun r2l-mode nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
139 "Set display-direction right to left."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
140 (interactive)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
141 (if (not visual-mode)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
142 (enter-visual-mode))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
143 (setq display-direction t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
144 (setq visual-mode-indicator " r2l")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
145 (redraw-display))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
146
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
147
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
148 ;; cursor motion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
149
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
150 (defun visual-forward-char (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
151 "Move the cursor visually forward by ARG (integer) characters.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
152 if ARG is negative, move backward."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
153 (interactive "p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
154 (if (< arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
155 (while (< arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
156 (visual-backward-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
157 (setq arg (1+ arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
158 (while (> arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
159 (visual-forward-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
160 (setq arg (1- arg)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
161
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
162 (defun visual-forward-1-char nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
163 "Move the cursor visually forward by 1 character."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
164 (let ((r-dir (if display-direction 0 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
165 (a-dir (visual-char-direction-after-point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
166 (aa-dir (visual-char-direction-after-after-point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
167 (b-dir (visual-char-direction-before-point)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
168
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
169 ; symbols used in the following comments
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
170 ; ^ : point in here
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
171 ; ~ : point will be there
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
172 ; d : character whose direction is the same as display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
173 ; r : character whose direction is opposite to display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
174 ; !d : r or nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
175 ; !r : d or nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
176 ; r* : 0 or more r's
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
177 ; d* : 0 or more d's
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
178
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
179 (cond
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
180 ((null a-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
181 ; ... nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
182 ; ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
183 (error "end of buffer"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
184
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
185 ((eq a-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
186 (if (eq b-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
187
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
188 ; ... r r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
189 ; ~ ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
190 (backward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
191
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
192 ; ... !r r r* ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
193 ; ^ ~
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
194 (skip-direction-forward r-dir)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
195
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
196 ((eq aa-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
197 ; ... d r* r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
198 ; ^ ~
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
199 (forward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
200 (skip-direction-forward r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
201 (backward-char 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
202
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
203 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
204 ; ... d !r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
205 ; ^ ~
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
206 (forward-char 1)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
207
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
208 (defun visual-backward-char (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
209 "Move the cursor visually backward by ARG (integer) characters.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
210 if ARG is negative, move forward."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
211 (interactive "p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
212 (if (< arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
213 (while (< arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
214 (visual-forward-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
215 (setq arg (1+ arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
216 (while (> arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
217 (visual-backward-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
218 (setq arg (1- arg)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
219
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
220 (defun visual-backward-1-char nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
221 "Move the cursor visually backward by 1 character."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
222 (let ((r-dir (if display-direction 0 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
223 (a-dir (visual-char-direction-after-point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
224 (aa-dir (visual-char-direction-after-after-point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
225 (b-dir (visual-char-direction-before-point)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
226
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
227 ; symbols used in the following comments
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
228 ; ^ : point in here
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
229 ; ~ : point will be there
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
230 ; d : character whose direction is the same as display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
231 ; r : character whose direction is opposite to display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
232 ; !d : r or nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
233 ; !r : d or nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
234 ; r* : 0 or more r's
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
235 ; d* : 0 or more d's
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
236
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
237 (cond
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
238 ((eq a-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
239 (if (eq aa-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
240 ; ... r r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
241 ; ^ ~
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
242 (forward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
243
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
244 ; ... !r r* !r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
245 ; ~ ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
246 (skip-direction-backward r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
247 (if (visual-char-direction-before-point)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
248 (backward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
249 (skip-direction-forward r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
250 (backward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
251 (error "beginning of buffer"))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
252
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
253 ((null b-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
254 ; nil !r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
255 ; ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
256 (error "beginning of buffer"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
257
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
258 ((eq b-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
259 ; ... r* r !r
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
260 ; ~ ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
261 (skip-direction-backward r-dir))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
262
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
263 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
264 ; ... d !r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
265 ; ~ ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
266 (backward-char 1)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
267
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
268 (defun visual-char-direction (ch)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
269 "Return the direction of CH (character).
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
270 Newline's direction will be same as display-direction."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
271 (cond
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
272 ((null ch) nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
273 ((= ch ?\n) (if display-direction 1 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
274 (t (char-direction ch))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
275
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
276 (defun visual-char-direction-after-point nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
277 "Return the direction of after-point-character.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
278 0: left-to-right, 1: right-to-left"
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
279 (visual-char-direction (char-after (point))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
280
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
281 (defun visual-char-direction-after-after-point nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
282 "Return the direction of after-after-point-character.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
283 0: left-to-right, 1: right-to-left"
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
284 (if (= (point) (point-max))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
285 nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
286 (save-excursion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
287 (forward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
288 (visual-char-direction (char-after (point))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
289
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
290 (defun visual-char-direction-before-point nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
291 "Return the direction of before-point-character.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
292 0: left-to-right, 1: right-to-left"
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
293 (visual-char-direction (char-before (point))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
294
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
295 (defun skip-direction-forward (dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
296 "Move point forward as long as DIR-direction characters continue."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
297 (while (eq (visual-char-direction-after-point) dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
298 (forward-char 1)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
299
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
300 (defun skip-direction-backward (dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
301 "Move point backward as long as DIR-direction characters continue."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
302 (while (eq (visual-char-direction-before-point) dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
303 (backward-char 1)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
304
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
305 (defvar *visual-punctuations*
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
306 '(? ?. ?, ?: ?; ?? ?! ?- ?_ ?' ?\" ?/ ?( ?) ?[ ?] ?{ ?} ?\n ?\t ; ASCII
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
307 ? ?. ?, ?: ?; ?? ?! ?- ?_ ?' ?" ?( ?) ?[ ?] ; Hebrew
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 108
diff changeset
308 ?›2](3!›0](B ?›2](3&›0](B ?›2](3%›0](B ?›2](3)›0](B ?›2](3"›0](B ?›2](3'›0](B ?›2](3(›0](B ?›2](3#›0](B ?›2](3$›0](B ?›2](3*›0](B ?›2](3+›0](B )) ; Arabic
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
309
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
310 (defun visual-forward-word (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
311 "Move the cursor visually forward by ARG (integer) words.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
312 If ARG is negative, move the cursor backward."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
313 (interactive "p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
314 (if (< arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
315 (while (< arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
316 (visual-backward-1-word)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
317 (setq arg (1+ arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
318 (while (> arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
319 (visual-forward-1-word)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
320 (setq arg (1- arg)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
321
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
322 (defun visual-backward-word (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
323 "Move the cursor visually backward by ARG (integer) words.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
324 If ARG is negative, move the cursor forward."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
325 (interactive "p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
326 (if (< arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
327 (while (< arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
328 (visual-forward-1-word)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
329 (setq arg (1+ arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
330 (while (> arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
331 (visual-backward-1-word)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
332 (setq arg (1- arg)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
333
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
334 (defun visual-forward-1-word nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
335 "Move the cursor visually forward by one word."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
336 (while (memq (visual-char-after) *visual-punctuations*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
337 (visual-forward-1-char))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
338 (while (not (memq (visual-char-after) *visual-punctuations*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
339 (visual-forward-1-char)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
340
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
341 (defun visual-backward-1-word nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
342 "Move the cursor visually backward by one word."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
343 (while (memq (visual-char-before) *visual-punctuations*)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
344 (visual-backward-1-char))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
345 (while (not (memq (visual-char-before) *visual-punctuations*))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
346 (visual-backward-1-char)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
347
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
348 (defun visual-char-before nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
349 "Return the character visually before the cursor.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
350 If such position is out of range, returns nil."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
351 ; almost same as visual-backward-1-char
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
352 (save-excursion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
353 (let ((r-dir (if display-direction 0 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
354 (a-dir (visual-char-direction-after-point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
355 (aa-dir (visual-char-direction-after-after-point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
356 (b-dir (visual-char-direction-before-point)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
357 (cond
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
358 ((eq a-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
359 (if (eq aa-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
360 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
361 (forward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
362 (char-after (point)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
363 (skip-direction-backward r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
364 (if (visual-char-direction-before-point)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
365 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
366 (backward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
367 (char-after (point)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
368 nil)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
369 ((null b-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
370 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
371 ((eq b-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
372 (skip-direction-backward r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
373 (char-after (point)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
374 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
375 (backward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
376 (char-after (point)))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
377
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
378 (defun visual-char-after nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
379 "Return the character under the cursor.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
380 If such position is out of range, returns nil."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
381 (char-after (point)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
382
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
383 (defun visual-beginning-of-line (&optional arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
384 "Move the cursor to the visual beginning of line.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
385 With ARG not nil, move forward ARG - 1 lines first.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
386 If scan reaches end of buffer, stop there without error."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
387 (interactive "P")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
388 (beginning-of-line arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
389 (let ((a-dir (visual-char-direction-after-point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
390 (d-dir (if display-direction 1 0)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
391 (if (and a-dir (/= a-dir d-dir))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
392 (progn (skip-direction-forward a-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
393 (backward-char 1)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
394
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
395 (fset 'visual-end-of-line 'end-of-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
396
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
397 (defun visual-beginning-of-buffer nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
398 "Move the cursor to the visual beginning of current buffer."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
399 (interactive)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
400 (beginning-of-buffer)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
401 (visual-beginning-of-line))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
402
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
403 (fset 'visual-end-of-buffer 'end-of-buffer)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
404
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
405 (defvar visual-temporary-goal-column 0
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
406 "temporary-goal-column command for visual-mode.")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
407
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
408 (defun visual-next-line (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
409 "next-line command for visual-mode."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
410 (interactive "p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
411 (if (and (not (eq last-command 'visual-next-line))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
412 (not (eq last-command 'visual-previous-line)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
413 (setq visual-temporary-goal-column (visual-current-column)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
414 (next-line arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
415 (visual-goto-column visual-temporary-goal-column))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
416
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
417 (defun visual-previous-line (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
418 "previous-line command for visual-mode."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
419 (interactive "p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
420 (if (and (not (eq last-command 'visual-next-line))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
421 (not (eq last-command 'visual-previous-line)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
422 (setq visual-temporary-goal-column (visual-current-column)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
423 (previous-line arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
424 (visual-goto-column visual-temporary-goal-column))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
425
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
426 (defun visual-current-column nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
427 "Return the current column counted in visual order."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
428 (let ((c 0) (p (point)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
429 (visual-beginning-of-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
430 (while (/= (point) p)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
431 (setq c (+ c (char-width (visual-char-after))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
432 (visual-forward-1-char))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
433 c))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
434
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
435 (defun visual-goto-column (col)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
436 "Move the cursor to visual column N (integer) in the current line.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
437 If it is impossible to go to column N, the cursor is put on the nearest column
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
438 M (M < N). Returns N - M."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
439 (if (< col 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
440 (error "argument must be positive."))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
441 (let ((c 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
442 (visual-beginning-of-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
443 (while (and (< c col) (not (eolp)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
444 (setq c (+ c (char-width (visual-char-after))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
445 (visual-forward-1-char))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
446 (if (> c col)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
447 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
448 (visual-backward-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
449 (setq c (- c (char-width (visual-char-after))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
450 (- col c)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
451
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
452
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
453 ;; insertion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
454
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
455 (defun visual-insert-char (ch arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
456 "Insert character CH visually before the cursor.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
457 With ARG (integer) insert that many characters."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
458 (if (< arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
459 (error "arg must be >= 0."))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
460 (while (> arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
461 (visual-insert-1-char ch)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
462 (setq arg (1- arg))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
463
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
464 (defun visual-insert-1-char (ch)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
465 "Insert character CH visually before the cursor.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
466 The cursor moves visually forward."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
467 (let ((c-dir (visual-char-direction ch))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
468 (r-dir (if display-direction 0 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
469 (a-dir (visual-char-direction-after-point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
470 (tmp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
471
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
472 ; symbols used in the following comments
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
473 ; d : character whose direction is the same as display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
474 ; r : character whose direction is opposite to display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
475 ; !d : r or nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
476 ; !r : d or nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
477 ; ^d : point is here and the character to be inserted is d
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
478 ; ^r : point is here and the character to be inserted is d
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
479
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
480 (if (eq c-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
481 (if (eq a-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
482
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
483 ; ... r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
484 ; ^r
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
485 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
486 (forward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
487 (insert ch)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
488 (backward-char 2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
489
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
490 ; ... !r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
491 ; ^r
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
492 (skip-direction-backward c-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
493 (insert ch)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
494 (skip-direction-forward c-dir))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
495
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
496 (if (or (eq a-dir nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
497 (eq a-dir c-dir))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
498
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
499 ; ... !r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
500 ; ^d
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
501 (insert ch)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
502
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
503 ; ... r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
504 ; ^d
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
505 (forward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
506 (setq tmp (delete-direction-backward r-dir))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
507 (skip-direction-forward r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
508 (insert ch tmp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
509 (backward-char 1)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
510
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
511 (defun delete-direction-forward (dir)
108
360340f9fd5f Import from CVS: tag r20-1b6
cvs
parents: 70
diff changeset
512 "From current point, delete DIR-direction characters forward.
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
513 Returns the deleted string."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
514 (let ((p (point)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
515 (skip-direction-forward dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
516 (prog1
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
517 (buffer-substring (point) p)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
518 (delete-region (point) p))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
519
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
520 (defun delete-direction-backward (dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
521 "From current point, delete DIR-direction characters backward.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
522 Return the deleted string."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
523 (let ((p (point)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
524 (skip-direction-backward dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
525 (prog1
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
526 (buffer-substring (point) p)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
527 (delete-region (point) p))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
528
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
529 (defun visual-self-insert-command (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
530 "Insert this character (32 <= CH < 127).
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
531 With ARG (integer), insert that many characters.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
532 If display-direction is non-nil, the cursor stays at the same position."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
533 (interactive "*p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
534 (visual-insert-char last-command-char arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
535 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
536 (visual-backward-char arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
537
138
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 108
diff changeset
538 ;; wire us into pending-delete
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 108
diff changeset
539 (put 'visual-self-insert-command 'pending-delete t)
6608ceec7cf8 Import from CVS: tag r20-2b3
cvs
parents: 108
diff changeset
540
70
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
541 (defun visual-newline (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
542 "newline command for visual-mode.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
543 With ARG (integer), insert that many newlines."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
544 (interactive "*p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
545 (visual-insert-char ?\n arg))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
546
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
547 (defun visual-open-line (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
548 "open-line command for visual-mode.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
549 With arg (integer), insert that many newlines."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
550 (interactive "*p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
551 (visual-insert-char ?\n arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
552 (visual-backward-char arg))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
553
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
554
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
555 ;; deletion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
556
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
557 (defun visual-delete-char (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
558 "Delete ARG (integer) characters visually forward.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
559 If ARG is negative, delete backward."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
560 (interactive "*p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
561 (if (< arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
562 (while (< arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
563 (visual-backward-delete-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
564 (setq arg (1+ arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
565 (while (> arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
566 (visual-delete-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
567 (setq arg (1- arg)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
568
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
569 (defun visual-backward-delete-char (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
570 "Delete ARG (integer) characters visually backward.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
571 If arg is negative, delete forward."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
572 (interactive "*p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
573 (if (< arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
574 (while (< arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
575 (visual-delete-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
576 (setq arg (1+ arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
577 (while (> arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
578 (visual-backward-delete-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
579 (setq arg (1- arg)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
580
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
581 (fset 'visual-delete-backward-char 'visual-backward-delete-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
582
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
583 (defun visual-backward-delete-1-char nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
584 "Delete a character visually before the cursor.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
585 Ther cursor moves visually backward."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
586 (let ((d-dir (if display-direction 1 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
587 (r-dir (if display-direction 0 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
588 (a-dir (visual-char-direction-after-point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
589 (aa-dir (visual-char-direction-after-after-point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
590 (b-dir (visual-char-direction-before-point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
591 (tmp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
592
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
593 ; symbols used in the following comments
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
594 ; ^ : point in here
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
595 ; d : character whose direction is the same as display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
596 ; r : character whose direction is opposite to display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
597 ; !d : r or nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
598 ; !r : d or nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
599 ; r* : 0 or more r's
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
600 ; d* : 0 or more d's
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
601
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
602 (if (eq a-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
603 (cond
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
604 ((eq aa-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
605 ; ... r r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
606 ; ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
607 (forward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
608 (delete-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
609 (backward-char 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
610
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
611 ((save-excursion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
612 (skip-direction-backward r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
613 (backward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
614 (and (eq (visual-char-direction-after-point) d-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
615 (eq (visual-char-direction-before-point) r-dir)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
616 ; ... r d r* r !r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
617 ; ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
618 (forward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
619 (setq tmp (delete-direction-backward r-dir))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
620 (delete-backward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
621 (skip-direction-backward r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
622 (insert tmp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
623 (backward-char 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
624
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
625 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
626 ; .....!r d r* r !r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
627 ; ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
628 (skip-direction-backward r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
629 (delete-backward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
630 (skip-direction-forward r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
631 (backward-char 1)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
632
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
633 (cond
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
634 ((null b-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
635 ; nil !r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
636 ; ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
637 (error "beginning of buffer"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
638
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
639 ((eq b-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
640 ; ... r !r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
641 ; ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
642 (skip-direction-backward r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
643 (delete-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
644 (skip-direction-forward r-dir))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
645
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
646 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
647 ; ... !r !r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
648 ; ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
649 (delete-backward-char 1))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
650
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
651 (fset 'visual-delete-backward-1-char 'visual-backward-delete-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
652
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
653 (defun visual-delete-1-char nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
654 "Delete a character under the cursor.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
655 Visually, the cursor stays at the same position."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
656 (let ((d-dir (if display-direction 1 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
657 (r-dir (if display-direction 0 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
658 (a-dir (visual-char-direction-after-point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
659 (aa-dir (visual-char-direction-after-after-point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
660 (b-dir (visual-char-direction-before-point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
661 (tmp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
662
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
663 ; symbols used in the following comments
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
664 ; ^ : point in here
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
665 ; d : character whose direction is the same as display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
666 ; r : character whose direction is opposite to display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
667 ; !d : r or nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
668 ; !r : d or nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
669 ; r* : 0 or more r's
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
670 ; d* : 0 or more d's
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
671
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
672 (cond
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
673 ((null a-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
674 ; ... nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
675 ; ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
676 (error "end of buffer"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
677
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
678 ((eq a-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
679 (if (eq b-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
680
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
681 ; ... r r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
682 ; ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
683 (progn (delete-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
684 (backward-char 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
685
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
686 ; ... !r r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
687 ; ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
688 (delete-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
689 (skip-direction-forward r-dir)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
690
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
691 ((not (eq aa-dir r-dir))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
692 ; ... d !r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
693 ; ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
694 (delete-char 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
695
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
696 ((eq b-dir r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
697 ; ... r d r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
698 ; ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
699 (delete-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
700 (setq tmp (delete-direction-forward r-dir))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
701 (skip-direction-backward r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
702 (insert tmp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
703 (backward-char 1))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
704
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
705 (t
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
706 ; ...!r d r ...
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
707 ; ^
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
708 (delete-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
709 (skip-direction-forward r-dir)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
710 (backward-char 1)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
711
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
712 (defun visual-delete-region (beg end)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
713 "delete-region command for visual-mode."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
714 (interactive "*r")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
715 (let ((begl) (begc) (endl) (endc) (l))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
716
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
717 ; swap beg & end if necessary
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
718 (goto-char beg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
719 (setq begl (current-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
720 begc (visual-current-column))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
721 (goto-char end)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
722 (setq endl (current-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
723 endc (visual-current-column))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
724 (if (or (> begl endl)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
725 (and (= begl endl)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
726 (> begc endc)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
727 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
728 (setq beg (prog1 end (setq end beg))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
729 begl (prog1 endl (setq endl begl))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
730 begc (prog1 endc (setq endc begc)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
731 (goto-char end)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
732
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
733 ; insert a newline visually at END
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
734 (visual-insert-1-char ?\n)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
735 (visual-backward-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
736 (setq l (current-line))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
737
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
738 ; insert a newline visually at BEG
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
739 (goto-line begl)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
740 (visual-goto-column begc)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
741 (visual-insert-1-char ?\n)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
742 (beginning-of-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
743
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
744 (delete-region
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
745 (point)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
746 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
747 (goto-line (1+ l))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
748 (end-of-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
749 (point)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
750 (backward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
751 (visual-delete-char 2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
752
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
753 (defun current-line nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
754 "Return the current line number (in the buffer) of point."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
755 (interactive)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
756 (save-excursion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
757 (beginning-of-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
758 (1+ (count-lines 1 (point)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
759
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
760
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
761 ;; kill
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
762
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
763 (defun visual-kill-region (beg end)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
764 "kill-region command for visual-mode."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
765 (interactive "r")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
766 (let ((begl) (begc) (endl) (endc) (l))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
767
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
768 ; swap beg & end if necessary
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
769 (goto-char beg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
770 (setq begl (current-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
771 begc (visual-current-column))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
772 (goto-char end)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
773 (setq endl (current-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
774 endc (visual-current-column))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
775 (if (or (> begl endl)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
776 (and (= begl endl) (> begc endc)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
777 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
778 (setq beg (prog1 end (setq end beg))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
779 begl (prog1 endl (setq endl begl))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
780 begc (prog1 endc (setq endc begc)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
781 (goto-char end)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
782
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
783 (if (or (and buffer-read-only (not inhibit-read-only))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
784 (text-property-not-all beg end 'read-only nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
785 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
786 (visual-copy-region-as-kill beg end)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
787 (if kill-read-only-ok
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
788 (message "Read only text copied to kill ring")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
789 (barf-if-buffer-read-only)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
790
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
791 ; insert a newline visually at END
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
792 (visual-insert-1-char ?\n)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
793 (visual-backward-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
794 (setq l (current-line))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
795
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
796 ; insert a newline visually at BEG
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
797 (goto-line begl)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
798 (visual-goto-column begc)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
799 (visual-insert-1-char ?\n)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
800 (beginning-of-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
801
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
802 (kill-region
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
803 (point)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
804 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
805 (goto-line (1+ l))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
806 (end-of-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
807 (point)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
808 (backward-char 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
809 (visual-delete-char 2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
810
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
811 (setq this-command 'kill-region))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
812
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
813 (defun visual-kill-word (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
814 "Kill ARG (integer) words visually forward.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
815 If ARG is negative, kill backward."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
816 (interactive "*p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
817 (visual-kill-region
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
818 (point)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
819 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
820 (visual-forward-word arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
821 (point))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
822
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
823 (defun visual-backward-kill-word (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
824 "Kill ARG (integer) words visually backward.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
825 If ARG is negative, kill forward."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
826 (interactive "*p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
827 (visual-kill-region
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
828 (point)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
829 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
830 (visual-backward-word arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
831 (point))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
832
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
833 (defun visual-kill-line (&optional arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
834 "kill-line command for visual-mode."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
835 (interactive "*P")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
836 (visual-kill-region
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
837 (point)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
838 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
839 (if arg
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
840 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
841 (forward-line (prefix-numeric-value arg))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
842 (visual-beginning-of-line))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
843 (if (eobp)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
844 (signal 'end-of-buffer nil))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
845 (if (not (eolp))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
846 (visual-end-of-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
847 (forward-line 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
848 (visual-beginning-of-line)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
849 (point))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
850
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
851 (defun visual-copy-region-as-kill (beg end)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
852 "copy-region-as-kill command for visual-mode."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
853 (interactive "r")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
854 (let ((buffer-read-only nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
855 (auto-save-mode 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
856 (p (point)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
857 (visual-kill-region beg end)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
858 (visual-yank 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
859 (if (/= (point) p)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
860 (exchange-point-and-mark)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
861 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
862
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
863 (defun visual-kill-ring-save (beg end)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
864 "kill-ring-save command for visual-mode."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
865 (interactive "r")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
866 (visual-copy-region-as-kill beg end)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
867 (if (interactive-p)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
868 (let ((other-end (if (= (point) beg) end beg))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
869 (opoint (point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
870 (inhibit-quit t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
871 (if (pos-visible-in-window-p other-end (selected-window))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
872 (progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
873 (set-marker (mark-marker) (point) (current-buffer))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
874 (goto-char other-end)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
875 (sit-for 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
876 (set-marker (mark-marker) other-end (current-buffer))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
877 (goto-char opoint)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
878 (and quit-flag mark-active
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
879 (deactivate-mark)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
880 (let* ((killed-text (current-kill 0))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
881 (message-len (min (length killed-text) 40)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
882 (if (= (point) beg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
883 (message "Saved text until \"%s\""
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
884 (substring killed-text (- message-len)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
885 (message "Saved text from \"%s\""
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
886 (substring killed-text 0 message-len))))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
887
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
888
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
889 ;; yank
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
890
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
891 (defun visual-yank (&optional arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
892 "yank command for visual-mode."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
893 (interactive "*P")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
894 (setq this-command t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
895
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
896 (let ((l1 (current-line)) (c1 (visual-current-column)) l2 c2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
897
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
898 ;; Insert a newline both before and after current point.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
899 (visual-insert-char ?\n 2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
900 (visual-backward-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
901
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
902 ;; Reinsert killed string between the two newlines.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
903 (insert (current-kill (cond
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
904 ((listp arg) 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
905 ((eq arg '-) -1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
906 (t (1- arg)))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
907
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
908 ;; Delete the latter newline visually.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
909 (visual-delete-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
910 (setq l2 (current-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
911 c2 (visual-current-column))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
912
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
913 ;; Delete the former newline visually.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
914 (goto-line l1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
915 (end-of-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
916 (visual-delete-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
917 (push-mark (point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
918
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
919 ;; Go back to the end of yanked string.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
920 (if (= (- l2 l1) 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
921 (visual-goto-column (+ c1 c2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
922 (goto-line (1- l2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
923 (visual-goto-column c2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
924
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
925 ;; Exchange point and mark if necessary.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
926 (if (consp arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
927 (goto-char (prog1 (mark t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
928 (set-marker (mark-marker) (point) (current-buffer))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
929
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
930 (setq this-command 'yank)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
931 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
932
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
933 (defun visual-yank-pop (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
934 "yank-pop command for visual-mode."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
935 (interactive "*p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
936 (if (not (eq last-command 'yank))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
937 (error "Previous command was not a yank"))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
938 (setq this-command 'yank)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
939 (let (l1 c1 l2 c2 before)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
940
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
941 (save-excursion
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
942 (setq l2 (current-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
943 c2 (visual-current-column))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
944 (goto-char (mark t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
945 (setq l1 (current-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
946 c1 (visual-current-column))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
947 (if (or (> l1 l2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
948 (and (= l1 l2) (> c1 c2)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
949 (setq before t)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
950
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
951 (visual-delete-region (point) (mark t))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
952 (setq l1 (current-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
953 c1 (visual-current-column))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
954
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
955 ;; Insert a newline both before and after current point.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
956 (visual-insert-char ?\n 2)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
957 (visual-backward-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
958
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
959 ;; Reinsert killed string between the two newlines.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
960 (insert (current-kill arg))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
961
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
962 ;; Delete the latter newline visually.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
963 (visual-delete-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
964 (setq l2 (current-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
965 c2 (visual-current-column))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
966
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
967 ;; Delete the former newline visually.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
968 (goto-line l1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
969 (end-of-line)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
970 (visual-delete-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
971 (set-marker (mark-marker) (point) (current-buffer))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
972
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
973 ;; Go back to the end of yanked string.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
974 (if (= (- l2 l1) 1)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
975 (visual-goto-column (+ c1 c2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
976 (goto-line (1- l2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
977 (visual-goto-column c2))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
978
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
979 ;; Exchange point and mark if necessary.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
980 (if before
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
981 (goto-char (prog1 (mark t)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
982 (set-marker (mark-marker) (point) (current-buffer))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
983
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
984 nil)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
985
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
986
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
987 ;; misc
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
988
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
989 (defun visual-reverse-direction-word nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
990 "Reverse the char order of the word before point."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
991 (interactive "*")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
992 (goto-char
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
993 (prog1
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
994 (point)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
995 (reverse-region
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
996 (point)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
997 (progn (skip-direction-backward (visual-char-direction-before-point))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
998 (point))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
999
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1000 (defun visual-reverse-region (begin end)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1001 "Reverse the order of chars between BEGIN and END."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1002 (interactive "*r")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1003 (apply 'insert
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1004 (nreverse
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1005 (string-to-char-list
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1006 (prog1 (buffer-substring begin end) (delete-region begin end))))))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1007
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1008
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1009 ;; LR commands
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1010
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1011 (defun visual-char-left nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1012 "Return the character on the left of visual point."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1013 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1014 (visual-char-after)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1015 (visual-char-before)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1016
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1017 (defun visual-char-right nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1018 "Return the character on the right of visual point."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1019 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1020 (visual-char-before)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1021 (visual-char-after)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1022
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1023 (defun visual-move-to-left-char (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1024 "Move the cursor visually left by ARG (integer) characters.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1025 If ARG is negative, move the cursor right."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1026 (interactive "p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1027 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1028 (visual-forward-char arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1029 (visual-backward-char arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1030
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1031 (defun visual-move-to-left-1-char nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1032 "Move the cursor visually left by 1 character."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1033 (interactive "p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1034 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1035 (visual-forward-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1036 (visual-backward-1-char)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1037
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1038 (defun visual-move-to-right-char (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1039 "Move the cursor visually right by ARG (integer) characters.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1040 If ARG is negative, move the cursor left."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1041 (interactive "p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1042 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1043 (visual-backward-char arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1044 (visual-forward-char arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1045
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1046 (defun visual-move-to-right-1-char nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1047 "Move the cursor visually right by 1 character."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1048 (interactive "p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1049 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1050 (visual-backward-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1051 (visual-forward-1-char)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1052
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1053 (defun visual-move-to-left-word (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1054 "Move the cursor visually left by ARG (integer) words.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1055 If ARG is negative, move the cursor right."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1056 (interactive "p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1057 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1058 (visual-forward-word arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1059 (visual-backward-word arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1060
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1061 (defun visual-move-to-right-word (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1062 "Move the cursor visually right by ARG (integer) words.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1063 If ARG is negative, move the cursor left."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1064 (interactive "p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1065 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1066 (visual-backward-word arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1067 (visual-forward-word arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1068
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1069 (defun visual-left-end-of-line (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1070 "Move the line cursor to the left-end of line.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1071 With ARG not nil, move forward ARG - 1 lines first.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1072 If scan reaches end of buffer, stop there without error."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1073 (interactive "P")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1074 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1075 (visual-end-of-line arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1076 (visual-beginning-of-line arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1077
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1078 (defun visual-right-end-of-line (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1079 "Move the line cursor to the right-end of line.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1080 With ARG not nil, move forward ARG - 1 lines first.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1081 If scan reaches end of buffer, stop there without error."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1082 (interactive "P")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1083 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1084 (visual-beginning-of-line arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1085 (visual-end-of-line arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1086
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1087 (defun visual-insert-char-left (ch arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1088 "Insert CH (character) on the left of visual point as many as
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1089 ARG (integer)."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1090 (if (< arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1091 (error "ARG must be >= 0."))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1092 (visual-insert-char ch arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1093 (and display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1094 (visual-backward-char arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1095
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1096 (defun visual-insert-left-1-char (ch)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1097 "Insert CH (character) on the left of visual point."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1098 (visual-insert-1-char ch)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1099 (and display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1100 (visual-backward-1-char)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1101
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1102 (defun visual-insert-char-right (ch arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1103 "Insert CH (character) on the right of visual point as many as
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1104 ARG (integer)."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1105 (if (< arg 0)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1106 (error "ARG must be >= 0."))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1107 (visual-insert-char ch arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1108 (or display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1109 (visual-backward-char arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1110
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1111 (defun visual-insert-right-1-char (ch)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1112 "Insert CH (character) on the right of visual point."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1113 (visual-insert-1-char ch)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1114 (or display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1115 (visual-backward-1-char)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1116
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1117 (defun visual-delete-left-char (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1118 "Delete ARG (integer) characters on the left of visual point.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1119 If ARG is negative, on the right."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1120 (interactive "*p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1121 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1122 (visual-delete-char arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1123 (visual-backward-delete-char arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1124
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1125 (defun visual-delete-left-1-char nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1126 "Delete 1 character on the left of visual point."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1127 (interactive "*p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1128 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1129 (visual-delete-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1130 (visual-backward-delete-1-char)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1131
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1132 (defun visual-delete-right-char (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1133 "Delete ARG (integer) characters on the right of visual point.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1134 If ARG is negative, on the left."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1135 (interactive "*p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1136 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1137 (visual-backward-delete-char arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1138 (visual-delete-char arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1139
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1140 (defun visual-delete-right-1-char nil
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1141 "Delete 1 character on the right of visual point."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1142 (interactive "*p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1143 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1144 (visual-backward-delete-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1145 (visual-delete-1-char)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1146
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1147 (defmacro visual-replace-left-1-char (ch)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1148 (list
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1149 'progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1150 '(visual-delete-left-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1151 (list 'visual-insert-left-1-char ch)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1152
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1153 (defmacro visual-replace-right-1-char (ch)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1154 (list
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1155 'progn
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1156 '(visual-delete-right-1-char)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1157 (list 'visual-insert-right-1-char ch)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1158
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1159 (defun visual-kill-left-word (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1160 "Kill ARG (integer) words on the left of visual pointer.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1161 If ARG is negative, kill on the right."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1162 (interactive "*p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1163 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1164 (visual-kill-word arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1165 (visual-backward-kill-word arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1166
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1167 (defun visual-kill-right-word (arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1168 "Kill ARG (integer) words on the right of visual point.
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1169 If ARG is negative, kill on the left."
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1170 (interactive "*p")
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1171 (if display-direction
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1172 (visual-backward-kill-word arg)
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1173 (visual-kill-word arg)))
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1174
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1175 ;;;
131b0175ea99 Import from CVS: tag r20-0b30
cvs
parents:
diff changeset
1176 (provide 'visual-mode)