このページの管理者は、こんなアプリを作ってます →  imoco  choical  ZoomVolume 
tips  >> 01.コンピュータ関連  >> UNIX  >> viめも.txt [takaaki024]  [blog]  [フレームで表示]

viめも     

vi について


■ 基本操作


□ カーソル移動

・ 基本 (←↓↑→,Home,End,PgUp,PgDn)

                           gg (:0 とか 1G と同じ)
                           ↑
                      Ctrl  + B (PgUp)
                           { (段落)
                           ↑
                           
         -                 k
                           ↑
    0 << ^ << B < b < h ← ・ → l > w > W  > e > E >> $
                           ↓
         +                 j
                           
                           ↓
                           } (段落)
                     Ctrl  + F (PgDn)
                           ↓
                           G (:$ と同じ)

    ※ 
        (1) b, w, e は単語単位にジャンプ。大文字にすると、句読点を飛ばす
        (2) w は単語の頭、e は単語の末尾
        (3) 0 は行頭、^ はインデントされた行頭

    ※ その他スクロール
        Ctrl + D, Ctrl + U : 1/2画面分スクロール
        Ctrl + E, Ctrl + Y : カーソル位置を変えずにスクロール
        z[Enter], z., z-   : カレント行が一番 上/中央/下 に来るようにスクロール
        H, M, L, nH, hL    : 画面の一番 上/中央/下 に来るようにカーソルを移動
        [[, {, (, ), }, ]] : セクション/段落/文 単位でジャンプ
        → 文を2つコピーしたい場合に 2y) とやる


・ 現在行内での移動(あんまり使わないかも)

    n| : n桁目へ移動

    f  : その文字まで移動
    t  : その文字の1文字手前まで移動
    ;  : 前回と同じ方向に進む
    ,  : 前回と逆順に進む

    ※ 大文字(F, T) なら逆向き

・ 行番号指定して移動

    g  : ファイルの先頭
    1G : ファイルの先頭
    nG : n行目
    G  : ファイルの末尾

    % : 対応するカッコに飛ぶ




□ 挿入モードへ移行

    O
    I  <<  i ■ a  >>   A
    o

    i : カーソルのある位置
    a : カーソルの後ろ
    I : 行頭
    A : 行末
    o : 下の行
    O : 上の行


□ 削除系

    x  : カーソル上の文字削除(切り取り)
    X  : カーソルの前の文字削除
    dw : 単語を削除
    d0 : 行頭までを削除
    d$ : 行末までを削除  (D と同じ)
    dd : 現在行を削除(切り取り)
    df : 指定文字までを削除

    J  : 次の行を連結
    gJ : 次の行を連結(間に空白を入れない) ※ vim のみ
       ※ 次の行に居るとき用はないだろうか



□ コピー/貼り付け

・1回のみ
    yy : 行コピー
    dd : 行切り取り
    x  : 1文字切り取り
    p  : カーソルの後ろに貼り付け
    P  : カーソルの前に貼り付け

    ※ yyp (行をコピペ) とか xp (文字を置き換え) とかいう使い方をよくする
  
・バッファを使う
    "2p : 2個目のバッファから貼り付ける
    "1pu.u.u.u. : 番号が分からないときに1個目のバッファから順に貼り付ける方法

    "dyy : カレント行をバッファ d にコピー
    "dp  : バッファ d を貼り付け
    "Dyy : バッファ d に追加コピー (大文字にする)



□ 編集、書き換え

    c  : 1文字置き換え (3r のように数値指定すると 3文字数分置き換え)
    r  : 1文字置き換え (3r のように数値指定すると 同じ文字が3つ続く)
    R  : Escを押すまで上書き

    cw : 単語の書き換え (単語の途中で使用すると単語の終わりまで)
    cf : 指定文字までを書き換え
    c0 : 行頭まで置き換え
    c$ : 行末まで置き換え (C と同じ)
    cc : 行ごと置き換え   (S と同じ)

    xp : 2文字分の順番を置き換える (Jhon → John としたいときとかに)



□ 挿入モードでの操作

    基本的に打ったまま表示される。
    


□ アンドゥ・リドゥ (undo/redo, 元に戻す)

    u   : アンドゥ
    U   : その行での変更を全て戻す

    C-r : リドゥ


□ 検索

    /  : 下検索
    ?  : 上検索

    *  : カーソル位置の単語にマッチする次の単語へ
    gd : カーソル位置の単語にマッチする先頭の単語へ

    n  : 次へ
    N  : 前へ

    :set wrapscan : 一番下まで検索したら先頭から検索しなおすオプション

    :g/検索パターン/p  : 検索結果一覧を表示 ( grep のようなもの )
    :g!/検索パターン/p : マッチしない一覧を表示 ( grep -v 〃 )

    ※ 行番号つきで表示したい場合は、p の代わりに nu を付ける
     → :g/検索パターン/nu

    ※ タブやウィンドウをまたいで検索できる?
    :tabdo g/hello/p
    :windo g/hello/p

    → 「更に検索結果のこの行に移動」とかって出来ないだろうか  TODO:



□ 置換

    構文
    :s/original/replace/gc : カーソル行を置換

    オプション
      g : 全部置き換えるときのオプション (つけなかったら最初の1つだけ置き換える)
      c : 書き換えていいか確認する       (y [Enter] 置き換え決定)

    範囲を指定する
    :10,20s/original/replace/g  : 10行めから 20行目まで置換
    :10,$s/original/replace/g   : 10行めから 最後の行まで置換
    :.,.+20s/original/replace/g : 現在行から、20行後まで置換
    :%s/original/replace/g      : 全部の行を置き換える場合 (% : 1,$ と同じ)

    その他
    &         : 最後の置換を繰り返す
    :g/^$d    : 空行を削除
    :set noic : 大文字小文字を区別しない設定



□ 保存/終了

    :w  : 保存
    :r  : ファイル読み込み

    ファイル名指定したい場合は
    :w filename のようにする

    :q  : 終了

    :x  : 変更があった場合は書き込んで終了、無ければそのまま閉じる
    :wq : 保存して終了 (ZZ と同じ)
    :q! : 破棄して終了
    :e! : 読み直し(編集した内容の破棄)
    :e filename.txt : ファイルを開く

    :qa : 全部のウィンドウを閉じる


    :w %.bk : 編集中のファイルの後ろに .bk をつけたファイル名で保存


□ その他操作

    . (ドット) : 一個前のコマンドを繰り返す
    ~ (チルダ) : 大文字と小文字を入れ替える

    Ctrl + G   : 現在行の行番号、全体の行数などを表示
    Ctrl + L   : 画面のリフレッシュ

    ``         : ジャンプする前の箇所に飛ぶ?  TODO:確認

    :!xxxx     : シェルのコマンド実行 (ls とか grep とかを実行したいときに)
    :r !xxxx   : シェルのコマンド実行結果をファイルに書く

    :g/.*/mo0  : ファイル中の行の順序を逆にする



■ 応用


□ マーク

    マーク開始           : mx (xは任意のアルファベット)
    マーク位置に戻る     : `x
    マーク位置から削除   : d`x
    マーク位置からコピー : y`x



□インデント

    >>         : インデントする(コマンドモードで)
    <<         : インデント戻す

    C-t        : インデントする(入力モードで)
    C-d        : インデント戻す
               ↑字下げにTab文字を使わず空白埋めしてるときなんかに便利



□ 複数ファイル開いたときの操作 (vi *.txt とかやったとき)

    :n  : 次のファイルへ
    :ar : 開いているファイルの一覧( 現在のファイルは [ ] で囲われる )




□ コマンド編集行での操作
    ※ 一番下の「 : 」を打ったときや、「 / 」(検索)を打ったときに出る行
    
    C-p : 前へ(履歴を遡る)
    C-n : 次へ
    
    C-b : 行頭
    C-e : 行末
    
    C-w : 1単語消す
    
    C-f : splitしたときみたいに別ウィンドウが出て履歴をたどれる。
          Enterでカーソルのある行のコマンドを実行。
          :q もしくは C-c で抜ける。
    
    C-c : 終了(編集画面に戻る)
    Esc : 〃

    C-d : 候補の一覧
    C-a : 候補を全て入力
    
    C-r, C-w : カーソル位置の単語を入力
    
    
    ※ 1文字ずつ移動するには→キーで移動するしかないのかしら
        ・ C-f で別ウィンドウに履歴が出るのでそれを編集する?
    
        ・ または .vimrc で次のように設定すれば emacs風にはなるけど・・
            cnoremap <C-F> <Right>
            cnoremap <C-B> <Left>
            cnoremap <C-A> <Home>
        
        → どっちも微妙


□ ヘルプ参照中の操作

    C-] で見出しから該当する項に飛べる
    C-t で見出しに戻れる
    
    ※ ctags使ったときのジャンプと同じキー操作


□ ジャンプ

    ファイル名が書いてある箇所にカーソルを合わせて次のように操作すると
    そのファイルへジャンプできる。
    
    gf    : カーソル位置のファイルに移動(戻ってくるときは、C-o でOK)☆
    C-w f : カーソル位置のファイルを新しいウィンドウで開く
    
    ※ ファイルの検索パスは例えば次のように設定するらしい
        let &path .= '/etc,/var/log,/var/log/httpd'
    
        ⇒ このpathは「カレントディレクトリ以下全部」とか自動的に設定できたりしないだろうか? *TODO


□ ファイラ

・次のように打つと指定したフォルダが開ける
    :e .        # カレントディレクトリ
    :e xxx      # xxx フォルダ



■ vimのみの機能


□ マクロの記録

    a という名前のバッファにマクロを記録するとして

    qa   : マクロ記録開始
    ...  : (なんか作業)
    q    : 記録終了
    @a   : マクロを実行



□ ビジュアルモード

・領域選択開始
    v   : 文字選択モード
    V   : 行選択モード
    C-v : 矩形選択モード
    gv  : 再選択(うっかり選択解除してしまったときに前回?の選択範囲を有効にする)

・選択範囲を広げるコマンド(通常のカーソル移動も可)
    a* は空白を含む
    i* は空白を含まない
  
    aw  iw  : 単語
    aW  iW  : 単語+記号
    as  is  : 文
    ap  ip  : 段落
    ab  ib  : (...)
    aB  iB  : {...}

・選択範囲をまとめて処理
    <  : 左シフト
    >  : 右シフト
    J  : 連結
    !  : コマンドに渡す? (TODO:やってみる)


□ 入力モードでの補完コマンド

    C-n      : 現在のバッファを順方向に検索
    C-p      : 逆方向
    C-y      : 確定
    C-x, C-f : ファイル名を補完

    C-x, C-i : インクルードファイルから単語を補完
    C-x, C-] : tagsファイルから単語を補完



□ 複数ウィンドウを開く

・分割する
    :split    filename    : 上下に分割する  (C-w, s) ← 同じファイルを2つに分けたいとき
    :vsplit   filename    : 左右に分割する  (C-w, v)
    :new      filename    : 上下に分割する  (C-w, n) ← 新しいバッファを開きたいとき
    :vert new filename    : 左右に分割する

    ※ それぞれ filename は省略可能(省略しないと s, n の動きは同じだ)
    ※ ヘルプを開くときに上下じゃなくて左右に分けたいときは、
     :vert h xxx
     とやると良い

・現在のウィンドウについての操作

    :close     または C-w c     : 閉じる
    :q         まては C-w q     : 閉じる
    :hide                       : 非表示にする
    :only      または C-w o     : このウィンドウのみ表示

    :resize +5 または 5 C-w +   : 5行分高さを広げる
    :resize -5 または 5 C-w -   : 5行分高さを狭める
    :resize  5 または z5        : 高さを5行にする
    :resize    または C-w _     : 現在選択中のウィンドウを最大化

    :vertical-resize +5 または 5 C-w > : 5文字分幅を広げる
    :vertical-resize +5 または 5 C-w < : 5文字分幅を狭める
    :vertical-resize    または C-w |   : 現在選択中のウィンドウを最大化

・画面切替
    C-w, w   : 画面を切り替える
    C-w, W   : 画面を切り替える(逆順)
    C-w, j   : 下の画面に
    C-w, k   : 下の画面に
    C-^      : 最近表示した2つを交互に切替?
    C-w, x   : 現在のウィンドウと次のウィンドウを入れ替える
    C-w, =   : すべてのウィンドウの幅と高さを揃える
    C-w, 30_ : 現在のウィンドウの高さを 30 にする(省略すると「可能な限り広く」)
             z30でもOK
    C-w, 30| : 現在のウィンドウの幅  を 30 にする

・設定
    次のように .vimrc に設定しておくと +/- でサイズ変更できるんだとか
        map <kPlus>  <C-W>+
        map <kMinus> <C-W>-
        → このように書いたが動作しない出来ない。。 これはテンキーの話?


・最初から(vim開くときに)分かれていて欲しい場合
    vim -o filename1.txt filename2.txt  : 上下に分ける
    vim -O filename1.txt filename2.txt  : 左右に分ける

・全部のウィンドウを閉じる
    :qa

・TODO:左右を入れ替えたり上下を入れ替えたり出来る?



□ 複数タブを表示したいとき

・起動時に開く
    vim -p file1.txt file2.txt ...
    とやるとタブ表示される。

・ショートカット
    gt  : 次のタブ
    gT  : 前のタブ
    5gt : 5個目のタブ(「5個後ろ」ではない)

・その他
    :tabnew filename    : 新しいタブを開く
    :tabnew %           : いま開いてるファイルを新しいタブで (ctags,gtagsを使うときとかに・・)
    :tabfirst           : 一番左
    :tabn               : 次のタブ
    :tabp               : 前のタブ
    :tabn 3             : 3番目のタブに
    :tablast            : 一番右
    :tabm 3             : タブを移動 (3番目のタブの「後ろに」移動)
    :tabc               : 閉じる
    :tabs               : 一覧
    :tabdo %s/foo/bar/g : 開いているタブ全てについて処理


・ヘルプ
    :h tab-page-commands

・Q&A形式
    
    Q. 起動時のスクリプトでタブやウィンドウを分けたいとき

    A. vim -s script.txt

        ※ script.txt  (次のように書くと「タブが3つ、それぞれのタブに左右に分割して*.cpp, *.h」という感じで開ける)
            :e      file1.h
            :vs     file1.cpp
            :tabnew file2.h
            :vs     file2.cpp
            :tabnew file3.h
            :vs     file3.h
            
            このファイルでコメントを書きたい場合は :"  (コロンが要る)で行を始めるといい

    
    Q. Windows版のgvimで、ファイル開くたびにウィンドウ開くのではなく、
        開いてあるウィンドウに追加のタブで開きたい

    A. 引数に --remote-tab-silent を付けると良いらしい。
        例えば SendTo に登録していた場合、ショートカットのプロパティに設定する。

        ※
            ちなみに、まとめて複数ファイルを開きたいときは -p を
            オプションにつけるといいんだけど
            --remote-tab-silent とは同時に指定できないようだ。

    
    Q. Windows版のgvimで、ドラッグしたときも新しいタブで開きたい
    A. いまは :tabnew で新しいタブを開いた後にドラッグするようにしている。*TODO



□ カラー表示

・ONにする
    :syntax on

・色が見づらいと気になったとき
    :set bg?      : 背景色モードを確認
    :set bg=light : light または dark に設定しなおしてから
    :syntax on

    ※ どっちも見づらかったりする

・ためし中・・
    # タブを見えるようにする設定
    #   :highlight SpecialKey ctermbg=lightgrey ctermfg=white
    #   :set listchars=tab:->
    #   :set list

    # 全角空白を表示する設定例
    #   :highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=white
    #   :match ZenkakuSpace / /

・「 vim -d 」で diff 表示するときとか用の設定

    hi DiffAdd    ctermfg=1 ctermbg=7
    hi DiffChange ctermfg=4 ctermbg=7
    hi DiffDelete ctermfg=1 ctermbg=7
    hi DiffText   ctermfg=4 ctermbg=7
    hi Search     ctermfg=0 ctermbg=7



TeraTermとかPoderosaでの色設定

<< 設定方法 >>

[TeraTermの場合]

 teraterm.ini の、以下の行を置き換える。
ANSIColor=0,85,85,85, 1,255,85,85, 2,85,255,85, 3,255,255,85, 4,85,85,255, 5,255,85,255, 6,85,255,255, 7,255,255,255, 8,0,0,0, 9,170,0,0, 10,0,170,0, 11,170,85,0, 12,0,0,170, 13,170,0,170, 14,0,170,170, 15,170,170,170

VTBoldColor=0,0,0,255,255,240
VTBlinkColor=0,0,0,170,170,170
TermType=xterm


 ※ 設定画面でやると、他の項目も書き換わってしまったりするので注意

[Poderosaの場合]

 「色指定エスケープシーケンスの設定」という項目で、以下のように設定する。

 0 : R000 x G000 x B000
 1 : R173 x G008 x B008
 2 : R000 x G128 x B000
 3 : R173 x G089 x B008
 4 : R032 x G032 x B181
 5 : R173 x G000 x B173
 6 : R000 x G173 x B173







□ 折り畳み

    範囲選択した状態で・・

    zf  : 作成
    za  : 開く/閉じる
    zd  : 削除

    zD  : すべての折り畳みを削除
    zR  : すべての折り畳みを開く
    zM  : すべての折り畳みを閉じる

    あらかじめ閉じる範囲を設定ファイルにかけたりしないだろうか

    set fdm=manual    # 手動
    set fdm=syntax    # 言語の文法に従って折り畳む
    set fdm=marker    # {{{ と }}} で囲われた部分を畳む

        ⇒ #ifdef とかの「プリプロセッサマクロ」を折り畳みたい
        ⇒ foldexpr オプションとかで出来る?
            http://vimwiki.net/?%27foldexpr%27
    
    ※ 折りたたみながら読んでて、
        途中で tabnew % して、別タブで ctags で別の関数に飛んだら
        折りたたみの情報が消えてしまった・・・保存とか出来ないだろうか?
        ⇒ ctags のみでは消えなかったので、tabnew がいけなかった?



■ 本体の操作


□ コマンドライン引数(オプション)

    vim -d filename1 filename2    : BeyondCompareみたいに差分見ながら編集できる。でも色が・・
    
    -p[N]                N 個タブページを開く(省略値: ファイルにつき1個)
    -o[N]                N 個ウィンドウを開く(省略値: ファイルにつき1個)
    -O[N]                -oと同じだが垂直分割
    +                    ファイルの最後からはじめる
    --cmd <command>      vimrcをロードする前に <command> を実行する
    -c <command>         最初のファイルをロード後 <command> を実行する
    -c "set fenc=sjis"   新規作成時にShift-JISでファイルを作りたいときとか

    -s script.txt : .vimrcの後にscript.txt を実行する
    -u filename   : .vimrc の代わりにfilenameを実行する
    -w script.txt : script.txtにマクロを記録?

     例:
       vim -c "set fo=tcq" filename1.txt  # コメントを改行したときに次の行も改行になってしまう設定をOFFる
       vim -O Timer.{as,cpp,h}            # 3つのファイルを左右に並べて開く


□ more とか less のように標準入力を読みたい
  
    command1 | view -



□ 一時的にシェルに戻りたいとき

  (viで作業) → Ctrl + Z → (シェルで作業) → fg → (viで作業)




■ Q&A形式


Q. 拡張子ごとに設定を分けたい

A. fexrcという設定で出来るんだとか。でも動作してないように見える。(FC6)

    # (1) ~/.vimrc に fexrc を記述
    #   :set fexrc
    
    # (2) ~/.vimrc.rb とか ~/.vimrc.java とかを作成
    #
    # → 出来ない・・


Q. 全角の記号(★とか○△□)を書くとカーソル位置がずれてしまう。
    "x"で消そうとすると1バイト分だけ消えてるような動作をする。

A. 
    set ambiwidth=double
    
    としておくと良いらしい。


Q. 検索結果のハイライトをクリアしたい (EmEditorでいうF3)

A. 
    :noh と打つ (:nohls でもいい)
    
    ※ :set nohls とかやってしまうと、次検索したときにハイライトしなくなってしまうので注意。
    ※ 前まで /aaaaaaaaaaaaaaaaaaaaa → Enter → C-L (再描画) とやっていた・・


Q. インデントの体裁を整えたい (Eclipse でいう Ctrl + Shift + F)  ※ソース整形/フォーマット

A.
    gg=G
    
    と打つと出来るらしいが、Rubyのコードでやったら けっこう崩れた


Q. 「:set noai」してあるのにTabでインデントされたテキストを貼り付けると
    インデントが崩れてしまう。
    あと # で始まる行(コメント行)の後ろに行を足そうとすると 新しい行の行頭が # になってしまう。

A. rubyプラグインが「formatoptions=croql」という設定をしているためにこうなっているようだ
    http://jarp.does.notwork.org/diary/200301a.html#20030104
    
    →「:set fo=tcq」(デフォルト) に戻してしまおう

    ※ 設定直すのはだるいとかなら、
        「:a! <Enter>」と打ってから貼り付けると良い


Q. ファイルタイプ別の色分けがしたい

A.
    set ft=java
    set ft=javascript
    set ft=ruby
    
    という感じでOK  ※ ft: filetype
    
    他に何が使えるか見るには
    
    ls -l /usr/share/vim/vim71/ftplugin/*.vim   ※ */
    


Q. TODOがハイライトされている。他にもそういうキーワードがある?

A. 
    こんな感じの慣例があるみたい。
    
    TODO:  やるべきこと
    XXX:   メモ的
    FIXME: 直さないといけないこと



Q. 1行が長いときに表示が上(でも同じ行)な場所に行きたいのに
    行頭、行末から h とか l とかで辿らないといけないのがだるい

A. gk とか gj で、表示上の上、下へいける


Q. ファイルタイプ別の設定がしたい

A.
    " default
    set ts=4 sw=4 sts=0 et ai nu si ic scs ambw=double

    " by filetype
    augroup filetype
      au BufRead *.as set ft=javascript    " ActionScript  ← これは反映される
      au BufRead *.rb set ts=2 sw=2 noet   " Ruby          ← これは反映されない
    augroup END
    
    TODO:ちゃんと理解


Q. C-[ が Esc の代わりになるのは知っているけれど、
    日本語キーボードだと [ は遠いので、C-@ に割り当てたい。

A.
    imap <C-@> <esc>
    
    とか .vimrc に書いたら反映されないかなあ。(C-j とかなら反映されるんだけども)


Q. 長い行で自動的に改行が入ってしまう。入らないようにしたい
A. 
    textwidth=0 とするか
    formatoptions で l を有効にする ※ set tcql


Q. カーソル位置の「単語」単位での操作のときに後ろのスペースまで対象にしたくない。

A.
    i を挟むとスペースを含まない
    a を挟むとスペースを含む

    デフォルトは操作内容(d とか c とか y とか)によるようだ。
    
    例)
        カーソル位置より右を操作
        |      カーソル位置の単語を操作
        |      ↓
        ↓      空白含まない  空白含む
        dw      diw (*)       daw        1単語削除
        yw      yiw           yaw (*)    1単語コピー
        cw      ciw (*)       caw        1単語書き換え
    
    ※ (*):「カーソル位置より右を操作(いちばん左の列)」のときの空白の扱い


Q. カレントディレクトリを変更したい

A.
    # カレントディレクトリを現在のファイルのディレクトリにする

    :cd %:p:h

    # 自動的にカレントディレクトリを現在のファイルのディレクトリにする

    :autocmd BufEnter * cd %:p:h


Q.  expandtabしている状態で、入力モードで1個分タブを戻したい。(BackSpace4回打つのが面倒だ)

A. 
    編集モードで C-d でよい?


Q. 編集画面で「%」が現在開いてるファイル名をあらわすことは分かった
    カーソル位置の単語を表すには何を書けば良いのか。

A. 
    「C-r, C-w」と打つとカーソル位置の単語が入力される
    
    ※ 他にある?
        
        C-r, C-a : スペースで区切られた単位
        C-r, C-w : 単語単位
        C-r, C-f : 単語単位
    

Q.
    aaa.cpp というファイルを開いてるときに aaa.h を開きたい
    :tabnew %.h  見たいな感じで指定できないだろうか?(こう書くと aaa.cpp.h が開かれるのだけど)

A.
    :tabnew % として新しいタブを開いてから
    「include "aaa.h"」の行で gf と打つようにしている


Q. gzipとかで圧縮されたファイルを直接読み書きしたい

A. 引数とか指定しなくても編集できるようだ。


Q. ファイルを開こうとしたら次のようなメッセージが出た。

    E325: 注意
    次の名前でスワップファイルを見つけました "xxxxx.swp"
                所有者: xxxxxxx   日付: Tue Jan 27 14:13:39 2009
            ファイル名: xxxxxxxxxxxx
              変更状態: なし
              ユーザ名: xxxxx   ホスト名: xxxxxx
            プロセスID: 14060 (まだ実行中)
    次のファイルを開いている最中 "xxxxxxx"
                 日付: Fri Sep 26 10:40:34 2008

    (1) 別のプログラムが同じファイルを編集しているかもしれません.
        この場合には, 変更をした際に最終的に, 同じファイルの異なる
        2つのインスタンスができてしまうことに注意してください.
        終了するか, 注意しながら続けます.

    (2) このファイルの編集セッションがクラッシュした.
        この場合には ":recover" か "vim -r xxxxxxxxxxxx"
        を使用して変更をリカバーします(":help recover" を参照).
        既にこれを行なったのならば, スワップファイル "xxxxxxxxxx"
        を消せばこのメッセージを回避できます.

    スワップファイル "xxxxxxxxx.swp" が既にあります!
    読込専用で開く([O]), とにかく編集する((E)), 復活させる((R))ecover, 終了する((Q)), 中止する((A)):

A.
    既にファイルを開いているか、前回開いてる間にOSか接続が落ちたケースとおもう。
    書いてある通りにすればいいんだけども、
    
    (1) C-zでバックグラウンドにしていた場合
        ・ 'q' と入力してシェルに戻り、fg コマンドを打ってみる。
    
    (2) 他のウィンドウで開いていた場合
        ・ 'q' と入力してシェルに戻り、他のウィンドウを見てみる。
    
    (3) 前回
        ・ バックアップファイルがいらないなら、
            'q' と入力してシェルに戻たあと、xxxx.swp ファイルを削除する。
        ・ バックアップから戻したいなら、
            'r' と入力して編集画面に行った後、 :wq で保存。


Q. 色分けがおかしい(さっきまでうまく行ってたけど、、)

A. 「 Ctrl + L 」で表示を更新する。


■ 設定

□ 基本
・設定方法
    実行中に設定を行なう場合は :set コマンドで実行
    毎回同じ設定で行きたい場合は .exrc, .vimrc に記述

    トグルオプション     → :set xxx,  :set noxxx
    値指定するオプション → :set xxx=30

・設定を見たいとき
    :set all     : 全ての設定を一覧表示
    :set         : デフォルトと違うもののみ表示
    :set xxx?    : xxx の設定値を確認


・設定項目
    :set ts=xx : タブ文字の表示幅をスペース xx 個分に                (tabstop    )
    :set sw=xx : オートインデント時の字下げ文字数                    (shiftwidth )
    :set sts=xx: TABキーを押したときの空白の文字数を指定             (softtabstop)
    :set nu    : 行番号を表示する                                    (number     )
    :set ai    : オートインデントする                                (autoindent )

    :set wm    : 指定した桁数で改行を入れる(default:0)               (wrapmargin )
    :set ic    : 検索時に大文字小文字を区別する                      (ignorecase )
    :set list  : タブ文字や行末を見える文字にして表示
    :set ws    : 一番下まで検索したら先頭から検索                    (wrapscan   )
    :set sm    : 括弧を閉じた時、対になる括弧を一瞬ハイライトする    (showmatch  )
    
    :set wrap  : 行の折り返しをする                                  (wrap       )

    ※ 以下のオプションは vim のみ
    :set is    : インクリメンタルサーチ                              (incsearch  )
    :set hls   : 検索結果をハイライトするオプション                  (hlsearch   )
    :set scs   : 検索文字に大文字を含むとき、icを一時的に無効にする  (smartcase  )
    :set smd   : 入力モードを表示 (例:-- INSERT --)                 (showmode   )

    ※ 
    :set et    : タブを空白で埋める(設定値swで設定した数字ぶん)      (expandtab  )
    :set si    : スマートインデント("}"でインデント戻したり)         (smartindent)
    :set ambw=x: doubleにすると△○のような全角記号でカーソルずれない(ambiwidth  )
    
    ※ 未整理
    :set hi=50    : コマンド履歴
    :set bs=2     : BackSpaceのときの動作?
    :nocompatible : BackSpaceを有効にする

    ※
    smartcase は ignorecase とセットで使わないと意味がない




□ 設定例1 (ほかの環境で使うときに貼り付ける用)

    " ------------------------------------------------------------
    " デフォルト設定

    " 日本語表示
    set encoding=utf-8
    set fileencodings=utf-8,shift-jis,euc-jp,latin1

    " タブとかインデントの設定
    set tabstop=4 shiftwidth=4 softtabstop=0

    " コーディングするとき用の設定
    set smartindent cindent

    " 気分に応じて
    "set showmatch

    " 検索の設定
    set ignorecase smartcase

    " 行番号表示
    set number

    " 記号(※とか△とか)入力時にカーソルがズレないように設定
    set ambiwidth=double

    " Beep音を鳴らさない
    set vb t_vb=
    set noerrorbells

    " ------------------------------------------------------------
    " ファイルタイプ別の設定

    " ActionScript ※ JavaScript風の色分けに
    autocmd BufRead *.as
      \ set filetype=javascript |
      \ set expandtab
     
    " C言語
    autocmd BufRead *.{c,cpp,h}
      \ set expandtab

    " Ruby
    autocmd BufRead *.rb
      \ set tabstop=2 shiftwidth=2 softtabstop=0
    
    filetype indent on

    " txt (自動改行をOFFる)
    autocmd BufRead *.txt
     \ set textwidth=0
    
    " ------------------------------------------------------------
    " gtags設定
    map <F3>  :Gtags    <C-R><C-W><CR>  " to definition
    map <F4>  :Gtags -r <C-R><C-W><CR>  " to reference
    map <F10> :Gtags -g <C-R><C-W><CR>  " grep

    


□ 設定例2(短く書いた版)

    " encoding
    set encoding=utf-8
    set fencs=utf-8,shift-jis,euc-jp,latin1

    " default
    set ts=4 sw=4 sts=0 tw=0 et ai nu si ic scs ambw=double

    set cindent

    " by filetype
    augroup filetype ts sw et
        au BufRead *.as set ft=javascript   " ActionScript
    augroup END

    autocmd BufRead *.rb
      \ set ts=2 sw=2 sts=0 noet fo=tcq

    autocmd BufRead *.txt
      \ set tw=0
    
    filetype indent on

    " gtags
    map <F3>  :Gtags    <C-R><C-W><CR>  " to definition
    map <F4>  :Gtags -r <C-R><C-W><CR>  " to reference
    map <F10> :Gtags -g <C-R><C-W><CR>  " grep



□ Windows用gvimの設定

    ※ _gvimrcという名前のファイルをホームディレクトリ
        (VistaだとC:\Users\xxxx\)に置く
        注:_vimrcではない
    ※ SJISで保存する


    " gvim設定
    set guifont=MS_ゴシック:h10:cSHIFTJIS
    set fileencodings=shift-jis,utf-8,euc-jp,latin1
    colorscheme delek
    set columns=100 lines=30
    set cmdheight=1
    set guioptions=mea           " ツールバーとかスクロールバー要らない。タブはGUIで
    set mouse=h                  " クリックしてもマウス移動しないように

    autocmd BufEnter * cd %:p:h  " 開いたファイルのディレクトリをカレントディレクトリにする

    " vim設定
    set ts=4 sw=4 sts=0 tw=0 si cin nosm ic nu ambw=auto nobk


    ※ guioptionsのデフォルト値 : gmrLtT
        有効にしたもの
            m   : メニュー表示
            e   : タブをGUIで
            a   : 選択範囲をクリップボードに(TeraTermみたいに)
        
        無効にしたもの
            g   : 使用できないメニューをグレーにする
                  (設定しなくてもグレーになってるようにみえるけど・・)
            t   : メニューの切り離しを出来るようにする
            T   : ツールバーの表示をする
            r   : 右側にスクロールバー表示
            L   : 縦分割したときもスクロールバー表示


□ Q&A形式(vimrc設定)

    
    Q. .vimrcの書式を間違ったみたいだ。.vimrcが編集できない。
    
    A. 次のように -u オプションを付けると、起動時に .vimrc を読まなくなる。無理やりだけど。
        vim -u dummy.txt ~/.vimrc
    
    
    Q. デフォルトのエンコーディングはutf8なので日本語も読み書き出来るが、
        Shift-JISで書かれたファイルを読み書きしたい場合はどうしたらいいのだろう
    
    A. ~/.vimrc に次のように書き足すと良いように自動判定してくれる。
        set fileencodings=utf-8,shift-jis,euc-jp,latin1

    
    Q. コメントを入れたい
    
    A. ダブルクォーテーション以降がコメントになる
        " comment
    
    
    Q. 次の行につなげたい
    
    A. 次の行の先頭を \ で始める。(その前に空白が入っても問題ないようだ)
        さらに次の行につなげる場合は行末に | も つける。(1行目には要らない)
        
        つまりこんな感じ
        
        autocmd BufRead *.as
          \ set filetype=javascript |
          \ set expandtab
    
    
    Q. 設定を変更したので読み直したい。でもvi閉じたくない。
        (source ~/.bash_profile やるような感じで)

    A. 不明 *TODO
    
    
    Q. Cのソースとかで行末の改行のエスケープをそろえたい
    
        str = "                  \ // こんな感じで
           xxxx                  \
           xxxaaaaaaaaaa         \
           aaaa aaa aaa          \
           abcde d               \
           cccccc                \
           ";
    
    A. 
        ※ :Align? というのを使うと出来そうだ  *TODO
    
    
    Q. tabnewで現在開いてるファイルの複製
    
    A. 
        「%」で現在開いてるファイルをあらわせる。
        
        :tabnew %
    
    
    Q. タブを表示したい
    
    A.
        set lcs=tab:>.,eol:$,trail:_,extends:\
        
        とやるといいらしいのだがうまくいかない
    
    
    Q. 全角空白表示
    
    A. 
        highlight FullWidthSpace cterm=underline ctermfg=red guifg=red
        match FullWidthSpace / /
        
        とやるといいらしいのだがうまくいかない
    
    
    Q. マウスを使いたい
    
    A.
        # Windows版 gvim
        set mouse=h       # マウスでクリックしたときにカーソルが動いて欲しくないとき
        set mouse=a       # デフォルト

        # gnome-terminal?
        set ttymouse=xterm
        
        ※ PoderosaやTeraTermでは無理ぽい

    
    
    Q. バックアップファイル要らない
    
    A.  set nobk
    
    
    Q. Windows版GVIMでマウスで選択したときにカーソルがマウス位置に
        行ってしまうのをOFFにしたい

    A.  set mouse=h


    
    Q.「:map」で指定できる文字について、
        <C-P>, <ESC>, <C-]>, <F10> のような文字は設定できるけど
        <C-[>, <C-@> とかは設定できないのは何で?
    
    A. *TODO
    
    
    Q.「:map」とか「:nmap」とか色々あるけど、
    
    A.
        編集モードとか入力モードとか下のほうのコマンド行とかの区別のためらしい。(*TODO)
    
    
    Q. 改行がCR+LFになっているときの ^M を一時的に表示しないようにしたい。
        ※ :%s/\r// とかやって全部消しちゃってもいいんだけども。
    
    A. *TODO
    
    
    Q. formatoptions (fo) が、設定しても反映されない。
    
    A. 
        .vimrc よりもあとから呼ばれる plugin で上書きされてしまうため。
        次のように設定すればOK。
        
        augroup filetype
            au BufRead *.txt set fo=tcq xx=xx
        
        
        ※ どういう順で呼ばれているのかを確認するには
            :scriptnames 
            を実行するといい。
        



■ tips

□ よく使うかもしれない例

※ カンマ、スペースは見易さのために書いたので実際には打たない

・まとめてインデントしたいとき
    5行下までインデント          : >5j
    keywordの行までをインデント  : >/keyword
    対応するカッコまでインデント : >%

・まとめてコメント入れたいとき
    行頭を置換する方法
        相対行で範囲指定      : :.,.+5s/^/# /
        keywordの行までを選択 : :.,/keyword/,s/^/# /
        置換を繰り返す        : :s/^/# / <Enter>, j, 5&

        → 覚えられん、、

    ビジュアルモードの場合
        C-v, 5j, I#
        
    マクロを使う場合
        qa, I# <Esc>, j, 5@a

・範囲を選択して sort
    マークを使用          : ma, 5j, !`a, sort
    ビジュアルモード(vim) : v,  5j, !sort

・保存する前に どこを変更したか確認したい
    バッファとファイルのdiffを見る  : :w !diff % -

・組み合わせ例
    ce  : 単語を削除して入力
    ea  : 単語の末尾に入力
    ct. : 文末まで削除して入力
    xp  : 1文字入れ替え
    
    guu : 1行ぶん小文字に
    gUU : 1行ぶん大文字に
    guw : 1単語ぶん小文字に



□ あまり使わないと思う tips

・ help!
    :help!
    →「E478: 慌てないでください」と出る

・ man
    UNIXコマンド名が書いてあるファイルで
    コマンド名にカーソルを合わせて K (shift-k) を押すと・・・
    そのコマンドの man が出てきます。

・ インクリメント
    カーソル上の数字がインクリメントされる。 
    C-a : 1つ増やす(加算、++、カウントアップ)
    C-x : 1つ減らす
    
    ※ 0 で始まってると 8進数、0x で始まってると16進数としてカウントアップするようだ
        08 ⇒ 10、0x9 ⇒ 0xa

・ modeline
    このファイルだけに反映されてほしい設定値を書く (modelineという機能らしい)。
    例えば タブ幅を 2 にしたいとき
    
    # vi: ts=2 sw=2
    
    という行を含める。 (C とか Javaなら // でOK)
    × 最初の方でも途中の方でも問題ないらしい→間違い
    ○ ファイルの先頭もしくは末尾に modelinesという変数で設定された行数以内に書いてある場合のみ有効
        ※ set modelines? で設定は確認できる
        ※ modeline が有効になっていないと動かない .vimrc で set modeline してしまおう
    
    お気に入り設定は
        普段 : # vi: ts=4 sw=4 sts=0 nu ai ambw=double
        Ruby : # vi: ts=2 sw=2 sts=0 nu ai ambw=double fo=tcq

・カーソル位置の単語を検索
    「 * 」と打つとカーソル位置の単語を検索したのと同じ (Eclipseでいう C-k)

・HTML化
    :TOhtml で、開いているファイルを色分けしたHTMLが出力できる
    /usr/share/vim/vim71/syntax/2html.vim で色設定とか出来るんだとか

    ※ Poderosaの設定に合わせて、次のようにしてみた
        7.0 の場合
            before
                let s:cterm_color0  = "#808080"
                let s:cterm_color1  = "#ff6060"
                let s:cterm_color2  = "#00ff00"
                let s:cterm_color3  = "#ffff00"
                let s:cterm_color4  = "#8080ff"
                let s:cterm_color5  = "#ff40ff"
                let s:cterm_color6  = "#00ffff"
                let s:cterm_color7  = "#ffffff"
            after
                let s:cterm_color0  = "#fafafa"
                let s:cterm_color1  = "#ad0808"
                let s:cterm_color2  = "#008000"
                let s:cterm_color3  = "#ad5908"
                let s:cterm_color4  = "#2020B5"
                let s:cterm_color5  = "#ad00ad"
                let s:cterm_color6  = "#00adad"
                let s:cterm_color7  = "#ffffff"
        7.1 の場合
            before
                let s:cterm_color = {0: "#808080", 1: "#ff6060", 2: "#00ff00", 3: "#ffff00", 4: "#8080ff", 5: "#ff40ff", 6: "#00ffff", 7: "#ffffff"}
            after
                let s:cterm_color = {0: "#fafafa", 1: "#ad0808", 2: "#008000", 3: "#ad5908", 4: "#2020B5", 5: "#ad00ad", 6: "#00adad", 7: "#ffffff"}

・ファイル一覧
    ファイルではなくディレクトリを開いたとき(ついあわてて閉じてしまうが)
    閉じずにファイル名のところまでカーソルを移動させてEnterを押すとファイルが開ける。

・インデントを一括して揃える
    範囲選択して =

・選択範囲の文字数とか単語数を表示
    範囲選択して g, C-g



■ コーディング用の話題(C/C++)


□ ctagsを使う

※ ctagsで出来ること:
    ctags は、C/C++ のソースコードで関数の定義位置にジャンプすることができる

(1) tagsファイルを作成

    # ソースファイルのあるディレクトリで「ctags -R」コマンドを打つ
    ctags -R

(2) vimでの使い方

    ・関数定義に飛ぶには、関数名にカーソルを合わせて「 C-[ 」と打つ。
    ・元の位置に戻るには、「 C-t 」と打つ



□ GNU global (gtags) を使う

※ gtagsで出来ること
    ctagsよりも多機能になったものらしい


(1) セットアップ

    # gtags コマンド
    yum install global
    
    # vi用設定
    mkdir ~/.vim/plugin  # なければ
    cp /usr/local/share/gtags/gtags.vim ~/.vim/plugin
    # ※ cp /usr/share/gtags/gtags.vim ~/.vim/plugin かも

(2) tagsファイルを作成
    
    # ソースファイルのあるディレクトリで gtags コマンドを打つ
    gtags
    
        ※ 処理中のログを出したければ「gtags -v」


(3) vimでの使い方

    # (1) 関数定義に飛ぶ   ※ 関数名の入力時は <Tab> を打つと補完される
    :Gtags func1
    
    # (2) 参照元を表示する  ※ 下にウィンドウが出来て結果が一覧される。
    #                          選択してEnterを押すと、その行へジャンプする。
    #                       ※ 出てきたウィンドウを閉じるときは C-w o が便利。
    :Gtags -r func1
    
    # (3) grepする
    :Gtags -g  xxxxx
    
    # (4) オブジェクトの一覧を出したい場合は次のようにする
    :Gtags -f %
    
    # (5) カーソル位置の文字の使われている箇所を一覧する
    :GtagsCursor
    
    # (6) 一覧を出したときに、「次の結果へ」移動したいときは「:cn」
    :cn    # 次へ
    :cp    # 前へ

    
    ※ ctagsだと "C-t" でジャンプ前の箇所に戻れるが、
        gtagsでその方法が不明
        
    ※ なので、
        ・定義位置に飛ぶのは ctags ( C-] ) で、
        ・参照位置に飛ぶのは gtags ( :Gtags -r ) で、
        という風に使い分けるか・・

(4) 設定
    次のように .vimrc に設定すると、カーソル位置の単語を
    
    map <F3>  :Gtags    <C-R><C-W><CR>  " 定義位置へ
    map <F4>  :Gtags -r <C-R><C-W><CR>  " 参照している箇所一覧
    map <F10> :Gtags -g <C-R><C-W><CR>  " grepする



■ コーディング用の話題(Ruby)

□ Vim/Ruby Configuration Files
    ⇒ gem でインストールできる

    インストール
        # root で
        gem install vim-ruby
            ⇒ vim-ruby-install.rb とうファイルが下記ディレクトリに配置される

                Windows : C:\Ruby\bin
                Linux   : /usr/bin/
        
        # インストールしたいユーザで
        ruby C:\Ruby\bin\vim-ruby-install.rb
            ⇒ インストールするディレクトリを聞かれるので、数字で選択
        
        .vimrc (or _gvimrc)  に、以下を記入
            filetype indent on
        
    出来ること
        ・補完機能
            変数名の後で . を打った後、C-x C-o
            
            ※ (Windows) 補完されてから BackSpaceを押したら固まった・・
               (Linux) うまく設定できてないっぽい
            
        ・スマートインデント
            end でインデントを戻してくれる

# ※ 上記プラグインに含まれている機能なので不要?
#□ matchit
#
#   ダウンロード
#       http://www.vim.org/scripts/script.php?script_id=39
#
#   インストール
#       ・解凍して出てきた matchit.vim を下記ディレクトリに配置
#           Windows : C:\Program Files\gvim\runtime\plugin
#           Linux   : /usr/share/vim/vim71
#       
#       ※ matchit.txt は、下記ディレクトリに置いてみた
#
#   出来ること
#       ・「%」打ったときに while, def, begin ⇔ end のカーソル移動
#          ※ HTMLとかでも使えるらしい
#
#


■ コーディング用の話題(HTML)

HTMLタグを閉じるのに便利なものが? (試してない)

    let g:closetag_html_style=1
    source ~/.vim/scripts/closetag.vim 

    http://nanasi.jp/articles/vim/closetag_vim.html




■ リンク集

□ ドキュメント

・vimのヘルプ日本語版
    http://www.kaoriya.net/vimdoc_j/
    
・vimのヘルプ日本語版2
    http://www.ac.cyberhome.ne.jp/~yakahaira/vimdoc/

□ tips

・ずんWiki
    http://www.kawaz.jp/pukiwiki/index.php?vim
    
・いろんなtips
    http://nanasi.jp/articles/howto/editing/external-program.html



あとで見るメモ

    Align
        http://nanasi.jp/articles/vim/align/align_vim_mapa.html
        
        ・変数宣言を整形
        ・マクロの行末揃えとか出来る
        とか。

    surround
        http://d.hatena.ne.jp/secondlife/20061225/1167032528
        
        ・カッコや引用符を書く、消す

    2nd life
        rails
            http://d.hatena.ne.jp/secondlife/20061222/1166781841
        refe
            http://d.hatena.ne.jp/secondlife/20070128/1169912371
            ・Rubyリファレンスマニュアル
        tips
            http://d.hatena.ne.jp/secondlife/20050718/1121615722


Q.
    Macで使いたいが、
    gem install vim-ruby がうまくいかない。  (gem update が必要だったけど、gem update がうまくいかなかった)

A. 
    このサイトに書いてあるようにやる
        http://d.hatena.ne.jp/shunsuk/20080802/1217684298
    
    # 確認
    vim --version | grep ruby
        +ruby だと有効、-ruby だと無効(デフォルトは無効)
    
    # アンインストール、インストール
    sudo port clean vim
    sudo port install vim +multibyte +ruby  
    
    # rubygems 入れる
    port install rb-rubygems
    
    # # vim-ruby 入れる
    # sudo gem install vim-ruby
    # sudo vim-ruby-install.rb
    
    # vim-ruby 入れる(上のだと入らないから・・・)
    git clone http://github.com/vim-ruby/vim-ruby.git
    cd vim-ruby
    vim -v  # => 7.3 であることを確認
    git checkout vim7.3
    rake package
    sudo gem install etc/package/vim-ruby-2011.09.26.gem 
    vim-ruby-install.rb 
    
    # ~/.vimrc には以下を書き加える
    syntax on
    
    
    # こういうのいちいち調べるのがめんどくさい
    
    


■ 未整理


□ 知りたいこと

・C の構文ファイルで「#if 0」で囲われた箇所はコメントとして認識されるが、
    「#if XXXXX」の XXXXXの部分をヘッダから読むか環境変数見たいので指定したら
    そこがコメントとして認識されるようにはならないだろうか。。
    ※ syntax, #define, #if 0, #else, #endif, c_no_if0
    
    あと、その箇所をファイルを開いたときに折り畳みするとか

・検索にマッチした部分を削除する
    ※ ハイライトされているのに1文字ずつ消してくっていうのはスマートではない

□ C-o, C-i
    C-o : より古いマークへジャンプ
    C-i : より新しいマークへジャンプ
    
    ⇒ これは、「検索をしてカーソルがジャンプしちゃったけど、検索前にいた場所に戻りたい」という使い方が出来て便利な気がする。


BackSpaceで文字が消したい








「ここは違う」、「ここはこうするといいよ」等あったら下記フォームから連絡ください。
※ 何も来なさすぎて寂しいので、雑談とかグチのメールでも歓迎です。

お名前
e-mail
本文