Vim に LISP(2019)

2026/05/23 23:55

Vim に LISP(2019)

RSS: https://news.ycombinator.com/rss

要約

日本語訳:

このテキストは、2019 年末時点で Common Lisp 開発向けに Vlime よりも Slimv Vim プラグインを推奨しており、より成熟した多機能な体験を提供しているとしています。主な利点には、Vlime の Common Lisp 限定サポートに対して複数の Lisp диалекト(Common Lisp、Scheme、Clojure)に対応する強力な支援が挙げられ、組み込みの Pareditによる自動インデントと s-expression ナビゲーション、さらにデバッグを簡素化するインタラクティブで修正可能な REPL バッファが含まれます。両方のプラグインは Swank サーバーアーキテクチャに依存していますが、Slimv は特別なお問い合わせモードを必要とせず完全編集可能な REPL 入力に対応するのに対し、Vlime の REPL は直接編集できません。また推奨理由には、Slimv がバンドルしている Paredit(Vlime は別途インストールが必要)、結果表示用のステータスライン、そして tmux/Screen/Desktop 環境との連携による Swank の自動起動などがあります。著者はまた、最近の Vlime の表示バグ修正と、執筆中に解決された特定の Slimv の 4 つの問題についても言及しています。全体的に、Lisp 環境間の柔軟性と高度な編集機能を手軽な追加設定なしで求めている開発者にとって、Slimv が明確な選択肢として提示されています。

本文

開発者の Susam Pal:Vim で Lisp を書くためのツール比較 - Slimv と Vlime

本記事は、2019 年 12 月に著者 Susam Pal 氏により執筆されました。

イントロダクション

背景

Lisp

Lisp は括弧化されたプレフィックス表記を持つ言語です。C や Python とは異なり、ホモイコニック性(コードがデータと同一)や強力なマクロシステムにより、極めて柔軟で拡張可能な言語となります。

  • 代表的な文献:

    • 「平均を凌ぐ」 (Paul Graham)
    • 「Lisp の性質」 (Slava Akhmechet)
    • 「なぜ Lisp が神のプログラミング言語となったのか」 (Sinclair Target)
  • 歴史的評価:

    • Alan Kay: 「設計された中で最も優れた単一のプログラミング言語」
    • John Foderaro: 「Lisp はプログラミング可能なプログラミング言語である」
    • Eric S. Raymond: Lisp の理解は「深い啓発体験」であり、より優れたプログラマを作る。

Emacs: SLIME

多くの Lisp プログラマーが Emacs を好みます。SLIME (Superior Lisp Interaction Mode for Emacs) は Emacs 向けの強力な開発環境です。

  • 特徴: REPL、統合デバッグ、インタラクティブな評価を実装しています。
  • アーキテクチャ: Swank TCP サーバーと通信して動作します。

Vim: Slimv/Vlime

Vim 版の SLIME は以下の二つが代表的です。どちらも Swank サーバーを起動することで動作します。

  • Slimv: 「Superior Lisp Interaction Mode for Vim」。2009 年リリース(Tamas Kovacs)。Swank をバンドルしており、一部改変したバージョンを使用します。
  • Vlime: 2017 年リリース(Kay Z)。Slimv よりも新しくて若いです。Swank サーバー自体はバンドルせず、自動ダウンロード用ラッパーのみ提供します。

Vim プラグインの管理方法

  • インストール先の推奨 (Vim 8):

    • Vim 8 ではネイティブのパッケージサポートがあります。
    • 各プラグインを
      ~/.vim/pack/plugins/start/
      にコピーすれば自動的にロードされます。
    • デフォルトのディレクトリ名は任意です。
  • Vlime の注意点:

    • Vlime のトップレベルディレクトリ構造が Vim パッケージに準拠していません。
    • そのため、本稿では古式に従い
      ~/.vim/bundle
      にコピーし、
      runtimepath
      オプションを明示的に設定する方法を推奨します。

ソフトウェアバージョン

以下のバージョン環境で検証されています(将来の互換性は保証されません):

  • OS: Debian GNU/Linux 10.1 (buster)
  • Vim: 8.1
    • Slimv: Git リポジトリ 47a0070
    • Vlime: Git リポジトリ 065b95f
    • Paredit: Git リポジトリ d99905a
    • Rainbow Parentheses: Git リポジトリ 27e7cd7
  • Common Lisp 実装: SBCL, CLISP, ECL, MIT/GNU Scheme, Clojure
  • その他: Quicklisp (beta), tmux

注意: Quicklisp はベータ版です。最新のインストール手順は公式ドキュメントをご確認ください。

はじめ方

Slimv と SBCL で始める

  1. 環境構築コマンド:

    sudo apt-get install vim-nox sbcl tmux git
    
    • vim-nox
      を使用します(Python インターフェースが必要です)。
      vim-gtk
      でも動作しますが、軽量なため
      vim-nox
      が推奨されます。
  2. tmux の準備:

    • Slimv は tmux/GNU Screen/デスクトップ環境内なら Swank サーバーを自動起動します。
    • tmux を使用する場合:
      tmux
      
    • 使用しない場合は、Swank サーバーを手動起動が必要です。
  3. Slimv のインストール:

    git clone https://github.com/kovisoft/slimv.git ~/.vim/pack/plugins/start/slimv
    vim +'helptags ~/.vim/pack/plugins/start/slimv/doc' +q
    
  4. Swank サーバーの起動:

    • tmux などを使用している場合:自動起動されます。
    • 使用していない場合(手動):
      sbcl --load ~/.vim/pack/plugins/start/slimv/slime/start-swank.lisp
      
  5. 開発環境への接続:

    • vim foo.lisp
      でファイルを開きます。
    • Vim ノーマルモードで
      ,c
      を入力します(Swank への接続)。
  6. 開始と評価:

    • REPL が起動します (
      CL-USER>
      )。
    • コードを入力し、
      ,e
      で現在の式を評価します。
    • レベル:カーソル下の式のリーダーキーは
      ,
      です(
      :echo g:slimv_leader
      で確認可)。

Vlime と SBCL で始める

  1. 環境構築コマンド:

    sudo apt-get install vim sbcl git curl
    
    • Vlime は Python インターフェースの Vim (
      vim-basic
      など) でも動作します。
  2. Quicklisp のインストール: Vlime は Quicklisp を依存しています。

    curl -O https://beta.quicklisp.org/quicklisp.lisp
    sbcl --load quicklisp.lisp --eval '(quicklisp-quickstart:install)' --eval '(exit)'
    sbcl --load ~/quicklisp/setup.lisp --eval '(ql:add-to-init-file)' --eval '(exit)'
    
  3. Vlime と Paredit のインストール: Vlime は Paredit をバンドルしていないため、別でインストールします。

    git clone https://github.com/l04m33/vlime.git ~/.vim/bundle/vlime
    git clone https://github.com/kovisoft/paredit ~/.vim/pack/plugins/start/paredit
    echo 'set runtimepath^=~/.vim/bundle/vlime/vim' >> ~/.vimrc
    vim +'helptags ~/.vim/bundle/vlime/vim/doc' +'helptags ~/.vim/pack/plugins/start/paredit/doc' +q
    
  4. Swank サーバーへの接続:

    • Vim ノーマルモードで
      \rr
      を入力します(Vlime サーバーの自動起動・接続)。
      • <LocalLeader>
        がバックスラッシュ
        \
        のままの場合です。
  5. 評価と REPL:

    • Vlime の REPL ウィンドウはデフォルトで「不可編集 (
      nomodifiable
      )」なので、直接コード入力ができません。
    • インタラクションモードを有効化:
      \i
      を入力して切り替え可能(Enter キーで評価)。

Paredit で始める

Paredit は括弧の自動補完や構造化編集を行います。

  • 特徴: 開中括弧
    (
    を打つと自動的に閉じ中括弧
    )
    を挿入します。
  • 電気的リターン (Electric Return): Enter キーを押すと、Paredit は括弧のバランスを整えながら改行を追加します(2 スペースインデント)。
  • 操作例:
    • 開中括弧の削除禁止:リストが空でない場合は閉じ中括弧を削除しません。
    • 式の外に
      >
      を打ち、カーソルを移動させるなど、S-式の編集が容易になります。
  • リーダーキー:
    ,
    です(
    :echo g:paredit_leader
    で確認可)。

デバッガとインスペクタの使用

エラー発生時に SLDB (Slime Debugger) が起動し、バックトレースやリスタート(中止、試す)が表示されます。

Slimv でのデバッガーとインスペクタの利用

  • ワークフロー:
    1. エラーが発生すると分割ウィンドウにバックトレース (
      SLDB
      ) が表示されます。
    2. バックトレースの行で
      Enter
      キーを押すと詳細情報が展開され、変数の値を確認できます(
      ,i
      でインスペクタ呼び出し)。
    3. インスペクタでは Enter キーで深く掘り下げ、Backspace キーで戻る (
      q
      で終了)。
    4. リスタートを選択して処理を続行または中止します (
      a
      または
      ,a
      で中止へ戻り可能)。

Vlime でのデバッガとインスペクタの利用

  • ワークフロー:
    1. エラー発生時に SLDB が起動。
    2. バックトレースの行で
      Enter
      キーを押すと詳細情報が表示されます(分割ウィンドウ)。
    3. インспекタを呼び出すには挿入モード (
      i
      ) に切り替えて変数名を入力し、Enter キーを押します。
    4. Enter キーで深く掘り下げ、Backspace で戻る、
      :q
      で閉じる。
    5. リスタートを選択(中止:
      a
      )。トップレベルへの直接コマンドはありません。

関数のトレース機能

Slimv での関数トレース

  • 手順:
    1. 関数名の上部で
      ,t
      を入力してトレースをトグルします。
    2. ctrl+d
      (または
      ,d
      ) でトップレベル形式を評価すると、呼び出し結果が REPL に出力されます(入出力のペアが表示)。

Vlime での関数トレース

  • 設定:
    ~/.vimrc
    SWANK-TRACE-DIALOG
    のロードを含める必要があり、Vlime コネクション初期化時に Swank contrib モジュールを追加する必要があります。
  • 手順:
    1. \TD
      でトレースダイアログを表示。
    2. ソースコードウィンドウに戻る (
      ctrl + w w
      )。
    3. 関数名上部で
      \TT
      でトレースをトグル。
    4. 形式評価後に
      \st
      を実行。
    5. 結果は分割ウィンドウに表示され、Enter キーで折り返しを開く (
      zo
      ) や FETCH (
      [fetch next batch]
      ) が可能です。

おもちゃのような便利機能 (Nifty Features)

トップレベル式の評価

  • Slimv:
    ,d
    でトップレベル式を評価(カーソル位置)。
  • Vlime:
    \st
    でトップレベル式を評価。

ラインボウ・パーレンセズ (Rainbow Parentheses)

  • Slimv:
    ~/.vimrc
    let g:lisp_rainbow=1
    を追加で有効化(デフォルト OFF)。
  • Vlime: 標準機能なし。独立したプラグイン(
    rainbow_parentheses.vim
    )をインストールする必要があります。

アーグメントリスト

  • Slimv: ステータス行またはメッセージエリアに表示されます。
  • Vlime: 上の分割ウィンドウに表示されます(追加のウィンドウが必要)。

オムニ補完

  • 両方とも機能します(
    Tab
    または
    ctrl+n/p
    で選択)。デフォルトでフュージー(不完全一致)動作です。

シボル記述 (Documentation)

  • Slimv:
    ,s
    キーでカーソル下のシンボルに関する情報を Vim メッセージエリアに表示(Common Lisp/Clojureのみ)。Scheme は非対応。
  • Vlime:
    \da
    キーで情報画面を分割ウィンドウに表示します。

マクロ展開

  • Slimv:
    ,1
    で一度だけ展開、
    ,m
    で完全に展開(Macroline 解除)。
  • Vlime:
    \m1
    で一度だけ展開、
    \ma
    で完全に展開。

クロス参照 (Cross-referencing)

  • Slimv:
    ,xl
    で関数の呼び出しリストを REPL バッファに表示しますが、直接ジャンプする機能はありません。
  • Vlime:
    \xc
    で xref バッファを作成し、Enter キーで直接呼び出し元にジャンプできます。

他の Common Lisp 実装

SBCL 以外の実装でも動作します(SBCL は最も安定)。CLISP や ECL でもサポートされていますが、一部の機能やエラー挙動に注意が必要です。

CLISP での Slimv の使用

  • ~/.vim/pack/plugins/start/slimv/slime/start-swank.lisp
    を CLISP でロードします。
  • GNU Screen/tmux/デスクトップ環境を使用すると自動検出・起動可能です。
  • vim-nox
    が必要です(Paredit 機能含む)。

ECL での Slimv の使用

  • SWANK サーバーを ECL で開始するコマンドに、Swank 用のロードファイルを指定します。
  • 注意: ECL は Swank サーバーの起動に時間がかかることがあります。Slimv ndefault タイムアウト(20 秒)が短いため、
    SWANK server is not running.
    というエラーが出る可能性があります。ECL がコンパイルを完了するまで待つ必要があります。

CLISP での Vlime の使用

  • Vlime は
    ~/.vimrc
    に CLISP 用のビルドコマンド関数 (
    VlimeBuildServerCommandFor_clisp
    ) を定義する必要があります。
  • 注意: SWANK サーバー起動時に SOCKET-STATUS エラーが出る場合がありますが、接続自体は確立されることがあります(このエラーは無視可)。

ECL での Vlime の使用

  • ~/.vimrc
    に ECL 用のビルドコマンド関数 (
    VlimeBuildServerCommandFor_ecl
    ) を定義します。
  • 他の CLISP と同様の注意点があります。

他の Lisp 方言

Vlime は Common Lisp のみサポートしています。Slimv が Scheme と Clojure をサポートします。

MIT/GNU Scheme での Slimv の使用

  • 要件: Linux 環境が必要(macOS では動作しない可能性があります)。MIT/GNU Scheme バージョン 9.x が必要です。
  • 設定:
    slime/contrib/swank-mit-scheme.scm
    を使用して Swank サーバーを起動します。
  • 手順: MIT/GNU Scheme インストール後、tmux 内で自動起動または手動 (
    scheme --load ...
    ) で開始し、Vim で
    ,c
    を入力します。

Clojure で Slimv の使用

  • 要件:
    clojure.jar
    がスキャン可能です(デフォルト
    /usr/local/bin/*
    など)。Maven 等を使ってビルド/インストールするのが確実です。
  • 設定: Vlime と同様に Swank サーバーの起動方法をカスタマイズする必要があります(Java と Clojure の組み合わせを指定)。
    java -cp "$HOME/clojure/clojure.jar:$SWANK_DIR" clojure.main -i "$SWANK_DIR/swank/swank.clj" ...
    

Slimv と Vlime の比較

特徴SlimvVlime
ディレクトリ構造Vim パッケージ標準準拠(簡単)非準拠(
runtimepath
設定が必要)
Python インターフェース必須 (
vim-nox
など)
不要 (
vim.basic
でも OK)
自動起動環境tmux/Screen/デスクトップ必須
(それなしは手動)
tmux/Screen 不要(独自サーバー)
Quicklisp 依存不要(コードバンドル済み)必須
Pareditバンドル済み別でインストール必要
REPL インタラクティブ性可能(直接入力 OK)不可(
nomodifiable
設定あり)*
電気的リターン機能正常機能しない(Enter キーはリスト表示のみ)
UI 表示エリアステータス行/メッセージエリア
結果:REPL 内
分割ウィンドウ追加
言語サポートCommon Lisp, Scheme, ClojureCommon Lisp のみ

*Vlime は REPL を不可編集にしています。インタラクションモード (

\i
) を有効化することで補完できます。

その他の詳細比較

  • ラインボウ・パーレンセズ: Slimv 標準機能で対応可能。Vlime ではプラグイン追加が必要。
  • クロス参照: Slimv は REPL リスト表示のみ。Vlime は xref バッファ経由で直接移動可能。

簡易的な推奨

Slimv を推奨します。

  • 理由:
    • より長期間の歴史があり、安定しています。
    • Common Lisp, Scheme, Clojure と多様な実装をサポート。
    • デフォルトのキーバインドが直感的で便利です。
    • インタラクティブな REPL を標準で提供(大きな利点)。

ただし、Vlime の独自機能や環境に合わせて検討することも可能です。まずは自分で試して好みのものを見つけてください。

免責事項 (Disclosure)

著者 Susam Pal は執筆中に Slimv に以下の 4 つのバグを発見し、即時修正しました:

  • Issue #87, #88, #89, #90

参考文献

同じ日のほかのニュース

一覧に戻る →

2026/05/24 3:45

私の Writerdeck を語る時が来ました。

## 日本語翻訳: 著者は、6年経った System76 Galago Pro ラップトップを「writerdeck」と名づけたオフライン書写ステーションに変換し、X11、Wayland、およびデスクトップ環境を排する tty ベースの構成で Debian Trixie を実行することでミニマリズムを優先しています。コンテンツが公開共有を目的としているためフルディスク暗号化は省略され、管理には `sudo` ユーザーモデルに切り替えて root ログインが無効化されました。本質的なツールとして、Neovim がテキスト編集に使用され(従来のエディタに代わり)、Debian バックポートからの `kmscon` でスケーラブルなターミナルウィンドウを可能にし、セッション多重化には `tmux` を使用し、インストール済みの Network Manager 経由の `nm-tui` が Wi-Fi/WAN の管理に用いられます。電力モニタリングおよび画面明るさ制御は `acpi` と `light` コマンドで行われ、自動ログインと `.bashrc`内の起動スクリプトにより Neovim が `tmux` セッション内で動作し、ブート時に Vimwiki が起動するようにしています。Syncthing は Vimwiki フォルダをリモートサーバーに同期させ、ブラウザ GUI を必要とせずオフラインファーストなワークスペースを維持するために全てのネットワークアドレスを活用しています。この構成はデジタルの雑多さを削減し、悪い書写習慣を打破助けるとともに、クリエイティブ専門家にとってセキュリティと生産性を向上させます。

2026/05/24 7:25

自分でロールを作るな

## 日本語訳: 要約: 開発者は、暗号化やユーザーインターフェースコンポーネントといった重要な機能に対して独自の実装を即時に停止する必要があります。なぜなら、「自分自身でつくる」というソリューションは過去の実績が証明する通り危険であるためです。最も重要な教訓は、安全性と使い勝手を確保するために、自作コードの代わりに既成でピアレビューされた標準を採用しなければならないことです。独自のカスタム暗号化パッケージには、初期化の不備や予測可能なパターンなどの深刻な欠陥を内包しており、規制産業では財務規制に違反し、高額の罰則を引き起こす可能性があります。セキュリティの問題だけでなく、ネイティブブラウザ要素を置換することは性能低下をもたらし、過剰な JavaScript ロジックによりキーボードスクロールの破損やリンクの読み込み遅延といった問題を引き起こします。さらに、独自のソリューションは自動入力機能など、安全なパスワード管理などの重要なネイティブ機能を排除してしまいます。この傾向は、組み込みブラウザ機能の安定性よりも創造的なツールの構築を優先しており、ユーザー(高齢者のご家族も含まれます)が慣れ親しんだツールを常に再学習することを強いられています。これらの使い勝手に関する落とし穴を防ぎ、規制当局による罰金を避けるためには、開発者はネイティブ要素を置換するのではなく補完する方向へ転換すべきです。これにより、すべてのウェブサイトで一貫した動作を確保できます。

2026/05/21 6:21

私の二画面デスクセットアップ(2025)

## 日本語訳: 著者は、壁を向いた単調なパソコンデスクを部屋の方を向くように回転させることで(ドアを見渡させ、奥行きを追加)、そしてテック専用だった単一の面を、二つの明確なゾーニングに分かれた大規模な USM ハラーデスクに置き換えることにより、ハイブリッドなワークスペースへと成功裡に変化させています。このデザインは、ソーシャルメディアでのフィードバックを受けてから以前の壁を向いた配置が持っていた「古い」外観に対応し、また、未使用のアイテム、おもちゃ、プロジェクトをアナログ側の面に置き続けることで、ストイックなミニマリズムの限界を解決し、アイデアを刺激することを可能にしています。単純にチェアを二つの半分の間で移動させることで強化された明確な精神的境界線により、このセットアップは一つの表面上で「作業」「思考」「子供たちと過ごす時間」という 3 つの異なる機能を発揮します。9 ヶ月の使用後、著者は単一コンピューターの配置に戻る予定はないことを確認しており、むしろミニマリスト的な規律とマキシマリスト的な柔軟性を融合させたこの柔軟なシステムを維持する意欲を持っています。これにより、別々の部屋を必要とせずに、ワークフローと創造的アウトプットを向上させることができます。