Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

Vimが本来もつ力を掘り下げる

$
0
0

注意

段取りが悪く書こうとしたことの3割程度しか書けておりません。
随時更新します。

動機

私はこれまでVimを軽量で高度なカスタマイズ可能なIDEとして使用してきました。
そのため、カスタマイズの方向性もIDEに近づける事を目指してきました。
しかし、カスタマイズを繰り返していくうちにプラグインを入れるまでもなく使用できる
Vimに本来備わっている機能群の多様さに気が付きました。

IDEの機能は、基本的に人間がするまでもなく機械的に仕事を私達が解釈し易いようにラッパーし、
ちょうどいいタイミングで自動で動作しいます。
いわば単純な作業を下請けしてくれるサポーターが常時横に居てくれるようなものと言っていいでしょう。

対してVimが提供するのはあくまでテキストを編集する機能であり、私達が任意で動作させる必要があります。
それはIDEのように人間の代わりに何かを勝手にやってくれるものではなく、
その用途を詳しく知るものが、効力を発揮する場面に用いて強力な力を発揮する
私達の手の延長といえるのではないでしょうか。

IDEではなくテキストエディタをあえてチョイスしている私たちは、これら手の延長をより深く理解することで、
特定の言語にとらわれることなく、テキストエディットを効率化することが可能です。

今回はそんなVimの側面について調べてみました。

結論

さていきなり結論ですが、この記事を読むのはいいですが

実践Vim 思考のスピードで編集しよう!

を読みましょう。貴方が本当にVim本来の機能を使って、より洗練されたエディットをしたいならば今すぐに購入すべき書籍です。
ですがそれでは記事にならないので、一応自分なりに咀嚼した内容を以下に記載します。

エディット力を高める機能

ファイル操作

Vimを使い始めの頃、GUIエディタのファイルメニューに相当するものが無いので私は相当混乱しました。
私は混乱を防ぐため、プラグインによりNERDTreeやVimFilterなどのファイラーを導入することで、
デフォルト機能を使わずにファイル操作を行っていました。
ファイラー系のプラグインはとても便利ですが、場合によっては標準のファイル操作の方がよっぽど早く操作できるときがあるのです。
あとサーバとかに入ったときにすぐ使えます。覚えておいて損はありません。

ファイルを開く

テキストエディタはテキストをエディットするプログラムなので、まずエディットの対象を開かねば話が始まりません。
ファイルを開くにはbash上でvim {file}で開きます。

しかし上記コマンドではVim起動時に指定したファイルしか開けません。
例えば貴方が100ファイルからなるプロジェクトを編集したいときにその1ファイルだけで事足りますか?
もちろん答えはNoです。

もし貴方がファイル色々触りたいときに、都度Vimを終了し、サイドVimを起動しているのであれば今すぐ:editを使ってください。
:editが長いと思う人は:eというショートカットコマンドが用意されているのでこちらを使用しましょう。
:editを使用するとVimを起動したディレクトリ(カレントディレクトリ)に存在するファイルを開くことができます。
ちなみにカレントディレクトリがどこを指しているかは:pwdで確認することが可能です。

もしもカレントディレクトリにどんなファイルがあるか解らないというのであれば、以下のオプションをセットしてみてください。
:edit <tab>というように:editの後にタブキーを押せば補完が表示されます。

:setnocompatible:setwildmenu

[ファイルを補完するGIF動画]()

補完を:setでいちいち設定せずに出したいときは.vimrcに以下を追加しておいてください

setnocompatiblesetwildmenu

なおファイルが多すぎるというときはファイルの前方と一致する文字列を打ち込めば補完候補が絞り込まれます。

相対パスでファイルを開く

さて先程はカレントディレクトリからファイルを開く方法でしたが、
もし編集したいファイルが深い階層にあったらいかがでしょうか?
例えば以下のようなディレクトリ構成があった際...

.
├── bar
│   ├── aaa
│   │   ├── xxx.html <-既に開いている
│   │   ├── yyy.html
│   │   └── zzz.html
│   └── bbb
└── foo

既にbar/aaa/xxx.htmlを開いていて、同じ階層上にあるyyy.htmlを開きたい場合どうするでしょう?
:edit bar/aaa/yyy.htmlを打ち込みますか?
いえ、それはナンセンスです。

xxx.htmlを開いている状態で:edit %:h<Tab>と押してみてください。
:edit bar/aaa/とファイルが展開されました。
これは%が現在開いているファイルのパスを意味しており、
:hが該当パスの親ディレクトリを指し示すキーワードだからです。
よって%:hを展開すればbar/aaa/という解が得られるのです。

[相対パスを開くGIF動画]()

新規にファイルを開く

先程は既存のファイルを開く方法をご紹介しましたが、
いまある既存ファイルだけでなく、新規ファイルを作成/編集するときもあります。
そんなときは:newコマンドです。そのままでわかりやすいですね。
また:newですとウィンドウを横分割して表示しますが、その他にも縦分割やタブで新規ファイルを表示する方法があります。

コマンド説明
:new新規ファイルを開く(横分割)
:vnew新規ファイルを開く(縦分割)
:tabnew新規ファイルを開く(タブ)

[新規にファイルを開くGIF動画]()

ファイルを保存する

新規作成したファイルを保存しようとして:write(:w)を実行していませんか?(私は実行してました)
Vimを覚えたての頃:wで保存できるよ。と教えられたので仕方ないかもしれませんね。
ところが:write(:w)は上書き保存のコマンドのため、新規ファイルに使用できないので注意です。
新規ファイルを保存するときは:saveを使いましょう。
なお:saveasで別名保存ができるので、ファイルコピーなどしたいときに便利です。

コマンド説明
:saveファイルを保存する
:saveasファイルを別名で保存する

なお保存先はカレントディレクトリとなるため、
相対パスで保存したいときなどには前述の%:hなんかで指定してあげてください。

ちなみに:newの時点では新しいファイルは作成されないという点についても言及しておきます。
:newは新規ファイルを作成するコマンドではなく新規バッファを作成するコマンドなのです。
バッファについては後術します。

編集し易いレイアウトを整える

Vimを始めた当初、ウィンドウやらタブやらの移動がどうにも馴染めないため、
いろんな記事で紹介されているキーバインドで押しやすくしていました。(実は最近までやってた)
<C-w>(ウィンドウ操作のPrefix)をsとか<Space>に割当したり、
gt(次のタブへ移動)をtlgT(前のタブへ移動)をthに割当したり。
ですがデフォルトをよく見てみると
キーバインドの統一感がでないとか、他のプラグインと干渉したりということがあって、
デフォルトのまま使うのが合理的だったりします。

ウィンドウを分割する

一つのウィンドウで編集に集中するのも良いですが、一つのファイルの複数箇所を見比べたり、
複数のファイルを同時に見たい場面などもあります。
そんな時はウィンドウを分割を分割しましょう。
:splitでウィンドウを横分割。:vsplitでウィンドウを縦分割できます。

コマンド短縮コマンドキーバインド説明
:split:sp<C-w>sウィンドウを横に分割する
:vsplit:vs<C-w>vウィンドウを縦に分割する

分割した後は以下のコマンドでウィンドウ間を移動しましょう。

コマンド説明
<C-w>wまたは <C-w><C-w>次のウィンドウへ移動
<C-w>j上のウィンドウへ移動
<C-w>k下のウィンドウへ移動
<C-w>h左のウィンドウへ移動
<C-w>l右のウィンドウへ移動

[ウィンドウを分割するGIF動画]()

サイズ変更は割愛します。

タブ

ウィンドウをいくつも分割してしまうと一度に表示できる領域が狭まってしまうため、
エディットに編集できなくなることがありますこんなときは<C-W>Tを押してください。
分割されたウィンドウに表示されていたファイルがタブで開かれます。

タブを開いた後で移動するには以下のコマンドを使用します。

コマンド短縮コマンドキーバインド説明
:tabnext:tabn{count}gt{count}で指定した番号のタブへ移動
:tabnext:tabngt次のタブへ移動
:tabprevious:tabpgT前のタブへ移動

[タブを開いて移動するGIF動画]()


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>