【问题标题】:How to install org-drill?如何安装 org-drill?
【发布时间】:2016-01-24 23:56:15
【问题描述】:

我是 Emacs 新手,完成了 Emacs 和基本的 org-mode 教程。 现在我想安装 org-drill。以下是我在 Emacs 上安装 org-drill 失败的尝试。

来自http://orgmode.org/worg/org-contrib/org-drill.html

安装

最简单的方法是自定义变量“org-modules”(M-x customize-variables RET org-modules)并确保勾选“drill”。

我打开 spanish.org 文件并在 Emacs 中输入“Meta-x customize-variables”,回显区域显示:

M-x customize-variables [No match]

所以我尝试使用“Meta-x customize-variable”单数:

M-x customize-variable <RET> org-modules

自定义菜单对组织模块开放。 因此,“M-x customize-variables”末尾的“s”是说明中的错字,或者我做错了。

在自定义菜单中,我选中“钻取”并单击“应用并保存”按钮。

退出并重新启动 Emacs。

打开 spanish.org 文件。

在 Emacs 中输入“M-x org-drill”,回显区显示:

M-x org-drill-table-

为什么没有“org-drill”? 我输入:

M-x customize-variable <RET> org-modules

“Drill”仍处于选中状态。

然后我尝试了手动安装说明:

对于手动安装,请将以下内容放入您的 .emacs 中。您还需要确保 Org 的“contrib/lisp”目录位于 emacs 加载路径中。

(需要'org-drill)

我从http://orgmode.org/cgit.cgi/org-mode.git/tree/contrib/lisp/org-drill.el 下载了 org-drill.el 并将其复制到 ~/emacsLoad/org-drill.el,然后将这些行添加到我的 .emacs 文件中:

(add-to-list 'load-path "~/emacsLoad/")
(require 'org-drill)

重新启动 Emacs 和 *Warnings* 窗口显示:

Warning (initialization): An error occurred while loading `/home/wolfv/.emacs':

Symbol's function definition is void: copy-list

所以我使用 `--debug-init' 选项启动 Emacs 以查看完整的错误回溯。 *Backtrace* 窗口显示:

Debugger entered--Lisp error: (void-function copy-list)
  copy-list((1 (quote org-drill-visible-cloze-face) nil))
  org-drill--compute-cloze-keywords()
  (defvar org-drill-cloze-keywords (org-drill--compute-cloze-keywords) nil)
  require(org-drill)
  eval-buffer(#<buffer  *load*> nil "/home/wolfv/.emacs" nil t)  ; Reading at buffer position 1727
  load-with-code-conversion("/home/wolfv/.emacs" "/home/wolfv/.emacs" t t)
  load("~/.emacs" t t)
  #[0 "\205\262

这是什么意思?我不知道 Lisp。

我输入:

M-x customize-variable <RET> org-modules

“钻”不再被选中。

我被难住了。如何在 Emacs 上安装 Drill-org?

我正在使用 GNU Emacs 24.5.1(x86_64-redhat-linux-gnu,GTK+ 版本 3.16.6) 2015-09-14 在 buildvm-10.phx2.fedoraproject.org 上

这是我的 .emacs 文件:

;; load the built-in package manager
(require 'package)

;; add Emacs package repositories to the list of available repositories
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/"))
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/"))
(add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/"))

(add-to-list 'load-path "~/emacsLoad/")

;; disable automatic package loading
(setq package-enable-at-startup nil)

;; from http://stackoverflow.com/a/10095853/580206 > RNA
(defun ensure-package-installed (&rest packages)
  "Assure every package is installed, ask for installation if it’s not.

Return a list of installed packages or nil for every skipped package."
  (mapcar
   (lambda (package)
     (if (package-installed-p package)
     nil
       (if (y-or-n-p (format "Package %s is missing. Install it? " package))
       (package-install package)
     package)))
   packages))

;; make sure to have downloaded archive description
(or (file-exists-p package-user-dir)
    (package-refresh-contents))

;; load installed packages
(package-initialize)

;; make sure these packages are installed
(ensure-package-installed 'evil)
;;(ensure-package-installed 'evil 'org-drill)

;; load the package into memory and call the main mode function
(require 'evil)
(evil-mode t)

(require 'org-drill)
;;(org-drill t)

;; display cursor's (row,col) position in mode line
(setq column-number-mode t)

(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(org-modules
   (quote
    (org-bbdb org-bibtex org-docview org-gnus org-info org-irc org-mhe org-rmail org-w3m org-drill))))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )

【问题讨论】:

  • 大概是指customize-variable而不是customize-variables
  • 谢谢@Drew。这让我更进一步,但仍然“不匹配”: M-x customize-variable RET Customize variable: org-modules [No match]
  • @Drew。我打开一个 .org 文件并重试,这一次打开了自定义选项。显然,必须运行组织模块才能对其进行自定义。
  • 作为测试,我将(tahir) 放入我的.emacs 文件并使用--debug-init 选项启动emacs,它在回溯中显示(void-function tahir)

标签: emacs org-mode org-drill


【解决方案1】:

我对 Emacs 或 Org Mode(或 Elisp)几乎一无所知,但这就是我让它工作的方式。

首先,当 Emacs 在回溯中说 (void-function xxx) 时,这意味着 xxx 尚未定义。经过一番谷歌搜索,我发现copy-list 定义在一个名为cl 的模块中,需要加载。

org-drill.el 实际上在顶部注明了这种依赖关系:

(eval-when-compile (require 'cl))

所以我不知道为什么这不起作用。不过值得庆幸的是,我们可以自己加载它。

Org Drill 有很多其他依赖项,因此您不想自己管理它们。添加 Org Mode 的 elpa repository,然后安装包含 Org Drill 的 org-plus-contrib 包。

在您的.emacs / .emacs.d/init.el 中,在顶部添加

(package-initialize)

这将加载您已安装的所有 elpa 软件包。通常,Emacs 会在 init.el 之后加载 elpa 包,但我们想从 org-plus-contrib 包中加载东西。

在此之后,您可以加载clorg-drill

(require 'cl)
(require 'org-drill)

参考文献

【讨论】:

  • 谢谢塔希尔哈桑。这让我找到了解决方案,我在以下答案中发布了该解决方案。
【解决方案2】:

org-mode 使用这个 init.el 文件:

(require 'package)
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t)
(add-to-list 'load-path "~/emacsLoad/")
(package-initialize) ;; load all elpa packages before require 'org-drill

(require 'cl)
(require 'package)
(require 'org-drill)

http://orgmode.org/cgit.cgi/org-mode.git/tree/contrib/lisp/org-drill.el下载org-drill.el,复制到~/emacsLoad/org-drill.el,

启动 Emacs。

打开文件 spanish.org。

类型:M-x org-drill

按照屏幕底部的提示进行操作。

【讨论】:

    【解决方案3】:

    我所做的(在花了几个小时之后)是:

    mkdir --parents ~/.emacs.d/pkgs
    cd !$
    git clone git://orgmode.org/org-mode.git
    

    然后我将此添加到~/.emacs

    (add-to-list 'load-path "~/.emacs.d/pkgs/org-mode/contrib/lisp/")       
    (require 'org-drill)
    

    在此之后,它就可以工作了。

    *nix 发行版上的默认 emacs 似乎不提供 org-mode 的 contrib 包,而来自 git repo 的包附带了“所有东西”。

    【讨论】:

      【解决方案4】:

      official org-mode repository 中的 Org-drill 已过时(2015 年),这似乎是从 BitBucket 安装顶级版本的最佳决定。

      先决条件:

      首先请输入以下命令检查 Emacs 加载路径:

      C-h v load-path <RET>
      

      Emacs 应该输出本地主机上所有路径的列表,它习惯性地寻找要从中加载的包。随意选择其中任何一个来分配可选包来扩展 Emacs。

      在我的特定情况下,最相关的是/usr/local/share/emacs/site-lisp/ 默认情况下它具有有限的访问权限,因此请确保您有能力在那里写:

      $ ls -la /usr/local/share/emacs-lisp/
      

      或许还可以添加此功能:

      $ sudo chmod 777 /usr/local/share/emacs-lisp/
      

      安装:

      假设您的附加包的容器已准备好使用。因此:

      1. 在那里下载必要的包:

        $ cd /usr/local/share/emacs/site-lisp/

        $ wget https://bitbucket.org/eeeickythump/org-drill/raw/01b05cd7561ad69e5ec9c1200414d4fa128c9a17/org-drill.el

        $ wget http://orgmode.org/cgit.cgi/org-mode.git/plain/contrib/lisp/org-learn.el # org-learn 需要 org-drill

      2. (require 'org-drill) 添加到您的 Emacs 配置文件中

      3. 重启你的 Emacs

      4. 打开 spanish.org

      5. 请尽情享受!

      【讨论】:

        【解决方案5】:

        以下是使用 use-package 自动加载 org-drill 以避免增加启动时间的方法:

        (require 'package)
        (add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t)
        (package-initialize)
        
        (use-package org-drill
          :defer t
          :ensure org-plus-contrib
          :commands (org-drill)
          :config
          ;; Config options
          )
        

        :ensure org-plus-contrib 将确保 Emacs 下载 org-plus-contrib,这是捆绑 org-drill 的位置。

        :commands (org-drill)org-drill 命令创建自动加载。

        【讨论】:

        • 批准的解决方案有效,但这对我也有效,而且更干净。一个潜在的问题是首先加载 org-plus-contrib。可以用:(use-package org :ensure org-plus-contrib :pin org ...)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-03
        • 2020-11-05
        • 2019-02-16
        • 1970-01-01
        相关资源
        最近更新 更多