> > I've approached this question only from a user point of > > view (it is useful to be able to do it). > > Well, since I'm not going to do it any time soon, and you > haven't even considered doing it yet, this thread is moot. AFAICT, this (or similar) is the only code needed. It fixes the char-table entries for the equivalent chars, so each points to the equivalence class and not just to itself. (Currently, only the "base" char points to the equivalence class.) ;; Add an entry for each equivalent char. (let ((others ())) (map-char-table (lambda (base v) (let ((chrs (aref equiv base))) (when (consp chrs) (dolist (chr (cdr chrs)) (push (cons (string-to-char chr) (remove chr chrs)) others))))) equiv) (dolist (it others) (let ((base (car it)) (chars (cdr it))) (aset equiv base (append chars (aref equiv base))))))) This code fragment is included in the attached code that updates `character-fold-table'. Evaluate the attached code, to try the behavior proposed in this thread. The attached code provides: * A Boolean option, `char-fold-symmetric', so you can choose which behavior you want. (Let users decide, instead of "flipping a coin" at design time.) If you use Customize (or the equivalent) to change the option value then `character-fold-table' is automatically updated to reflect the new option value. * A function that updates `character-fold-table' to reflect the option value. It evaluates the above code conditionally. Just as now, you can use M-s ' to toggle char folding. With the option value non-nil you get the behavior proposed in this thread. With the option value nil you get the current, more limited behavior. [I'm no expert on char tables. Perhaps the code could be improved. But this seems to work OK. I think it exhibits the proposed behavior.]