自分用のVim備忘録

自分用のGit備忘録 - kanonjiの日記に続けて、最近良く使ってるVimの備忘録。随時追加していきます。

viを起動したまま.vimrcの変更を反映したい

:source ~/.vimrc

$VIMRUNTIMEを確認したい

:echo $VIMRUNTIME

$VIMRUNTIMEvimの中で設定される環境変数らしい。.vimrcとかでは有効。

読み込んでるvimスクリプトプラグインを確認する

:scriptnames

カーソル下の括弧に対応した括弧に移動する

%

vimdoc-ja

Google サイト

swpファイルを削除しない限り、毎回どうするか聞いてくる

swpファイルがあった場合、読み込み専用で開いたり、復元したり、削除したりを選ぶように聞かれます。復元したらswpファイルは消えるかと思いきや、残ってるので毎回聞かれます。復元できたり、不要なものだったら、ちゃんと消さないとです。

復元はうまく出来ないこともあるので、復元しても上書き保存しないで、別名で保存してから、diffを見るのがいいみたい。でも面倒くさいな。もっと簡単にdiffが見れる方法があればいいのに。

インデントを整える(一応の整形)

gg=G

カーソルをファイルの先頭まで移動し=*1を最後まで適用する。

:filetype
filetype detection:ON  plugin:ON  indent:ON

この辺の設定が関わりがありそうです。よく把握出来てないんですが、/usr/share/vim/vim70/indent/perl.vimなどがロード出来てるとインデントの仕方がperl用のになったりする見たいです。これを使うためにはperlであると検出*2してないとダメっぽい。indent:ONはONじゃないと、そもそもインデントが出来ないのか、filetype毎のインデントが働かないのかどっちかとかかな?

Google サイト

くわしくはこの辺で。

ペーストモード

:set paste
:set nopaste

これすると編集モードが-- 挿入 ---- 挿入 (貼り付け) --になります。この状態だとautoindentsmartindentが有効でも、余計なインデントされずにコピーした時のまま、ペースト出来ます。
貼付けたら:set nopasteで戻す。じゃ無いと上記インデントが効きません。

改行コードを置換する

:%s/^M//gc

^MはCtrl+V Ctrl+Mで入力。

なぜかCtrl+Jが出来なかった
:%s/^@//gc

^MはCRを表すはずなので、LFを置換しようとCtrl+V Ctrl+Jをしたらなぜか^@が出てきた。調べてみるとこれはNULLを表すみたい。なぜだろう?

もう一つの入力方法としてCtrl+V x0aと16進数で入力する方法もあるけど、これでも^@が出る。

:set fileformat=mac
:%s/^J//gc

CRしか指定出来ないならと思い、まず改行コードを変えてみたがCtrl+V Ctrl+Jで^@が出るのは変わらなかった。更に謎なのがCtrl+V Ctrl+Mで^Jが出てきた。でも、パターン一致せず置換は出来なかった。

:set fileformat=unix
#上キーで履歴を出す
:%s/^M//gc

改行コードをLFに戻して、入力の履歴で:%s/^J//gcを得ようとしたら、どういうわけか^Mになっている。

うーん、よくわからない・・・
って、これ長いから別エントリーにしたほうが良かったかな。

vimバイナリエディターとして使う

vimでバイナリを表示し、値を変更したい - rderaログ
バイナリ編集は、以前にやりたかったけどその時は分からなかった。たまたま見つけたのでとりあえずリンクだけ。自分で一通りやってみたら、自分用にまとめ直すかも。

16進数で入力する

asciiで入力 Ctrl+V x61 a
Unicodeで入力 Ctrl+V u3042

filetypeを手動設定する

:set filetype=html

拡張子が.phpだけどほぼhtmlなテンプレートとかが、自動検出ではphp扱いになっててシンタックスハイライトとかインデント整形がうまく使えない時、とりあえず無理矢理にでもhtmlと認識して欲しい。

分割したウィンドウを最大化する

<C-W>_

分割したウィンドウを最小化する

1<C-W>_

分割したウィンドウを指定したサイズにする

6<C-W>_

例えば6行分にする。

分割したウィンドウを均等なサイズにする

<C-W>=

カーソルの下のファイルパスを開く

gf
<C-w>f      " 画面分割で開く
<C-w>gf    " 別タブで開く

1個前に開いてたファイルを開き直す

<C-^>  "1個前に開いていたファイルに戻るが、ブラウザの戻るの様にはならない。2回以上入力すると、今開いてるファイルと、1個前に開いてたファイルを交互に開く事になる。
<C-O>  "1個前のカーソル位置に戻る。ファイルを超えて戻れるので、結果的に1個前に開いていたファイルに戻れる。

複数のファイルを、画面分割で開く。

$ vim -o foo.* #:split
$ vim -O foo.* #:vsplit

foo.htmlとfoo.mayaaがあって、殆どの場合セットで開いて作業したいので。vim -o3などとすると、指定した数の分だけ分割するけど、数省略で開いた分だけ分割が一番便利だと思う。

$ vim -c bal foo.* #バッファーの数だけ分割して均等に並べるコマンドっぽい。
$ vim -c sn foo bar #:spは:split+:nextで、分割して片方を次のバッファーに切り替える。

ほかにもこんな方法で出来る。前者も含めて、Twitterで疑問をつぶやいたら教えてもらいました。
ただ、こっちの方法は若干使いにくいのでvim -oばかりになりそう。

ファイル内のタブ or スペースとその幅を揃える

:retab
:ret "省略形

ちゃんと確認してないけどexpandtabとかsofttabstopあたりの設定を見てやってくれている、と思う。

指定行までコピー(yank)する

y100G

カーソル位置から、ファイルの100行目までをコピー。

検索した文字を含む行を削除する

:%g/ダミーデータ/d

置換と同じような書き方が出来、検索した単語じゃなく、その単語を含む行そのものを削除する。

コード見ててこれは2行じゃなくても良いって思ったやつを直す

J

ノーマルモードでのコマンドです。

array(
  'foo' => array(  #この行にカーソルがある時に<code>J</code>を押す。
    1,3,5,7,
  )
);
array(
  'foo' => array(1,3,5,7,  #この様に次の行のインデントと改行が無くなり、2行が1行になる。
  )
);

文章では説明しにくいのでビフォーアフターの例。

array(
  'foo' => array(1,3,5,7,));

繰り返しJを押していくと、次の行がどんどん1行に連結していきます。

現在のキーバインドを確認する

:map
:nmap   " ノーマルモードだけ表示
:imap   " インサートモードだけ表示
:vmap   " ビジュアルモードだけ表示
:verbose nmap   " そのショートカットキーの定義元ファイル情報も表示
Vimで現在割り当てられているショートカットキーの一覧を見る - アインシュタインの電話番号

vimで置換の際に改行を入れる

:%s/&/&\r/gc

URLのクエリーストリングが長過ぎて見づらいから&で改行したかった。
Macでfileformat=unixになってるのに\nじゃなくて\rだった。そういうものなの?

置換する際のエスケープ

:%s/\/path\/to\/somewhere/replacement/gc
:%s;/path/to/somewhere;replacement;gc
:%s@/path/to/somewhere@replacement@gc

バックスラッシュでエスケープ出来るけど、区切り文字をセミコロンにすると、スラッシュのエスケープは不要になる。
区切り文字はセミコロンで説明してるところが多かったけど、試しに@もやってみたら出来たので、sedと同じ感じなのかもしれない。

ヤンクした後削除しても、ペーストする

"0p

ヤンクした後、削除をしたり、範囲選択してペーストしたりすると、削除した文字列がレジスタに書き込まれてしまいます。0レジスタというものがあり、これは削除時には書き込まれないので、レジスタを指定してペーストをするとうまくペースト出来る。ただ、コマンドが打ちにくいのが難点。

Vim でコピペするときの Tips - 反省はしても後悔はしないにてより詳しく、色々と解説されてます。

大文字・小文字を変換

~

通常モードで、大文字・小文字をトグル変換。

gu  # 小文字に変換
gU  # 大文字に変換
g~  # トグル変換

5単語まとめて大文字にするならgU5wの様に使います。

ビジュアルモードの場合はu, U, ~で選択部分が変換出来ます。

改行コードを変更する

:set fileformat=unix #LF
:set fileformat=mac #CR
:set fileformat=dos #CRLF

文字コードを変更する

:set fileencoding=utf-8
:set fileencoding=euc-jp
:set fileencoding=shift_jis
:set fileencoding=cp932

set済みかどうか確認する

:set expandtab?
:set tabstop?
:set tabstop " set tabstop=4の様に値をセットするタイプの場合、これでも確認出来る

コマンドから関数を呼ぶ

:call glob('~/.vimrc')                 " 呼ぶだけで戻り値は表示されたりしない
:echo glob('~/.vimrc')               " 戻り値を表示
:let filepath = glob('~/.vimrc')  " 戻り値を代入
:echo filepath                           " 代入した戻り値を表示

スクロール

Ctrl+u  " 半ページ上にスクロール
Ctrl+d  " 半ページ下にスクロール
Ctrl+b  " 1ページ上にスクロール
Ctrl+f  " 1ページ下にスクロール

段落移動

}  " 1個先の空行に移動
{  " 1個前の空行に移動

" 16色を実際に表示して、どんな見た目かを確認する
:so $VIMRUNTIME/syntax/colortest.vim

" highlightでどんな設定になっているかを確認する。長い
:so $VIMRUNTIME/syntax/hitest.vim

vimカラーの微調整時のまとめ。 - connvoi_tyouの日記

直前に開いていたファイルを開く

:sp #
:e #
<C-^>  " ノーマルモードで

今開いてるファイルのパス

%

ヤンクしている文字列で検索する

/のあと、"と打鍵します。これで、ヤンクしている文字列が/のあとに貼付けられます。

もう一つの解決方法は、/ではなくq/を用いて検索を開始することです。q/はq:同様にCommand Lineウインドウを開き、そこから検索を開始します。q/の直後はノーマルモードになっており、pなどでそのままヤンクしている文字列を貼付けることができます。

http://vim-users.jp/2010/11/hack180/

q/してペーストの方が、分かりやすいかな。

重複行を削除

vim7.2だと、下記コマンドで一発重複行を削除できる。
:sort u

peter's technical memo: vimで重複行を一括削除

findやgrepして得たファイルをvimで開く

$ vim -o `git grep -l foo -- path/to/grep`
$ vim -o `find . -name "*.txt"`
$ vim -o `grep -l foo -r pah/to/grep`

*1:インデント整形

*2:detection:ON