2010-08-06 8 views
6

M-x myfun이 아닌 다른 이맥스 리스프 함수를 실행하는 방법이 있습니까? 버퍼가 변경 될 때마다 함수를 다시 호출하고 싶습니다.이 이맥스 리스프 함수를 계속 실행

배경 : 몇 가지 실수가있는 테이블이 있습니다. 테이블에는 실수를 식별하는 데 사용할 수있는 열 합계 및 기타 기능이 있습니다. 내 elisp 함수는 의심스러운 숫자 열을 강조 표시합니다. 내가 원하는 것은 highlight-errors 함수를 반복적으로 호출하지 않고 번호가 수정 되 자마자 사라지는 강조 표시입니다.

은 Excel에서 유사한 기능은

+1

물론이 작업을 수행 할 수 있습니다. 'c-mode '가'electric brace'를 구현하는지 확인하십시오. –

답변

9

첫 번째 단락에서 찾고있는 개념은 후크입니다. 후크 변수는 특정 이벤트가 발생할 때 실행되는 함수 목록입니다. 대부분의 후크 변수의 이름은 -hook으로 끝납니다. 후크 after-change-functions은 사용자가 무언가를 입력하거나 버퍼를 변경할 때마다 실행됩니다. 훅은 Emacs Lisp 매뉴얼에서 "Hooks"라는 제목으로 논의됩니다.

그러나 무엇을하려했는지에 따라 Emacs의 강조 표시 메커니즘을 사용하는 것이 더 쉬울 것입니다. 해결책은 올바른 위치에 regexp를 추가하는 것만 큼 간단 할 수 있습니다.

구조화 된 텍스트 (특히 프로그래밍 언어)가 포함 된 대부분의 파일은 글꼴 잠금 메커니즘으로 강조 표시됩니다. 이것은 "글꼴 잠금"아래의 Emacs 및 Emacs Lisp 매뉴얼 모두에 설명되어 있습니다. 특히 이멕스 매뉴얼이 여러분이 겪은 예를 보여주는 함수 인 font-lock-add-keywords을 참조하십시오. some information on the Emacs wiki도 있습니다.

ADDED : regexps '에 넘어 갈 수

글꼴 잠금; 불행하게도 문서화는 font-lock-keywords의 문서화 문자열에 간결한 설명으로 제한됩니다. cperl-mode.el에는 몇 가지 간단한 예가 있습니다 (대량으로 묻혀 있지만). 위키는이 기능을 사용하는 ctypes.el을 참조합니다. 잘못된 정수 추가를 강조하는 예제가 있습니다.

(defun maybe-warn-about-addition() 
    (let ((x (string-to-int (match-string 1))) 
     (y (string-to-int (match-string 2))) 
     (z (string-to-int (match-string 3)))) 
    (if (/= (+ x y) z) 
     font-lock-warning-face))) 
(font-lock-add-keywords 
nil 
'(("\\s-\\([0-9]+\\)\\s-*\\+\\s-*\\([0-9]+\\)\\s-*=\\s-*\\([0-9]+\\)\\s-" 
    (3 (maybe-warn-about-addition) t)))) 

심지어 정규 표현식

은 당신이 (문서화 문자열에서 어휘를 사용하여, MATCHER로 함수 이름)을 강조하고 싶은의 경계를 찾습니다 임의의 코드로 대체 될 수있다. 표준 C 모드 ( cc-fonts.el)의 글꼴 잠금 키워드에 대한 고급 예제가 있습니다.

+0

감사합니다. 필자의 말처럼 Font Lock은 정규 표현식에 맞게 사용자 정의 할 수 있었지만 1 1 3 (1 + 1! = 3이 (가) 있기 때문에) 행을 2로 표시 할 때 강조 표시를 제거하는 것과 같은 내용 기반 조건을위한 기능이 없었습니다. 1 3 (2 + 1은 = 3이기 때문에). – josh

+0

@ josh : 임의의 코드를 써서 글꼴 잠금으로 강조 표시를 구성 할 수 있습니다. 좀 더 복잡합니다. 당신의 본보기가 가능합니다. 몇 가지 예제 코드를 찾아 내 답변에 추가 할 것입니다. – Gilles

1

변수 after-change-functions에 기능 추가 "조건부 서식"내가 생각이라고합니다.