cafegale(LeafCage備忘録)

LeafCage備忘録(はてなダイアリー)と統一しました。

throw "ERROR"のチェックの簡潔な記述

t9md:
if Check1()
throw "ERROR"
endif

こういうチェックをいっぱいやる場合に
Check1() && throw "ERROR"
Check2() && throw "ERROR"
をやりたんですが、出来ない。

http://lingr.com/room/vim/archives/2013/11/03#message-17268337

manga_osyo:
function! Check1()
 return 1
endfunction

function! Check2()
 return 1
endfunction

command! -nargs=* Checker if | throw "ERROR" | endif
Checker Check1()
Checker Check2()

こうするのが楽かなぁ。ただし、スクリプトローカル関数は使えないけども

もしくは
function! s:throw(exp)
throw a:exp
endfunction

let _ = Check1() && s:throw("ERROR")
let _ = Check2() && s:throw("ERROR")
とか

書くのは前者の方が楽、使い勝手は後者の方が楽

後者なら
function! s:checker(check, ...)
 let expr = get(a:, 1, "ERROR")
 if a:check
  throw expr
 endif
endfunction

call s:checker(Check1())
call s:checker(Check2(), "ERROR Check2")
の方が楽そげ感

http://lingr.com/room/vim/archives/2013/11/03#message-17268353

Lindan:
スクリプトローカルなコマンドが定義できれば ThrowIf {condition} みたいなコマンドを自作するのも良さそうだけれど…

コマンド名,グローバルにしか定義できないので,他のプラグインとかぶらないようにしないといけないのが辛いですね…

http://lingr.com/room/vim/archives/2013/11/03#message-17268374

t9md:
これまでは、if cond | hoge | endif を一行にして、Alignしてたけど。
後者もいい。 osyo さん、サンクスです。
便利メモにメモっとこう。

http://lingr.com/room/vim/archives/2013/11/03#message-17268401

そもそもの目的は、textmanip でもうやることがない(動かせない)ときのチェックをスッキリ書きたかった。

https://github.com/t9md/vim-textmanip/blob/master/autoload/textmanip.vim#L154-L173

http://lingr.com/room/vim/archives/2013/11/03#message-17268438

コマンドを使った方法を経て

最終的にこうなっていました(結局関数を使った方法に)