From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp11.migadu.com ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms0.migadu.com with LMTPS id 0FzEGKll/mFkfAAAgWs5BA (envelope-from ) for ; Sat, 05 Feb 2022 12:55:21 +0100 Received: from aspmx1.migadu.com ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp11.migadu.com with LMTPS id sGoaFqll/mH+NQEA9RJhRA (envelope-from ) for ; Sat, 05 Feb 2022 12:55:21 +0100 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 29D5431022 for ; Sat, 5 Feb 2022 12:55:21 +0100 (CET) Received: from localhost ([::1]:49636 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nGJey-0006zU-6J for larch@yhetil.org; Sat, 05 Feb 2022 06:55:20 -0500 Received: from eggs.gnu.org ([209.51.188.92]:56754) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nGJeR-0006zL-Rc for emacs-orgmode@gnu.org; Sat, 05 Feb 2022 06:54:47 -0500 Received: from ciao.gmane.io ([116.202.254.214]:53302) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nGJeP-0006RN-Ns for emacs-orgmode@gnu.org; Sat, 05 Feb 2022 06:54:47 -0500 Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1nGJeO-000Acr-D9 for emacs-orgmode@gnu.org; Sat, 05 Feb 2022 12:54:44 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: emacs-orgmode@gnu.org From: Max Nikulin Subject: Lazy load of org-protocol Date: Sat, 5 Feb 2022 18:54:37 +0700 Message-ID: Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0 Content-Language: en-US Received-SPF: pass client-ip=116.202.254.214; envelope-from=geo-emacs-orgmode@m.gmane-mx.org; helo=ciao.gmane.io X-Spam_score_int: 28 X-Spam_score: 2.8 X-Spam_bar: ++ X-Spam_report: (2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_ADSP_CUSTOM_MED=0.001, FORGED_GMAIL_RCVD=1, FORGED_MUA_MOZILLA=2.309, FREEMAIL_FORGED_FROMDOMAIN=0.249, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, NML_ADSP_CUSTOM_MED=0.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-orgmode@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+larch=yhetil.org@gnu.org Sender: "Emacs-orgmode" X-Migadu-Flow: FLOW_IN X-Migadu-Country: US ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1644062121; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=hxdu828giWQybRzbmeKHs2gosl4T5SaODTVeE/NX5M8=; b=kDrC8go26MNL8pxsUjZHQHZrVNHoO0XsGIgRci2HJyBXpsfrmYmrZ7fo7LkqN0D/v/Rd0F qO+XfrzAxGVgiVNiHuO91Wx1nZXPsYjYJJsxQl4iyxhmSSSsMkDIoujb0AV62Z4XJEf8rB MLbAPInRhEm2W73pLKlgi40RoU2k6xa47THBv3wglMpWjLB3a2sRVfVHpSNqFI9UJmv6Y5 w19gj/Y4r894RtJ21dUbkHdY9/Nw0mp9ybZHMctXYnclXy699cyXMQyfkDtcXpaxBhDXpg bT7CYM/+YoY9U2rUVkFEesAQX6ceEqVvfO0JcJKZZSplpntPvsIo6iWqYIOyeQ== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1644062121; a=rsa-sha256; cv=none; b=ord6TWxRlcE7EAQ0aPi9kYbxARxr/sTlqJTzO5y9FzY3xzalYzvAiiCRWwkTFFG7wvScQ2 r7BfaNqwbKCKBqEqcSyDBD4OS5Ksa/vC86E3NEDddcEueauNa6nXxZ/c7bekyKlEyFGmGD yfFLmPEbCzq8LtNBaNeTFWV1uay7b5JCp9kIr86Xg3VBqWMA00FXQO0RyML7dm8Fbo1zry /s9Ywuq9ReJmhghsKYtWNtLl+Cay3d2PS1+l8qx0KfG2jB3u6HXrcNcLdluofSl2hNWimn KSjncoOgSRVHwtNc1ybA/m6yON6NJ59yUq5DX+fUfvrrY+Hg+gVqMpaQttnt2w== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=none; dmarc=fail reason="SPF not aligned (relaxed), No valid DKIM" header.from=gmail.com (policy=none); spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org" X-Migadu-Spam-Score: -2.53 Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=fail reason="SPF not aligned (relaxed), No valid DKIM" header.from=gmail.com (policy=none); spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org" X-Migadu-Queue-Id: 29D5431022 X-Spam-Score: -2.53 X-Migadu-Scanner: scn1.migadu.com X-TUID: W6p8Yjle3gyC Hi. I would prefer to avoid (require 'org-protocol) in emacs init file and to postpone loading till invocation of emacsclient with org-protocol URI. The problem is a hack in org-protocol. URIs are actually treated as (relative) file names and magic is achieved in an advice for `server-visit-files' function. So the advice must be installed in advance. My first idea was to avoid such magic and to create autoload function org-protocol-from-argv with body similar to that advice. If it were possible to get arguments from `command-line-args-left' then invocation would look like emacsclient --eval '(org-protocol-from-argv)' 'org-protocol:/store-link?url=u1&title=t1' Unfortunately it is against design of emacs server protocol. If --eval option is given than everything other is considered as independent expressions. At the lower level there is no way to transfer `argv` as a list from client to server process. It seems, it works if I add another advice to init.el that loads org-protocol on demand: (defadvice server-visit-files (before org-protocol-lazy-load activate) (and (not (featurep 'org-protocol)) (memq nil (mapcar (lambda (loc) ;; loc: (file-name . (line . column)) (not (string-match-p "\\(?:^\\|[/\\\\]\\)org-protocol:" (car loc)))) (ad-get-arg 0))) (progn (require 'org-protocol) ;; copy of org-protocol-detect-protocol-server advice, ;; move to a dedicated function (let ((flist (if org-protocol-reverse-list-of-files (reverse (ad-get-arg 0)) (ad-get-arg 0))) (client (ad-get-arg 1))) (catch 'greedy (dolist (var flist) ;; `\' to `/' on windows. FIXME: could this be done any better? (let ((fname (expand-file-name (car var)))) (setq fname (org-protocol-check-filename-for-protocol fname (member var flist) client)) (if (eq fname t) ;; greedy? We need the t return value. (progn (ad-set-arg 0 nil) (throw 'greedy t)) (if (stringp fname) ;; probably filename (setcar var fname) (ad-set-arg 0 (delq var (ad-get-arg 0)))))))))))) I hope, copy of original advice may be avoided by moving its body to a separate function in org-protocol. Do you have have better ideas how to avoid eager loading of org-protocol from init file?