1 名前:名無しさん@お腹いっぱい。 [01/12/17 12:15] みんなでスクリプトを覚えよう
912 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/31(水) 17:21:56 ] すいません。 現在のカーソル位置が行末がどうかを調べるにはどうすればいいでしょうか?
913 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/31(水) 17:30:54 ] getpos(".") の現在位置のうちの列と len(getline(".")) が同じとかどうよ
914 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/31(水) 17:54:30 ] if getpos(".")[2]==strlen(getline(".")) | echo "at the end" | endif 行末の2バイト文字上に、カーソルがあるとダメだった。 # ver7 のヘルプ全然読んでいないから getpos() の戻り値に驚き。w なんかスゲー面倒。 command! IsEnd call <sid>IsEnd() function! s:IsEnd() let ls=getline(".") if ls==# '' echo '行末' else "カーソル位置から、行末まで全部。 let str=matchstr(ls, '.\+', col('.')-1) "カーソル位置の1文字 let chr=matchstr(ls, '.', col('.')-1) if str ==# chr echo '行末' else echo '行末じゃない' endif endif endfunction
915 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/10/31(水) 18:10:13 ] " >>912 " これでどうだろう? function! IsTheCursorAtTheEndOfLine() return search('\%#.$', 'cn') endfunction
916 名前:912 mailto:sage [2007/10/31(水) 19:55:59 ] おお!皆さんありがとうございます。 自分で作ったスクリプトが挙動不審だったので皆さんのヤツで試してみます。 更に質問なんですが、現在開いているバッファの数ってどうやって取得するんでしょうか? 何も開いてないかどうかを知れたらそれでいいのですが。 よろしくお願いします。
917 名前:914 mailto:sage [2007/10/31(水) 22:47:10 ] >>915 それすごいな。 search() のオプションとか知らなかった。
918 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/01(木) 10:29:15 ] もしかするとこんな感じでやるしかないかな? function! BufCount() let cnt = 0 let lastbufnr = bufnr("$") let i = 1 while i <= lastbufnr " :lsで表示されるものだけカウントする if bufexists(i) && buflisted(i) let cnt += 1 endif let i += 1 endwhile return cnt endfunction
919 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/01(木) 10:33:32 ] 空バッファをカウントしたくないなら条件に↓を追加 && bufname("%") != ""
920 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/01(木) 12:28:00 ] バッファのカウントなら tabpagebuflist() 使うといいかもしれない
921 名前:912 mailto:sage [2007/11/01(木) 12:58:22 ] みなさんありがとうございます。 とりあえずコピペで動いてくれています。 tabpagebuflist()という名前にまた錯乱ぎみなんですが、 VIMはタブとバッファは完全に別物で、 データとビューの関係なんですよね? あとヘルプによく出てくるウィンドウ(変数でいう「w」)ってのはサーバーの事なんでしょうか? グローバル(g)との違いが分かりません。
922 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/01(木) 13:21:41 ] >VIMはタブとバッファは完全に別物で、 >データとビューの関係なんですよね? そう。ウィンドウは:spなどで分割できるやつのこと。 let w:hoge = 1 とかすると、hogeはそのときのカレントウィンドウでのみ参照可能になる。 :h w: で出てくる。日本語版ヘルプもあるからその辺読むといいよ。 yukihiro.nakadaira.googlepages.com/#vimdoc :h 41.2 のユーザーマニュアルの方がわかりやすいかな。
923 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/01(木) 13:30:45 ] こんなんでもよくね len(filter(range(1,bufnr('$')),"buflisted(v:val) && bufexists(v:val)"))
924 名前:912 mailto:sage [2007/11/01(木) 13:42:57 ] >>922 ははー、ウインドウはTABや分割された領域単位って事ですね。 って事はグローバル(g)がサーバー(exe)単位ですね。 >>923 ・・・ちょっとマニュアルとにらめっこしてきますw
925 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/01(木) 14:15:56 ] range(1,8) => [1,2,3,4,5,6,7,8] みたいな配列つくって それをfilter()でいるものだけ取り出したんだよ buflited()とbufexists()は真なら1を返すのでandした 例 filter([1,2,3],1) => [1,2,3] filter([1,2,3],0) => [] filter([1,2,3,4,5,6],"(v:val % 2) == 0") => [2,4,6] filter([1,2,3,4,5,6],"(v:val % 2)") => [1,3,5]
926 名前:912 mailto:sage [2007/11/01(木) 14:50:07 ] なるほど!perlの正規表現でいえば、「e」ですな。 それを全要素に対して処理をしてくれると。 こうやって勉強してみるとVIMスクリプトはしょぼいしょぼい言われているけど、 ネットワーク関連の組込み関数がない(?)ぐらいで、それほどひどかないですよね。
927 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/24(土) 12:25:16 ] :echo ++++++++++++++++++++++++++++++++++++++++++++++++++++++++3
928 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/24(土) 13:04:27 ] 機能という点では何とでもなるけど exコマンドが元になってるからスクリプト言語としては 根本的に文法が腐ってると思います まあよしあしですけども
929 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/25(日) 00:24:37 ] 文法なんてこんなもんじゃないかな いわゆる一つの言語的機能と普通のコマンドが混在してるから慣れが必要だけど
930 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/26(月) 09:15:26 ] 文法はなれれば我慢できるが、exコマンドが元になってるから機能的に腐ってる。 関数によって特殊文字にエスケープが必要だったりそうじゃなかったり。 bunname()とかわけわからん。 オプションの退避とかカーソル、レジスタの復元とか書かせるのも勘弁。
931 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/26(月) 19:50:36 ] > 関数によって特殊文字にエスケープが必要だったりそうじゃなかったり。 そんな関数あったっけ
932 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/27(火) 13:07:14 ] bufname() file-patternが展開される。代替ファイルは"#"または0 bufnr() bufname()と同じ。でも"$"で最後のバッファ。 bufexists() 展開されない。代替ファイルはbufexists(0) vimはCの関数がすでにコマンドべったりで書かれてるからなあ。
933 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/28(水) 01:08:53 ] なるほど。 他にはなんかある?
934 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/28(水) 10:12:55 ] winheight(0) => 現在のウィンドウの高さ winnr(0) => エラー winnr("%") => エラー winnr() => 現在のウィンドウの番号 winnr("#") => 最後にアクセスしたウィンドウの番号 winnr("$") => 最後のウィンドウの番号 とか。カレントを表すのも関数によって"%"や"."だったりするけど、 一応バッファが"%"で行が"."になってるのかな。 エスケープについては、関数だけじゃできなくて、文字列を組み立てて :exe するときがけっこう嫌らしい。
935 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/28(水) 17:17:04 ] じらさないで全部教えてくれよ(;´Д`)ハァハァ
936 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/28(水) 17:27:46 ] >>935 :h
937 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/28(水) 18:01:02 ] :echo +-+-3 :echo 1++-+-3
938 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/29(木) 16:23:03 ] そういや一時期Ctrl+@にESCあててたな 日本語ノートね 無変換、前候補、かたかな・ひらがな、でもホームに近い余ってるキー いくらでもあるからな そういやスペースの両隣のキーにshiftあてるのがエルゴノミクスとか周りではやった
939 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/11/29(木) 17:32:40 ] 本スレと勘違いしたか
940 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/12/03(月) 00:28:47 ] バッファの変更と、その内容をフックしたいのですが、できますかね?
941 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/12/03(月) 02:18:39 ] インサートモードで入力したテキストだけならこんな感じでできそうだけど。 augroup meso au! au InsertEnter * call InsertEnterCB() au InsertLeave * call InsertLeaveCB() augroup END function! InsertEnterCB() let g:modified_save = &modified set nomodified endfunction function! InsertLeaveCB() if &modified echomsg "inserted text='". @. ."'" endif let &modified = g:modified_save endfunction
942 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/12/03(月) 03:03:25 ] >>940 無理。 FilterReadPreとかで限定的なものはできそうだけど。 >>941 <C-c>されるとInsertLeaveは発行されないよ。
943 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/12/03(月) 19:17:27 ] >>940 help {event} で見合うものを探すのだ
944 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/12/20(木) 05:10:46 ] 関数名の最初の文字はアンダースコアでも通るみたい。 function! _havesex() echo "not implemented" endfunction
945 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/12/24(月) 20:33:06 ] >>944 have sex. not implemented w
946 名前:名無しさん@お腹いっぱい。 [2008/01/09(水) 12:26:12 ] vimのなかでgccでコンパイルするにはどうしたらいいですか? perlのやり方は調べたら分かったのですが、cについてはgoogle検索でざざーっと 数十件くらいそれっぽいものを見てみても見つかりませんでした。 お願いします。
947 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/01/09(水) 13:03:15 ] :set makeprg=gcc\ % :make
948 名前:名無しさん@お腹いっぱい。 [2008/01/09(水) 15:08:18 ] >>947 ありがとうございます。希望どおりの動作になりました。
949 名前:名無しさん@お腹いっぱい。 [2008/01/09(水) 22:39:22 ] :compiler gcc するとerrorformatを設定してくれるよ
950 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/01/20(日) 14:57:42 ] このスレ7年目にしてようやく次スレが見えてきたのかよワロタ
951 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/01/23(水) 00:18:49 ] おお、ほんとだ。ようやくだな。 次スレではvim8に突入しちゃうかもな
952 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/01/23(水) 14:33:17 ] スレタイは vim7スクリプトお勉強スレ なのか、汎用的に vimスクリプトお勉強スレpart2 なのか
953 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/01/23(水) 15:32:03 ] >>952 バージョン入れる必要性はないから後者の方が良いね。 むしろ本スレに統合しても問題ない気もする。分離する必要性ってある?
954 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/01/23(水) 16:46:31 ] >>953 あんまりないな 最初は珍しかったから「お勉強」ということだったんだろう スレの最初の方のレスの流れをみてもそうだけど
955 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/02/17(日) 14:46:07 ] >>951-953 次スレを vim7スクリプトお勉強スレ にしても 次々スレが vim8スクリプトお勉強スレ になって(ry
956 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/02/20(水) 23:37:56 ] Vim Part15 pc11.2ch.net/test/read.cgi/unix/1202050038/ 953の言ってるとおり↑でいいべ
957 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/02/22(金) 18:56:26 ] >>955 そいつはめでてーなぁ
958 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/07(金) 01:02:27 ] Windowsのvim7のinputlist()っていう選択肢の中から選ばせる関数使うと、 *********(<Enter> でキャンセル) ってメッセージが表示されるんだけど、 Enter押すと、最初の項目が選択されたことになってる。(0が返ってくる) これって仕様ということでいいのかな?
959 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/07(金) 01:54:06 ] サンプルコードを見ると、最初の要素はプロンプト的な使い方をするぽい
960 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/08(土) 21:03:02 ] ほー、なるほど
961 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/09(日) 02:42:55 ] vim6を使っているけどrenamer.vimがうらやましかったので 6でも動くようにパッチしてみた。 よかったらどうぞ ttp://sakuratan.ddo.jp/uploader/source/date73498.gz
962 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 18:37:36 ] >>911 command! -range=% TemplateEngine <line1>,<line2>substitute/#{\(.\{-}\)}/\=eval(submatch(1))/g コマンドにしておくと便利
963 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/19(土) 18:18:32 ] >>962 で、この TemplateEngine コマンドは 如何に使うとよかですか?
964 名前:名無しさん@お腹いっぱい。 [2008/04/24(木) 23:04:43 ] tcvime.vimの文字ヘルプを使う時は、<Leader>?を入力します。この場 合の<leader>のデフォルトは<C-K>です。この<C-K>?を tcode_cp932.vimのjfjにマップしたいのですが、下記のマップでは動作 しません。何が悪いのでしょうか? jfj<tab>~K? 勿論fjのマップは外しています。宜しく、お願いします。
965 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 23:22:12 ] :h mapleader
966 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 23:50:00 ] >>964 tcvime.vimで<Leader>?にマップされてる文字ヘルプは、 Normal Mode時にカーソル位置にある文字の入力方法を表示する機能ですが、 Insert Mode用keymap(tcode_cp932.vim)のjfjにマップして、 どういう動作を期待してます? Insert Modeでjfjと打ったら直前の文字のヘルプを表示して欲しいのでしょうか?
967 名前:名無しさん@お腹いっぱい。 [2008/04/26(土) 07:38:23 ] >966 失礼しました。もしかしたら、keymapのファイルはInsert Mode用に 定義されているのですか?私は、全てのモードに定義されていると思 っていた物ですから。やりたい事は、ノーマルモードで、jfjを^K?に マップしたい。 例えば、nmap jfj ^Kqは動作するが、若しもの事を考慮してnnoremap jfj ^?と定義すると、何故か動きません。jもfもキーマップは定義 していないのですが。 済みません。宜しくお願いします。
968 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/26(土) 09:04:38 ] keymapは主にInsert mode用です(lnoremapされるものです。mbyte-keymapのヘルプ参照)。 Normal modeで<C-K>?にマップされている機能を別のキーにマップしたい場合は、 nnoremapではなくnmapを使います(nnoremapとnmapのヘルプ参照)。 :nmap jfj <C-K>?
969 名前:名無しさん@お腹いっぱい。 [2008/04/26(土) 10:40:22 ] >968 mbyte-keymapのヘルプを読んだが、今一つnmapとnnoremapとの違いが 分からない。この場合、nnoremapが動かないのは、再定義するキー マップが無いからなのだろうか? 逆に、考えると確実にそのキーマップが存在していないと、nnoremap は動かないと考えるべきなのか。私が、nnoremapにこだわるのは何処 でキーマップを使うか分からないので、誤動作を防ぎたい。それだけ の理由ですが、逆にこれが動かない結果となる。原因が分からな い。 宜しく、お願いします。
970 名前:名無しさん@お腹いっぱい。 [2008/04/26(土) 19:27:08 ] 質問をさせてください。 コマンドの結果を変数に保存する場合、どのような記述をすれば良いのでしょうか。 以下が、やりたい事をvim の疑似言語で表したものです。 ここでは、:put を実行した時に出力される内容を変数に格納したいです let tmp = `put` どうかよろしくお願いします。
971 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/26(土) 22:41:23 ] >>969 <C-K>?はtcvimeによってマップされているキーなのでnmapを使う必要があります。 :nmap jfj <C-K>? としてjfjを打った場合、 以下の例のように<C-K>?はさらに展開されるので、tcvimeの関数が呼び出されます。 jfj → <C-K>? → :<C-U>call <SNR>4_ShowStrokeHelp()<CR> 一方、 :nnoremap jfj <C-K>? としてjfjを打った場合、<C-K>?は展開されないので、 tcvimeの機能は呼び出されません。 jfj → <C-K>?
972 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/27(日) 00:00:11 ] >>970 let tmp = system("put") redir => tmp put redir END 上か下、どちらかでいけるよ。 どちらが使えるかは、put次第
973 名前:名無しさん@お腹いっぱい。 [2008/04/27(日) 10:32:29 ] >971 詳しい説明、有り難う御座います。何となく、mapとremapの違いが分 かった様な気がします。 >965 確かに、mapを指定するのでは無くてmapleaderの設定を変更した方が 早いかも知れません。