メインコンテンツに移動

viについて

viエディターで編集するときのアイデア集

  1. うっかり vi が起動してしまいました。なんですかこれ?!助けてください
    1. ファイルを保存せずに終了する
      1. 【ESC】キーを押します。
      2. 【:q】【RETURN】と入力します。
    2. なんでもいいから、この結界から出て行きたい
      1. そのターミナルを、赤いボタンで消してください。
      2. パソコンの電源ケーブルを抜く,という手もありますよ.
    3. ファイルを保存して終了
      1. 本当に保存しても大丈夫か確認
      2. 【ESC】キーを押します。
      3. 【ZZ】と眠ります。

基本

viエディターは,キーボードにA-z,0-9とReturn, CTRL, ESC, TAB, Shiftキーしかなく,マウスはもちろんテレビの存在も怪しい(プリンターというかタイプライターで印刷して作業)する時代に作られました.ので,操作が非常に独特です:

  • 操作に使えるキーがないので,A-z,0-9は画面の操作に用いる.通常のエディターのように文字の入力には用いない. マウス?そんな動物に触るのは衛生的にだめだよ
  • 矢印キー↓→ などは, 当時存在しなかった.
  • 文字の入力は,特別に「入力モード」に切り替えてから入力する

というわけで,なれない人は文字を入力しようとして画面の操作を行ってしまうわけです.ただし,慣れてしまえばファンクションキーだのマウスだのに手を伸ばさなくて良いので,高速です.Windows以外のOSには,全てデフォルトで付属しているのでインストールは不要です.古いエディターを現代のPCで動かすと動作は軽快です.コマンドは英単語ですので,すぐに覚えられます.

基本は「入力モード」の入方と出方になるわけです.入力って英語でinsertですし, escapeって逃げるイメージがありますので

  • i   入力モードに入る
  • esc  入力モードから出る

下に新しい行を開くのはiじゃなくてoです. openとでも言いたいんでしょうね.上の行もあったと思うけど忘れましたわ.現代のPCは矢印キーとかマウスとかがありますので,上を覚えるだけで,およそ使えます.

いくつかのコマンドは, 次のルールに従っています:

  • [繰り返し数字]+コマンド1字+[操作対象]

繰り返し数字は,省略すれば1です. 操作対象は

  • コマンド1字を繰り返した場合,行を操作
  • word単位の場合w

です. で,1文字コマンドですが

  • 削除delete はd
  • 引用yank(コピー,といった方がピンとくるかも)は y
  • 入れ替えchangeはc
  • ペーストはp
  • 行へジャンプgoはG

例えば 3dd は3行削除になります.135Gで135行目にジャンプ. 7cwで7単語を入れ替え.

その他のコマンドは

  • 行の先頭に行くのは0, 末尾は$
  • / で正規表現検索
  • . でさっきのコマンドを再実行
  • undoはu
  • m+1文字 で場所マーク(a-zまで使えます).
    • 例えば ma コマンドで, 現在の場所を「a」と記憶
  • '+1文字  でマークした行
    • ’a で, マーク「a」の行にジャンプ
  • `+1文字  でマークした場所
    • `a で,マーク「a」の文字にジャンプ
  • :で特殊操作
    • :'a,'bs/元文字列/新文字列/g で, マークa行からマークb行までを検索置換します
      • 行の場所を1にするとファイルの先頭, $はファイルの末尾
      • 行の場所を. にすると現在行
      • 'ではなく`にすると行じゃなくて文字
    • :w でファイル保存
    • :q で編集破棄
  • CTRL+Fでforward-page, CTRL+Dでdownward-page
  • CTRL+Bでbackward-page, CTRL+Uでupward-page

複数画面で編集

  1. :sp ファイル名 で画面が水平に分かれる.
    • うっかり :vs ファイル名では水平に分かれて面倒
  2. 起動時に vi -o ファイル1 ファイル2 としてもOK    
       

  3. CTRL-W ↓ や  CTRL-W ↑ で移動
    • 下記のマウス有効で,クリックしたら移動にできる
  4. 数字CTRL-W+ や 数字CTRL-W― で枠サイズ調整
    • 下記のマウス有効で,棒掴んで調整できる    
       

マウス使う

  1. :set mouse=a
  2. :set ttymouse=xterm2

マウス有効の間は, マウス操作でコピー範囲を設定:

yキーでyankしたりdキーでdeleteできる.でもそれでは別のソフトウェア(メモ帳, ATOMとか)にコピーできないので,そのような操作をするときには :set mouse= で一旦無効化しないといけない:

マウスキャンセル

マウスの利用・不利用を一発で設定するコマンドを定義するには, .vimrc に追加する:

noremap <C-k> :set mouse=<Return>    
noremap <C-l> :set mouse=a<Return>

これで, CTRL-K でマウスなし, CTRL-L でマウス使用に切り替えることができる.

タブ画面で編集

  1. :tabnew ファイル名
  2. 起動時に vi -p ファイル1 ファイル2
  3. Tabにgoするのはgt とかgT    

折り畳み

プログラムが例えば次のように見えて便利:    
namespace mix           //{{{    
{    
namespace reg   //{{{    
{    
+----  8 行:Constants-------------------------------------------------------------------------------------    
+---- 88 行:Region::Region(base::Parameter* i_parm,sql::Connection* i_sql,logger:    
+----  6 行:Region::Region(const Region& obj)  // コピーコンストラクタ ---------------------    
+----  6 行:Region::~Region()  // デストラクタ-------------------------------------------------------    
+---- 78 行:int Region::Backup_Particle()    // 乱数の既存ファイルのバックアップ---------    
+---- 37 行:int Region::Backup_Random()    // 乱数をファイルに保存-----------------------    
+---- 32 行:void Region::Cell_Create()  // パラメータを読み込んで, セルを作成------------

マウスを使う時には下のように見える

基本的操作

折り畳みコマンド:

  • zm     全部折りたたむ
  • zR      全部広げる
  • zc       折りたたむ
  • zo       広げる,
  1. 設定方法:勝手に折りたたむ

    • $HOME/.vimrc にイカを記述
      • colorscheme     koehler    
        colorscheme peachpuff    
        set foldmethod=syntax    
        set foldlevel=1    
        set foldcolumn=3    
        syntax on
    • なんでか知らんが, JavaScriptやなんかはdefaultでは折りたたまないので
      • let javaScript_fold=1    
        let sh_fold_enabled=1
  2. 自分でマークを入れて折りたたむ

    • $HOME/.vimrc にイカを記述:
      • colorscheme     koehler    
        colorscheme peachpuff    
        set foldmethod=marker    
        set     foldlevel=1    
        syntax off
  3. プログラム中に折り畳みレベルを記述
    • Fortran     ! {{{    !}}}    
       例    
        interface add_action    !{{{    
                   module procedure add_velocityes_byID    
                   module procedure add_velocfityes_byRegion    
         end interface add_action !}}} 
    • C++         //{{{     //}}}    
       例    
      void Cell() // コンストラクタ{{{    
      {    
           for(base::Gases_t::iterator Gas=parm->Gases.begin(); Gas != parm->Gases.end(); Gas++) CellGas.Init();    
      } //}}}

文字が醜い

  1. http://mix-mplus-ipa.sourceforge.jp/download.html#migu1m などに変更
  2. 全角文字が崩れる    
     $HOME/.vimrc に set     ambiwidth=double

タブや行末が見たい

  1. 次を $HOME/.vimrc に記入する:
set list↲
set listchars=tab:»-,trail:-,nbsp:%,eol:↲↲
hi SpecialKey ctermfg=255 ctermbg=NONE↲
hi NonText ctermfg=187 ctermbg=NONE↲

   
でも,こうしていると,マウスでコピペするときに表示で使っている文字がコピーされるので注意.そのときにset nolist して対応すべし

カラースキーム

編集画面の色は, $HOME/.vimrc に

colorscheme blue

などと記入して変更します.とはいえ,どれがどんな色なのか?

blue
blueblueってこれ
darkblue
desert
ellford
habamax
koehler
lunaperche
pablo
murphy

 ほかにもあるけどめんど