从VIM发送电子邮件

我打算通过SendEmail发送来自VIM内部的电子邮件,但是我遇到了一些问题。

  1. 当通过bang(!)运算符将缓冲区的一部分(或整个缓冲区)传送到SendEmail时,我的缓冲区中的文本将被SendEmail的输出replace。 所以我的第一个问题是:如何将范围传递给外部命令并丢弃它的输出(甚至更好:在cmd窗口中显示)?

  2. 我给SendMail的大部分选项大部分时间都不会改变(比如电子邮件服务器或发件人地址),所以我不想每次发送邮件时都input它们:我想要一个命令有这些参数硬编码,我可以指定任何数量的附加参数(如-u“主题”)。

这可以通过命令function(nargs,范围)来完成,还是需要编写一个函数?

最简单的选择是从Vim网站下载RunView插件并使用它。 如果你let g:runview_filtcmd等于你的SendEmail命令行,它会把当前缓冲区的内容,管到SendEmail,并在一个单独的窗口打印输出。 我认为这实现了你所需要的。 如果你想使用RunView的其他东西,你可以省略g:runview_filtcmd步骤,只需添加这个命令:

 :command! -nargs=* -range=% SendEmail <line1>,<line2>RunView SendEmail -e oneoption -b twooption <args> 

然后做:

 :SendEmail -u "subject" 

要么

 :'<,'>SendEmail -u "subject" 

我没有测试过这个,但它应该很容易工作。


如果你想手动完成,你可能需要编写一个函数。 RunView的工作方式是将整个缓冲区复制到一个寄存器中,创建一个新窗口,将缓冲区粘贴到该窗口的末尾,然后通过程序过滤新行。 它在开始时添加一个日期/时间戳,以分隔同一程序的多个运行。 这不会太难复制,但你可能需要一个函数。


编辑回应评论:

如果你想把路径作为参数发送到SendEmail,你可以做这样的事情(我没有测试过,所以可能需要调整一下)。

 command! -nargs=* SendEmailAsAttachment exe '!SendEmail -e oneoption -b twooption -f' expand('%:p') <args> 

请注意:exe使用空格连接参数,因此调用SendEmailAsAttachment -u "subject"扩展为:

 !SendEmail -e oneoption -b twooption -f /path/to/filename.txt -u "subject" 

看到:

 :help expand() :help :exe