我是 emacs 的新手(来自 vim,在那里我无法让 idris-vim 工作)并通过 el-get 安装了这些软件包:

ace-jump-mode         installed  A quick cursor location minor mode for emacs.
el-get                installed  Manage the external elisp bits and pieces you depend upon.
evil-leader           installed  Add <leader> shortcuts to Evil, the extensible vim        emulation layer
evil-numbers          installed  Increment/decrement numbers in Evil, the extensible vim        emulation layer. Like C-a/C-x in vim.         After installation, you will need to add a key-binding for evil-numbers.        For example:         (define-key evil-normal-state-map (kbd "C-c +") 'evil-numbers/inc-at-pt)        (define-key evil-normal-state-map (kbd "C-c -") 'evil-numbers/dec-at-pt)
evil-surround         installed  Emulate Tim Pope's surround.vim in evil, the extensible vim        emulation layer for emacs
evil                  installed  Evil is an extensible vi layer for Emacs. It        emulates the main features of Vim, and provides facilities        for writing custom extensions.
goto-chg              installed  Goto the point of the most recent edit in the buffer.
haskell-mode          installed  A Haskell editing mode
idris-mode            installed  Major mode for the Idris language
j-mode                installed  Emacs major mode for editing J code.
linum-relative        installed  Display relative line number in the left margin
undo-tree             installed  Treat undo history as a tree

我的 ~/.emacs.d/init.el 看起来像这样:
(add-to-list 'load-path "~/.emacs.d/")
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d//ac-dict")
(ac-config-default)

(setq mouse-wheel-scroll-amount '(1 ((shift) . 1)))
(setq mouse-wheel-progressive-speed nil)
(setq mouse-wheel-f 't)
(setq scroll-s 1)

(add-to-list 'load-path "~/.emacs.d/lojban")
(autoload 'lojban-parse-region "lojban" nil t)
(autoload 'lojban-mode "lojban-mode" nil t)

(add-to-list 'load-path "~/.emacs.d/el-get/el-get")

(unless (require 'el-get nil 'noerror)
  (with-current-buffer
      (url-retrieve-synchronously
       "https://raw.github.com/dimitri/el-get/master/el-get-install.el")
    (goto-char (point-max))
    (eval-print-last-sexp)))

(add-to-list 'el-get-recipe-path "~/.emacs.d/el-get-user/recipes")
(el-get 'sync)

(add-to-list 'load-path "~/.emacs.d/j-mode/")
(autoload 'j-mode "j-mode.el" "Major mode for editing J files" t)
(add-to-list 'auto-mode-alist '("\\.ij[rstp]$" . j-mode))

;(custom-set-face
; '(j-verb-face ((t (:foreground "cornflower blue"))))
; '(j-adverb-face ((t (:foreground "goldenrod"))))
; '(j-conjunction-face ((t (:foreground "olive drab"))))
; '(j-other-face ((t (:foreground "Black")))))

(require 'evil-leader)
(global-evil-leader-mode)

(add-to-list 'load-path "~/.emacs.d/evil")
(require 'evil)
(evil-mode 1)
;(require 'lalopmak-evil)
(define-key evil-normal-state-map "," 'evil-ex)
(define-key evil-motion-state-map ":" 'evil-repeat-find-char-reverse)

(define-key evil-window-map "j" 'evil-window-left)
(define-key evil-window-map "J" 'evil-window-move-far-left)
(define-key evil-window-map "k" 'evil-window-down)
(define-key evil-window-map "K" 'evil-window-move-very-bottom)
(define-key evil-window-map "h" 'evil-window-up)
(define-key evil-window-map "H" 'evil-window-move-very-top)

(define-key evil-motion-state-map "j" 'evil-backward-char)
(define-key evil-motion-state-map "J" 'evil-window-top)
(define-key evil-motion-state-map "k" 'evil-next-line)
(define-key evil-motion-state-map "h" 'evil-previous-line)

(define-key evil-motion-state-map (kbd "C-n") 'evil-scroll-line-up)

(define-key evil-normal-state-map (kbd "M-x") 'execute-extended-command)

由于我使用的是 evil,并且 idris-mode 具有可用于 evil 的绑定(bind),因此我尝试遵循 vim 的 case splitting example。从一个新的 session 开始,会发生以下情况:
  • 我打开 vadd.idr 文件,它已经包含 3 行(其中 1 行是空白的)。
  • 我移到最后一行并按 \d
  • 我收到一条很长的错误消息,在我阅读之前它就消失了。
  • Idris REPL 在新的拆分 Pane 中打开。
  • 命令行(在窗口底部)显示 Buffer vadd.idr has no process
    我还尝试了 REPL,在插入模式下输入。按回车键后,我得到 Buffer *idris-repl* has no process ,没有进一步的 react 。

  • 在 Linux shell 中, echo $PATH 生成 /home/james/bin /home/james/.cabal/bin /home/james/bin /usr/local/sbin /usr/local/bin /usr/bin /usr/bin/vendor_perl /usr/bin/core_perl ,并且 idris 在 shell 中按预期工作。

    当退出 emacs 时(通过一些 ZZ s),我被告知存在事件进程。这是我显示的进程列表:
    Process         Status  Buffer          TTY          Command
    idris           run     *idris-process* /dev/pts/3   idris --ideslave-socket
    

    因为它可能是连接的,所以这是我在 vim 中使用 idris-vim 从同一个文件中得到的错误:
    :call IdrisReload(0)
    "vadd.idr" 3L, 62C written
    Uncaught error: connect: does not exist (Connection refused)
    
    Press ENTER or type command to continue
    

    我使用 ex 命令是因为领导者绑定(bind)不起作用(我还有另一个问题)。

    很抱歉提出这么长的问题。我想包括最相关的信息,即使这意味着添加不相关的东西。

    编辑 : 更多;我找到了调试器(从菜单中设置“Enter Debugger on Error”)。

    我按 \d ,然后在缓冲区中看到这个:
    Debugger entered--Lisp error: (file-error "make client process failed" "connection refused" :name "Idris Ideslave" :buffer "*idris-connection*" :host "127.0.0.1" :service 0 :nowait nil)
      make-network-process(:name "Idris Ideslave" :buffer "*idris-connection*" :host "127.0.0.1" :service 0 :nowait nil)
      open-network-stream("Idris Ideslave" "*idris-connection*" "127.0.0.1" 0)
      idris-connect(0)
      idris-process-filter("     ____    __     _                                          \n    /  _/___/ /____(_)____                                     \n    / // __  / ___/ / ___/     Version 0.9.12\n  _/ // /_/ / /  / (__  )      http://www.idris-lang.org/      \n /___/\\__,_/_/  /_/____/       Type :? for help                \n\n")
      comint-output-filter(#<process idris> "     ____    __     _                                          \n    /  _/___/ /____(_)____                                     \n    / // __  / ___/ / ___/     Version 0.9.12\n  _/ // /_/ / /  / (__  )      http://www.idris-lang.org/      \n /___/\\__,_/_/  /_/____/       Type :? for help                \n\n")
      accept-process-output(#<process idris> 3)
      idris-run()
      idris-ensure-process-and-repl-buffer()
      idris-load-file-sync()
      idris-add-clause(nil)
      call-interactively(idris-add-clause nil nil
    

    并在前命令行中看到
    make client process failed: connection refused, :name, Idris Ideslave, :buffer, *idris-connection*, :host, 127.0.0.1, :service, 0, :nowait, nil
    

    我不知道它想做什么。

    编辑 :这是 vadd.idr 缓冲区状态行的右端(正确的术语?):
    (Idris (Not loaded) ElDoc Ind Undo-Tree)
    
    Not loaded 看起来令人担忧,但我对此一无所知。

    编辑 :回到 Vim 问题,我跑了
    $ vim -V9vimlog vadd.idr
    :call IdrisReload(0)
    ZZ
    $ ack idris vimlog
    

    日志中的所有内容看起来都很正常,直到最后(由错误引起):
    Calling shell to execute: "(idris --check   vadd.idr) &> /tmp/vbKELys/1"
    Error detected while processing function <SNR>38_BufWritePostHook..<SNR>38_UpdateErrors..<SNR>38_CacheErrors..16..15..SyntaxCheckers_idris_idris_GetLocList..SyntasticMake:
    Calling shell to execute: "(idris --client ':l /mnt/sda9/home/james/Documents/idris/vadd.idr') >/tmp/vbKELys/2 2>&1"
    

    所以,我发现日志文件包括
    Calling shell to execute: "(idris --check   vadd.idr) &> /tmp/vbKELys/1"
    Error detected while processing function <SNR>38_BufWritePostHook..<SNR>38_UpdateErrors..<SNR>38_CacheErrors..16..15..SyntaxCheckers_idris_idris_GetLocList..SyntasticMake:
    line   66:
    E380: At bottom of quickfix stack
    error list 1 of 1; 1 errors
    Calling shell to execute: "(idris --client ':l /mnt/sda9/home/james/Documents/idris/vadd.idr') >/tmp/vbKELys/2 2>&1"
    Uncaught error: connect: does not exist (Connection refused)
    

    从 shell 运行这些 shell 命令,我得到:
    $ idris --check vadd.idr
    $ idris --client ':l /mnt/sda9/home/james/Documents/idris/vadd.idr'
    Uncaught error: connect: does not exist (Connection refused)
    $ idris --client vadd.idr
    Uncaught error: connect: does not exist (Connection refused)
    

    顺便说一句,普通的 idris vaddr.idr 工作正常。

    最佳答案

    在我看来,您可能在 Idris 和 idris-mode 之间存在版本不匹配。最近,idris-mode 开始使用套接字与编译器而不是 stdin/stdout 进行通信。如果您使用的是 MELPA 的 idris-mode,那就是它所期望的。通常,MELPA 上的版本将需要编译器的最新 Git 版本。来自 Github 的最新标记版本(在 MELPA 稳定版中可用)将与最新版本的 Idris 一起使用。

    在 Vim 中,运行子进程比在 Emacs 中困难得多,因此在 Vim 中,您需要有一个单独的运行 Idris REPL。然后使用 --client 选项发送命令,这会导致命令在后台 REPL 中运行。这个后台 REPL 应该有正确的工作目录。我看到你在上面使用了 --check - 这告诉 Idris 键入检查文件然后退出。尝试在一个终端中启动 REPL,然后从另一个终端使用 --client

    10-06 13:46