ホーム > タグ > Vim Hacks

Vim Hacks

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 #210: Vim のイースターエッグを見る

Vim は長い歴史があるソフトウェアであり、そのためか多くのイースターエッグが見られます。

イースターエッグとは

ソフトウェアで見られる隠しメッセージなどのことです。詳しくは Wikipedia を参照してください。

Vim で見られるイースターエッグ

以下は筆者が知っている限りの Vim で見られるイースターエッグの一覧です。何が起こるかはあなた自身の目で確かめてください。

  • :help!
  • :help 42
  • :help holy-grail
  • :help map-modes
    • 表の下にコメントがあります。
  • :help UserGettingBored
  • :help spoon
  • :help showmatch
    • Note を参照してください。
  • :Ni!
  • :hi!
thinca

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 #207: <C-g>, g<C-g>で選択されたテキストの情報を表示する

問題

ノーマルモードでは<C-g>g<C-g>などバッファの情報を表示するコマンドがあるのに、ヴィジュアルモードではありません。
選択されたテキストの情報を見たいというのはよくあるパターンです。
どうすればいいでしょうか?

解決

visualctrlg.vimを使います。
visualctrlg.vimはヴィジュアルモードで選択されたテキストの情報を表示してくれる本稿にぴったりのプラグインです。
インストールすれば自動的に<C-g>g<C-g>がヴィジュアルモードで使えるようになっているはずです。

tyru

Hack #206: 外部で変更のあったファイルを自動的に読み直す

ツール等で出力されたファイルを開いている場合や、VCS で更新した場合など、Vim で開いているファイルが外部で変更されることは割とよくあることでしょう。そういった場合、Vim は自動的に読み直すことができます。

'autoread' オプション

'autoread' オプションを有効にすると、元のファイルの変更を Vim が検知し、かつバッファが変更されていなかった場合、バッファは自動的に再読み込みされます。 これはグローバルまたはバッファについてローカルなオプションであり、バッファ毎に設定が可能です。

変更のチェックを強化する

'autoread' で Vim が変更に気付いたときに読み直されるわけですが、Vim はそこまで頻繁に変更をチェックするわけではありません。もっと頻繁にチェックして欲しい場合、以下のコマンドでチェックを行うことができます。

:checktime

これを autocmd を使って自動的に実行するようにすれば、再読み込みが発生する頻度が上がります。

augroup vimrc-checktime
  autocmd!
  autocmd WinEnter * checktime
augroup END

この設定ではウィンドウを移動する度にチェックを行います。

thinca

Hack #204: Vimに望み通りの新機能を搭載してもらう

問題

Vim scriptを書いたり、あるいはVimを用いて他の言語でプログラミングを行う日々を通して、Vimに対して様々な要望がでてくることと思います。Vim本体にこんな機能があればこういう目的を実現するのが容易になるのに、あるいはVim scriptのこの変な挙動が修正されたらプラギン開発がずっと容易になるのに、などなど。

解決

寄付をします。

http://www.vim.org/sponsor/index.php

Vimの開発者であるBramさんは、このように語っています。

Since Bram is back to a paid job the money will now be used to help children in Uganda. (snip) But at the same time donations increase Bram’s motivation to keep working on Vim!

寄付をすることによって間接的にVimの開発を支援することができます。

クレジットカードや郵便を用いて送金することができます。最小単位が10ユーロです。ユーロ安の今が大チャンスです。

また別の解決策として、自分でVim本体へのパッチを書いてvim_devに投稿する方法もあります。これに関しては、vim-users.jpに掲載されているReal Vim Hacks Projectというページに役に立つ情報がたくさん掲載されていますので、ご参照ください。

補足

vim.orgにて寄付をした人の一覧を見ることができます。

http://www.vim.org/sponsor/hall_of_honour.php

2011年3月現在、公表されている寄付金額の合計は13336ユーロです。

参考

寄付に関する情報もVimに添付されています。:help sponsorしてみましょう。

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 #201: バックアップを作成する

バックアップには 2 種類あります。 1 つは編集中のファイルのバックアップ、これをスワップファイルと呼びます。 もう 1 つは既に存在しているファイルを上書きする際に作成されるものです。

スワップファイル

スワップファイルを作成するには ‘swapfile’ をオンにします。 オフにするとスワップファイルは作成されなくなります。

スワップファイルは ‘directory’ で指定したディレクトリに作成されます。 全てのプラットフォームでの規定値は Unix の場合 ‘.,~/tmp,/var/tmp,/tmp’ と指定れているため、 カレントディレクトリ、つまり編集中のファイルと同じディレクトリに作成されます。

スワップファイルは ‘updatecount’ で指定している文字数を入力することで書き込まれます。 ‘updatecount’ を 0 に指定するとスワップファイルは作成されなくなります。

設定例

保存場所からカレントディレクトリを除き、~/tmp にして、更新の間隔を 500 文字にするには以下の様に指定します。

set swapfile
set directory-=.
set updatecount=500

バックアップ

同名のファイルを上書きする前にバックアップを取るには、’backup’ もしくは ‘writebackup’ をオンにします。

‘backup’ をオンにしておくと、上書きに成功した場合にもバックアップを残します。 ‘backup’ をオフにしておくと ‘writebackup’ をオンしておくと上書きが成功した場合はバックアップを破棄するようになります。 どちらもオフにした場合にはバックアップを取らなくなります。

バックアップ先を指定するには ‘backupdir’ を指定します。既定値ではカレントディレクトリにバックアップが作成されます。 ‘backupext’ を指定すると、バックアップファイル名の最後に指定した文字列を追加することが出来ます。 例えば、ファイル名の最後にタイムスタンプを追加するには、以下のように指定します。(HELP からの引用)

:au BufWritePre * let &bex = '-' . strftime("%Y%b%d%X") . '~'`

また、バックアップを作成しないファイル名のパターンを ‘backupskip’ に指定することが出来ます。

参照資料

Sixeight

Home > Tags > Vim Hacks

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

    Return to page top