ホーム > タグ > lv2

lv2

Hack #226: 複数のキーワードを手軽にハイライトする

問題

vim でファイルを編集している時やログファイルを閲覧している時に特定のテキストを目立たせたいと思ったことはありませんか?
私はあります。
例えば以下のような場合です。

  • tcpdump の ログファイルを vim で閲覧していて特定の MACアドレス、IPアドレスを目立たせたい。
  • ソースコードを編集していて、特定のキーワードの出現を(ハイライトさせて)意識しつつ編集を進めたい。
  • fugitive.vim:Gblame コマンド(git blame)で特定の author を目立たせたい。

もちろん、 :Unite line 、あるいは / で検索してハイライトして目立たせる事は可能ですが、
複数の単語をハイライトさせたい場合は、 / では対応できません。

対処

quickhl.vim を使用すれば、手っ取り早く色を付けることができます。

動画を用意しました。 Youtube: quickhl.vim

※ 同様の事を目的としたプラグインとして、MultipleSearch 等があります。

インストール

quickhl.vim は vim.org や、github から入手可能です。
version 7.2 以上の vim で動作します。

Vundle を使用している場合は下記のコマンドでインストールできます。

:BundleInstall quickhl.vim

設定

quickhl.vim はデフォルトのキーマップを提供しませんので、ユーザーが .vimrc に設定する必要があります。
筆者オススメのキーマップは以下です。

nmap <Space>m <Plug>(quickhl-toggle)
xmap <Space>m <Plug>(quickhl-toggle)
nmap <Space>M <Plug>(quickhl-reset)
xmap <Space>M <Plug>(quickhl-reset)
nmap <Space>j <Plug>(quickhl-match)

上記の設定をした後、ノーマルモードで <Space>m を押すと、カーソル下の単語がハイライトされます。
同じ単語の上で、もう一度、 <Space>m を押すと、ハイライトがクリアされます。
すべてのハイライトをクリアしたい場合は、 <Space>M (スペースの後、大文字M)でクリアできます。

またビジュアルモードでテキストを選択して、 <Space>m を押すと、選択したテキストがハイライトされます。
複数行のテキストブロックのハイライトには対応していません。
ハイライトの追加削除は :QuickhlAdd , :QuickhlDel でも可能ですが、ハイライトしたい欲望は突然やってくるので、キーマップを設定して備えておくのがいいでしょう。

特定の単語を常にハイライトしたい場合は、 g:quickhl_keywords にキーワードを設定します。
例えば .vimrc に以下の様に設定します。

let g:quickhl_keywords = [
    \ "ujihisa",
    \ "tyru",
    \ "Sixeight",
    \ "t9md",
    \ "thinca",
    \ "Shougo",
    \ ]

その他、一時的に特定のバッファでハイライトを無効(Lock)する、 :QuickhlLock コマンド等も用意されています。
詳しくは :help quickhl で確認して下さい。

t9md

Vimテクニックバイブル紹介(Shougo版)

この記事について

この記事は、開発環境勉強会における「Vimテクニックバイブル」紹介スライドの完全版です。 「Vimテクニックバイブル」については、taku_oさんやmattnさんなども記事を書いていますが、 私の場合はできるだけ本の内容に触れたものにしています。 これを読んでVimテクニックバイブルを購入していただける人が増えれば、著者達にとって最高の喜びです。

Vimテクニックバイブルができた背景

以前にもブログの記事で触れていますが、Vim界には良質な記事や書籍が不足しています。 特に、まともにVim scriptを書ける人が書いた書籍がほとんどありません。 これはVim界の大きな損失であり、Vim scriptプログラマーが育たない大きな原因となっています。 私がVim勉強会に参加すると、必ずといっていいほど聞かれるのが 「Shougoさんは、Vimの書籍を書かないんですか?」ということです。 この声になかなか答えられないのは悲しいものがありました。

Vimテクニックバイブル

と、いうことで……今年ついにVimの書籍が刊行されます! 書名は「Vimテクニックバイブル」です。 中身は「Emacsテクニックバイブル」のVim版となっており、イメージカラーは当然Vimグリーンです。 そういえば、EmacsテクニックバイブルはEmacsブルー(パープル)でしたね。 キャッチコピーは、「unite.vimで進化する新しいVimの常識を教えます。あなたはVimの本当の姿を知っていますか?」 Emacsテクニックバイブルとは違い、unite.vimを全面に押し出しています。

執筆者紹介

執筆陣はかなり豪華です。おそらく、これだけの人達が一冊の書籍を作るために集まることはもうないでしょう。

taku_o

人気サイト「名無しのVim使い」の管理人です。雑誌にVimの記事を執筆したことがあります。 サイトで紹介しているだけあって、様々なプラグインについて、かなりの知見を持っています。

yukimi

章の基礎知識や用語の統一など、細かいところで手伝ってもらっています。Vim使いです。

mattn

webapi-vimやzencoding.vimの作者です。他にも細かなプラグインを作っています。 KaoriYaさんと同じく、昔からVimにパッチを多数送っており、Vimの内部実装や黒魔術に詳しいです。

thinca

quickrunやref.vim, scouter.vimなどの作者です。unite.vimのsourceやvital.vim, eskk.vimなどにも関わっています。 Vim scriptにかなり詳しいです。

fuenor

QFixHowm, QFixGrep, JPFormat.vimの作者で、Vim-UTF8を配布しています。 Windows環境での日本語の扱いについて詳しいです。

Shougo

neocomplcache, vimshell, vimproc, unite.vim, vimfilerなどを作っています。 メンテナンスしているプラグインが多すぎて、なかなか時間が足りないのが悩みです。Vimは環境だと思っています。

内容紹介

もう執筆がほぼ終わっているため、中身は確定しています。プラグインの紹介を中心とした豪華な内容となるようにしました。 紹介しているプラグインは定番からマイナーまで幅広く、作者自ら解説していることもあります。 まだ発売まで期間があるため、詳しい目次を挙げることはできませんが、以下のような内容が含まれています。

vimfiler

vimfilerの使い方や、キーマッピング、マニアックなところではvimfilerを用いた拡張リネーム機能について解説しています。

netrw

netrwによる遠隔地ファイル編集、netrwによるブックマーク、netrwによるファイル操作が解説されています。

quickrun

quickrunの使い方、各種オプション、設定方法について解説されています。

ref.vim

ref.vimの使い方、各種sourceについて解説されています。

vimshell(インタプリタ通信機能を含む)

vimshellの使い方、よく使われる内部コマンド、vimshellのインタプリタ通信機能を解説しています。 ちなみに、Emacsテクニックバイブルでは、eshellについて触れられていません。

Conque

Vimで端末を実現するプラグインであるConqueの使い方、vimshellとの違いについて解説しています。

skk.vim

SKKについて解説しています。eskk.vimも少しだけ書いてあります。それほどページはありません。

neocomplcache

neocomplcacheの使い方、設定方法、neocomplcacheのスニペット機能、スニペットの書き方、 neocomplcacheのsourceの作り方と、大変豪華な内容となっています。 以前Vim Hacksに書いた内容の完全版と言っても良いでしょう。

zencoding.vim

zencoding.vimの基本から、任意の言語への応用例まで挙げられています。

QFixHowm

QFixHowmの使い方、メモの作成方法、メモの検索、ToDo管理について解説されています。

QFixGrep

Windows環境のgrepの注意点についても解説されています。

JPFormat.vim

JPFormatによる日本語の整形方法について解説されています。

autodate.vim

webapi-vim

VimからWebサービスを扱う方法について解説されています。

project.vim

project.vimによるプロジェクト管理やproject.vimの設定方法について解説されています。

Vim scriptが分からない初心者でも安心!

Vimの設定や、Vim pluginについての解説を中心とした書籍となっていますが、 ある程度のVim scriptの知識は必要不可欠です。 そこで、次のような項目について解説しています。 これ以上の詳しい解説については、Vimのヘルプを参照してください。

:helpの読み方

Vimの:helpをすぐに引けるかどうかは、初心者と初級者を分ける大変重要なファクターとなっています。 この本では、Vimの:helpの使い方について解説しています。

Vim script基礎文法最速マスター(改訂版)

これは、thincaさんが以前ブログで書いていた「Vim script基礎文法最速マスター」の改訂版です。 Vim scriptについて一通り学ぶことができます。

マッピングについて

Vimのキーマッピングは大変ややこしいですが、詳しく解説しています。

オプションについて

Vimのオプションには落とし穴が多数あります。Vimのオプションにおける仕様について解説しています。

Vimプラグインの管理

Vimのプラグインをインストールするなら、パッケージマネージャは必要不可欠です。 定番のVundle, pathogenから、vimballに至るまで解説をしています。

テキストオブジェクト

最近のVimを語るにはなくてはならない機能です。 テキストオブジェクトの拡張についても触れられています。

QuickFix

grepやmakeには欠かせない機能です。

:autocmd

外部インタフェース

ちょっとレベルが高いですが、Perl, Pythonの外部インタフェースについて解説されています。

最近のVimといえば、unite.vimは外せないよね!

当然unite.vimについては、1つのChapterを贅沢に使用して解説しています。 Emacsテクニックバイブルはanything.elについて2つのChapterを使っているので、そちらよりは若干量が減ります。 それでも、30ページくらいはあるため、十分満足できると思います。 unite.vimの章では、次の内容を解説しています。 これを読めばあなたもunite.vimマスターに!

vimfiler, vimshellなどといった他のプラグインとの連携

unite.vimの有用なsource

カスタマイズ方法についての解説

unite.vimの各種オプションについて、解説しています。 マニアックなところでは、buffer-name-optionについての解説もあります。

source, kind, action, filterの解説

特にsourceを自作する場合、source, kind, action, filterの概念は重要です。それぞれの仕様について詳しく解説しています。 作者が自ら書いているため、情報が正確で安心です。

sourceの作り方まで載っている!

サンプルsourceの作り方が書いてあります。マニアックなところでは、非同期sourceの仕様についても書いています。

unite.vim Ver.2.2対応(一応)

一応最新版のunite.vimの仕様に準拠しています。残念ながら、あまりにも新しい機能は解説できていません。 不変的な情報に絞って解説しています。 現在開発中のunite.vim Ver.3.0について少しだけ触れています。

もちろん、Emacsの人達にもオススメ

EmacsテクニックバイブルがVimmerにも有用な本であったように、 当然VimテクニックバイブルはEmacsを使っている方々にもオススメです。 Emacsを使っている人も、異文化交流は重要です。 同じ環境で満足していたら、何も生まれません。 auto-complete.elもVimの補完機能を参考にしています。 つまり、Emacs使いであってもVimや他のエディタからも刺激を受けるべきなのです。 この本を読めば、最近のVimの機能やプラグインについて分かります。 例えば、unite.vimとanything.elの違いが分かります。 新人にVimを教えざるをえないときにも使えます。 さらに、一身上の理由により、Vimに乗り換えざるをえないときもVimテクニックバイブルの知識があれば安心ですね。

現在確定している情報

ページ数は384Pで、Emacsテクニックバイブルと同じです。 値段は¥2, 980+税です。基本的に技術書というのは、¥3000を越えると購入までのハードルが上がってしまいます。 ページをできるだけ減らしたこともあり、税抜きでなんとか¥3000は切ったのですが、若干Emacsテクニックバイブルより高くなってしまいました。 発売日は9月中旬予定ですが、詳しい日付けの確定はしていません。 目次については、八月中に確定する予定なので、九月には詳しい情報が出せるでしょう。 まだ発売まで時間があるので、しばらくお待ちください。

残念ながら載せられなかった内容

できるだけ、著名なプラグインは載せるように心がけましたが、 ページ数の都合やその他様々な理由により載せられなかったプラグインがあります。 ここではそれらについて紹介します。

VCSとの連携

VCSと連携できるプラグインとしては、git-vimやfugitive.vimがありますが、決定版と呼べるようなものがなかったためです。 vcs.vimが候補だったんですが、未完成でした。

shadow.vim

時間とページ数の都合が付きませんでした。

snipMate

neocomplcacheのスニペット機能で十分だったためです。解説する人もいませんでした。 ちなみに、snippetsEmuはページ数が足りませんでした。

echodoc

入れてもよかったんですが、他のTipsが削られすぎて入れる暇がありませんでした。

netrwについての詳しい解説

時間とページ数の都合がつきませんでした。 ただし、一部のTipsでnetrwの機能について触れられています。

metarw

使っている人があまりに少ないため削られました。metarwがやっていることは、vimfiler+unite.vimでできるようになる予定です。

vimprocの使い方について

書籍では簡単にvimprocについて触れていますが、さすがに詳しい解説はできませんでした。 想定読者にとっては難しすぎるからです。vimprocをバリバリ使えるような層では、Vim scriptから使い方を解読するのも簡単だと思います。

vital.vim

このプラグインは、プラグイン制作者のためのものです。この本の対象読者にはレベルが高すぎました。 それに、ページ数の余裕もありませんでした。

内容の陳腐化への懸念について

書籍は生物です。コンピュータに関する書籍は出たばかりのときに購入しておかないと、役に立つ前に時代遅れとなってしまうでしょう。 だからこの本が必要なら、発売されたらすぐに購入するのが適切です。特に、一度絶版になってしまったら取り返しがつきません。 本の売り上げが上がると、出版社に対するVimへの印象が良くなり、続編などが企画されるかもしれません:-)

特に私のプラグインは進化が早いため、本が出たらすぐに時代遅れとならないか心配してくれている人がいるようです。 はい。それは正しい指摘です。 ただ、私もそのことは分かっていました。だからわざと新しすぎる機能や、あまり使われない機能については本の中では解説せず、 「適時:helpを参照してください」ということになっています。できるだけ不変であろうことについて解説するようにしています。 それでも現在の実装と齟齬がでてきてしまった場合は、正誤表にて何かしらのフォローをする予定です。

「:helpに全部書いてあるから書籍は必要ない」という意見について

これはある意味事実です。だからこそ、本の対象とする読者は「Vimの基本的な操作や設定はできるが、:helpを自在に引くことはできない層」なのです。 :helpはリファレンスマニュアル的であり、分からない語句を検索するときに使います。 初心者が通読するには向いていません。 本というのは初心者が参照しやすいように、重要な情報をふるい分けることに価値があると考えています。

ただし、私が自分の記事の中で気をつけたのは、できるだけ「設計思想や使い方について解説をする」ことです。 これは:helpに書いていないことが多いうえに、内容が陳腐化することも少ないと考えました。 だから、ヘルプを自由自在に参照することができる、レベルが高いVim使いにとっても役立つ書籍だとは思います。 これが本当かどうかは、自分の目で本を見て確認してください。

なぜ「Vimテクニックバイブル」はVim scriptを学ぶ本ではないのか

それは需要がないからです。考えてみてください。あなたの周囲にVim scriptをバリバリ書けるような人はいますか? Vimが好きだから、Vim scriptを本格的に学びたいと考えている人はいますか? まずいないでしょう。「Vimテクニックバイブル」の内容ですら出版社からはリスクがあると考えられている現状において、 日本でVim scriptを学ぶための書籍が出る確率は0です。おそらく売れません。 「Vimテクニックバイブル」にはVim scriptの解説がある程度書いてあります。 しかし、一流のVim scripterになるための道はまだまだ険しいのです。

それでもVim script本の構想を諦めきれない場合は、まず「Vimテクニックバイブル」を購入し、その本に書いてあることを全てマスターしてください。 さらに「Vimテクニックバイブル」を周囲に宣伝し、全国のVimmerのVimレベルを上昇させてください。 その暁には、Vim script本の出版リスクは低減され、いつの日か発売されるかもしれません。

オマケ

今後、vim-users.jpで「Vimテクニックバイブル」に関する何かが掲載されるかもしれません。こうご期待! ちなみに、Vimテクニックバイブルを購入してもらった場合、勉強会でShougoのサインが貰えるかもしれませんよ!

Shougo

Hack #223: テキストを直感的に移動、複製する

textmanip.vim を使えば、選択したテキストブロックを、直感的に移動、複製する事ができるようになります。

と書いても、「よくわからない」という反応が殆どだと思いますので、動画を用意してみました。

Youtube: textmanip.vim

インストール

textmanip.vim は vim.org や、github から入手可能です。

また Vundle でもインストール可能です。

:BundleInstall t9md/vim-textmanip

設定

textmanip.vim はデフォルトのキーマップを自動で設定しませんのでユーザーが設定する必要があります。
筆者オススメのキーマップは下記です。vimrc に設定します。

" 選択したテキストの移動
vmap <C-j> <Plug>(Textmanip.move_selection_down)
vmap <C-k> <Plug>(Textmanip.move_selection_up)
vmap <C-h> <Plug>(Textmanip.move_selection_left)
vmap <C-l> <Plug>(Textmanip.move_selection_right)

" 行の複製
vmap <M-d> <Plug>(Textmanip.duplicate_selection_v)
nmap <M-d> <Plug>(Textmanip.duplicate_selection_n)

その後なんでもいいので、テキストをビジュアルモードで選択し、コントロールキーを押したまま, hjlk を入力してみて下さい。

モノのように移動できましたよね?楽ですよね?便利ですよね?

<M-d> を押すと、選択したテキストが下方向に複製されます。
ノーマルモードで <M-d> を入力すると、カーソルのある行が複製されます。
<M-d>Altキー を押しながら d です。
Mac ユーザーの人は D-d として、 COMMANDキー を押しながら d に設定するといいかもしれません。

※ 本当は C-d を使いたかったのですが、ノーマルモードでの半ページスクロールとキーが被ってしまいます。
※ ビジュアルモードのみ vmap <C-d> <Plug>(Textmanip.duplicate_selection_v) と設定するのも一つの手です。

ユースケース1

Markdown では整形済みテキスト(preブロック)をインデントで表現しますので、複数行をインデントする事がよくあります。

インデントしたいテキストを選択して、<C-l>を数回押して、右にずらします。

ユースケース2

メソッド or 関数を別の引数で複数回呼び出すコードを書く場合を考えます。
例えば次のような関数呼出しがあり、

some_method("a", 1000)

下記のように引数を変えて複数回呼び出したいとします。

some_method("a", 1000)
some_method("b", 2000)
some_method("c", 3000)

まず、some_method("a", 1000)の行にカーソルを合わせます。
<M-d>を2回押して、行を複製します。
あとは引数を微修正すれば完了です。

t9md

Hack #215: Vundle で plugin をモダンに管理する

みなさんは増え続ける plugin のどのように管理されていますか。 pathogen+submodule を使う方法でしょうか。それとも未来に生き VimJolt を使用されているのでしょうか。

今回はモダンな plugin 管理方法として、Vundle を使った方法をご紹介します。

Vundle は Ruby on Rails 3 で採用されている、Gem 管理システム Bundler に影響を受けた、plugin 管理システムです。

開発は Github 上で行われています。 https://github.com/gmarik/vundle

導入

導入は以下の様に ~/.vim にリポジトリを clone すると完了します。

$ git clone http://github.com/gmarik/vundle.git ~/.vim/vundle.git

ドットファイルを git で管理されている方は、submodule として取り込んで下さい。

plugin の管理

plugin の管理は以下の様に .vimrc に Bundle ‘plugin name’ と記述することで行います。

set nocompatible
filetype off                   " (1)

set rtp+=~/.vim/vundle.git/    " (2)
call vundle#rc()               " (3)

" original repos on github
Bundle 'tpope/vim-fugitive'

" vim-scripts repos
Bundle 'rails.vim'

" non github repos
Bundle 'git://git.wincent.com/command-t.git'

filetype plugin indent on     " (5)

特徴的なのは (1) で filetype を一度 off にしている点です。 Vundle の処理が終り次第、(5) で ftplugin と indent を読み込むように指定しています。

(2), (3) で Vundle を初期化し、Bundle ‘plugin name’ を書くことで、plugin を読み込む準備が完了します。

Bundle コマンド

Github 上のリポジトリから取得する場合

Bundle 'user_name/repository_name'

の様に、Github のユーザ名とリポジトリ名を指定します。

vim-scripts 上のリポジトリから取得する場合

Bundle 'script_name'

の様に、plugin の名前を指定します。

それ以外の git リポジトリから取得する場合

Bundle 'git://repository_url'

の様に、Git リポジトリ のフルパスを指定します。

plugin の管理

plugin のインストールには、:BundleInstall コマンドを使用します。 先程、.vimrc に Bundle ‘name’ と記述した plugin が自動的に取得され、インストールまで行われます。

:BundleInstall

また、既にインストールされている plugin をアップデートするには、 :BundleInstall! コマンドを利用します。

:BundleInstall!

plugin を検索して、インタラクティブに管理することも出来ます。

:Bundles unite

上記のコマンドを実行すると、検索結果が split されて表示されます。リストから目的の plugin を選択し、インストール、削除などが行えます。

ドキュメント

以下のようにしてヘルプを生成します。

:helptags ~/.vim/vundle.git/doc

生成したヘルプは通常通り以下のように引くことが出来ます

:help vundle

参照

Sixeight

Hack #211: Haskellでimportするモジュールや関数をその場で調べつつ入力する

問題

Haskellで、標準添付ライブラリを含むなんらかの外部モジュールを利用するためにはimport文を記述する必要があります。例えばData.ListモジュールのunionとunionByという関数を使用するためには、

import Data.List (union, unionBy)

と記述します。また、Data.Listの全ての関数をLという名前に限定してimportするには、import qualified ~ as文を使います。

import qualified Data.List as L

いずれにせよ、importするためには事前に

  • importするモジュール名
  • (必要に応じて) そのモジュールからimportする関数名

を知っておく必要があります。非常に面倒な作業です。

解決

eagletmtさんの開発した、neco-ghcというVimプラギンを導入します。

Auto completion with neco-ghc

Auto completion with neco-ghc

Auto completion with neco-ghc

上記画像を見ていただければ、説明するまでもないでしょう。

import<space>

まで打鍵した時点で、自動でモジュールの一覧が補完候補に現れます。括弧を書くと、自動でそのモジュールの関数一覧が補完候補に現れます。これらの動作はかなり高速です。

また、importした関数が地の文で補完可能となります。このとき、どのモジュール由来の関数なのかも分かります。至れりつくせりです。

参考

Haskellのimport文についての仕様はHaskell 2010 Language Reportをご覧ください。なお、neco-ghcがこの仕様のすべてを満たしている保証はありませんが、問題を発見し次第github上でpull requestを送っていただけたりすると大変助かります。

ujihisa

Hack #209: Vim で Ruby on Rails の開発を行なう

今回は rails.vim を紹介します。 rails.vim は Ruby on Rails 開発者には必須の Plugin です。
各所で紹介されている有名な Plugin ですが、導入されていない方は 、4 月からの仕事に向けて是非導入を検討してください。

http://www.vim.org/scripts/script.php?script_id=1567

用途は主に 3 種類あります。

rails コマンド、Rake の代用

例えば、Ruby on Rails のプロジェクトディレクトリで、以下のように打鍵すると Controller の作成が行えます。

:Rgenerate controller names index new create

他にも :Rake や :Rserver, :Rlog, :Rails などが定義されています。

ファイラとしての rails.vim

rails.vim では、Alternate Files, Related Files という概念が導入されています。
以下にhelp (:help rails) から例を引用します。

Current file Alternate fileRelated file ~
model unit testschema definition
controller (in method) functional testtemplate (view)
template (view) functional testcontroller (jump to method)
migration previous migrationnext migration
config/database.yml config/routes.rbconfig/environments/*.rb

現在開いているファイルが Model だった場合、Alternate file は Unit Test、Related file は schema definition (db/schema.rb) という意味です。

移動には :A, :R というコマンドを使用します。:A は Alternate file への移動、:R は Related file への移動が行えます。
また、ファイルの開き方によって以下の5種類のコマンドが定義されています。:A, :R 共通です。

:AE:A と等価、現在の Window に開く
:ASWindow を分割して開く
:AVWindow を縦に分割して開く
:AT新しい Tab に開く
:AD現在の Buffer に展開する

ほかにも、:find や、:Rfind といった便利なコマンドがたくさん用意されています。

Syntax highlight や、略語の追加

Ruby on Rails での開発を助ける様々な設定が追加されます。
Syntax highlight に始まり、便利な略語、gf の拡張など、かゆいところに手の届く Plugin と言えます。

以下に help より略語の一部を引用します。

rp(render :partial =>
rp(render :partial =>
vs(validates_size_of
pa[params
AR::ActionRecord
:a:action =>

まとめ

優れた Plugin には優れたドキュメントが用意されています。
:help rails に全てが集約されていますので、使用される方は通読することをお勧めします。

Sixeight

Hack #208: 英語を正確に素早く入力する

問題

コミットログを書く、メールを書く、仕様を記述する、その他一般の自然言語で文書を記述するとき、もっとも頻繁に使われる言語は英語でしょう。英語を正確にかつ素早く入力することができれば、間接的にあなたの開発速度を高めることにつながるでしょう。これをVimでどのように支援できるのでしょうか。

Hack #72: 英語の誤入力を防ぐで、一旦英単語を入力してから、その英単語が正しかったか誤っていたかを判別し、そして容易に訂正する方法を紹介しました。今回はこれに加えて、どのようにして 速く 入力できるようにするかということについてに焦点をあてます。

解決

neco-lookというVimプラギンを導入します。

http://www.vim.org/scripts/script.php?script_id=3440

Auto completion with neco-look

入力途中の英単語から得られる補完候補を出します。かなり速くサクサク動きます。

neco-lookはneocomplcacheとlookコマンドに依存しています。lookコマンドは、Mac OS XのようなBSD系OSなら最初から/usr/bin/lookなどにあるはずです。

ujihisa

Hack #203: 定義されているマッピングを調べる

定義されているマッピングを調べたくなった時はないでしょうか。

  1. このプラグインが作ったバッファではどんなマッピングが定義されているのか
  2. 変なマッピングが定義されていないか
  3. Vimプラグインの作者と会話していてマッピングを調べるように言われた
  4. etc.

様々なケースで必要になってきます。(大半の人にとっては1のケースでしょうが)
どうやって調べればいいでしょうか。

:AllMaps

:AllMapsを使います。
次のコードを.vimrcに貼り付けましょう。

command!
\   -nargs=* -complete=mapping
\   AllMaps
\   map <args> | map! <args> | lmap <args>

kana氏の.vimrcに定義されていた:Allmapにインスパイアされたのでそちらも興味があれば参照してください。

使い方

" 全てのマッピングを表示
:AllMaps
" 冒頭で言った1のケースのように現在のバッファで定義されたマッピングのみ表示
:AllMaps <buffer>
" どのスクリプトで定義されたかの情報も含め表示
:verbose AllMaps <buffer>

短くシンプルながらも他のExコマンドと組み合わせることで効果を無限大に発揮できるExコマンドです。

:Capture

また作者が作った:CaptureというExコマンドがあります。
引数に指定したExコマンドを実行し、
コマンドラインへの出力をバッファに表示するというものです。
出力から検索したい場合などに便利です。
(筆者のブログの記事も参照してください)

command!
\   -nargs=+ -complete=command
\   Capture
\   call s:cmd_capture(<q-args>)

function! s:cmd_capture(q_args) "{{{
    redir => output
    silent execute a:q_args
    redir END
    let output = substitute(output, '^\n\+', '', '')

    belowright new

    silent file `=printf('[Capture: %s]', a:q_args)`
    setlocal buftype=nofile bufhidden=unload noswapfile nobuflisted
    call setline(1, split(output, '\n'))
endfunction "}}}

このExコマンドを使えば次のようにしてバッファに出力を書き込むことができます。

" 全てのマッピングをバッファに書き込む (/コマンドで検索できる)
:Capture AllMaps <buffer>

もう少し:Captureについて (vimshell)

vimshellではコマンドラインでの入力で先頭に:をつけるとVimスクリプトのExコマンドだと解釈してくれます。
これはvexeという内部コマンドを使っているので興味があればそちらも参照してください。
(以下$がvimshellのプロンプトだとします)

$ cd    # ホームディレクトリに移動
$ ls    # /bin/lsを実行 (実際にはlsは内部コマンドで、それが/bin/lsを呼び出しているようです)
bin git
$ :ls   # :lsを実行。バッファリストを表示
1  a   "~/memo/todo.txt"      line 0
3  a   "~/.vimrc"             line 0

とても便利でクールですね。

もう少し:Captureについて (unite.vim)

unite.vimのunite-outputというsource(:help unite-sources)を使えば
Vimスクリプトの出力をuniteバッファに取り込み、絞り込むことができます。
詳しくは:help unite-source-outputを参照してください。

tyru

Hack #202: 自動的にディレクトリを作成する

Vim で新しいファイルの編集を始めるとき、そのファイルがあるべきディレクトリが存在しないことがあります。この状態だと、Vim はファイルを保存することができません。 ただし、Vim に設定を追加することで自動的にディレクトリを作成することが可能です。

設定

ファイルを開いた際にディレクトリを作成する設定もありますが、そうすると試しに開いて結局保存しなかった場合にディレクトリだけ残ってしまいます。ここでは、保存する際に同時にディレクトリを作成する設定を紹介します。

augroup vimrc-auto-mkdir  " {{{
  autocmd!
  autocmd BufWritePre * call s:auto_mkdir(expand('<afile>:p:h'))
  function! s:auto_mkdir(dir)  " {{{
    if !isdirectory(a:dir)
      call mkdir(iconv(a:dir, &encoding, &termencoding), 'p')
    endif
  endfunction  " }}}
augroup END  " }}}

保存直前に、ファイルを保存すべきディレクトリがあるかをチェックして、ない場合に作成しています。

これだと、すでにあるディレクトリ名と間違えてファイルを開いていた場合でも気付かないうちに生成されてしまう場合があります。ディレクトリを作るかどうか確認する処理を入れることも可能です。

augroup vimrc-auto-mkdir  " {{{
  autocmd!
  autocmd BufWritePre * call s:auto_mkdir(expand('<afile>:p:h'), v:cmdbang)
  function! s:auto_mkdir(dir, force)  " {{{
    if !isdirectory(a:dir) && (a:force ||
    \    input(printf('"%s" does not exist. Create? [y/N]', a:dir)) =~? '^y\%[es]$')
      call mkdir(iconv(a:dir, &encoding, &termencoding), 'p')
    endif
  endfunction  " }}}
augroup END  " }}}
thinca

Hack #199: :helpに慣れ親しむ

タグ名の規則を知らないと引けない

さて、少しだけHack #45のおさらいです。

関数は「()」を末尾に持つタグを持っています。
オプションは「’(シングルクォート)」で囲まれたタグを持っています。
Exコマンドは先頭に「:(コロン)」を持つタグを持っています。

また英語版以外のhelpが用意されている場合はタグ名に続けて「@ja」のように@ + {各言語特有の2文字の文字列} が続きます。 しかし英語版とその他の言語といったように両方存在した場合は 英語版のタグにも@enという文字列が末尾につきます。

ちなみにこの2文字は「help.jax」だったら「ja」、 「help.frx」だったら「@fr」のように 各言語のhelpファイルの拡張子から末尾のxを取った2文字です。 英語だけは例外で「.txt」という拡張子のhelpファイルです。

コマンド(!= Exコマンド)はだいたい次のような規則になっています。

{モード}_[CTRL-]{キー}

またさらに{キー}の部分は次のようになっています。

{キー1}
{キー1}_{キー2}
{キー1}_{キー2}_{キー3}
...

のように押すキーの数だけ以下続いていきます。

実践的な例

さてこの記事では少し進んだ実践的な例を出すことにしましょう。 例えば:help v_<という項目は

  1. ヴィジュアルモードの(v)
  2. <というキー

で実行されるコマンドということです。

また、:help i_CTRL-R_=という項目は

  1. インサートモードの(i)
  2. <C-r>=というキー

で実行されるコマンドということです。 コントロールキーは「CTRL-」で表されます。 また2個以上キーが続く場合はこのように「_(アンダーバー)」で区切られます。

コマンドラインではワイルドカードを使うことができ、 <Tab>を押した時点でマッチする候補をリストアップしてくれます。
(この際の挙動は'wildchar', 'wildmode''wildmenu'の値に強く依存します。以下この記事では'wildchar'<Tab>'wildmode'"full"'wildmenu'がオンだと仮定します)

「buf」を含む関数

:help *buf*()<Tab>

関数は「()」を末尾に持つタグを持っています。

「wild」を含むオプション

:help '*wild*'<Tab>

前のと同じですね。 オプションは「’(シングルクォート)」で囲まれたタグを持っています。

頭が「:Neo」で始まるExコマンドを日本語版helpのみから

:help :Neo*@ja<Tab>

Exコマンドは先頭に「:(コロン)」を持つタグを持っています。 @ + 2文字の文字列を末尾に持ちます。

<C-d>

コマンドラインで<Tab>の代わりに<C-d>を押すと カーソルより前のパターンに一致する名前を コマンドラインに一覧表示してくれます。 例えば前述の頭が「:Neo」で始まるExコマンドを日本語版helpのみから探し出そうとした場合、 <Tab><C-d>では以下のような違いがあります。

最初の状態

<Tab>

<C-d>

<C-d> => 項目名は?

ちなみにこの<C-d>のタグ名は、 ここまで読まれた方なら分かると思いますが

:help c_CTRL-d

です。Vim日本語ドキュメントがインストールされている場合その項目名は?

:help c_CTRL-d@ja

です。 少し慣れましたでしょうか。 大丈夫、焦らずとも使ってる内に慣れます。

注意点

ワイルドカードは使えないので、カーソル下の単語を探すコマンド*の項目は:help starです。 また、このコマンドはノーマルモードのものなので:help n_starじゃないか?と思われた方もいるかもしれません。 このようにノーマルモードの項目は先頭にn_と付きません。 なので冒頭で言った次のような規則は嘘でした。

{モード}_[CTRL-]{キー}

正確に言えばノーマルモードの場合のみ

[CTRL-]{キー}

になります。

:helpgrep

Hack #45にもありますが、:helpgrepはhelpを全文検索するExコマンドです。 :grep:vimgrepなどと同じインターフェースで使えます。

unite-help

またunite.vimというプラグインのunite-helpというプラグインがあります。 これは限られたコマンドラインでワイルドカードを駆使して探すことなく helpを全文インクリメンタル検索することができるので、 初心者でも手軽に、また:helpよりもより素早く項目を探すことができます。 :helpgrepのインクリメンタル検索版というとわかりやすいでしょうか。 まさにunite.vimの真価を発揮するプラグインと言えるでしょう。

ref.vim

また直接は関係がないのですが、 ref.vimというmanやperldocやpydocやrefeなど その他いろんなマニュアルを引けるプラグインが存在します。 これをインストールすることで、デフォルトのKの挙動が Vimの:helpを引くだけでなく、perlスクリプトでperldocを引くようになったりと大幅に拡張されます。

tyru

Home > Tags > lv2

Search
Feeds
Links
  • 公式
  • 勉強会
  • 情報
  • コミュニティ
  • Meta
    Etc
    Creative Commons License
    This blog is licensed under a Creative Commons License.

    Return to page top