バッファのセットをタブにバインドする方法は?


14

異なるプロジェクトで同時に作業する必要がある場合、次のワークフローがあります。

  • プロジェクトごとに1つのタブを作成します。
  • 各タブで、編集するファイルを開きます。これにより、いくつかのバッファーが作成されます。
  • オプションとして、2つ(またはそれ以上)のファイルを同時に表示する必要がある場合は、分割ウィンドウを作成して、1つのバッファーを表示する異なるウィンドウを含むタブを作成します。

バッファ間を移動するために、実際には使用せず:ls:b [name or number of buffer]代わりに:bnextとでバッファを切り替えることができる便利なマッピングを作成しました:bprevious

この方法は非常に優れていますが、気になることがあります。バッファはタブ間で共有されます。

開いfile1file2tab1そしてfile3tab2、そしてで、tab1何度か使ったら、このタブに見たくないもの:bnextが表示さfile3れます。私が取得したいワークフローは次のとおりです:

  • vimを起動します(最初のタブにバッファがあります): $ vim foo
  • このタブにバッファーを追加します。 :e bar
  • 新しいタブを開いて切り替えます: :tabnew
  • このタブで新しいバッファーを開きます。 :e baz
  • 私はこのバッファ内に滞在し、行う場合:bnext:bprevious、私はにとどまるだろうbaz(それは、このタブでは唯一のものであるため)、バッファ
  • 前のタブに移動して:tabprevious何度か実行すると、とバッファー:bnextのみを切り替えますが、表示されませんfoobarbaz

だからここに私の質問が来ます:バッファーのセットをタブにバインドし、vimが意図されているものとは別のタブからいくつかのバッファーへのアクセスを禁止することは可能ですか?

注:使用:b [myBuffer]することでバッファをタブに保持する方法になることは承知していますが、編集するファイルが3つまたは4つある場合は、バッファ名を入力するよりもマッピングを使用する方が本当に速いと感じます(可能な場合でも)バッファ名に一致するいくつかの文字のみを入力します


1
このようなアプローチの長所と短所を
VanLaser

@VanLaser:リンクをありがとう、興味深い議論です!私が実際に個人用マシンにいるときは、tmuxとさまざまなvimインスタンスを含めます。私の質問は、プロの仕事のためにウィンドウを使用しなければならないという事実から来ています。ウィンドウの処理方法は本当に好きでありませんalt+tab
statox

1
たぶん vim-ctrlspaceが役立つ-それはタブページバッファリストごとにアドバタイズします。しかし、私はそれを使用しません。
VanLaser

回答:


7

Mhh、私はそこにプラグインを見つけられませんでしたが、あなたは自分でそれを書くことができました。これにはvimscriptを学ぶ必要があります。タブ内のバッファを切り替えることができる機能を実装しました(削除はまだありません)。これをvimrcにコピーできます:

if !exists("g:WindowBufManager") 
  let g:WindowBufManager= {}
endif

function! StoreBufTab()
  if !has_key(g:WindowBufManager, tabpagenr())
    let  g:WindowBufManager[tabpagenr()] = []
  endif

  " add the new buffer to our explorer
  if index(g:WindowBufManager[tabpagenr()], bufname("%")) == -1 && bufname("%") != ""
    call add (g:WindowBufManager[tabpagenr()],bufname("%"))
  endif
endfunction

function! WindowBufManagerNext() 
  " find the next index of the buffer
  let s = index(g:WindowBufManager[tabpagenr()], bufname("%"))
  if (s!= -1)
    let s = (s +1) % len(g:WindowBufManager[tabpagenr()])
    execute 'b ' . g:WindowBufManager[tabpagenr()][s]
  endif
endfunction

augroup WindowBufManagerGroup
  autocmd! BufEnter * call StoreBufTab()
augroup END

vimrcを閉じて、もう一度開きます。次のバッファを見つけるには

:call WindowBufManagerNext()

または、独自のコマンドまたはマッピングを定義します。これは、タブまたはバッファを閉じたり削除したりしない限り機能します。また、複数のバッファーでは機能しません。これらの機能を追加するにはさらに作業が必要ですが、明確に実行できます。


どちらのプラグインも見つけられず、組み込みの機能がそうすることを望んでいましたが、あなたが正しいと思われるので、おそらく自分でそれをしなければなりません。あなたのコードをありがとう
statox

6

バッファーはグローバルであり、タブページ、ウィンドウ、およびバッファーの上に独自の抽象化レイヤーを書き込むことを除いて、それに対してできることは何もありません。philolo1の答えは問題に対する合理的なアプローチを示していますが、そのような「解決策」の限界をすぐに見つけ、多くの組み込み機能:bufdoや代替ファイルなどを複製する必要があります…

一方、「引数」はウィンドウに対してローカルにすることができるため、ワークフローでは「バッファ」(単語の最も厳密な意味)よりも便利な場合があります。

$ vim file1 file2
:tabnew
:argl file3 file4 file5
:n
:n
gt
:n
gt
:N
and so on…

引数はバッファほど柔軟ではありませんが、ワークフローにより信頼できる基盤を提供する場合があります。

しかし、私の意見では、各プロジェクトを独自のVimインスタンスで作業することが唯一の実用的なソリューションです。


別のコメントで言ったように、私は専門のコンピューターでウィンドウを使用しなければならず、gvimインスタンス間の切り替えはこのOSのお尻の痛みです。これまでに使用したことのない引数を見てみましょう。これは良い回避策かもしれません、ありがとう!
statox

2

だから、少し遅れて、満足のいく(少なくとも私にとっては!)答えを見つけたかもしれないと思う。Shougoの2つのプラグインが必要です。

また、の代わりに使用するクイックアクセスマップにより:ls現在のタブのバッファーのみを表示(および選択)します。

たとえば、次のようなもの:

nnoremap <leader>b :<C-u>Unite buffer_tab -no-split<CR>

団結-タブごとのバッファ

現在のタブバッファーリスト(jk)を移動し、1つを選択(CR)、キャンセル(q)、「入力」(挿入)モードに入り、文字を入力してバッファー選択をすばやくフィルターするか、ヒットTabしてアクションリストを開くことができます現在選択されているアイテムに対して(たとえば、現在アクティブなアイテムの上にあるバッファを開くため)-要するに、一般的な「結合」方法で動作します。

(また:h unite_default_key_mappings、Uniteヘルプ全般も参照してください)。


そして最後の(まだオプションの)トリックです。ではaltercmd、あなたは非常に独自の、タブごとの有効、作成することができますls(上記のユナイトの機能に基づいて)コマンドを:

:command! LS Unite buffer_tab -no-split
:AlterCommand ls LS

...そして:ls、ヒットするたびに、Vimは実際にコマンドを実行します

タブのバッファの表示と選択は同じコマンドになったため、:bnまたはも必要ないことに注意してください:bp


私もこの解決策を試してみます。今のところ、コメントでVanLaserが言及しているctrl-spaceを試してみましたが、これはかなり良いことです。どのソリューションが最も便利かを確認します。また、かなりクールなaltercmdプラグインの+1です!
statox

2

私のアカウントは新しいので申し訳ありませんが、ctrl-spaceは++++ 1なので、コメントできません。

助けの途中で売り切れました。Ctrlspaceの構造は次のとおりです。

workspaces --> contain tabs --> contain buffers

そのため、作業中のプロジェクトごとにワークスペースを保存し、必要なときにすぐにロードできます。これは、vimを閉じるたびに、バッファとタブの分割をすべて保存できることを意味します。

タブに名前を付けることもできます。それだけでは不十分な場合は、作業ディレクトリを非常に簡単に変更し、頻繁に使用するディレクトリのブックマークを作成することもできます。

それを使用すると、nerdtreeとうまくインターフェースします(正直なところ、おそらくctrlspaceで1週間後に必要になるとさえ感じないでしょう)


このユースケースを検討してください:

プロジェクトがあります。木を植えることが含まれます。果樹と金のなる木があります。金のなる木にはドルとセントが含まれ、果樹にはリンゴとオレンジが含まれます。

この例では、リンゴ、オレンジ、ドル、セントはすべて「バッファー」です。

Ctrlspaceを使用すると、リンゴとオレンジを1つの「タブ」に分離でき、「フルーツ」というラベルを付けることができます。このラベルは、ウィンドウ上部のタグ行に表示されます。同様に、ドルとセントは「お金」タブに入ります。

「ツリー」ワークスペースはこの設定全体を保存し、vimを開くたびにすぐにアクセスできるようにします。


その存在に気付いた今、このプラグインなしでvimでオブジェクト指向開発を行うことは本当に想像できません。念のため、ここにリンクがあります:https : //github.com/szw/vim-ctrlspace


2

だから最終的に私の問題を解決するために独自のプラグインを作成することにしました。それはgithubで利用可能です。

私は@ philolo1のアイデアを使用して完成させようとしましたが、この答えを書いている時点ではまだ進行中の作業です。

編集ワークフローが進化するにつれてプラグインを維持できなくなり、タブにバッファーをバインドすると解決するよりも多くの問題が追加されることに気付きました。


プラグインはバッファーをタブにバインドします。ユーザーがバッファーを開くと、自動的にタブに「格納」され、別のタブからアクセスできなくなります。

インストールは「プラグインマネージャーフレンドリー」である必要があります(少なくともVim-PlugおよびVundleでうまく機能します)。

主な機能は次のとおりです。

  • バッファーのバインディングを自動的に処理します(ユーザーは以前のようにバッファーを開くことができます)
  • :NextBufそして、:PrevBuf交換する:bn:bN、タブの一貫性のある状態を保つために
  • :ListBuf:lsタブで区切られていることと、ユーザーが現在どのタブにいるかをユーザーが簡単に確認できることを除いて、バッファーをリストできます。
  • :ChangeBuf バッファの変更とタブの自動変更のために、バッファ番号またはバッファ名を受け入れます
  • バッファを閉じるには :CloseBuf
  • タブを閉じるには :CloseTab

他の操作のためにユーザが使用することができるはず内蔵の機能(のような:tabopen:tabnextなど...)

各コマンドにはデフォルトのマッピングがいくつか用意されており、に追加let g:betterTabsVim_map_keys = 0することで簡単に無効にできます.vimrc

また、明示的なヘルプファイル(:h betterTabs.txt)を作成しようとしました:まだ完全ではありませんが、ユーザーはプラグインを使用するための最小限のものを見つける必要があります。

プラグインがネイティブな動作を混乱させないことを確認するために、まだ多くのテストを行っています。

最後に、誰かが手助けしたい場合は、githubページで問題を作成するか、プルリクエストを作成することが常に可能です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.