История изменений
Исправление theNamelessOne, (текущая версия) :
Я, кстати, обнаружил баг в isearch-backward-kill-word
, который появляется, если использовать в isearch
команды повторного поиска (C-s
, C-r
, т.е. isearch-repeat-forward
и isearch-repeat-backward
).
Пример. Содержимое буфера — test| foo-bar foo-bar foo-bar
, ¨|¨ — позиция курсора.
Если ввести C-s foo- C-s bar C-s M-DEL
(первый C-s
запускает поиск), то получим такую позицию курсора в родительском буфере: test foo-bar foo-b|ar foo-bar
.
Баг легко исправить, но с учётом твоего замечания о isearch-delete-char
/isearch-del-char
это можно сделать двумя способами.
Рассмотрим промежуточные состояния:
test| foo-|bar foo-|bar| foo-bar|
^ ^ ^ ^ ^
| | | | |
| | / / /
| | / / -----/
\ | / / /
\ | | | /
--- --- --- --- ---
C-s foo- C-s bar C-s
(1) (2) (3)
Из состояния (3) M-DEL
может вернуть в состояние (1) или (2).
- команда для перевода в состояние (2):
(defun drop-until-backwards (re string) (let ((match (string-match re (string-reverse string)))) (if match (substring string 0 (- (length string) match 1)) ""))) (defun isearch-backward-kill-word () (interactive) (if (null (cdr isearch-cmds)) (ding) (let* ((current-state (car isearch-cmds)) (current-string (isearch--state-string current-state)) (new-string (drop-until-backwards "[[:word:]][^[:word:]]" current-string))) (while (not (string-equal current-string new-string)) (setf isearch-cmds (cdr isearch-cmds) current-state (car isearch-cmds) current-string (isearch--state-string current-state))) (isearch--set-state (car isearch-cmds)))) (isearch-update))
- команда для перевода в состояние (1):
(defun isearch-backward-kill-word-greedy () (interactive) (isearch-backward-kill-word) (let* ((current-state (car isearch-cmds)) (tail (cdr isearch-cmds)) (string (isearch--state-string current-state))) (while (and tail (string-equal string (isearch--state-string (car tail)))) (setf current-state (car tail) tail (cdr tail))) (isearch--set-state current-state) (isearch-update)))
Исправление theNamelessOne, :
Я, кстати, обнаружил баг в isearch-backward-kill-word
, который появляется, если использовать в isearch
команды повторного поиска (C-s
, C-r
, т.е. isearch-repeat-forward
и isearch-repeat-backward
).
Пример. Содержимое буфера — test| foo-bar foo-bar foo-bar
, ¨|¨ — позиция курсора.
Если ввести C-s foo- C-s bar C-s M-DEL
(первый C-s
запускает поиск), то получим такую позицию курсора в родительском буфере: test foo-bar foo-b|ar foo-bar
.
Баг легко исправить, но с учётом твоего замечания о isearch-delete-char
/isearch-del-char
это можно сделать двумя способами.
Рассмотрим промежуточные состояния:
test| foo-|bar foo-|bar| foo-bar|
^ ^ ^ ^ ^
| | | | |
| | / / /
| | / / -----/
\ | / / /
\ | | | /
--- --- --- --- ---
C-s foo- C-s bar C-s
(1) (2) (3)
Из состояния (3) M-DEL
может вернуть в состояние (1) или (2).
- команда для перевода в состояние (2):
(defun drop-until-backwards (re string) (let ((match (string-match re (string-reverse string)))) (if match (substring string 0 (- (length string) match 1)) ""))) (defun isearch-backward-kill-word () (interactive) (if (null (cdr isearch-cmds)) (ding) (let* ((current-state (car isearch-cmds)) (current-string (isearch--state-string current-state)) (new-string (drop-until-backwards "[[:word:]][^[:word:]]" current-string))) (while (not (string-equal current-string new-string)) (setf isearch-cmds (cdr isearch-cmds) current-state (car isearch-cmds) current-string (isearch--state-string current-state))) (isearch--set-state (car isearch-cmds)))) (isearch-update))
- команда для перевода в состояние (1):
(defun isearch-backward-kill-word-greedy () (interactive) (isearch-backward-kill-word) (let* ((current-state (car isearch-cmds)) (tail (cdr isearch-cmds)) (string (isearch--state-string current-state))) (while (and tail (string-equal string (isearch--state-string (car tail)))) (setf current-state (car tail) tail (cdr tail))) (isearch--set-state current-state) (isearch-update)))
Исходная версия theNamelessOne, :
Я, кстати, обнаружил баг в isearch-backward-kill-word
, который появляется, если использовать в isearch
команды повторного поиска (C-s
, C-r
, т.е. isearch-repeat-forward
и isearch-repeat-backward
).
Пример. Содержимое буфера — test| foo-bar foo-bar foo-bar
, ¨|¨ — позиция курсора.
Если ввести C-s foo- C-s bar C-s M-DEL
(первый C-s
запускает поиск), то получим такую позицию курсора в родительском буфере: test foo-bar foo-b|ar foo-bar
.
Баг легко исправить, но с учётом твоего замечания о isearch-delete-char
/isearch-del-char
это можно сделать двумя способами.
Рассмотрим промежуточные состояния:
test| foo-|bar foo-|bar| foo-bar|
^ ^ ^ ^ ^
| | | | |
| | / / /
| | / / -----/
\ | / / /
\ | | | /
--- --- --- --- ---
C-s foo- C-s bar C-s
(1) (2) (3)
Из состояния (3) M-DEL
может вернуть в состояние (1) или (2).
- команда для перевода в состояние (2):
(defun drop-until-backwards (re string) (let ((match (string-match "[[:word:]][^[:word:]]" (string-reverse string)))) (if match (substring string 0 (- (length string) match 1)) ""))) (defun isearch-backward-kill-word () (interactive) (if (null (cdr isearch-cmds)) (ding) (let* ((current-state (car isearch-cmds)) (current-string (isearch--state-string current-state)) (new-string (drop-until-backwards "[[:word:]][^[:word:]]" current-string))) (while (not (string-equal current-string new-string)) (setf isearch-cmds (cdr isearch-cmds) current-state (car isearch-cmds) current-string (isearch--state-string current-state))) (isearch--set-state (car isearch-cmds)))) (isearch-update))
- команда для перевода в состояние (1):
(defun isearch-backward-kill-word-greedy () (interactive) (isearch-backward-kill-word) (let* ((current-state (car isearch-cmds)) (tail (cdr isearch-cmds)) (string (isearch--state-string current-state))) (while (and tail (string-equal string (isearch--state-string (car tail)))) (setf current-state (car tail) tail (cdr tail))) (isearch--set-state current-state) (isearch-update)))