|
1: 2017-03-23 (木) 05:03:43 yuji |
| + | #topicpath |
| + | #contents |
| | | |
| + | * vi, vimとは [#g116f9e1] |
| + | vi,vimは,UNIXに昔から標準的に使われているテキストエディタです。~ |
| + | viを基にして,機能を拡張したものがvim(vi improved)エディタ。 |
| + | |
| + | viは,Windowsの一般的なテキストエディタとは,かなり印象が違います。~ |
| + | 多少とっつきにくい面はあるんだけど,慣れてくると高速で編集作業が出来るようになる,不思議なテキストエディタです。 |
| + | |
| + | viを起動するには,単純に, |
| + | $ vi |
| + | と入力しても構わないし,またファイル名が決まっていれば(または,既に存在するファイルを開くのであれば), |
| + | $ vi ファイル名 |
| + | で使えます。 |
| + | |
| + | *よく使うvi,vimのコマンド [#vcdb4422] |
| + | |
| + | vi,vimは,一般的なテキストエディタと違い,''コマンドモード'',''入力モード''があり,モードを切り替えて使用します。(現在のモードがどっちだかが一見するとわからない)~ |
| + | 起動直後は,''コマンドモード''になっていて,''入力モード''への切り替えコマンドを入力すると文字の入力が出来るようになります。~ |
| + | ESCキーを押すといつでも''コマンドモード''に戻れます。 |
| + | |
| + | 操作がわからなくなったら,とりあえずESCキーを二回ほど押してみるのが良いです。 |
| + | |
| + | ''太字''を覚えればなんとかなります&wink; |
| + | ** ファイル操作 [#w36b7918] |
| + | |key|内容|h |
| + | |ZZ|上書き保存し,viを終了| |
| + | |:wq|上書き保存して,viを終了| |
| + | |'':x''|保存して,viを終了| |
| + | |'':w''|内容を保存| |
| + | |'':q!''|保存せずに終了| |
| + | |
| + | ** モード [#aa5ad41c] |
| + | |key|内容|h |
| + | |''i''|挿入モードへ| |
| + | |''a''|追加(カーソルの次から編集)| |
| + | |o|新しい行を追加し挿入モードへ| |
| + | |R|上書きモードへ| |
| + | |v|ビジュアルモードへ| |
| + | |Ctrl + v|矩形選択のビジュアルモードへ| |
| + | |''ESC''|入力モード -> コマンドモードに戻る| |
| + | |ctrl + [|入力モード -> コマンドモードに戻る| |
| + | |ctrl + z|vimを一時停止する| |
| + | |
| + | ** カーソル移動 [#p5c4022a] |
| + | |key|内容|h |
| + | |''k'',Ctrl + p|1行戻る| |
| + | |''j'',Ctrl +n|1行進む| |
| + | |''h'',BS|1文字戻る| |
| + | |''l'',SP|1文字進む| |
| + | |w|次の単語(Word)| |
| + | |e|次の単語| |
| + | |b|前の単語| |
| + | |f(文字)|カーソルがある行の(文字)に移動(Find)| |
| + | |F(文字)|カーソルがある行の(文字)に移動(逆向き)| |
| + | |0,^|行頭| |
| + | |$|行末| |
| + | |%|対応する括弧に移動| |
| + | |Ctrl + f|1画面(Up)| |
| + | |Ctrl + b|1画面(Down)| |
| + | |Ctrl + u|半画面上(Up)| |
| + | |Ctrl + d|半画面下(Down)| |
| + | |Ctrl + e|1行(Up)| |
| + | |Ctrl + y|1行(Down)| |
| + | |zt, z<Enter>|カーソルを画面の最初に| |
| + | |zz, z.|カーソル行を画面の中央に| |
| + | |zb, z-|カーソル行を画面の最後に| |
| + | |
| + | ** 行移動 [#cab1ecbf] |
| + | |key|内容|h |
| + | |gg|最初の行(1g)| |
| + | |88G|88行目| |
| + | |G|最終行| |
| + | |H|画面上の最初の行(Home)| |
| + | |M|画面上の中央の行(Middle)| |
| + | |L|画面上の最後の行(Last)| |
| + | |``|直前の行マークへ戻る| |
| + | |
| + | ** マーク [#j8061284] |
| + | |Ctrl + o|古いマークへジャンプ| |
| + | |Ctrl + i|新しいマークへジャンプ| |
| + | |ma|マークaを設定(a?z)| |
| + | |`a|マークaにジャンプ| |
| + | |'a|マークaの行頭にジャンプ| |
| + | |:marks|マーク一覧| |
| + | |
| + | ** 検索と置換 [#j29790ff] |
| + | |key|内容|h |
| + | |''/''|後方検索(.*[]^%/\?~$は,特別な意味をもつので「\.」のようにエスケープが必要)| |
| + | |?|前方検索| |
| + | |''n''|再検索| |
| + | |''N''|上方向に再検索| |
| + | |*|カーソル下の単語を検索| |
| + | |#|カーソル下の単語を検索(上方向に検索)| |
| + | |:%s/hage/hoge/g|単語の置換(hageをhogeへ置換)。%はファイル全体の意味。| |
| + | |
| + | ** 編集 [#z5304b42] |
| + | |key|内容|h |
| + | |.|直前の変更を繰り返す| |
| + | |u|Undo| |
| + | |Ctrl + r|Redo| |
| + | |''x''|カーソル位置の1文字を削除| |
| + | |X|カーソル左の1文字を削除| |
| + | |dw|1単語削除| |
| + | |''dd''|1行削除| |
| + | |D|行末まで削除(d$)| |
| + | |J|次の行をくっつける| |
| + | |
| + | ** コピー&ペースト [#o2312a32] |
| + | |key|内容|h |
| + | |yw|1単語コピー(yank)| |
| + | |Y,yy|今いる行をコピー(yank)| |
| + | |''p''|カーソルの場所に,ペースト| |
| + | |yy5p|現在の行をコピーし,下に5行追加する| |
| + | |gv|直前の選択範囲を再選択| |
| + | |v|visualモードへ(hjklで範囲選択)| |
| + | |V|行全体を選択してvisualモードへ| |
| + | |Ctrl + V|visualモードへ(矩形選択)| |
| + | |o,O|(visualモード中)選択範囲の四隅へ移動| |
| + | |
| + | ** 特殊文字 [#zab8bfc9] |
| + | |key|内容|h |
| + | |Ctrl + v return|改行文字の入力| |
| + | |Ctrl + v tab|Tab 文字の入力| |
| + | |
| + | ** ウィンドウ [#o2d79c51] |
| + | |key|内容|h |
| + | |:vsplit|画面を左右に分割する| |
| + | |:e filename|今いるWindowにファイルを開く(Edit)| |
| + | |:e test*.cc|ワイルドカードを指定してファイルを開く| |
| + | |Ctrl +w h|左のWindowへ移動| |
| + | |Ctrl + w l|右のWindowへ移動| |
| + | |
| + | ** バッファ [#dc6cd242] |
| + | |key|内容|h |
| + | |:buffers|編集中のバッファ一覧を表示| |
| + | |:bn|次のバッファに移動| |
| + | |:bd[elete]|バッファを削除| |
| + | |
| + | ** 単語補完 [#pa49a01f] |
| + | |key|内容|h |
| + | |Ctrl + p|単語補完(前方検索)| |
| + | |
| + | ** マクロ [#ca5ffa9f] |
| + | |key|内容| |
| + | |q<letter>|マクロの記録開始| |
| + | |q|マクロの記録停止| |
| + | |@<letter>|マクロの実行| |
| + | |
| + | ** レジスタ [#c05e4533] |
| + | |key|機能|h |
| + | |:reg|レジスタの一覧表示| |
| + | |Ctrl + r "|ヤンクした文字列をペースト| |
| + | |
| + | ** コマンドの意味 [#u20972e9] |
| + | |key|意味|h |
| + | |g|繰り返し| |
| + | |c|1回毎に確認| |
| + | |
| + | ** その他 [#jd134fd9] |
| + | |key|内容|h |
| + | |:!command|外部コマンドの実行| |
| + | |:|範囲選択中に : を入力すると,選択領域の範囲指定( ’<,’> )が自動で挿入された状態でコマンドモードに入る。これを置換に利用すると便利。&br; (例: :'<,'>s/old/new/g)| |
| + | |Ctrl + a|数値のインクリメント| |
| + | |Ctrl + x|数値のデクリメント| |
| + | |
| + | * tips [#w98af0ad] |
| + | |
| + | ** 行番号を表示 [#r545bb76] |
| + | 行番号を表示させるには,コマンドモードで, |
| + | :set nu |
| + | 逆に,行番号をを表示させないためには, |
| + | :set nonu |
| + | |
| + | ** 改行コードが誤認識されているとき [#c940fc57] |
| + | :set ff=dos #なんか「^M」がいっぱい出たとき |
| + | :set ff=unix |
| + | :set ff=mac #「^M」がいっぱい出て、かつ全部一行になってるとき |
| + | ffは,fileformatの略。 |
| + | |
| + | なお,dosとunixの改行コードが混在しているようなファイルについては,上のコマンドを実行してもうまくいかない場合がある。この場合は手作業で直すしかない。 |
| + | |
| + | ** 改行コードの自動認識 [#y62f84d1] |
| + | 以下を .vimrcに書いておく。 |
| + | set fileformats=unix,dos,mac |
| + | 新規ファイルの場合,fileformatsの最初の改行コードが使われるようなので好みにより順番を変える。 |
| + | |
| + | ** 文字コードが誤認識されているとき [#if168106] |
| + | 以下のようなコマンドで,編集中のファイルを指定した文字コードで開き直せる。 |
| + | :e ++enc=euc-jp |
| + | :e ++enc=sjis |
| + | :e ++enc=iso-2022-jp |
| + | しょっちゅう誤認識が起こるときは,以下を~/.vimrc(or %HOME%\_vimrc)に設定する。 |
| + | " 文字コードの自動認識 |
| + | if &encoding !=# 'utf-8' |
| + | set encoding=japan |
| + | set fileencoding=japan |
| + | endif |
| + | if has('iconv') |
| + | let s:enc_euc = 'euc-jp' |
| + | let s:enc_jis = 'iso-2022-jp' |
| + | " iconvがeucJP-msに対応しているかをチェック |
| + | if iconv("\x87\x64\x87\x6a", 'cp932', 'eucjp-ms') ==# "\xad\xc5\xad\xcb" |
| + | let s:enc_euc = 'eucjp-ms' |
| + | let s:enc_jis = 'iso-2022-jp-3' |
| + | " iconvがJISX0213に対応しているかをチェック |
| + | elseif iconv("\x87\x64\x87\x6a", 'cp932', 'euc-jisx0213') ==# "\xad\xc5\xad\xcb" |
| + | let s:enc_euc = 'euc-jisx0213' |
| + | let s:enc_jis = 'iso-2022-jp-3' |
| + | endif |
| + | " fileencodingsを構築 |
| + | if &encoding ==# 'utf-8' |
| + | let s:fileencodings_default = &fileencodings |
| + | let &fileencodings = s:enc_jis .','. s:enc_euc .',cp932' |
| + | let &fileencodings = &fileencodings .','. s:fileencodings_default |
| + | unlet s:fileencodings_default |
| + | else |
| + | let &fileencodings = &fileencodings .','. s:enc_jis |
| + | set fileencodings+=utf-8,ucs-2le,ucs-2 |
| + | if &encoding =~# '^\(euc-jp\|euc-jisx0213\|eucjp-ms\)$' |
| + | set fileencodings+=cp932 |
| + | set fileencodings-=euc-jp |
| + | set fileencodings-=euc-jisx0213 |
| + | set fileencodings-=eucjp-ms |
| + | let &encoding = s:enc_euc |
| + | let &fileencoding = s:enc_euc |
| + | else |
| + | let &fileencodings = &fileencodings .','. s:enc_euc |
| + | endif |
| + | endif |
| + | " 定数を処分 |
| + | unlet s:enc_euc |
| + | unlet s:enc_jis |
| + | endif |
| + | " 日本語を含まない場合は fileencoding に encoding を使うようにする |
| + | if has('autocmd') |
| + | function! AU_ReCheck_FENC() |
| + | if &fileencoding =~# 'iso-2022-jp' && search("[^\x01-\x7e]", 'n') == 0 |
| + | let &fileencoding=&encoding |
| + | endif |
| + | endfunction |
| + | autocmd BufReadPost * call AU_ReCheck_FENC() |
| + | endif |
| + | " 改行コードの自動認識 |
| + | set fileformats=unix,dos,mac |
| + | " □とか○の文字があってもカーソル位置がずれないようにする |
| + | if exists('&ambiwidth') |
| + | set ambiwidth=double |
| + | endif |
| + | |
| + | ** 文字コードを変更して保存する † [#g4721469] |
| + | cp932(Shift-JIS)にするには以下のようにする。 |
| + | :set fileencoding=cp932 |
| + | この状態だとまだ保存してないので,:wしてやれば文字コードを変更して保存になる。 |
| + | |
| + | ** ファイルの種類を指定したいとき [#acb580b6] |
| + | :set ft=html #htmlファイルとして色付け・インデントしたいとき |
| + | ftは,filetypeの略。 |
| + | |
| + | ファイルの先頭か末尾5行以内に, |
| + | vim:set ft=html: |
| + | などと書いておくと,読み込み時に自動的に種類を指定できるみたい。 |
| + | |
| + | ** 編集中のファイルをRubyで加工する [#u03fa4bd] |
| + | [範囲指定] !ruby を使う。ファイル全体なら, |
| + | :%!ruby -e 'print ARGF.read.gsub( /before:(.*) after:(.*)/, "\\1 => \\2" )' |
| + | とか。 |
| + | |
| + | 選択範囲だけ加工する場合は |
| + | :'<,'>!ruby ... |
| + | (vで選択中に:を押すと,'<,'>は自動で入力される。) |
| + | |
| + | ** キーボードマクロを使う [#k17595e5] |
| + | vimでは,qコマンドで一連のキー操作をレジスタに保存し,それを@コマンドで実行することができる。 |
| + | |
| + | 例えば,texで論文を書いていて,「true」や「my-func」のような識別子全てを,「\\|true|」「\\|my-func|」のように囲いたいときは,囲いたい単語にカーソルを合わせて, |
| + | qk (レジスタkに記録開始) |
| + | dw (単語の削除) |
| + | i (入力モードに入る) |
| + | \|| (囲い) |
| + | ESC (入力モードを抜ける) |
| + | h (一文字左へ) |
| + | P (ペースト) |
| + | q (記録終了) |
| + | とすると,「カーソルの下の単語を\| |で囲む」という一連の操作がレジスタkに保存される。 |
| + | |
| + | あとは,文章中の識別子のところで「@k」のように入力するとその単語が\\| |で囲まれる。 |
| + | |
| + | ** カーソルを点滅させない(gvim) [#z9d521c8] |
| + | set guicursor=a:blinkon0 |
| + | |
| + | ** カーソル下のファイル名を開く [#rd5fc9c5] |
| + | 例えば,hoge.txtという文字列にカーソルを合わせて,gfを押すとhoge.txtを編集できる。 |
| + | |
| + | ** abc <--> ABC [#i7a4d25e] |
| + | ~で,カーソル下の文字の大文字と小文字を切り替えることができる。 |
| + | |
| + | g~[motion]で,ある範囲の文字を一気に切り替えることができる。例えば,g~wで単語,g~$で行末までとか。 |
| + | |
| + | g~~で,現在行の大文字と小文字を切り替えることができる。 |
| + | |
| + | ** バイナリ編集 [#xf797208] |
| + | vimでバイナリを編集したい場合,よくある16進ダンプとそれのテキスト表示があると便利。 |
| + | |
| + | xxdを使って,バイナリ編集をする方法がある。(xxdは,MinGW等をインストールすると使えます。) |
| + | "バイナリ編集(xxd)モード(vim -bでの起動,もしくは *.binファイルを開くと自動処理する) |
| + | augroup BinaryXXD |
| + | autocmd! |
| + | autocmd BufReadPre *.bin let &binary =1 |
| + | autocmd BufReadPost * if &binary | silent %!xxd -g 1 |
| + | autocmd BufReadPost * set ft=xxd | endif |
| + | autocmd BufWritePre * if &binary | %!xxd -r | endif |
| + | autocmd BufWritePost * if &binary | silent %!xxd -g 1 |
| + | autocmd BufWritePost * set nomod | endif |
| + | augroup END |
| + | |
| + | ** 私が使用している設定ファイル [#m1c0e6d6] |
| + | #ref(.vimrc) |