くふんを狙え(vimグループ) このページをアンテナに追加 RSSフィード

くふんを狙え

2008-06-30

疑問。コマンド:resizeでできる空間

14:09 | 疑問。コマンド:resizeでできる空間 - くふんを狙え(vimグループ) を含むブックマーク はてなブックマーク - 疑問。コマンド:resizeでできる空間 - くふんを狙え(vimグループ) 疑問。コマンド:resizeでできる空間 - くふんを狙え(vimグループ) のブックマークコメント

ウィンドウが一つだけの状態でコマンド:resizeを使って:resize 5てな感じで実行。'statusline'が6行目のところに来る。なるほど、リサイズか。ここまでは、まあいいとして、このとき「'statusline'の下にできる空間ってなんて呼べばいいんだろう」ってのが、このエントリの言いたいこと。

最初に思うのは、コマンドラインかなってこと。

でも:echo &cmdheightしてもvimrcに書いた2のまんまだし、:set cmdheight=5とかしても表示は変わんない。普段なら:set cmdheight=2のときに:set cmdheight=5とすればコマンドラインが大きくなるのに、:resizeで一つのウィンドウをいじるとなぜか戻せない。コマンド:resizeを実行したり、<C-w>50+で戻せるには戻せるんだけど、なんだかなあ。それに、コマンドラインじゃないとしたら、なんなんだこの空間。僕の'cmdheight'の解釈がおかしいのか。

なんて呼べばいいの!教えて!偉い人!

ka-nachtka-nacht2008/06/30 14:30> 'statusline'の下にできる空間ってなんて呼べばいいんだろう
:helpでも今一表記が一定していませんが、強いて言えばコマンドライン(the command-line)です。

> 疑問。vimperatorのことってここに書いてもいいの?
だめ、ぜったい。
というのは冗談にしても、Vimとvimperatorはintとfloatくらいには違うので、別のグループを作るなり自分のはてなダイアリーで書くなりすべきだと思います。

eclipse-aeclipse-a2008/06/30 14:57> vimperator
りょーかい!

> コマンドライン(the command-line)
'statusline'のすぐしたの'cmdheight'行分の空間は確実に「コマンドライン」だと思うんですけど、:resize時にその下にできる、なぞの空間もコマンドラインということでいいんですかね?
それだと、'cmdheight'とコマンドラインの高さって一致しないってことになるんで、よくわからないんですよ。

なんか質問ばっかりですいません。

ka-nachtka-nacht2008/06/30 15:10あー、把握しました。:help window-resize末尾の解説によると:
> If there is only one window, resizing that window will also change the command
> line height. If there are several windows, resizing the current window will
> also change the height of the window below it (and sometimes the window above
> it).
ということなので、コマンドラインということで良いと思います。'cmdheight'の値は「最低限、この行数分はコマンドライン用の領域を確保する」と解釈すれば良いでしょう。

ka-nachtka-nacht2008/06/30 15:13あと、全くもって役に立たない知識ですが、
:only | vsplit | resize 1
のようにしても謎の空間は発生するので、厳密には「If there is only one window」という:helpの記述は誤りだったりします。

eclipse-aeclipse-a2008/07/01 01:10なるほど、ちゃんと:helpに書いてあったんですね orz...

このエントリの疑問点はばっちり解消されました!(役に立つことはなさそうな雑学までw)ありがとうございます!

ChampChamp2011/11/23 17:04Woot, I will ceritanly put this to good use!

hdddguqwfhdddguqwf2011/11/24 19:421xgtDn <a href="http://ugspalutbdlb.com/">ugspalutbdlb</a>

vrhdgntfdvrhdgntfd2011/11/25 00:50jkIWOG , [url=http://qsaryqwxdvtp.com/]qsaryqwxdvtp[/url], [link=http://gcjnaihpkztu.com/]gcjnaihpkztu[/link], http://ekjrbndhhgvf.com/

psiuaqpsiuaq2011/12/01 01:50UAOoqq <a href="http://xpxqeyqhwcoc.com/">xpxqeyqhwcoc</a>

rcgczsdbrgdrcgczsdbrgd2011/12/05 02:39l0lPKK , [url=http://ylfbxnusaith.com/]ylfbxnusaith[/url], [link=http://ldtcuidldswm.com/]ldtcuidldswm[/link], http://cshzkyboeteb.com/

トラックバック - http://vim.g.hatena.ne.jp/eclipse-a/20080630

2008-06-26

なにやらすごいエラーE315を再現できた。その3。

14:04 | なにやらすごいエラーE315を再現できた。その3。 - くふんを狙え(vimグループ) を含むブックマーク はてなブックマーク - なにやらすごいエラーE315を再現できた。その3。 - くふんを狙え(vimグループ) なにやらすごいエラーE315を再現できた。その3。 - くふんを狙え(vimグループ) のブックマークコメント

なにやらすごいエラーE315を再現できた。その2。 - くふんを狙え(vimグループ) - vimグループの続き。さらに圧縮。エラーチェック省いてみた。

  1. 起動オプションuとUを使って、それぞれ以下のコードを記述したファイルと空のファイルを指定する (GUI版の場合)
  2. コマンド:q
  3. E315!
set nocompatible
set laststatus=2
set updatetime=1

function! s:close()
  execute bufwinnr('W2') . 'wincmd w'
  silent! close
  execute bufwinnr('W1') . 'wincmd w'
endfunction

function! s:open()
  let curnr = bufnr('%')
  if bufwinnr('W2') == -1
    split +setlocal\ bufhidden=delete W2
    execute bufwinnr('W1') . 'wincmd w'
  endif
endfunction

autocmd!
autocmd CursorHold W1 call s:open()
autocmd BufDelete  W1 call s:close()

silent edit +setlocal\ bufhidden=delete W1
call append(0, '')
call cursor(2, 1)
set nomodified

なにやらすごいエラーE315を再現できた。その2。

10:53 | なにやらすごいエラーE315を再現できた。その2。 - くふんを狙え(vimグループ) を含むブックマーク はてなブックマーク - なにやらすごいエラーE315を再現できた。その2。 - くふんを狙え(vimグループ) なにやらすごいエラーE315を再現できた。その2。 - くふんを狙え(vimグループ) のブックマークコメント

なにやらすごいエラーE315を再現できた - くふんを狙え(vimグループ) - vimグループの続き。

赤ペン先生になおしてもらえたので*1、たくさんの箇所を修正してみた。あと今回のテストに必要なさそうな判定やら繰り返しやらをばっさり削除してみた。:versionも書いた方がいいみたいだったので書くー。

set nocompatible
"'laststatus'が1だと起きない
set laststatus=2

nnoremap <silent> \e315 :<C-u>call <SID>ShowResult()<CR>

" NOTE:'updatetime'が1でなくても起きる
autocmd!
autocmd CursorHold __RESULT call s:ShowPreview()
autocmd BufEnter   __RESULT set updatetime=1
autocmd BufDelete  __RESULT call s:ClosePreview()

function! s:ShowResult()
  edit __RESULT
  setlocal buftype=nofile bufhidden=delete noswapfile
  silent global/^/delete _
  call append(0, [1, 2, 3])
  silent normal dd
  " NOTE:cursor()を呼ばないと起きない
  call cursor(2, 1)
endfunction

function! s:ClosePreview()
  let bufnr = bufnr('%')
  let winnr = bufwinnr('__PREVIEW')
  if winnr == -1 | return | endif
  execute winnr . 'wincmd w'
  silent! close
  let winnr = bufwinnr(bufnr)
  if winnr != -1
    execute winnr . 'wincmd w'
  endif
endfunction

function! s:ShowPreview()
  let curbufnr = bufnr('%')
  let winnr = bufwinnr('__PREVIEW')
  if winnr != -1
    execute winnr . 'wincmd w'
  else
    split __PREVIEW
    setlocal buftype=nofile bufhidden=delete noswapfile
  endif
  let winnr = bufwinnr(curbufnr)
  if winnr != -1
    execute winnr . 'wincmd w'
  endif
endfunction
VIM - Vi IMproved 7.1 (2007 May 12, compiled Mar 15 2008 11:37:32)
MS-Windows 32 ビット GUI 版 with OLE サポート
適用済パッチ: 1-278
Modified by koron@tka.att.ne.jp
Compiled by koron@tka.att.ne.jp
Big 版 with GUI.  機能の一覧 有効(+)/無効(-)
+arabic +autocmd +balloon_eval +browse ++builtin_terms +byte_offset +cindent 
+clientserver +clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments 
+cryptv +cscope +cursorshape +dialog_con_gui +diff +digraphs -dnd -ebcdic 
+emacs_tags +eval +ex_extra +extra_search +farsi +file_in_path +find_in_path 
+folding -footer +gettext/dyn +guess_encode -hangul_input +iconv/dyn 
+insert_expand +jumplist +keymap +kaoriya +langmap +libcall +linebreak 
+lispindent +listcmds +localmap +menu +migemo/dyn +mksession +modify_fname 
+mouse +mouseshape +multi_byte_ime/dyn +multi_lang +mzscheme/dyn +netbeans_intg
 +ole -osfiletype +path_extra +perl/dyn -postscript +printer -profile 
+python/dyn +quickfix +reltime +rightleft +ruby/dyn +scrollbind +signs 
+smartindent -sniff +spidermonkey/dyn +statusline -sun_workshop +syntax 
+tag_binary +tag_old_static -tag_any_white -tcl -tgetent -termresponse 
+textobjects +title +toolbar +user_commands +vertsplit +virtualedit +visual 
+visualextra +viminfo +vreplace +wildignore +wildmenu +windows +writebackup 
-xfontset -xim -xterm_save -xpm_w32 
      システム vimrc: "$VIM\vimrc"
        ユーザ vimrc: "$HOME\_vimrc"
     第2ユーザ vimrc: "$VIM\_vimrc"
         ユーザ exrc: "$HOME\_exrc"
      第2ユーザ exrc: "$VIM\_exrc"
     システム gvimrc: "$VIM\gvimrc"
       ユーザ gvimrc: "$HOME\_gvimrc"
    第2ユーザ gvimrc: "$VIM\_gvimrc"
    システムメニュー: "$VIMRUNTIME\menu.vim"
コンパイル: cl -c /W3 /nologo  -I. -Iproto -DHAVE_PATHDEF -DWIN32   -DFEAT_CSCOPE -DFEAT_NETBEANS_INTG     -DMODIFIED_BY=\"koron@tka.att.ne.jp\" -DDYNAMIC_MSVCRT_DLL=\"MSVCR71.dll\" -DGETTEXT_DLL=\"intl.dll\" -DGETTEXT_DLL_WITHENC=\"intl2.dll\" -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 /Fo.\Obj\GOLYRZS/ /Ox -DNDEBUG /G6 /MD -DFEAT_OLE -DFEAT_MBYTE_IME -DDYNAMIC_IME -DFEAT_GUI_W32 -DDYNAMIC_ICONV -DDYNAMIC_GETTEXT -DDYNAMIC_MIGEMO -DFEAT_PYTHON -DDYNAMIC_PYTHON -DDYNAMIC_PYTHON_DLL=\"python25.dll\" -DFEAT_MZSCHEME -I c:\MzScheme\include -DDYNAMIC_MZSCHEME -DDYNAMIC_MZSCH_DLL=\"libmzsch370_000.dll\" -DDYNAMIC_MZGC_DLL=\"libmzgc370_000.dll\" -DFEAT_PERL -DDYNAMIC_PERL -DDYNAMIC_PERL_DLL=\"perl58.dll\" -DFEAT_RUBY -DDYNAMIC_RUBY -DDYNAMIC_RUBY_VER=18 -DDYNAMIC_RUBY_DLL=\"msvcrt-ruby18.dll\" -DFEAT_SPIDERMONKEY -DDYNAMIC_SPIDERMONKEY -DDYNAMIC_SPIDERMONKEY_DLL=\"js3250.dll\" -DFEAT_BIG /Fd.\Obj\GOLYRZS/ /Zi
リンク: link /RELEASE /nologo /subsystem:windows /map /mapinfo:lines advapi32.lib shell32.lib gdi32.lib comdlg32.lib ole32.lib uuid.lib oldnames.lib kernel32.lib gdi32.lib version.lib   winspool.lib comctl32.lib advapi32.lib shell32.lib  /machine:i386 /nodefaultlib msvcrt.lib oleaut32.lib  user32.lib     /nodefaultlib:python25.lib      WSock32.lib  /PDB:gvim.pdb -debug

手順については、前回の記事からどうぞ。

*1:正確には「なおしてー」とお願いしたかたち

AnnAnn2012/11/27 22:07This aritcle is a home run, pure and simple!

ppnelbhbrppnelbhbr2012/11/30 07:27fAVqtB <a href="http://ogqpqcwnzdrd.com/">ogqpqcwnzdrd</a>

srwwguloasnsrwwguloasn2012/11/30 16:24My6XyH , [url=http://noxgdeoyeago.com/]noxgdeoyeago[/url], [link=http://vbsihbpvfepa.com/]vbsihbpvfepa[/link], http://dkrjjcxhxngp.com/

avgjwwxavgjwwx2012/12/01 23:298t8ZV0 <a href="http://npfwlynwyelt.com/">npfwlynwyelt</a>

ukhjhrqpnukhjhrqpn2012/12/03 00:58NGEkV5 , [url=http://iobmnqxiovfj.com/]iobmnqxiovfj[/url], [link=http://zeqvogderdyw.com/]zeqvogderdyw[/link], http://szhwslueyamr.com/

トラックバック - http://vim.g.hatena.ne.jp/eclipse-a/20080626

2008-06-25

なにやらすごいエラーE315を再現できた

14:52 | なにやらすごいエラーE315を再現できた - くふんを狙え(vimグループ) を含むブックマーク はてなブックマーク - なにやらすごいエラーE315を再現できた - くふんを狙え(vimグループ) なにやらすごいエラーE315を再現できた - くふんを狙え(vimグループ) のブックマークコメント

私の環境(Win32,Kaoriya版Vim7)でE315を再現できたので、それの紹介。

まずはE315について。私の持っている日本語版ドキュメントではこんな風になっている。

*E315*

ml_get: invalid lnum:

Vimの内部エラー。どうしたらこれを再現できるかを発見して、バグレポートを送って

くれないだろうか |bugreport.vim|。

404エラー | 該当のページが見つかりません

なにやらよくわからんけど、すごいエラーみたいだ。最新版では解決しているのかもしれないけど、せっかく再現することができたので、紹介しようと思ったわけ。

解決方法については、Vim自体のソースコードを読んだことがないので、詳しい方よろしく。

では、E315を出すスクリプトを貼る前にE315に持っていく手順説明。

  1. 下に貼り付けてあるスクリプトをコマンド:soで読み込む
  2. マッピング\e315でスクリプトローカル関数ShowResult()を呼び出す
  3. ( __RESULT, __PREVIEWという二つのウィンドウが表示される )
  4. ウィンドウ__RESULTで、コマンド:onを実行し、他のウィンドウを閉じる
  5. ( __RESULT, __PREVIEW以外のウィンドウが閉じられる )
  6. ウィンドウ__RESULTで、コマンド:qを実行する
  7. (うまくいけばE315が拝める )

とまあ、こんな感じ。他の環境で再現できるかはわからない。


set nocompatible

set laststatus=2

nnoremap <silent> \e315 :call <SID>ShowResult()<CR>

autocmd!
autocmd CursorHold __RESULT call s:ShowPreview()
autocmd BufEnter   __RESULT set updatetime=1
autocmd BufDelete  __RESULT call s:ClosePreview()

function! s:ShowResult()
  " 窓を開く
  if expand('%:p') == '' && !&modified && !has('vim_starting')
    let cmd = 'edit'
  else
    let cmd = 'split'
  endif
  silent execute cmd '__RESULT'
  setlocal bt=nofile bh=delete noswf
  " 行数を確保する
  silent! exe 'g/^/d_'
  for i in range(1, 3)
    if line('$') != 1 || getline('1') != ''
      call append('$', i)
    else
      call setline('1', i)
    endif
  endfor
  " カーソルの位置を合わせる ( E315! )
  call cursor(2, 1)
endfunction

function! s:ClosePreview()
  let bufnr = bufnr('%')
  let winnr = bufwinnr('__PREVIEW')
  if winnr == -1 | return | endif
  execute winnr . 'wincmd w'
  silent! close
  let winnr = bufwinnr(bufnr)
  if winnr != -1
    execute winnr . 'wincmd w'
  endif
endfunction

function! s:ShowPreview()
  let curbufnr = bufnr('%')
  let winnr = bufwinnr('__PREVIEW')
  if winnr != -1
    execute winnr . 'wincmd w'
  else
    if expand('%:p') == '' && !&modified && !has('vim_starting')
      let cmd = 'edit'
    else
      let cmd = 'split'
    endif
    silent execute cmd '__PREVIEW'
    setlocal bt=nofile bh=delete noswf
  endif
  let winnr = bufwinnr(curbufnr)
  if winnr != -1
    execute winnr . 'wincmd w'
  endif
endfunction

" vim700: set et ts=2 sw=2 sts=2 fdm=marker:

もともとはhowm-mode.vimから。100KB近くあるものをここまで削るのに苦労した。こういうのって普通どうやって調べるんだろうね。

赤ペン先生(id:ka-nacht)に直される前にnmapをnnoremapにした

KeshawnKeshawn2011/11/23 00:53Apprecitaoin for this information is over 9000—thank you!

xazerlpxpuxazerlpxpu2011/11/24 17:43T6b8zb <a href="http://gxhuiflgkuuj.com/">gxhuiflgkuuj</a>

nnrclwvttrjnnrclwvttrj2011/11/24 22:55boqNpM , [url=http://efqiwqgrkmhb.com/]efqiwqgrkmhb[/url], [link=http://yntxebbkocwx.com/]yntxebbkocwx[/link], http://tskxolcrhkql.com/

afxllkwszafxllkwsz2011/12/01 00:43pwayD9 <a href="http://rcykqgfilnxm.com/">rcykqgfilnxm</a>

zlsipqkulxzlsipqkulx2011/12/05 00:11bZ6yWl , [url=http://vrbemtmwrtqh.com/]vrbemtmwrtqh[/url], [link=http://gvploxoyoiih.com/]gvploxoyoiih[/link], http://dodibyzjjboh.com/

2008-06-23

Tipsとして紹介される「もういいよ」って思うもの。その1。

17:46 | Tipsとして紹介される「もういいよ」って思うもの。その1。  - くふんを狙え(vimグループ) を含むブックマーク はてなブックマーク - Tipsとして紹介される「もういいよ」って思うもの。その1。  - くふんを狙え(vimグループ) Tipsとして紹介される「もういいよ」って思うもの。その1。  - くふんを狙え(vimグループ) のブックマークコメント

文字コードを変換するには

:setlocal fenc=utf-8
:h 'fenc'

改行コードを変換するには

:setlocal ff=unix
:h 'ff'

指定した文字コードで開きなおすには

:e ++enc=utf-8
:h :e
:h ++opt

バッファ全体から置換するには

:%s/セイキヒョウゲン/置換パターン/g
:h :s

レジスタ/クリップボードに、コピー/ペーストするには

( x を変えれば色んなレジスタ/クリップボード )

"xy
"xp
:h registers
:h y
:h p

ややネタ ( :help 関連 )

:h :h
:help!
:h E478

を取り入れて、修正。:setlocalに関しては、ある意味:setの方が正解な気もする。紹介される場面で:setlocalが使われていることがまずないという意味で。

WikaWika2012/09/12 01:35No more s***. All posts of this quaitly from now on

msfoswwkfkmsfoswwkfk2012/09/12 09:34mJ7Orl <a href="http://hgyyrkcwakuo.com/">hgyyrkcwakuo</a>

vbefllnbkvbefllnbk2012/09/14 02:477CCqLg <a href="http://kklnmnrclsnb.com/">kklnmnrclsnb</a>

rlgfxsrlgfxs2012/09/14 08:15PZHPNb , [url=http://mnttzomvknsn.com/]mnttzomvknsn[/url], [link=http://kihcdcfooizt.com/]kihcdcfooizt[/link], http://nbycfhcxhida.com/

2008-06-21

パーセントではさまれた文字列の置換

18:58 | パーセントではさまれた文字列の置換 - くふんを狙え(vimグループ) を含むブックマーク はてなブックマーク - パーセントではさまれた文字列の置換 - くふんを狙え(vimグループ) パーセントではさまれた文字列の置換 - くふんを狙え(vimグループ) のブックマークコメント

前回の「単純な置換」ほど汎用的ではないけど、たまに使う表現をメモ。

関数の目的は、パーセントではさまれた文字列の置換すること。例えば、文字列'hello, %lang%'の%lang%を'Perl'で置き換えたり、'Ruby'で置き換えたりしたい場合に使う。いちいちsubstitute()って書くのが嫌いなので*1、変換前の文字列と辞書を渡して置換してもらう。

ごちゃごちゃ書くより見たほうが早いので、貼り付ける。ぺたり。

function! s:replace_percent(fmt, dict, ...)
  let pat = (exists('a:1') && a:1 ? '\c' : '\C') . '%\([^%]*\)%'
  let sub = '\=s:replace_percent_stub(a:dict, submatch(1))'
  return substitute(a:fmt, pat, sub, 'g')
endfunction

function! s:replace_percent_stub(dict, match)
  if a:match == '' | return '%' | endif
  if has_key(a:dict, a:match)
    return a:dict[a:match]
  else
    return '%' . a:match . '%'
  endif
endfunction

パーセントを二つ重ねるとパーセントになる。マッチしない場合は、削除したり特別な置換はしない。大文字小文字はデフォルトで区別する。第三引数が真なら区別しない。以下に使い方の例を示す。

" The True Vim Master
echo s:replace_percent('The True %fuga% Master', {'fuga': 'Vim'})

「substitute()の第三引数に式(関数)が使える」それを知ったときの感動の余韻としか思えない。即興で同じようなものを(書けてしまうから)書いてしまうことが多い。そんなかわいそうな関数

*1関数名が長いし、引数が多いし、前回書いたように引数に特別な意味があったりするから。いろいろ理由はあるけど、とにかく嫌い

ChrisChris2012/11/26 10:43I thought finding this would be so aroduus but it's a breeze!

ChrisChris2012/11/26 10:44I thought finding this would be so aroduus but it's a breeze!

irrlhxirrlhx2012/11/30 02:44eduEPe <a href="http://wrhiqdbexfur.com/">wrhiqdbexfur</a>

pmlgkatzhzpmlgkatzhz2012/11/30 11:478V4Sbt , [url=http://uuatgxgfghyi.com/]uuatgxgfghyi[/url], [link=http://cjyedguajljn.com/]cjyedguajljn[/link], http://sjdsgcvbfvhk.com/

aziiuyaflvaziiuyaflv2012/11/30 19:33bylOM1 <a href="http://kfsikcltoikg.com/">kfsikcltoikg</a>

dacnnldddacnnldd2012/12/01 01:02lMDcpS , [url=http://zzqvjsyysbqj.com/]zzqvjsyysbqj[/url], [link=http://cbdpeedqwfmq.com/]cbdpeedqwfmq[/link], http://hatkmjpeezjg.com/

2008-06-20

正規表現を意識しない文字列の置換(単純な置換)

13:50 | 正規表現を意識しない文字列の置換(単純な置換) - くふんを狙え(vimグループ) を含むブックマーク はてなブックマーク - 正規表現を意識しない文字列の置換(単純な置換) - くふんを狙え(vimグループ) 正規表現を意識しない文字列の置換(単純な置換) - くふんを狙え(vimグループ) のブックマークコメント

よく使っている。便利な表現をメモ。

文字列を置換することは多い。その中でも特に正規表現を意識しない文字列の置換(以下、単純な置換と呼ぶ)もまた多い。単純な置換では、sub-replace-special やら正規表現のパワーが邪魔になることが多い。そういった場合の処理をまとめてやってくれる関数を用意しておくことにしている。今まで、既に何度も自分の書いたスクリプト中に書いているし、ちょっと調べれば分かる関数だけど、そういうことも書いておいたほうがいいのかなと思ったので、ここに書く。

とりあえず、関数をはる。ぺたり。

function! s:replace(s, t, r)
  return substitute(a:s, '\C\V' . escape(a:t, '\'), escape(a:r, '&~\'), 'g')
endfunction

関数自体はすごくシンプル。substitute()の引数を適切にescape()しているだけ。

この関数で問題になりそうなところは二点。一つ目が大文字小文字を区別するようにしている点。二つ目がすべての置換を行う点。それぞれ第二引数と第四引数がそれだ。

これらは省略可能な引数で設定できるようにしてもいいのだけど、普段使うときにそこまで意識することがなかったり、引数の順番が分かりにくくなりそうだったり、本当に「単純な置換」のときだけ使うことを想定するならこれで十分だという判断から、この形になっている。

こういうのってキーワードを作ったほうがいいのかなあ。

ka-nachtka-nacht2008/06/20 14:43> escape(a:r, '&~\')
'nomagic'の場合は&と~を含めてはいけなかったと思います。
検索パターンと違って\Vのような'magic'をオーバーライドするような記法がありませんからね。

> こういうのってキーワードを作ったほうがいいのかなあ。
そりゃーもー是非。

eclipse-aeclipse-a2008/06/20 16:29substitute()の場合には常に'magic'が適用されるので、&と~を含めて良いと思います。
:subsituteの場合には'magic'によって動作が変わるので注意が必要ですね。

" &のテストコード
:se nomagic | ec substitute('foobar', 'foo', '|&|', '')
" => |foo|bar
:se magic | ec substitute('foobar', 'foo', '|&|', '')
" => |foo|bar

~のテストコードは作成できてないです。(subsitute()で~ってどうやってテストすればいいんでしょうか?)一応、二回substitute()してみたり、:sしてみたりした感じだと、~でも\~でも同じように通常の文字列としての~で置換されます。どちらの表記でも特別な意味を持たないかのような動作でした。~は外していいのかもしれません。

ka-nachtka-nacht2008/06/20 17:37> substitute()の場合には常に'magic'が適用されるので
くふん。:help見ずに書いたことがバレてしまいました。

> ~
どうも:substitute限定みたいですね。詳しいことはソースを眺めてみないと分かりません。

ZaylinZaylin2011/11/25 15:10Calling all cars, callnig all cars, we're ready to make a deal.

ksbuhrqyksbuhrqy2011/11/29 04:20rAOLku , [url=http://ccbwxgfrjphd.com/]ccbwxgfrjphd[/url], [link=http://obcwtvisofgu.com/]obcwtvisofgu[/link], http://vfgdfplgfhiv.com/

ktafdzxstofktafdzxstof2011/12/01 19:283ayPBc <a href="http://iofooaomulus.com/">iofooaomulus</a>

トラックバック - http://vim.g.hatena.ne.jp/eclipse-a/20080620

2008-06-18/\&のメモ このエントリーを含むブックマーク このエントリーのブックマークコメント

/¥& - NaN days - subtech

/\&とか/\@=とか(幅ゼロの肯定先読み)のメモ。まず書かれているとおりに試す。

function! Test()
  let [id, param] = matchlist('id=motemen param=hoge', '\v.*id\=(\S+)&.*param\=(\S+)')[1:2]
  echo id
  echo param
endfunction
:w ~/t.vim
:so %
:call Test()

idとparamを逆にして試す。

function! Test()
  let s = 'id=motemen param=hoge'
  let s = 'param=hoge id=motemen'
  echo matchlist(s, '\v.*id\=(\S+)&.*param\=(\S+)')[1:2]
endfunction

属性名をclassからparamに変えてみる

function! Test()
  let s = 'param=hoge id=motemen'
  let s = 'class=kuhun id=eclipse-a'
  let pat = '\v.*id\=(\S+)&.*param\=(\S+)'
  let pat = '\v.*id\=(\S+)&.*class\=(\S+)'
  echo matchlist(s, pat)[1:2]
endfunction

/\vはあまり使わない(よくわかってないので/\m('magic')に変えてみる)

function! Test()
  let s = 'param=hoge id=motemen'
  let s = 'class=kuhun id=eclipse-a'
  let pat = '\v.*id\=(\S+)&.*param\=(\S+)'
  let pat = '\m.*id=\(\S\+\)\&.*class=\(\S\+\)'
  echo matchlist(s, pat)[1:2]
endfunction

/\&についてヘルプを見てみる

:h /\&
:h /\@=

よくわからないので、googleさんに聞いて、それっぽいのを見つけた。

(?=pattern)

肯定先読みを実行する部分式です。pattern に一致する文字列が始まる位置にある検索文字列と一致します。一致した文字列は記憶されず、後で使用することはできません。たとえば "Windows (?=95|98|NT|2000)" は、"Windows 2000" の "Windows" には一致しますが、"Windows 3.1" の "Windows" には一致しません。先読み処理では、読み進まれた文字は処理済みとは見なされません。一致の検出後、次の検索処理は先読みされた文字列の後からではなく、一致文字列のすぐ後から開始されます。

http://msdn.microsoft.com/ja-jp/library/ae5bf541(VS.80).aspx

なんとなく分かった。先を読んで、マッチしてるか確認してから、うん。たぶん、そうだ。実験してみる。

echo matchlist('A=foo B=bar', '\m\(.*A=\S\+\)\@=\(.*B=\S\+\)')
" ['A=foo B=bar', 'A=foo', 'A=foo B=bar', '', ...]
echo matchlist('B=bar A=foo', '\m\(.*A=\S\+\)\@=\(.*B=\S\+\)')
" ['B=bar', 'B=bar A=foo', 'B=bar', '', ...]
echo matchlist('B=bar A=foo', '\m\(.*A=\S\+\)\&\(.*B=\S\+\)')
" ['B=bar', 'B=bar A=foo', 'B=bar', '', ...]
echo matchlist('B=bar A=foo', '\m\(A=\S\+\)\&\(.*B=\S\+\)')
" []
echo matchlist('A=foo B=bar', '\m\(A=\S\+\)\&\(.*B=\S\+\)')
" ['A=foo B=bar', 'A=foo', 'A=foo B=bar', '', ...]
echo matchlist('A=foo B=bar', '\m\(A=\S\+\)\&\(B=\S\+\)')
" []

うーん。そうか。\@=の前の\(\)にはまったくマッチしないのね。幅ゼロだし。\&はみたまんま&&のイメージか。\|と並んで書かれているし。だから、パターン1\&パターン2と書いて、それぞれのパターンに\(\)を配置してやれば、うまくいくと。一つのパターンでid=,paramを続けるより、二つのパターンを\&でつなぐ形にするほうが、うまくいくと。そういうわけか。そういうわけなんだね。

ka-nachtka-nacht2008/06/18 16:53> /\vはあまり使わない(よくわかってないので/\m('magic')に変えてみる)
'magic'はデフォルトでonなので特に指定する必要はないですよ。

全然関係ですが個人的には/\@=などよりも/\zsや/\zeの方が分かり易くて好みです。

eclipse-aeclipse-a2008/06/18 20:42普段は特に指定していませんし、'magic'がデフォルトなのもバッチリ分かってますよ(普段はホント教えられてばかりですが……)。元の例で\vが使われていたし、せっかくだから、明示したほうがいいかな、そう思ってつけました。

私は普段使っている関係で/\mが好きです(先にも書いたようにわざわざつけることはまずありませんが)。/\vをオススメする人も居るみたいですが、私には逆に分かりにくいですね。+やら?は確かに\つけるの面倒ですけど、普段/\mを使ってると、急に/\vを見せられても、どれがどんな意味を持つのか分からなくなって、困ってしまいます。「ちょ、これ\つけなきゃいけねーのかよw」ってなります。

あと/\Vをescape()と併用するのも好きです。\ではじまらなきゃ安全、加えて\をescape()すれば、すべて安全。あれが好きです。正規表現のとっつきにくさってメタキャラクタの多さと、書きやすさを優先して同じ意味を持つ正規表現が複数あること(*と\{}と\{0,}が同じみたいに)だと思ってます。後者はどうしようもないですけど、前者に関しては/\Vはすごく良いと思うんです。とにかく\を使わなければいいし、\を使いたいときは二つ重ねればいいし。

私も/\zs,/\ze好きです。分かりやすいと思いますし、よく使います。ですから、そちらはパッと見た瞬間にわかるのですが、/\&やら/\@=やらはあんまりわかってなかったです。それで、こんなエントリができました。/\zs,/\zeみたいな普段から使っている、分かっていることに関してもたまには書いたほうが良いかもしれませんね。「自分の常識を共有する」みたいな意味で。

わざわざコメントありがとうございます。いつも参考になります。

MehfishanMehfishan2013/05/04 18:15Okay I'm cnvnoiced. Let's put it to action.

kdxirlubakdxirluba2013/05/07 23:57iKf6tj , [url=http://lwdwgxmmbphb.com/]lwdwgxmmbphb[/url], [link=http://mixdfzpdizvz.com/]mixdfzpdizvz[/link], http://lshweonjaiyt.com/

dpanoqaggddpanoqaggd2013/05/12 11:57rBBeL6 , [url=http://wlyjvpdetbpq.com/]wlyjvpdetbpq[/url], [link=http://qnvshvbhkxew.com/]qnvshvbhkxew[/link], http://xpldvbuhrjfz.com/

トラックバック - http://vim.g.hatena.ne.jp/eclipse-a/20080618

2008-06-17

くふん

23:35 | くふん - くふんを狙え(vimグループ) を含むブックマーク はてなブックマーク - くふん - くふんを狙え(vimグループ) くふん - くふんを狙え(vimグループ) のブックマークコメント

とりあえずグループ参加してみた。てすてす。

DeloresDelores2011/11/23 08:30I have been so beilwdered in the past but now it all makes sense!

dilojseirdcdilojseirdc2011/11/24 18:59EaIPzV <a href="http://dfxkhbvxinaq.com/">dfxkhbvxinaq</a>

トラックバック - http://vim.g.hatena.ne.jp/eclipse-a/20080617
最近のコメント
最近のトラックバック
カレンダー
<< 2008/06 >>
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
カウンター
193833