2009-12-08 2 views
4

포인트가 실용적인 끝점인지 테스트하기위한 루틴을 작성하고 있습니다.Elisp 함수가 올바른 값 대신 표시를 반환 함

(defun end-of-line-p() 
    "T if there is only \w* between point and end of line" 
    (interactive) 
    (save-excursion 
    (set-mark-command nil)  ;mark where we are 
    (move-end-of-line nil)  ;move to the end of the line 
    (let ((str (buffer-substring (mark) (point)))) ;; does any non-ws text exist in the region? return false 
     (if (string-match-p "\W*" str) 
     t 
    nil)))) 

문제는 실행시 T 또는 nil 대신에 미니 패드 창에 "마크 세트"가 표시된다는 것입니다.

+5

이맥스, 프로그래밍 팁을 LISP 잘못된 목적. 자세한 내용은'set-mark '문서를 참조하십시오. –

답변

1

eolp이라는 기본 제공 함수가 있습니다. (편집 :하지만이 아니 었 당신이 달성하려고했던 것은 그 것이었다 ..) (더 철저하게 나보다 그것을 테스트해야합니다 있지만) 여기

함수의 내 버전입니다 :

초보자 이맥스 리스프 프로그래머는 종종에 대한 마크를 사용하려고 : 당신이 '설정 마크 command`에 대한 설명서 문자열의 맨 아래에 보면 당신이 볼 수있는 경우

(defun end-of-line-p() 
    "true if there is only [ \t] between point and end of line" 
    (interactive) 
    (let (
     (point-initial (point)) ; save point for returning 
     (result t) 
     ) 
    (move-end-of-line nil) ; move point to end of line 
    (skip-chars-backward " \t" (point-min)) ; skip backwards over whitespace 
    (if (> (point) point-initial) 
     (setq result nil) 
    ) 
    (goto-char point-initial) ; restore where we were 
    result 
    ) 
) 
+0

줄의 마지막 문자에있는 경우에만 T를 반환하는 오류가 있습니다. –

+0

분명히'eolp'는 당신이 의도 한 것을하지 않습니다. 그것은 포인트가 후행 공백에 있다면 t를 반환하는 것입니다. 소풍을 저장하지 않고도 원하는대로 수행 할 수있는 예제 코드를 추가했습니다. 끝나면 수정하지만 요점은 수정합니다. –

+0

가장자리의 경우를 수정해야 할 수도 있습니다. 점이 라인의 마지막 문자에 있고 공백이 아닌 경우 어떻게해야합니까? –

8

(looking-at-p "\\s-*$")

+0

이것은 실제로 내가 찾고 있던 기능이지만, 이맥스 문서에서 찾지 못했습니다. –

+0

오, 이거 정말 맛있어! +1 –