Vim

Vim script の lambda で Yコンビネータ

Vim

Vim script の lambda では変数がキャプチャ出来ないので無理やりですが。 let Y = { f -> function({ f -> call(f, [f] + a:000) }, [f]) } let Fact = Y({ f, x -> x == 1 ? 1 : f(f, x-1) * x }) echo Fact(5) " => 120 [使用した vim のバージョン] 7.4.…

Vim script の lambda 内で定義した変数のスコープ

Vim

Vim script の lmabda 内で変数を定義した場合、スコープがどうなるのかを調べてみました。 また、変数の定義には execute() を利用します。 [ローカル変数] function! s:main() let F = { a -> [execute("let l:val = a"), l:val][-1] } " or let F = { a -…

Vim script の lambda でクロージャ

Vim

Vim script の lambda ではローカル変数を変数をキャプチャできないので、function() で変数を束縛することで実装してみました。 [実装イメージ] function! Counter() let value = 0 function! Closure(local) let a:local.value += 1 return a:local.value …

Vim script の execute() 時に実行結果を出力する

Vim

さて、Vim script の execute({コマンド}) ですが、引数に渡した『コマンド』の出力結果をキャプチャして返します。 " echo の出力結果を返す。 echo execute("echo 42") この時に当然ですが、"echo 42" のコマンドを実行しただけでは何も出力されません。 "…

Vim script の lambda でローカル変数をキャプチャする

Vim

どうせなら l: を使ってやるかーという感じでやってみました。 function! s:main() let a = 3 let F = function({ local, b -> [extend(l:, local), a + b][-1] }, [l:]) echo F(2) " => 5 let a = -2 echo F(5) " => 3 endfunction call s:main() lambda 内…

Vim script の lambda 内で複数の式を実行する

Vim

Vim script の lambda 内で複数の式を評価したい場合、リストを使うと比較的簡単に実現する事が出来ます。 let F = { a, b -> [execute("echo a", ""), execute("echo b", ""), a + b][-1] } echo F(3, 5) " => 3 " 5 " 8 しかし、もうちょっとスマートな回…

Vim script の lambda で外部変数をキャプチャしたかった

Vim

Vim script の lambda で外部の変数を参照したかったのですが、どうやらこれはエラーになるみたいです。 function! s:main() let a = 3 let F = { b -> a + b } echo F(2) " => E121: 未定義の変数です: a endfunction call s:main() まあ :function で定義…

Vim script の lambda は :call で呼び出すことが出来ない

Vim

Vim script の lambda をいろいろと試していたんですが、どうやら :call で呼び出せない模様。 call { x -> execute("echo x", "") }(10) " E121: 未定義の変数です: x " E15: 無効な式です: x -> execute("echo x", "") " E475: 無効な引数です: { x -> exe…

Vim script の lambda 内で Exコマンドを実行する

Vim

さて、Vim script に lambda が実行されたんですが、lambda 内では式しか定義することが出来ないので、Exコマンドを直接呼び出すことは出来ません。 " Error let F = { x -> echo x } [execute() を利用する] こういう場合は execute() を経由して Ex コマン…

Vim 7.4.2044 でついに Vim script に lambda が実装された!!!

Vim

前々から ML では話題になってたんですが、Vim 7.4.2044 ついに Vim script に lambda が実装されました!! 実装されたのは2〜3日前なんですが体調が死んでたのでブログかけなかった Vim script の lambda は { 引数 -> 式 } という風に定義します。 詳しく…

precious.vim で範囲外のハイライトが無効になるようになった

Vim

precious.vim で範囲外のハイライトが無効になるような pull request を頂きました。 github.com べんり。 もし、この機能を無効にしたいのであれば以下のように設定してください。 let g:precious_enable_switchers = { \ "*" : { \ "outer_region" : 0 \ }…

Vim の +job を使ってみる

Vim

前回からの続きです。 secret-garden.hatenablog.com 前回書き忘れましたが今回使用する Vim は Vim 7.4-2028 になります。 +channel +timer +job が追加された流れについて前回を参照してください。 ちなみにわたしも全部を把握しているわけではないのでと…

Vim の +timer を使ってみる

Vim

そろそろいいかなと思ってまとめてみた。 [+chancel と +job と +timer] さて、今まで Vim で外部コマンドの非同期処理と言えば、vimproc.vim を使用してコマンドを実行し、CursorHold でプロセスを監視するのが一般的でした。 しかし、今年の頭に Vim 本体…

Vim で Ex コマンドの出力結果を取得する関数が追加された

Vim

Vim 7.4.2008 で Ex コマンドの出力結果を取得する execute({command} [, {silent}]) 関数が追加されました。 echo execute("version") " 出力結果 VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jul 10 2016 11:36:59) 適用済パッチ: 1-2015 Compiled by w…

Vim で :message の内容を削除するする

Vim

Vim 7.4.1735 から :message の内容を削除する機能が追加されました。 メッセージの内容を削除したい場合、 :message clear とすることですべてのメッセージを削除する事が出来ます。

Vim 7.4.1989 から filter() と map() で関数参照が受け取れるようになった

Vim

Vim 7.4.1989 から filter() と map() で関数参照が受け取れるようになりました。 github.com これにより map(list, Funcref) という風に Funcref を呼び出すことが出来ます。 この時に v:key と v:val は Funcref(v:key, v:val) というように引数に渡されま…

Vim script で辞書関数から辞書関数を呼び出すときの問題の回避方法

Vim

昨日の続き 昨日は function() を利用して辞書を束縛したのですが、もうちょっと簡単な回避方法があります。 [辞書関数を配列として保持する] let s:A = {} function! s:A.call() " self は s:A になる echo "self is s:A :" self is s:A echo "self is s:B …

Vim script で辞書関数から辞書関数を呼び出すときの注意

Vim

さて、次のように辞書関数を辞書の値をして持ちたい場合があると思います。 let s:A = {} function! s:A.call() " self は s:A ではなくて s:B になる echo "self is s:A :" self is s:A echo "self is s:B :" self is s:B endfunction let s:B = {} " 辞書…

neco-look をすべての filetype で呼び出す

Vim

[追記] @pink_bangbi @manga_osyo サポートしたのでkey に_ 使うようにしてください— 暗黒美夢王(deoplete dev) (@ShougoMatsu) 2016年6月26日 との事なので、最新版では以下のように設定すればおっけーです。 let g:neocomplete#text_mode_filetypes = { "_…

Vim script で sleep sort

Vim

タイマー実装されたのでやってみた。 function! s:echo(msg, ...) echo a:msg endfunction function! s:sleep_sort(list) for i in a:list call timer_start(i * 1000, function("s:echo", [i])) endfor endfunction call s:sleep_sort([10, 4, 6, 8, 9, 7, …

Vim の input() でキャンセル(<Esc>)されたか判定する

Vim

Vim の input() でキャンセル(<Esc>)されたか判定出来ないかぐぐってたら以下のようなワークアラウンドがあったので覚書。 " see: https://github.com/vim-jp/issues/issues/467#issuecomment-23766972 scriptencoding utf-8 function! s:input(...) abort new </esc>…

Vim でグラフィカルにフォントを設定する

Vim

小ネタ的な話なんですが、面白かったので紹介。 GUI 版 Vim では 'guifont' オプションを使用してフォントを設定することが出来ます。 set guifont=Osaka-等幅\ 12 このオプションに対して set guifont=* という風に入力すると、以下のようにフォント選択ダ…

Vim で関数の引数を束縛

Vim

いまさらですが Vim の function() に関数の引数を束縛する機能が実装されました。 第二引数に束縛する引数を配列で渡す事が出来ます。 function! s:plus(a, b) return a:a + a:b endfunction let s:Plus3 = function("s:plus", [3]) echo s:Plus3(5) # => 8…

Vim で timer_stop() を使うときの注意

Vim

さて、最近(でもないけど) Vim に timer_start() と timer_stop() という組み込みの timer 関数が追加されました。 これは一定時間ごとに処理を呼び出す事ができる関数群です。 function! Test(timer) echo 'Handler called' endfunction " 500ms ごとに T…

Vim の辞書関数が強化されてて驚いた

Vim

さて、辞書関数といえば以前は call() を介さないと呼び出すことは出来ませんでした。 let dict = { "value" : 3 } function! dict.add(a) return self.value + a:a endfunction let F = dict.add " call() を介して辞書を指定する必要があった echo call(F,…

Vim の function() にコマンドを渡したかった

Vim

call function(":echo")(42) みたいな事ができると便利じゃないですかね! [やってみた] function! s:funccmd(cmd) let func = { "cmd" : a:cmd } function! func.call(...) execute self.cmd . " " . join(map(copy(a:000), "string(v:val)")) endfunction …

Vim で 2つの textobj の対象を入れ替える operator つくった

Vim

つくりました。 と、いっても最初に公開したのは2年ぐらい前なんですが。 [プラグイン] NeoBundle "osyo-manga/vim-operator-swap" ソースコード:https://github.com/osyo-manga/vim-operator-swap [使い方] <Plug>(operator-swap-marking) で対象の textobj を設</plug>…

Vim でハイライトする operator をつくった

Vim

久々に Vim プラグインをつくった。 [インストール] NeoBundle 'osyo-manga/vim-operator-highlighter' ソースコード:osyo-manga/vim-operator-highlighter [使い方] <Plug>(operator-highlighter) をマッピングします。 nmap <Leader>h <Plug>(operator-highlighter) " 1つのみ</plug></leader></plug>…

Vim で背景をストライプにするプラグインをつくった

Vim

vim-jp の ML でそういう話がされていたので :sign を使って簡単につくってみた。 プラグイン github - https://github.com/osyo-manga/vim-stripe インストール NeoBundle 'osyo-manga/vim-stripe' " or " Plugin 'osyo-manga/vim-stripe' " or " Plug 'osy…

watchdogs.vim でエラーがない場合に quickfix ウィンドウを開かないようにした

Vim

watchdogs.vim の場合、エラーがない場合でも以下のように quickfix ウィンドウが開く場合があります。 で、これが嫌なので Ruby に対応する pull request が来たんですが、他の言語でも問題だったようなので根本的に対応してみました。 最新版の watchdogs.…