シェルスクリプト用ftplugin作ってみた。

Vim7ではMzSchemeが使えるよ | weblog | 東京嫉妬Schemeプラグインがやたら便利だったので、「:!」コマンド(シェルで実行)用に改造してみました。

「~/.vim/after/ftplugin/sh.vim」等に保存して、でカーソルのある行のシェルスクリプトを実行します。inoremapはお好みで。

「g:EvalCommmand」に「:let w:EvalCommand = "echo hoge | "」とか入れて、「sed 's/hoge/moge/'」のある行で、とやると、パイプまで通せちゃう。便利すぎて死ねます。

nnoremap <buffer> <C-CR> :call <SID>Eval('n')<CR>
"inoremap <buffer> <C-CR> <ESC>:call <SID>Eval('i')<CR>a
inoremap <buffer> <C-CR> <ESC>:call <SID>Eval('i')<CR>
vnoremap <buffer> <C-CR> :call <SID>EvalVisual()<CR>

let g:EvalCommand = ""
function! s:Eval(mode)
	let s:saved_reg = @"
	if a:mode == 'v'
		silent normal `<v`>
		silent normal y
		let @" = substitute(@", '\\\n', '', 'g')
		let @" = substitute(@", '\n', ';', 'g')
	else
		silent normal yy
	endif
	let @" = substitute(@", '[%#!]', '\\\0', 'g')
	execute '!' . g:EvalCommand . @"
	let @" = s:saved_reg
endfunction

function! s:EvalVisual() range
	call s:Eval('v')
endfunction

perl等のスクリプトマッピングすると便利かも。正規表現の確認とか。

2007-03-18
クオート処理を追加。クオートすべき文字はまだまだありそう。
2007-03-10
複数行の処理を修正。行末尾のバックスラッシュを取り除いて、改行をセミコロンにしてシェルに渡す仕様にしました。