[COMMIT] Have distinct weak boxes print distinctly.
6 years, 4 months
Aidan Kehoe
APPROVE COMMIT
NOTE: This patch has been committed
# HG changeset patch
# User Aidan Kehoe <kehoea(a)parhasard.net>
# Date 1534161974 -3600
# Mon Aug 13 13:06:14 2018 +0100
# Node ID ebbb3bbb899aae849c9c66f4bc16825240be3637
# Parent 94cedc3ecd89c2c50ea4e3b1d5774459049f90af
Have distinct weak boxes print distinctly.
lisp/ChangeLog addition:
2018-08-13 Aidan Kehoe <kehoea(a)parhasard.net>
* misc.el (make-weak-box):
Have distinct weak boxes print distinctly; remove …
[View More]information on
the type of the one-time contents from the weak box, it doesn't
add anything and will be inaccurate once the contents are nil.
diff -r 94cedc3ecd89 -r ebbb3bbb899a lisp/ChangeLog
--- a/lisp/ChangeLog Sun Aug 12 21:27:46 2018 +0100
+++ b/lisp/ChangeLog Mon Aug 13 13:06:14 2018 +0100
@@ -1,3 +1,10 @@
+2018-08-13 Aidan Kehoe <kehoea(a)parhasard.net>
+
+ * misc.el (make-weak-box):
+ Have distinct weak boxes print distinctly; remove information on
+ the type of the one-time contents from the weak box, it doesn't
+ add anything and will be inaccurate once the contents are nil.
+
2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
* misc.el:
diff -r 94cedc3ecd89 -r ebbb3bbb899a lisp/misc.el
--- a/lisp/misc.el Sun Aug 12 21:27:46 2018 +0100
+++ b/lisp/misc.el Mon Aug 13 13:06:14 2018 +0100
@@ -77,7 +77,7 @@
(defun weak-box-p (object)
"Return non-nil if OBJECT is a weak box."
- (and (vectorp object) (eql (length object) 3)
+ (and (vectorp object) (eql (length object) 2)
(eq 'cl-weak-box (aref object 0))))
(defun make-weak-box (contents)
@@ -88,21 +88,21 @@
`weak-box-ref' will return NIL."
(symbol-macrolet ((all-weak-boxes #:all-weak-boxes))
(defvar all-weak-boxes)
- (caar (set-weak-list-list
- (load-time-value
- (progn
- (setq all-weak-boxes (make-weak-list 'assoc))
- (defalias 'weak-box-ref-1
- #'(lambda (weak-box)
- (cdr (assq weak-box (weak-list-list all-weak-boxes)))))
- all-weak-boxes))
- ;; The #'eq-hash call isn't necessary, but it does mean that weak
- ;; boxes that refer to distinct objects print distinctly. The
- ;; #'type-of call is intended to give us a bit more context as to
- ;; what's going on, without the need to fire up GDB to convert the
- ;; eq-hash to an address.
- (acons (vector 'cl-weak-box (type-of contents) (eq-hash contents))
- contents (weak-list-list all-weak-boxes))))))
+ (let ((vector
+ (caar (set-weak-list-list
+ (load-time-value
+ (progn
+ (defalias 'weak-box-ref-1
+ #'(lambda (weak-box)
+ (cdr (assq weak-box
+ (weak-list-list all-weak-boxes)))))
+ (setq all-weak-boxes (make-weak-list 'assoc))))
+ (acons (vector 'cl-weak-box nil)
+ contents (weak-list-list all-weak-boxes))))))
+ ;; The second element of the vector is the eq hash of the vector itself,
+ ;; to ensure that distinct weak boxes print distinctly.
+ (aset vector 1 (eq-hash vector))
+ vector)))
(defun weak-box-ref (weak-box)
"Return the contents of weak box WEAK-BOX.
--
‘As I sat looking up at the Guinness ad, I could never figure out /
How your man stayed up on the surfboard after forty pints of stout’
(C. Moore)
[View Less]
[COMMIT] Improve the Lisp implementation of weak boxes; document it some more.
6 years, 4 months
Aidan Kehoe
APPROVE COMMIT
NOTE: This patch has been committed
# HG changeset patch
# User Aidan Kehoe <kehoea(a)parhasard.net>
# Date 1534105666 -3600
# Sun Aug 12 21:27:46 2018 +0100
# Node ID 94cedc3ecd89c2c50ea4e3b1d5774459049f90af
# Parent 22544df6c9205a9d08fb9405b22d227ac98b3866
Improve the Lisp implementation of weak boxes; document it some more.
lisp/ChangeLog addition:
2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
* misc.el:
* misc.el (weak-box-p):
* misc.el (make-…
[View More]weak-box):
* misc.el (weak-box-ref):
Improve the implementation here; make #'weak-box-ref free in terms
of garbage, make weak boxes that reference distinct objects print
distinctly, give information as to the type of CONTENTS stored.
Document some more on the performance and debugging implications
of the Lisp implementation.
diff -r 22544df6c920 -r 94cedc3ecd89 lisp/ChangeLog
--- a/lisp/ChangeLog Sun Aug 12 18:30:18 2018 +0100
+++ b/lisp/ChangeLog Sun Aug 12 21:27:46 2018 +0100
@@ -1,3 +1,15 @@
+2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
+
+ * misc.el:
+ * misc.el (weak-box-p):
+ * misc.el (make-weak-box):
+ * misc.el (weak-box-ref):
+ Improve the implementation here; make #'weak-box-ref free in terms
+ of garbage, make weak boxes that reference distinct objects print
+ distinctly, give information as to the type of CONTENTS stored.
+ Document some more on the performance and debugging implications
+ of the Lisp implementation.
+
2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
* misc.el:
diff -r 22544df6c920 -r 94cedc3ecd89 lisp/misc.el
--- a/lisp/misc.el Sun Aug 12 18:30:18 2018 +0100
+++ b/lisp/misc.el Sun Aug 12 21:27:46 2018 +0100
@@ -65,13 +65,19 @@
;;; Weak boxes, formerly in data.c, but never used enough to merit a C
-;;; implementation.
+;;; implementation. There is minimal performance and GC impact to this Lisp
+;;; implementation (GC performance actually improves, as in the vast majority
+;;; of the time, when there are no weak boxes, prune_weak_boxes() isn't
+;;; called.) In debugging terms, however, there is no error on attempting to
+;;; print readably, as the C implementation gave, and the print method isn't
+;;; as pretty as it was with the C version.
-(autoload 'all-weak-boxes-list "misc")
+;; Quiet the compiler about calls to this:
+(autoload 'weak-box-ref-1 "misc")
(defun weak-box-p (object)
"Return non-nil if OBJECT is a weak box."
- (and (vectorp object) (eql (length object) 1)
+ (and (vectorp object) (eql (length object) 3)
(eq 'cl-weak-box (aref object 0))))
(defun make-weak-box (contents)
@@ -80,23 +86,28 @@
`weak-box-ref'. However, the weak box does not contribute to the
reachability of CONTENTS. When CONTENTS is garbage-collected,
`weak-box-ref' will return NIL."
- (caar (set-weak-list-list
- (load-time-value
- (progn
- (defvar #1=#:all-weak-boxes (make-weak-list 'assoc))
- (defalias 'all-weak-boxes-list
- ;; If the weak box code is actually used, this #'copy-list
- ;; might be an issue in terms of GC. It isn't, currently, and
- ;; so the protection against other callers modifying the list
- ;; out from under the feet of our code is preferred.
- #'(lambda () (copy-list (weak-list-list #1#))))
- #1#))
- (acons (vector 'cl-weak-box) contents (all-weak-boxes-list)))))
+ (symbol-macrolet ((all-weak-boxes #:all-weak-boxes))
+ (defvar all-weak-boxes)
+ (caar (set-weak-list-list
+ (load-time-value
+ (progn
+ (setq all-weak-boxes (make-weak-list 'assoc))
+ (defalias 'weak-box-ref-1
+ #'(lambda (weak-box)
+ (cdr (assq weak-box (weak-list-list all-weak-boxes)))))
+ all-weak-boxes))
+ ;; The #'eq-hash call isn't necessary, but it does mean that weak
+ ;; boxes that refer to distinct objects print distinctly. The
+ ;; #'type-of call is intended to give us a bit more context as to
+ ;; what's going on, without the need to fire up GDB to convert the
+ ;; eq-hash to an address.
+ (acons (vector 'cl-weak-box (type-of contents) (eq-hash contents))
+ contents (weak-list-list all-weak-boxes))))))
(defun weak-box-ref (weak-box)
"Return the contents of weak box WEAK-BOX.
If the contents have been GCed, return NIL."
(check-argument-type 'weak-box-p weak-box)
- (cdr (assq weak-box (all-weak-boxes-list))))
+ (weak-box-ref-1 weak-box))
;;; misc.el ends here
--
‘As I sat looking up at the Guinness ad, I could never figure out /
How your man stayed up on the surfboard after forty pints of stout’
(C. Moore)
[View Less]
[COMMIT] Quieten the compiler, x_font_instance_properties().
6 years, 4 months
Aidan Kehoe
APPROVE COMMIT
NOTE: This patch has been committed
# HG changeset patch
# User Aidan Kehoe <kehoea(a)parhasard.net>
# Date 1534095018 -3600
# Sun Aug 12 18:30:18 2018 +0100
# Node ID 22544df6c9205a9d08fb9405b22d227ac98b3866
# Parent ab23fd48c3f8a61e865ba71d810104fd96610aee
Quieten the compiler, x_font_instance_properties().
src/ChangeLog addition:
2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
* fontcolor-x.c (x_font_instance_properties):
Initialise name_len here to …
[View More]quieten the compiler.
diff -r ab23fd48c3f8 -r 22544df6c920 src/ChangeLog
--- a/src/ChangeLog Sun Aug 12 18:14:35 2018 +0100
+++ b/src/ChangeLog Sun Aug 12 18:30:18 2018 +0100
@@ -1,3 +1,8 @@
+2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
+
+ * fontcolor-x.c (x_font_instance_properties):
+ Initialise name_len here to quieten the compiler.
+
2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
* data.c:
diff -r ab23fd48c3f8 -r 22544df6c920 src/fontcolor-x.c
--- a/src/fontcolor-x.c Sun Aug 12 18:14:35 2018 +0100
+++ b/src/fontcolor-x.c Sun Aug 12 18:30:18 2018 +0100
@@ -833,7 +833,7 @@
Lisp_Object name, value;
Atom atom = props [i].name;
Ibyte *name_str = 0;
- Bytecount name_len;
+ Bytecount name_len = 0;
Extbyte *namestrext = XGetAtomName (dpy, atom);
if (namestrext)
--
‘As I sat looking up at the Guinness ad, I could never figure out /
How your man stayed up on the surfboard after forty pints of stout’
(C. Moore)
[View Less]
[COMMIT] Move the weak-box implementation to Lisp.
6 years, 4 months
Aidan Kehoe
APPROVE COMMIT
NOTE: This patch has been committed
# HG changeset patch
# User Aidan Kehoe <kehoea(a)parhasard.net>
# Date 1534094075 -3600
# Sun Aug 12 18:14:35 2018 +0100
# Node ID ab23fd48c3f8a61e865ba71d810104fd96610aee
# Parent 39f424909e0c055c65f16e855a9de8b806b04f0f
Move the weak-box implementation to Lisp.
lisp/ChangeLog addition:
2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
* misc.el:
* misc.el (weak-box-p): New.
* misc.el (make-weak-box): New.
* misc.el …
[View More](weak-box-ref): New.
Move all these functions here from data.c.
src/ChangeLog addition:
2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
* data.c:
* data.c (syms_of_data):
* data.c (vars_of_data):
* gc.c (gc_finish_mark):
* gc.c (gc_finalize):
* lisp.h:
* lrecord.h (enum lrecord_type):
Remove the weak-box implementation from C. It was never used
enough to merit being in C, and it is easily implemented in Lisp
using the weak list infrastructure.
diff -r 39f424909e0c -r ab23fd48c3f8 lisp/ChangeLog
--- a/lisp/ChangeLog Sun Aug 12 17:52:59 2018 +0100
+++ b/lisp/ChangeLog Sun Aug 12 18:14:35 2018 +0100
@@ -1,3 +1,11 @@
+2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
+
+ * misc.el:
+ * misc.el (weak-box-p): New.
+ * misc.el (make-weak-box): New.
+ * misc.el (weak-box-ref): New.
+ Move all these functions here from data.c.
+
2018-07-17 Aidan Kehoe <kehoea(a)parhasard.net>
* backquote.el (bq-process):
diff -r 39f424909e0c -r ab23fd48c3f8 lisp/misc.el
--- a/lisp/misc.el Sun Aug 12 17:52:59 2018 +0100
+++ b/lisp/misc.el Sun Aug 12 18:14:35 2018 +0100
@@ -63,4 +63,40 @@
(+ n (point)))))))
(insert string)))
+
+;;; Weak boxes, formerly in data.c, but never used enough to merit a C
+;;; implementation.
+
+(autoload 'all-weak-boxes-list "misc")
+
+(defun weak-box-p (object)
+ "Return non-nil if OBJECT is a weak box."
+ (and (vectorp object) (eql (length object) 1)
+ (eq 'cl-weak-box (aref object 0))))
+
+(defun make-weak-box (contents)
+ "Return a new weak box from value CONTENTS.
+The weak box is a reference to CONTENTS which may be extracted with
+`weak-box-ref'. However, the weak box does not contribute to the
+reachability of CONTENTS. When CONTENTS is garbage-collected,
+`weak-box-ref' will return NIL."
+ (caar (set-weak-list-list
+ (load-time-value
+ (progn
+ (defvar #1=#:all-weak-boxes (make-weak-list 'assoc))
+ (defalias 'all-weak-boxes-list
+ ;; If the weak box code is actually used, this #'copy-list
+ ;; might be an issue in terms of GC. It isn't, currently, and
+ ;; so the protection against other callers modifying the list
+ ;; out from under the feet of our code is preferred.
+ #'(lambda () (copy-list (weak-list-list #1#))))
+ #1#))
+ (acons (vector 'cl-weak-box) contents (all-weak-boxes-list)))))
+
+(defun weak-box-ref (weak-box)
+ "Return the contents of weak box WEAK-BOX.
+If the contents have been GCed, return NIL."
+ (check-argument-type 'weak-box-p weak-box)
+ (cdr (assq weak-box (all-weak-boxes-list))))
+
;;; misc.el ends here
diff -r 39f424909e0c -r ab23fd48c3f8 src/ChangeLog
--- a/src/ChangeLog Sun Aug 12 17:52:59 2018 +0100
+++ b/src/ChangeLog Sun Aug 12 18:14:35 2018 +0100
@@ -1,3 +1,16 @@
+2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
+
+ * data.c:
+ * data.c (syms_of_data):
+ * data.c (vars_of_data):
+ * gc.c (gc_finish_mark):
+ * gc.c (gc_finalize):
+ * lisp.h:
+ * lrecord.h (enum lrecord_type):
+ Remove the weak-box implementation from C. It was never used
+ enough to merit being in C, and it is easily implemented in Lisp
+ using the weak list infrastructure.
+
2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
* gc.c (gc_finish_mark):
diff -r 39f424909e0c -r ab23fd48c3f8 src/data.c
--- a/src/data.c Sun Aug 12 17:52:59 2018 +0100
+++ b/src/data.c Sun Aug 12 18:14:35 2018 +0100
@@ -3637,135 +3637,6 @@
return new_list;
}
-
-/************************************************************************/
-/* weak boxes */
-/************************************************************************/
-
-static Lisp_Object Vall_weak_boxes; /* Gemarke es niemals ever!!! */
-
-void
-prune_weak_boxes (void)
-{
- Lisp_Object rest, prev = Qnil;
- int removep = 0;
-
- for (rest = Vall_weak_boxes;
- !NILP(rest);
- rest = XWEAK_BOX (rest)->next_weak_box)
- {
- if (! (marked_p (rest)))
- /* This weak box itself is garbage. */
- removep = 1;
-
- if (! marked_p (XWEAK_BOX (rest)->value))
- {
- XSET_WEAK_BOX (rest, Qnil);
- removep = 1;
- }
-
- if (removep)
- {
- /* Remove weak box from list. */
- if (NILP (prev))
- Vall_weak_boxes = XWEAK_BOX (rest)->next_weak_box;
- else
- XWEAK_BOX (prev)->next_weak_box = XWEAK_BOX (rest)->next_weak_box;
- removep = 0;
- }
- else
- prev = rest;
- }
-}
-
-static Lisp_Object
-mark_weak_box (Lisp_Object UNUSED (obj))
-{
- return Qnil;
-}
-
-static void
-print_weak_box (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
-{
- if (print_readably)
- {
- printing_unreadable_lisp_object (obj, 0);
- }
-
- write_ascstring (printcharfun, "#<weak-box ");
- print_internal (XWEAK_BOX (obj)->value, printcharfun, escapeflag);
- write_fmt_string (printcharfun, " 0x%x>", LISP_OBJECT_UID (obj));
-}
-
-static int
-weak_box_equal (Lisp_Object obj1, Lisp_Object obj2, int depth, int foldcase)
-{
- struct weak_box *wb1 = XWEAK_BOX (obj1);
- struct weak_box *wb2 = XWEAK_BOX (obj2);
-
- return (internal_equal_0 (wb1->value, wb2->value, depth + 1, foldcase));
-}
-
-static Hashcode
-weak_box_hash (Lisp_Object obj, int depth, Boolint equalp)
-{
- struct weak_box *wb = XWEAK_BOX (obj);
-
- return internal_hash (wb->value, depth + 1, equalp);
-}
-
-Lisp_Object
-make_weak_box (Lisp_Object value)
-{
- Lisp_Object result = ALLOC_NORMAL_LISP_OBJECT (weak_box);
- struct weak_box *wb = XWEAK_BOX (result);
-
- wb->value = value;
- result = wrap_weak_box (wb);
- wb->next_weak_box = Vall_weak_boxes;
- Vall_weak_boxes = result;
- return result;
-}
-
-static const struct memory_description weak_box_description[] = {
- { XD_LO_LINK, offsetof (struct weak_box, value) },
- { XD_END}
-};
-
-DEFINE_NODUMP_LISP_OBJECT ("weak-box", weak_box, mark_weak_box,
- print_weak_box, 0, weak_box_equal,
- weak_box_hash, weak_box_description,
- struct weak_box);
-
-DEFUN ("make-weak-box", Fmake_weak_box, 1, 1, 0, /*
-Return a new weak box from value CONTENTS.
-The weak box is a reference to CONTENTS which may be extracted with
-`weak-box-ref'. However, the weak box does not contribute to the
-reachability of CONTENTS. When CONTENTS is garbage-collected,
-`weak-box-ref' will return NIL.
-*/
- (value))
-{
- return make_weak_box (value);
-}
-
-DEFUN ("weak-box-ref", Fweak_box_ref, 1, 1, 0, /*
-Return the contents of weak box WEAK-BOX.
-If the contents have been GCed, return NIL.
-*/
- (weak_box))
-{
- return XWEAK_BOX (weak_box)->value;
-}
-
-DEFUN ("weak-box-p", Fweak_boxp, 1, 1, 0, /*
-Return non-nil if OBJECT is a weak box.
-*/
- (object))
-{
- return WEAK_BOXP (object) ? Qt : Qnil;
-}
-
/************************************************************************/
/* ephemerons */
/************************************************************************/
@@ -4357,7 +4228,6 @@
{
INIT_LISP_OBJECT (weak_list);
INIT_LISP_OBJECT (ephemeron);
- INIT_LISP_OBJECT (weak_box);
DEFSYMBOL (Qlambda);
DEFSYMBOL (Qlistp);
@@ -4467,9 +4337,6 @@
DEFSUBR (Fmake_ephemeron);
DEFSUBR (Fephemeron_ref);
DEFSUBR (Fephemeronp);
- DEFSUBR (Fmake_weak_box);
- DEFSUBR (Fweak_box_ref);
- DEFSUBR (Fweak_boxp);
}
void
@@ -4482,8 +4349,6 @@
Vfinalize_list = Qnil;
staticpro (&Vfinalize_list);
- DUMP_ADD_WEAK_OBJECT_CHAIN (Vall_weak_boxes);
-
DEFVAR_CONST_INT ("most-negative-fixnum", &Vmost_negative_fixnum /*
The fixnum closest in value to negative infinity.
*/);
diff -r 39f424909e0c -r ab23fd48c3f8 src/gc.c
--- a/src/gc.c Sun Aug 12 17:52:59 2018 +0100
+++ b/src/gc.c Sun Aug 12 18:14:35 2018 +0100
@@ -2146,14 +2146,15 @@
;
#endif /* not USE_KKCC */
- /* And prune (this needs to be called after everything else has been
- marked and before we do any sweeping). */
- /* #### this is somewhat ad-hoc and should probably be an object
- method */
+ /* And prune (this needs to be called after everything else has been marked
+ and before we do any sweeping). If you're considering whether you would
+ like to add a prune function for a new object type you have added,
+ consider implementing the mark-and-prune approach as a weak list first of
+ all, and only if that doesn't work or is uneconomic of memory, consider
+ adding another entry here. */
prune_weak_lists ();
prune_weak_hash_tables ();
prune_ephemerons ();
- prune_weak_boxes ();
}
#ifdef NEW_GC
diff -r 39f424909e0c -r ab23fd48c3f8 src/lisp.h
--- a/src/lisp.h Sun Aug 12 17:52:59 2018 +0100
+++ b/src/lisp.h Sun Aug 12 18:14:35 2018 +0100
@@ -3416,28 +3416,6 @@
Lisp_Object value,
Error_Behavior errb));
-/*---------------------------- weak boxes ------------------------------*/
-
-struct weak_box
-{
- NORMAL_LISP_OBJECT_HEADER header;
- Lisp_Object value;
-
- Lisp_Object next_weak_box; /* don't mark through this! */
-};
-
-void prune_weak_boxes (void);
-Lisp_Object make_weak_box (Lisp_Object value);
-Lisp_Object weak_box_ref (Lisp_Object value);
-
-DECLARE_LISP_OBJECT (weak_box, struct weak_box);
-#define XWEAK_BOX(x) XRECORD (x, weak_box, struct weak_box)
-#define XSET_WEAK_BOX(x, v) (XWEAK_BOX (x)->value = (v))
-#define wrap_weak_box(p) wrap_record (p, weak_box)
-#define WEAK_BOXP(x) RECORDP (x, weak_box)
-#define CHECK_WEAK_BOX(x) CHECK_RECORD (x, weak_box)
-#define CONCHECK_WEAK_BOX(x) CONCHECK_RECORD (x, weak_box)
-
/*--------------------------- ephemerons ----------------------------*/
struct ephemeron
diff -r 39f424909e0c -r ab23fd48c3f8 src/lrecord.h
--- a/src/lrecord.h Sun Aug 12 17:52:59 2018 +0100
+++ b/src/lrecord.h Sun Aug 12 18:14:35 2018 +0100
@@ -395,7 +395,6 @@
lrecord_type_tooltalk_message, /* Lisp_Tooltalk_Message */
lrecord_type_tooltalk_pattern, /* Lisp_Tooltalk_Pattern */
lrecord_type_vector, /* Lisp_Vector */
- lrecord_type_weak_box, /* struct weak_box */
lrecord_type_weak_list, /* struct weak_list */
lrecord_type_window, /* struct window */
lrecord_type_window_mirror, /* struct window_mirror */
--
‘As I sat looking up at the Guinness ad, I could never figure out /
How your man stayed up on the surfboard after forty pints of stout’
(C. Moore)
[View Less]
[COMMIT] Invert the order of prune_weak_lists() vs. prune_weak_hash_tables(), gc.c
6 years, 4 months
Aidan Kehoe
APPROVE COMMIT
NOTE: This patch has been committed
# HG changeset patch
# User Aidan Kehoe <kehoea(a)parhasard.net>
# Date 1534092779 -3600
# Sun Aug 12 17:52:59 2018 +0100
# Node ID 39f424909e0c055c65f16e855a9de8b806b04f0f
# Parent e3f754148ae1f883b101c7863e3448c813e6bc0d
Invert the order of prune_weak_lists() vs. prune_weak_hash_tables(), gc.c
src/ChangeLog addition:
2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
* gc.c (gc_finish_mark):
Move prune_weak_lists() …
[View More]before prune_weak_hash_tables(), so the
latter doesn't encounter garbage hash tables.
diff -r e3f754148ae1 -r 39f424909e0c src/ChangeLog
--- a/src/ChangeLog Sun Aug 12 15:18:54 2018 +0100
+++ b/src/ChangeLog Sun Aug 12 17:52:59 2018 +0100
@@ -1,3 +1,9 @@
+2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
+
+ * gc.c (gc_finish_mark):
+ Move prune_weak_lists() before prune_weak_hash_tables(), so the
+ latter doesn't encounter garbage hash tables.
+
2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
Use an explicit weak list object for the weak hash tables, too.
diff -r e3f754148ae1 -r 39f424909e0c src/gc.c
--- a/src/gc.c Sun Aug 12 15:18:54 2018 +0100
+++ b/src/gc.c Sun Aug 12 17:52:59 2018 +0100
@@ -2150,8 +2150,8 @@
marked and before we do any sweeping). */
/* #### this is somewhat ad-hoc and should probably be an object
method */
+ prune_weak_lists ();
prune_weak_hash_tables ();
- prune_weak_lists ();
prune_ephemerons ();
prune_weak_boxes ();
}
--
‘As I sat looking up at the Guinness ad, I could never figure out /
How your man stayed up on the surfboard after forty pints of stout’
(C. Moore)
[View Less]
[COMMIT] Use an explicit weak list object for the weak hash tables, too.
6 years, 4 months
Aidan Kehoe
APPROVE COMMIT
NOTE: This patch has been committed
# HG changeset patch
# User Aidan Kehoe <kehoea(a)parhasard.net>
# Date 1534083534 -3600
# Sun Aug 12 15:18:54 2018 +0100
# Node ID e3f754148ae1f883b101c7863e3448c813e6bc0d
# Parent 593de3c3ee78030276540da59f71602e7ea7e1a4
Use an explicit weak list object for the weak hash tables, too.
src/ChangeLog addition:
2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
Use an explicit weak list object for the weak hash tables, too.
…
[View More] * device.c:
* device.c (clear_all_console_local_caches): New. Provided so the
weak list code doesn't think various subwindow_instance_cache weak
hash tables are reachable at dump time.
* elhash.c:
* elhash.c (struct Lisp_Hash_Table):
Remove the next_weak chain pointer, it's not used for non-weak
hash tables, and we've moved to an explicit weak list object for
weak hash tables.
* elhash.c (make_general_lisp_hash_table):
Use the explicit weak list object.
* elhash.c (Fcopy_hash_table):
Ditto.
* elhash.c (finish_marking_weak_hash_tables):
Simplify, using the explicit weak list infrastructure.
* elhash.c (prune_weak_hash_tables):
Ditto.
* elhash.c (syms_of_elhash):
This can be simplified now we're using the explicit weak list
infrastructure.
* elhash.c (vars_of_elhash):
Ditto.
* glyphs.c:
* glyphs.c (clear_all_subwindow_instance_caches): New.
Clear a window's subwindow instance caches when dumping, so pdump
doesn't have to try to dump an image instance.
* glyphs.c (clear_frame_subwindow_instance_caches): New. When
handed a frame, clear its subwindow instance caches.
* glyphs.h:
Declare clear_frame_subwindow_instance_caches().
diff -r 593de3c3ee78 -r e3f754148ae1 src/ChangeLog
--- a/src/ChangeLog Sun Aug 12 01:30:52 2018 +0100
+++ b/src/ChangeLog Sun Aug 12 15:18:54 2018 +0100
@@ -1,3 +1,37 @@
+2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
+
+ Use an explicit weak list object for the weak hash tables, too.
+ * device.c:
+ * device.c (clear_all_console_local_caches): New. Provided so the
+ weak list code doesn't think various subwindow_instance_cache weak
+ hash tables are reachable at dump time.
+ * elhash.c:
+ * elhash.c (struct Lisp_Hash_Table):
+ Remove the next_weak chain pointer, it's not used for non-weak
+ hash tables, and we've moved to an explicit weak list object for
+ weak hash tables.
+ * elhash.c (make_general_lisp_hash_table):
+ Use the explicit weak list object.
+ * elhash.c (Fcopy_hash_table):
+ Ditto.
+ * elhash.c (finish_marking_weak_hash_tables):
+ Simplify, using the explicit weak list infrastructure.
+ * elhash.c (prune_weak_hash_tables):
+ Ditto.
+ * elhash.c (syms_of_elhash):
+ This can be simplified now we're using the explicit weak list
+ infrastructure.
+ * elhash.c (vars_of_elhash):
+ Ditto.
+ * glyphs.c:
+ * glyphs.c (clear_all_subwindow_instance_caches): New.
+ Clear a window's subwindow instance caches when dumping, so pdump
+ doesn't have to try to dump an image instance.
+ * glyphs.c (clear_frame_subwindow_instance_caches): New. When
+ handed a frame, clear its subwindow instance caches.
+ * glyphs.h:
+ Declare clear_frame_subwindow_instance_caches().
+
2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
Use an explicit weak list object for the syntax table and
diff -r 593de3c3ee78 -r e3f754148ae1 src/device.c
--- a/src/device.c Sun Aug 12 01:30:52 2018 +0100
+++ b/src/device.c Sun Aug 12 15:18:54 2018 +0100
@@ -35,6 +35,7 @@
#include "events.h"
#include "faces.h"
#include "frame-impl.h"
+#include "glyphs.h"
#include "keymap.h"
#include "fontcolor.h"
#include "redisplay.h"
@@ -457,10 +458,35 @@
Vdefault_device_plist = Fplist_put (Vdefault_device_plist, type, device);
}
+static void
+clear_all_console_local_caches (void)
+{
+ Lisp_Object concons;
+
+ CONSOLE_LOOP (concons)
+ {
+ Lisp_Object console = XCAR (concons);
+
+ LIST_LOOP_2 (device, CONSOLE_DEVICE_LIST (XCONSOLE (console)))
+ {
+ Lisp_Object frmcons;
+ struct device *d = XDEVICE (device);
+
+ d->image_instance_cache = Qnil;
+
+ DEVICE_FRAME_LOOP (frmcons, d)
+ {
+ clear_frame_subwindow_instance_caches (XFRAME (XCAR (frmcons)));
+ }
+ }
+ }
+}
+
void
clear_default_devices (void)
{
Vdefault_device_plist = Qnil;
+ clear_all_console_local_caches ();
}
static Lisp_Object
diff -r 593de3c3ee78 -r e3f754148ae1 src/elhash.c
--- a/src/elhash.c Sun Aug 12 01:30:52 2018 +0100
+++ b/src/elhash.c Sun Aug 12 15:18:54 2018 +0100
@@ -157,8 +157,6 @@
htentry *hentries;
Lisp_Object test;
enum hash_table_weakness weakness;
- Lisp_Object next_weak; /* Used to chain together all of the weak
- hash tables. Don't mark through this. */
};
#define CLEAR_HTENTRY(htentry) \
@@ -704,7 +702,6 @@
{ XD_INT, offsetof (Lisp_Hash_Table, weakness) },
{ XD_UNION, offsetof (Lisp_Hash_Table, hentries), XD_INDIRECT (1, 0),
{ &htentry_union_description } },
- { XD_LO_LINK, offsetof (Lisp_Hash_Table, next_weak) },
{ XD_LISP_OBJECT,offsetof (Lisp_Hash_Table, test) },
{ XD_END }
};
@@ -787,10 +784,11 @@
/* We leave room for one never-occupied sentinel htentry at the end. */
ht->hentries = allocate_hash_table_entries (ht->size + 1);
- if (weakness == HASH_TABLE_NON_WEAK)
- ht->next_weak = Qunbound;
- else
- ht->next_weak = Vall_weak_hash_tables, Vall_weak_hash_tables = hash_table;
+ if (weakness != HASH_TABLE_NON_WEAK)
+ {
+ XWEAK_LIST_LIST (Vall_weak_hash_tables)
+ = Fcons (hash_table, XWEAK_LIST_LIST (Vall_weak_hash_tables));
+ }
return hash_table;
}
@@ -1265,11 +1263,10 @@
/* We leave room for one never-occupied sentinel htentry at the end. */
ht->hentries = allocate_hash_table_entries (ht_old->size + 1);
memcpy (ht->hentries, ht_old->hentries, (ht_old->size + 1) * sizeof (htentry));
-
- if (! EQ (ht->next_weak, Qunbound))
+ if (ht->weakness != HASH_TABLE_NON_WEAK)
{
- ht->next_weak = Vall_weak_hash_tables;
- Vall_weak_hash_tables = obj;
+ XWEAK_LIST_LIST (Vall_weak_hash_tables)
+ = Fcons (hash_table, XWEAK_LIST_LIST (Vall_weak_hash_tables));
}
return obj;
@@ -2170,20 +2167,20 @@
int
finish_marking_weak_hash_tables (void)
{
- Lisp_Object hash_table;
int did_mark = 0;
- for (hash_table = Vall_weak_hash_tables;
- !NILP (hash_table);
- hash_table = XHASH_TABLE (hash_table)->next_weak)
+ LIST_LOOP_2 (hash_table, XWEAK_LIST_LIST (Vall_weak_hash_tables))
{
const Lisp_Hash_Table *ht = XHASH_TABLE (hash_table);
const htentry *e = ht->hentries;
const htentry *sentinel = e + ht->size;
- if (! marked_p (hash_table))
- /* The hash table is probably garbage. Ignore it. */
- continue;
+ if (!marked_p (hash_table))
+ {
+ /* This hash table itself is garbage, let prune_weak_lists() remove
+ it. */
+ continue;
+ }
/* Now, scan over all the pairs. For all pairs that are
half-marked, we may need to mark the other half if we're
@@ -2264,43 +2261,27 @@
void
prune_weak_hash_tables (void)
{
- Lisp_Object hash_table, prev = Qnil;
- for (hash_table = Vall_weak_hash_tables;
- !NILP (hash_table);
- hash_table = XHASH_TABLE (hash_table)->next_weak)
+ LIST_LOOP_2 (hash_table, XWEAK_LIST_LIST (Vall_weak_hash_tables))
{
- if (! marked_p (hash_table))
- {
- /* This hash table itself is garbage. Remove it from the list. */
- if (NILP (prev))
- Vall_weak_hash_tables = XHASH_TABLE (hash_table)->next_weak;
- else
- XHASH_TABLE (prev)->next_weak = XHASH_TABLE (hash_table)->next_weak;
- }
- else
- {
- /* Now, scan over all the pairs. Remove all of the pairs
- in which the key or value, or both, is unmarked
- (depending on the weakness of the hash table). */
- Lisp_Hash_Table *ht = XHASH_TABLE (hash_table);
- htentry *entries = ht->hentries;
- htentry *sentinel = entries + ht->size;
- htentry *e;
-
- for (e = entries; e < sentinel; e++)
- if (!HTENTRY_CLEAR_P (e))
- {
- again:
- if (!marked_p (e->key) || !marked_p (e->value))
- {
- remhash_1 (ht, entries, e);
- if (!HTENTRY_CLEAR_P (e))
- goto again;
- }
- }
-
- prev = hash_table;
- }
+ /* Now, scan over all the pairs. Remove all of the pairs
+ in which the key or value, or both, is unmarked
+ (depending on the weakness of the hash table). */
+ Lisp_Hash_Table *ht = XHASH_TABLE (hash_table);
+ htentry *entries = ht->hentries;
+ htentry *sentinel = entries + ht->size;
+ htentry *e;
+
+ for (e = entries; e < sentinel; e++)
+ if (!HTENTRY_CLEAR_P (e))
+ {
+ again:
+ if (!marked_p (e->key) || !marked_p (e->value))
+ {
+ remhash_1 (ht, entries, e);
+ if (!HTENTRY_CLEAR_P (e))
+ goto again;
+ }
+ }
}
}
@@ -2837,13 +2818,6 @@
void
syms_of_elhash (void)
{
- /* This was set incorrectly since init_elhash_once_early() was called before
- Qunbound had a useful value. */
- xhash_table (Vobarray)->next_weak = Qunbound;
-
- /* This must NOT be staticpro'd */
- DUMP_ADD_WEAK_OBJECT_CHAIN (Vall_weak_hash_tables);
-
staticpro (&Vhash_table_test_weak_list);
Vhash_table_test_weak_list = make_weak_list (WEAK_LIST_KEY_ASSOC);
/* syms_of_elhash() is called *very* early, don't confuse the weak list code
@@ -2970,6 +2944,10 @@
Vhash_table_test_weak_list = make_weak_list (WEAK_LIST_KEY_ASSOC);
XWEAK_LIST_LIST (Vhash_table_test_weak_list) = weak_list_list;
+ gc_checking_assert (EQ (Vall_weak_hash_tables, Qnull_pointer));
+ Vall_weak_hash_tables = make_weak_list (WEAK_LIST_SIMPLE);
+ staticpro (&Vall_weak_hash_tables);
+
#ifdef MEMORY_USAGE_STATS
OBJECT_HAS_PROPERTY
(hash_table, memusage_stats_list, list1 (intern ("hash-entries")));
diff -r 593de3c3ee78 -r e3f754148ae1 src/glyphs.c
--- a/src/glyphs.c Sun Aug 12 01:30:52 2018 +0100
+++ b/src/glyphs.c Sun Aug 12 15:18:54 2018 +0100
@@ -4594,6 +4594,25 @@
}
}
+static void
+clear_all_subwindow_instance_caches (struct window *w)
+{
+ if (!NILP (w->next)) clear_all_subwindow_instance_caches (XWINDOW (w->next));
+ if (!NILP (w->vchild)) clear_all_subwindow_instance_caches (XWINDOW (w->vchild));
+ if (!NILP (w->hchild)) clear_all_subwindow_instance_caches (XWINDOW (w->hchild));
+
+ /* Setting w->subwindow_instance_cache to Qnil trips some assertion failures
+ elsewhere on shutdown. */
+ Fclrhash (w->subwindow_instance_cache);
+}
+
+/* Used when dumping, so no image instances need to be dumped. */
+void
+clear_frame_subwindow_instance_caches (struct frame* f)
+{
+ clear_all_subwindow_instance_caches (XWINDOW (f->root_window));
+}
+
/*****************************************************************************
* subwindow exposure ignorance *
*****************************************************************************/
diff -r 593de3c3ee78 -r e3f754148ae1 src/glyphs.h
--- a/src/glyphs.h Sun Aug 12 01:30:52 2018 +0100
+++ b/src/glyphs.h Sun Aug 12 15:18:54 2018 +0100
@@ -1191,6 +1191,8 @@
int unmap_subwindow_instance_cache_mapper (Lisp_Object key,
Lisp_Object value, void* finalize);
+void clear_frame_subwindow_instance_caches (struct frame*);
+
struct expose_ignore
{
#ifdef NEW_GC
--
‘As I sat looking up at the Guinness ad, I could never figure out /
How your man stayed up on the surfboard after forty pints of stout’
(C. Moore)
[View Less]
[COMMIT] Use explicit weak list objects for syntax table, specifier chains
6 years, 4 months
Aidan Kehoe
APPROVE COMMIT
NOTE: This patch has been committed
# HG changeset patch
# User Aidan Kehoe <kehoea(a)parhasard.net>
# Date 1534033852 -3600
# Sun Aug 12 01:30:52 2018 +0100
# Node ID 593de3c3ee78030276540da59f71602e7ea7e1a4
# Parent 4280f7a3c20943225b9761f20d152881fc4c3c95
Use explicit weak list objects for syntax table, specifier chains
src/ChangeLog addition:
2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
Use an explicit weak list object for the syntax table and
…
[View More]specifier chains, no need for separate code and slots in the
chartab and specifier objects.
* chartab.c:
* chartab.c (prune_syntax_tables): Removed.
* chartab.c (decode_char_table_range):
* chartab.c (make_char_table):
* chartab.c (Fcopy_char_table):
* chartab.c (vars_of_chartab):
Vall_syntax_tables is now an explicit weak list object.
* chartab.h:
* chartab.h (struct Lisp_Char_Table):
Remove the next_table chain element from this struct.
* emacs.c (main_1):
Move vars_of_data() even earlier in the startup sequence, so
Vall_weak_lists is available.
* gc.c (gc_finish_mark):
No longer call prune_specifiers(), prune_syntax_tables().
* specifier.c:
* specifier.c (cleanup_specifiers):
* specifier.c (kill_specifier_buffer_locals):
* specifier.c (make_specifier_internal):
* specifier.c (vars_of_specifier):
* specifier.h (struct Lisp_Specifier):
Remove prune_specifiers and the next_specifier element in the
struct.
* syntax.c (update_syntax_table):
Loop through the weak list list of Vall_syntax_tables, rather than
chaining through the next_table slot.
diff -r 4280f7a3c209 -r 593de3c3ee78 src/ChangeLog
--- a/src/ChangeLog Sat Aug 11 21:09:02 2018 +0100
+++ b/src/ChangeLog Sun Aug 12 01:30:52 2018 +0100
@@ -1,3 +1,35 @@
+2018-08-12 Aidan Kehoe <kehoea(a)parhasard.net>
+
+ Use an explicit weak list object for the syntax table and
+ specifier chains, no need for separate code and slots in the
+ chartab and specifier objects.
+ * chartab.c:
+ * chartab.c (prune_syntax_tables): Removed.
+ * chartab.c (decode_char_table_range):
+ * chartab.c (make_char_table):
+ * chartab.c (Fcopy_char_table):
+ * chartab.c (vars_of_chartab):
+ Vall_syntax_tables is now an explicit weak list object.
+ * chartab.h:
+ * chartab.h (struct Lisp_Char_Table):
+ Remove the next_table chain element from this struct.
+ * emacs.c (main_1):
+ Move vars_of_data() even earlier in the startup sequence, so
+ Vall_weak_lists is available.
+ * gc.c (gc_finish_mark):
+ No longer call prune_specifiers(), prune_syntax_tables().
+ * specifier.c:
+ * specifier.c (cleanup_specifiers):
+ * specifier.c (kill_specifier_buffer_locals):
+ * specifier.c (make_specifier_internal):
+ * specifier.c (vars_of_specifier):
+ * specifier.h (struct Lisp_Specifier):
+ Remove prune_specifiers and the next_specifier element in the
+ struct.
+ * syntax.c (update_syntax_table):
+ Loop through the weak list list of Vall_syntax_tables, rather than
+ chaining through the next_table slot.
+
2018-08-09 Aidan Kehoe <kehoea(a)parhasard.net>
* lisp.h (XSET_STRING_ASCII_BEGIN):
diff -r 4280f7a3c209 -r 593de3c3ee78 src/chartab.c
--- a/src/chartab.c Sat Aug 11 21:09:02 2018 +0100
+++ b/src/chartab.c Sun Aug 12 01:30:52 2018 +0100
@@ -1145,7 +1145,6 @@
{ XD_LISP_OBJECT, offsetof (Lisp_Char_Table, table) },
{ XD_LISP_OBJECT, offsetof (Lisp_Char_Table, parent) },
{ XD_LISP_OBJECT, offsetof (Lisp_Char_Table, default_) },
- { XD_LO_LINK, offsetof (Lisp_Char_Table, next_table) },
#ifdef MIRROR_TABLE
{ XD_LISP_OBJECT, offsetof (Lisp_Char_Table, mirror_table) },
#endif /* MIRROR_TABLE */
@@ -1158,31 +1157,6 @@
char_table_description,
Lisp_Char_Table);
-/* WARNING: All functions of this nature need to be written extremely
- carefully to avoid crashes during GC. Cf. prune_specifiers()
- and prune_weak_hash_tables(). */
-
-void
-prune_syntax_tables (void)
-{
- Lisp_Object rest, prev = Qnil;
-
- for (rest = Vall_syntax_tables;
- !NILP (rest);
- rest = XCHAR_TABLE (rest)->next_table)
- {
- if (! marked_p (rest))
- {
- /* This table is garbage. Remove it from the list. */
- if (NILP (prev))
- Vall_syntax_tables = XCHAR_TABLE (rest)->next_table;
- else
- XCHAR_TABLE (prev)->next_table =
- XCHAR_TABLE (rest)->next_table;
- }
- }
-}
-
static void
decode_char_table_range (Lisp_Object range, struct chartab_range *outrange)
{
@@ -1361,13 +1335,12 @@
else
ct->mirror_table = Qnil;
#endif /* MIRROR_TABLE */
- ct->next_table = Qnil;
ct->parent = Qnil;
ct->default_ = Qnil;
if (ty == CHAR_TABLE_TYPE_SYNTAX)
{
- ct->next_table = Vall_syntax_tables;
- Vall_syntax_tables = obj;
+ XWEAK_LIST_LIST (Vall_syntax_tables)
+ = Fcons (obj, XWEAK_LIST_LIST (Vall_syntax_tables));
}
Freset_char_table (obj);
return obj;
@@ -1484,12 +1457,10 @@
else
ctnew->mirror_table = Qnil;
#endif /* MIRROR_TABLE */
-
- ctnew->next_table = Qnil;
if (ctnew->type == CHAR_TABLE_TYPE_SYNTAX)
{
- ctnew->next_table = Vall_syntax_tables;
- Vall_syntax_tables = obj;
+ XWEAK_LIST_LIST (Vall_syntax_tables)
+ = Fcons (obj, XWEAK_LIST_LIST (Vall_syntax_tables));
}
return obj;
}
@@ -2522,8 +2493,8 @@
(char_table, memusage_stats_list, list2 (Qt, Qpage_tables));
#endif /* MEMORY_USAGE_STATS */
- /* DO NOT staticpro this. It works just like Vweak_hash_tables. */
- DUMP_ADD_WEAK_OBJECT_CHAIN (Vall_syntax_tables);
+ staticpro (&Vall_syntax_tables);
+ Vall_syntax_tables = make_weak_list (WEAK_LIST_SIMPLE);
/* The value at level 4 is not 2^32 - 1. With 32-bit EMACS_INTs, it's
2^30 - 1 because characters are only 30 bits wide. */
diff -r 4280f7a3c209 -r 593de3c3ee78 src/chartab.h
--- a/src/chartab.h Sat Aug 11 21:09:02 2018 +0100
+++ b/src/chartab.h Sun Aug 12 01:30:52 2018 +0100
@@ -183,7 +183,6 @@
enum char_table_type type;
- Lisp_Object next_table; /* DO NOT mark through this. */
#ifdef MIRROR_TABLE
/* stuff used for syntax tables */
Lisp_Object mirror_table; /* points to mirror table for this table
@@ -224,7 +223,6 @@
#endif /* (not) MULE */
#define XCHAR_TABLE_CATEGORY_P(ct) CHAR_TABLE_CATEGORY_P (XCHAR_TABLE (ct))
-#define XCHAR_TABLE_NEXT_TABLE(ct) (XCHAR_TABLE (ct)->next_table)
#ifdef MIRROR_TABLE
#define XCHAR_TABLE_MIRROR_TABLE(ct) (XCHAR_TABLE (ct)->mirror_table)
#define XCHAR_TABLE_DIRTY(ct) (XCHAR_TABLE (ct)->dirty)
diff -r 4280f7a3c209 -r 593de3c3ee78 src/emacs.c
--- a/src/emacs.c Sat Aug 11 21:09:02 2018 +0100
+++ b/src/emacs.c Sun Aug 12 01:30:52 2018 +0100
@@ -2067,8 +2067,9 @@
/* Now allow Fprovide() statements to be made. */
init_provide_once ();
+ vars_of_data ();
+ vars_of_alloc ();
vars_of_abbrev ();
- vars_of_alloc ();
vars_of_buffer ();
vars_of_bytecode ();
vars_of_callint ();
@@ -2077,7 +2078,6 @@
vars_of_cmdloop ();
vars_of_cmds ();
vars_of_console ();
- vars_of_data ();
vars_of_specifier ();
#ifdef DEBUG_XEMACS
diff -r 4280f7a3c209 -r 593de3c3ee78 src/gc.c
--- a/src/gc.c Sat Aug 11 21:09:02 2018 +0100
+++ b/src/gc.c Sun Aug 12 01:30:52 2018 +0100
@@ -2152,9 +2152,6 @@
method */
prune_weak_hash_tables ();
prune_weak_lists ();
- prune_specifiers ();
- prune_syntax_tables ();
-
prune_ephemerons ();
prune_weak_boxes ();
}
diff -r 4280f7a3c209 -r 593de3c3ee78 src/specifier.c
--- a/src/specifier.c Sat Aug 11 21:09:02 2018 +0100
+++ b/src/specifier.c Sun Aug 12 01:30:52 2018 +0100
@@ -95,9 +95,7 @@
static Lisp_Object Vspecifier_type_list;
static Lisp_Object Vcached_specifiers;
-/* Do NOT mark through this, or specifiers will never be GC'd. */
static Lisp_Object Vall_specifiers;
-
static Lisp_Object Vunlock_ghost_specifiers;
/* #### The purpose of this is to check for inheritance loops
@@ -207,13 +205,9 @@
void
cleanup_specifiers (void)
{
- Lisp_Object rest;
-
- for (rest = Vall_specifiers;
- !NILP (rest);
- rest = XSPECIFIER (rest)->next_specifier)
+ LIST_LOOP_2 (elt, XWEAK_LIST_LIST (Vall_specifiers))
{
- Lisp_Specifier *sp = XSPECIFIER (rest);
+ Lisp_Specifier *sp = XSPECIFIER (elt);
/* This effectively changes the specifier specs.
However, there's no need to call
recompute_cached_specifier_everywhere() or the
@@ -234,20 +228,16 @@
void
kill_specifier_buffer_locals (Lisp_Object buffer)
{
- Lisp_Object rest;
-
- for (rest = Vall_specifiers;
- !NILP (rest);
- rest = XSPECIFIER (rest)->next_specifier)
+ LIST_LOOP_2 (elt, XWEAK_LIST_LIST (Vall_specifiers))
{
- Lisp_Specifier *sp = XSPECIFIER (rest);
+ Lisp_Specifier *sp = XSPECIFIER (elt);
/* Make sure we're actually going to be changing something.
Fremove_specifier() always calls
recompute_cached_specifier_everywhere() (#### but should
be smarter about this). */
if (!NILP (assq_no_quit (buffer, sp->buffer_specs)))
- Fremove_specifier (rest, buffer, Qnil, Qnil);
+ Fremove_specifier (elt, buffer, Qnil, Qnil);
}
}
@@ -283,38 +273,10 @@
converted to live ones again if the dead object is in a window
configuration. Therefore, for windows, "no longer in use"
corresponds to when the window object is garbage-collected.
- We now use weak lists for this purpose.
-
-*/
-
-void
-prune_specifiers (void)
-{
- Lisp_Object rest, prev = Qnil;
-
- for (rest = Vall_specifiers;
- !NILP (rest);
- rest = XSPECIFIER (rest)->next_specifier)
- {
- if (! marked_p (rest))
- {
- Lisp_Specifier* sp = XSPECIFIER (rest);
- /* A bit of assertion that we're removing both parts of the
- magic one altogether */
- assert (!MAGIC_SPECIFIER_P (sp)
- || (BODILY_SPECIFIER_P (sp) && marked_p (sp->fallback))
- || (GHOST_SPECIFIER_P (sp) && marked_p (sp->magic_parent)));
- /* This specifier is garbage. Remove it from the list. */
- if (NILP (prev))
- Vall_specifiers = sp->next_specifier;
- else
- XSPECIFIER (prev)->next_specifier = sp->next_specifier;
- }
- else
- prev = rest;
- }
-}
-
+ We now use weak lists for this purpose.
+
+ [old prune_specifiers () elided.] */
+
static Lisp_Object specifier_get_external_inst_list (Lisp_Object specifier,
Lisp_Object locale,
enum spec_locale_type,
@@ -483,7 +445,6 @@
const struct memory_description specifier_description[] = {
{ XD_BLOCK_PTR, offsetof (Lisp_Specifier, methods), 1,
{ &specifier_methods_description } },
- { XD_LO_LINK, offsetof (Lisp_Specifier, next_specifier) },
{ XD_LISP_OBJECT, offsetof (Lisp_Specifier, global_specs) },
{ XD_LISP_OBJECT, offsetof (Lisp_Specifier, device_specs) },
{ XD_LISP_OBJECT, offsetof (Lisp_Specifier, frame_specs) },
@@ -593,9 +554,9 @@
sp->fallback = Qnil;
sp->magic_parent = Qnil;
sp->caching = 0;
- sp->next_specifier = Vall_specifiers;
-
- Vall_specifiers = specifier;
+
+ XWEAK_LIST_LIST (Vall_specifiers)
+ = Fcons (specifier, XWEAK_LIST_LIST (Vall_specifiers));
if (call_create_meth)
{
@@ -4015,9 +3976,8 @@
Vcached_specifiers = Qnil;
staticpro (&Vcached_specifiers);
- /* Do NOT mark through this, or specifiers will never be GC'd.
- This is the same deal as for weak hash tables. */
- DUMP_ADD_WEAK_OBJECT_CHAIN (Vall_specifiers);
+ Vall_specifiers = make_weak_list (WEAK_LIST_SIMPLE);
+ staticpro (&Vall_specifiers);
Vuser_defined_tags = Qnil;
staticpro (&Vuser_defined_tags);
diff -r 4280f7a3c209 -r 593de3c3ee78 src/specifier.h
--- a/src/specifier.h Sat Aug 11 21:09:02 2018 +0100
+++ b/src/specifier.h Sun Aug 12 01:30:52 2018 +0100
@@ -222,11 +222,6 @@
NORMAL_LISP_OBJECT_HEADER header;
struct specifier_methods *methods;
- /* we keep a chained list of all current specifiers, for GC cleanup
- purposes. Do NOT mark through this, or specifiers will never
- be GC'd. */
- Lisp_Object next_specifier;
-
/* This is a straight list of instantiators. */
Lisp_Object global_specs;
diff -r 4280f7a3c209 -r 593de3c3ee78 src/syntax.c
--- a/src/syntax.c Sat Aug 11 21:09:02 2018 +0100
+++ b/src/syntax.c Sun Aug 12 01:30:52 2018 +0100
@@ -2378,11 +2378,10 @@
assert (XCHAR_TABLE (table)->mirror_table_p);
if (EQ (nonmirror, Vstandard_syntax_table))
{
- Lisp_Object syntab;
-
- for (syntab = Vall_syntax_tables; !NILP (syntab);
- syntab = XCHAR_TABLE (syntab)->next_table)
- update_just_this_syntax_table (syntab);
+ LIST_LOOP_2 (syntab, XWEAK_LIST_LIST (Vall_syntax_tables))
+ {
+ update_just_this_syntax_table (syntab);
+ }
}
else
update_just_this_syntax_table (nonmirror);
--
‘As I sat looking up at the Guinness ad, I could never figure out /
How your man stayed up on the surfboard after forty pints of stout’
(C. Moore)
[View Less]
[COMMIT] Fix an intermittent bug in error_or_quit_failed_instantiator_in_domain().
6 years, 4 months
Aidan Kehoe
This manifested itself as intermittent crashes in the presence of glyphs that
XEmacs had trouble converting into images. The crux of the issue was that a
value that should have been on the Vall_weak_lists weak object chain wasn’t,
and so prune_weak_lists() missed it.
A more elegant approach to this, and an approach that would remove build-time
C-function order dependencies, would be to have Qnull_pointer represent the
end of one of these object chains, rather than Qnil as we do now. Then we
…
[View More]wouldn’t need a special initialisation in the syms_of_*() or vars_of_*()
functions, though we would still need dump_add_weak_object_chain() calls for
the sake of pdump. But the current approach will flush out the bug above going
forward.
APPROVE COMMIT
NOTE: This patch has been committed.
# HG changeset patch
# User Aidan Kehoe <kehoea(a)parhasard.net>
# Date 1534018142 -3600
# Sat Aug 11 21:09:02 2018 +0100
# Node ID 4280f7a3c20943225b9761f20d152881fc4c3c95
# Parent 881402f49f9cc477816cc360a8cbee04b631f4b9
Fix an intermittent bug in error_or_quit_failed_instantiator_in_domain().
src/ChangeLog addition:
2018-08-11 Aidan Kehoe <kehoea(a)parhasard.net>
* emacs.c (main_1):
vars_of_specifier() uses the weak list infrastructure, and so it
needs to be called after vars_of_data() so that the Vall_weak_lists
object chain is initialised correctly.
* lrecord.h:
* lrecord.h (DUMP_ADD_WEAK_OBJECT_CHAIN):
New #define, check that an object chain variable is the NULL
pointer (as will be the case at early startup if it has not yet
been used), then initialise it to Qnil and call
dump_add_weak_object_chain(&var). Avoids the bug just fixed in
main_1().
* chartab.c (vars_of_chartab):
Use it.
* data.c:
Make Vall_weak_lists available to elhash.c, which has some code
that needs to modify it very early.
* data.c (vars_of_data):
Use it.
* elhash.c:
* elhash.c (syms_of_elhash):
Call DUMP_ADD_WEAK_OBJECT_CHAIN() as appropriate. Set
Vall_weak_lists Qnull_pointer after creating a weak list; the
initial value will be corrupt.
* specifier.c (vars_of_specifier):
Call DUMP_ADD_WEAK_OBJECT_CHAIN() here.
diff -r 881402f49f9c -r 4280f7a3c209 src/ChangeLog
--- a/src/ChangeLog Thu Aug 09 23:24:28 2018 +0100
+++ b/src/ChangeLog Sat Aug 11 21:09:02 2018 +0100
@@ -5,6 +5,34 @@
debug build. Non-debug builds had a performance issue, not a
correctness issue.
+2018-08-11 Aidan Kehoe <kehoea(a)parhasard.net>
+
+ * emacs.c (main_1):
+ vars_of_specifier() uses the weak list infrastructure, and so it
+ needs to be called after vars_of_data() so that the Vall_weak_lists
+ object chain is initialised correctly.
+ * lrecord.h:
+ * lrecord.h (DUMP_ADD_WEAK_OBJECT_CHAIN):
+ New #define, check that an object chain variable is the NULL
+ pointer (as will be the case at early startup if it has not yet
+ been used), then initialise it to Qnil and call
+ dump_add_weak_object_chain(&var). Avoids the bug just fixed in
+ main_1().
+ * chartab.c (vars_of_chartab):
+ Use it.
+ * data.c:
+ Make Vall_weak_lists available to elhash.c, which has some code
+ that needs to modify it very early.
+ * data.c (vars_of_data):
+ Use it.
+ * elhash.c:
+ * elhash.c (syms_of_elhash):
+ Call DUMP_ADD_WEAK_OBJECT_CHAIN() as appropriate. Set
+ Vall_weak_lists Qnull_pointer after creating a weak list; the
+ initial value will be corrupt.
+ * specifier.c (vars_of_specifier):
+ Call DUMP_ADD_WEAK_OBJECT_CHAIN() here.
+
2018-07-11 Aidan Kehoe <kehoea(a)parhasard.net>
* data.c:
diff -r 881402f49f9c -r 4280f7a3c209 src/chartab.c
--- a/src/chartab.c Thu Aug 09 23:24:28 2018 +0100
+++ b/src/chartab.c Sat Aug 11 21:09:02 2018 +0100
@@ -2523,8 +2523,7 @@
#endif /* MEMORY_USAGE_STATS */
/* DO NOT staticpro this. It works just like Vweak_hash_tables. */
- Vall_syntax_tables = Qnil;
- dump_add_weak_object_chain (&Vall_syntax_tables);
+ DUMP_ADD_WEAK_OBJECT_CHAIN (Vall_syntax_tables);
/* The value at level 4 is not 2^32 - 1. With 32-bit EMACS_INTs, it's
2^30 - 1 because characters are only 30 bits wide. */
diff -r 881402f49f9c -r 4280f7a3c209 src/data.c
--- a/src/data.c Thu Aug 09 23:24:28 2018 +0100
+++ b/src/data.c Sat Aug 11 21:09:02 2018 +0100
@@ -3193,7 +3193,7 @@
remove them. This is analogous to weak hash tables; see the explanation
there for more info. */
-static Lisp_Object Vall_weak_lists; /* Gemarke es nicht!!! */
+Lisp_Object Vall_weak_lists; /* Gemarke es nicht!!! */
static Lisp_Object encode_weak_list_type (enum weak_list_type type);
@@ -4475,18 +4475,14 @@
void
vars_of_data (void)
{
- /* This must not be staticpro'd */
- Vall_weak_lists = Qnil;
- dump_add_weak_object_chain (&Vall_weak_lists);
-
- Vall_ephemerons = Qnil;
- dump_add_weak_object_chain (&Vall_ephemerons);
+ DUMP_ADD_WEAK_OBJECT_CHAIN (Vall_weak_lists);
+
+ DUMP_ADD_WEAK_OBJECT_CHAIN (Vall_ephemerons);
Vfinalize_list = Qnil;
staticpro (&Vfinalize_list);
- Vall_weak_boxes = Qnil;
- dump_add_weak_object_chain (&Vall_weak_boxes);
+ DUMP_ADD_WEAK_OBJECT_CHAIN (Vall_weak_boxes);
DEFVAR_CONST_INT ("most-negative-fixnum", &Vmost_negative_fixnum /*
The fixnum closest in value to negative infinity.
diff -r 881402f49f9c -r 4280f7a3c209 src/elhash.c
--- a/src/elhash.c Thu Aug 09 23:24:28 2018 +0100
+++ b/src/elhash.c Sat Aug 11 21:09:02 2018 +0100
@@ -2832,6 +2832,8 @@
OBJECT_HAS_METHOD (hash_table, nsubst_structures_descend);
}
+extern Lisp_Object Vall_weak_lists;
+
void
syms_of_elhash (void)
{
@@ -2840,11 +2842,14 @@
xhash_table (Vobarray)->next_weak = Qunbound;
/* This must NOT be staticpro'd */
- Vall_weak_hash_tables = Qnil;
- dump_add_weak_object_chain (&Vall_weak_hash_tables);
+ DUMP_ADD_WEAK_OBJECT_CHAIN (Vall_weak_hash_tables);
staticpro (&Vhash_table_test_weak_list);
Vhash_table_test_weak_list = make_weak_list (WEAK_LIST_KEY_ASSOC);
+ /* syms_of_elhash() is called *very* early, don't confuse the weak list code
+ in data.c. See also the other code to correct this in
+ vars_of_elhash(). */
+ Vall_weak_lists = Qnull_pointer;
DEFSYMBOL (Qeq);
DEFSYMBOL (Qeql);
diff -r 881402f49f9c -r 4280f7a3c209 src/emacs.c
--- a/src/emacs.c Thu Aug 09 23:24:28 2018 +0100
+++ b/src/emacs.c Sat Aug 11 21:09:02 2018 +0100
@@ -2067,9 +2067,6 @@
/* Now allow Fprovide() statements to be made. */
init_provide_once ();
- /* Do that before any specifier creation (esp. vars_of_glyphs()) */
- vars_of_specifier ();
-
vars_of_abbrev ();
vars_of_alloc ();
vars_of_buffer ();
@@ -2081,6 +2078,8 @@
vars_of_cmds ();
vars_of_console ();
vars_of_data ();
+ vars_of_specifier ();
+
#ifdef DEBUG_XEMACS
vars_of_debug ();
vars_of_tests ();
diff -r 881402f49f9c -r 4280f7a3c209 src/lrecord.h
--- a/src/lrecord.h Thu Aug 09 23:24:28 2018 +0100
+++ b/src/lrecord.h Sat Aug 11 21:09:02 2018 +0100
@@ -2223,6 +2223,13 @@
#define dump_add_weak_object_chain(varaddr) DO_NOTHING
#endif
+#define DUMP_ADD_WEAK_OBJECT_CHAIN(var) do { \
+ /* Don't add to the chain before marking it for dumping! */ \
+ gc_checking_assert (EQ (var, Qnull_pointer)); \
+ var = Qnil; \
+ dump_add_weak_object_chain (&var); \
+ } while (0)
+
/* Nonzero means Emacs has already been initialized.
Used during startup to detect startup of dumped Emacs. */
extern MODULE_API int initialized;
diff -r 881402f49f9c -r 4280f7a3c209 src/specifier.c
--- a/src/specifier.c Thu Aug 09 23:24:28 2018 +0100
+++ b/src/specifier.c Sat Aug 11 21:09:02 2018 +0100
@@ -4017,8 +4017,7 @@
/* Do NOT mark through this, or specifiers will never be GC'd.
This is the same deal as for weak hash tables. */
- Vall_specifiers = Qnil;
- dump_add_weak_object_chain (&Vall_specifiers);
+ DUMP_ADD_WEAK_OBJECT_CHAIN (Vall_specifiers);
Vuser_defined_tags = Qnil;
staticpro (&Vuser_defined_tags);
--
‘As I sat looking up at the Guinness ad, I could never figure out /
How your man stayed up on the surfboard after forty pints of stout’
(C. Moore)
[View Less]
[COMMIT] Correct the behaviour of XSET_STRING_ASCII_BEGIN(), large strings
6 years, 5 months
Aidan Kehoe
APPROVE COMMIT
NOTE: This patch has been committed
# HG changeset patch
# User Aidan Kehoe <kehoea(a)parhasard.net>
# Date 1533853468 -3600
# Thu Aug 09 23:24:28 2018 +0100
# Node ID 881402f49f9cc477816cc360a8cbee04b631f4b9
# Parent ca67eadca486f7dc0cac9b9bb91e3095228d0913
Correct the behaviour of XSET_STRING_ASCII_BEGIN(), large strings
src/ChangeLog addition:
2018-08-09 Aidan Kehoe <kehoea(a)parhasard.net>
* lisp.h (XSET_STRING_ASCII_BEGIN):
Whoops, this behaved …
[View More]incorrectly with large strings, thank you the
debug build. Non-debug builds had a performance issue, not a
correctness issue.
diff -r ca67eadca486 -r 881402f49f9c src/ChangeLog
--- a/src/ChangeLog Tue Jul 17 08:11:41 2018 +0100
+++ b/src/ChangeLog Thu Aug 09 23:24:28 2018 +0100
@@ -1,3 +1,10 @@
+2018-08-09 Aidan Kehoe <kehoea(a)parhasard.net>
+
+ * lisp.h (XSET_STRING_ASCII_BEGIN):
+ Whoops, this behaved incorrectly with large strings, thank you the
+ debug build. Non-debug builds had a performance issue, not a
+ correctness issue.
+
2018-07-11 Aidan Kehoe <kehoea(a)parhasard.net>
* data.c:
diff -r ca67eadca486 -r 881402f49f9c src/lisp.h
--- a/src/lisp.h Tue Jul 17 08:11:41 2018 +0100
+++ b/src/lisp.h Thu Aug 09 23:24:28 2018 +0100
@@ -2823,7 +2823,7 @@
/* WARNING: If you modify an existing string, you must call
bump_string_modiff() afterwards. */
#define XSET_STRING_ASCII_BEGIN(s, val) \
- ((void) (XSTRING (s)->u.v.ascii_begin = (val) & MAX_STRING_ASCII_BEGIN))
+ ((void) (XSTRING (s)->u.v.ascii_begin = min (val, MAX_STRING_ASCII_BEGIN)))
#define XSTRING_FORMAT(s) FORMAT_DEFAULT
#define XSTRING_MODIFFP(s) (XSTRING (s)->u.v.modiffp + 0)
--
‘As I sat looking up at the Guinness ad, I could never figure out /
How your man stayed up on the surfboard after forty pints of stout’
(C. Moore)
[View Less]
[COMMIT leim] Rename quail/hebrew.el to quail/hebrew-input.el given issues with 21.4.
6 years, 5 months
Aidan Kehoe
APPROVE COMMIT
NOTE: This patch has been committed
# HG changeset patch
# User Aidan Kehoe <kehoea(a)parhasard.net>
# Date 1533761730 -3600
# Wed Aug 08 21:55:30 2018 +0100
# Node ID e9f58ceb8e91b42102089f9aef2d97c49270b475
# Parent 5edb048d450b31b1b8d4352e554204b14299e63c
Rename quail/hebrew.el to quail/hebrew-input.el given issues with 21.4.
leim/ChangeLog addition:
2018-08-08 Aidan Kehoe <kehoea(a)parhasard.net>
* quail/hebrew.el: Rename this given build conflicts …
[View More]with XEmacs
21.4 trunk, thank you Hauke Fath.
* quail/hebrew-input.el: New name for hebrew.el.
* Makefile:
Update the Makefile with the new name.
* leim-list.el: Update the input methods registered at startup
with the new name.
diff -r 5edb048d450b -r e9f58ceb8e91 ChangeLog
--- a/ChangeLog Thu Oct 16 13:52:50 2014 +0200
+++ b/ChangeLog Wed Aug 08 21:55:30 2018 +0100
@@ -1,3 +1,13 @@
+2018-08-08 Aidan Kehoe <kehoea(a)parhasard.net>
+
+ * quail/hebrew.el: Rename this given build conflicts with XEmacs
+ 21.4 trunk, thank you Hauke Fath.
+ * quail/hebrew-input.el: New name for hebrew.el.
+ * Makefile:
+ Update the Makefile with the new name.
+ * leim-list.el: Update the input methods registered at startup
+ with the new name.
+
2014-10-16 Norbert Koch <viteno(a)xemacs.org>
* Makefile (VERSION): XEmacs package 1.38 released.
diff -r 5edb048d450b -r e9f58ceb8e91 Makefile
--- a/Makefile Thu Oct 16 13:52:50 2014 +0200
+++ b/Makefile Wed Aug 08 21:55:30 2018 +0100
@@ -53,11 +53,11 @@
include ../../Local.rules
ifeq ($(XEMACS_21_5),t)
-ELCS_1 += quail/cyrillic-tajik.elc quail/georgian.elc quail/hebrew.elc \
+ELCS_1 += quail/cyrillic-tajik.elc quail/georgian.elc quail/hebrew-input.elc \
quail/ipa-21.5.elc quail/latin-ltx.elc quail/rfc1345.elc \
quail/sgml-input.elc quail/welsh.elc
else
-EXTRA_SOURCES= quail/cyrillic-tajik.el quail/georgian.el quail/hebrew.el \
+EXTRA_SOURCES= quail/cyrillic-tajik.el quail/georgian.el quail/hebrew-input.el \
quail/ipa-21.5.el quail/latin-ltx.el quail/rfc1345.el \
quail/sgml-input.el quail/welsh.el
endif
diff -r 5edb048d450b -r e9f58ceb8e91 leim-list.el
--- a/leim-list.el Thu Oct 16 13:52:50 2014 +0200
+++ b/leim-list.el Wed Aug 08 21:55:30 2018 +0100
@@ -615,17 +615,17 @@
(register-input-method
"hebrew" "Hebrew" 'quail-use-package
"[2],Hr[0](B" "Hebrew SI-1452 input method. Only Hebrew-related characters are considered."
- "quail/hebrew")
+ "quail/hebrew-input")
(register-input-method
"hebrew-new" "Hebrew" 'quail-use-package
"[2],Hr[0](B" "Hebrew SI-1452 new draft input method."
- "quail/hebrew")
+ "quail/hebrew-input")
(register-input-method
"hebrew-lyx" "Hebrew" 'quail-use-package
(decode-coding-string "\xd7\x9c\xd6\xb4" 'utf-8)
"Hebrew LyX input method. Based on LyX keyboard layout.
Additional mappings for Rafe and Yiddish ligatures."
- "quail/hebrew")
+ "quail/hebrew-input")
(register-input-method
"hebrew-full" "Hebrew" 'quail-use-package
(decode-coding-string "\xd7\xa2\xd6\xb4\xd6\xab" 'utf-8)
@@ -635,31 +635,37 @@
(decode-coding-string "\xd7\xaa\xd6\xb4\xd7\xa8\xd6\xb9" 'utf-8)
"Biblical Hebrew Tiro input method. Based on Society of Biblical Literature's Tiro \
keyboard layout.
-Not suitable for modern Hebrew input.")
+Not suitable for modern Hebrew input."
+ "quail/hebrew-input")
(register-input-method
"hebrew-biblical-sil" "Hebrew" 'quail-use-package
(decode-coding-string "\xd7\xa1\xd6\xb4\xd7\x9c" 'utf-8)
"Biblical Hebrew SIL input method.
Based on Society of Biblical Literature's SIL keyboard layout.
-Phonetic and not suitable for modern Hebrew input.")
+Phonetic and not suitable for modern Hebrew input."
+ "quail/hebrew-input")
(register-input-method
"yiddish-royal" "Hebrew" 'quail-use-package (decode-coding-string "\xd7\xb2\xd7\xa8" 'utf-8)
"Yiddish Royal input method. Based on Royal Yiddish typewriter.
-Better for Yiddish than Hebrew methods.")
+Better for Yiddish than Hebrew methods."
+ "quail/hebrew-input")
(register-input-method
"yiddish-keyman" "Hebrew" 'quail-use-package (decode-coding-string "\xd7\xb2\xd7\xa7" 'utf-8)
"Yiddish Keyman input method. Based on Keyman keyboard layout.
-Better for Yiddish than Hebrew methods.")
+Better for Yiddish than Hebrew methods."
+ "quail/hebrew-input")
(register-input-method
"hebrew-phonetic-xkb" "Hebrew" 'quail-use-package "[2],Ht[0](B"
"Hebrew phonetic (XKB) input method. Based on the XKB hebrew-phonetic
keyboard layout, layout that attempts to match Hebrew letters to
English phonetic equivalents, some of its chars however are mapped
-according to their shape, as o--> samesh.")
+according to their shape, as o--> samesh."
+ "quail/hebrew-input")
(register-input-method
"hebrew-phonetic-qwerty" "Hebrew" "[2],Hs[0](B" 'quail-use-package
"Hebrew phonetic input method. Based on the KDE hebrew-phonetic keyboard layout,
layout that attempts to match Hebrew letters to English phonetic equivalents.
It is however modified, c=chet x zadik, o=wav y=ain e=aleph.
-Moreover some but not all niqqud are added."))
+Moreover some but not all niqqud are added."
+ "quail/hebrew-input"))
diff -r 5edb048d450b -r e9f58ceb8e91 quail/hebrew-input.el
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/quail/hebrew-input.el Wed Aug 08 21:55:30 2018 +0100
@@ -0,0 +1,1048 @@
+;; hebrew-input.el --- Quail package for inputting Hebrew characters -*-coding: utf-8;-*-
+
+
+;; Keywords: mule, input method, Hebrew
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Synched up with: FSF 22.0.50.6
+
+;;; Commentary:
+
+;;; XEmacs change; encode the file as utf-8, given that iso-8859-8 doesn't
+;;; support niqqud and that the version of iso-2022-7bit supported by 21.4
+;;; doesn't support them either. Thank you Uwe Brauer.
+
+;;; Code:
+
+(require 'quail)
+(quail-define-package
+ "hebrew" "Hebrew" "ע" nil "Hebrew SI-1452 input method.
+
+Based on SI-1452 keyboard layout.
+Only Hebrew-related characters are considered.
+ 'q' is used to switch levels instead of Alt-Gr.
+ Maqaaf (־) is mapped to '/פ'.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("`" ?\;)
+ ("w" ?\')
+ ("e" ?ק) ; Qof
+ ("r" ?ר) ; Resh
+ ("t" ?א) ; Alef
+ ("y" ?ט) ; Tet
+ ("u" ?ו) ; Vav
+ ("i" ?ן) ; Final Nun
+ ("o" ?ם) ; Final Mem
+ ("p" ?פ) ; Pe
+ ("[" ?\]) ; mirroring
+ ("]" ?\[) ; mirroring
+ ("a" ?ש) ; Shin
+ ("s" ?ד) ; Dalet
+ ("d" ?ג) ; Gimel
+ ("f" ?כ) ; Kaf
+ ("g" ?ע) ; Ayin
+ ("h" ?י) ; Yod
+ ("j" ?ח) ; Het
+ ("k" ?ל) ; Lamed
+ ("l" ?ך) ; Final Kaf
+ (";" ?ף) ; Final Pe
+ ("'" ?,)
+ ("z" ?ז) ; Zayin
+ ("x" ?ס) ; Samekh
+ ("c" ?ב) ; Bet
+ ("v" ?ה) ; He
+ ("b" ?נ) ; Nun
+ ("n" ?מ) ; Mem
+ ("m" ?צ) ; Tsadi
+ ("," ?ת) ; Tav
+ ("." ?ץ) ; Final Tsadi
+ ("/" ?.) ; Stop
+ ("(" ?\)) ; mirroring
+ (")" ?\() ; mirroring
+ ("{" ?}) ; mirroring
+ ("}" ?{) ; mirroring
+ ("<" ?>) ; mirroring
+ (">" ?<) ; mirroring
+ ("q`" ?ְ) ; Sheva
+ ("q1" ?ֱ) ; Hataf Segol
+ ("q2" ?ֲ) ; Hataf Patah
+ ("q3" ?ֳ) ; Hataf Qamats
+ ("q4" ?ִ) ; Hiriq
+ ("q5" ?ֵ) ; Tsere
+ ("q6" ?ֶ) ; Segol (Point)
+ ("q7" ?ַ) ; Patah
+ ("q8" ?ָ) ; Qamats
+ ("q9" ?ׂ) ; Sin dot שׁ
+ ("q0" ?ׁ) ; Shin dot
+ ("q-" ?ֹ) ; Holam
+ ("q=" ?ּ) ; Dagesh or Mapiq
+ ("q\\" ?ֻ) ; Qubuts
+ ("qq" ?/)
+ ("qw" ?׳) ; Geresh (Punct.)
+ ("qi" ?װ) ; Yiddish Double Vav
+ ("qp" ?־) ; Maqaf
+ ("q[" ?ֿ) ; Rafe
+ ("q]" ?ֽ) ; Meteg
+ ("qa" ?₪) ; New Sheqel sign
+ ("qh" ?ײ) ; Yiddish Double Yod
+ ("qj" ?ױ) ; Yiddish Vav Yod
+ ("q\"" ?״) ; Gershayim (Punct.)
+ ("q," ?\u200E) ; LRM
+ ("q." ?\u200F) ; RLM
+)
+
+(quail-define-package
+ "hebrew-new" "Hebrew" "ע" nil "Hebrew SI-1452 new draft input method.
+
+Based on latest draft of SI-1452 keyboard layout.
+Only Hebrew-related characters are considered.
+ '`' is used to switch levels instead of Alt-Gr.
+Geresh is mapped to '`k'.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q" ?/)
+ ("w" ?\')
+ ("e" ?ק) ; Qof
+ ("r" ?ר) ; Resh
+ ("t" ?א) ; Alef
+ ("y" ?ט) ; Tet
+ ("u" ?ו) ; Vav
+ ("i" ?ן) ; Final Nun
+ ("o" ?ם) ; Final Mem
+ ("p" ?פ) ; Pe
+ ("[" ?\]) ; mirroring
+ ("]" ?\[) ; mirroring
+ ("a" ?ש) ; Shin
+ ("s" ?ד) ; Dalet
+ ("d" ?ג) ; Gimel
+ ("f" ?כ) ; Kaf
+ ("g" ?ע) ; Ayin
+ ("h" ?י) ; Yod
+ ("j" ?ח) ; Het
+ ("k" ?ל) ; Lamed
+ ("l" ?ך) ; Final Kaf
+ (";" ?ף) ; Final Pe
+ ("'" ?,)
+ ("z" ?ז) ; Zayin
+ ("x" ?ס) ; Samekh
+ ("c" ?ב) ; Bet
+ ("v" ?ה) ; He
+ ("b" ?נ) ; Nun
+ ("n" ?מ) ; Mem
+ ("m" ?צ) ; Tsadi
+ ("," ?ת) ; Tav
+ ("." ?ץ) ; Final Tsadi
+ ("/" ?.) ; Stop
+ ("(" ?\)) ; mirroring
+ (")" ?\() ; mirroring
+ ("{" ?}) ; mirroring
+ ("}" ?{) ; mirroring
+ ("<" ?>) ; mirroring
+ (">" ?<) ; mirroring
+
+ ("``" ?\;)
+ ("`1" ?ֽ) ; Meteg
+;("`2" ??) ; Unassigned
+ ("`3" ?€) ; Euro Sign
+ ("`4" ?₪) ; New Sheqel sign
+ ("`5" ?°) ; Degree Sign
+ ("`6" ?֫) ; Ole
+;("`7" ??) ; Unassigned
+ ("`8" ?×) ; Multiplication Sign
+ ("`9" ?\u200E) ; LRM
+ ("`0" ?\u200F) ; RLM
+ ("`-" ?־) ; Maqaf
+ ("`=" ?–) ; En Dash
+ ("`q" ?ׂ) ; Sin dot
+ ("`w" ?ׁ) ; Shin dot
+ ("`e" ?ָ) ; Qamats
+ ("`r" ?ֳ) ; Hataf Qamats
+;("`t" ??) ; Unassigned
+ ("`y" ?װ) ; Yiddish Double Vav
+ ("`u" ?ֹ) ; Holam
+;("`i" ??) ; Unassigned
+;("`o" ??) ; Unassigned
+ ("`p" ?ַ) ; Patah
+ ("`[" ?ֲ) ; Hataf Patah
+ ("`]" ?ֿ) ; Rafe
+ ("`\\" ?ֻ) ; Qubuts
+ ("`a" ?ְ) ; Sheva
+ ("`s" ?ּ) ; Dagesh or Mapiq
+;("`d" ??) ; Unassigned
+;("`f" ??) ; Unassigned
+ ("`g" ?ױ) ; Yiddish Vav Yod
+ ("`h" ?ײ) ; Yiddish Double Yod
+ ("`j" ?ִ) ; Hiriq
+ ("`k" ?׳) ; Geresh (Punct.)
+ ("`l" ?“) ; Left Double Quotation Mark
+ ("`;" ?”) ; Right Double Quotation Mark
+ ("`'" ?״) ; Gershayim (Punct.)
+;("`z" ??) ; Unassigned
+ ("`x" ?ֶ) ; Segol (Point)
+ ("`c" ?ֱ) ; Hataf Segol
+;("`v" ??) ; Unassigned
+;("`b" ??) ; Unassigned
+;("`n" ??) ; Unassigned
+ ("`m" ?ֵ) ; Tsere
+;("`," ??) ; Unassigned
+;("`." ??) ; Unassigned
+ ("`/" ?÷) ; Division Sign
+
+ ("``" ?׃) ; Sof Pasuq
+ ("`!" ?֑) ; Etnahta
+ ("`@" ?֒) ; Segol (Accent)
+ ("`#" ?֓) ; Shalshelet
+ ("`$" ?֔) ; Zaqef Qatan
+ ("`%" ?֕) ; Zaqef Gadol
+ ("`^" ?֖) ; Tipeha
+ ("`&" ?֗) ; Revia
+ ("`*" ?֘) ; Zarqa
+ ("`(" ?֙) ; Pashta
+ ("`)" ?֚) ; Yetiv
+ ("`_" ?֛) ; Tevir
+ ("`+" ?֜) ; Geresh (Accent)
+ ("`Q" ?֝) ; Geresh Muqdam
+ ("`W" ?֞) ; Gershayim (Accent)
+ ("`E" ?ׇ) ; Qamats Qatan
+ ("`R" ?֟) ; Qarney Para
+ ("`T" ?֠) ; Telisha Gedola
+ ("`Y" ?֡) ; Pazer
+ ("`U" ?ֺ) ; Holam Haser for Vav
+ ("`I" ?֢) ; Atnah Hafukh
+ ("`O" ?֣) ; Munah
+;("`P" ??) ; Reserved
+ ("`{" ?֤) ; Mahapakh
+ ("`}" ?֥) ; Merkha
+ ("`|" ?֦) ; Merkha Kefula
+;("`A" ??) ; Reserved
+;("`S" ??) ; Reserved
+ ("`D" ?֧) ; Darga
+ ("`F" ?֨) ; Qadma
+ ("`G" ?֩) ; Telisha Qetana
+ ("`H" ?֪) ; Yerah Ben Yomo
+ ("`J" ?\u200D) ; ZWJ
+ ("`K" ?֬) ; Iluy
+ ("`L" ?“) ; Left Double Quotation Mark (2nd)
+ ("`:" ?„) ; Double Low-9 Quotation Mark
+ ("`\"" ?֭) ; Dehi
+ ("`Z" ?֮) ; Zinor
+ ("`X" ?֯) ; Masora Circle
+ ("`C" ?\u034F) ; CGJ
+ ("`V" ?׀) ; Paseq
+ ("`B" ?׆) ; Nun Hafukha
+ ("`N" ?\u200C) ; ZWNJ
+;("`M" ??) ; Unassigned
+;("`<" ??) ; Unassigned
+ ("`>" ?ׅ) ; Lower Dot
+ ("`?" ?ׄ) ; Upper Dot
+)
+
+(quail-define-package
+ "hebrew-lyx" "Hebrew" "לִ" nil "Hebrew LyX input method.
+
+Based on LyX keyboard layout.
+Additional mappings for Rafe and Yiddish ligatures.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("`" ?\;)
+ ("_" ?־) ; Maqaf
+ ("q`" ?ְ) ; Sheva
+ ("w" ?\')
+ ("e" ?ק) ; Qof
+ ("r" ?ר) ; Resh
+ ("t" ?א) ; Alef
+ ("y" ?ט) ; Tet
+ ("u" ?ו) ; Vav
+ ("i" ?ן) ; Final Nun
+ ("o" ?ם) ; Final Mem
+ ("p" ?פ) ; Pe
+ ("[" ?\]) ; mirroring
+ ("]" ?\[) ; mirroring
+ ("a" ?ש) ; Shin
+ ("s" ?ד) ; Dalet
+ ("d" ?ג) ; Gimel
+ ("f" ?כ) ; Kaf
+ ("g" ?ע) ; Ayin
+ ("h" ?י) ; Yod
+ ("j" ?ח) ; Het
+ ("k" ?ל) ; Lamed
+ ("l" ?ך) ; Final Kaf
+ (";" ?ף) ; Final Pe
+ ("'" ?,)
+ ("z" ?ז) ; Zayin
+ ("x" ?ס) ; Samekh
+ ("c" ?ב) ; Bet
+ ("v" ?ה) ; He
+ ("b" ?נ) ; Nun
+ ("n" ?מ) ; Mem
+ ("m" ?צ) ; Tsadi
+ ("," ?ת) ; Tav
+ ("." ?ץ) ; Final Tsadi
+ ("/" ?.) ; Stop
+ ("(" ?\)) ; mirroring
+ (")" ?\() ; mirroring
+ ("W" ?׳) ; Geresh (Punct.)
+ ("E" ?ָ) ; Qamats
+ ("R" ?ֿ) ; Rafe
+ ("T" ?\u200E) ; LRM
+ ("Y" ?\u200F) ; RLM
+ ("U" ?ֹ) ; Holam
+ ("I" ?ײ) ; Yiddish Double Yod
+ ("O" ?װ) ; Yiddish Double Vav
+ ("P" ?ַ) ; Patah
+ ("{" ?}) ; mirroring
+ ("}" ?{) ; mirroring
+ ("A" ?ְ) ; Sheva
+ ("S" ?ּ) ; Dagesh or Mapiq
+ ("F" ?״) ; Gershayim (Punct.)
+ ("G" ?ׂ) ; Sin dot
+ ("H" ?ׁ) ; Shin dot
+ ("J" ?ִ) ; Hiriq
+ ("K" ?₪) ; New Sheqel sign
+ ("L" ?ױ) ; Yiddish Vav Yod
+ ("X" ?ֶ) ; Segol (Point)
+ ("C" ?ֻ) ; Qubuts
+ ("V" ?ֱ) ; Hataf Segol
+ ("B" ?ֲ) ; Hataf Patah
+ ("N" ?ֳ) ; Hataf Qamats
+ ("M" ?ֵ) ; Tsere
+ ("<" ?>) ; mirroring
+ (">" ?<) ; mirroring
+)
+
+
+(quail-define-package
+ "hebrew-full" "Hebrew" "עִ֫" nil "Hebrew Full method.
+
+Provides access to all Hebrew characters suitable to Modern Hebrew.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("`" ?\;)
+ ("-" ?־) ; Maqaf
+ ("w" ?')
+ ("e" ?ק) ; Qof
+ ("r" ?ר) ; Resh
+ ("t" ?א) ; Alef
+ ("y" ?ט) ; Tet
+ ("u" ?ו) ; Vav
+ ("i" ?ן) ; Final Nun
+ ("o" ?ם) ; Final Mem
+ ("p" ?פ) ; Pe
+ ("[" ?\]) ; mirroring
+ ("]" ?\[) ; mirroring
+ ("a" ?ש) ; Shin
+ ("s" ?ד) ; Dalet
+ ("d" ?ג) ; Gimel
+ ("f" ?כ) ; Kaf
+ ("g" ?ע) ; Ayin
+ ("h" ?י) ; Yod
+ ("j" ?ח) ; Het
+ ("k" ?ל) ; Lamed
+ ("l" ?ך) ; Final Kaf
+ (";" ?ף) ; Final Pe
+ ("'" ?,)
+ ("z" ?ז) ; Zayin
+ ("x" ?ס) ; Samekh
+ ("c" ?ב) ; Bet
+ ("v" ?ה) ; He
+ ("b" ?נ) ; Nun
+ ("n" ?מ) ; Mem
+ ("m" ?צ) ; Tsadi
+ ("," ?ת) ; Tav
+ ("." ?ץ) ; Final Tsadi
+ ("/" ?.)
+
+ ("(" ?\)) ; mirroring
+ (")" ?\() ; mirroring
+ ("Q" ?/)
+ ("W" ?׳) ; Geresh (Punct.)
+ ("E" ?₪) ; New Sheqel Sign
+ ("R" ?ֿ) ; Rafe
+ ("T" ?ֱ) ; Hataf Segol
+ ("Y" ?ױ) ; Yiddish Vav Yod
+ ("U" ?װ) ; Yiddish Double Vav
+ ("I" ?ֲ) ; Hataf Patah
+ ("O" ?ֳ) ; Hataf Qamats
+ ("P" ?״) ; Gershayim (Punct.)
+ ("{" ?}) ; mirroring
+ ("}" ?{) ; mirroring
+ ("A" ?ְ) ; Sheva
+ ("S" ?ּ) ; Dagesh or Mapiq
+ ("D" ?ֻ) ; Qubuts
+ ("F" ?ֹ) ; Holam
+ ("G" ?ֶ) ; Segol (Point)
+ ("H" ?ֵ) ; Tsere
+ ("J" ?ִ) ; Hiriq
+ ("K" ?ַ) ; Patah
+ ("L" ?ָ) ; Qamats
+ ("Z" ?ׂ) ; Sin Dot
+ ("X" ?ׁ) ; Shin Dot
+ ("C" ?֫) ; Ole
+ ("V" ?ײ) ; Yiddish Double Yod
+ ("B" ?׃) ; Sof Pasuq
+ ("N" ?\u200E) ; LRM
+ ("M" ?\u200F) ; RLM
+ ("<" ?>) ; mirroring
+ (">" ?<) ; mirroring
+
+ ("q`" ?\u202D) ; LRO
+ ("q1" ?\u202E) ; RLO
+ ("q2" ?\u202A) ; LRE
+ ("q3" ?\u202B) ; RLE
+ ("q4" ?\u202C) ; PDF
+ ("q5" ?\u034F) ; CGJ
+ ("q6" ?֬) ; Iluy
+ ("q8" ?֭) ; Dehi
+ ("q9" ?ׇ) ; Qamats Qatan
+ ("q0" ?֝) ; Geresh Muqdam
+ ("q-" ?-) ; Minus
+ ("q=" ?֮) ; Zinor
+ ("q|" ?׀) ; Paseq
+ ("qw" ?֯) ; Masora Circle
+ ("qe" ?ׄ) ; Upper Dot
+ ("qr" ?ׅ) ; Lower Dot
+ ("qy" ?֟) ; Qarney Para
+ ("qu" ?֓) ; Shalshelet
+ ("qi" ?֞) ; Gershayim (Accent)
+ ("qo" ?֜) ; Geresh (Accent)
+ ("qp" ?֨) ; Qadma
+ ("q[" ?׆) ; Nun Hafukha
+ ("qa" ?ֺ) ; Holam Haser for Vav
+ ("qs" ?֩) ; Telisha Qetana
+ ("qd" ?֠) ; Telisha Gedola
+ ("qf" ?֡) ; Pazer
+ ("qg" ?֕) ; Zaqef Gadol
+ ("qh" ?֔) ; Zaqef Qatan
+ ("qj" ?֙) ; Pashta
+ ("qk" ?֤) ; Mahapakh
+ ("ql" ?֗) ; Revia
+ ("q;" ?֒) ; Segol (Accent)
+ ("q'" ?֘) ; Zarqa
+ ("qz" ?֪) ; Yerah Ben Yomo
+ ("qx" ?֦) ; Merkha Kefula
+ ("qc" ?֚) ; Yetiv
+ ("qv" ?֛) ; Tevir
+ ("qb" ?֧) ; Darga
+ ("qn" ?֑) ; Etnahta
+ ("qm" ?֣) ; Munah
+ ("q," ?֖) ; Tipeha
+ ("q." ?֥) ; Merkha
+ ("q/" ?ֽ) ; Meteg
+)
+
+
+(quail-define-package
+ "hebrew-biblical-tiro" "Hebrew" "תִרֹ" nil
+"Biblical Hebrew Tiro input method.
+
+Based on Society of Biblical Literature's Tiro keyboard layout.
+Not suitable for modern Hebrew input.
+ 'q' is used to switch levels instead of Alt-Gr.
+ Combining dot above (Called Masora dot) (̇) is mapped to 'q1'.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("`" ?׃) ; Sof Pasuq
+ ("-" ?־) ; Maqaf
+ ("=" ?◦) ; White Bullet
+ ("w" ?׳) ; Geresh (Punct.)
+ ("e" ?ק) ; Qof
+ ("r" ?ר) ; Resh
+ ("t" ?א) ; Alef
+ ("y" ?ט) ; Tet
+ ("u" ?ו) ; Vav
+ ("i" ?ן) ; Final Nun
+ ("o" ?ם) ; Final Mem
+ ("p" ?פ) ; Pe
+ ("[" ?\]) ; mirroring
+ ("]" ?\[) ; mirroring
+ ("\\" ?׀) ; Paseq
+ ("a" ?ש) ; Shin
+ ("s" ?ד) ; Dalet
+ ("d" ?ג) ; Gimel
+ ("f" ?כ) ; Kaf
+ ("g" ?ע) ; Ayin
+ ("h" ?י) ; Yod
+ ("j" ?ח) ; Het
+ ("k" ?ל) ; Lamed
+ ("l" ?ך) ; Final Kaf
+ (";" ?ף) ; Final Pe
+ ("'" ?֚) ; Yetiv
+ ("z" ?ז) ; Zayin
+ ("x" ?ס) ; Samekh
+ ("c" ?ב) ; Bet
+ ("v" ?ה) ; He
+ ("b" ?נ) ; Nun
+ ("n" ?מ) ; Mem
+ ("m" ?צ) ; Tsadi
+ ("," ?ת) ; Tav
+ ("." ?ץ) ; Final Tsadi
+ ("/" ?֭) ; Dehi
+ ("~" ?֮) ; Zinor
+ ("!" ?֩) ; Telisha Qetana
+ ("@" ?֙) ; Pashta
+ ("#" ?֒) ; Segol (Accent)
+ ("$" ?֯) ; Masora circle
+ ("%" ?ֺ) ; Holam Haser for Vav
+ ("^" ?ֹ) ; Holam
+ ("&" ?ֿ) ; Rafe
+ ("*" ?ׂ) ; Sin dot
+ ("(" ?ׁ) ; Shin dot
+ (")" ?֝) ; Geresh Muqdam
+ ("_" ?֠) ; Telisha Gedola
+ ("+" ?ּ) ; Dagesh or Mapiq
+ ("Q" ?ׄ) ; Upper dot
+ ("W" ?֬) ; Iluy
+ ("E" ?֫) ; Ole
+ ("R" ?֟) ; Qarney Para
+ ("T" ?֓) ; Shalshelet
+ ("Y" ?֞) ; Gershayim (Accent)
+ ("U" ?֜) ; Geresh (Accent)
+ ("I" ?֡) ; Pazer
+ ("O" ?֕) ; Zaqef Gadol
+ ("P" ?֔) ; Zaqef Qatan
+ ("{" ?֗) ; Revia
+ ("}" ?֘) ; Zarqa
+ ("|" ?֨) ; Qadma
+ ("A" ?ֽ) ; Meteg
+ ("S" ?ְ) ; Sheva
+ ("D" ?ֻ) ; Qubuts
+ ("F" ?ִ) ; Hiriq
+ ("G" ?ֱ) ; Hataf Segol
+ ("H" ?ֶ) ; Segol (Point)
+ ("J" ?ֵ) ; Tsere
+ ("K" ?ֳ) ; Hataf Qamats
+ ("L" ?ָ) ; Qamats
+ (":" ?ֲ) ; Hataf Patah
+ ("\"" ?ַ) ; Patah
+ ("Z" ?ׅ) ; Lower dot
+ ("X" ?֤) ; Mahapakh
+ ("C" ?֪) ; Yerah Ben Yomo
+ ("V" ?֦) ; Merkha Kefula
+ ("B" ?֥) ; Merkha
+ ("N" ?֧) ; Darga
+ ("M" ?֛) ; Tevir
+ ("<" ?֑) ; Etnahta
+ (">" ?֖) ; Tipeha
+ ("?" ?֣) ; Munah
+
+ ("q`" ?\;)
+ ("q1" ?\u0307) ; Combining dot above
+ ("q2" ?\u0336) ; Combining long stroke overlay
+ ("q3" ?\u030A) ; Combining ring above
+ ("q4" ?₪) ; New Sheqel Sign
+ ("q5" ?\u200D) ; ZWJ
+ ("q6" ?\u200C) ; ZWNJ
+ ("q7" ?\u034F) ; CGJ
+ ("q8" ?\u200E) ; LRM
+ ("q9" ?\u200F) ; RLM
+ ("q0" ?◌) ; Dotted Circle
+ ("q-" ?-) ; Minus
+ ("q=" ?•) ; Bullet
+ ("qq" ?\u0308) ; Combining Diaeresis
+ ("qw" ?״) ; Gershayim (Punct.)
+ ("qe" ?€) ; Euro Sign
+ ("qu" ?װ) ; Yiddish Double Vav
+ ("q\\" ?\\)
+ ("qh" ?ײ) ; Yiddish Double Yod
+ ("qj" ?ױ) ; Yiddish Vav Yod
+ ("ql" ?ׇ) ; Qamats Qatan
+ ("q'" ?,)
+ ("qc" ?֢) ; Atnah Hafukh
+ ("qb" ?׆) ; Nun Hafukha
+ ("q/" ?.)
+
+ ("q~" ?~)
+ ("q!" ?!)
+ ("q@" ?@)
+ ("q#" ?#)
+ ("q$" ?$)
+ ("q%" ?%)
+ ("q^" ?^)
+ ("q&" ?&)
+ ("q*" ?*)
+ ("q(" ?\)) ; mirroring
+ ("q)" ?\() ; mirroring
+ ("q_" ?_)
+ ("q+" ?+)
+ ("qQ" ?/)
+ ("qW" ?')
+ ("q{" ?}) ; mirroring
+ ("q}" ?{) ; mirroring
+ ("q|" ?|)
+ ("q:" ?:)
+ ("q\"" ?\")
+ ("q<" ?>)
+ ("q>" ?<)
+ ("q?" ??)
+)
+
+(quail-define-package
+ "hebrew-biblical-sil" "Hebrew" "סִל" nil
+"Biblical Hebrew SIL input method.
+
+Based on Society of Biblical Literature's SIL keyboard layout.
+Phonetic and not suitable for modern Hebrew input.
+ '`' is used to switch levels instead of Alt-Gr.
+ Euro Sign (€) is mapped to 'Z'.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("-" ?־) ; Maqaf
+ ("=" ?ּ) ; Dagesh or Mapiq
+ ("q" ?ק) ; Qof
+ ("w" ?ו) ; Vav
+ ("e" ?ֶ) ; Segol (Point)
+ ("r" ?ר) ; Resh
+ ("t" ?ת) ; Tav
+ ("y" ?י) ; Yod
+ ("u" ?ֻ) ; Qubuts
+ ("i" ?ִ) ; Hiriq
+ ("o" ?ֹ) ; Holam
+ ("p" ?פ) ; Pe
+ ("[" ?\]) ; mirroring
+ ("]" ?\[) ; mirroring
+ ("\\" ?׀) ; Paseq
+ ("a" ?ַ) ; Patah
+ ("s" ?ס) ; Samekh
+ ("d" ?ד) ; Dalet
+ ("f" [ "שׂ" ]) ; Shin + Sin dot
+ ("g" ?ג) ; Gimel
+ ("h" ?ה) ; He
+ ("j" [ "שׁ" ]) ; Shin + Shin dot
+ ("k" ?כ) ; Kaf
+ ("l" ?ל) ; Lamed
+ (";" ?ְ) ; Sheva
+ ("'" ?’) ; Right Single Quotation Mark
+ ("z" ?ז) ; Zayin
+ ("x" ?ח) ; Het
+ ("c" ?צ) ; Tsadi
+ ("v" ?ט) ; Tet
+ ("b" ?ב) ; Bet
+ ("n" ?נ) ; Nun
+ ("m" ?מ) ; Mem
+
+ ("~" ?₪) ; New Sheqel Sign
+ ("@" ?֘) ; Zarqa
+ ("#" ?֨) ; Qadma
+ ("$" ?֜) ; Geresh (Accent)
+ ("%" ?֞) ; Gershayim (Accent)
+ ("&" ?֬) ; Iluy
+ ("*" ?֝) ; Geresh Muqdam
+ ("(" ?\)) ; mirroring
+ (")" ?\() ; mirroring
+ ("_" ?–) ; Em Dash
+ ("Q" ?֗) ; Revia
+ ("E" ?ֵ) ; Tsere
+ ("Y" ?֟) ; Qarney Para
+ ("O" ?ֺ) ; Holam Haser for Vav
+ ("P" ?ף) ; Final Pe
+ ("{" ?}) ; mirroring
+ ("}" ?{) ; mirroring
+
+ ("A" ?ָ) ; Qamats
+ ("S" ?ש) ; Shin
+ ("K" ?ך) ; Final Kaf
+ (":" ?״) ; Gershayim (Punct.)
+ ("\"" ?”) ; Right Double Quotation Mark
+ ("Z" ?€) ; Euro Sign
+ ("C" ?ץ) ; Final Tsadi
+ ("N" ?ן) ; Final Nun
+ ("M" ?ם) ; Final Mem
+ ("<" ?ע) ; Ayin
+ (">" ?א) ; Alef
+
+ ("``" ?$)
+ ("`1" ?ֽ) ; Meteg
+ ("`2" ?֢) ; Atnah Hafukh
+ ("`3" ?֖) ; Tipeha
+ ("`4" ?֥) ; Merkha
+ ("`5" ?֦) ; Merkha Kefula
+ ("`6" ?֭) ; Dehi
+ ("`7" ?֣) ; Munah
+ ("`8" ?֛) ; Tevir
+ ("`9" ?֧) ; Darga
+ ("`0" ?֪) ; Yerah Ben Yomo
+ ("`-" ?—) ; Em Dash
+ ("`=" ?֑) ; Etnahta
+ ("`]" ?֚) ; Accent Yetiv
+ ("`\\" ?֤) ; Mahapakh
+ ("`a" ?ׇ) ; Qamats Qatan
+ ("`g" ? ◦) ; White Bullet
+ ("`h" ?\u0336) ; Combining Long Stroke Overlay
+ ("`;" ?\;)
+ ("`'" ?\u0323); Combining Dot Below (Lower Point??)
+ ("`m" ?\u200C) ; ZWNJ
+ ("`," ?») ; mirroring
+ ("`." ?«) ; mirroring
+ ("`/" ?׳) ; Geresh (Punct.)
+
+ ("`!" ?֗) ; Revia
+ ("`@" ?֮) ; Zinor
+ ("`#" ?֙) ; Pashta
+ ("`$" ?֠) ; Telisha Gedola
+ ("`%" ?֩) ; Telisha Qetana
+ ("`&" ?֡) ; Pazer
+ ("`*" ?֕) ; Zaqef Gadol
+ ("`(" ?֓) ; Shalshelet
+ ("`)" ?֯) ; Masora Circle
+ ("`_" ?ֿ) ; Rafe
+ ("`+" ?◌) ; Dotted Circle
+ ("`E" ?ֱ) ; Hataf Segol
+ ("`O" ?ֳ) ; Hataf Qamats
+ ("`P" ?\u034F) ; CGJ
+ ("`{" ?֔) ; Zaqef Qatan
+ ("`}" ?֒) ; Segol (Accent)
+ ("`|" ?֫) ; Ole
+ ("`A" ?ֲ) ; Hataf Patah
+ ("`G" ?•) ; Bullet
+ ("`H" ?\u030A) ; Combining ring above
+ ("`:" ?׃) ; Sof Pasuq
+ ("`\"" ?ׄ) ; Upper Dot
+ ("`M" ?\u200D) ; ZWJ
+ ("`<" ?\u0307) ; Combining dot above
+ ("`>" ?\u0308) ; Combining Diaeresis
+)
+
+
+(quail-define-package
+ "yiddish-royal" "Hebrew" "ײר" nil "Yiddish Royal input method.
+
+Based on Royal Yiddish typewriter.
+Better for yiddish than Hebrew methods.
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("`" ?~)
+ ("q" ?ק) ; Qof
+ ("w" [ "אָ" ]) ; Qamats Alef (Komets Alef)
+ ("e" ?ר) ; Resh
+ ("r" ?א) ; Alef (Shtumer Alef)
+ ("t" ?ט) ; Tet
+ ("y" ?װ) ; Yiddish Double Vav (Tsvey Vovn)
+ ("u" ?ו) ; Vav
+ ("i" ?ן) ; Final Nun
+ ("o" ?ם) ; Final Mem
+ ("p" [ "פֿ" ]) ; Rafe Pe (Fey)
+ ("[" [ "פּ" ]) ; Dagesh Pe (Pey)
+ ("]" ?,)
+ ("a" ?ש) ; Shin
+ ("s" ?ד) ; Dalet
+ ("d" ?ג) ; Gimel
+ ("f" ?כ) ; Kaf
+ ("g" ?ע) ; Ayin
+ ("h" ?ײ) ; Yiddish Double Yod (Tsvey Yudn)
+ ("j" ?י) ; Yod
+ ("k" ?ח) ; Het
+ ("l" ?ל) ; Lamed
+ (";" ?ך) ; Final Kaf
+ ("'" ?ף) ; Final Pe
+ ("z" ?.)
+ ("x" ?ז) ; Zayin
+ ("c" ?ס) ; Samekh
+ ("v" ?ב) ; Bet
+ ("b" ?ה) ; He
+ ("n" ?נ) ; Nun
+ ("m" ?מ) ; Mem
+ ("," ?צ) ; Tsadi
+ ("." ?ת) ; Tav
+ ("/" ?ץ) ; Final Tsadi
+
+ ("~" ?@)
+ ("!" ?”) ; Right Double Quotation Mark
+ ("@" ?„) ; Double Low-9 Quotation Mark
+ ("(" ?\)) ; mirroring
+ (")" ?\() ; mirroring
+ ("Q" ?“) ; Left Double Quotation Mark
+ ("W" ?”) ; Right Double Quotation Mark
+ ("E" ?ײ) ; Yiddish Double Yod (x2)
+ ("R" [ "אַ" ]) ; Patah Alef (Pasekh Alef)
+; ("T" "")
+ ("Y" ?ױ) ; Ligature Yiddish Vav Yod (vov yud)
+ ("U" [ "וּ" ]) ; Melupm vov
+ ("I" ?/)
+ ("O" ?\\)
+ ("P" ?פ) ; Pe
+ ("{" ??)
+ ("}" ?!)
+ ("A" [ "שׂ" ]) ; Shin + Sin dot
+ ("S" [ "שׂ" ]) ; Shin + Sin dot
+; ("D" "")
+ ("F" [ "כּ" ]) ; Dagesh Kaf (Kof)
+; ("G" "")
+ ("H" [ "ײַ" ]) ; Yiddish Double Yod + Patah (Pasekh Tsvey Yudn)
+ ("J" [ "יִ" ]) ; Khirik Yud
+ ("K" ?}) ; mirroring
+ ("L" ?{) ; mirroring
+ ("\"" ?\;)
+ ("Z" ??)
+ ("X" ?|)
+ ("C" [ "בּ" ]) ; Dagesh Bet (Beys)
+ ("V" [ "בֿ" ]) ; Rafe Bet (Veys)
+ ("B" ?\]) ; mirroring
+ ("N" ?\[) ; mirroring
+ ("M" ?>) ; mirroring
+ ("<" ?<) ; mirroring
+ (">" [ "תּ" ]) ; Dagesh Tav (Tof)
+ ("?" ?\')
+)
+
+
+(quail-define-package
+ "yiddish-keyman" "Hebrew" "ײק" nil "Yiddish Keyman input method.
+
+Based on Keyman keyboard layout.
+Better for yiddish than Hebrew methods..
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("`" ?\;)
+ ("q" ?„) ; Double Low-9 Quotation Mark
+ ("w" ?ש) ; Shin
+ ("e" ?ע) ; Ayin
+ ("r" ?ר) ; Resh
+ ("t" ?ט) ; Tet
+ ("y" ?י) ; Yod
+ ("u" ?ו) ; Vav
+ ("i" ?י) ; Yod (x2)
+ ("o" [ "אָ" ]) ; Qamats Alef (Komets Alef)
+ ("p" [ "פּ" ]) ; Dagesh Pe (Pey)
+ ("[" ?\]) ; mirroring
+ ("]" ?\[) ; mirroring
+ ("a" [ "אַ" ]) ; Patah Alef (Pasekh Alef)
+ ("s" ?ס) ; Samekh
+ ("d" ?ד) ; Dalet
+ ("f" [ "פֿ" ]) ; Rafe Pe (Fey)
+ ("g" ?ג) ; Gimel
+ ("h" ?ה) ; He
+ ("j" ?ײ) ; Yiddish Double Yod (Tsvey Yudn)
+ ("k" ?ק) ; Qof
+ ("l" ?ל) ; Lamed
+ ("z" ?ז) ; Zayin
+ ("x" ?כ) ; Kaf
+ ("c" ?צ) ; Tsadi
+ ("v" ?װ) ; Yiddish Double Vav (Tsvey Vovn)
+ ("b" ?ב) ; Bet
+ ("n" ?נ) ; Nun
+ ("m" ?מ) ; Mem
+
+ ("(" ?\)) ; mirroring
+ (")" ?\() ; mirroring
+ ("Q" ?”) ; Right Double Quotation Mark
+ ("W" [ "שׂ" ]) ; Shin + Sin dot
+ ("E" ?ײ) ; Yiddish Double Yod (x2)
+; ("R" "") ;
+ ("T" [ "תּ" ]) ; Dagesh Tav (Tof)
+ ("Y" [ "ײַ" ]) ; Yiddish Double Yod + Patah (Pasekh Tsvey Yudn)
+ ("U" [ "וּ" ]) ; Melupm vov
+ ("I" [ "יִ" ]) ; Khirik Yud
+ ("O" ?ױ) ; Ligature Yiddish Vav Yod (vov yud)
+; ("P" "")
+ ("{" ?}) ; mirroring
+ ("}" ?{) ; mirroring
+ ("A" ?א) ; Alef (Shtumer Alef)
+ ("S" ?ת) ; Tav
+ ("F" ?ף) ; Final Pe
+ ("G" ?׳) ; Geresh (Punct.)
+ ("H" ?ח) ; Het
+ ("J" ?ײ) ; Yiddish Double Yod (x2)
+ ("K" [ "כּ" ]) ; Dagesh Kaf (Kof)
+; ("L" "")
+; ("Z" "")
+ ("X" ?ך) ; Final Kaf
+ ("C" ?ץ) ; Final Tsadi
+ ("V" [ "בֿ" ]) ; Rafe Bet (Veys) ) ; Bet
+; ("B" "")
+ ("N" ?ן) ; Final Nun
+ ("M" ?ם) ; Final Mem
+ ("<" ?>) ; mirroring
+ (">" ?<) ; mirroring
+)
+
+
+(quail-define-package
+ "hebrew-phonetic-xkb" "Hebrew" "פ" nil "Hebrew phonetic (XKB) input method.
+Based on the XKB hebrew-phonetic keyboard layout,
+layout that attempts to match Hebrew letters to English phonetic equivalents, some of its chars however
+are mapped according to their shape, as o--> samesh.
+;; 1! 2@ 3# 4$ 5% 6^ 7& 8* 9( 0) -_ =+ ;~
+;; קק וו אא רר תט עע וו יי סס פף ]}[{
+;; אא שש דד פפ גג הה יי כך לל;:'\"\|
+;; זז חח צץ וו בב נן מם ,>.</?
+;;
+" nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+
+ ("A" ?א) ; Alef
+ ("B" ?ב) ; Bet
+ ("C" ?ץ) ; Final Tsadi
+ ("D" ?ד) ; Dalet
+ ("E" ?א) ; aleph
+ ("E" ?א) ; aleph
+ ("F" ?ף) ; Final Pe
+ ("G" ?ג) ; Gimel
+ ("H" ?ה) ; He
+ ("I" ?י) ; Yod
+ ("J" ?י) ; Yod
+ ("K" ?ך) ; Kaf sofit
+ ("L" ?ל) ; Lamed
+ ("M" ?ם) ; Final Mem
+ ("N" ?ן) ; Final Nun
+ ("O" ?ס) ; Samekh
+ ("P" ?ף) ; Final Pe
+ ("Q" ?ק) ; Kuf
+ ("R" ?ר) ; Resh
+ ("S" ?ש) ; Shin
+ ("T" ?ט) ; Tet
+ ("U" ?ו) ; Vav
+ ("V" ?ו) ; Vav
+ ("W" ?ו) ; Vav
+ ("X" ?ח) ; Het
+ ("Y" ?ע) ; Ayin
+ ("Z" ?ז) ; Zayin
+ ("a" ?א) ; Alef
+ ("b" ?ב) ; Bet
+ ("c" ?צ) ; Tsadi
+ ("d" ?ד) ; Dalet
+ ("e" ?א) ; aleph
+ ("f" ?פ) ; fe
+ ("g" ?ג) ; Gimel
+ ("h" ?ה) ; He
+ ("i" ?י) ; Yod
+ ("j" ?י) ; Yod
+ ("k" ?כ) ; Kaf
+ ("l" ?ל) ; Lamed
+ ("m" ?מ) ; Mem
+ ("n" ?נ) ; Nun
+ ("o" ?ס) ; Samekh
+ ("p" ?פ) ; Pe
+ ("q" ?ק) ; Kuf
+ ("r" ?ר) ; Resh
+ ("s" ?ש) ; Shin
+ ("t" ?ת) ; Tav
+ ("u" ?ו) ; Vav
+ ("v" ?ו) ; Vav
+ ("w" ?ו) ; Vav
+ ("x" ?ח) ; Het
+ ("y" ?ע) ; Ayin
+ ("z" ?ז) ; Zayin
+ ("[" ?\]) ; mirroring
+ ("]" ?\[) ; mirroring
+ ("." ?.) ; Stop
+ ("(" ?\)) ; mirroring
+ (")" ?\() ; mirroring
+ ("{" ?}) ; mirroring
+ ("}" ?{) ; mirroring
+ ("<" ?>) ; mirroring
+ (">" ?<) ; mirroring
+)
+
+
+
+(quail-define-package
+ "hebrew-phonetic-qwerty" "Hebrew" "ף" nil "Hebrew phonetic input method.
+
+Based on the KDE hebrew-phonetic keyboard layout, layout that
+attempts to match Hebrew letters to English phonetic equivalents.
+It is however modified, c=chet x zadik, o=wav y=ain e=aleph. Moreover some but
+not all niqqud are added.
+;; 1! 2@ 3# 4$ 5% 6^ 7& 8* 9( 0) -_ =+ ;~
+;; קֹ וׁ אֶ רר תט עע וּ יִ וֹ פַ ]}[{
+;; אָ שס דּ פף גג הה יִ כך לְ ;: '\" \|
+;; זֵ צץ חֻ וו בּ נן מם ,>.</?
+;;
+" nil t t t t nil nil nil nil nil t)
+
+
+(quail-define-rules
+
+
+ ("A" ?ָ) ; Qamats
+ ("B" ?ּ) ; Dagesh or Mapiq
+ ("C" ?ֻ) ; Qubuts
+ ("D" ?ּ) ; Dagesh or Mapiq
+ ("E" ?ֶ) ; Segol (Point)
+ ("F" ?ף) ; Final Pe
+ ("G" ?ג) ; Gimel
+ ("H" ?ה) ; He
+ ("I" ?ִ) ; Hiriq
+ ("J" ?ִ) ; Hiriq
+ ("K" ?ך) ; Kaf sofit
+ ("L" ?ְ) ; Sheva
+ ("M" ?ם) ; Final Mem
+ ("N" ?ן) ; Final Nun
+ ("O" ?ֹ) ; Holam
+ ("P" ?ַ) ; Patah
+ ("Q" ?ֹ) ; Holam
+ ("R" ?ר) ; Resh
+ ("S" ?ס) ; Samekh
+ ("T" ?ט) ; Tet
+ ("U" ?ּ) ; Dagesh or Mapiq
+ ("V" ?ו) ; Vav
+ ("W" ?ׁ) ; Shin dot
+ ("X" ?ץ) ; Final Tsadi
+ ("Y" ?ע) ; Ayin
+ ("Z" ?ֵ) ; Tsere
+ ("a" ?א) ; Alef
+ ("b" ?ב) ; Bet
+ ("c" ?ח) ; Het
+ ("d" ?ד) ; Dalet
+ ("e" ?א) ; aleph
+ ("f" ?פ) ; fe
+ ("g" ?ג) ; Gimel
+ ("h" ?ה) ; He
+ ("i" ?י) ; Yod
+ ("j" ?י) ; Yod
+ ("k" ?כ) ; Kaf
+ ("l" ?ל) ; Lamed
+ ("m" ?מ) ; Mem
+ ("n" ?נ) ; Nun
+ ("o" ?ו) ; Vav
+ ("p" ?פ) ; Pe
+ ("q" ?ק) ; Kuf
+ ("r" ?ר) ; Resh
+ ("s" ?ש) ; Shin
+ ("t" ?ת) ; Tav
+ ("u" ?ו) ; Vav
+ ("v" ?ו) ; Vav
+ ("w" ?ו) ; Vav
+ ("x" ?צ) ; Tsadi
+ ("y" ?ע) ; Ayin
+ ("z" ?ז) ; Zayin
+ ("[" ?\]) ; mirroring
+ ("]" ?\[) ; mirroring
+ ("." ?.) ; Stop
+ ("(" ?\)) ; mirroring
+ (")" ?\() ; mirroring
+ ("{" ?}) ; mirroring
+ ("}" ?{) ; mirroring
+ ("<" ?>) ; mirroring
+ (">" ?<) ; mirroring
+)
+
+
+
+
+
+;;; hebrew.el ends here
diff -r 5edb048d450b -r e9f58ceb8e91 quail/hebrew.el
--- a/quail/hebrew.el Thu Oct 16 13:52:50 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1048 +0,0 @@
-;; hebrew.el --- Quail package for inputting Hebrew characters -*-coding: utf-8;-*-
-
-
-;; Keywords: mule, input method, Hebrew
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
-
-;;; Synched up with: FSF 22.0.50.6
-
-;;; Commentary:
-
-;;; XEmacs change; encode the file as utf-8, given that iso-8859-8 doesn't
-;;; support niqqud and that the version of iso-2022-7bit supported by 21.4
-;;; doesn't support them either. Thank you Uwe Brauer.
-
-;;; Code:
-
-(require 'quail)
-(quail-define-package
- "hebrew" "Hebrew" "ע" nil "Hebrew SI-1452 input method.
-
-Based on SI-1452 keyboard layout.
-Only Hebrew-related characters are considered.
- 'q' is used to switch levels instead of Alt-Gr.
- Maqaaf (־) is mapped to '/פ'.
-" nil t t t t nil nil nil nil nil t)
-
-(quail-define-rules
- ("`" ?\;)
- ("w" ?\')
- ("e" ?ק) ; Qof
- ("r" ?ר) ; Resh
- ("t" ?א) ; Alef
- ("y" ?ט) ; Tet
- ("u" ?ו) ; Vav
- ("i" ?ן) ; Final Nun
- ("o" ?ם) ; Final Mem
- ("p" ?פ) ; Pe
- ("[" ?\]) ; mirroring
- ("]" ?\[) ; mirroring
- ("a" ?ש) ; Shin
- ("s" ?ד) ; Dalet
- ("d" ?ג) ; Gimel
- ("f" ?כ) ; Kaf
- ("g" ?ע) ; Ayin
- ("h" ?י) ; Yod
- ("j" ?ח) ; Het
- ("k" ?ל) ; Lamed
- ("l" ?ך) ; Final Kaf
- (";" ?ף) ; Final Pe
- ("'" ?,)
- ("z" ?ז) ; Zayin
- ("x" ?ס) ; Samekh
- ("c" ?ב) ; Bet
- ("v" ?ה) ; He
- ("b" ?נ) ; Nun
- ("n" ?מ) ; Mem
- ("m" ?צ) ; Tsadi
- ("," ?ת) ; Tav
- ("." ?ץ) ; Final Tsadi
- ("/" ?.) ; Stop
- ("(" ?\)) ; mirroring
- (")" ?\() ; mirroring
- ("{" ?}) ; mirroring
- ("}" ?{) ; mirroring
- ("<" ?>) ; mirroring
- (">" ?<) ; mirroring
- ("q`" ?ְ) ; Sheva
- ("q1" ?ֱ) ; Hataf Segol
- ("q2" ?ֲ) ; Hataf Patah
- ("q3" ?ֳ) ; Hataf Qamats
- ("q4" ?ִ) ; Hiriq
- ("q5" ?ֵ) ; Tsere
- ("q6" ?ֶ) ; Segol (Point)
- ("q7" ?ַ) ; Patah
- ("q8" ?ָ) ; Qamats
- ("q9" ?ׂ) ; Sin dot שׁ
- ("q0" ?ׁ) ; Shin dot
- ("q-" ?ֹ) ; Holam
- ("q=" ?ּ) ; Dagesh or Mapiq
- ("q\\" ?ֻ) ; Qubuts
- ("qq" ?/)
- ("qw" ?׳) ; Geresh (Punct.)
- ("qi" ?װ) ; Yiddish Double Vav
- ("qp" ?־) ; Maqaf
- ("q[" ?ֿ) ; Rafe
- ("q]" ?ֽ) ; Meteg
- ("qa" ?₪) ; New Sheqel sign
- ("qh" ?ײ) ; Yiddish Double Yod
- ("qj" ?ױ) ; Yiddish Vav Yod
- ("q\"" ?״) ; Gershayim (Punct.)
- ("q," ?\u200E) ; LRM
- ("q." ?\u200F) ; RLM
-)
-
-(quail-define-package
- "hebrew-new" "Hebrew" "ע" nil "Hebrew SI-1452 new draft input method.
-
-Based on latest draft of SI-1452 keyboard layout.
-Only Hebrew-related characters are considered.
- '`' is used to switch levels instead of Alt-Gr.
-Geresh is mapped to '`k'.
-" nil t t t t nil nil nil nil nil t)
-
-(quail-define-rules
- ("q" ?/)
- ("w" ?\')
- ("e" ?ק) ; Qof
- ("r" ?ר) ; Resh
- ("t" ?א) ; Alef
- ("y" ?ט) ; Tet
- ("u" ?ו) ; Vav
- ("i" ?ן) ; Final Nun
- ("o" ?ם) ; Final Mem
- ("p" ?פ) ; Pe
- ("[" ?\]) ; mirroring
- ("]" ?\[) ; mirroring
- ("a" ?ש) ; Shin
- ("s" ?ד) ; Dalet
- ("d" ?ג) ; Gimel
- ("f" ?כ) ; Kaf
- ("g" ?ע) ; Ayin
- ("h" ?י) ; Yod
- ("j" ?ח) ; Het
- ("k" ?ל) ; Lamed
- ("l" ?ך) ; Final Kaf
- (";" ?ף) ; Final Pe
- ("'" ?,)
- ("z" ?ז) ; Zayin
- ("x" ?ס) ; Samekh
- ("c" ?ב) ; Bet
- ("v" ?ה) ; He
- ("b" ?נ) ; Nun
- ("n" ?מ) ; Mem
- ("m" ?צ) ; Tsadi
- ("," ?ת) ; Tav
- ("." ?ץ) ; Final Tsadi
- ("/" ?.) ; Stop
- ("(" ?\)) ; mirroring
- (")" ?\() ; mirroring
- ("{" ?}) ; mirroring
- ("}" ?{) ; mirroring
- ("<" ?>) ; mirroring
- (">" ?<) ; mirroring
-
- ("``" ?\;)
- ("`1" ?ֽ) ; Meteg
-;("`2" ??) ; Unassigned
- ("`3" ?€) ; Euro Sign
- ("`4" ?₪) ; New Sheqel sign
- ("`5" ?°) ; Degree Sign
- ("`6" ?֫) ; Ole
-;("`7" ??) ; Unassigned
- ("`8" ?×) ; Multiplication Sign
- ("`9" ?\u200E) ; LRM
- ("`0" ?\u200F) ; RLM
- ("`-" ?־) ; Maqaf
- ("`=" ?–) ; En Dash
- ("`q" ?ׂ) ; Sin dot
- ("`w" ?ׁ) ; Shin dot
- ("`e" ?ָ) ; Qamats
- ("`r" ?ֳ) ; Hataf Qamats
-;("`t" ??) ; Unassigned
- ("`y" ?װ) ; Yiddish Double Vav
- ("`u" ?ֹ) ; Holam
-;("`i" ??) ; Unassigned
-;("`o" ??) ; Unassigned
- ("`p" ?ַ) ; Patah
- ("`[" ?ֲ) ; Hataf Patah
- ("`]" ?ֿ) ; Rafe
- ("`\\" ?ֻ) ; Qubuts
- ("`a" ?ְ) ; Sheva
- ("`s" ?ּ) ; Dagesh or Mapiq
-;("`d" ??) ; Unassigned
-;("`f" ??) ; Unassigned
- ("`g" ?ױ) ; Yiddish Vav Yod
- ("`h" ?ײ) ; Yiddish Double Yod
- ("`j" ?ִ) ; Hiriq
- ("`k" ?׳) ; Geresh (Punct.)
- ("`l" ?“) ; Left Double Quotation Mark
- ("`;" ?”) ; Right Double Quotation Mark
- ("`'" ?״) ; Gershayim (Punct.)
-;("`z" ??) ; Unassigned
- ("`x" ?ֶ) ; Segol (Point)
- ("`c" ?ֱ) ; Hataf Segol
-;("`v" ??) ; Unassigned
-;("`b" ??) ; Unassigned
-;("`n" ??) ; Unassigned
- ("`m" ?ֵ) ; Tsere
-;("`," ??) ; Unassigned
-;("`." ??) ; Unassigned
- ("`/" ?÷) ; Division Sign
-
- ("``" ?׃) ; Sof Pasuq
- ("`!" ?֑) ; Etnahta
- ("`@" ?֒) ; Segol (Accent)
- ("`#" ?֓) ; Shalshelet
- ("`$" ?֔) ; Zaqef Qatan
- ("`%" ?֕) ; Zaqef Gadol
- ("`^" ?֖) ; Tipeha
- ("`&" ?֗) ; Revia
- ("`*" ?֘) ; Zarqa
- ("`(" ?֙) ; Pashta
- ("`)" ?֚) ; Yetiv
- ("`_" ?֛) ; Tevir
- ("`+" ?֜) ; Geresh (Accent)
- ("`Q" ?֝) ; Geresh Muqdam
- ("`W" ?֞) ; Gershayim (Accent)
- ("`E" ?ׇ) ; Qamats Qatan
- ("`R" ?֟) ; Qarney Para
- ("`T" ?֠) ; Telisha Gedola
- ("`Y" ?֡) ; Pazer
- ("`U" ?ֺ) ; Holam Haser for Vav
- ("`I" ?֢) ; Atnah Hafukh
- ("`O" ?֣) ; Munah
-;("`P" ??) ; Reserved
- ("`{" ?֤) ; Mahapakh
- ("`}" ?֥) ; Merkha
- ("`|" ?֦) ; Merkha Kefula
-;("`A" ??) ; Reserved
-;("`S" ??) ; Reserved
- ("`D" ?֧) ; Darga
- ("`F" ?֨) ; Qadma
- ("`G" ?֩) ; Telisha Qetana
- ("`H" ?֪) ; Yerah Ben Yomo
- ("`J" ?\u200D) ; ZWJ
- ("`K" ?֬) ; Iluy
- ("`L" ?“) ; Left Double Quotation Mark (2nd)
- ("`:" ?„) ; Double Low-9 Quotation Mark
- ("`\"" ?֭) ; Dehi
- ("`Z" ?֮) ; Zinor
- ("`X" ?֯) ; Masora Circle
- ("`C" ?\u034F) ; CGJ
- ("`V" ?׀) ; Paseq
- ("`B" ?׆) ; Nun Hafukha
- ("`N" ?\u200C) ; ZWNJ
-;("`M" ??) ; Unassigned
-;("`<" ??) ; Unassigned
- ("`>" ?ׅ) ; Lower Dot
- ("`?" ?ׄ) ; Upper Dot
-)
-
-(quail-define-package
- "hebrew-lyx" "Hebrew" "לִ" nil "Hebrew LyX input method.
-
-Based on LyX keyboard layout.
-Additional mappings for Rafe and Yiddish ligatures.
-" nil t t t t nil nil nil nil nil t)
-
-(quail-define-rules
- ("`" ?\;)
- ("_" ?־) ; Maqaf
- ("q`" ?ְ) ; Sheva
- ("w" ?\')
- ("e" ?ק) ; Qof
- ("r" ?ר) ; Resh
- ("t" ?א) ; Alef
- ("y" ?ט) ; Tet
- ("u" ?ו) ; Vav
- ("i" ?ן) ; Final Nun
- ("o" ?ם) ; Final Mem
- ("p" ?פ) ; Pe
- ("[" ?\]) ; mirroring
- ("]" ?\[) ; mirroring
- ("a" ?ש) ; Shin
- ("s" ?ד) ; Dalet
- ("d" ?ג) ; Gimel
- ("f" ?כ) ; Kaf
- ("g" ?ע) ; Ayin
- ("h" ?י) ; Yod
- ("j" ?ח) ; Het
- ("k" ?ל) ; Lamed
- ("l" ?ך) ; Final Kaf
- (";" ?ף) ; Final Pe
- ("'" ?,)
- ("z" ?ז) ; Zayin
- ("x" ?ס) ; Samekh
- ("c" ?ב) ; Bet
- ("v" ?ה) ; He
- ("b" ?נ) ; Nun
- ("n" ?מ) ; Mem
- ("m" ?צ) ; Tsadi
- ("," ?ת) ; Tav
- ("." ?ץ) ; Final Tsadi
- ("/" ?.) ; Stop
- ("(" ?\)) ; mirroring
- (")" ?\() ; mirroring
- ("W" ?׳) ; Geresh (Punct.)
- ("E" ?ָ) ; Qamats
- ("R" ?ֿ) ; Rafe
- ("T" ?\u200E) ; LRM
- ("Y" ?\u200F) ; RLM
- ("U" ?ֹ) ; Holam
- ("I" ?ײ) ; Yiddish Double Yod
- ("O" ?װ) ; Yiddish Double Vav
- ("P" ?ַ) ; Patah
- ("{" ?}) ; mirroring
- ("}" ?{) ; mirroring
- ("A" ?ְ) ; Sheva
- ("S" ?ּ) ; Dagesh or Mapiq
- ("F" ?״) ; Gershayim (Punct.)
- ("G" ?ׂ) ; Sin dot
- ("H" ?ׁ) ; Shin dot
- ("J" ?ִ) ; Hiriq
- ("K" ?₪) ; New Sheqel sign
- ("L" ?ױ) ; Yiddish Vav Yod
- ("X" ?ֶ) ; Segol (Point)
- ("C" ?ֻ) ; Qubuts
- ("V" ?ֱ) ; Hataf Segol
- ("B" ?ֲ) ; Hataf Patah
- ("N" ?ֳ) ; Hataf Qamats
- ("M" ?ֵ) ; Tsere
- ("<" ?>) ; mirroring
- (">" ?<) ; mirroring
-)
-
-
-(quail-define-package
- "hebrew-full" "Hebrew" "עִ֫" nil "Hebrew Full method.
-
-Provides access to all Hebrew characters suitable to Modern Hebrew.
-" nil t t t t nil nil nil nil nil t)
-
-(quail-define-rules
- ("`" ?\;)
- ("-" ?־) ; Maqaf
- ("w" ?')
- ("e" ?ק) ; Qof
- ("r" ?ר) ; Resh
- ("t" ?א) ; Alef
- ("y" ?ט) ; Tet
- ("u" ?ו) ; Vav
- ("i" ?ן) ; Final Nun
- ("o" ?ם) ; Final Mem
- ("p" ?פ) ; Pe
- ("[" ?\]) ; mirroring
- ("]" ?\[) ; mirroring
- ("a" ?ש) ; Shin
- ("s" ?ד) ; Dalet
- ("d" ?ג) ; Gimel
- ("f" ?כ) ; Kaf
- ("g" ?ע) ; Ayin
- ("h" ?י) ; Yod
- ("j" ?ח) ; Het
- ("k" ?ל) ; Lamed
- ("l" ?ך) ; Final Kaf
- (";" ?ף) ; Final Pe
- ("'" ?,)
- ("z" ?ז) ; Zayin
- ("x" ?ס) ; Samekh
- ("c" ?ב) ; Bet
- ("v" ?ה) ; He
- ("b" ?נ) ; Nun
- ("n" ?מ) ; Mem
- ("m" ?צ) ; Tsadi
- ("," ?ת) ; Tav
- ("." ?ץ) ; Final Tsadi
- ("/" ?.)
-
- ("(" ?\)) ; mirroring
- (")" ?\() ; mirroring
- ("Q" ?/)
- ("W" ?׳) ; Geresh (Punct.)
- ("E" ?₪) ; New Sheqel Sign
- ("R" ?ֿ) ; Rafe
- ("T" ?ֱ) ; Hataf Segol
- ("Y" ?ױ) ; Yiddish Vav Yod
- ("U" ?װ) ; Yiddish Double Vav
- ("I" ?ֲ) ; Hataf Patah
- ("O" ?ֳ) ; Hataf Qamats
- ("P" ?״) ; Gershayim (Punct.)
- ("{" ?}) ; mirroring
- ("}" ?{) ; mirroring
- ("A" ?ְ) ; Sheva
- ("S" ?ּ) ; Dagesh or Mapiq
- ("D" ?ֻ) ; Qubuts
- ("F" ?ֹ) ; Holam
- ("G" ?ֶ) ; Segol (Point)
- ("H" ?ֵ) ; Tsere
- ("J" ?ִ) ; Hiriq
- ("K" ?ַ) ; Patah
- ("L" ?ָ) ; Qamats
- ("Z" ?ׂ) ; Sin Dot
- ("X" ?ׁ) ; Shin Dot
- ("C" ?֫) ; Ole
- ("V" ?ײ) ; Yiddish Double Yod
- ("B" ?׃) ; Sof Pasuq
- ("N" ?\u200E) ; LRM
- ("M" ?\u200F) ; RLM
- ("<" ?>) ; mirroring
- (">" ?<) ; mirroring
-
- ("q`" ?\u202D) ; LRO
- ("q1" ?\u202E) ; RLO
- ("q2" ?\u202A) ; LRE
- ("q3" ?\u202B) ; RLE
- ("q4" ?\u202C) ; PDF
- ("q5" ?\u034F) ; CGJ
- ("q6" ?֬) ; Iluy
- ("q8" ?֭) ; Dehi
- ("q9" ?ׇ) ; Qamats Qatan
- ("q0" ?֝) ; Geresh Muqdam
- ("q-" ?-) ; Minus
- ("q=" ?֮) ; Zinor
- ("q|" ?׀) ; Paseq
- ("qw" ?֯) ; Masora Circle
- ("qe" ?ׄ) ; Upper Dot
- ("qr" ?ׅ) ; Lower Dot
- ("qy" ?֟) ; Qarney Para
- ("qu" ?֓) ; Shalshelet
- ("qi" ?֞) ; Gershayim (Accent)
- ("qo" ?֜) ; Geresh (Accent)
- ("qp" ?֨) ; Qadma
- ("q[" ?׆) ; Nun Hafukha
- ("qa" ?ֺ) ; Holam Haser for Vav
- ("qs" ?֩) ; Telisha Qetana
- ("qd" ?֠) ; Telisha Gedola
- ("qf" ?֡) ; Pazer
- ("qg" ?֕) ; Zaqef Gadol
- ("qh" ?֔) ; Zaqef Qatan
- ("qj" ?֙) ; Pashta
- ("qk" ?֤) ; Mahapakh
- ("ql" ?֗) ; Revia
- ("q;" ?֒) ; Segol (Accent)
- ("q'" ?֘) ; Zarqa
- ("qz" ?֪) ; Yerah Ben Yomo
- ("qx" ?֦) ; Merkha Kefula
- ("qc" ?֚) ; Yetiv
- ("qv" ?֛) ; Tevir
- ("qb" ?֧) ; Darga
- ("qn" ?֑) ; Etnahta
- ("qm" ?֣) ; Munah
- ("q," ?֖) ; Tipeha
- ("q." ?֥) ; Merkha
- ("q/" ?ֽ) ; Meteg
-)
-
-
-(quail-define-package
- "hebrew-biblical-tiro" "Hebrew" "תִרֹ" nil
-"Biblical Hebrew Tiro input method.
-
-Based on Society of Biblical Literature's Tiro keyboard layout.
-Not suitable for modern Hebrew input.
- 'q' is used to switch levels instead of Alt-Gr.
- Combining dot above (Called Masora dot) (̇) is mapped to 'q1'.
-" nil t t t t nil nil nil nil nil t)
-
-(quail-define-rules
- ("`" ?׃) ; Sof Pasuq
- ("-" ?־) ; Maqaf
- ("=" ?◦) ; White Bullet
- ("w" ?׳) ; Geresh (Punct.)
- ("e" ?ק) ; Qof
- ("r" ?ר) ; Resh
- ("t" ?א) ; Alef
- ("y" ?ט) ; Tet
- ("u" ?ו) ; Vav
- ("i" ?ן) ; Final Nun
- ("o" ?ם) ; Final Mem
- ("p" ?פ) ; Pe
- ("[" ?\]) ; mirroring
- ("]" ?\[) ; mirroring
- ("\\" ?׀) ; Paseq
- ("a" ?ש) ; Shin
- ("s" ?ד) ; Dalet
- ("d" ?ג) ; Gimel
- ("f" ?כ) ; Kaf
- ("g" ?ע) ; Ayin
- ("h" ?י) ; Yod
- ("j" ?ח) ; Het
- ("k" ?ל) ; Lamed
- ("l" ?ך) ; Final Kaf
- (";" ?ף) ; Final Pe
- ("'" ?֚) ; Yetiv
- ("z" ?ז) ; Zayin
- ("x" ?ס) ; Samekh
- ("c" ?ב) ; Bet
- ("v" ?ה) ; He
- ("b" ?נ) ; Nun
- ("n" ?מ) ; Mem
- ("m" ?צ) ; Tsadi
- ("," ?ת) ; Tav
- ("." ?ץ) ; Final Tsadi
- ("/" ?֭) ; Dehi
- ("~" ?֮) ; Zinor
- ("!" ?֩) ; Telisha Qetana
- ("@" ?֙) ; Pashta
- ("#" ?֒) ; Segol (Accent)
- ("$" ?֯) ; Masora circle
- ("%" ?ֺ) ; Holam Haser for Vav
- ("^" ?ֹ) ; Holam
- ("&" ?ֿ) ; Rafe
- ("*" ?ׂ) ; Sin dot
- ("(" ?ׁ) ; Shin dot
- (")" ?֝) ; Geresh Muqdam
- ("_" ?֠) ; Telisha Gedola
- ("+" ?ּ) ; Dagesh or Mapiq
- ("Q" ?ׄ) ; Upper dot
- ("W" ?֬) ; Iluy
- ("E" ?֫) ; Ole
- ("R" ?֟) ; Qarney Para
- ("T" ?֓) ; Shalshelet
- ("Y" ?֞) ; Gershayim (Accent)
- ("U" ?֜) ; Geresh (Accent)
- ("I" ?֡) ; Pazer
- ("O" ?֕) ; Zaqef Gadol
- ("P" ?֔) ; Zaqef Qatan
- ("{" ?֗) ; Revia
- ("}" ?֘) ; Zarqa
- ("|" ?֨) ; Qadma
- ("A" ?ֽ) ; Meteg
- ("S" ?ְ) ; Sheva
- ("D" ?ֻ) ; Qubuts
- ("F" ?ִ) ; Hiriq
- ("G" ?ֱ) ; Hataf Segol
- ("H" ?ֶ) ; Segol (Point)
- ("J" ?ֵ) ; Tsere
- ("K" ?ֳ) ; Hataf Qamats
- ("L" ?ָ) ; Qamats
- (":" ?ֲ) ; Hataf Patah
- ("\"" ?ַ) ; Patah
- ("Z" ?ׅ) ; Lower dot
- ("X" ?֤) ; Mahapakh
- ("C" ?֪) ; Yerah Ben Yomo
- ("V" ?֦) ; Merkha Kefula
- ("B" ?֥) ; Merkha
- ("N" ?֧) ; Darga
- ("M" ?֛) ; Tevir
- ("<" ?֑) ; Etnahta
- (">" ?֖) ; Tipeha
- ("?" ?֣) ; Munah
-
- ("q`" ?\;)
- ("q1" ?\u0307) ; Combining dot above
- ("q2" ?\u0336) ; Combining long stroke overlay
- ("q3" ?\u030A) ; Combining ring above
- ("q4" ?₪) ; New Sheqel Sign
- ("q5" ?\u200D) ; ZWJ
- ("q6" ?\u200C) ; ZWNJ
- ("q7" ?\u034F) ; CGJ
- ("q8" ?\u200E) ; LRM
- ("q9" ?\u200F) ; RLM
- ("q0" ?◌) ; Dotted Circle
- ("q-" ?-) ; Minus
- ("q=" ?•) ; Bullet
- ("qq" ?\u0308) ; Combining Diaeresis
- ("qw" ?״) ; Gershayim (Punct.)
- ("qe" ?€) ; Euro Sign
- ("qu" ?װ) ; Yiddish Double Vav
- ("q\\" ?\\)
- ("qh" ?ײ) ; Yiddish Double Yod
- ("qj" ?ױ) ; Yiddish Vav Yod
- ("ql" ?ׇ) ; Qamats Qatan
- ("q'" ?,)
- ("qc" ?֢) ; Atnah Hafukh
- ("qb" ?׆) ; Nun Hafukha
- ("q/" ?.)
-
- ("q~" ?~)
- ("q!" ?!)
- ("q@" ?@)
- ("q#" ?#)
- ("q$" ?$)
- ("q%" ?%)
- ("q^" ?^)
- ("q&" ?&)
- ("q*" ?*)
- ("q(" ?\)) ; mirroring
- ("q)" ?\() ; mirroring
- ("q_" ?_)
- ("q+" ?+)
- ("qQ" ?/)
- ("qW" ?')
- ("q{" ?}) ; mirroring
- ("q}" ?{) ; mirroring
- ("q|" ?|)
- ("q:" ?:)
- ("q\"" ?\")
- ("q<" ?>)
- ("q>" ?<)
- ("q?" ??)
-)
-
-(quail-define-package
- "hebrew-biblical-sil" "Hebrew" "סִל" nil
-"Biblical Hebrew SIL input method.
-
-Based on Society of Biblical Literature's SIL keyboard layout.
-Phonetic and not suitable for modern Hebrew input.
- '`' is used to switch levels instead of Alt-Gr.
- Euro Sign (€) is mapped to 'Z'.
-" nil t t t t nil nil nil nil nil t)
-
-(quail-define-rules
- ("-" ?־) ; Maqaf
- ("=" ?ּ) ; Dagesh or Mapiq
- ("q" ?ק) ; Qof
- ("w" ?ו) ; Vav
- ("e" ?ֶ) ; Segol (Point)
- ("r" ?ר) ; Resh
- ("t" ?ת) ; Tav
- ("y" ?י) ; Yod
- ("u" ?ֻ) ; Qubuts
- ("i" ?ִ) ; Hiriq
- ("o" ?ֹ) ; Holam
- ("p" ?פ) ; Pe
- ("[" ?\]) ; mirroring
- ("]" ?\[) ; mirroring
- ("\\" ?׀) ; Paseq
- ("a" ?ַ) ; Patah
- ("s" ?ס) ; Samekh
- ("d" ?ד) ; Dalet
- ("f" [ "שׂ" ]) ; Shin + Sin dot
- ("g" ?ג) ; Gimel
- ("h" ?ה) ; He
- ("j" [ "שׁ" ]) ; Shin + Shin dot
- ("k" ?כ) ; Kaf
- ("l" ?ל) ; Lamed
- (";" ?ְ) ; Sheva
- ("'" ?’) ; Right Single Quotation Mark
- ("z" ?ז) ; Zayin
- ("x" ?ח) ; Het
- ("c" ?צ) ; Tsadi
- ("v" ?ט) ; Tet
- ("b" ?ב) ; Bet
- ("n" ?נ) ; Nun
- ("m" ?מ) ; Mem
-
- ("~" ?₪) ; New Sheqel Sign
- ("@" ?֘) ; Zarqa
- ("#" ?֨) ; Qadma
- ("$" ?֜) ; Geresh (Accent)
- ("%" ?֞) ; Gershayim (Accent)
- ("&" ?֬) ; Iluy
- ("*" ?֝) ; Geresh Muqdam
- ("(" ?\)) ; mirroring
- (")" ?\() ; mirroring
- ("_" ?–) ; Em Dash
- ("Q" ?֗) ; Revia
- ("E" ?ֵ) ; Tsere
- ("Y" ?֟) ; Qarney Para
- ("O" ?ֺ) ; Holam Haser for Vav
- ("P" ?ף) ; Final Pe
- ("{" ?}) ; mirroring
- ("}" ?{) ; mirroring
-
- ("A" ?ָ) ; Qamats
- ("S" ?ש) ; Shin
- ("K" ?ך) ; Final Kaf
- (":" ?״) ; Gershayim (Punct.)
- ("\"" ?”) ; Right Double Quotation Mark
- ("Z" ?€) ; Euro Sign
- ("C" ?ץ) ; Final Tsadi
- ("N" ?ן) ; Final Nun
- ("M" ?ם) ; Final Mem
- ("<" ?ע) ; Ayin
- (">" ?א) ; Alef
-
- ("``" ?$)
- ("`1" ?ֽ) ; Meteg
- ("`2" ?֢) ; Atnah Hafukh
- ("`3" ?֖) ; Tipeha
- ("`4" ?֥) ; Merkha
- ("`5" ?֦) ; Merkha Kefula
- ("`6" ?֭) ; Dehi
- ("`7" ?֣) ; Munah
- ("`8" ?֛) ; Tevir
- ("`9" ?֧) ; Darga
- ("`0" ?֪) ; Yerah Ben Yomo
- ("`-" ?—) ; Em Dash
- ("`=" ?֑) ; Etnahta
- ("`]" ?֚) ; Accent Yetiv
- ("`\\" ?֤) ; Mahapakh
- ("`a" ?ׇ) ; Qamats Qatan
- ("`g" ? ◦) ; White Bullet
- ("`h" ?\u0336) ; Combining Long Stroke Overlay
- ("`;" ?\;)
- ("`'" ?\u0323); Combining Dot Below (Lower Point??)
- ("`m" ?\u200C) ; ZWNJ
- ("`," ?») ; mirroring
- ("`." ?«) ; mirroring
- ("`/" ?׳) ; Geresh (Punct.)
-
- ("`!" ?֗) ; Revia
- ("`@" ?֮) ; Zinor
- ("`#" ?֙) ; Pashta
- ("`$" ?֠) ; Telisha Gedola
- ("`%" ?֩) ; Telisha Qetana
- ("`&" ?֡) ; Pazer
- ("`*" ?֕) ; Zaqef Gadol
- ("`(" ?֓) ; Shalshelet
- ("`)" ?֯) ; Masora Circle
- ("`_" ?ֿ) ; Rafe
- ("`+" ?◌) ; Dotted Circle
- ("`E" ?ֱ) ; Hataf Segol
- ("`O" ?ֳ) ; Hataf Qamats
- ("`P" ?\u034F) ; CGJ
- ("`{" ?֔) ; Zaqef Qatan
- ("`}" ?֒) ; Segol (Accent)
- ("`|" ?֫) ; Ole
- ("`A" ?ֲ) ; Hataf Patah
- ("`G" ?•) ; Bullet
- ("`H" ?\u030A) ; Combining ring above
- ("`:" ?׃) ; Sof Pasuq
- ("`\"" ?ׄ) ; Upper Dot
- ("`M" ?\u200D) ; ZWJ
- ("`<" ?\u0307) ; Combining dot above
- ("`>" ?\u0308) ; Combining Diaeresis
-)
-
-
-(quail-define-package
- "yiddish-royal" "Hebrew" "ײר" nil "Yiddish Royal input method.
-
-Based on Royal Yiddish typewriter.
-Better for yiddish than Hebrew methods.
-" nil t t t t nil nil nil nil nil t)
-
-(quail-define-rules
- ("`" ?~)
- ("q" ?ק) ; Qof
- ("w" [ "אָ" ]) ; Qamats Alef (Komets Alef)
- ("e" ?ר) ; Resh
- ("r" ?א) ; Alef (Shtumer Alef)
- ("t" ?ט) ; Tet
- ("y" ?װ) ; Yiddish Double Vav (Tsvey Vovn)
- ("u" ?ו) ; Vav
- ("i" ?ן) ; Final Nun
- ("o" ?ם) ; Final Mem
- ("p" [ "פֿ" ]) ; Rafe Pe (Fey)
- ("[" [ "פּ" ]) ; Dagesh Pe (Pey)
- ("]" ?,)
- ("a" ?ש) ; Shin
- ("s" ?ד) ; Dalet
- ("d" ?ג) ; Gimel
- ("f" ?כ) ; Kaf
- ("g" ?ע) ; Ayin
- ("h" ?ײ) ; Yiddish Double Yod (Tsvey Yudn)
- ("j" ?י) ; Yod
- ("k" ?ח) ; Het
- ("l" ?ל) ; Lamed
- (";" ?ך) ; Final Kaf
- ("'" ?ף) ; Final Pe
- ("z" ?.)
- ("x" ?ז) ; Zayin
- ("c" ?ס) ; Samekh
- ("v" ?ב) ; Bet
- ("b" ?ה) ; He
- ("n" ?נ) ; Nun
- ("m" ?מ) ; Mem
- ("," ?צ) ; Tsadi
- ("." ?ת) ; Tav
- ("/" ?ץ) ; Final Tsadi
-
- ("~" ?@)
- ("!" ?”) ; Right Double Quotation Mark
- ("@" ?„) ; Double Low-9 Quotation Mark
- ("(" ?\)) ; mirroring
- (")" ?\() ; mirroring
- ("Q" ?“) ; Left Double Quotation Mark
- ("W" ?”) ; Right Double Quotation Mark
- ("E" ?ײ) ; Yiddish Double Yod (x2)
- ("R" [ "אַ" ]) ; Patah Alef (Pasekh Alef)
-; ("T" "")
- ("Y" ?ױ) ; Ligature Yiddish Vav Yod (vov yud)
- ("U" [ "וּ" ]) ; Melupm vov
- ("I" ?/)
- ("O" ?\\)
- ("P" ?פ) ; Pe
- ("{" ??)
- ("}" ?!)
- ("A" [ "שׂ" ]) ; Shin + Sin dot
- ("S" [ "שׂ" ]) ; Shin + Sin dot
-; ("D" "")
- ("F" [ "כּ" ]) ; Dagesh Kaf (Kof)
-; ("G" "")
- ("H" [ "ײַ" ]) ; Yiddish Double Yod + Patah (Pasekh Tsvey Yudn)
- ("J" [ "יִ" ]) ; Khirik Yud
- ("K" ?}) ; mirroring
- ("L" ?{) ; mirroring
- ("\"" ?\;)
- ("Z" ??)
- ("X" ?|)
- ("C" [ "בּ" ]) ; Dagesh Bet (Beys)
- ("V" [ "בֿ" ]) ; Rafe Bet (Veys)
- ("B" ?\]) ; mirroring
- ("N" ?\[) ; mirroring
- ("M" ?>) ; mirroring
- ("<" ?<) ; mirroring
- (">" [ "תּ" ]) ; Dagesh Tav (Tof)
- ("?" ?\')
-)
-
-
-(quail-define-package
- "yiddish-keyman" "Hebrew" "ײק" nil "Yiddish Keyman input method.
-
-Based on Keyman keyboard layout.
-Better for yiddish than Hebrew methods..
-" nil t t t t nil nil nil nil nil t)
-
-(quail-define-rules
- ("`" ?\;)
- ("q" ?„) ; Double Low-9 Quotation Mark
- ("w" ?ש) ; Shin
- ("e" ?ע) ; Ayin
- ("r" ?ר) ; Resh
- ("t" ?ט) ; Tet
- ("y" ?י) ; Yod
- ("u" ?ו) ; Vav
- ("i" ?י) ; Yod (x2)
- ("o" [ "אָ" ]) ; Qamats Alef (Komets Alef)
- ("p" [ "פּ" ]) ; Dagesh Pe (Pey)
- ("[" ?\]) ; mirroring
- ("]" ?\[) ; mirroring
- ("a" [ "אַ" ]) ; Patah Alef (Pasekh Alef)
- ("s" ?ס) ; Samekh
- ("d" ?ד) ; Dalet
- ("f" [ "פֿ" ]) ; Rafe Pe (Fey)
- ("g" ?ג) ; Gimel
- ("h" ?ה) ; He
- ("j" ?ײ) ; Yiddish Double Yod (Tsvey Yudn)
- ("k" ?ק) ; Qof
- ("l" ?ל) ; Lamed
- ("z" ?ז) ; Zayin
- ("x" ?כ) ; Kaf
- ("c" ?צ) ; Tsadi
- ("v" ?װ) ; Yiddish Double Vav (Tsvey Vovn)
- ("b" ?ב) ; Bet
- ("n" ?נ) ; Nun
- ("m" ?מ) ; Mem
-
- ("(" ?\)) ; mirroring
- (")" ?\() ; mirroring
- ("Q" ?”) ; Right Double Quotation Mark
- ("W" [ "שׂ" ]) ; Shin + Sin dot
- ("E" ?ײ) ; Yiddish Double Yod (x2)
-; ("R" "") ;
- ("T" [ "תּ" ]) ; Dagesh Tav (Tof)
- ("Y" [ "ײַ" ]) ; Yiddish Double Yod + Patah (Pasekh Tsvey Yudn)
- ("U" [ "וּ" ]) ; Melupm vov
- ("I" [ "יִ" ]) ; Khirik Yud
- ("O" ?ױ) ; Ligature Yiddish Vav Yod (vov yud)
-; ("P" "")
- ("{" ?}) ; mirroring
- ("}" ?{) ; mirroring
- ("A" ?א) ; Alef (Shtumer Alef)
- ("S" ?ת) ; Tav
- ("F" ?ף) ; Final Pe
- ("G" ?׳) ; Geresh (Punct.)
- ("H" ?ח) ; Het
- ("J" ?ײ) ; Yiddish Double Yod (x2)
- ("K" [ "כּ" ]) ; Dagesh Kaf (Kof)
-; ("L" "")
-; ("Z" "")
- ("X" ?ך) ; Final Kaf
- ("C" ?ץ) ; Final Tsadi
- ("V" [ "בֿ" ]) ; Rafe Bet (Veys) ) ; Bet
-; ("B" "")
- ("N" ?ן) ; Final Nun
- ("M" ?ם) ; Final Mem
- ("<" ?>) ; mirroring
- (">" ?<) ; mirroring
-)
-
-
-(quail-define-package
- "hebrew-phonetic-xkb" "Hebrew" "פ" nil "Hebrew phonetic (XKB) input method.
-Based on the XKB hebrew-phonetic keyboard layout,
-layout that attempts to match Hebrew letters to English phonetic equivalents, some of its chars however
-are mapped according to their shape, as o--> samesh.
-;; 1! 2@ 3# 4$ 5% 6^ 7& 8* 9( 0) -_ =+ ;~
-;; קק וו אא רר תט עע וו יי סס פף ]}[{
-;; אא שש דד פפ גג הה יי כך לל;:'\"\|
-;; זז חח צץ וו בב נן מם ,>.</?
-;;
-" nil t t t t nil nil nil nil nil t)
-
-(quail-define-rules
-
- ("A" ?א) ; Alef
- ("B" ?ב) ; Bet
- ("C" ?ץ) ; Final Tsadi
- ("D" ?ד) ; Dalet
- ("E" ?א) ; aleph
- ("E" ?א) ; aleph
- ("F" ?ף) ; Final Pe
- ("G" ?ג) ; Gimel
- ("H" ?ה) ; He
- ("I" ?י) ; Yod
- ("J" ?י) ; Yod
- ("K" ?ך) ; Kaf sofit
- ("L" ?ל) ; Lamed
- ("M" ?ם) ; Final Mem
- ("N" ?ן) ; Final Nun
- ("O" ?ס) ; Samekh
- ("P" ?ף) ; Final Pe
- ("Q" ?ק) ; Kuf
- ("R" ?ר) ; Resh
- ("S" ?ש) ; Shin
- ("T" ?ט) ; Tet
- ("U" ?ו) ; Vav
- ("V" ?ו) ; Vav
- ("W" ?ו) ; Vav
- ("X" ?ח) ; Het
- ("Y" ?ע) ; Ayin
- ("Z" ?ז) ; Zayin
- ("a" ?א) ; Alef
- ("b" ?ב) ; Bet
- ("c" ?צ) ; Tsadi
- ("d" ?ד) ; Dalet
- ("e" ?א) ; aleph
- ("f" ?פ) ; fe
- ("g" ?ג) ; Gimel
- ("h" ?ה) ; He
- ("i" ?י) ; Yod
- ("j" ?י) ; Yod
- ("k" ?כ) ; Kaf
- ("l" ?ל) ; Lamed
- ("m" ?מ) ; Mem
- ("n" ?נ) ; Nun
- ("o" ?ס) ; Samekh
- ("p" ?פ) ; Pe
- ("q" ?ק) ; Kuf
- ("r" ?ר) ; Resh
- ("s" ?ש) ; Shin
- ("t" ?ת) ; Tav
- ("u" ?ו) ; Vav
- ("v" ?ו) ; Vav
- ("w" ?ו) ; Vav
- ("x" ?ח) ; Het
- ("y" ?ע) ; Ayin
- ("z" ?ז) ; Zayin
- ("[" ?\]) ; mirroring
- ("]" ?\[) ; mirroring
- ("." ?.) ; Stop
- ("(" ?\)) ; mirroring
- (")" ?\() ; mirroring
- ("{" ?}) ; mirroring
- ("}" ?{) ; mirroring
- ("<" ?>) ; mirroring
- (">" ?<) ; mirroring
-)
-
-
-
-(quail-define-package
- "hebrew-phonetic-qwerty" "Hebrew" "ף" nil "Hebrew phonetic input method.
-
-Based on the KDE hebrew-phonetic keyboard layout, layout that
-attempts to match Hebrew letters to English phonetic equivalents.
-It is however modified, c=chet x zadik, o=wav y=ain e=aleph. Moreover some but
-not all niqqud are added.
-;; 1! 2@ 3# 4$ 5% 6^ 7& 8* 9( 0) -_ =+ ;~
-;; קֹ וׁ אֶ רר תט עע וּ יִ וֹ פַ ]}[{
-;; אָ שס דּ פף גג הה יִ כך לְ ;: '\" \|
-;; זֵ צץ חֻ וו בּ נן מם ,>.</?
-;;
-" nil t t t t nil nil nil nil nil t)
-
-
-(quail-define-rules
-
-
- ("A" ?ָ) ; Qamats
- ("B" ?ּ) ; Dagesh or Mapiq
- ("C" ?ֻ) ; Qubuts
- ("D" ?ּ) ; Dagesh or Mapiq
- ("E" ?ֶ) ; Segol (Point)
- ("F" ?ף) ; Final Pe
- ("G" ?ג) ; Gimel
- ("H" ?ה) ; He
- ("I" ?ִ) ; Hiriq
- ("J" ?ִ) ; Hiriq
- ("K" ?ך) ; Kaf sofit
- ("L" ?ְ) ; Sheva
- ("M" ?ם) ; Final Mem
- ("N" ?ן) ; Final Nun
- ("O" ?ֹ) ; Holam
- ("P" ?ַ) ; Patah
- ("Q" ?ֹ) ; Holam
- ("R" ?ר) ; Resh
- ("S" ?ס) ; Samekh
- ("T" ?ט) ; Tet
- ("U" ?ּ) ; Dagesh or Mapiq
- ("V" ?ו) ; Vav
- ("W" ?ׁ) ; Shin dot
- ("X" ?ץ) ; Final Tsadi
- ("Y" ?ע) ; Ayin
- ("Z" ?ֵ) ; Tsere
- ("a" ?א) ; Alef
- ("b" ?ב) ; Bet
- ("c" ?ח) ; Het
- ("d" ?ד) ; Dalet
- ("e" ?א) ; aleph
- ("f" ?פ) ; fe
- ("g" ?ג) ; Gimel
- ("h" ?ה) ; He
- ("i" ?י) ; Yod
- ("j" ?י) ; Yod
- ("k" ?כ) ; Kaf
- ("l" ?ל) ; Lamed
- ("m" ?מ) ; Mem
- ("n" ?נ) ; Nun
- ("o" ?ו) ; Vav
- ("p" ?פ) ; Pe
- ("q" ?ק) ; Kuf
- ("r" ?ר) ; Resh
- ("s" ?ש) ; Shin
- ("t" ?ת) ; Tav
- ("u" ?ו) ; Vav
- ("v" ?ו) ; Vav
- ("w" ?ו) ; Vav
- ("x" ?צ) ; Tsadi
- ("y" ?ע) ; Ayin
- ("z" ?ז) ; Zayin
- ("[" ?\]) ; mirroring
- ("]" ?\[) ; mirroring
- ("." ?.) ; Stop
- ("(" ?\)) ; mirroring
- (")" ?\() ; mirroring
- ("{" ?}) ; mirroring
- ("}" ?{) ; mirroring
- ("<" ?>) ; mirroring
- (">" ?<) ; mirroring
-)
-
-
-
-
-
-;;; hebrew.el ends here
--
‘As I sat looking up at the Guinness ad, I could never figure out /
How your man stayed up on the surfboard after forty pints of stout’
(C. Moore)
[View Less]