Re: vimでclispの式を評価(簡易版)
http://d.hatena.ne.jp/c3po_r2/20100817/1281997466
ちょっとだけコメントで言うつもりが
なんとなく言いたいこととかがいろいろあってこんな量になってしまった...
shellescape()
文字列をシェルへ渡す場合はshellescape()関数でエスケープしておくと安全です。
あとコマンドラインやインサートモードでは
で式を評価して結果を挿入なんてことができるので、それを使ってこんな風にできる。
nnoremap <C-g>j v%y:!clisp -x -q <C-r>=shellescape(@@)<CR><CR>
追記:
@tyru :! の場合 %#! があるので shellescape() だけでは不完全です。
2010-08-17 17:19:52 via Keitai Web to @tyru
:help filename-modifiers
に書いてある記法が:!でも使えるのでshellescape()だけじゃダメですね。
なので上のは完全とは言えません。
後述するsystem()を使った例が安全かと思います。
map, noremap
あとmapだとビジュアルモード(v)と演算子未解決モード(o)*2でもマッピングされちゃうので、
これもnmapとした方が誤爆する可能性がなくて安全です。
ただnmapでもまだ問題があって、右辺が再帰的に解釈されてしまう。
nmap foo bar nmap bar baz
として「foo」を入力すると「baz」が実行される。
また
nmap j gj
この場合も右辺の「gj」を再帰的に解釈しようとするので
jを押した瞬間に「recursive mapping」とか表示される。
そこでnnoremapを使うと
nnoremap j gj
system()
system()関数という標準出力を返す関数では
引数として実行するプログラムの標準入力を指定することができる。
具体的にはこんなことができる。
:echo system('perl', 'print "hello"') " => hello
:echo system('clisp -q', '(+ 1 1)') " => 2
これを使ってタイトルのはこんな風にもできる。
" 「@@」は「@"」と同じで「"レジスタ」の内容を表す nnoremap <C-g>j v%y:echo system('clisp -q -i '.shellescape(expand('%')), @@)<CR>
quickrun
真打登場。
これを使えば特定の箇所やソース全体をささっと評価して結果を表示することができる。
let g:quickrun_config['lisp'] = { \ 'command': 'clisp', \ 'eval': 1, \ 'eval_template': '(print %s)', \}
こんな設定をしとくといいかも。
quickrunは「標準出力を表示」するプラグインだけど、
id:c3po_r2の要求を満たすために式をprintで囲って表示させてみた。
実行は「:QuickRun」か、マッピングから実行する場合
デフォルトでは「
ビジュアルモードで選択して
ノーマルモードで