문제

CSCOPE EMACS 확장자를 사용합니다 (그리고 매우 유용합니다). 불행히도, 그것은 현재 디렉토리 만 검색하는 것이 기본 동작이며 아래는 저에게 불충분하므로 CSCOPE-SET-Initial-Directory를 선택한 디렉토리에 사용합니다. 불행히도 이것은 각각 고유 한 "초기"디렉토리가있는 여러 다른 프로젝트를 가지고 있기 때문에 이것은 나에게도 불충분 해졌습니다.

EMAC에서 가장 많이 사용하는 세 가지 CSCOPE 방법에 대한 핫 키를 설정했습니다.

(global-set-key [f9] 'cscope-find-this-text-string)
(global-set-key [f8] 'cscope-find-global-definition)
(global-set-key [f7] 'cscope-find-this-symbol)

나는 주어진 경로에서 CSCOPE-SET-Initial-Directory를 실행하는 기능으로 전화를 랩핑하는 것이 매우 쉽다고 생각했습니다 (버퍼 파일 이름이 무엇인지 살펴보면 생성). 그러나 나는 그다지 성공하지 못했습니다!

(global-set-key [f9] (lambda () (interactive) (cscope-set-initial-directory "blah") 'cscope-find-this-text-string))

작동하지 않습니다. 나는 또한 두 개의 CSCOPE hooks에 고리를 추가하려고 시도했지만 정상적인 사용 패턴 중에는 그 중 어느 것도 호출되지 않은 것 같습니다. 버퍼를 전환 할 때마다 한 번 실행할 수는 없지만 어디에서나 그 후크를 보지 못했습니다.

누군가 도울 수 있습니까? :)

도움이 되었습니까?

해결책

면책 조항 : CSCOPE를 설치하지 않았으므로 테스트 할 수 없습니다.

(global-set-key (kbd "<f9>") 'my-cscope-find-this-text-string)
(defun my-cscope-find-this-text-string (dir)
  (interactive "DRoot area to start search:")
  (let ((default-directory dir))
    (call-interactively 'cscope-find-this-text-string)))

기본 아이디어는 디렉토리가 시작되도록 프롬프트하고 싶다는 것입니다. 이것이 인터랙티브에 대한 호출입니다. 그런 다음 디렉토리를 설정합니다. let 문은 당신을 위해 그렇게합니다. 그런 다음 원하는 원래 루틴을 호출하고 'call-interactively 당신은 프롬프트를받습니다.

당신은 다른 두 루틴을 비슷하게 포장 할 것입니다.

그것이 당신을 위해 일하면, 당신은 루트 영역이 세 가지 루틴에서 공유되는 자체 이력 변수를 갖도록 프롬프트를 사용자 정의함으로써 더 멋진 것을 얻을 수 있습니다.

초기 솔루션과 관련하여 좋은 시도였습니다. 대부분은 필요성을 깨닫지 못합니다 'interactive 함수를 명령으로 전환합니다. 인용 된 이름이 당신을 위해 작동하지 않는 이유는 인용문이 단순히 통역사에게 상징을 기호로 취급하고 그와 아무것도하지 말라고 지시하기 때문입니다. 일상을 호출하려면 일반적으로 다음과 같습니다.

(lambda ()
    (c-scope-find-this-text-string "some-string"))

불행히도 바로 위의 직접 전화를 사용하면 인수 (검색 할 문자열)를 제공해야합니다. 따라서 문자열을 자랑하는 코드를 추가하거나 명령의 내장 코드를 사용하여 프롬프트를 수행 할 수 있습니다. 그게 ''call-interactively 사용되며 명령을 호출하고 그 명령을 호출합니다. 'interactive 프롬프트를하는 형태.

또한, 두 가지 이유로, 맨 람다와는 달리 키 스트로크를 명령 이름에 바인딩하는 것이 일반적입니다. C-h k (M-x describe-key), 당신은 의미있는 명령 이름을 얻고, 둘째, 함수를 수정할 때, 바인딩과 함께 멍청하지 않고도 그렇게 할 수 있습니다.

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