2014-04-03 19 views
2

我使用mu4e在Emacs作爲我的郵件客戶端,但我無法弄清楚如何創建一個腳本,可以在這個mailto URL傳遞到下面的shell腳本:創建在Mac OSX上的的mailto處理程序

#!/bin/sh 
# emacs-mailto-handler 

mailto=$1 
mailto="mailto:${mailto#mailto:}" 
mailto=$(printf '%s\n' "$mailto" | sed -e 's/[\"]/\\&/g') 
elisp_expr="(mu4e~compose-browse-url-mail \"$mailto\")" 

emacsclient -a \"\" --create-frame -n --eval "$elisp_expr" \ 
     '(set-window-dedicated-p (selected-window) t)' 

當我把這個腳本在我的命令行就打開了在Emacs用正確的地址和主題一個新的框架:

$ emacs-mailto-handler "mailto:[email protected]?subject=I-love-cats-too%21" 

的問題是,我需要創建一個可以被配置成與一個應用程序Mac OSX中的默認郵件客戶端。 我試圖使用Automator和Platypus來調用我的shell腳本,但是我無法讓它們將它們接收到的參數傳遞給shell腳本。 (我看到這個問題:OS X: how to make command-line script appear as helper application to handle mailto?,但這並不能解決問題。)

在一天結束時,我必須能夠讓應用程序執行以下腳本調用: emacs-mailto -handler「mailto:[email protected]?subject = I-love-cats-too%21」 其中mailto鏈接是來自瀏覽器的內容。

對此的任何線索將是最受歡迎的!

由於提前, 託本

回答

5

這將需要某種形式的捆綁應用程序。

當應用程序處理URL時,它不會在其命令行參數(argv參數數組main())中接收它們。實際上,應用程序可以在運行期間的任何時間接收打開網址的請求,而不僅僅是在啓動時。所以,它肯定需要一個命令行參數以外的機制來接收它們。這阻止腳本在其參數中接收URL。

取而代之的是,它收到打開或獲取URL作爲類別和ID kAEGetURL的Apple事件的請求。該應用程序爲該Apple Event設置了一個處理程序,該處理程序由框架調用。爲了使框架能夠接收和發送Apple事件,應用程序必須a)使用這些框架,並且b)爲框架提供機會來監視他們在內部使用的用於傳遞事件的進程間通信機制。再次,這不是shell腳本可以做的事情。

在可可應用程序,這將需要把這樣的代碼在應用程序的早期啓動代碼下面,如-applicationWillFinishLaunching:方法的應用程序委託的:

NSAppleEventManager* appleEventManager = [NSAppleEventManager sharedAppleEventManager]; 
    [appleEventManager setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; 

然後一個將增加其的方法名稱與上面通過的選擇器匹配;在這種情況下-handleGetURLEvent:withReplyEvent:

- (BOOL)handleGetURLEvent:(NSAppleEventDescriptor*)event withReplyEvent:(NSAppleEventDescriptor*)replyEvent 
{ 
    NSAppleEventDescriptor* directObjectDescriptor = [event paramDescriptorForKeyword:keyDirectObject]; 
    NSString* urlString = [directObjectDescriptor stringValue]; 
    NSURL* url = [NSURL URLWithString:urlString]; 
    // ... do something with url ... 
} 

除此之外代碼,應用程序必須申報其處理在其Info.plist文件中特定方案的URL能力強,CFBundleURLTypes項下。如下面的條目將宣佈處理mailto:網址的能力:

<key>CFBundleURLTypes</key> 
    <array> 
     <dict> 
      <key>CFBundleURLName</key> 
      <string>Email Address URL</string> 
      <key>CFBundleURLSchemes</key> 
      <array> 
       <string>mailto</string> 
      </array> 
     </dict> 
    </array> 

可以想象的是,無論是通過鴨嘴獸或Automator的產生的應用程序可以在他們上面的網址,支持代碼。這很多是通用的。聲明支持特定的URL方案是他們必須讓你配置的東西。沒有辦法通常宣佈支持任何/所有計劃。

我對Automator生成的應用程序的Info.plist文件進行了攻擊,以查看是否可以使其處理URL。它沒有工作。但是,我正在使用Automator從OS X 10.6生成的應用程序進行測試。 Automator的新版本可能會添加支持。這可以解釋你引用的另一個問題所報告的成功。

我還沒有檢查過鴨嘴獸。

+0

感謝您提供的信息非常豐富 - 現在我知道我不是瘋了,只是面對一個有點難的問題。 – user3495510