[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 03/18 19:04 / Filesize : 368 KB / Number-of Response : 974
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Vim6スクリプトお勉強スレ



1 名前:名無しさん@お腹いっぱい。 [01/12/17 12:15]
みんなでスクリプトを覚えよう

797 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/07/19(水) 22:07:18 ]
>>794
うまいね。vimスクリプトでここまでトリッキーな
技は始めて見た。

798 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/08/01(火) 03:41:45 ]
Vimの関数はグローバル関数と無名関数の二種類しかないという話。

fun Func()
endf
fun g:Func()  <- Func()とは区別される
endf
fun g:func()
endf
fun b:func()
endf
fun w:func()
endf
fun s:func()
endf
fun hogehoge::func()
endf

全部グローバル関数。
b:とかw:とかに特殊な意味はなくて、単に関数名にコロンが使えるってことでしかない。
s:func()は特別扱いだけど、<SNR>123_func()という特殊な名前のグローバル関数に
過ぎないので、スクリプト番号さえわかればどこからでも呼び出せる。

ちなみに関数と変数は名前空間が分かれている。

799 名前:カラーロゴなり (1/2) mailto:sage [2006/08/02(水) 11:21:56 ]
let h = ["black", "darkblue", "darkgreen", "darkcyan", "darkred", "darkmagenta", "brown",
      \ "lightgray", "darkgray", "blue", "green", "cyan", "red", "magenta", "yellow", "white"]
for i in range(16)
  execute printf('syn match _%x /\c%x/', i, i)
  execute printf('hi _%x guifg=%s guibg=%s ctermfg=%s ctermbg=%s', i, h[i], h[i], h[i], h[i])
endfor
put ='                   A                   '
put ='                  A2A                  '
put ='   7777777777777AA222AA7777777777777777'
put ='   788888888888822222227888888888888888'
put ='   00888888888002222222008888888888000 '
put ='     888888888222222222278888888800    '
put ='     7888888882222222227888888880      '
put ='     788888888222222277888888800       '
put ='     78888888822222278888888802A       '
put ='     788888888222277888888800222A      '
put ='    A7888888882227888888880222222AA    '
put ='   A2788888888277888888800222222222A   '
put =' AA227888888887888888880222222222222AA '

800 名前:カラーロゴなり (2/2) mailto:sage [2006/08/02(水) 11:23:32 ]
put ='22222788888888888888880022222222222222A'
put =' 2222788888888888888008822222222222200 '
put ='   227888888888888002888222222222220   '
put ='    2788888888888022222222222222220    '
put ='     7888888888002222888228888828888   '
put ='     78888888802222228882288888888888  '
put ='     788888800222222288822882288   88  '
put ='     788888022222222888822882 88   88  '
put ='     788800 222222228882288   88  88   '
put ='     7880    22222228882288  88   88   '
put ='     780       222228882 88  88   88   '
put ='     00         2222888  88  88   88   '
put ='                  220                  '
put ='                   0                   '

801 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/08/09(水) 21:47:02 ]
メールアドレスを補完する completefunc を作ろうとしたけど
完全なものにするのはかなり大変だとわかった。
誰か改良して。

function! CompleteMail(findstart, base)
if a:findstart
let line = getline(".")
let start = col(".") - 1
while start > 0 && line[start - 1] =~ '[A-Za-z@\.\-]'
let start -= 1
endwhile
return start
else
let res = []

802 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/08/09(水) 21:47:57 ]
        while 1
            let match = search('\<' . a:base, "bW")
            if match <= 0
                return res
            endif
            let line = getline(".")
            let b = col(".") - 1
            let e = match(line, '[^A-Za-z@\.\-]', b + 1)
            if e < 0
                let e = strlen(line)
            endif
            call add(res, strpart(line, b, e-b))
            if complete_check()
                return res
            endif
        endwhile
    endif
endfunction

set completefunc=CompleteMail

803 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/08/11(金) 16:40:31 ]
こんなかんじだろうか
function! CompleteMail(findstart, base)
  if a:findstart
    let str = getline(".")[: col('.') - 2]
    let start = match(str, '[[:alnum:]_.-]*\%(@[[:alnum:]_.-]*\)\=$')
    return start
  else
    redir => str
    silent g/[[:alnum:]_.-]\+@[[:alnum:]_.-]\+/
    redir END
    let mx = '[[:alnum:]_.-]\+@[[:alnum:]_.-]\+'
    let i = match(str, mx)
    while !complete_check() && i != -1
      let address = matchstr(str, mx, i)
      if stridx(address, a:base) == 0
        call complete_add(address)
      endif
      let i = match(str, mx, i + len(address))
    endwhile
    return []
  endif
endfunction

804 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/08/11(金) 21:04:47 ]
>>803
すばらしい。とても勉強になります。
ありがとうございます。
ところでメールアドレスに使える文字の正規表現は
けっこう複雑らしい。
www.tohoho-web.com/lng/199809/98090025.htm

805 名前:名無しさん@お腹いっぱい。 [2006/09/11(月) 10:54:33 ]
ふと。skk.vim にも変換予測が付かないかと思ってしまった。




806 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/11(月) 18:41:32 ]
>>805
変換予測って具体的にはどんなイメージですか?

807 名前:名無しさん@お腹いっぱい。 [2006/09/11(月) 23:22:16 ]
携帯の入力のように かな文を打つている片っ端から
候補が出でくるようなのがあったら良いな、と思いました。

具体的には、
UNIX系で 出ている予測入力システムだと PRIME と言うのがあるようです。
そこに出ている説明ページ
taiyaki.org/prime/prime.html
にあるような機能です。


808 名前:名無しさん@お腹いっぱい。 [2006/09/12(火) 01:50:44 ]
>>807
pitecan.com/OpenPOBox/

POBOXとかどうよ

809 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/12(火) 11:34:21 ]
>>807
そこまでいっちゃうと skk じゃないような気がします。

810 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/12(火) 11:46:51 ]
skk-dcomp.el みたいなやつ?

811 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/12(火) 11:55:44 ]
>>810
そうですね。そこらへんならそんなに操作性も変わらないし。

812 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/14(木) 04:59:12 ]
タイマーっぽい

set updatetime=1000
autocmd CursorHold * call Timer()
function Timer()
  echo strftime("%c")
  let K_IGNORE = "\x80\xFD\x35" "特殊な内部コード
  call feedkeys(K_IGNORE)
endfunction

813 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/17(日) 06:00:05 ]
一番でかいvimスクリプトってなんだろう。chalice?

814 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/22(金) 19:01:16 ]
>>810
それならuimでできるし。


815 名前:高一 mailto:sage [2006/09/23(土) 10:50:13 ]
タイムサービスに勝つスクリプトってありますか?
瞬時に住所、名前とかかけちゃうような・・・
なんでもいいので攻略法あったら教えて下さい



816 名前:名無しさん@お腹いっぱい。 [2006/09/24(日) 08:56:08 ]
あげ

817 名前:名無しさん@お腹いっぱい。 [2006/09/24(日) 18:12:57 ]
なんで?

818 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/26(火) 19:07:17 ]
外部ファイルから文字読込んで、ループで対象文字を検索して、
それを変数に代入するコードはどんな感じになるでしょうか?

819 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/27(水) 20:14:13 ]
こんな感じ?
function F(fname, pat)
  for line in readfile(a:fname)
    if line =~ a:pat
      let match = matchstr(line, a:pat)
    endif
  endfor
endfunction

820 名前:名無しさん@お腹いっぱい。 [2006/09/28(木) 03:49:31 ]
setで変数をオプションに代入したいのですがうまくいきません
set fdc=3 と定数にするとうまくいきます

fun! Outline#Set(...)
  let fdc_ = 3

  if a:0==1
    let fdc_ = a:1
  endif

  set foldmethod=expr
  set foldexpr=Outline#FoldLevel(v:lnum)
  set fdc=fdc_ "E521: = の後には数字が必要です: fdc=fdc_
endf

com! -nargs=? Outline call Outline#Set(<args>)

821 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/09/28(木) 11:34:01 ]
>>820
let &fdc=fdc_

822 名前:名無しさん@お腹いっぱい。 [2006/10/02(月) 06:20:22 ]
rubyで作った文字列とかvim scriptの変数にいれれるん?

fu! Aaaa()
let vimstr = ""

ruby vimstr = "Hello Ruby!!"

....

823 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/03(火) 19:47:23 ]
レジスタとか経由すれば

824 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/04(水) 07:08:18 ]
rubydo VIM::command('let g:xyz=45')

825 名前:822 mailto:sage [2006/10/04(水) 22:17:44 ]
>>824
できすまた
ありがとうございます



826 名前:名無しさん@お腹いっぱい。 [2006/10/13(金) 10:08:09 ]
snippetsEmu www.vim.org/scripts/script.php?script_id=1318
このスクリプトがかなり便利なんだけど使っている人いる?

827 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/13(金) 10:56:21 ]
>>826
なにできるの?

828 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/13(金) 10:59:04 ]
10行コピーしたレジスタから、1行1行取り出して処理を加えるにはどうすればいいでしょうか?

829 名前:名無しさん@お腹いっぱい。 [2006/10/13(金) 12:25:57 ]
>>827
iabbrevで指定位置へのカーソル移動と複数箇所の同時編集をできるようになる。

例えば
:Iabbr class class <class><CR>{<CR>public:<CR><class>();<CR>virtual ~<class>();<CR><><CR>};
"class<space>a<S-Del>"
と入力すれば

class a
{
public:
a();
virtual ~a();
<カーソル位置>
}
というテキストが入力される。

830 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/13(金) 17:18:03 ]
TextMateのエミュか。
まえにTextMateのデモムービー見て感動したなぁ。
使い方も簡単だしけっこう良さげだね。

831 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/13(金) 21:37:19 ]
>>828
let lines = split(@@, '\n')
for i in range(len(lines))
  let lines[i] = "hoge"
endfor
call setreg("@", join(lines, "\n"), getregtype("@"))

832 名前:名無しさん@お腹いっぱい。 [2006/10/28(土) 00:16:14 ]
>>826
code.google.com/p/snippetsemu/source
ここからソースを取ってくると最初から定義済みのスニペッツが付いてきて便利。


833 名前:名無しさん@お腹いっぱい。 [2006/10/28(土) 20:52:52 ]
>>832
おぉ、

834 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/31(火) 11:28:33 ]
こんなのつくってみた。+migemoでない人向け。
if has("migemo")
  finish
endif
let cmigemo_cmd = "cmigemo -q -v -d /usr/local/share/migemo/euc-jp/migemo-dict"

fun! s:init_cmigemo()
  let s:in = tempname()
  let s:out = tempname()
  let cmd = 'touch ' . s:in . '; mkfifo ' . s:out . "\n"
  let cmd = cmd . 'tail -f ' . s:in . '|' . g:cmigemo_cmd . '|'
  let cmd = cmd . 'while read -r line; do '
  let cmd = cmd . 'echo "$line" >' . s:out . ';'
  let cmd = cmd . 'done & jobs -ls'
  let s:pids = substitute(system("sh", cmd), "\n", " ", "g")
  au VimLeavePre * call system('kill ' . s:pids)
endf

fun! s:search_cmigemo(str)
  if !exists("s:in")
    call s:init_cmigemo()
  endif
  return system('sh', "echo '" . a:str . "' >>" . s:in . '; cat ' . s:out)
endf

835 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/10/31(火) 11:29:53 ]
続き
fun! s:query_cmigemo(dir)
  let str = input('migemo' . a:dir)
  if !strlen(str)
    return ''
  endif
  let str = s:search_cmigemo(str)
  return strlen(str) ? a:dir . str : ''
endf

nnoremap <silent> <expr> g/ <SID>query_cmigemo('/')
nnoremap <silent> <expr> g? <SID>query_cmigemo('?')



836 名前:mattn@Vim%Chalice mailto:sage [2006/11/01(水) 00:56:47 ]
たしかmigemo.vimにも+migemoでない場合の処理が書いてあったと思いますよ。

837 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/11/01(水) 17:33:40 ]
そうなんだけど検索するたびにcmigemoを起動して辞書を読むのを避けて
2回目以降は前に起動したのと会話するようにしたつもりなんだけど...

838 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/11/09(木) 00:55:39 ]
文章整形プラグインを作ってみました。
yukihiro.nakadaira.googlepages.com/autofmt.vim
~/.vim/autoload/ にコピーして :set formatexpr=autofmt#FormatExpr() と設定すれば使えます。
あんまりテストしてません。細かい設定とかできません。

839 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/11/22(水) 06:01:20 ]
gVimなんですが、ウインドウのサイズって取得できますか?
やりたいのは
1. サイズ取得して変数x, y にいれとく
2. フォントのサイズを変える
3. winsize x y でサイズを戻す
これだけなんですが。

840 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/11/22(水) 16:50:23 ]
let x = &columns
let y = &lines

841 名前:839 mailto:sage [2006/11/22(水) 20:21:12 ]
>>840
ありがとうございます。
ちょっと勘違いしていました、winsizeはピクセルで指定するものだと・・
フォントのサイズを変えると、ウインドウのサイズも変わってしまうので
それを防止したかったんです。

842 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/11/27(月) 13:07:08 ]
vimにて、
:split FILE
などで、別ディレクトリにあるファイルを開いたとき、
また、
^W h
などで、ウィンドウ(?)を切り替えたときに
自動でそのファイルがあるディレクトリにチェンジディレクトリするようにするには
どうすればよいでしょうか?


843 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/11/28(火) 01:09:34 ]
:set autochdir
または
:autocmd BufEnter * :cd %:p:h
たぶん

844 名前:852 mailto:sage [2006/11/28(火) 09:30:37 ]
>>843
思い通りの動作をするようになりました。
どうもありがとうございます。

845 名前:名無しさん@お腹いっぱい。 mailto:sage [2006/11/28(火) 15:35:25 ]
let count = 1
E46: Cannot change read-only variable "count"
(゚Д゚)



846 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/10(水) 04:17:20 ]
vimwiki の incbufswitch.vim を使いやすくするべく改造
していたんですが、いつのまにか echo "\r" が効かなく、
候補リストが複数行にわたる場合、前の表示が残るように
なってしまいました。どこを直せばいいでしょうか?

command! ISwitchB :call ISwitchB()
hi link ISWitchBCurrent Search
hi link ISWitchBOnlyOne IncSearch

function! ISwitchB_ShowList(buflist, partial_name, current)
echon "\riswitch " . a:partial_name . "{"
let i = 0
for fname in a:buflist
if i != 0
echon ","
endif
if i == a:current
if len(a:buflist) == 1
echohl ISWitchBOnlyOne
else
echohl ISWitchBCurrent
endif
endif
echon fname
if i == a:current | echohl None | endif
let i = i + 1
endfor
echon "}"
endfunction


847 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/10(水) 04:18:39 ]
function! ISwitchB()
let orig_bufnr = bufnr("%")
let altbufnr = bufnr("#")
let lastbuf = bufnr("$")
let allbuflist = []
" 代替バッファ # がリストの先頭に来るように
if bufexists(altbufnr) != 0 && buflisted(altbufnr)
call add(allbuflist, expand("#" . altbufnr . ":t"))
endif
let i = 1
while i <= lastbuf
if bufexists(i) != 0 && buflisted(i) && i != altbufnr && i != orig_bufnr
call add(allbuflist, expand("#" . i . ":t"))
endif
let i = i + 1
endwhile

let buflist = allbuflist
let partial_name = ""
let current = 0


848 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/10(水) 04:20:21 ]
while 1
call ISwitchB_ShowList(buflist, partial_name, current)
let c = getchar()
if c == 13 " <CR> 決定
exe "silent buffer " buflist[current]
break
elseif c == 27 || c == 3 " <ESC> or <C-c> キャンセル
echon "\r "
break
elseif c == "\<BS>"
let partial_name = strpart(partial_name, 0, strlen(partial_name)- 1)
if partial_name == "" | break | endif
elseif c == 9 " <tab> 次のマッチを選択
let current = current + 1 >= len(buflist) ? 0 : current + 1
else
let partial_name = partial_name . nr2char(c)
endif
let buflist = ISwitchB_FilterBufList(allbuflist, partial_name)
endwhile
" Hit Enter が出ないように
call feedkeys("\<left>\<right>")
echo
endfunction


849 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/10(水) 04:22:43 ]
function! ISwitchB_FilterBufList(buflist, partial_name)
let result = []
for fname in a:buflist
if a:partial_name == "" || stridx(fname, a:partial_name) >= 0
call add(result, fname)
endif
endfor
return result
endfunction


850 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/10(水) 09:45:24 ]
別のやり方としてこんなのはどうかな?
--- incbufswitch-color.vim.orig Tue Jan  9 17:36:31 2007
+++ incbufswitch-color.vim      Wed Jan 10 09:26:21 2007
@@ -103,6 +103,7 @@
 " Perform an incremental buffer switch
 "
 function! <SID>IncBufferSwitch()
+    let v:scrollstart = ""
     let origBufNr = bufnr("%")
     let partialBufName = ""
     let s:tabStop = 0
@@ -155,4 +156,7 @@
         "echon ' {'.s:buflist.'}'
         call ShowBuflist(partialBufName, s:buflist)
     endwhile
+    if v:scrollstart != ""
+        call feedkeys("\<CR>")
+    endif
 endfunction

851 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/10(水) 23:03:32 ]
ちらついても構わないなら毎回 :redraw! で再描画するとか

個人的にはwildmenuを使った標準的な方法をお勧めする
(:buffer <Tab> および :help :command-completion)

852 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/11(木) 03:58:25 ]
HIT ENTERはfeedkeysで解決できることわかったんですが、
なぜか846のバージョンだと、候補リストが全部消え切らず、残ってしまうんですよ。
一行だけの場合は\rで行頭復帰してそこに上書きするので
前回の候補リストが消えるのですが。
もとのincbufswitch-colorと表示の方法は変えていないし、
なぜこうなってしまったのか原因も気になるんですよね。

853 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/12(金) 00:49:05 ]
redraw してないから

854 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/12(金) 02:12:33 ]
>>853
ISwitchB_ShowList()の1行目にredrawをいれたら直りました。
ありがとうございます。
けど実用上はlookupfile.vimがあれば十分かもしれないですね。
ttp://subtech.g.hatena.ne.jp/secondlife/20070105/1167980175
このプラグインは本当にすごい。

>>851
確かにvim標準の方法で満足できるならベターですけどね。
しかし、そのためにはvim標準の設定・機能は利便性が低過ぎると
いつも感じます。

855 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/12(金) 19:58:53 ]
エコーエリアをクリアする関数と
Press ENTER プロンプトを表示しない :echo は欲しいね



856 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/17(水) 20:41:00 ]
名無しに反応するオートコマンド
:autocmd WinEnter {} :echo "hoge"

オートコマンドで否定のパターンは使えないのかなぁ
*.txt以外のファイルみたいな

857 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/18(木) 20:15:13 ]
au WinEnter * if expand("<afile>")=~? '\.txt$'|echo|endif
amatchとかafileで判定すればいいんじゃない?

858 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/23(火) 22:57:20 ]
>>716に出てた
yukihiro.nakadaira.googlepages.com/#uim-vim
これってvim7じゃ動かないのかなぁ?

Error detected while processing function <SNR>16_input..10..22:
とか
E10: \ should be followed by /, ? or &
Press ENTER or type command to continue
Error detected while processing function <SNR>16_input..10..22:
とかいうエラーがでまくるんだが


859 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/26(金) 19:04:59 ]
>>858
むしろ vim7 でしか動かないです。
E10 エラーは行継続の \ が原因だと思います。
compatible モードで使ってたりするんでしょうか。
行継続を使わないように変更したので新しいやつを試してみてください。

860 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/27(土) 15:19:23 ]
>>859
compatible モードで使ってました
でも新しいやつ試したら日本語入力でキタ━━━━(゚∀゚)━━━━!!!!!!
ありがとうございます

でも今度は日本語入力モードでバックスペースすると
??b
が入力される・・・
文字コードUTF-8にしたら平気だった
EUC-JPじゃ無理ですか?

861 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/27(土) 17:22:24 ]
>>860
修正したので新しいの使ってみてください。

862 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/01/27(土) 18:57:02 ]
>>861
できるようになりました
ありがとうございます!
これでnvi+canna捨てられるかも

863 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/04(日) 23:57:23 ]
C言語のファイルを開いたときに適切なインデント設定をするスクリプト
単純だけどけっこう楽になった
いろんな言語を認識できるようにしたら便利だろうなぁ
だれかやってくんないかなぁ…

autocmd FileType c,cpp call s:SetIndent()
function! s:SetIndent()
  let pos = getpos('.')
  if search('{$') != 0 && search('^\s\+\S', 'W') != 0
    let &l:shiftwidth = indent(line('.'))
    let &l:softtabstop = indent(line('.'))
    let &l:expandtab = (search('^\t') == 0)
  endif
  call setpos('.', pos)
endfunction

864 名前:名無しさん@お腹いっぱい。 [2007/03/28(水) 21:41:19 ]
    getchar()の使い方が良く分からない。
    下記のスクリプトでは、
        Aで、"私の名前は"を表示する
        Bで、入力する
        Cで、入力した内容を表示して、その後に"です。"を表示する
    の様な処理をしたいのですが、実際は下記の様になります。
        1. Bで入力をするまで、何も変化は発生しない。
        2. Bで入力をすると一気にAとCを表示する。

    どこが、まずいのでしょうか?そもそもが、出来ない事をやろうとし
    ているのだろうか?
        
        @function! s:Map(...)
        A  execute "normal i私の名前は\<esc>"
        B  let s:name=getchar()
        C  execute "normal a" . s:name . "です。\<esc>"
        Dendfunction


865 名前:名無しさん@お腹いっぱい。 [2007/04/20(金) 19:23:18 ]
libcallで呼び出されたCの関数のなかでvimの組み込み関数を呼ぶ仕組みは用意されてますか?

高速に補完用のリストを作るためにcall complete_add相当をCの関数の中から呼びたいです
libcallの戻り値をcomplete_addに渡すと長い文字列のコピーが行われてしまうかもしれないのでCの関数から直接complete_addを呼びたいです



866 名前:名無しさん@お腹いっぱい。 [2007/04/20(金) 19:25:58 ]
沖縄県の方へ(命に関わる注意事項です)

沖縄県での選挙ですが、どうか民主党だけは避けてください。県民の生命に関わる可能性があります。
民主党の最大の公約は一国二制度(※)ですが、一度「一国二制度 沖縄 三千万」で検索をお願いします。
この際、民主党のHPで調べても良いです。以下の注釈↓と矛盾することは書いてないはずですから…

※一国二制度
 簡単に言えば沖縄を中国と日本の共有物にし、そこに3000万人の中国人を入植させます。
 (つまり沖縄人口の 96% を中国人にして、実質、沖縄を中国人の居住地とします。)
 さらに「自主」の名の下、沖縄で有事が起きても自衛隊は干渉できません。
 3000万人の中国人が、少数派となった130万人の日本人に何をしても、です。
 そして反日教育を受けた中国人の反日感情の強さは、ほとんどの日本人の理解を超えるものです。

今回の選挙で民主党が勝った場合、「自主」「発展」を連呼しつつ段階的に進めていくことになります。
自主と言っても、自主を認めるのが「住人の96%が中国人となった」後だということに気をつけてください。
発展と言っても、新沖縄の少数派となった「少数民族日本人」の発展ではないことに気をつけてください。

867 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/04/21(土) 10:20:51 ]
>>865
pythonの拡張を作ってその中からでvim.eval()を呼ぶみたいな方法しかないとおもう
はやいかどうかはしらん

868 名前:初心者 [2007/05/02(水) 13:44:56 ]
GVim7で関数のリファレンスの使い方が良く分かりません。下記で次
の現象となります。どこが悪いのでしょうか?

最初にリストを送ります。

 01 if exists("loaded_ShuffleB")
 02     finish
 03 endif
 04 let loaded_ShuffleB=1
 05 command! -nargs=? ShuffleB :call <sid>Map(<q-args>)
 06 function! s:Map(...)
 07     let b:pgname = ["<SID>This1","<SID>This2","<SID>This3"]
 08     let b:Prg=function(b:pgname[1])
 09     imap <buffer> <silent> o O<c-o>:call b:Prg("O")<cr>
 10 endfunction
 11 
 12 function! s:This1(current)
 13     exec "normal o" . a:current . "最初はグー"
 14 endfunction
 15 
 16 function! s:This2(current)
 17     exec "normal o" . a:current . "最初はチョキ"
 18 endfunction
 19 
 20 function! s:This3(current)
 21     exec "normal o" . a:current . "最初はパー"
 22 endfunction


869 名前:初心者 [2007/05/02(水) 13:47:18 ]
先のリストで、下記のエラーが出ます。
どこが悪いのでしょうか?

1. pgnameに<SID>を付加した場合(7行目)
  oを入力した時にOを表示して下記のエラーが出る
  E120: スクリプト以外で<SID>が使われました:<SID>This2

2. pgnameの<SID>を外した場合(7行目)
  起動時にE700: 未知の関数です: This2が表示される。
  oを入力した時にOを表示して、下記のエラーが出る
  E117: 未知の関数です: b:Prg



870 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2007/05/03(木) 00:02:52 ]
>>868-869 "<SID>This2"を"s:This2"という風に書き換えてみてください。

871 名前:初心者 [2007/05/03(木) 13:01:04 ]
KoRoNさん、早速ありがどう御座いました。7行目のみ下記の様に変更
しました。
  let b:pgname = ["s:This1","s:This2","s:This3"] 

実行しましたら、今度は下記のエラーが出ます。
  E120:スクリプト以外で<SID>が使われました: s:This2

Windows XP 
KaoriYaからのVim7.0.216 14-mar-2007を使っています。

頭の悪い初心者ですが、1つ宜しくお願いします。
    


872 名前:初心者 [2007/05/03(木) 13:14:31 ]
全体を下記の様に、修正したら今度は動作する。動いた理由と、前回
のが動かなかった理由が、さっぱり分からない。
下記に今回の内容を示します。
  if exists("loaded_ShuffleB")
      finish
  endif
  let loaded_ShuffleB=1
  command! -nargs=? ShuffleB :call <sid>Map(<q-args>)
  function! s:Map(...)
    let b:pgname = ["b:One","b:Two","b:Three"]
    let b:Prg = function(b:pgname[2])
    call b:Prg(10)
    imap <buffer> <silent> o O<c-o>:call b:Prg(31)<cr>
  endfunction
  
  function! b:One(current)
    exec "normal o" . a:current . "最初はグー"
  endfunction
  
  function! b:Two(current)
    exec "normal o" . a:current . "最初はチョキ"
  endfunction
  
  function! b:Three(current)
    exec "normal o" . a:current . "最初はパー"
  endfunction


873 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2007/05/03(木) 15:49:43 ]
>>872
function! s:MyFunc()
  return 321
endfunction

let Fn = function('s:MyFunc')
echo Fn()

こういうスクリプトをtest.vimとして保存して、so test.vimをすると動きます。と
いうことは、もしかしてfunction('s:...')の、s:の評価は実行時のコンテキストに
依存するのかもしれませんね。

874 名前:初心者 [2007/05/03(木) 16:36:43 ]
     KoRoNさん、返事有り難う。しかし、最初から実行時のコンテキス
    トと言われても、範囲が広すぎて途方に暮れる。この場合のコンテキ
    ストは、何でしょうか?

    エラーメッセージでは、スクリプト以外で<SID>が使われましたです
    が、他のスクリプトでは使っていません。実行時に何が影響するのだ
    ろうか?初心者は挫折しそうだ。


875 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2007/05/03(木) 18:02:35 ]
>>874
挫折して済む話ならば、挫折しちゃったほうが良いかも知れませんよ。

まずb:の時に動くのは、それがバッファに対して定義された関数だからです。
ShuffleBを実行したのがそのスクリプトを読み込んだのと同じバッファであれば、特
定可能で呼出せることになります。逆にいうとスクリプトを読み込んだ後で、別の
ファイルを開いてそちらにカーソルがある状態でShuffleBを実行すると、そのファイ
ル用のバッファには関数が定義されていませんから動かないでしょう。

s:についてはちょっと実験してからもう一度書きます。



876 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2007/05/03(木) 18:09:07 ]
>>874
っていうか、このスクリプトはどういう目的で何をしようとしているのですか?
なんかいろいろ間違ってる気がしてきました。

877 名前:KoRoN@Vim%Chalice ◆8XALICEsdk mailto:sage [2007/05/03(木) 19:22:50 ]
>>874-875
実験してみました。結論からいうと>>870は誤りで、>>873で示唆したように、s:や
<SID>の評価が参照解決の実行時のコンテキストに依存している、ということになり
ます。まずはこのスクリプトをみてください。

function! s:MyFunc()
  echo "MyFunc is executed"
endfunction
let g:FnRef = function('<SID>MyFunc')

function! s:KickMyFunc()
  call g:FnRef()
endfunction

command! -nargs=0 KickMyFunc :call <sid>KickMyFunc()

このスクリプトを実行するとグローバル変数g:FnRefにs:MyFuncへの関数リファレン
スが格納されます。コマンドKickMyFuncを実行した際には関数s:KickMyFuncを経由し
てg:FnRefが呼出され、正しくs:MyFuncを呼出すことができます。一方、コマンドラ
インで:call g:FnRef()と直接呼出した場合にはE120が発生します。これはつまり、
関数の参照解決はfunction()ではなく実際の関数の呼出し時に行われるので、<SID>
を含むFuncRefは同じスクリプト内からでなければ使えない、ということです。

>>868の例で言えば、imapで実行されるb:Prgは、Vimにとってスクリプト内の出来事
ではありませんから<SID>を含む参照が解決できていないのでしょう。なおmapであれ
ば:help :map-scriptにあるとおり<script>を使うことで解決できそうです。でもス
クリプトローカルな関数のFuncRefを別のスクリプトに渡して実行させる、というこ
とはちょっとできそうにないですね。

878 名前:初心者 [2007/05/08(火) 20:32:57 ]
     休暇で岩登りの為、両手両足が使えず。返事が遅くなりました。懇
    切丁寧な回答有り難う。良く分かりました。頑張ってみます。


879 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/21(月) 19:21:33 ]
日本語全角モードになってたとき
ESC押せば、全角モードも同時に消えるようにするには、
どうしたらいいのだろうか

880 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/05/21(月) 20:30:27 ]
>>879
gvimならこれでいけるけど、コンソールのvimだとむりぽ?

香り屋氏のgvimrcより抜粋

" 日本語入力に関する設定:
"
if has('multi_byte_ime') || has('xim')
  " IME ON時のカーソルの色を設定(設定例:紫)
  highlight CursorIM guibg=Purple guifg=NONE
  " 挿入モード・検索モードでのデフォルトのIME状態設定
  set iminsert=0 imsearch=0
  if has('xim') && has('GUI_GTK')
    " XIMの入力開始キーを設定:
    " 下記の s-space はShift+Spaceの意味でkinput2+canna用設定
    "set imactivatekey=s-space
  endif
  " 挿入モードでのIME状態を記憶させない場合、次行のコメントを解除
  "inoremap <silent> <ESC> <ESC>:set iminsert=0<CR>
endif


881 名前:名無しさん@お腹いっぱい。 [2007/06/04(月) 08:58:22 ]
Hacking Vim: A Cookbook to get the Most out of the Latest Vim Editor (Paperback)
by Kim Schulz (Author)
www.amazon.com/Hacking-Vim-Cookbook-Latest-Editor/dp/1847190936/ref=sr_1_1/104-7688553-6715938?ie=UTF8&s=books&qid=1180914185&sr=8-1

題名のとおり、Vimスクリプトによる拡張やカスタマイズ、その他のディープな機能に的を絞った本らしい。

882 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/04(月) 17:00:40 ]
vimのscriptの勉強をしてます。
:lsした時に取れる、各bufferのstatusってどうやったらvimのscript上から取れるのでしょうか?
例えばイジってあるbufferである+のstatusとか。
一応次ぎのようなscriptで、一覧を取得出来る所までは出来ました。

続く

883 名前:882 mailto:sage [2007/06/04(月) 17:02:26 ]
続き
command! -nargs=? EnumBufs :call <SID>EnumBufs(<f-args>)
function! s:EnumBufs(...)
let arg = "^.*$"
if a:0 == 1
let arg = a:1
endif
let buf_idx = bufnr("$")
let bufnames = []
while buf_idx > 0
try
if ! bufexists(buf_idx) || ! buflisted(buf_idx)
continue
endif
let bufname = bufname(buf_idx)
let bufnum = bufnr(buf_idx)
if bufname =~ arg
call add(bufnames, [ bufnum, bufname ])
endif
finally
let buf_idx -= 1
endtry
endwhile
echo s:list2str(bufnames)
endfunction
続く


884 名前:882 mailto:sage [2007/06/04(月) 17:03:21 ]
続き
function! s:list2str(list)

let output = ""

for buf in a:list
let output .= buf[0] . ":" . buf[1] . "\r\n"
endfor

return output

endfunction
以上


885 名前:882 mailto:sage [2007/06/04(月) 17:06:12 ]
あー、indentが崩れてる。ごめんなさい。。。



886 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/04(月) 23:51:12 ]
>>882
+ &modified
= &modifiable
bufloaded()
&buflisted
h bufwinnr()

statのような便利なものはないのでヘルプを見ながらがんばりんさい。
バッファエクスプローラプラグインはたくさんあるから参考にするといいかも。

887 名前:882 mailto:sage [2007/06/05(火) 23:43:00 ]
出来ました。thx。
ずっと関数だと思って、optionは探していなかったよ。

888 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/06(水) 14:46:24 ]
>>881
amazon.co.jpだと
通常3~5週間以内に発送します
なんだが、もっと早く手に入るところってないかな?

889 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/06(水) 17:58:43 ]
>>881
ebookで買ってみた。
内容は、ディープとまでは感じなかった。Vimスクリプトバリバリ書いてる人は必要なし。
ヘルプにも書いてあるような解説+こう使うと便利になるよというサンプル少々。
>>803のCompleteMailやvim wikiのAutoSaveSessionに似たスクリプトも書いてあった。
やはりこれを買うよりヘルプ、vim wiki、vim onlineのTipsを熟読した方がいいと思う。


890 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/14(木) 12:50:55 ]
質問です.

「文章中にある文字列をもとに 辞書を引く」…というような
スクリプトを書こうとしています.

「カーソル位置の単語を拾い出す」のは expand("<cword>")
で…簡単に作ることができたのですが

でも 調べたい(拾いたい)文字列が 丁度 単語単位とは限らないので
「自分で範囲選択した箇所を スクリプトに渡せるようにしたい」と
考えています.

(小文字の)v キー&範囲選択直後に,
その「選択中の文字列」を 取り出すには どうしたらよいのでしょうか?

<cword> 同様に, 範囲の中身が取り出せるキーワードが
あるような気がするのですが…なかなか探せない....

あるいは 選択範囲の 開始&終了の文字位置 が分かれば
それを手がかりに 取り出せると思うのですが
これもわからない... (どちらも「行単位」なら楽勝なのですが)

…というわけで
何か分かるかた 以上よろしくお願いします.


891 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/14(木) 21:21:08 ]
いったんレジスタにヤンクするのが定石だと思う。

function! Select()
let a_save = @a
normal! gv"ay
let selected=@a
let @a=a_save
return selected
endfunction

function! Dict(word)
echo "「". a:word . "」の意味はわかりません"
endfunction

vnoremap \d <Esc>:call Dict(Select())<CR>


892 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/14(木) 21:34:49 ]

expand('<selected>') みたいなものがあればいいのにな
と思う。

893 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/14(木) 22:43:06 ]
>>891
normal! gv"ay
だけで もう満足です(笑)なるほど
gv って コマンドも 今,知りました
以上 ありがとうございました.


894 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/06/29(金) 16:49:21 ]
>>795
いまさらなんだけど
このヒアドキュメントで関数名と関数定義をとりだして、
関数名をごにょごにょして、スクリプト内の関数にevalさせれば、
外部から動的に関数できる

function! pluginHoge#eval(source_func_name,new_define_name)
 let savelist=&list
 setlocal nolist
 redir => str
 exec "silent function " a:source_func_name
 redir END
 let &list=savelist

 let lines = split(str, '\n')
 let lines[0]=substitute(lines[0],'function[^(]\+',"function! ".a:new_func_name,'')
 let lines = map(lines, 'v:val[3:]')
 let str = join(lines, "\n")

 exec str
endfunction

895 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/07/18(水) 03:28:53 ]
VimのrangeとPythonのrangeって違うのね。
Vim:
range(2, 3) => [2, 3]
range(2, 2) => [2]
range(2, 1) => []
range(2, 0) => エラー

Python:
range(2, 3) => [2]
range(2, 2) => []
range(2, 1) => []
range(2, 0) => []



896 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 00:45:26 ]
関数名はけっこうアバウト

fun! <SNR>99_func()
endfun
fun! <SNR>func()
endfun
fun! hoge:func()
endfun
fun! hoge::func()
endfun
fun! foo:bar:func()
endfun

897 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/07/29(日) 23:48:10 0]
>>896 解説キボン






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<368KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef