2011-12-15 20 views
5

Common Lispのvimで自動書式設定/自動インデントをカスタマイズする最適な方法を知りたいと思います。Common Lispのvimで自動書式設定/自動インデントをカスタマイズする最も良い方法

自動フォーマット(これは通常、コマンドモードで行ごとに '=='と入力することで行います)は、vimのベースのlisp言語でうまく動作します(例:defmacro、defun、lambda、if、with-output-to (例えば、マクロを使用して)新しい言語構造が定義されているときはいつでも、新しい構造の書式設定はしばしば私が望むものではないことがわかります。

例えば、ここではどのようにvimの形式「(標準Lispの構文)と」awhen(の一般的に使用される照応バージョンです;にawhen「ではないのLisp標準の一部)

(when 'this 
    (process 'this)) 

(awhen 'this 
     (process it)) 

私は希望を」自動フォーマット 'のようなときに。どのように私はこれを行うことができます任意のアイデア?

編集:Slimvのお勧めギリガンとTamas。テストとして、私はMacVimをダウンロードしました(これはターミナルのvimで動作する必要がありますが、それは別の問題です)、slimvをslimvのダウンロードを〜/ .vimにrsynchedし、MacVimを起動して.lispファイルをロードしました。

その後、私はデフォルトのlisp実行可能ファイルとコアファイルをロードしたlispサーバを起動しました(MacVimを使ってGUIを実行しました)。

*私のコアファイルには、私がよく使用する言語拡張機能(既に1つ)がロードされているため、すぐに正しい形式で書式設定されています。

私はこのソリューションが本当に好きです。 [1] vimに特定の関数を適切にインデントする方法を習得し、[2]定義した言語拡張ごとに明示的にコードを書く、[3]新しいコードを追加するたびにコードを更新する言語構造。代わりに、私はslimvを利用して私のフォーマットをしています。そしてslimvは、サーバセッションが使用しているlispコアにすでにロードされている限り、新しい言語拡張を「学ぶ」ことができます。かなり滑らか!

これは、特定のクラスの言語拡張でうまく機能することがわかりました。通常は、マクロとして定義され、本体のキーワードは&です。これはほとんどの場合、「正しいことをする」ようですが、私が使用するマクロは、まだ適切に自動フォーマットされていません。私は、マクロが他のどの言語よりもどのように書かれているか(非標準言語拡張)の問題である可能性が高いと言います。

このソリューションは、ほとんどの場合私にとってはうまく機能し、何もコード化(および保守)する必要はありませんでした。素晴らしいもの!

+1

私はあなたがslimvが好きだとうれしいです。インデントの問題がある場合は、私に報告してください(私はslimvの作者です。私の電子メールアドレスはドキュメントにあります)。 –

+0

Slimvの答えは、Common LispではないLisp方言の標準フォームをよりよくインデントしたい人にとってはあまり役に立ちません。 – Kaz

答えて

5

これは、あなたの質問に直接答えではないかもしれませんが、私は強くあなたが にslimvプラグインをインストールすることを示唆している:http://www.vim.org/scripts/script.php?script_id=2531

そのvimのにSLIMEの機能を統合し、他の多くのもののほかに、それはまた、付属しています偉大なプラグインclispの改良されたインデント。& clojure。あなたが望むような方法ではインデントしません。

+1

Slimvはスワンクサーバーに接続され、awhenが現在のREPLで定義されている場合は正しくインデントされます。インデントは、スライムを持つEmacsの場合と同様に、スワンクサーバーから取得したランタイム情報に基づいています。 –

+0

ああ、さらに良い - 長い話を短くするために、@claytonstanely:あなたはslimvをインストールする必要があります:) – gilligan

1

filetypeが 'lisp'の場合、 '/ vim7x/indent'ディレクトリの 'lisp.vim'ファイルに特別な場合のインデントルールを追加する必要があると思います。あなたは:h indent-expr:h indentexprの助けでより多くの情報を見つけることができます。

誰かがあなたをよりよく伝えるかもしれませんが、組み込み関数lispindent()がインデント値を取得するために、デフォルトのlisp.vimインデントファイルは基本的に何も行いません。

(1)自分のインデント/ lisp.vimファイル内の関数、たとえばGetLispIndent()にインデント値(indentexpr)を取得するために使用される関数を設定します。
(2)GetLispIndent()関数では、lispindent()を使用して、特殊な場合を除くすべての行にインデント値を返すようにします。 indentexprがどのように動作するかを知るには、他の言語のインデントファイルを参照し、ドキュメントを読んでください(例:java.vim)。

+0

'indent'ディレクトリの' lisp.vim'ファイルには、何も書かれていません。これは、Lispの字下げは、古典的なViの特徴に戻る特殊な "lispモード"によって実行されるからです。 – Kaz

1

このトピックを探していて、Slimvを実行したくない人にとっては、Common Lispやその他の理由で動作していないため、ここにスクープがあります。

VimのLisp字下げは、他の言語ではそうではありません。それは特別な "Lispモード"を持っています。このモードは、.lispファイルに対して自動的に行われる

によって自動的に行われます。 LispモードはVimの発明ではありません。従来のVi実装では、:set lispでLispモードがオンになっています。 (これは残念ながらPOSIXでは記述されていません)。

VimのLispモードは、フォームが2つのスペースの字下げを必要とする特別な演算子、つまり、カンマで区切られた識別子のリストを保持するlispwordsというパラメータを持つ単純なメカニズムを持っています。

これは、Common Lisp .listファイルを構文ハイライトとallで編集している場合でも、これが使用される識別子リストであることを証明することができます。単に:set listwords[TAB]を実行し、リストを編集して何かを削除してください(defunなど)。次に、defunに再び字下げを試みてください。演算子スタイルの代わりに関数スタイルの字下げが表示されます。

Common Lispの構文強調表示は、Lispモードのlispwordsパラメータとは異なります。それ自身の識別子のリストを持っています。たとえば、Vimの7.3には、これを入力した場合:これはsymbol-macroletが認識し、着色されているという事実にもかかわらずである

(symbol-macrolet ((foo bar)) 
       you get indented out to here!) 

。どうして? symbol-macroletは、lispwordsリストには表示されませんが、lisp.vim構文ハイライト定義ファイルには表示されます。

結局のところ、あなたのディレクトリにある.lispファイルをマクロ用にスキャンして、.vimrcというディレクトリに配置されたset lispwords=...コマンドを生成するということです。

カスタムLisp方言で作業している場合は、ロード時にそのVim構文ハイライトファイルをカスタマイズlispwordsにすることができます。

ここには監視があります。lispwordsオプションにはローカル値がありません。 setlocal lispwords ...を使用して、バッファ固有の値を与えることはできません。言い換えれば、少なくともVim 7.3ではUbuntuで使用していますが、複数のバッファを開いて、インデント用に異なる識別子を持つLispの異なる方言を保持することはできません。 lispwordsのデフォルトの内容には、 "one size almost fit all"解決策の一種であることを試みるために、Lisp スキームシンボルが散在しています。

関連する問題