VimでJavascript(または他のコード)の行を評価し、その結果を行末のコメントに表示できるようにしたいと思います。
たとえば、次のようなファイルがある場合:
console.log(4 + 5);
カーソルがその行にあり、コマンド:.w !node -e
を使用すると、結果「9
」が下のバッファーに表示されます。 :. !node -e
を使用すると、行全体が結果9
に置き換えられます。
代わりに、次のように、コメントの行末に結果を追加するコマンドを作成するにはどうすればよいですか。
console.log(4 + 5); // 9
また、:r
を使用すると、次の行に渡されたものがすべて出力されることにも注意してください。 r !echo "This is text."
は、カーソルの下の行に「This is text.
」を挿入します。ただし、次のようなコマンド...
:r ". !node -e"
...コマンドではなくファイルとして". !node -e"
を読み取ろうとします。私はこの振る舞いを本当に理解していませんが、それは物事を少し直感的にしません。
最終結果は、Atomテキストエディターが水素カーネルを処理する方法をいくらか思い出させ、コード評価の結果がコードの左側に表示されるようにしたいと思います。計画は次のとおりです。キーバインディング(<C-Enter>
または<F5>
)を作成して、現在の行を自動評価し、結果を表示します。
行が次のようになっている場合:4 + 5 =次のようなものを使用できます:
:map "_ay/= ^ Mo ^ [!! echo ^ Ra\| bc ^ MkJ
これがあなたの姿だといいのですが。
Horstの提案のおかげで、「評価」コマンドラインオプションがある任意の言語でVimにこれを実行させる方法を解析することができました。 JavaScriptの場合、私がまとめたコマンドは次のとおりです。
imap <F5> ^[_"ay$o//^[kJo^[!!node -e "^Ra"^MkJi
nmap <F5> _"ay$o//^[kJo^[!!node -e "^Ra"^MkJ
内訳について:
INSERT
モードのマッピングの場合、エスケープ(^[
)は通常モードに戻ります。_"ay$
は行全体をレジスタa
に配置します。o//^[kJ
はコメントに「//」を追加します。o^[
は別の新しい行を開始します。!!node -e "^Ra"^M
はNode.jsを介してレジスタ(行)を実行し、現在の行に結果を返します。kJ
は、この新しい行を最初の行に戻し、コメントにします。INSERT
モードの場合、i
はモードをNORMAL
からINSERT
に戻します。)Pythonについても、いくつかの小さな編集を加えるだけで同じことができます。
imap <F5> ^[_"ay$o#^[kJo^[!!python -c "import math; ^Ra"^MkJi
nmap <F5> _"ay$o#^[kJo^[!!python -c "import math; ^Ra"^MkJ
このため、//
コメントはPythonの#
に置き換えられます。さらに、math
モジュールを自動的にインポートします。これは、そのようにすばやく計算するのに非常に役立つためです。
これらの各マッピングをそれぞれの~/.vim/ftplugin/<language>.vim
ファイルに配置し、set ftplugin on
を.vimrc
に配置することをお勧めします。これにより、使用している言語に基づいてマッピングを変更できます。
Vimでインタラクティブにコードを実行したい人は誰でもこれを見つけて、おそらくそれを改善することさえできることを願っています。 Ahuge「ありがとう!」この質問に答えてこの小さなプロジェクトをキックスタートするために Horst に行きます!