while ("im the true Vim master");

2009-09-09

Re: 特定のファイル種別の時だけキーマップを無効化する方法 - かせいさんとこ

13:42

mapの後に<buffer>とつけるとそのキーマップはバッファローカルとなり、他のバッファでは適用されない

なので、.vimrcと、vim.vim それぞれに<buffer>をつける

.vimrc側にもつけるのは、<buffer> unmap はバッファローカルで指定されたマップしか解除できないため

特定のファイル種別の時だけキーマップを無効化する方法 - かせいさんとこ

アウト。<buffer>はそれを実行したときのカレントバッファにしか影響がない。

例示されているものでは、vimrcで定義しているものはグローバルに有効にしたいものだから、<buffer>を付けるとVim起動時に最初に表示されるバッファのみでしか定義されず他のバッファで使えなくなる。だからそこで<buffer>を使ってはならない。

ftplugin/vim.vimではグローバルな定義を無効化したいのだから、下記のようにして<buffer>を付けてバッファローカルなものを定義してグローバルな定義を上書きする。

inoremap <buffer> "  "

kasei_sankasei_san2009/09/10 11:32ご指摘感謝です!!
確かに、後から開いた別のタイプのファイルの挙動がおかしくなっていました
他にも色々いじっている最中だったので、別のものが原因だと思ってましたが…

トラックバック - http://vim.g.hatena.ne.jp/ka-nacht/20090909

2009-08-29

Re: オプションをトグルする関数 - bugfix

08:28

スマートな解の方は既に発見されていたので、最初に書かれたスクリプトの駄目なところの解説。

 1  " 関数の概要
 2  " void Toggle_option(String)
 3  " Stringで与えられたbooleanオプションをトグルする。
 4  " 使い方:
 5  " Toggle_option('number')
 6  " Toggle_option('nonumber')
 7  function! Toggle_option(target_opt)
 8    " 次の場合エラーになる可能性がある
 9    " 1. a:target_optが'no'から始まるが、その後に続く文字列が
10    "    Vimのオプションに存在するものでない場合
11    "    a:target_optの例) noabcdefg
12    " 2. a:target_optが'no'から始まらず、文字列全体が
13    "    Vimのオプションに存在するものでない場合
14    "    a:target_optの例) abcdefg
15    if (a:target_opt =~# "no.*")
16      let s:target_inv_opt = a:target_opt[2:]
17      let s:opt_added_amp = '&' . eval('s:target_inv_opt')
18    else
19      let s:target_inv_opt = 'no' . a:target_opt
20      let s:opt_added_amp = '&' . eval('a:target_opt')
21    endif
22  
23    if eval(s:opt_added_amp)
24      execute 'setlocal' s:target_inv_opt
25    else
26      execute 'setlocal' a:target_opt
27    endif
28    unlet s:target_inv_opt
29    unlet s:opt_added_amp
30  endfunction
オプションをトグルする関数 - bugfix

(行番号は説明のためこちらで追加しました)

  • 関数内は関数内ローカル変数(l:)が使えるから、このケースでスクリプトローカル変数(s:)を使う必要はない。
    • l:は基本的に不要。
  • 15行目の条件式a:target_opt =~# "no.*" 'ignorecase'などにもマッチする。正しくはa:target_opt =~# '^no'
  • 17行目/20行目/23行目のeval()は不要。もしこれが必要だというのであれば変数の値を参照している箇所全て(例えば16行目や19行目)でeval()を使わないとおかしい。
    • eval()を実際に使う場合はeval('variable')ではなくeval(variable)としないと意味がない。
  • 最近発覚した、10年以上もの間Vimに潜んでいたバグに対処できていない。実はviとの互換性のために用意された'novice'というオプションがありまして、これはnoで始まるので……

Re: modelineが読み込まれるタイミング - bugfix

08:10

:set ≒ :setglobal + :setlocalだから、vimrcリロードしてset tabstopが実行されたらカレントバッファの'tabstop'はmodelineで設定したものからvimrcで記述されているものに上書きされます。

だから厳密にはvimrcでローカルな値を持つオプションの初期値を設定するときは、初回ロード時は:setで2回目以降は:setlocalにするなどの工夫を、本当はしないと駄目。私は直そう直そうと思いつつちゃんと直し始めると大変なので放置してますけど。

トラックバック - http://vim.g.hatena.ne.jp/ka-nacht/20090829

2009-08-28

Re: タブとかスペースとかのオプション - htomine’s comics bookshelf

19:19

とりあえず、バイト先ではタブはスペースで2個なので、

タブとかスペースとかのオプション - htomine's diary

意図するところが「インデント幅がスペース2個分」なのか「タブ文字の表示幅が2個分」で答えが変わります。

後者なら'tabstop'も設定しなければなりませんが、前者なら'softtabstop'/'shiftwidth'で対処すべきです。'tabstop'を変更しなければならない理由はそうそうありません。

set expandtab
set softtabstop=2
set shiftwidth=2
shiftwidth
vimが自動で挿入するインデントの値。cindent,autoindentなど
タブとかスペースとかのオプション - htomine's diary

>><<などのシフトでも用いられます。

htominehtomine2009/08/30 02:20トラバありがとうございます!
タブ文字を入れたいわけではなかったので、前者が正しいですね。
不勉強でお恥ずかしいです、精進します!

トラックバック - http://vim.g.hatena.ne.jp/ka-nacht/20090828
最近のコメント
あわせて読みたいブログパーツ
AX