idris-mode - 缓冲区没有进程

时间:2014-09-14 13:50:49

标签: emacs evil-mode idris

我是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)

由于我正在使用邪恶,而且idris-mode具有与邪恶相关的绑定,因此我尝试按照case splitting example来使用vim。从一个新的会议开始,这是发生的事情:

  1. 我打开vadd.idr文件,该文件已包含3行(其中1行为空白)。
  2. 我移到最后一行并按\d
  3. 我收到一条很长的错误消息,在我能够阅读之前消失了。
  4. Idris REPL将在新的拆分窗格中打开。
  5. 命令行(位于窗口底部)显示Buffer vadd.idr has no process。 我也尝试了REPL,输入插入模式。按回车键后,我得到Buffer *idris-repl* has no process,没有进一步发生。
  6. 在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_perlidris可以按预期在shell中运行。

    退出emacs时(通过几个ZZ),我被告知存在活动进程。这是我显示的进程列表:

    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命令,因为领导者绑定不起作用(我还有另一个问题)。

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


    修改:更多;我找到了调试器(从菜单中设置“输入错误时调试器”)。

    我按\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
    

    并在ex命令行中查看

    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工作正常。

1 个答案:

答案 0 :(得分:2)

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

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