求助两个use-package的问题

最近在研究用use-package配置启动文件 ,有两个小问题不知道怎么解决,求大神指导一下: 1、auto-complete在加载ivy或ido以后再进行加载,而具体想实现的功能是在运行conunsel-find-file 或ido-find-file这两个命令之后进行加载。现在用的代码如下: (use-package auto-complete :after (:any ivy ido) :config (ac-config-default) (global-auto-complete-mode t) (message “Loading Auto-complete…DONE”) ) 请问如何用命令对auto-complete模式进行启动?

2、server的启动: (use-package server :if window-system :unless (server-running-p) :config (server-start) (message “Emacs Server …DONE”) ) 这块代码不能工作,提示“Symbol’s function definition is void: server-running-p” 想实现的功能是:如果没有运行server,则运行。如果运行了那么就不要再运行一次。

auto-complete 这个包太老了吧,现在基本没有人用了,推荐切换至 company-mode.

如果非得使用的话,可以使用 advise, 但是这块我不太懂,期待后面的人回答一下。

server-running-p 这个符号在 server 包里面,必须先要 (require 'server) 之后才能用。 对应的 use-package 写法是

(use-package server
  :ensure nil
  :config
  (unless (server-running-p)
    (server-start)))
  1. 第一个问题, 可以使用 advice-add 来实现
(defun run-auto-complete-a (&rest _)
  (when (require 'auto-complete)
    (ac-config-default)
    (global-auto-complete-mode t)
    (message “Loading Auto-complete…DONE”)
    (advice-remove 'ido-find-file #'run-auto-complete-a)
    (advice-remove 'counsel-find-file #'run-auto-complete-a)))

(advice-add 'ido-find-file :after #'run-auto-complete-a)
(advice-add 'counsel-find-file :after #'run-auto-complete-a)
  1. 第二个问题是: server-running-p 函数没有使用 autoload 功能,需要在 server 包被导入后才可以使用它。
  • 解决方法一
    (autoload 'server-running-p "server" nil t)
    (use-package server
      :if window-system
      :unless (server-running-p)
      :config
      (server-start)
      (message "Emacs Server …DONE"))
    
  • 解决方法 二
    (use-package server
        :if window-system
         :commands (server-running-p)
         :init
      (unless (server-running-p)
          (server-start)
          (message "Emacs Server …DONE")))
    

server的话直接

(ignore-errors (server-start))

吧。server-running-p有局限还慢

一定想知道的话,用server-proecss: https://lists.gnu.org/archive/html/bug-gnu-emacs/2018-06/msg00723.html

楼上几位都回答了,只是来凑下热闹。为啥大家都不用 server-mode呢? :joy: :joy: :joy:

按照 @casouri 给出的链接,这样应该就可以判断了 (boundp-and-true server-process) 。不过只能用在当前 instance 中,再启动一个 Emacs 还是返回 nil。 server-running-p确实令人费解,其实是考虑了多个实例的情况,包括 TCP 模式,是按照 Unix 的方法设计的,启动生成一个 lock 文件,存在就表示启动了,否则就是没有。

1 个赞

感谢回复。server-mode确实有效。已经换到这个了。server-running-p的话重新打开一个实例后还会再运行一次server。感谢@casouri的链接

谢谢推荐。一会儿就去看看

多谢指导。社区力量果然厉害