2013-04-12 3 views
-1

아래 텍스트가 있음 (실제 탭이 \ t 대신에 있음) "설명"다음에 탭 바로 다음에 있어야하고 모든 텍스트를 가져와야합니다 버퍼의 끝까지. 여기 elisp 잘못된 형식 인수 : 정수 또는 마커 -p 오류

key1\tval1  
key2\tval2 
key3\tval3  
Description\tlots and lots and lots and lots and lots lots 
and lots and lots and lots and lots lots and lots and lots and 
lots and lots lots and lots and lots and lots and lots lots and 

lots lots and lots and lots and lots and lots lots and lots lots 

and lots and lots and lots and lots lots and lots lots and lots 

and lots and lots and lots lots and lots lots and lots and lots 
and lots and lots lots and lots lots and lots and lots and lots 
and lots lots and lots lots and lots and lots and lots and lots 

은 LISP 함수 :

(defun find-description() 
    (interactive) 
    (goto-char (point-min)) 
    (when (re-search-forward "Description\t") 
    (setq myStr (buffer-substring (point) (end-of-line))) 
    (goto-char (point-max)) 
    (insert "\n\n\ndescription=") 
    (insert myStr) 
    ) 
) 

그리고이 오류가있는 (SETQ 라인에 실패 I 정규식 검색 후에 점이 될 것이라는 것을 가정

Wrong type argument: integer-or-marker-p, nil 

설명 \ t 다음에 변수가 설정되지 않는 이유는 무엇입니까?

+2

'end-of-line' *은 줄을 반환하지 않고 끝까지 이동합니다. 대신'line-end-position'을 사용하고 싶습니다. – Stefan

답변

3

값이 end-of-line은 마커 또는 위치가 아니므로 buffer-substring에서 사용하려고하면 오류 메시지가 표시됩니다. 쉬운 수정은 줄 끝으로 이동 한 후에 버퍼 위치를 얻는 것입니다.

(let ((beg (point)) 
    (end-of-line) 
    (setq myStr (buffer-substring beg (point))) 

사항은 https://stackoverflow.com/a/15974319/874188 이것에 대한 더 간단한 수정으로 line-end-position을 지적한다.

임시 변수를 피하기 위해 리팩토링 할 수도 있습니다. 예 : "Description\t\([^\n]*\)"을 검색하고 일치하는 부분 문자열을 꺼내지 만 어느 쪽이 좋을 것이라고 생각합니다.

by는 정확한 값으로 debug-on-error을 설정하면 얻을 수있는 백 트레이스를 조사하면 문제의 원인을 빨리 알 수 있습니다.

+0

백 트랙 사용 팁을 보내 주셔서 감사합니다. –

+0

또한 BTW, 정규식 검색을 사용하는 라이브러리 함수는 ['save-match-data'] (http://www.gnu.org/software/emacs/manual/html_node/elisp/Saving-Match-Data)에 포장해야합니다. .html). – tripleee

관련 문제