4
votes

I'm new to emacs (coming from vim, where I can't get idris-vim to work) and have these packages installed via 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

My ~/.emacs.d/init.el looks like this:

(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)

Since I'm using evil, and idris-mode has bindings that work with evil, I tried to follow the case splitting example for vim. Starting from a fresh session, here's what happens:

  1. I open the vadd.idr file, which already contains 3 lines (1 of which is blank).
  2. I move to the last line and press \d.
  3. I get a long error message, which disappears before I can read it.
  4. The Idris REPL opens in a new split pane.
  5. The command line (at the bottom of the window) shows Buffer vadd.idr has no process. I also try out the REPL, typing in insert mode. Upon pressing enter, I get Buffer *idris-repl* has no process, and nothing further happens.

In a Linux shell, echo $PATH produces /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, and idris works from the shell as expected.

When exiting emacs (via a few ZZs), I'm told that active processes exist. Here's the process list I'm shown:

Process         Status  Buffer          TTY          Command
idris           run     *idris-process* /dev/pts/3   idris --ideslave-socket

Because it may be connected, here's the error I get from the same file in vim, using 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

I use the ex command because the leader binding doesn't work (yet another issue I have).

Sorry for making such a long question. I wanted to include most relevant pieces of information, even if that meant adding irrelevant things.


Edit: more; I found the debugger (setting “Enter Debugger on Error” from the menu).

I press \d, then see this in a buffer:

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

and in the ex command line see

make client process failed: connection refused, :name, Idris Ideslave, :buffer, *idris-connection*, :host, 127.0.0.1, :service, 0, :nowait, nil

I have no idea what it's trying to do.


Edit: Here's the right-hand end of vadd.idr's buffer's status line (correct term?):

(Idris (Not loaded) ElDoc Ind Undo-Tree)

Not loaded looks worrying, but I don't know any more about it.


Edit: Going back to the Vim issue, I ran

$ vim -V9vimlog vadd.idr
:call IdrisReload(0)
ZZ
$ ack idris vimlog

Everything from the log looks pretty normal, until the end (brought about by the error):

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"

So, I find that the log file includes

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)

Running those shell commands from the shell, I get:

$ 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)

Plain idris vaddr.idr works fine, by the way.

1
Does it work if you comment out all the evil stuff from your init file? I know you'll feel crippled without the vim bindings, but it's pretty important to know if evil is affecting this particular issue, so just learn the basic C-f, C-b, C-n, C-p or gasp use the mouse to do what you were doing with evil.Gordon Gustafson
@GordonGustafson: Thanks for the suggestion, but the same thing happened. Which means that I can go back to being evil!mudri
Looking back, it seems to be the same error in both Vim and Emacs (something about a connection failing). But I still don't understand why it's trying to make a local network connection.mudri

1 Answers

2
votes

It looks to me like you may have a version mismatch between Idris and idris-mode. Somewhat recently, idris-mode started using a socket to communicate with the compiler rather than stdin/stdout. If you're using idris-mode from MELPA, that's what it will be expecting. Generally, the version on MELPA will require the latest Git version of the compiler. The latest tagged release from Github (available in MELPA-stable) will work with the latest release of Idris.

In Vim, it's much more difficult to run a subprocess than it is in Emacs, so in Vim, you need to have a separate running Idris REPL. Commands are then sent using the --client option, which causes the command to be run in the background REPL. This background REPL should have the correct working directory. I saw that you used --check above - this tells Idris to type check a file and then exit. Try starting a REPL up in one terminal, then using --client from another.