Major additions by Gustavo Chaves.

(iso-languages): New variable.
(iso-accents-list): Now set by iso-customize-accents.
(iso-customize-accents): New function.
(iso-accentuate, iso-deaccentuate, iso-unaccentuate):
(iso-accent-rassoc-unit): New functions.
This commit is contained in:
Richard M. Stallman 1995-07-31 01:28:39 +00:00
parent 258b0b37ec
commit 700be2bd13

View file

@ -62,92 +62,74 @@
(provide 'iso-acc)
(defvar iso-accents-list
'(((?' ?A) ?\301)
((?' ?E) ?\311)
((?' ?I) ?\315)
((?' ?O) ?\323)
((?' ?U) ?\332)
((?' ?Y) ?\335)
((?' ?a) ?\341)
((?' ?e) ?\351)
((?' ?i) ?\355)
((?' ?o) ?\363)
((?' ?u) ?\372)
((?' ?y) ?\375)
((?' ?') ?\264)
((?' ? ) ?')
((?` ?A) ?\300)
((?` ?E) ?\310)
((?` ?I) ?\314)
((?` ?O) ?\322)
((?` ?U) ?\331)
((?` ?a) ?\340)
((?` ?e) ?\350)
((?` ?i) ?\354)
((?` ?o) ?\362)
((?` ?u) ?\371)
((?` ? ) ?`)
((?` ?`) ?`) ; no special code?
((?^ ?A) ?\302)
((?^ ?E) ?\312)
((?^ ?I) ?\316)
((?^ ?O) ?\324)
((?^ ?U) ?\333)
((?^ ?a) ?\342)
((?^ ?e) ?\352)
((?^ ?i) ?\356)
((?^ ?o) ?\364)
((?^ ?u) ?\373)
((?^ ? ) ?^)
((?^ ?^) ?^) ; no special code?
((?\" ?A) ?\304)
((?\" ?E) ?\313)
((?\" ?I) ?\317)
((?\" ?O) ?\326)
((?\" ?U) ?\334)
((?\" ?a) ?\344)
((?\" ?e) ?\353)
((?\" ?i) ?\357)
((?\" ?o) ?\366)
((?\" ?s) ?\337)
((?\" ?u) ?\374)
((?\" ?y) ?\377)
((?\" ? ) ?\")
((?\" ?\") ?\250)
((?\~ ?A) ?\303)
((?\~ ?C) ?\307)
((?\~ ?D) ?\320)
((?\~ ?N) ?\321)
((?\~ ?O) ?\325)
((?\~ ?T) ?\336)
((?\~ ?a) ?\343)
((?\~ ?c) ?\347)
((?\~ ?d) ?\360)
((?\~ ?n) ?\361)
((?\~ ?o) ?\365)
((?\~ ?t) ?\376)
((?\~ ?>) ?\273)
((?\~ ?<) ?\253)
((?\~ ?!) ?\241) ;; Inverted exclamation mark
((?\~ ??) ?\277) ;; Inverted question mark
((?\~ ?\ ) ?\~)
((?\~ ?\~) ?\270) ;; cedilla accent
((?\/ ?A) ?\305) ;; A-with-ring (Norwegian and Danish)
((?\/ ?E) ?\306) ;; AE-ligature (Norwegian and Danish)
((?\/ ?O) ?\330)
((?\/ ?a) ?\345) ;; a-with-ring (Norwegian and Danish)
((?\/ ?e) ?\346) ;; ae-ligature (Norwegian and Danish)
((?\/ ?o) ?\370)
((?\/ ?\ ) ?\/)
((?\/ ?\/) ?\260) ;; ring accent (actually degree sign?)
)
"Association list for ISO accent combinations.")
(defvar iso-languages
'(("portuguese"
(?' ?` ?^ ?\" ?~)
(((?' ?A) ?\301) ((?' ?E) ?\311) ((?' ?I) ?\315) ((?' ?O) ?\323)
((?' ?U) ?\332) ((?' ?C) ?\307) ((?' ?a) ?\341) ((?' ?e) ?\351)
((?' ?i) ?\355) ((?' ?o) ?\363) ((?' ?u) ?\372) ((?' ?c) ?\347)
((?' ? ) ?') ((?` ?A) ?\300) ((?` ?a) ?\340) ((?` ? ) ?`)
((?^ ?A) ?\302) ((?^ ?E) ?\312) ((?^ ?O) ?\324) ((?^ ?a) ?\342)
((?^ ?e) ?\352) ((?^ ?o) ?\364) ((?^ ? ) ?^) ((?\" ?U) ?\334)
((?\" ?u) ?\374) ((?\" ? ) ?\") ((?\~ ?A) ?\303) ((?\~ ?O) ?\325)
((?\~ ?a) ?\343) ((?\~ ?o) ?\365) ((?\~ ?\ ) ?\~)))
("french"
(?' ?` ?^ ?\" ?~)
(((?' ?A) ?\301) ((?' ?E) ?\311) ((?' ?I) ?\315) ((?' ?O) ?\323)
((?' ?U) ?\332) ((?' ?C) ?\307) ((?' ?a) ?\341) ((?' ?e) ?\351)
((?' ?i) ?\355) ((?' ?o) ?\363) ((?' ?u) ?\372) ((?' ?c) ?\347)
((?' ? ) ?') ((?` ?A) ?\300) ((?` ?E) ?\310) ((?` ?a) ?\340)
((?` ?e) ?\350) ((?` ? ) ?`) ((?^ ?A) ?\302) ((?^ ?E) ?\312)
((?^ ?I) ?\316) ((?^ ?O) ?\324) ((?^ ?U) ?\333) ((?^ ?a) ?\342)
((?^ ?e) ?\352) ((?^ ?i) ?\356) ((?^ ?o) ?\364) ((?^ ?u) ?\373)
((?^ ? ) ?^) ((?\" ?U) ?\334) ((?\" ?u) ?\374) ((?\" ? ) ?\")
((?\~ ?A) ?\303) ((?\~ ?O) ?\325) ((?\~ ?a) ?\343) ((?\~ ?o) ?\365)
((?\~ ?\ ) ?\~)))
("default"
(?' ?` ?^ ?\" ?~ ?/)
(((?' ?A) ?\301) ((?' ?E) ?\311) ((?' ?I) ?\315) ((?' ?O) ?\323)
((?' ?U) ?\332) ((?' ?Y) ?\335) ((?' ?a) ?\341) ((?' ?e) ?\351)
((?' ?i) ?\355) ((?' ?o) ?\363) ((?' ?u) ?\372) ((?' ?y) ?\375)
((?' ?') ?\264) ((?' ? ) ?') ((?` ?A) ?\300) ((?` ?E) ?\310)
((?` ?I) ?\314) ((?` ?O) ?\322) ((?` ?U) ?\331) ((?` ?a) ?\340)
((?` ?e) ?\350) ((?` ?i) ?\354) ((?` ?o) ?\362) ((?` ?u) ?\371)
((?` ? ) ?`) ((?` ?`) ?`) ((?^ ?A) ?\302) ((?^ ?E) ?\312)
((?^ ?I) ?\316) ((?^ ?O) ?\324) ((?^ ?U) ?\333) ((?^ ?a) ?\342)
((?^ ?e) ?\352) ((?^ ?i) ?\356) ((?^ ?o) ?\364) ((?^ ?u) ?\373)
((?^ ? ) ?^) ((?^ ?^) ?^) ((?\" ?A) ?\304) ((?\" ?E) ?\313)
((?\" ?I) ?\317) ((?\" ?O) ?\326) ((?\" ?U) ?\334) ((?\" ?a) ?\344)
((?\" ?e) ?\353) ((?\" ?i) ?\357) ((?\" ?o) ?\366) ((?\" ?s) ?\337)
((?\" ?u) ?\374) ((?\" ?y) ?\377) ((?\" ? ) ?\") ((?\" ?\") ?\250)
((?\~ ?A) ?\303) ((?\~ ?C) ?\307) ((?\~ ?D) ?\320) ((?\~ ?N) ?\321)
((?\~ ?O) ?\325) ((?\~ ?T) ?\336) ((?\~ ?a) ?\343) ((?\~ ?c) ?\347)
((?\~ ?d) ?\360) ((?\~ ?n) ?\361) ((?\~ ?o) ?\365) ((?\~ ?t) ?\376)
((?\~ ?>) ?\273) ((?\~ ?<) ?\253) ((?\~ ?\ ) ?\~) ((?\~ ?\~) ?\270)
((?\/ ?A) ?\305) ((?\/ ?E) ?\306) ((?\/ ?O) ?\330) ((?\/ ?a) ?\345)
((?\/ ?e) ?\346) ((?\/ ?o) ?\370) ((?\/ ?\ ) ?\/) ((?\/ ?\/) ?\260))))
"List of language-specific customizations for the ISO Accents mode.
Each element of the list is of the form (LANGUAGE ENABLE LIST).
LANGUAGE is a string naming the language.
ENABLE is a list of characters that will be used as accent prefixes.
It will be the value of the iso-accents-enable variable.
LIST is a list of accent translations. It will be the value of the
iso-accents-list variable.")
(defvar iso-language nil
"Language for which ISO Accents mode is currently customized.
Change it with the `iso-accents-customize' function.")
(defvar iso-accents-list nil
"Association list for ISO accent combinations, for the chosen language.")
(defvar iso-accents-mode nil
"*Non-nil enables ISO Accents mode.
Setting this variable makes it local to the current buffer.
See function `iso-accents-mode'.")
See the function `iso-accents-mode'.")
(make-variable-buffer-local 'iso-accents-mode)
(defun iso-accents-accent-key (prompt)
@ -191,28 +173,12 @@ See function `iso-accents-mode'.")
(setq unread-command-events (list second-char))
(vector first-char))))
(defvar iso-accents-enable '(?' ?` ?^ ?\" ?~ ?/)
(defvar iso-accents-enable nil
"*List of accent keys that become prefixes in ISO Accents mode.
The default is (?' ?` ?^ ?\" ?~ ?/), which contains all the supported
accent keys. For certain languages, you might want to remove some of
those characters that are not actually used.")
(or key-translation-map (setq key-translation-map (make-sparse-keymap)))
;; For sequences starting with an accent character,
;; use a function that tests iso-accents-mode.
(if (memq ?' iso-accents-enable)
(define-key key-translation-map "'" 'iso-accents-accent-key))
(if (memq ?` iso-accents-enable)
(define-key key-translation-map "`" 'iso-accents-accent-key))
(if (memq ?^ iso-accents-enable)
(define-key key-translation-map "^" 'iso-accents-accent-key))
(if (memq ?\" iso-accents-enable)
(define-key key-translation-map "\"" 'iso-accents-accent-key))
(if (memq ?~ iso-accents-enable)
(define-key key-translation-map "~" 'iso-accents-accent-key))
(if (memq ?/ iso-accents-enable)
(define-key key-translation-map "/" 'iso-accents-accent-key))
;; It is a matter of taste if you want the minor mode indicated
;; in the mode line...
;; If so, uncomment the next four lines.
@ -258,4 +224,99 @@ and a negative argument disables it."
;; Enable electric accents.
(setq iso-accents-mode t)))
(defun iso-accents-customize (language)
"Customize the ISO accents machinery for a particular language.
It selects the customization based on the specifications in the
`iso-languages' variable."
(interactive (list (completing-read "Language: " iso-languages nil t)))
(let ((table (assoc language iso-languages))
c)
(if (not table)
(error "Unknown language")
(setq iso-language language)
(setq iso-accents-enable (car (cdr table)))
(setq iso-accents-list (car (cdr (cdr table))))
(if key-translation-map
(substitute-key-definition
'iso-accents-accent-key nil key-translation-map)
(setq key-translation-map (make-sparse-keymap)))
(setq c iso-accents-enable)
(while c
(define-key
key-translation-map (char-to-string (car c)) 'iso-accents-accent-key)
(setq c (cdr c))))))
(defun iso-accentuate (start end)
"Convert two-character sequences in region into accented characters.
Noninteractively, this operates on text from START to END.
This uses the same conversion that ISO Accents mode uses for type-in."
(interactive "r")
(save-excursion
(save-restriction
(narrow-to-region start end)
(goto-char start)
(forward-char 1)
(let (entry)
(while (< (point) end)
(if (and (memq (preceding-char) iso-accents-enable)
(<= ?A (following-char))
(<= (following-char) ?z)
(setq entry (assoc (list (preceding-char) (following-char))
iso-accents-list)))
(progn
(forward-char -1)
(delete-char 2)
(insert (car (cdr entry)))
(setq end (1- end)))
(forward-char 1)))))))
(defun iso-accent-rassoc-unit (value alist)
(while (and alist
(not (eq (car (cdr (car alist))) value)))
(setq alist (cdr alist)))
(if alist
(car alist)
nil))
(defun iso-unaccentuate (start end)
"Convert accented characters in the region into two-character sequences.
Noninteractively, this operates on text from START to END.
This uses the opposite of the conversion done by ISO Accents mode for type-in."
(interactive "r")
(save-excursion
(save-restriction
(narrow-to-region start end)
(goto-char start)
(let (entry)
(while (< (point) end)
(if (and (> (following-char) 127)
(setq entry (iso-accent-rassoc-unit (following-char)
iso-accents-list)))
(progn
(delete-char 1)
(insert (car (car entry)) (car (cdr (car entry))))
(setq end (1+ end)))
(forward-char 1)))))))
(defun iso-deaccentuate (start end)
"Convert accented characters in the region into unaccented characters.
Noninteractively, this operates on text from START to END."
(interactive "r")
(save-excursion
(save-restriction
(narrow-to-region start end)
(goto-char start)
(let (entry)
(while (< (point) end)
(if (and (> (following-char) 127)
(setq entry (iso-accent-rassoc-unit (following-char)
iso-accents-list)))
(progn
(delete-char 1)
(insert (car (cdr (car entry)))))
(forward-char 1)))))))
(iso-customize-accents "default")
;;; iso-acc.el ends here