일치하지 않는 Isearch 문자열의 일부 또는 완전 일치하는 경우 마지막 문자를 삭제하십시오.


11

나는 다음을 가지고있다

(defun isearch-del-fail-or-char ()
  "Delete failed isearch text, or if there is none, a single character."
  (interactive)
  (if (isearch-fail-pos)
      (delete-region (isearch-fail-pos) (point))
    (isearch-del-char)))

(define-key isearch-mode-map (kbd "DEL") 'isearch-del-fail-or-char)

코드의 목적은 deleteisearch에서 전체 실패한 문자열을 삭제하거나 실패한 문자열이없는 경우 단일 문자 만 만드는 것입니다.

그러나 delete-region버퍼에서 텍스트를 삭제 isearch하는 것은 isearch 버퍼 자체가 아니라 검색 중입니다.

이를 수행하는 올바른 방법은 무엇입니까? 내 emacs lisp 스타일의 나머지 부분에 대한 비판도 환영합니다 :)

답변:


12

아 예. Isearch는 입력 한 키를 읽고 검색 한 다음 현재 버퍼에서isearch-mode-map 호출합니다 .

Isearch는 모양에도 불구하고 미니 버퍼를 사용하지 않습니다 . 에코 영역을 사용합니다. 즉, 입력 한 문자의 에코를 포함하여 실제로 출력 메시지가 있습니다.

이것은 당신이 요구하는 것을해야합니다 :

(defun mydelete ()
  "Delete the failed portion of the search string, or the last char if successful."
  (interactive)
  (with-isearch-suspended
      (setq isearch-new-string
            (substring
             isearch-string 0 (or (isearch-fail-pos) (1- (length isearch-string))))
            isearch-new-message
            (mapconcat 'isearch-text-char-description isearch-new-string ""))))

(define-key isearch-mode-map (kbd "DEL") 'mydelete)

(BTW, 귀하의 질문에 delete문자가 있지만 DEL백 스페이스 문자 인 을 썼습니다 .)


@Malabarba가 주석에서 지적한 것처럼 새 검색 문자열을 ""(빈 문자열) with-isearch-suspended로 설정하면 빈 검색 문자열로 시작하는 대신 마지막 검색 문자열을 검색하여 다시 시작합니다.

이것은 일반적으로 의 " 기능 "입니다 with-isearch-suspended. 그러나 때로는 검색을 위해 검색 문자열을 비우고 싶을 수도 있으므로 isearch + .el 버전 with-isearch-suspended에서 variable을 추가 하여이를 제어합니다. 당신이 만약 바인드에 있다고 하고 설정 하기 위해 다음 빈 검색 문자열로 이력서를 검색 할 수 있습니다.isearchp-if-empty-prefer-resuming-with-lastnilisearch-new-string""

따라서 Isearch +를 사용 하면이 정의로 원하는 것을 수행 할 수 있습니다.

(defun mydelete ()
  "Delete the failed portion of the search string, or the last char if successful."
  (interactive)
  (let ((isearchp-if-empty-prefer-resuming-with-last  nil))
    (with-isearch-suspended
        (setq isearch-new-string
              (substring
               isearch-string 0 (or (isearch-fail-pos) (1- (length isearch-string))))
              isearch-new-message
              (mapconcat 'isearch-text-char-description isearch-new-string "")))))

나도 이제 이맥스 24.4 내가 제기 한 회귀, 도입 것을 알 수 이맥스 버그 # 20466를 들어, 바인딩을 수단 DEL으로하는 것은 isearch-mode-map충분하지입니다. 에 대해 별도의 바인딩을 <backspace>추가했습니다 DEL. 이는 <backspace>더 이상 DELIsearch로 번역되지 않음을 의미합니다 (그러나 여전히 Emacs에서는 일반적으로 번역됩니다).

그래서 당신은 백 스페이스 키를 사용하면 이맥스 24.4 물었다 이상 다음 방금 바인딩 할 수 없습니다 일을하고 싶은 경우 DELmydelete. 당신은 바인딩 할 필요가 <backspace>mydelete. 멍청한, AFAICT, n'arrete pas le progres에 mais ...


Isearch +에 비슷한 명령을 추가하고 C-M-l( Icicles 에서 완료 불일치를 제거하는 데 사용 된 것과 동일한 키)에 바인딩했습니다 .

너무주의하십시오 C-g불일치가있을 때 isearch 기능도, 일치하지 않는 텍스트를 제거합니다. (그러나 C-g검색이 성공하면 효과가 있습니다.)


나는 Isearch + 가 비슷한 라인을 따라 선택적인 행동을했다고 언급 했어야 했다. M-kIsearch 중 옵션의 값으로 제어되는 3 가지 동작 중 하나를 전환합니다 isearchp-drop-mismatch.

  • replace-last-현재 입력이 일치하지 않는 마지막 텍스트를 대체합니다. 불일치하더라도 항상 마지막 입력을 볼 수 있습니다. 그리고를 사용하여 편집 할 수 있습니다 M-e.

  • nil -이전 입력에 불일치 부분이 있어도 현재 입력이 추가됩니다.

  • 다른 것-일치하지 않는 경우 현재 입력이 무시됩니다 (제거됨). 검색 문자열은 항상 일치합니다.


BTW, 나는 실패한 부분 (GNU Emacs에 추가하기 전에)에 강조 표시를 추가 한 이후 로 Isearch +에 비슷한 명령을 추가하려고 생각 했지만 결코 그 주위에 가지 못했습니다. 나는 지금 그것을 했다 . (그러나 캐릭터 삭제는 포함되지 않았습니다. 실패한 부분이없는 경우 추가 한 명령은 작동하지 않습니다.)
Drew

저는 OS X에 있습니다. 뒤로 삭제한다는 의미입니다.
asmeurer

isearch + replace-last 동작은 매우 멋지게 보입니다. 그래도 검색이 실패 할 때마다 종을 울리지 않도록하는 방법이 있습니까?
asmeurer

2
의 새 버전을 업로드했습니다 isearch+.el. (a) 랩 어라운드가 정상적으로 작동하도록 자동 불일치 제거를 수정합니다. 그리고 isearchp-ring-bell-function검색 중 종을 억제하는 데 사용할 수 있는 옵션 ()이 추가 되었습니다.
Drew

3
Malabarba, 흥미로운. 나는 벌레를 쏴서 이것으로 끝났다 . isearch-del-char드류의 대답 에서 대부분화물을 배양 했지만 의도 한대로 작동하는 것 같습니다. with-isearch-suspended매크로는 범인이었다.
jbm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.