LINUX.ORG.RU

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

Исправление 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)))