문제

문맥상 저는 emacs 초보자입니다.오랫동안 사용하지는 않았지만 점점 더 사용하고 있습니다(아주 마음에 듭니다).또한 나는 lisp에 익숙하지만 elisp에 그다지 익숙하지는 않습니다.

내가 해야 할 일은 정규식을 키보드 조합에 바인딩하는 것입니다. 왜냐하면 저는 이 특정 정규식을 너무 자주 사용하기 때문입니다.

내가 한 일:

M-C-s ^.*Table\(\(.*\n\)*?GO\)

참고로 위에서 개행 문자를 사용했지만 isearch-forward-regexp, 정말 교체해야 합니다 \n 결과가 포함된 정규식에서 Cq Qj.이렇게 하면 명령을 종료하지 않고 문자 그대로 개행 문자가 삽입되어 표현식에 개행 문자를 입력하고 줄 전체를 일치시킬 수 있습니다.

이것을 키 조합에 어떻게 묶을 수 있나요?

나는 실행하는 elisp 함수를 만들어야 한다는 것을 막연하게 이해합니다. isearch-forward-regexp 표현은 있지만 세부적인 내용은 모호합니다.Google을 검색한 결과 대부분의 문서가 다소 혼란스럽다는 것을 알았습니다.

Emacs의 키 조합에 정규식을 어떻게 바인딩할 수 있나요?


Mike Stone이 지금까지 가장 좋은 답변을 주었습니다. 정확히 내가 찾고 있던 것이었지만 내가 필요한 것에 효과가 있었습니다.

편집 - 이 방법은 효과가 있었지만 매크로를 저장한 후 나중에 다시 사용하려고 했을 때 사용할 수 없었습니다. C-xe.(즉, emacs를 재부팅한 다음 다음을 입력하면 M-x 매크로 이름, 그런 다음 C-xe, 미니버퍼에 '마지막 kbd 매크로 없음' 또는 이와 유사한 메시지가 나타납니다.)


@Mike Stone - 정보 주셔서 감사합니다.다음과 같이 매크로를 만들어 보았습니다.

C-x( M-C-s ^.*Table\(\(.*C-q C-J\)*?GO\) C-x)

이로 인해 매크로가 생성되었지만 매크로를 실행할 때 일반적으로 사용할 때 나타나는 것과 동일한 강조 표시를 얻지 못했습니다. isearch-forward-regexp.대신에 다음 표현식 일치의 끝으로 점프했습니다.그래서 그것은 내가 필요한 것에 실제로 작동하지 않습니다.어떤 아이디어가 있나요?

편집하다:내가 보기엔 ~할 수 있다 내가 원하는 것을 하려면 매크로를 사용하세요. 고정관념에서 벗어나 생각하면 됩니다. isearch-forward-regexp.당신이 제안한 것을 시도해 보겠습니다.

도움이 되었습니까?

해결책

매크로를 사용할 수 있습니다. C-x( 그런 다음 매크로에 대한 모든 작업을 수행한 다음 C-x) 매크로를 종료하려면 C-xe 마지막으로 정의된 매크로를 실행합니다.그런 다음 다음을 사용하여 이름을 지정할 수 있습니다. M-x 이름-성-kbd-매크로 이름을 할당한 다음 다음을 사용하여 호출할 수 있습니다. M-x 테스트, 다음을 사용하여 정의를 저장합니다. M-x 삽입-kbd-매크로 매크로를 현재 버퍼에 넣은 다음 이를 .emacs 파일.

예:

C-x( abc *return* C-x)

"abc"를 입력하고 Return 키를 누르는 매크로를 정의합니다.

C-xeee

위의 매크로를 즉시 3번 실행합니다(먼저 e가 실행하고 다음 2개의 e가 두 번 더 실행합니다).

M-x name-last-kbd-macro testit

매크로 이름을 "testit"로 지정합니다.

M-x testit

방금 명명된 ​​매크로를 실행합니다("abc"를 인쇄한 후 반환).

M-x insert-kbd-macro

현재 버퍼에 다음을 넣습니다.

(fset 'testit
   [?a ?b ?c return])

그런 다음 귀하의 .emacs emacs를 다시 시작한 후 해당 매크로를 계속해서 사용하기 위한 파일입니다.

다른 팁

나는 당신의 문제를 말 그대로 해결하는 것부터 시작했습니다.

(defun search-maker (s)
  `(lambda ()
     (interactive)
     (let ((regexp-search-ring (cons ,s regexp-search-ring)) ;add regexp to history
           (isearch-mode-map (copy-keymap isearch-mode-map)))
       (define-key isearch-mode-map (vector last-command-event) 'isearch-repeat-forward) ;make last key repeat
       (isearch-forward-regexp)))) ;`

(global-set-key (kbd "C-. t") (search-maker "^.*Table\\(\\(.*\\n\\)*?GO\\)"))
(global-set-key (kbd "<f6>") (search-maker "HELLO WORLD"))

키보드 순서는 다음과 같습니다. (kbd ...) 새로운 공백 검색을 시작합니다.실제로 문자열을 검색하려면 다음을 누르세요. 마지막 키 필요한만큼 다시.그래서 C-. t t t 또는 <f6> <f6> <f6>.해결책은 기본적으로 해킹이지만 실험해보고 싶다면 여기에 남겨 두겠습니다.

다음은 아마도 필요한 것에 가장 가깝습니다.

(defmacro define-isearch-yank (key string)
  `(define-key isearch-mode-map ,key 
     (lambda ()
       (interactive) 
       (isearch-yank-string ,string)))) ;`

(define-isearch-yank (kbd "C-. t") "^.*Table\\(\\(.*\\n\\)*?GO\\)")
(define-isearch-yank (kbd "<f6>") "HELLO WORLD")

이제 주요 콤보는 isearch 모드에서만 작동합니다.정상적으로 검색을 시작한 다음 키 조합을 눌러 미리 정의된 문자열을 삽입합니다.

@저스틴:

매크로를 실행하면 조금 다른데..증분 검색은 한 번만 수행되며 다시 검색하려면 매크로를 다시 실행해야 합니다.하지만 키워드 검색, 줄 시작 부분으로 점프, 표시, 줄 끝으로 이동, M-w(복사), 다른 버퍼로 점프, C-y(붙여넣기)와 같은 더 강력하고 복잡한 작업을 수행할 수 있습니다. ), 그런 다음 다른 버퍼로 돌아가서 매크로를 종료합니다.그런 다음 매크로를 실행할 때마다 한 줄을 다음 버퍼에 복사하게 됩니다.

emacs 매크로의 정말 멋진 점은 종소리를 보면 멈춘다는 것입니다...이는 증분 검색(무엇보다도)과 일치하지 못할 때 발생합니다.따라서 위의 매크로를 실행하면 C-u 1000 C-x e를 수행하여 매크로를 1000번 실행할 수 있습니다.하지만 검색을 했기 때문에 검색이 실패할 때까지 1000줄만 복사됩니다!즉, 일치하는 항목이 100개 있으면 매크로를 100번만 실행합니다.

편집하다:정규식과 일치하는 모든 항목을 강조 표시하는 명령의 도움말을 표시하는 C-hf 하이라이트-라인-일치-regexp를 확인하세요.강조표시를 취소하는 방법을 모르겠습니다...어쨌든 저장된 매크로를 사용하여 정규식과 일치하는 모든 항목을 강조 표시한 다음 다른 매크로를 사용하여 다음 항목을 찾을 수 있습니까?

추가 편집:M-x unhighlight-regexp는 강조 표시를 취소합니다. 하지만 마지막 정규식을 입력해야 합니다(그러나 강조 표시에 사용한 정규식은 기본값입니다).

일반적으로 Emacs에서 사용자 정의 키 바인딩을 정의하려면 다음과 같이 작성합니다.

(define-key global-map (kbd "C-c C-f") 'function-name)

define-key 놀랍게도 새 키를 정의하는 기능입니다. global-map 각 모드의 개별 맵이 아닌 전역 키맵입니다. (kbd "C-c C-f") 키 시퀀스를 나타내는 문자열을 반환합니다. C-c C-f.문자열을 직접 입력하는 것을 포함하여 이를 수행하는 다른 방법이 있지만 이는 일반적으로 작성된 표현을 사용하므로 일반적으로 가장 간단합니다. 'function-name 은 함수의 이름을 나타내는 기호입니다.

이제 함수가 이미 정의되어 있지 않은 경우 이를 사용하기 전에 함수를 정의하는 것이 좋습니다.그러려면 글을 쓰세요

(defun function-name (args)
  (interactive)
  stuff
  ...)

defun 기능을 정의합니다 - 사용 C-h f defun 더 구체적인 정보를 원하시면.그만큼 (interactive) 실제로 함수 호출이 없습니다.이는 사용자가 다음을 사용하여 함수를 호출해도 괜찮다는 것을 컴파일러에 알려줍니다. M-x function-name 그리고 키 바인딩을 통해.

특히 대화형 검색의 경우 이는 까다롭습니다.그만큼 isearch 모듈이 실제로 수행하려는 작업에 맞게 설정되지 않은 것 같습니다.하지만 이것을 사용하여 비슷한 작업을 수행할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top