In article <[EMAIL PROTECTED]>, Richard Stallman <[EMAIL PROTECTED]> writes:
> A while ago, I proposed to change isearch so that it > translates characters by translation-table-for-input to > solve such a problem, but there raised an objection that > read-char should do that translation. RMS asked to check if > such a change to read-char is surely safe or not, but as > such a check is very difficult and time-consuiming, no one > took on the job. > So, this problem is still unfixed. > I again propose to change isearch. > Yes, let's do it that way. Could you do it now? Oops, it seems that my brain is seriously damaged :-(. I have already installed such a change (perhaps accoding to your decision). The problem is that the change took care only for a typed character. If isearch-string is set from a (possibly different) buffer (e.g. by C-s C-w), the translation doesn't happen. So, I've just installed the attached change. But, there still exists a case that isearch fails. For instance, if your buffer's buffer-file-coding-system is iso-8859-2, and you somehow insert a-acute of iso-8859-1, isearch won't be able to find that a-acute. The fix for that case is very difficult in Emacs 22. --- Kenichi Handa [EMAIL PROTECTED] 2006-09-20 Kenichi Handa <[EMAIL PROTECTED]> * isearch.el (isearch-process-search-char): Cancel the previous change. (isearch-search-string): New function. (isearch-search): Use isearch-search-string. (isearch-lazy-highlight-search): Likewise. Index: isearch.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/isearch.el,v retrieving revision 1.289 retrieving revision 1.290 diff -u -r1.289 -r1.290 --- isearch.el 9 Jul 2006 11:04:18 -0000 1.289 +++ isearch.el 20 Sep 2006 06:13:43 -0000 1.290 @@ -1807,8 +1807,6 @@ ((eq char ?|) (isearch-fallback t nil t))) ;; Append the char to the search string, update the message and re-search. - (if (char-table-p translation-table-for-input) - (setq char (or (aref translation-table-for-input char) char))) (isearch-process-search-string (char-to-string char) (if (>= char ?\200) @@ -1993,6 +1991,36 @@ (t (if isearch-forward 'search-forward 'search-backward))))) +(defun isearch-search-string (string bound noerror) + ;; Search for the first occurance of STRING or its translation. If + ;; found, move point to the end of the occurance, update + ;; isearch-match-beg and isearch-match-end, and return point. + (let ((func (isearch-search-fun)) + (len (length string)) + pos1 pos2) + (setq pos1 (save-excursion (funcall func string bound noerror))) + (if (and (char-table-p translation-table-for-input) + (> (string-bytes string) len)) + (let (translated match-data) + (dotimes (i len) + (let ((x (aref translation-table-for-input (aref string i)))) + (when x + (or translated (setq translated (copy-sequence string))) + (aset translated i x)))) + (when translated + (save-match-data + (save-excursion + (if (setq pos2 (funcall func translated bound noerror)) + (setq match-data (match-data t))))) + (when (and pos2 + (or (not pos1) + (if isearch-forward (< pos2 pos1) (> pos2 pos1)))) + (setq pos1 pos2) + (set-match-data match-data))))) + (if pos1 + (goto-char pos1)) + pos1)) + (defun isearch-search () ;; Do the search with the current search string. (isearch-message nil t) @@ -2008,9 +2036,7 @@ (setq isearch-error nil) (while retry (setq isearch-success - (funcall - (isearch-search-fun) - isearch-string nil t)) + (isearch-search-string isearch-string nil t)) ;; Clear RETRY unless we matched some invisible text ;; and we aren't supposed to do that. (if (or (eq search-invisible t) @@ -2353,7 +2379,7 @@ (isearch-regexp isearch-lazy-highlight-regexp) (search-spaces-regexp search-whitespace-regexp)) (condition-case nil - (funcall (isearch-search-fun) + (isearch-search-string isearch-lazy-highlight-last-string (if isearch-forward (min (or isearch-lazy-highlight-end-limit (point-max)) _______________________________________________ emacs-pretest-bug mailing list emacs-pretest-bug@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-pretest-bug