paner 作った

~~メンテ出来てなかったので、atom.io から削除(unpublish)しました。 2016.8.3.~~
復活させた。2016.8.8


[paner](https://atom.io/packages/paner)

Atom では Pane (Vimでいうところのウィンドウ) 分割ができるが、Pane の移動をキーボードだけで行いたい。
特に、今アクティブな Pane を **一番** 上に、右に、左に、右に、**一発で** 移動したい。
これは Vim では `ctrl-w K`, `ctrl-w L`, `ctrl-w H`, `ctrl-w J` で可能で、この操作の使用頻度はかなり高かった。
Atom に移行してから、これができなくて不満だったので作った。

![gif](https://raw.githubusercontent.com/t9md/t9md/4407eb697d1f83a8ce6a16ce096a98a270980c3b/img/atom-paner.gif)

# 使い方

* `paner:swap-item` で Pane の ActiveItem を隣接 Pane の ActiveItem と入れ替え
* `paner:maximize` で Pane を画面いっぱいに最大化(いわゆる Zen モード).
* `paner:very-top`, `paner:very-bottom`, `paner:very-right`, `paner:very-left` で **最** 上方、下方、右、左 に移動

# Keymap

デフォルトのキーマップは無し。

* ノーマル・ユーザー

```coffeescript
'atom-workspace:not([mini])':
  'cmd-k x':         'paner:swap-item'
  'cmd-enter':       'paner:maximize'
  'cmd-k cmd-up':    'paner:very-top'
  'cmd-k cmd-down':  'paner:very-bottom'
  'cmd-k cmd-left':  'paner:very-left'
  'cmd-k cmd-right': 'paner:very-right'
```

* [vim-mode](https://atom.io/packages/vim-mode) ユーザー用

```coffeescript
'atom-text-editor.vim-mode.command-mode':
  'ctrl-w x':     'paner:swap-item'
  'ctrl-w enter': 'paner:maximize'
  'ctrl-w K':     'paner:very-top'
  'ctrl-w J':     'paner:very-bottom'
  'ctrl-w H':     'paner:very-left'
  'ctrl-w L':     'paner:very-right'
```

* 私の設定

`ctrl-w L` だと２ステップになってしまうが、こちらだと、`cmd-shift-l` で体感的には 1ステップで Pane を移動出来る。

```coffeescript
'atom-text-editor.vim-mode.command-mode':
  'cmd-x':     'paner:swap-item'
  'cmd-enter': 'paner:maximize'
  'cmd-K':     'paner:very-top'
  'cmd-J':     'paner:very-bottom'
  'cmd-H':     'paner:very-left'
  'cmd-L':     'paner:very-right'
```

# NOTE

##  `paner:very-top` 系の移動について

この機能を実装するのにめちゃくちゃ苦労した。
似たような Package を探してみたが同じことをやろうとしているものは見当たらなかった。
Try&Error の繰り返しで、力技で実現したので、スッキリはしていない。が、使えるので良しとする。

Atom の Pane 分割した後のコンポーネントの階層状態は以下の様になっている。

```
workspace
   > PaneContainer
       > PaneAxis(vertical or horizontal): root
          > Pane or PaneAxis
```

very 方向の操作をするためには、paneContainer 直下(root) の PaneAxis の orientation(vertical or horizontal)を変えなければならない。
これを行うには、新しく PaneAxis を作って、これまで root にあった PaneAxis を新しい PaneAxis の Child にし、最後に root を差し替えれ(`PaneContainer::setRoot(PaneAxis)`ば良い。
しかし、この操作をそのままやってもうまくいかない。
見た目上は目的のレイアウトになるが、必要なイベントの登録・解除をすっ飛ばしてしまっているようで、エラーがでまくるし、分割もできなくなる。
思いつく限りの方法をいろいろ試した。
70%はできてるが、あと30%のケースでは、うまくいかない、というような試行錯誤を繰り返した。
最終的に解決したのは、元々 root にあった PaneAxis を使い回すのは諦めて、コピーする事でだった。
※ そもそも素の Atom でも Pane 分割・削除を大量、高速に繰り返すと、ゴミ Pane が残ってエラーが出たりする。

## 操作対象のPaneのタブのプレビュー状態をクリアする。

Atom 0.206 以降、[sublime-tab](https://atom.io/packages/sublime-tabs) の機能が
本家に採用され、プレビュータブ機能が追加された。
デフォルトでは有効になっておらず、設定で有効にする。
プレビュータブ機能を有効にすると、**開いてから変更されておらず、かつ、タブ部分をダブルクリックされていないタブ** はプレビュータブとして扱われる。
プレビュータブは、新しいアイテム(ファイル)を開いた時に、**使いまわされる**。
この機能により、ファイルを開くだけで、編集していないのに、どんどんタブが増えてしまって困っちゃう、という事が無くなる。
ただこの機能は PaneItem の移動と相性が悪い。
Pane の swap や、very 方向への移動で、`Pane::moveItemToPane()` を使用しているが、これは内部で、Pane の追加、削除が発生する。
追加が発生した段階で、移動した Pane がプレビュータブにされ、もともとあったプレビュータブが削除されてしまったり(プレビュータブは性質上各Pane に一つ)する。
こうなると訳わからんので、Panerでは操作対象になった Pane 上のプレビュータブをマニュアルで、クリア(プレビュータブじゃなく)している。
APIが用意されていないので、viewElement を直接操作。

* [not work correctly when PreviewTabs is used](https://github.com/t9md/atom-paner/issues/1).