while ("im the true Vim master");

2009-10-02

Re: cursoroverdictionary 0.0.5 - 物置き

20:00

外部検索機能の追加

cursoroverdictionary 0.0.5 - 耳

ほんのりwwwsearchと重複した感じが。それはさておき:

operator-user対応

" operator-userへの登録
call cursoroverdictionary#add_operator_user("gt")
" operatorをgtキーにマップ
map gt <Plug>(operator-cod-gt)
cursoroverdictionary 0.0.5 - 耳

提供方法が少々不味いです。

call cursoroverdictionary#add("gt", "http://www.google.com/translate_t?langpair=auto|ja&text={word}", "utf-8", "sjis")

この時点で<Plug>(operator-cod-gt)を定義しておくべきです。わざわざcursoroverdictionary#add_operator_user()を呼ばなければならないのはユーザー側の手間が増えるだけです。例え定義した<Plug>(operator-cod-gt)が使われないとしても無害なのですから。


Re: :help text-objectを見ながら勉強。 - いちごいちえ

10:01

そもそも"i"とか"a"って何の略なんだろうか

:help text-objectを見ながら勉強。 - 40歳からのキャリアチェンジ

その辺りの説明も追加すれば良かったですね。

(いや、書いてはいたけど紙面の都合上で削ったかな……)

ampmmnampmmn2009/10/02 21:23> 定義した<Plug>(operator-cod-gt)が使われないとしても無害
あー、確かにそうですね。気がつきませんでした。
後で修正します。

ampmmnampmmn2009/10/02 22:08ということで修正いたしました。
どうもありがとうございます。

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

2009-09-29

Re: locate/findの結果ファイルをまとめてVimでひらく - ブックマクロ開発に

22:57

その方法でやるならもっと簡単に書けます。

vim -p `grep --files-with-matches {pattern} {file} ...`

私の場合は大抵Vim内から以下のような感じで:argsか:grepで開きます。

args `grep --files-with-matches {pattern} {file} ...`
grep {pattern} {file} ...

Re: インデント - 呆備録

11:28

nnoremap <silent> <leader>e :call <SID>MyIndent()<cr>
function! s:MyIndent()
  let line = getline('.')
  if match(line, '{') == 0
    execute ":normal V%="
  elseif match(line, '{') != -1 
    execute ":normal f{V%="
  elseif match(line, '}') == 0 
    execute ":normal V%="
  elseif match(line, '}') != -1
    execute ":normal f}V%="
  endif
endfunction
インデント - 呆備録

細かいところに目を瞑れば

nnoremap <Leader>e  $=aB

これで十分な気がします。

追記: その方法でやるにしても、もう少し整理できる気が。

nnoremap <silent> <Leader>e  :<C-u>call <SID>MyIndent()<Return>

function! s:MyIndent()
  let line = getline('.')
  if match(line, '{') == 0
    normal! V%=
  elseif match(line, '{') != -1 
    normal! f{V%=
  elseif match(line, '}') == 0 
    normal! V%=
  elseif match(line, '}') != -1
    normal! f}V%=
  endif
endfunction

function! s:MyIndent()
  let line = getline('.')
  if match(line, '{') == 0
  elseif match(line, '{') != -1 
    normal! f{
  elseif match(line, '}') == 0 
  elseif match(line, '}') != -1
    normal! f}
  else
    return
  endif

  normal! =aB
endfunction

function! s:MyIndent()
  let cursor_pos = getpos('.')
  let cursor_line = cursor_pos[1]

  normal! 0
  if (search('^[^{]*{', 'ce', cursor_line) == 0
  \   && search('^[^}]*}', 'ce', cursor_line) == 0)
    call setpos('.', cursor_pos)
    return
  endif

  normal! =aB
endfunction

opparaoppara2009/09/29 12:46追記ありがとうございます。また、<C-u>を忘れてました。
最後のものが私の求めていたものです。。
精進します。

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

2009-09-19

Re: quickfixリストウィンドウを引数付きでトグルする - bugfix

20:27

つまり、3[Tag]qと押し下げたときに

:copen 3が実行されればよいのですが、

どうもうまくいきません。

前置する数字の大きさに関わらず、

最大の高さでウィンドウが開かれているみたいです。

quickfixリストウィンドウを引数付きでトグルする - bugfix

できなくて当然です。そのキーを押したときに実行されるコマンドでは前置した数値(count)がid:pneumasterさんの意図通りに伝搬されてはいないからです。

元のコードは以下の通り:

 1 function! Toggle_open_quickfix(cnt)
 2         if &filetype ==# 'qf'
 3                 command! Qftoggle0 cclose
 4                 execute 'Qftoggle0'
 5         else
 6                 command! -nargs=0 -count=10 Qftoggle0 copen <count>
 7                 execute 'Qftoggle0' . a:cnt
 8         endif
 9 endfunction
10 command! -nargs=0 -count=10 Qftoggle call Toggle_open_quickfix(<count>)
11 noremap <silent>        [Tag]q   :Qftoggle<CR>
quickfixリストウィンドウを引数付きでトグルする - bugfix

この中には色々と問題点はあるのですが、ひとつづつ解説していきましょう。


何故「count指定しても指定したcount付きでコマンドが実行されない」か

理由は3[Tag]qが入力されたときにVimがこれをどう展開し解釈するのかを考えればすぐに分かります。

まず3[Tag]qが入力されたとき、11行目の定義により[Tag]q:Qftoggle<CR>に展開されます。:noremapによる定義で展開されたのでこれ以上展開されることはないので3:Qftoggle<CR>が実行されることになります。

この時点で間違いは明白です。実行しているのは3:Qftoggle<CR>であって:3Qftoggle<CR>ではないからです。[Tag]qにはcount指定がされていましたが、本当に実行したいコマンドQftoggleにはそのcountが正しく渡されていないからです。


何故count指定と無関係に「最大の高さでウィンドウが開かれる」か

上述の通り、3[Tag]qの押下時に実行されるキーシーケンスは3:Qftoggle<CR>でした。ではこれで何故「最大の高さでウィンドウが開かれる」のでしょうか。これは3:Qftoggle<CR>を直接入力してみれば分かります。3:Qftoggle<CR>が入力されると、Vimは以下のように展開・実行を行なうからです。

:.,+2Qftoggle<CR>

実はcount指定をして:を入力すると:.,+{count - 1}に展開されます。countがNだとすると「カーソル行を含む以下N行」を表す範囲指定になります(:help N:)。

このようなケースでは範囲指定の最後の行番号がcountに指定されたものとしてコマンドが実行されます。例えばカーソルが337行目にあるとすると、:.,+2Qftoggle:340Qftoggleと同じことになります。ですから「最大の高さでウィンドウが開かれる」のです。正確にはカーソル位置によって結果が変動しうるので「最大の高さでウィンドウが開かれる」という判断は間違いです。


どう修正するか

コマンド:Qftoggle自体は問題ありません。問題なのは11行目のkey mappingの定義です。これを以下のように修正すれば動作します。

nnoremap <silent> [Tag]q  :<C-u>execute (v:count ? v:count : '') . 'Qftoggle'<CR>

ポイントは以下の通り:

  • 実行したいコマンドは:{count}Qftoggleですが、{count}は不定なので直接記述はできません。なので実行したいコマンドの文字列を作成して:executeで実行します。
  • このkey mappingの右辺が実行されているときに、左辺を入力したときに指定したcountの値はv:countで参照できます。無指定の場合は0なので、その場合は:Qftoggleのデフォルト値が使われるよう、v:count ? v:count : ''として:Qftoggleに対するcount指定を生成します。
  • 単に:executeとすると上述した問題と同じことが発生します。:executeの実行時にcount指定の影響を除去するために:<C-u>executeとします。<C-u>はCommand-line modeでカーソル位置から行頭までの文字列を削除するコマンドです。
  • ここで定義するkey mappingが実行するコマンドはNormal modeでしか実行しないものですから、:nnoremapを使います。元のコードでは:noremapが使われていましたが、これはNormal modeだけでなくVisual modeとOperator-pending modeでも定義されるので、意図しないところで影響が出る可能性があります(この辺りはWEB+DB PRESS Vol.52のVim特集でも触れましたよ[宣伝])。

さらに改善する

:Qftoggleの本体はToggle_open_quickfix()で定義されていますが、ごちゃごちゃしています。整理しましょう。

function! Toggle_open_quickfix(count)
  if &l:buftype ==# 'quickfix'
    cclose
  else
    execute 'copen' a:count
  endif
endfunction
  • :command/:executeの用法が間違っています。ややこしくしているだけなので除去しましょう。
  • あるバッファがquickfix windowかどうかの判定は'filetype'よりも'buftype'を使った方が確実です。

そもそも元々の動機からすると:Qftoggleも不要そうです。となると以下のように整理できます。

nnoremap <silent> [Tag]q  :<C-u>call Toggle_open_quickfix(v:count ? v:count : '')

ただToggle_open_quickfix()のcountの値の解釈を呼び出し側でしているのは不自然なので、さらに整理すると以下のようになります:

function! Toggle_open_quickfix(count)
  if &l:buftype ==# 'quickfix'
    cclose
  else
    execute 'copen' (a:count ? a:count : '')
  endif
endfunction

nnoremap <silent> [Tag]q  :<C-u>call Toggle_open_quickfix(v:count)
トラックバック - http://vim.g.hatena.ne.jp/ka-nacht/20090919

2009-09-14

Re: :TOhtml - VimのスクリーンイメージをHTMLに変換 - bugfix

17:32

まさか手打ちで行番号を追加したのかな、と思ったけれど

それは面倒だと思ったり。

# はてなのスーパーpre記法を有効にしつつ、

# 行番号も色が変わっている配色だし・・・

:TOhtml - VimのスクリーンイメージをHTMLに変換 - bugfix

答えは次の通り:

  • 件のソースコードはスーパーpre記法で記述しています。
  • 行番号は:%!cat -nで追加して適当に整形しました。

では何故行番号がハイライトされているかというと:

  • Vim scriptはEx commandの羅列です。
  • Ex commandは(基本的に)範囲指定(:help [range])ができます。
  • Vimで*.vimなファイルを編集している場合は[range]もハイライトされます。
  • はてなのスーパーpre記法のシンタックスハイライトは裏でVimが使われています。

白状すると、私もハイライト結果を見てびっくりでした。

pneumasterpneumaster2009/09/14 18:14レスありがとうございます。
filetypeがvimだからこそできることですね。納得しました。

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

2009-09-11

Re: フォールディングの階層をみやすくする - electroholic

15:57

そこで,折り畳みのコメントにツリー構造を表すときに使う記号をいれて階層構造に視認性を良くして見ました.

フォールディングの階層をみやすくする - electroholic

:help 'foldcolumn'

http://gyazo.com/0e7f3aae11b6dca37ed4ffa26cebc44f.png

eholiceholic2009/09/11 16:33恥ずかしながらfoldcolumn知りませんでした.
若干桁が増えるのがアレですが,劇的に見やすくなりました.
ありがとうございます.
まだまだ知らない設定がたくさんありそうです.

ka-nachtka-nacht2009/09/11 16:35ワシのオプションは346式まであるぞ。

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