ãã®è¨äºã¯ Vim Advent Calendar 2011 ã® 28 æ¥ç®ã®ä»£æã§ãã
æ¥é½ä»£æããããã¨ã«ãªã£ã*1ãã©ãã¿ãæµ®ãã°ãªãã£ãã®ã§ãé©å½ã« vimrc ã®ä¸ãã便å©ãããããªãé¢æ°ãæããã¨ã«ãã¾ãã
ã¹ã¯ãªãããã¼ã«ã«ãªé¢æ°ãå¼ã³åºããã
Vim script ãæ¸ãã¦ãã¨ãã¹ã¯ãªãããã¼ã«ã«ãªé¢æ°ãã³ãã³ãã©ã¤ã³ã¢ã¼ãããç´æ¥å¼ã³åºãã¦æåã確èªããããªããã¨ããªãã§ãã?
- ãããã°ã§å¼ã³åºããã
- 既存プラグインを拡張ããããªã£ã
- ä¸èº«è¦ãã®å¤§å¥½ã
- ãªããç¥ãããã©æ¥ã«å¼ã³åºããããªã£ã
ã¾ããããªãã«ã·ãã¥ã¨ã¼ã·ã§ã³ã¯ãããã¨æãã¾ãããããã¨ã«ãã¾ãã
Vim script ã§ã¯ããã°ãã°ã¹ã¯ãªãããã¼ã«ã«ãªé¢æ°ãå¼ã³åºãã¾ãããæ£ç´ãã¡ãã¡ããã°ããããªãã§ãã
ã¹ã¯ãªãããã¼ã«ã«ãªé¢æ°ãå¼ã³åºãé¢æ°
ç§ã® vimrc ããæç²ãã以ä¸ã®é¢æ°ã vimrc ã«æ¸ãã¦ããã¾ãã
" Call a script local function. " Usage: " - S('local_func') " -> call s:local_func() in current file. " - S('plugin/hoge.vim:local_func', 'string', 10) " -> call s:local_func('string', 10) in *plugin/hoge.vim. " - S('plugin/hoge:local_func("string", 10)') " -> call s:local_func("string", 10) in *plugin/hoge(.vim)?. function! S(f, ...) let [file, func] =a:f =~# ':' ? split(a:f, ':') : [expand('%:p'), a:f] let fname = matchstr(func, '^\w*') " Get sourced scripts. redir =>slist silent scriptnames redir END let filepat = '\V' . substitute(file, '\\', '/', 'g') . '\v%(\.vim)?$' for s in split(slist, "\n") let p = matchlist(s, '^\s*\(\d\+\):\s*\(.*\)$') if empty(p) continue endif let [nr, sfile] = p[1 : 2] let sfile = fnamemodify(sfile, ':p:gs?\\?/?') if sfile =~# filepat && \ exists(printf("*\<SNR>%d_%s", nr, fname)) let cfunc = printf("\<SNR>%d_%s", nr, func) break endif endfor if !exists('nr') echoerr 'Not sourced: ' . file return elseif !exists('cfunc') let file = fnamemodify(file, ':p') echoerr printf( \ 'File found, but function is not defined: %s: %s()', file, fname) return endif return 0 <= match(func, '^\w*\s*(.*)\s*$') \ ? eval(cfunc) : call(cfunc, a:000) endfunction
追è¨: ä¸é¨å¤é¨ã®é¢æ°ã«ä¾åãã¦ããã®ãä¿®æ£
追è¨: scriptnames ã« silent ãå¿ãã¦ãã®ãä¿®æ£
使ãæ¹
ã³ã¡ã³ãã«ããéãã§ãããã¾ãã
call S('local_func')
ããã§ãç¾å¨ç·¨éãã¦ãããããã¡ã§å®ç¾©ããã¦ãã s:local_func() ãå¼æ°ãªãã§å¼ã³åºãã¾ãã
å¼æ°ãä¸ãããå ´åã¯ç´ ç´ã«ããã
call S('local_func', 1, 2, 3)
ãããããã¨ãå¯è½ã§ãã
call S('local_func(1, 2, 3)')
ãã ãããã®å ´å eval() ã使ãããå¤æ°ã¯æ¸¡ããªãã®ã§æ³¨æã
ç¹å®ã®ååã®ã¹ã¯ãªããã®ãã¼ã«ã«é¢æ°ãå¼ã³åºãããå ´åã¯ããã
call S('plugin/my_plugin.vim:local_func', 1, 2, 3)
ãã®å ´åã"plugin/my_plugin.vim" ã§çµããã¹ã¯ãªãããæ¢ãã¦ãæåã«è¦ä»ãã£ããã®ã®ãã¼ã«ã«é¢æ°ãå¼ã³åºãã¾ãã
æå¾ã® .vim ã¯çç¥å¯è½ã§ãã
call S('plugin/my_plugin:local_func', 1, 2, 3)
以ä¸
ããã§ã¹ã¯ãªãããã¼ã«ã«é¢æ°ãå¼ã³åºãæ¾é¡ã§ããï¼
ç§ã¯å®éã«ããã使ã£ã¦ vimrc å
㧠S('twitvim:post_twitter', message) ã¿ãããªæãã§ä½¿ã£ã¦ã¾ãã
ææ¥ã¯ @potix2 ããã§ãã
*1:ã¨æã£ãããã§ã« kaoriya ããã代æãã¦ããã©æ°ã«ãã¦ã¯ãããªã