2017-10-27 16 views
1

사전 정의 된 정규식을 사용하여 isearch-forward-regexp을 시작하는 명령을 정의하고자합니다.프로그래밍 방식으로 대화 형 regexp 검색 시작

"aaa"또는 "bbb"가 모두 나타나기를 원합니다. isearch-forward-regexp과 대화식으로 입력 할 수있는 정규 표현식은 \\(aaa\\|bbb\\)

입니다. 대화식으로 regexp를 입력하지 않으면 어떤 방법이 있을까요? 나는이 같은 일을 시도했다 :

(defun my-search() 
(interactive) 
(isearch-mode t t) 
(isearch-yank-string "\\(aaa\\|bbb\\)")) 

하지만 isearch에 빠지게 할 때 \\(aaa\\|bbb\\)로 평가 이맥스에 문자열을 정의 할 수있는 방법이있을 것 같지 않기 때문에이 방법은 작동하지 않습니다.

예를 들어 "\\(aaa"(aaa으로 평가되지만, "\\\\(aaa"\\\\(aaa으로 평가됩니다. 하나의 백 슬래시로 평가할 방법이없는 것 같습니다.

내가 원하는 것을 할 수있는 방법이 있습니까? 다음, M-x foo RET\(aaa\|bbb\) RET를 입력 : 예를 들어

(defun foo (regexp) 
    (interactive (list (read-regexp "Regexp: "))) 
    (isearch-mode t t) 
    (let ((isearch-regexp nil)) 
    (isearch-yank-string regexp))) 

:

답변

1

이 명령을 요구하고 내가 무엇을 생각해야한다.

대화식 대신 Lisp에서 호출하는 경우 원하는 정규 표현식을 문자열로 제공하십시오. isearch-yank-string는이 작업을 수행

(foo "\\(aaa\\|bbb\\)") 

하는 것으로 : 예를 들어 foo가 결합하는 이유

(if isearch-regexp (setq string (regexp-quote string))) 

isearch-regexpisearch-yank-string에 대한 호출 주위 nil에 : 문자열에서 정규 표현식 특수 문자를 인용 방지합니다.

+0

나를 위해 작동하지 않는 것 같습니다. 내가 (foo "\\\ (aaa \\ | bbb \\\)"를 실행할 때) regexp의 의미가 아니라 regexp의 리터럴 문자열을 찾습니다. 예를 들어 "aaa"는 일치하지 않지만 함수 코드에 나타나는 정규 표현식 문자열은 일치합니다. 이맥스에서 작동합니까? –

+0

네, 이맥스에서 잘 작동합니다 - 모든 이맥스는 이맥스 20에서 최신 이맥스 26.1 사전 테스트를 거쳐 출시됩니다. 'isearch-regexp'의 let-binding을 포함 시켰는지 확인하십시오. 그렇지 않으면 행동은 당신이 묘사하는 것입니다. isearch-yank-string은 regexp 검색을한다고 생각하면 regexp 특수 문자를 인용하기 때문입니다. 'emacs -Q' (초기화 파일 없음)를 사용하여 테스트하십시오. 일단 시작되면, 검색을 반복하기 위해'C-s'을 사용해야 할 수도 있습니다. – Drew

+0

필자는 필자의 .emac을로드하더라도 emacs를 재시작 한 후 작동이 시작되었다. 아마 나는 실수로 이맥을 특수한 상태에 놓고 그 기능을 다루지 않을 것이다. 감사. –