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

Blank File

LinuxとかPythonとかVimとか、趣味でいじる感じで

SidePanel.vimを公開しました

Vim

リポジトリこちら

どんなプラグイン

サイドバーっぽい機能を提供するvimプラグインを一元管理するプラグインです。

ブラウザやファイラーやIDEなどでよくあるサイドバー、便利ですよね。VimでもNERDTreeTagbarGundoVimFilerなどを使うことで同じような機能が得られます。しかし、それぞれが独立したプラグインのため、これらのプラグイン複数使おうとすると悲しいことが起こります。

(例)

f:id:h-miyako:20140512214503g:plain

これは極端な例で、実際にはこまめに閉じたりすればいいわけですが、それでも横のWindowが閉じたり開いたりすることで編集中のバッファが左右にずれるのは悲しいものです。また、プラグインが異なると幅の設定もそれぞれ異なってしまったり、あるいはきちんと設定しても使っているうちに幅が変わったりして悲しいものです。

ということで

これらのプラグインをまとめて管理するプラグインとしてSidePanel.vimを作りました。

今の所できることは、

  1. 一つのプラグインのウィンドウだけを表示
  2. ウィンドウの幅の一元管理
  3. ウィンドウの位置(左右)の一元管理

です。

デモ

一つのプラグインのウィンドウだけを表示

f:id:h-miyako:20140512214611g:plain

ウィンドウの幅変更

f:id:h-miyako:20140512214724g:plain

ウィンドウの位置変更

f:id:h-miyako:20140512214817g:plain

使い方

現時点で対応しているプラグインは以下の4つです。

VimFilerは一応動きますが、私が常用していないので細かい所でバグってるかもしれません。特に幅の管理が怪しいです。taglistも一応設定を入れておいたので動きますが、個人的には更新の活発なTagbarの利用をおすすめします。

インストール

VimプラグインをNeoBundleで管理している方は、.vimrc

NeoBundle 'miyakogi/sidepanel.vim'

と追加して:NeoBundleInstallでインストールできます。他に、管理したいプラグインもインストールしてください。

設定

そして、.vimrcで管理対象にしたいプラグインを以下のように指定してください。指定されていないプラグインは無視されます。管理対象に含めたくないプラグインは、該当行を削除またはコメントアウトで除外できます。

" 有効にするプラグインを指定
let g:sidepanel_config = {}
let g:sidepanel_config['nerdtree'] = {}
let g:sidepanel_config['tagbar'] = {}
let g:sidepanel_config['gundo'] = {}
let g:sidepanel_config['vimfiler'] = {}
let g:sidepanel_config['taglist'] = {}

" オプションで表示位置と幅の設定ができます。
" 表示位置("left"または"right"、デフォルトは"left")
let g:sidepanel_pos = "left"
" 幅(default: 32)
let g:sidepanel_width = 26

※) このプラグインは管理対象のプラグインの設定を一部上書きしてしまうので、利用者の意図せぬ動作を防ぐために管理対象のプラグインを設定で明示することにしました。今後変更するかもしれません。

使い方

Vimを起動したら:SidePanelプラグインの一覧が表示されます。開きたいプラグインのところでエンターを押せば開きます。

直接特定のプラグインを開きたい場合は:SidePanel nerdtreeなどのように指定してください。私は以下のマッピングをして使っています。

nnoremap <silent> <Space>e :<C-u>SidePanel nerdtree<CR>
nnoremap <silent> <Space>t :<C-u>SidePanel tagbar<CR>
" nnoremap <silent> <Space>g :<C-u>SidePanel gundo<CR>
" nnoremap <silent> <Space>l :<C-u>SidePanel<CR>

表示位置を変えたい時は:SidePanelPosToggleで左右反転します。幅はできるだけ実際の値を維持するようにしています。幅を数値で指定したい時は:SidePanelWidth 30などで指定できます。

プラグインの動作設定

デフォルトでは:SidePanel nerdtreeの動作は、バッファがファイルであれば:NERDTreeFindを実行、ファイル以外であれば:NERDTreeCWDを実行するになっています。例えばこれを常に:NERDTreeの実行に変更したい場合、以下のように設定します。

let g:sidepanel_config['nerdtree'] = {'open': ['NERDTree']}

一応閉じるコマンドも設定できます。(これを変更することは少ないと思いますが・・・)

let g:sidepanel_config['nerdtree'] = {'close': ['NERDTreeClose']}

プラグインの追加方法

いつかきちんとドキュメントにすると思いますが、ざっくり言ってしまうと、以下のように.vimrcに設定を追加してください。以下はNERDTreeのデフォルト設定です。なんとなく雰囲気はわかっていただけるかと思います。

(2014/05/14 バグ修正)

let g:sidepanel_config['nerdtree'] = {
    \  'filetype': 'nerdtree',
    \  'open': ['call sidepanel#init#nerdtree()'],
    \  'close': ['NERDTreeClose'],
    \  'position': {
    \    'var': 'g:NERDTreeWinPos',
    \    'param': {
    \      'left': 'left',
    \      'right': 'right',
    \    },
    \  },
    \  'size': {
    \    'var': 'g:NERDTreeWinSize',
    \  },
    \}

function! sidepanel#init#nerdtree()
  if filereadable('%')
    execute "NERDTreeFind"
  else
    execute "NERDTreeCWD"
  endif
endfunction

その他、デフォルト設定はautoload/init.vims:sidepanel_config_defaultに列挙されています。

お願い

「こんなプラグインも使えると便利」などありましたら、GithubのIssueでお知らせいただけると嬉しいです。対応できそうなプラグインはできるだけ対応します。また、上記の方法で設定まで書いていただけたりするととても嬉しいです。