LINUX.ORG.RU

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

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

А можете еще об’яснить, почему надо с такими сложностями оперировать именно isearch-cmds, а не isearch-string?

Потому что isearch-string – это только строка поиска, которая отображается в минибуфере. Само состояние хранится в стеке isearch-cmds. Каждый элемент этого стека – состояние поиска в определённый момент: текущая введённая строка, позиция совпадения в родительском буфере, успех и пр. Это позволяет реализовать именно инкрементальный поиск с возможностью возврата к предыдущим состояниям. Команды, введённые в минибуфере (включая self-insert-command), модифицируют этот стек: при вводе символа в стек добавляется элемент-состояние, при удалении символа – удаляется элемент. После каждой команды на основе этого стека устанавливается новое значение isearch-string и кучи других переменных с помощью функции isearch--set-state, затем вызывается isearch-update для применения изменений. Можно сказать, что значение isearch-string на любом шаге — это значение поля isearch-string элемента в голове стека.

с такими сложностями

На самомо деле, тут ничего сложного нет. Как и в функции backward-kill-word, сначала определяется, сколько символов от текущей позиции до границы слова, просто вместо удаления N символов мы дропаем N элементов стека isearch-cmds.

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

А можете еще об’яснить, почему надо с такими сложностями оперировать именно isearch-cmds, а не isearch-string?

Потому что isearch-string – это только строка поиска, которая отображается в минибуфере. Само состояние хранится в стеке isearch-cmds. Каждый элемент этого стека – состояние поиска в определённый момент: текущая введённая строка, позиция совпадения в родительском буфере, успех и пр. Это позволяет реализовать именно инкрементальный поиск с возможностью возврата к предыдущим состояниям. Команды, введённые в минибуфере (включая self-insert-command), модифицируют этот стек: при вводе символа в стек добавляется элемент-состояние, при удалении символа – удаляется элемент. После каждой команды на основе этого стека устанавливается новое значение isearch-string и кучи других переменных с помощью функции isearch--set-state, затем вызывается isearch-update для применения изменений. Можно сказать, что значение isearch-string на любом шаге — это значение поля isearch-string элемента в голове стека.

с такими сложностями

На самомо деле, тут ничего сложного нет. Как и в функции backward-kill-word, сначала определяется, сколько символов от текущей позиции до границы слова, только вместо удаления N символов мы дропаем N элементов стека isearch-cmds.