Vimのエキスパートがタブよりもバッファを好むのはなぜですか?


243

バッファがわかりません。同じタブで3つのファイルを開いてウィンドウを閉じると、次にこれらのファイルの1つを開いたときに、奇妙なスワップファイルが残っていて厄介なメッセージが表示されていることに気が付きます。しかし、私は何度も何度も読んで、これらは私が見逃している生産性の問題であり、タブはプリベシアンが使用するために作成されたものであることを読みました。

Vimのエキスパートに質問します。タブよりもバッファを使用する利点は何ですか?違いがどのように大きく異なるのかはわかりませんが、Vimを操作する初心者から中級者レベルでのみ自分を検討します。ある:ls :b#本当にはるかに速くよりもgt周りのINGの?これ以上に深く感じないといけないと思います。


6
Vimを学んだり、他のGUIベースのエディターの影響を強く受けたりする場合は、まず@Jonathan Brinkの回答を読んでから、ここでトップの回答に戻ることを強くお勧めします。
icc97 2017年

1
あまり心配しないでください。ファイル間のナビゲーションの主要な方法としてタブを使用しています。あなたが言うように、<#> gtは入力が簡単です。さらに使いやすくするために、タブ番号を含めるようにタブラインデータをカスタマイズします。一度に複数のバッファを表示する必要がある場合は、タブ内で新しいウィンドウを分割します。@romainiの主張にもかかわらず、このVimの使用方法は、自分の比喩に合うので非常に生産的になります。また、37年(これまでのところ)のプログラマーとしてのキャリアでは、一度に5つまたは6つを超えるファイルを開く必要はありませんでした。あなたのために働くことをしてください。:)
トニー

うまくいきます。一部の人々はセッションで多くのファイルを使用するので、バッファはもっと重要です。Bram Moolenaarでさえ「好きなように整理する」と言っています。20個のタブを開くのは適切な方法ではありませんが、いくつかのファイルのタブは世界の終わりではありません。多くのファイルを管理するブラムのソリューションは、いくつかのターミナルセッションを開くことです。彼はそれが彼のやり方であると言いますが、これは誰もがそれを行う方法であるとは限りません。
クラフト

適切に強調表示されていないように見える最も明白な違いの1つは、1つのタブを:split開いたままにすると、「ウィンドウ」に入ると複数のバッファを同時に表示できることです。すべてのバッファー(ファイル)が別々のタブにある場合は、同時に表示することはできません。まず、1つのタブを使用してvimを学び、分割に慣れることをお勧めします。
NeilG、

回答:


500

ZyXが#vimで言ったように、この質問は「Vimのエキスパートが暖かいよりもおいしいのを好む理由」のように聞こえます。

「Vimエキスパート」はタブよりもバッファを好みません。バッファをファイルプロキシとして使用し、タブページをワークスペースとして使用します。バッファとタブページは目的が異なるため、どちらかを優先することはまったく意味がありません。

バッファとタブの問題は、独立したファクトの組み合わせによって引き起こされる混乱の 1つです。

  1. ほとんどの「最新の」テキストエディタとIDEは、タブのメタファを使用して、ロードされたファイルを表します。そのメタファーは、情報システムとして機能します。つまり、開かれているファイルとその状態をユーザーに示します。また、対話型デバイスとして、開かれたファイルをユーザーが操作(並べ替え、選択、閉じるなど)できるようにします。それらの多くの制限にもかかわらず、タブは至る所にあり、人々はそれらに慣れ、どこでもそれらを期待します。

  2. Vim は7.0でタブページを導入し、ユーザーがアドホックな「ワークスペース」を作成できるようにしました。それらの機能、特定のオプション、特定のコマンド、または:helpセクションに、タブページをファイルプロキシとして使用できる、または使用する必要があることを示唆するものはありません。

    もちろん、名前「タブページ」の外観以外は何もないため、多くの混乱が生じます。

  3. なければ:set hidden、デフォルトでは無効ではなく非常に簡単に見つけることがされ、Vimはそれが不可能な現在の1を書くか、その変化を放棄することなく、別のバッファに切り替えることができます。新しいユーザーは、そのオプションに気づいていないため、ウィンドウを多用するか、最も近い「タブのような」機能であるタブページに切り替えるしかありません。

「タブページ」は、特にドキュメントを読むのは時間の浪費であるという考えが支配的である時代に、その機能の不幸な名前の選択です。

Vimでは、タブページはウィンドウの上に構築された抽象であり、それ自体がバッファーの上に構築された抽象です。新しいレベルごとに便利な機能が追加されますが、ワークフローが制限されます。

「バッファウェイ」

バッファベースのワークフローでは、作業中のファイルは単一の次元に沿って配布されます。バッファーを循環させたり、名前の一部(補完あり)または番号を入力して特定のバッファーにアクセスしたり、バッファーを切り替えたり、ターゲットを簡単に指定したりできます。基本的に摩擦はありません。

  1. 8つのバッファが開き、1つだけが表示されます。

    8つのバッファが開いています

  2. 番号による切り替え:

    番号による切り替え

  3. 名前で切り替える:

    名前で切り替える

バッファはVimのファイルプロキシです。ファイルの観点から考えると、バッファの観点から考えることになります。

「窓の道」

ウィンドウベースのワークフローでは、あなたの「ファイル」は、両方の彼らはあなただけのバッファを使用するかどうのと同じシングル「仮想」の次元に沿って分布している他の二つの「物理的」の次元に沿って。しかし、これらの次元が存在するデカルト空間はほぼ完全に分離されています。別のバッファーに移動することは、「別のファイルに移動する」ことを意味しますが、別のウィンドウに移動することは意味しません。目的のファイルに対応するバッファがそのウィンドウに表示される場合がありますが、別のタブページに表示される場合もあれば、まったく表示されない場合もあります。

ウィンドウを使用すると、'switchbuf'およびを使用しても、開いているファイル間を移動するのが複雑になりすぎたり、単純化しすぎたりします:sb。ほとんどの場合、基本的に同じこと、つまりバッファへのアクセスに2つのコマンドセットを使用する必要があるためです。

以下に説明するように、Windowsには用途がありますが、誰かのワークフローでバッファを置き換えるために必要なものはありません。

ここでは、Vimのカラースキームに取り組んでいます。2つのウィンドウは、同じバッファーの異なるビューです。上の1つは、カラースキームで使用されているカラーコードのテーブルとともに参照として機能し、下の1つは私が作業する場所です。

カラースキームに取り組む

Windowsはファイルプロキシとして設計されておらず、ファイルプロキシにすることはできません。それらは、バッファへのビューを提供するように設計された「コンテナ」または「ビューポート」です。それ以上でもそれ以下でもありません。

「タブウェイ」

タブベースのワークフローでは、Vimのタブページの本質を完全に無視しながら、基本的に以前のエディターで使用していたユーザーエクスペリエンスを模倣しようとします。この戦略が一般的に非常に非生産的であることを一瞬忘れると、Windowsと同様に、Vimに多くの柔軟性を失うことなく「1つのファイル= 1つのタブ」というパラダイムを強制することも不可能になります。

上記と同じファイルを操作する場合、タブラインはかなりのスペースを占めますが、実質的にはメリットがありません。すべてのファイルとすべてのタブが呼び出されるjavascript*.vimため、実行できず3gt、適切な場所に移動して、特定のタブに名前でアクセスすることはできません。さらに、そのラベルは非常に役に立たないが完全に論理的なものになる可能性があるという事実に加えて[Quickfix List]、ファイル/バッファをタブページに結び付ける実用的な方法がないため、基本的にタブページ間を移動する1つの実用的な方法しかありません。 / buffers / files:循環。

そして、ええ、私のタブラインはたった8つのタブで壊されています。

  1. 8つのバッファが8つのタブページで開いている(間違っている)

    違う

  2. 2つの特定のタスク用の2つのタブ(右)

    正しい

タブページは、1つ以上のウィンドウを含むように設計された「コンテナ」または「ビューポート」であり、それ自体がバッファを含むように設計された「コンテナ」です。

結論として

「Vimエキスパート」(私が1人であるかのように話すことができると仮定しましょう)は、タブよりもバッファを好みません。彼らは設計されたVimを使用し、その設計に完全に快適です。

  • 「Vimエキスパート」には2、30、または97個のバッファがロードされており、空間分布を処理する必要がないことを非常に喜んでいます。

  • 「Vimエキスパート」は、2つのファイルを比較するか、現在のバッファーの一部で作業しながら、別のファイルを参照する必要がある場合、ウィンドウを使用します。

  • 「Vimエキスパート」は、現在のビューに手を加えることなく、プロジェクトの別の部分でしばらく作業する必要がある場合、まったく新しいタブページをロードします。


10
その他のリンクについては、「バッファを効果的に使用する」の投稿を参照してください
Peter Rincker

7
@ DavidEG、20個のバッファがあってもまったく問題ないので、プラグインは本当に必要ありません。一方、20のタブページ(説得力のあるファイルプロキシかどうかに関係なく)は、ほとんどの画面やプラグインに適合しません。
romainl 2014年

2
@Kache、はい、それがまさに私のポイントの核心です。ウィンドウとタブページを、それらが何であるかについては使用できますが、ファイルプロキシとしては使用できません。したがって、議論は人々がタブページまたはバッファを使用するべきかどうかではなく、人々がタブページをファイルプロキシとして
romainl 2014年

14
「Vimのエキスパート」として、私は4オーバーと言うことができる私はNeoVimようなプロジェクトを扱う際に、通常の状況で、バッファ「オープン」(実際には「いくつかのものを除いて、記載されているが、アンロード」)(私は単純にすべてを開いて*.c*.hscripts/*およびtest/**/*.luaファイル)。私の端末の幅が239カラムしかないことを考えると、「タブごとに1ファイル」のアプローチは使用できません。
ZyX 2014年

3
また、比較的大規模なプロジェクトの場合、タブを使用してバッファやファイルを簡単に切り替えることができるプラグイン(Command-Tなど)がいくつかあることを考えると、意味がありません。また、≈500の「興味深い」ファイルを含むneovimは大きなプロジェクトですが、最大のプロジェクトではありません。そのようなプロジェクトに対処する必要性に直面したときは、常にある種の検索を使用してナビゲートします(Command-Tや友達によるファイル/タグ検索、シンボル定義に移動するさまざまな方法)。したがって、タブを使用する理由はまったくありません。この方法:いずれの場合も、プロジェクトにナビゲートするためにタブバインド機能を使用しません。
ZyX 2014年

88

以前はすべてのバッファーを個別のタブに保持していましたが、次第に飽きてきてgtgT周りのどこにでも-ing。

また、バッファの管理が難しすぎると感じました。

ここに私の以前の意見を完全に変えたいくつかのテクニックがあります:

これが私の典型的なワークフローです:

  • Vimを開き、:e(通常は正規表現で:e src/**/F*Bar.js)バッファーを開きます
  • 別のファイルを開く必要があることに気づきました。:eそのためにも使用します。このバッファと現在開いているバッファを切り替えたい場合は:sp:vsp、別のウィンドウで開きます。
  • 上記の箇条書きのテクニックを使用して切り替える3〜5個のファイルが得られるまで繰り返します。
  • バッファを最初からやり直したい場合は、Vimを閉じて再度開きます。

1週間ほどこれらの新しいパターンを強制した後、開いたバッファーと、いくつかの自動ストロークでそれらのいずれかに到達する方法を視覚化することがはるかに容易になったと感じました。


24
このような親切なユーザー/初心者向けの説明が、ここで投票したトップ投票などの非常に独断的で軽蔑的な過度に複雑な回答の賛成投票の約3%を得るのは残念です。それがgTタブを切り替えるコマンドであることさえ知りませんでしたctrl+tab。代わりにを探していました。新しいユーザーを愚かに感じさせるだけでなく、実際に本当に助けてくれてありがとう。
icc97 2017年

11
私のコメントは@romainlの答えに対して不公平だと言わざるを得ません。彼は私がそれについて持っていた質問に答えてくれてとても幸せでした。しかし、確かに誰かがVimを学習しようとすると、あなたの答えははるかに理解しやすくなりますが、実際にもう少し知っていれば、彼の答えはより完全になります。
icc97 2017年

3
@romainlの答えは非常に役立つと思います。バッファ、ウィンドウ、タブがどのように設計され、どのように使用されるかを明確に示しています。それでも、Vimのユーザーは、viのやり方ではなく、質問に答えるチャンスに飛びつくと思います。
keyofnight 2018

3
どこから取得したか思い出せませんnnoremap <leader>b :ls<CR>:b<space>が、現在開いているバッファーのリストが表示されるので、バッファーをすばやく切り替えるのに非常に便利です。また、部分的な名前も受け入れられます(一致が1つしかない場合)。
naught101

1
この方法には、vimのオートコンプリート(デフォルト、追加のプラグインなし)の本当に素晴らしい利点もあります。複数のバッファーを使用しているため、挿入モードでa ctrl Nまたはctrl P(Pは通常使用するものです)を実行すると、入力中の単語を完了するための単語のリストが表示されます...バッファ、分割されたもの、今見ていたもの、その他すべての開いているファイル!
g19fanatic

12

タブの欠点は、一度に1つのコンテンツしか表示できないことです。そのため、ブラウザのようにそれらを使用すると、複数のバッファを並べて表示したり、同じファイルの別々の部分を分割して表示したりできなくなります。したがって、多くの場合、異なるワークスペースを分離するためだけにタブを使用することをお勧めします(たとえば、1つはJavaプロジェクト用、もう1つはタスクリスト用、3つ目はスクリプトをハックするため)。

あなたが説明する問題は、あなたがVimを間違って使用しているように見せます。(ほとんどの場合)単一の専用インスタンスを持っている。その後、非表示になったバッファは、再編集すると単純に「再表示」され(バッファリストを使用して再呼び出しできるようになります)、スワップファイルメッセージは表示されません。または、プロジェクト/ファイル/編集セッションごとに別々のVimインスタンスを使用:quitしますが、ファイルを使い終わったら、各インスタンスを完全に使用するようにします。


時々分割を使用します。私はそれらが「バッファを使用する」と考えられていることを知りませんでした。本当に神秘的なコンセプトです。
2c2c 2014年

1
タブの興味深い再発見として、tabmanはNerdTreeのようなサイドパネルを生成できます。これは、各タブに表示されたすべてのバッファーの詳細を示します。
llinfeng

7

別のヒントとして、バッファ名を:bufferの引数として使用する場合、名前全体を指定する必要はありません。ただし、複数のバッファが指定された引数と一致する場合、バッファは切り替えられません。

バッファ名の任意のフラグメントを使用して照合できます。たとえば、バッファを持っている場合request_manager.javaし、queue_manager.javaその後、:buffer queまたは:b queその両方に一致するが、それは最初に一致するようqueue_manager.javaに切り替わります。


3

私は、タブ、使用Ctrl- P:私のワークフローでとVimのセッションを、今年以上持っています

  • 私が持っている)(、それぞれ「次のタブに移動」と「前のタブに移動」にマッピングされました。tn新しいタブを開きます。また、物事を整理しておくためにtabmを使用します。

  • 私が取り組んでいる現在のストーリー/バグに関連するファイルのグループにVimセッションを使用します。通常はカテゴリごとに行われます。これらのセッションは、プロセスの過程で上書きされます。

  • 私はまだCtrl-を超えるものを見つける必要はありませんPが、すべてのファイルを処理して検索するには少し時間がかかります。


1

2cをパイルに投げ込みます。

TLDR; :b *part-of-filename*は、バッファリストで必要なファイルを見つけるための最良の方法です。つまり、ファイルを追跡するためのバッファ番号、タブ、ウィンドウよりも高速で、認識負荷が低くなります。

30のバッファーを開いても(ハウスキーピングを行っていません)、私にとっては何の意味もありません。よく使用されるバッファーの美しさは、まったく速度が低下しないことです。実際、必要なファイルを開いてから4日後に電話をかける:b *part-of-filename*と、処理速度が向上し、魔法のように表示され、同僚や熱心な収集家にも印象的です。

バッファはファイル用です。

効果的にするには:

  • 悪質によく選ばれたルートディレクトリから重要な最初のファイルを開く
  • 以降のファイルを開く :e
  • 使用する ls ALLあなたが最初の(精神的または文字通り、あなたが見ることができないものを完全に理解することはできません)良いメンタルモデルを取得するために開始時間
  • 決して:q、それは吹く
  • 入力し:b、あなたの筋肉の記憶に
  • :b1 開いていることがわかっている最初のファイルに適しています。
  • :b# 一般的なニーズである最後のファイルに切り替えるのに適しています
  • :bd#一時ファイルに切り替えて、必要なことを実行し、で切り替えて:b#、一時ファイルを閉じたい場合に適しています
  • :b *part-of-filename* それ以外の場合は、リストで必要なファイルを見つけるための最良の方法です。つまり、ファイルを追跡するためのバッファ番号、タブ、ウィンドウよりも高速で、認識負荷が低くなります。

唯一の不快な点は:b *part-of-filename*、ファイルをまだ開いていないことがあり、:e path/to/full-filename最初に戻る必要があることです。

タブは、本当に無関係なファイルを区別するためのものです。

または、特定のウィンドウレイアウトを手元に置いておく(免責事項:私はこれを自分で使用したことがありません)。

または、めったに使用されないが予想どおりに必要なファイルの場合。私にとって、これは通常、commitMessage作業中に注釈を付けるファイルなので、コミットをするときが来たときにあまり考える必要はありません。(あなたが幸運を感じているなら、そうでなければ)gtより速い:b com<enter>です:b com<tab><enter>

  • :tabe commitMessage
  • gtまたはgT筋肉の記憶のお気に入り

ウィンドウ分割は視覚的に情報を比較するためのものです

または、重要な情報に直接アクセスできます(実際には、その情報が:eログファイルでライブ更新する必要がある場合を除き、通常はコンテンツを現在のファイルにプルして処理します)。

  • :vspまたはC-w v垂直分割、つまり左を開きます。右、:bまたはまたは:eを使用して必要なファイルを取得します
  • :spまたはC-w s水平分割、つまり上部/下部を開きます
  • C-w C-w つまり、ダブルCtrl-wで、利用可能なウィンドウを中心に回転します
  • C-w c 現在のウィンドウを閉じる
  • C-w o 他のすべてのウィンドウを閉じ、最新の状態に保つ

信じられないほど有用な答えです。もっと多くの投票が必要です。ヒントをありがとう、とあなたのワークフローに特に洞察力:b#:bd#
アラクリタス

0

これらをあなたに追加して.vimrc、愛情のこもったバッファを始めてください:

:nnoremap <Tab> :n<cr>
:nnoremap <S-Tab> :N<cr>

あなたが前方/後方それらを循環できる方法通常モード経由Tab/ ShiftTab


5
それをしないでください。のマッピングは失われ<C-I>ます。<C-Tab>本当に必要な場合は、代わりにマップしてください。

6
また、:nおよび:N引数リスト、開いていないバッファに関連しています。あなたはしたいと思います:bnし、:bp:bnext:bprev)。tpopeの障害のないユーザーは、必要に応じてマッピング]bを提供し[b、これ(およびその他の優れた機能)を提供します。(and )<left>and <right>矢印は、本当に短いマッピングが必要な場合、間違いなく、タブよりもオーバーライドするのに便利なキーではありません。
Vaz

1
@jeyoungも同意しました- Ctrl + Tab他のほとんどのGUIエディターやブラウザーが使用しているものを使用する方がはるかに意味があります。
icc97 2017年

0

何年も前の輝かしい実装を提案したいと思います:kien / tabman.vim。以下を明確にします。

  • どこかに注意深く隠されているバッファをいくつでも持つことができます。
  • 設計上、タブはバッファを独創的な方法で表示することを目的としています。
    • いくつかの適切なタブラインプラグインを使用すると、すべての非表示バッファーを最上行(タブライン)に表示できます。
    • vim-airlineの使用経験から、新しいタブを作成しても、タブラインに表示される関連情報はほとんどありません。
    • 2つのタグがタブラインスロットを並べて占有し、残りの水平スペースを無駄にします
    • 最悪の場合でも、非表示になっているバッファーが何であるかはわかりません。

これは、このマジックプラグインの素晴らしい再発見でした。このプラグインは、私のVim構成に何年も滞在しているはずです。すべての非表示のバッファーも表示するものを探し続けますが、バッファーがさまざまなタブにどのように配置されているかを鳥瞰図で見ると、TabManは私のスーパーマンです。



0

「選択した」バッファをタブとしてロードし、それらをすばやく(TAB / S-TAB)切り替えます。ワークスペースのフレームワークはここに収まります。私にとっては、バッファとVSタブはほとんど可視性です。ウィンドウやタブに重要なファイルや作業ファイルをポップし、現在必要のないファイルをその場でバックグラウンドで非表示にすることができます。パスを覚えたり、必要に応じて検索して再度ロードしたりする必要はありません。これにより、1つのVIMセッションで複数のタスクまたはプロジェクトを処理できるようになります。これは、メモリの少ないマシンでは重要でしたが、すべての編集タスクを1つのアプリケーションフレームに集中させるのにも適しています。また、バッファシフトのショートカットをCtrl-Right / Leftに設定して、さまざまなバッファをすばやく移動することもできます。

結論として、画面領域と同じくらいの数のウィンドウにしか分割できませんが、複数のタブで複数のウィンドウ設定を保持できるため、ワークスペースを拡張し、ワークフローを改善して、複数のファイルを展開する複雑なタスクを簡単に分割できます。 。

スワップファイルについては、指定した1つのフォルダーにすべてを保存するようにVIMに指示できます。この使用のため:set directory

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