Hatena::ブログ(Diary)

KBDAHOLIC - やぬすさんとこ

2012-06-23(Sat)

akiba-sushi.vim

参加してきました。

http://www.kaoriya.net/blog/2012/06/16

寿司美味しかったです。ごちそうさまでした !!

まじめな感想はこっち。

http://vim.g.hatena.ne.jp/janus_wel/20120623/1340462398

2010-08-11(Wed)

Jumps

vim の help をちゃんと読んでみよう series そのさん。 Jumps ( :help jump-motion ) について。

  • jump
    • 視覚的に "jump" したように見える command は大体 jump にあたるらしい。
    • 細かいところは help 読めで済むんだけど新規 file の編集も入るというところが気付きにくいところか。
  • jump list
    • jump した位置の履歴。 :jumps<CR> で表示可能。
    • 履歴の積み方として queue になっていて下から新しい位置が詰め込まれて上から押し出される。
    • この履歴を使って cursor 移動することができて <C-o> で古い位置 ( Older cursor position だかららしい ) へ、 <C-i> ( o のとなりにあるかららしい ) で新しい位置へ跳べる。
    • <C-o> で古い位置に飛んでから新しく jump すると <C-i> で戻れたところが破棄されてその新しい jump 先の位置が queue に積まれる。うーんこれ厳密な queue とは言えないな…。
    • jump list は window 毎で別管理でそれぞれ 100 固定らしい、固定て。
      • window を split すると jump list も複製される。
    • jump list に載っている位置を含む行を delete してしまうと jump list からその履歴が消えるらしい。
    • すでに履歴にある位置へ jump するとその履歴が一番新しい位置へ出てくるだけみたい。
    • ex-command ":keepjumps" を使うと履歴に載せずに jump できる、と。 motion なんかの normal command は :keepmarks normal gg と ":normal" と一緒に使ってやればいいわけか。
      • ex-command ":global" ( :help :global ) も記載しないとか書いてあるけどこれは逆に記載されると jump list が使い物にならなくなってしまうという pattern だな。
    • 逆に手動で履歴に追加するには m' という normal command を使うとも書いてある。あー Marks の内容と link しとる ( http://d.hatena.ne.jp/janus_wel/20100810/1281422617 ) 。
    • 'viminfo' に "'" ( U+0027 APOSTROPHE ) が含まれていると viminfo file に jump list が記録されるらしい。

jump list に似たようなモノに change list というのもあるらしい。

  • change list
    • change する ( insert mode で何か書いたり normal mode から operator で text をいじったりする ) とここにその位置が記録されていくらしい。
    • ex-command :changes<CR> で確認可能。
    • jump list との違いは buffer 毎に管理している点と undo すると新しいのが消える点、同じ行で複数の change があった場合最後の履歴のみが記録される点かな ?
      • 同じ行で〜、ってのは例えば x 連打で文字を消すとかがいちいち全部記録されるとうっとうしいだしょ ? って書いてある。
      • あと 'textwidth' だとか 'wrapmargin' だとか 79 ていう magic number だとかが出てきたり speed を重視してこれこれこういう風に実装されてるとか書いてあったり multi-byte 環境では云々というのはあまり影響がないような… ?
    • change list に載ってる行を削除すると jump するときにちょっとずれたりするよ !! とか書いてある。大雑把だなー。

これ両方とも消す方法って :set viminfo-=' して vim 落とすしかないのかな。うーんそもそも最近動いた位置へ戻るためだけの機能なのでそういうことは考えるなということなんだろうか。重要だと思う場所に jump したいなら事前に mark しといてねと言っている ? あーうんまぁ納得できる、かな。あとは感覚として覚えこませればいいのか。

2010-08-10(Tue)

Marks

vim の help をちゃんと読んでみよう series そのに。 "Marks" ( :help mark-motions, :help 03.10 ) に関して。

  • mark
    • buffer 上のどこか。見えない。 jump ( 後述 ) することができる。
    • 任意の位置を mark することができる。
      • buffer local な "a-z" の 26 個と global な "A-Z" の 26 個。 "a-z" だとか "A-Z" だとかは a, b, ... , z と A, B, ... , Z の範囲の一文字の識別子。
        • ちなみに "a-z" のほうは該当 buffer が buffer list から消えると消滅する。
    • vim が勝手に mark する位置もある。
      • 直近 10 個の file 履歴である "0-9" 。
      • [ ( U+005b LEFT SQUARE BRACKET ), ] ( U+005d RIGHT SQUARE BRACKET ) がそれぞれ直前に change / yank した text の最初の位置と最後の位置。
      • < ( U+003c LESS-THAN SIGN ), > ( U+003e GREATER-THAN SIGN ) がそれぞれ直前の visual mode で選択した最初の位置と最後の位置。
      • ` ( U+0060 GRAVE ACCENT ) もしくは ' ( U+0027 APOSTROPHE ) は直前の jump 前の位置ということらしいけど jump する際に使う command によってどちらを使うかが変わる ( 後述だけど :help '' 見た方が速い ) 。
      • " ( U+0022 QUOTATION MARK ) 前回 buffer を閉じたときの cursor 位置。
      • ^ ( U+005e CIRCUMFLEX ACCENT ) 前回 insert mode を終了した位置。
      • . ( U+002e FULL STOP ) 前回変更した位置。
      • ( ( U+0028 LEFT PARENTHESIS ), ) ( U+0029 RIGHT PARENTHESIS ) mark ? と思ったけど help に載っているのでそういうことらしい。それぞれ現在の文の最初と最後の位置。
      • { ( U+007b LEFT CURLY BRACKET ), } ( U+007d RIGHT CURLY BRACKET ) これらも mark 扱い。それぞれ現在の段落の最初と最後。
    • ここらへん register ( :help registers ) と似てるけど全然関係ないらしい。 vim は引き出しがおおい。
  • jump with marks
    • で、 mark 位置へ jump するには以下の normal command のどれかを使う。
      • ` ( U+0060 GRAVE ACCENT ) は mark した位置に飛ぶ。
      • ' ( U+0027 APOSTROPHE ) は mark した行の最初の非 blank 文字に飛ぶ。
      • g`, g' はそれぞれ buffer を飛び越えない限り jumplist を更新しない `, '
    • 上記 4 つのうちどちらかを打ったあとに mark の識別子を打ち込むと jump する。
    • この mark への jump 操作は operator のあとに指定する motion として使えるらしい ( "A-Z" は同じ buffer 内での移動の場合のみ motion として指定が可能 ) 。あーそうか、これでやっと操作範囲を blockwise に変更したりするのが生きてくるのかな ( :help o_CTRL-V ) 。
  • :marks, :delmarks
    • mark の管理用 ex-command 。
    • mark は見えないのでわからなくなったら :marks で確認する。 mark を使い始める際はこの command を頻繁に打ってどういう操作でどう mark が変わるのかに慣れるのがいいかも。
    • 必要のなくなった mark を消すのが :delmarks 。複数形が示す通り複数の識別子を認識してくれる。 bang をつけると小文字 mark をすべて消去するらしい。
    • こまめに掃除しておくと :marks がごちゃごちゃしなくていい感じ。

他はあんまり使わなさそうというか script で使うのが前提なのかなーと思われる command だったりするので ( ]' とか :lockmarks とか ) ちょっと無視。とりあえず /TODO<CR> -> mt をしてから作業するとかにすると物理的に window をたくさん開けなくても編集が楽になるかもしれないとか .vimrc を 'A で呼び出せるようにしておくとかもアリかな。

2010-08-09(Mon)

'confirm'

help を読みながらの実験とかで空の buffer をやりたいほうだい変更したはいいもののいざ qall すると怒られる上に buffer が増殖してやる気が減退するのをアレする設定。 qall! とか怖くて無意識に打てるようになりたくないです。

.vimrc に以下を書けば大体解決 ( :help 'confirm' ) 。「保存しなくていいの ? 」って vim が訊いてくるようになる。

set confirm

ただこれだけだと GUI 環境では窓 ( ) が出てきてしまうので以下の設定を .gvimrc に書いて CUI を使うんだと表明する。訓練された vimmer なら別に set go=c でもいい。

set guioptions+=c

設定したはいいものの文字が読みにくい !! 責任者はどこか !! とかいうひとは "MoreMsg" という highlight group で highlight 指定ができるので以下のような一行を適当なところに書いておけばおk

" Set the color of the confirm messages to yellow.
hi MoreMsg guifg=#ffff00

2010-08-08(Sun)

Motions and operators いち

vim の help をちゃんと読んでみよう series そのいち。まずは "Motions and operators" ( :help operator ) 。日本語的には「 ( カーソル ) 移動と ( テキスト ) 操作」という意味くらいに取っておけばいい、はず。これを読むと何がいいかってコピペが楽になるのとすべて大文字の単語を打つときに shift key 押しっぱなしにしなくてもいいことに気づけることかなー。

  • operator, operator command
    • すでに存在する text を「操作」 ( yank, delete, capitlize, decapitalize etc ) するための normal command を operator だとか operator command だとか言う。
    • 訳としては演算子だとか作用子なんかもアリだとは思うんだけどひとが operation するときに使うから operator という名前なんだろうなぁと推測したので「操作」。
  • motion, motion command
    • :help {motion}
    • cursor の位置を「移動」するための normal command を motion だとか motion command だとか言う。
    • こっちも愚直に訳すなら動作あたりだと思うんだけどやっぱりその動作をおこすのはひとなのでひとが介入してる感の大きい「移動」にした。
  • operator + motion
    • そして operator と motion を組み合わせて normal mode でお手軽に text に対して何かしちゃおうというのがこの help の主旨かな。
    • operator command のあとに motion command を続けて打つことで操作内容と適用範囲を指定する、というもの。操作内容は operator command で指示するというのはともかく適用範囲は現在の cursor 位置 ( 以下「始点」 ) から motion command で移動したあとの cursor 位置 ( 以下「終点」 ) までをその範囲とする、ということだね。
    • operator も motion も normal command なので先行して count を指定することができる ( :help count ) んだけど両方に指定した場合どうなるのかというのは両方の積が範囲指定に使われるっぽい。まぁここらへんは 2d3w は 3 単語 delete することを 2 回なのでつまり 6 単語 delete するということなのはわかるんだけど範囲指定を motion 側で行うという意識からすると 2d3wd6w になるという脳内変換をするのがよいかも。
      • 余談だけど 2d3w は英語だと "Delete three words twice" なんだけどこれ英語圏のひとの自然な発想じゃないよなぁと思ったりした。 d6w なら "Delete six words" で自然ぽいんだけど。あーでもそうすると count という概念自体が英語的にアレなことになるのかな。 operation + motion の概念が出てきてやっと feeling に近づくというちょっとアレな command 体系なのかも。
        • operator が operand のうしろにある ( ようにも解釈できる ) から単に reverse polish notation なだけじゃねという推測もアリだけど本筋じゃないからここで終わり。
    • cursor 移動を行って適用範囲を決めるってことは operator + motion で操作した場合 cursor の位置は motion command で移動したところになるのか ? という疑問が浮かぶんだけど text の開始位置の一番左に cursor が移動しますとか書いてある ( "mostly left at the start of the text" ) 。
    • operator と motion の間に :omap command で定義した mapping を入力可能、と。うーん何に使えるのか思いつかない…。
    • operator + motion の代わりに visual mode で範囲を指定してから operator を打つと text 操作がやりやすいよと書かれてるけどここは本筋ではないので省略。
      • ただまぁ「ここをこうする」という日本語的な感覚なので日本語 native は visual mode の方が使いやすいのかも。
    • motion の代わりに ex-command を使うことができるとも書いてある。
      • 複数行でも OK だけどその場合 . での再操作は無理らしい。こういう場合は "|" を使って各 ex-command をつなげればいいのかな。

長くなるのでいったん切る。