web-dev-qa-db-ja.com

バッファーのようなVimのタブを使用する

私は、Vimでタブを使用する機能(:tabe:tabnewなど)を、非表示バッファーの同じウィンドウで多くのファイルを開くという現在の慣習の代替として検討しました。

開いているすべての個別のファイルが常に独自のタブにあるようにします。ただし、これを妨げるものがいくつかあります。これらの修正方法:

  1. gf^]などのコマンドが別のファイルの場所にジャンプすると、ファイルは現在のタブの新しいバッファーで開きます。これらの種類のコマンドすべてで新しいタブでファイルを開く方法がありますか、またはファイルが既に開いている場合は既存のタブに切り替えますか?

  2. バッファーを切り替えるときに:b <part of filename><tab>を使用できます。これにより、既存のバッファー内のファイルの名前が完成します。 <part of filename>は、ファイル名の先頭ではなく、途中でもかまいません。タブを切り替えるための同等のものはありますか?

350
indentation

停止、停止、停止。

これは、Vimのタブが使用されるように設計されている方法ではありません。実際、名前は間違っています。より良い名前は「ビューポート」または「レイアウト」です。これはタブであるためです。既存のバッファのallのウィンドウのレイアウトが異なるためです。 。

Vimを1つのタブ== 1のバッファーに収めようとするのは無益です。 Vimはすべてのコマンドでそれを認識または気にしません。特に、クイックフィックスバッファー(:make:grep、および:helpgrepは頭に浮かぶものです)を使用するものはすべて、タブを喜んで無視します。それをやめる.

代わりに:

  • :set hidden
    このセットをまだお持ちでない場合は、そうしてください。これにより、vimは地球上の他のすべてのマルチファイルエディターと同様に機能します。どこかのウィンドウに表示されていないバッファを編集できます。
  • バッファを切り替えるには、:bn:bp:b #:b name、およびctrl-6を使用します。私はctrl-6が好きです(単独で以前に使用したバッファーに切り替えるか、#ctrl-6がバッファー番号#に切り替えます)。
  • :lsを使用してバッファーをリストするか、または MiniBufExpl または BufExplorer のようなプラグインを使用します。
599
Zathrus

ここでのパーティーに少し遅れましたが、このリストに以下が表示されなかったことに驚きました:

:tab sball-開いているバッファーごとに新しいタブを開きます。

:help switchbuf-これはバッファーの切り替え動作を制御します。:set switchbuf=usetab,newtabを試してください。これは、バッファが開いている場合は既存のタブに切り替え、開いていない場合は新しいタブを作成することを意味する必要があります。

268
robince

Vim :help windowは、「タブとバッファ」の混乱を非常によく説明しています。

バッファは、ファイルのメモリ内テキストです。
ウィンドウは、バッファ上のビューポートです。
タブページはウィンドウの集合です。

複数のファイルを開くには、vimでbuffersを使用します。他のエディター(例:notepad ++)では、これはタブで行われるため、vimの名前タブは誤解を招く可能性があります。

Windowsは、ワークスペースを分割し、1つの画面に複数のファイル(バッファー)を一緒に表示するためのものです。他のエディターでは、複数のGUIウィンドウを開いてデスクトップ上で再配置することでこれを実現できます。

最後に、この類推では、vimのタブページは複数のデスクトップに対応します。つまり、ウィンドウの異なる再配置です。

Vim help: tab-pageが説明しているように、ファイルを一時的に編集したいが、ウィンドウとバッファの現在のレイアウトを変更したくない場合は、タブページを使用できます。そのような場合、特定のファイルを編集するためだけに別のタブページを使用できます。

もちろん、多くのタブページまたはウィンドウで同じファイルを表示すると、同じ作業コピー(バッファー)が表示されることを覚えておく必要があります。

156
crenate

ここでの他の回答のいくつかとは反対に、私はあなたが望むようにタブを使用できると言います。 vimは、事前定義されたパラメーターに従って作業を強制するのではなく、汎用性とカスタマイズ性を備えた設計になっています。プログラマーが私たちの「倫理」を他のすべての人に課すのが好きな方法を知っているので、この成果は確かに主要な機能です。

<C-w>gfは、バッファーのgfコマンドに相当するタブです。 <C-PageUp><C-PageDown>はタブを切り替えます。 (Byobuでは、これら2つのコマンドは機能しませんが、Byobu/tmuxの外部で機能します。代替はgtおよびgTです。)<C-w>Tは、現在のウィンドウを新しいタブページに移動します。

可能であれば、vimが重複するタブを作成するのではなく、既存のタブを使用することを希望する場合は、:set switchbuf=usetabを.vimrcファイルに追加します。リスト(:set switchbuf=usetab,newtab)にnewtabを追加して、コンパイルエラーを表示するQuickFixコマンドを強制的に別のタブで開くことができます。私は代わりにsplitを好みます。これは、コンパイルエラーを分割ウィンドウで開きます。

:set mouse=aでマウスのサポートを有効にしている場合、タブをクリックすることでタブを操作できます。新しいタブを作成する+ボタンもデフォルトであります。

タブに関するドキュメントについては、通常モードで:help tab-pageと入力してください。 (その後、<C-w>Tを使用して、ウィンドウをタブに移動する練習をすることができます。)コマンドの長いリストがあります。一部のウィンドウコマンドはタブに関連しているため、:help windowsを介してそのドキュメントを参照することもできます。

追加:2013-12-19

各ファイルを個別のタブでvimで複数のファイルを開くには、vim -p file1 file2 ...を使用します。あなたが私のような人で、-pの追加を忘れる場合は、vimが通常のコマンドラインオプションの解析ルールに従うため、最後に追加できます。または、vimvim -pにマッピングするbashエイリアスを追加できます。

50
Zenexer

私は同じ問題に遭遇しました。タブをバッファのように動作させたいと思っていましたが、タブを取得することはできませんでした。最終的に解決したのは、バッファーをタブのように動作させることでした!

Mini Buffer Explorer と呼ばれるプラグインをチェックしてください。インストールして設定すると、機能を失うことなく、タブとほぼ同じようにバッファーを操作できます。

15

これは、Vimに馴染みがなく、他のテキストエディター(私の場合はSublime Text)から来た人に対する答えです。

これらすべての答えを読みましたが、まだはっきりしていませんでした。それらを読み通せば十分なことが理解できるようになりますが、質問と質問の間を行き来するのに何時間もかかりました。

最初のことは、他の人が説明したように:

タブページtabsのように聞こえ、タブのように動作し、他のほとんどのGUIエディターのタブによく似ていますが、そうではありません。残念ながら、Vimで構築された悪いメンタルモデルであり、残念ながらタブページ内にある余分な力を曇らせていると思います。

私が理解した最初の説明は @ crenate's answer からでした。これは、複数のデスクトップに相当するということです。その点で見ると、デスクトップを2、3しか開いていないのに、それぞれの中で多くのGUIウィンドウが開いています。

私は彼らが他の編集者/ブラウザに似ていると言うでしょう:

  1. タブのグループ化
  2. Sublime Textワークスペース(つまり、プロジェクトにある開いているファイルのリスト)

そのようなものを見ると、ファイルのセット(バッファ)を簡単にグループ化できることを実感できます。 CSSファイル、HTMLファイル、JSファイルを異なるタブページに配置します。これは実際にはかなり素晴らしいです。

わかりにくいその他の説明

ビューポート

これは私には意味がありません。 定義済みの辞書用語 を持っているビューポートですが、:help window docでVimウィンドウについて言及しているだけです。ビューポートは、Sublime Text、Visual Studio、Atom、Notepad ++などのエディターに関して聞いた用語ではありません。実際、タブページの使用を開始するまで、Vimについて聞いたことはありませんでした。

複数のデスクトップのようにタブページを表示する場合、デスクトップを単一のウィンドウと呼ぶのは奇妙に思えます。

ワークスペース

これはおそらくより意味があります。 辞書の定義 は次のとおりです。

一時的に使用するためのメモリストレージ機能。

つまり、バッファのグループを保存する場所のようなものです。

私は当初、プロジェクトで開いているすべてのファイルのリストであるワークスペースの Sublime Textの概念 のようには聞こえませんでした。

サブライムワークスペースファイル。開いているファイルや各ファイルへの変更など、ユーザー固有のデータが含まれています。

しかし、もっと考えてみると、これは実際に同意します。 VimタブページをSublime Textプロジェクトのように考えると、各プロジェクトで1つのファイルだけを開いて、プロジェクトを切り替え続けるのは奇妙に思えます。そのため、タブページを使用して1つのファイルのみを開くのは奇妙です。

窓のコレクション

:help windowは、このようにタブページを指します。さらに、他の多くの回答も同じ概念を使用しています。ただし、vimウィンドウが何であるかを理解するまでは、砂の上に城を建てるなど、あまり役に立ちません。

上記で言及したように、vimウィンドウはビューポートと同じであり、この linux.comの記事 で詳しく説明されています。

Vimの本当に便利な機能は、1つまたは複数のファイル間で表示可能領域を分割する機能、または単に同じファイルの2ビットをより簡単に表示するためにウィンドウを分割する機能です。 Vimのドキュメントでは、これをビューポートまたはウィンドウと同じ意味で参照しています。

:help topicを使用するかF1キーを押してVimのヘルプ機能を使用したことがある場合は、この機能に既に慣れているかもしれません。ヘルプを入力すると、Vimはビューポートを分割し、上部のビューポートでヘルプドキュメントを開き、下部のビューポートでドキュメントを開いたままにします。

タブページがバッファのコレクションではなくウィンドウのコレクションと呼ばれるのは奇妙なことです。しかし、それぞれが同じバッファを指している複数のウィンドウで、それぞれ2つのタブページを開くことができると思います。少なくともこれまでのところは理解しています。

8
icc97

:helpタブを見ると、vimがあなたのやり方で働きたいとは思えません...

バッファーはタブ間で共有されるため、特定のタブにのみ表示されるように特定のバッファーをロックすることはできないようです。

しかし、それは良い考えです。

Multi-gnome-terminalなどのタブをサポートするターミナルを使用して、各ターミナルタブでvimインスタンスを実行することで、おそらく目的の効果を得ることができます。しかし、完璧ではありません...

4
Mike G.
  • .vimrcでgfを使用して行ったように、通常はバッファーを操作してタブを操作するコマンドをマップできます。

    map gf :tabe <cfile><CR>
    

    [^で同じことができると確信しています

  • 私はvimがタブのためにこれをサポートするとは思わない(まだ)。 gtとgTを使用して、それぞれ次のタブと前のタブに移動します。 Ngtを使用することもできます。Nはタブ番号です。私が抱えている問題の1つは、デフォルトでは、タブ番号がタブ行に表示されないことです。これを修正するため、 my .vimrc file の最後にいくつかの関数を追加しました(長すぎて正しくフォーマットされなかったため、ここに貼り付けませんでした)。

4
Lucas Oman

BufExplorer プラグインといくつかのマクロを使用して、タブなどのバッファーを使用します。

" CTRL+b opens the buffer list
map <C-b> <esc>:BufExplorer<cr>

" gz in command mode closes the current buffer
map gz :bdelete<cr>

" g[bB] in command mode switch to the next/prev. buffer
map gb :bnext<cr>
map gB :bprev<cr>

BufExplorerを使用すると、上部にタブバーがありませんが、画面のスペースを節約できます。さらに、ファイル/バッファーを無限に開いて、バッファーリストを検索できます。

4
jkramer

バッファをタブのように動作させたい場合は、 tabline plugin を確認してください。

これは単一のウィンドウを使用し、タブをシミュレートするために上部に行を追加します(バッファーのリストを表示するだけです)。これは、タブがGVimでのみサポートされ、コマンドラインvimではサポートされていなかった昔に出てきました。バッファーでのみ動作するため、すべてがvimの他の部分とうまく統合されます。

2
thien.vuong