読者です 読者をやめる 読者になる 読者になる

kick the base

好きな映画、音楽、マンガ、プログラム、デザイン、3DCG、ゲームのこと。

Vim: キーマッピング基礎3 - 画面の再描画、ファイルパス展開、ペーストモード、他のエディタで開く

Vim

コピペではなく自分自身で.vimrcを育てていこうシリーズ第4回目、キーマッピングのお話の続きです。

前回までのお話

  • 最終的なキーマッピング
  • デフォルト状態でVimを起動する方法
  • Vimの環境
  • 表記方法
  • 記事の見解

などは毎回書いてもしょうがないので、キーマッピングの最初の記事をご参照ください。

Vim: キーマッピング基礎1

今回解説する部分のキーマッピング

nnoremap <silent> <C-l> :<C-u>nohlsearch<CR><C-l>
cnoremap <expr> %% getcmdtype() == ':' ? expand('%:h').'/' : '%%'
set pastetoggle=<f5>
map <f6> :!open -a textedit %<CR>

<C-l>をカスタマイズする

<C-l>には画面の再描画がデフォルトでセットされていますが、それに加えて検索の強調表示無効化を付与する設定です。

<C-c><C-c>と同様、検索の強調表示無効化のもうひとつの手段として活用してください。

f:id:kickbase:20160930141735g:plain

設定のコードは以下の通りです。

nnoremap <silent> <C-l> :<C-u>nohlsearch<CR><C-l>

簡単に解説を行います。

コード 意味
<silent> エコーを省略
<C-u> 範囲指定のキャンセル

プロンプトで%%を入力すると現在編集中のバッファパスを展開する

cdlcdを変更せず、現在編集中のディレクトリを開いたり近い階層のファイルを開いたりするケースは非常に多いと思います。その際、本設定が役に立ちます。

デフォルトの挙動では%:hが本機能に割り当てられているのですが、入力しにくいので%%に割り当てたというわけです。様々なシーンで多用するコマンドなので、ぜひご活用ください。

cnoremap <expr> %% getcmdtype() == ':' ? expand('%:h').'/' : '%%'

下記動画ではsample.txtを編集中に同階層にあるnew_sample.txtを開く操作をしています。

f:id:kickbase:20160930141733g:plain

ペーストモードをトグルする

システムのクリップボードからVimにヤンクする場合、インデントがおかしくなる場合があります。*1これを防ぐため、<F5>キーでペーストモードをトグルできるようにします。

set pastetoggle=<f5>

下記動画ではCotEditorのテキストをシステムクリップボードにコピーし、それをインサートモードでVimに貼り付けるデモです。

  1. CotEditorでテキストを選択してコピー(command+C)
  2. インサートモードでシステムクリップボードからヤンクを行う(<C-r>*)と、インデントが崩れている
  3. uでアンドゥし、<F5>でペーストモードにする
  4. 再度インサートモードに入り、ヤンクを行うと正しいインデントで貼り付けられている

このような流れの動画です。

f:id:kickbase:20160930141734g:plain

<F5>キーを押した後にインサートモードに入ると-- INSERT (paste) --となっているのが分かるかと思います。この状態にしておけば、正しいインデントでシステムのクリップボードからペースト可能になります。

ちなみにペーストモードは使用するときのみオンにし、通常はオフにしておくのが望ましいので、インサートモードから抜けるときにペーストモードを自動的に解除するという設定も可能です。本記事はキーマッピングに関するものなので解説はしませんが、下記に紹介だけしておきます。

autocmd InsertLeave * set nopaste

現在編集しているファイルを他のエディタで開く

Vimで現在編集しているファイルを他のエディタで開く設定です。Vimからシステムクリップボードにコピーできないなどの特殊な環境下で役に立ちます。

ちなみに下記はMacの設定で、エディタはテキストエディットを指定しています。

map <f6> :!open -a textedit %<CR>

WindowsでCygwinを利用している方は下記のようになるでしょう。テキストエディタはnotepadです。

map <f6> :!cygstart notepad %<CR>

Vimでは%は現在のファイルを意味するので、!で外部プログラムを起動し、テキストエディタを指定して現在のファイルを開くという仕組みになります。

まとめ

今回は<C-l>のカスタマイズ、現在編集しているバッファパスの展開、ペーストモードのトグル、編集中のファイルを他のエディタで開く方法などを解説しました。

キーマッピング編は次回で最後です。お楽しみに。

*1:インデントが崩れる理由に関しては、こまかい話になるので割愛します