なんだこれは

はてなダイアリーから移転しました。

Remote Swank Server on Linux/Vagrant

Vagrant で Swank-serverを動かしてみる


元ネタは、https://stackoverflow.com/questions/37634881/connecting-to-a-remote-lisp-without-ssh

Swank-server/Xenial (192.168.24.33) の PORT 4005へ Emacsのslime-connectで接続するだけ

Vagrantfileを用意する

こんな内容のVagrantfileを用意する。
元ネタはtrusty64だったが、今はxenial64かなーと変更。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|

  config.vm.box = "ubuntu/xenial64"
  config.vm.network "forwarded_port", guest: 4005, host: 4005
  config.vm.network "private_network", ip: "192.168.33.24"
  config.vm.provider "virtualbox" do |vb|
      vb.name = "lisp_host"
      vb.gui = false
      vb.memory = "1024"
    end

  config.vm.provision "shell",
  inline: "apt-get update
  if which apt-get > /dev/null; then sudo apt-get -y install git build-essential automake libcurl4-openssl-dev;fi
  git clone -b release https://github.com/roswell/roswell.git
  cd roswell
  sh bootstrap
  ./configure
  make
  sudo make install
  sudo ros setup"
  # SHELL 

end

やっぱりroswelはいいね。

それから、Linuxを起動。

vagrant up

久しぶりだったので、新しいxenialあるよといわれたので、起動後すぐに、

vagrant halt
vagrant destroy

してから

vagrant box update

してからもういちど

vagrant up

したけど、まあ、あまり変化はない。そらそうか。

Xenial64にはいる

vagrant ssh

でxenial64にはいって、

ros run -Q

sbclを起動する。

あとは、sbcl のプロンプトがでるので、Vagrantfileで指定したアドレスと転送ポートを指定して、swank-serverを起動する。

;;load swank 
(ql:quickload :swank)

;;loopback interface
(setf swank::*loopback-interface* "192.168.33.24")

;;swank-start :4005
(swank:create-server)

として、PORT 4005で slime-connectを待つ

Emacsからslime-connect

Emacsから普通にslime-connectで繋ぐ

M-x sline-connectと入力し、ホストに 192.168.33.24 ポートに 4005 とする。
これで接続できた。

Emacsのslime側で例えば関数を定義すると、4005 ポートを通じて送られているので、先のSwank-server側でその関数を使用できる。また、グローバルな変数を実行中に書き換えたりもできる。

一旦終了

このswank-server側は普通のVagrantなので、sbclから

(quit)

で抜けて、さらに Xenialからexitしてから、

vagrant halt

で一旦終了させておける。

また遊ぶときは、vagrant upすればいいのかなー。