技術の犬小屋

Webプログラミングを餌に生きる犬のメモ帳

Posts in the Vim category

PHPを書いていたときは他に良いエディタが無かったから仕方なくVimを使ってたけど、Javaを書くときはEclipseでいいよね、ということでEclipseにVrapperを導入した。
 

Vrapperとは

EclipseのキーバインドをVimっぽくしてくれるEclipseのプラグインである。
 

Vrapperの導入方法

[ヘルプ]-[新規ソフトウェアのインストール]にて、[作業対象]に以下のURLを入力してインストールする。
http://vrapper.sourceforge.net/update-site/stable
 
インストールが終わると、Eclipseの上部メニューにVimのトグルボタンが追加されている。
ボタンがオンになっている間はVimのキーバインドが有効になる。
 

キーバインドの設定

続いて、EclipseのキーバインドとVimのキーバインドで重複しているものを取り除く作業を行う。
メニューの[ウィンドウ]-[設定]-[一般]-[キー]から[スキーム]を[デフォルト]から[Vim’s key bindings]に変更する。
ここで、キーバインドのリストからCtrl + vにバインドされているものを全てアンバインドする。このようにすることで、Vimの矩形選択のキーバインド(C-v)が利用可能になる。
 

.vrapperrcの作成と設定

Vimの.vimrcに相当する設定ファイルとして、Vrapperでは.vrapperrcが使える。
 

.vrapperrcの作成

ホームディレクトリ(C:\Users\ユーザ名)に.vrapperrcという名前のファイルを作成する。
 

.vrapperrcの設定

Vrapperでは厳密にはVimScriptは使用できないので、ここで設定できることは、キーマッピングやVrapper独自のプロパティである。
 
私の場合は.vrapperrcに以下のような設定を書いている。
 

set imd

 
この設定をすることで、インサートモードから抜けたときにIMEを自動的にオフにしてくれる。Kaoriya版Vimには標準で入っている機能なので誤操作を無くすためにも、なるべく設定しておきたい。
 

おまけ:クリップボードとレジスタ間で内容を受け渡したいとき

VimとVrapperには、無名レジスタ(*)が用意されており、クリップボードと無名レジスタ間で内容が共有されている。
つまり、ブラウザからコピーした内容をVrapper上でペーストしたいのであれば、"*pとすれば良い。逆にVrapperからヤンクした内容をブラウザ上で貼り付けたいのであれば、Vrapper上で"*yyとしてヤンクすれば良い。
 
 
以上
 
 
参考
Vrapper Vim-like editing in Eclipse
Non Title EclipseのプラグインVrapperで矩形選択を使う

仕事でMacVimでPHPを書いてるときに連番の配列を大量に作成したい場面があり、手入力が面倒なのでマクロでやろうと思ったが、やり方がすぐに出てこなかったので、一応メモしておく。
 

やり方

  • qa
  • aに対して記録開始

  • yy
  • 行コピー

  • p
  • 貼り付け

  • <Ctrl-a>
  • 対象にしたい連番をインクリメント

  • q
  • 記録終了

  • @a
  • 記録を再生する

 
@aの箇所は10@aなどに変えると「10回繰り返し」のようにアレンジすることが出来る。
 
 
以上
 
 
参考
Vimでマクロを使って連番の文を簡単に入力する方法 | Memo on the Web

仕事でMacVim-kaoriyaを使っている。間違って日本語入力の状態でノーマルモード中にh,j,k,lでカーソル移動を行おうとして、MacVim-kaoriyaが誤動作してしまい、辛かったので対処した。
 

対処方法

  • 書類ごとに入力ソースを自動的に切り替える
  • 最新のMacVim-kaoriyaを使用する

 
以下より、それぞれの方法について説明する。
 

書類ごとに入力ソースを自動的に切り替える

キーボード環境設定 を開き、 書類ごとに入力ソースを自動的に切り替える にチェックを付ける。
 
書類ごとに入力ソースを自動的に切り替える
 
このように設定することで、MacVimのノーマルモード時にブラウジングに入り、日本語入力に切り替えてしまったとしても、MacVimに戻ってきた時は英語入力に切り替わる。
 

最新のMacVim-kaoriyaを使用する

最新のMacVim-kaoriyaでは、インサートモードを抜けたときに自動的に英語入力に切り替わるようになっている。
 
 
以上
 
 
参考
独自の調査

Vimでファイル同士の差分比較やマージを行う方法を勉強したのでメモしておく。どうして専用ソフトではなく,Vimで行うのか,ということについてだが,Vimは環境に依存しないので,この方法さえ覚えてしまえば,どんな環境でも差分比較・マージが可能というメリットがあるためだ。
 

Vimで2つのファイルの差分を比較・表示する

Vimでは,diffsplitコマンドを使うことで,現在Vimで開いているファイルと,指定したファイルとの差分の部分をハイライトして,比較・表示することができる。この状態を「diffモード」と呼ぶ。
コマンドの書式は以下のようになる。
 

:vertical diffsplit 差分を取りたいファイル

 
例として,smokydog.txtというテキストファイルとの差分を取りたい場合は以下のようになる。
 

:vertical diffsplit smokydog.txt

 
コマンドの詳細について解説すると,verticalで画面を2つに分割し,diffsplitで差分の比較・表示を行っている。
 

2つのファイルの差分をマージする

Vimでは,「diffモード」の状態で,2つのファイルの差分のマージを行うこともできる。もう一方のファイルから差分を取り込むには,ハイライトにカーソルを合わせ,ノーマルモードでdoを入力する。逆に,もう一方のファイルに差分を取り込ませるにはdpを入力する。
 
doは「diff obtain」,dpは「diff put」と覚える。
 

ファイル間で違いがある場所へカーソルを移動する

Vimでは,「diffモード」の状態でファイル間で違いがある場所へ,瞬時にカーソルを移動させることができる。差分を下方向に検索してカーソルを移動するには,ノーマルモードで]cを入力する。逆に,差分を上方向に検索してカーソルを移動するには,[cを入力する。
 
 
以上
 
 
参考
2つのテキストファイルの差分をマージする 名無しのvim使い
2つのテキストファイルの差分を取る 名無しのvim使い

バイナリについて勉強したので忘れないようにメモしておく。
 

バイナリとは

パソコンで扱うファイルを分類すると,大きく以下の2つに分かれる。

  • テキストファイル
  • バイナリファイル

 

テキストファイルとは

文字を表すデータである。文字コード表に載っているデータだけが書かれているファイルを指す。
 

バイナリファイルとは

テキストファイル以外の全てのファイルを指す。
 

文字コードとは

コンピュータは0と1の組み合わせでしか情報を表現できないので,「文字」の情報を扱うためには,「0と1の組み合わせがどんな文字を表すか」というルールを決めておく必要がある。そのルールを文字コードと呼ぶ。
 
文字コードとは,どんなものかを知る為に,以下に文字コード表の一部を示す。
 
文字コード表
※こちらのページに載っている文字コード表の一部を引用させていただいた。
 
例として,アルファベットの「a」の文字コードを調べてみる。表を見ると,「a」は「6」の行の「1」の列にあることが分かる。よって,この文字コード表では,16進数の「61」というデータが「a」を表している。同様に「a」を2進数で表現する場合は「01100001」となる。
 
※通常,16進数は10進数と間違えないように頭に「0x」と付ける。よって,16進数は「0x61」のように書き表すことができる。
 
文字コードには様々な種類があり,日本語の文字が使える文字コードだけでも,JIS,Shift-JIS,EUC,UTF-16,UTF-8などがある。このような文字コードを作る元になったものとして,ASCII(アスキー)がある。
 

ASCIIと日本語文字コードの関係

ASCIIとは,1963年にアメリカ規格協会(ANSI)が定めた,情報交換用の文字コードの体系である。1967年に国際標準化機構(ISO)で定められた情報交換用符号の国際規格「ISO 646」とほぼ同じものである。7ビットで表現され,128種類のローマ字,数字,記号,制御コードで構成されている。実際にはコンピュータは1文字を8ビット(1バイト)で表現するため,256種類の文字を扱うことができるが,ASCIIが定めていない128文字分の拡張領域には,ンピュータメーカーや国によって異なる文字が収録されている。日本では,拡張領域にカナ文字を収録したコード体系が「JIS X 0201」として規格化されている。
 
この「JIS X 0201」が現存のJIS(日本工業規格)における最も古い文字コードである。JISとは,工業標準化法に基づき,日本工業標準調査会の答申を受けて,主務大臣が制定する工業標準であり,日本の国家標準の一つである。
「JIS X 0201」は,現在では主にShift_JISおよびEUC-JPの一部として用いられており,単独で用いられることはほとんどない。これらの文字コードは JIS X 0208の文字も含んでおり,JIS X 0208にはJIS X 0201にあるほぼすべての文字があるため文字が重複することとなる。この区別のため,JIS X 0201の文字をJIS X 0208の文字の半分の幅で表示することが多い。このため,これらの文字を俗に半角文字,特に片仮名を半角カナと呼ぶ事が多い。
 
文字コードの概要が理解できたところで,以下より,実際にバイナリを読んでみる。
 

実際にバイナリを読んでみる

今回は,Vimのxxdコマンドを使用してテキストをバイナリに変換する。
 

テキストからバイナリに変換する

Vimでテキストを開いた状態で,以下のコマンドを実行することで,バイナリへの変換を行うことができる。
 
:%!xxd
 

バイナリからテキストに変換する

Vimでバイナリを開いた状態で,以下のコマンドを実行することで,テキストへの変換を行うことができる。
 
:%!xxd -r
 

実際にバイナリを読んでみる

以下の内容が記述されたファイルをVimで開き,:%!xxdコマンドを実行する。
 

aaa
bbb
ccc

 
すると,以下のようにテキストがバイナリに変換される。
 
binary
 
上記画像の「0000000:」と「aaa..bbb..ccc..」は視認補助の為の情報なので,バイナリは「6161 610d 0a62 6262 0d0a 6363 630d 0a」の部分である。テキストの「a」はバイナリでは「61」,テキストの「b」はバイナリでは「62」,テキストの「c」はバイナリでは「63」という対応付けが行われている。
「0d」と「0a」は改行コードである。今回はWindowsマシンで作業をしたので,改行コードには「CR+LF」が用いられている。
 

改行コードとは

テキストファイル中で改行を意味する文字コードのことである。正確には,改行してカーソルを行頭に復帰する動作を指示するコードのことを指す。以下の表は改行コードとASCIIコードの対応表である。
 

記号 呼び名,別名 ASCIIコード マッチング
LF ラインフィード(Line Feed),ニューライン(New Line) 0A \n
CR キャリッジリターン(Carriage Return),リターン(Return) 0D \r

 
文字コード体系の種類には依存しないが,もともと「CR」(Carriage Return : 行頭復帰)と「LF」(Line Feed : 改行)の2つのコードが存在していたことから,WindowsではCR+LF,Mac OSではCR,UNIXではLFが使われている。
※Mac OS X以降では,Macの改行コードは「LF」になっている。
 

頻出する制御コード

バイナリファイルの中に頻繁に登場する制御コードとして以下の表に示すものが挙げられる。
 

頻出する制御コードの表
16進数 文字 説明
0x00 NUL 何も書かれていないことを表す空文字。C言語などでは文字列の終端に付けて,これ以降に文字列が続かないことを表す。
0x08 BS バックスペース。
0x09 HT 水平タブ。Tabキーで入力される。tab とは table の意味で,もともと表をつくるための文字である。
0x0A LF ラインフィード。元の意味は「次の行に進める」である。改行コードの一つ。
0x0D CR キャリッジリターン。元の意味は「印字ヘッドを行の先頭に戻す」である。改行コードの一つ。

 
上記は最低限,暗記しておきたい。
 

まとめ

  • ファイルには大きく分けて「テキスト」と「バイナリ」の2つがある
  • 「バイナリ」に文字コードのルールを適用したものが「テキスト」である
  • バイナリを読むには文字コード表を用いる
  • Vimではxxdコマンドによって,「テキスト」と「バイナリ」の相互変換ができる
  • 改行コードは,Windowsが「CR+LF」,Macが「CR」,Unixが「LF」である

 
 
以上
 
 
参考
コンピュータの仕組み ~テキストファイルとバイナリファイル~ | リスティング広告の運用代行ならカルテットコミュニケーションズ
ASCIIとJISローマ字―文字コード入門―
ASCIIとは (アスキーとは) [単語記事] – ニコニコ大百科
エスケープシーケンスとは – IT用語辞典 Weblio辞書
ASCIIとは 〔 アスキーコード 〕 【 US-ASCII 】 – 意味/解説/説明/定義 : IT用語辞典
改行コード – Wikipedia
改行コードの話
vimでバイナリを表示し、値を変更したい – rderaログ