mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-18 10:57:34 +00:00
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:
parent
258b0b37ec
commit
700be2bd13
1 changed files with 160 additions and 99 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue