2013-04-12 58 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 

这里是口齿不清功能:

(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符合错误:

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

我认为正则表达式搜索后,该点会刚刚在说明\ t之后,为什么不设置变量的工作?

+2

'行结束符* *移动*到行尾而不是返回它。你想使用'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]*\)"并拉出匹配的子字符串,但我想任何一种方式都可以。

由此,通过将debug-on-error设置为真值来检查回溯会很快显示出问题的原因。

+0

感谢您使用backtrace的提示 - 将对此进行调查。 –

+0

另外BTW,一个使用正则表达式搜索的库函数应该将它包装在['save-match-data']中(http://www.gnu.org/software/emacs/manual/html_node/elisp/Saving-Match-Data的.html)。 – tripleee