LINUX.ORG.RU

История изменений

Исправление Zmicier, (текущая версия) :

Благодарю, кажется, немного понятнее, но не вполне.

Потому что isearch-string – это только строка поиска, которая отображается в минибуфере
Это позволяет реализовать именно инкрементальный поиск с возможностью возврата к предыдущим состояниям.

А к каким состояниям должна возвращать команда с семантикой «стереть слово»?

DEL по-умолчанию (будучи привязанным к isearch-delete-char, который опосредованно оперирует именно isearch-cmds) отменяет еще и эффект C-s / C-r, то есть возвращает курсор назад к прошлой находке / вперед к следующей. То есть чтобы стереть o после C-s foo C-s C-s, DEL нужно жать трижды.

Это, к слову, мне не нравилось куда более, чем сабж, но это-то легко исправлялось из коробки — благо есть isearch-del-char, который оперирует уже isearch-string и всегда удаляет последний символ.

--приложение--

(defun isearch-pop-state ()
  (setq isearch-cmds (cdr isearch-cmds))
  (isearch--set-state (car isearch-cmds)))

(defun isearch-delete-char ()
  "Discard last input item and move point back.
Last input means the last character or the last isearch command
that added or deleted characters from the search string,
moved point, toggled regexp mode or case-sensitivity, etc.
If no previous match was done, just beep."
  (interactive)
  (if (null (cdr isearch-cmds))
      (ding)
    (isearch-pop-state))
  (isearch-update))

(defun isearch-del-char (&optional arg)
  "Delete character from end of search string and search again.
Unlike `isearch-delete-char', it only deletes the last character,
but doesn't cancel the effect of other isearch command.
If search string is empty, just beep."
  (interactive "p")
  (if (= 0 (length isearch-string))
      (ding)
    (setq isearch-string (substring isearch-string 0
				    (- (min (or arg 1)
					    (length isearch-string))))
          isearch-message (mapconcat 'isearch-text-char-description
                                     isearch-string "")))
  ;; Do the following before moving point.
  (funcall (or isearch-message-function #'isearch-message) nil t)
  ;; Use the isearch-other-end as new starting point to be able
  ;; to find the remaining part of the search string again.
  ;; This is like what `isearch-search-and-update' does,
  ;; but currently it doesn't support deletion of characters
  ;; for the case where unsuccessful search may become successful
  ;; by deletion of characters.
  (if isearch-other-end (goto-char isearch-other-end))
  (isearch-search)
  (isearch-push-state)
  (isearch-update))

Исходная версия Zmicier, :

Благодарю, кажется, немного понятнее, но не вполне.

Потому что isearch-string – это только строка поиска, которая отображается в минибуфере
Это позволяет реализовать именно инкрементальный поиск с возможностью возврата к предыдущим состояниям.

А к каким состояниям должна возвращать команда с семантикой «стереть слово»?

DEL по-умолчанию (будучи привязанным к isearch-delete-char, который опосредованно оперирует именно isearch-cmds) отменяет еще и эффект C-s / C-r, то есть возвращает курсор назад к прошлой находке / вперед к следующей. То есть чтобы стереть o после C-s foo C-s C-s, DEL нужно жать трижды.

Это, к слову, мне не нравилось куда более, чем сабж, но это-то легко исправлялось из коробки — благо есть isearch-del-char, который оперирует уже isearch-string[/inlinle] и всегда удаляет последний символ.

(defun isearch-pop-state ()
  (setq isearch-cmds (cdr isearch-cmds))
  (isearch--set-state (car isearch-cmds)))

(defun isearch-delete-char ()
  "Discard last input item and move point back.
Last input means the last character or the last isearch command
that added or deleted characters from the search string,
moved point, toggled regexp mode or case-sensitivity, etc.
If no previous match was done, just beep."
  (interactive)
  (if (null (cdr isearch-cmds))
      (ding)
    (isearch-pop-state))
  (isearch-update))

(defun isearch-del-char (&optional arg)
  "Delete character from end of search string and search again.
Unlike `isearch-delete-char', it only deletes the last character,
but doesn't cancel the effect of other isearch command.
If search string is empty, just beep."
  (interactive "p")
  (if (= 0 (length isearch-string))
      (ding)
    (setq isearch-string (substring isearch-string 0
				    (- (min (or arg 1)
					    (length isearch-string))))
          isearch-message (mapconcat 'isearch-text-char-description
                                     isearch-string "")))
  ;; Do the following before moving point.
  (funcall (or isearch-message-function #'isearch-message) nil t)
  ;; Use the isearch-other-end as new starting point to be able
  ;; to find the remaining part of the search string again.
  ;; This is like what `isearch-search-and-update' does,
  ;; but currently it doesn't support deletion of characters
  ;; for the case where unsuccessful search may become successful
  ;; by deletion of characters.
  (if isearch-other-end (goto-char isearch-other-end))
  (isearch-search)
  (isearch-push-state)
  (isearch-update))