すがブロ

sugamasaoのhatenablogだよ

vim に華麗にコピペするための必殺コマンド

できる・・・!私にもできるぞ!

Web でソースを見つけて、ちょっくらローカルマシンにコピペして動かしてみたい! とか、HTMLの面倒な定型部分(Documenttype 云々とか)をコピペしようと思って、おもむろに Ctrl-c Ctrl-v で貼付けるとこんな悲惨な事になる。

str = "hoge"
# 文字列を一文字ずつ出力するよ
str.each_byte do |s| 
  puts s.chr
end

これが

str = "hoge"
# 文字列を一文字ずつ出力するよ
# str.each_byte do |s| 
#   puts s.chr
#   end

こんなふうになる。
ひゃー! コピペできないよ!><
こんなとき、昔のおれだったらこうしていた。

  1. クソッタレ Vim が。メモ帳*1にコピペして保存してやんよ!
  2. おれ、emacsって使えないけど、ファイルの保存くらいはできるんだよ・・・?
  3. えーっと、:set noautoindent だっけ・・・?

こんな事をしていてはテンポ悪くて気が狂いそうなのは間違いなしであり、当然のごとく解決策があったのだった。

:set paste

このコマンドを入力してから、入力モードでペーストするときれいに貼れる。これはべんりですね!

VimScript がわかりかけてきた

なんとなく VimScript を見ていたらちょっと分かってきたので簡単な関数を作ってみた。
どこからパクったか忘れたけど、 Ruby のシンタックスチェックをしてくれる関数を色々といじくって汎用的にしてみた。
これは Ruby である必要は無いのだけど、おれ的に Ruby でしか使わないので実質 Ruby 専用なのです。

" 即時実行
nmap ,e :call RubyExecute()<CR>
" シンタックスチェック
nmap ,l :call RubyExecute("-c")<CR>

""" 関数定義部 """
" Ruby の実行、またはシンタックスチェックを行う
function! RubyExecute(...)
  if (a:0 > 0)
    let arg = a:1 
  else
    let arg = ''
  endif
  echo arg 
  let m = matchlist(getline(1), '#!\(.*\)')
  if(len(m) > 2)
    execute '!'. m[1] .' '.arg . ' %'
  else
   execute '!' &ft ' ' . arg .' %'
  endif
endfunction

シェバング、もしくはファイル拡張子(ファイルタイプ)から実行ファイルを探して実行する。 例えばRuby ファイルを開いているなら、"ruby" を実行する。
そして、この RubyExecute 関数に引数を与えるとその引数を Ruby とファイル名の間に埋め込む事が出来る。上記の例だとシンタックスチェックのキーマップでは -c を渡しているので、実質は以下のようなコマンドが生成されることになる。

ruby -c ファイル名

その他に -d を渡してやればデバッグフラグ付きになったりするし、文字コードの指定だってできる(ようするに、オプションとして成立する引数を渡すようにしてあげれば良い)。
これはべんりですね!

*1:もしくはそれに類似するエディタ