Поиск…


Монтаж

Лучше всего использовать последний SLIME из репозитория Emacs MELPA: пакеты могут быть немного нестабильными, но вы получаете последние функции.

Портальные и мультиплатформенные Emacs, Slime, Quicklisp, SBCL и Git

Вы можете загрузить портативную и многоплатформенную версию Emacs25, уже настроенную с помощью Slime, SBCL, Quicklisp и Git: Portacle . Это быстрый и простой способ добиться успеха. Если вы хотите узнать, как установить все самостоятельно, читайте дальше.

Ручная установка

В файле инициализации GNU Emacs (> = 24.5) ( ~/.emacs или ~/.emacs.d/init.el ) добавьте следующее:

;; Use Emacs package system
(require 'package)
;; Add MELPA repository
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)
;; Reload package list
(package-initialize)
(unless package-archive-contents
  (package-refresh-contents))
;; List of packages to install:
(setq package-list
      '(magit                    ; git interface (OPTIONAL)
        auto-complete            ; auto complete (RECOMMENDED)
        auto-complete-pcmp       ; programmable completion
        idle-highlight-mode      ; highlight words in programming buffer (OPTIONAL)
        rainbow-delimiters       ; highlight parenthesis (OPTIONAL)
        ac-slime                 ; auto-complete for SLIME
        slime                    ; SLIME itself
        eval-sexp-fu             ; Highlight evaluated form (OPTIONAL)
        smartparens              ; Help with many parentheses (OPTIONAL)
        ))

;; Install if are not installed
(dolist (package package-list)
  (unless (package-installed-p package)
    (package-install package)))

;; Parenthesis - OPTIONAL but recommended
(show-paren-mode t)
(require 'smartparens-config)
(sp-use-paredit-bindings)
(sp-pair "(" ")" :wrap "M-(")
(define-key smartparens-mode-map (kbd "C-<right>") 'sp-forward-slurp-sexp)
(define-key smartparens-mode-map (kbd "C-<left>") 'sp-backward-slurp-sexp)
(define-key smartparens-mode-map (kbd "C-S-<right>") 'sp-forward-barf-sexp)
(define-key smartparens-mode-map (kbd "C-S-<left>") 'sp-backward-barf-sexp)

(define-key smartparens-mode-map (kbd "C-)") 'sp-forward-slurp-sexp)
(define-key smartparens-mode-map (kbd "C-(") 'sp-backward-slurp-sexp)
(define-key smartparens-mode-map (kbd "C-}") 'sp-forward-barf-sexp)
(define-key smartparens-mode-map (kbd "C-{") 'sp-backward-barf-sexp)

(sp-pair "(" ")" :wrap "M-(")
(sp-pair "[" "]" :wrap "M-[")
(sp-pair "{" "}" :wrap "M-{")

;; MAIN Slime setup
;; Choose lisp implementation:
;; The first option uses roswell with default sbcl
;; the second option - uses ccl directly
(setq slime-lisp-implementations
      '((roswell ("ros" "-L" "sbcl-bin" "run"))
        (ccl ("ccl64"
              "-K" "utf-8"))))
;; Other settings...

SLIME сам по себе в порядке, но он лучше работает с менеджером пакетов Quicklisp . Чтобы установить Quicklisp, следуйте инструкциям на веб-сайте (если вы используете roswell , следуйте инструкциям roswell). После установки в вашем lisp-вызове:

(ql:quickload :quicklisp-slime-helper)

и добавьте следующие строки в файл инициализации Emacs:

;; Find where quicklisp is installed to
;; Add your own location if quicklisp is installed somewhere else
(defvar quicklisp-directories
  '("~/.roswell/lisp/quicklisp/"           ;; default roswell location for quicklisp
    "~/quicklisp/")                        ;; default quicklisp location
  "Possible locations of QUICKLISP")

;; Load slime-helper
(let ((continue-p t)
      (dirs quicklisp-directories))
  (while continue-p
    (cond ((null dirs) (message "Cannot find slime-helper.el"))
          ((file-directory-p (expand-file-name (car dirs)))
           (message "Loading slime-helper.el from %s" (car dirs))
           (load (expand-file-name "slime-helper.el" (car dirs)))
           (setq continue-p nil))
          (t (setq dirs (cdr dirs))))))

;; Autocomplete in SLIME
(require 'slime-autoloads)
(slime-setup '(slime-fancy))

;; (require 'ac-slime)
 (add-hook 'slime-mode-hook 'set-up-slime-ac)
 (add-hook 'slime-repl-mode-hook 'set-up-slime-ac)
 (eval-after-load "auto-complete"
   '(add-to-list 'ac-modes 'slime-repl-mode))

(eval-after-load "auto-complete"
  '(add-to-list 'ac-modes 'slime-repl-mode))

;; Hooks
(add-hook 'lisp-mode-hook (lambda ()
                            (rainbow-delimiters-mode t)
                            (smartparens-strict-mode t)
                            (idle-highlight-mode t)
                            (auto-complete-mode)))

(add-hook 'slime-mode-hook (lambda ()
                             (set-up-slime-ac)
                             (auto-complete-mode)))

(add-hook 'slime-repl-mode-hook (lambda ()
                                  (rainbow-delimiters-mode t)
                                  (smartparens-strict-mode t)
                                  (set-up-slime-ac)
                                  (auto-complete-mode)))

После перезагрузки GNU Emacs установит и настроит все необходимые пакеты.

Запуск и завершение SLIME, специальных (запятых) команд REPL

В Emacs Mx slime запустит слизь с реализацией Common Lisp по умолчанию (первая). Если имеется несколько реализаций (через переменные slime-lisp-implementations ), к другим реализациям можно получить доступ через M-- Mx slime , которые будут предлагать выбор доступных реализаций в мини-буфере.

Mx slime откроет буфер REPL, который будет выглядеть следующим образом:

; SLIME 2016-04-19
CL-USER> 

Буфер SLIME REPL принимает несколько специальных команд. Все они начинаются с , . Один раз , набрав, список параметров будет показан в мини-буфере. Они включают:

  • ,quit
  • ,restart-inferior-lisp
  • ,pwd - печатает текущую директорию, откуда работает Lisp
  • ,cd - изменит текущий каталог

Использование REPL

CL-USER> (+ 2 3)
5
CL-USER> (sin 1.5)
0.997495
CL-USER> (mapcar (lambda (x) (+ x 2)) '(1 2 3))
(3 4 5)

Результат, который печатается после оценки, является не только строкой: над объектом Lisp находится полный объект, который можно проверить, щелкнув правой кнопкой мыши и выбрав «Осмотр».

Также возможен многострочный вход: используйте Cj для ввода новой строки. Enter -key приведет к оценке введенной формы и, если форма не будет завершена, вероятно, вызовет ошибку:

CL-USER> (mapcar (lambda (x y)
                   (declare (ignore y))
                   (* x 2))
                 '(1 2 3)
                 '(:a :b :c))
(2 4 6)

Обработка ошибок

Если оценка вызывает ошибку:

CL-USER> (/ 3 0)

Появится буфер отладчика со следующим содержимым (в SBSL lisp):

arithmetic error DIVISION-BY-ZERO signalled
Operation was /, operands (3 0).
   [Condition of type DIVISION-BY-ZERO]

Restarts:
 0: [RETRY] Retry SLIME REPL evaluation request.
 1: [*ABORT] Return to SLIME's top level.
 2: [ABORT] abort thread (#<THREAD "repl-thread" RUNNING {1004FA8033}>)

Backtrace:
  0: (SB-KERNEL::INTEGER-/-INTEGER 3 0)
  1: (/ 3 0)
  2: (SB-INT:SIMPLE-EVAL-IN-LEXENV (/ 3 0) #<NULL-LEXENV>)
  3: (EVAL (/ 3 0))
  4: (SWANK::EVAL-REGION "(/ 3 0) ..)
  5: ((LAMBDA NIL :IN SWANK-REPL::REPL-EVAL))
--- more ---

Перемещение курсора вниз прошло --- more --- приведет к дальнейшему расширению backtrace.

В каждой строке обратной линии нажмите Enter чтобы отобразить больше информации о конкретном вызове (если имеется).

Нажатие Enter в строке перезапуска приведет к вызову определенного перезапуска. В качестве альтернативы, перезапуск может быть выбран с помощью номера 0 , 1 или 2 (нажмите соответствующую клавишу в любом месте буфера). Перезапуск по умолчанию отмечен звездой и может быть вызван нажатием клавиши q (для «quit»). Нажатие q закроет отладчик и покажет следующее в REPL

; Evaluation aborted on #<DIVISION-BY-ZERO {10064CCE43}>.
CL-USER> 

Наконец, довольно редко, но Lisp может столкнуться с ошибкой, которую нельзя обработать отладчиком Lisp, и в этом случае он перейдет в низкоуровневый отладчик или закончит ненормально. Чтобы увидеть причину такого рода ошибок, *inferior-lisp* буфер *inferior-lisp* .

Настройка сервера SWANK через туннель SSH.

  1. Установите общую реализацию Lisp на сервере. (Например, sbcl , clisp и т. Д.)
  2. Установите quicklisp на сервере.
  3. Загрузить SWANK с помощью (ql:quickload :swank)
  4. Запустите сервер с помощью (swank:create-server) . Порт по умолчанию - 4005 .
  5. [На вашем локальном компьютере] Создайте туннель SSH с помощью ssh -L4005:127.0.0.1:4005 [remote machine]
  6. Подключитесь к работающему удаленному серверу swank с Mx slime-connect . Хост должен быть 127.0.0.1 и порт 4005 .


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow