2012-09-13 80 views
1

好的,noob问题也许,但我无法找到关于这个东西的信息。我想编写一个函数,它将一个区域中选择的任何内容传递给curl。 Curl会返回一些内容,我希望能够替换选定的区域。换句话说,在区域中选择www.foo.com并运行该功能后,它将被替换为在命令行上运行的任何卷曲将返回curl www.foo.com如何通过“shell-command-on-region”将区域传递给shell命令?

这是我的尝试,这是非常非常错误的。基本上,我无法弄清楚如何选定区域传递作为一个变量来shell-command-on-region

(defun curl-something() 
    (interactive) 
    (setq region ((region-beginning)(region-end))) 
    (shell-command-on-region (region-beginning) (region-end) (shell-command (concat "curl" region)) nil t)) 

此外,如果任何人有哪里可以学习基本的elisp的文字处理程序的指针,请分享(不引用请手册)。谢谢!

编辑:

感谢兰迪·莫里斯,我能找出答案:

(defun curl-something (begin end) 
    (interactive "r") 
    (shell-command-on-region begin end (concat "curl -s " (buffer-substring begin end)) nil t)) 

回答

2

您需要将 “R” 标志传递给(interactive)。然后,您的函数将作为数字参数传递给区域的开始和结束,您可以使用该参数来获取区域中的文本。

这里是ErgoEmacs采取了一个例子:

(defun dosomething-region (p1 p2) 
    "Prints region starting and ending positions." 
    (interactive "r") 
    (message "Region starts: %d, end at: %d" p1 p2)) 

下面的函数将抓住URL并把它传递给卷曲,然后转储该网站的内容在一个新的缓冲区:

(defun curl-something (begin end) 
    (interactive "r") 
    (shell-command (concat "curl " (buffer-substring begin end)))) 

另外值得注意的是这种东西的原生url-函数,但我意识到这超出了这个问题的范围。

+0

当然,我可以得到开始和结束点,但我如何运行它们之间的命令?我确定像'(shell-command(concat“curl”p1 p2))''是无效的,我错了吗? – mart1n

+0

是的,看来我误解了你的问题。我会看看,如果我可以的话,我可以解决这个问题。 –

+0

我编辑了这个,我想这可能会回答你的问题。 –

相关问题