バッファをすばやく切り替えるにはどうすればよいですか?


68

バニラEmacsでは、C-x b切り替えるためにバッファ名を手動で入力する必要があります。バッファーの名前を忘れた場合、ヒットTAB候補をリストするためにヒットする必要があります。このプロセスを高速化するためにできることはありますか?


10
これにより、コミュニティWikiのマークが付けられます。しかし、Emacsにはすでに巨大なwikiがあります。たとえば、Googleでの一番の結果は、スイッチングバッファーに関するこのページです。CWスタイルの質問は、特にemacs.SEの場違いな感じがします。
purple_arrows 14年

1
C-x C-<left/right>バッファをすばやく切り替えるために使用するのが好きです。「さらに」バッファに切り替える必要があるときは、を使用しますIBuffer
kuanyui

「Cx x」を使用してバッファーを切り替えます(ヘルムとコントロールにマップされたキャップを使用)。「Cx b」と入力するのが快適だと思ったことはありません。
wdkrnls 14年


1
回答で解決策の1つを使用し、Cx bは使用しないでください。このような頻繁な操作には3つのキーが多すぎます。個人的には単一のキーを使用しますが、それ以外の場合は使用しません。
トム14年

回答:


50

ありIDOのに役立つはずモード。

編集:

これをinitファイルに入れて、デフォルトでidoモードを有効にします:

(ido-mode 1)

これで、C-x b候補者のリストが表示されます。

アイテムを縦に表示したい場合は、これを初期化ファイルに追加します。

(setq ido-separator "\n")

エルゴマックスの礼儀

また、前/次のバッファーへの切り替えについて話しているこの投稿をお勧めします。


2
この質問への回答として、おそらくその投稿の重要な情報のほとんどを取得しようとする必要があります。そうすれば、将来のユーザーはおそらく死んだサイトへのリンクを追跡する必要がなくなります。
nixeagle 14年

@nixeagleいくつかの編集を行いました。最も重要な情報が存在することを望みます。
Nsukami _ 14年

現在は完了しているので、私はあなたを支持しましたが、他の人が別の、またはより良い答えを持ってくる場合に備えて、数日待ってから受け入れます。ありがとう!
nixeagle 14年

@nixeagleそれは何もない!
Nsukami _

1
@nixeagleはより良い答えを見つけましたか?
Emacsユーザー

44

私は最近使用し始めましたC-x <left>C-x <right>。これらは両方とも標準のEmacsバインディングであり、構成するものはありません。Leftは前のバッファー(最初は)と同じC-x b RETに戻りますが、もう一度実行すると3番目に最近アクセスしたバッファーに戻ります。3つまたは4つのバッファ間を頻繁に飛び回っている場合、バッファ名を覚えようとするよりもはるかに簡単です。

また、私はちょうど発見C-x C-<left>し、C-x C-<right>あなただけのバッファを介して反転し、xと矢印の間の制御キーと代替を押したままにできるように、同じ機能にバインドされています。かなりいい!


4
仰るとおりです!私はemacsの初心者であり、追加のパッケージやさらに多くの構成で過負荷になりたくありません。このソリューションは私のために機能します!:D
ankush981

Cx C- <左>およびCx C- <右>で勝利します!以前は、前/次のバッファーがCS- <左> / <右>にバインドされていました。しかし、どういうわけか、2つのメタキーを使用するよりもCx C-leftを入力する方が簡単です。CSは押しにくい。
ディディエA.

いいね!私はこれらのバインディングを1週間前に学び、それらがどれほど素晴らしいかを考え、それらが何であるかを忘れました。今まで1週間ネット上でそれらを見つけることができませんでした。ありがとう!
キリル・ユヌソフ

41

Helmを使用できます。

私の設定では、に切り替えC-x bましたM-l。これhelm-buffers-listにより、少なくとも私にとってはプロセスが非常に高速になります。


これは現在、基本的に最良の答えです。確かに、あなたはまだ使用することができますidoiswitchbまたはicicles、そのようなものが、それらは基本的にヘルムによって廃止されています。ええ、ace-jump-bufferかっこいいですが、ヘルムほど速くはありません。押すべきキーを知る前に、リストでバッファを見つける必要があるからです。Helmを使用すると、既に知っているいくつかのキーストローク(バッファーの名前など)でリストを絞り込むことができます。私はC-TAB、バッファの切り替え、最近のファイル、ブックマークなどの読み込みに使用しています。高速なものはありません。
ブルジェイ

4
+1 helm。しかし、私は使用して好むhelm-miniもあなたを示している、Recentfhelm-buffers-list
ジューン

1
ありツタivy-switch-buffer
Oleksii Filonenko

ツタはヘルムよりずっと速いので、ヘルムよりもお勧めします。
ディディエA.

10

すでに述べたIdoで使用する調整を追加するだけです。

(require 'ido)
(require 'ido-hacks)
(require 'flx-ido)
(require 'ido-vertical-mode)

(ido-mode 1)
(flx-ido-mode 1)
(ido-hacks-mode 1)
(ido-everywhere 1)
(ido-vertical-mode 1)

(setq ido-enable-flex-matching t
      ido-use-filename-at-point 'guess
      ido-vertical-define-keys 'C-n-C-p-up-down-left-right))

また、表示されているウィンドウ間をジャンプace-windowするace-jump-modeために、バッファを切り替えるためにも使用しています。慣れてきましたが試してみる価値があります。

私はそれを組み合わせて、クイックジャンプのためにkey-chord-modeヒットしsoました:

(key-chord-define-global "so" 'ace-window)

上記のパッケージはすべて、Melpaのパッケージマネージャーから入手できます。


混乱を避けるため、あなたの答えを編集して置き換えuse-packageましrequireた。この例では、ユーザーが追加のパッケージをインストールしてそのソリューションを実装する必要は特にありません。
カウシャルモディ14年

1
キーコードとして、英語で頻繁に使用される文字の組み合わせ(emacsでは主に英語で入力すると仮定)を使用しないことをお勧めします。私の意見では、「so」は、「so」、「some」、「personal」などのようなものを非常に高速に入力しているときに、意図せずにトリガーするのが非常に簡単です。
カウシャルモディ14年

10

@kuanyuiは、コメントで言うようにnext-bufferprevious-bufferあなたが間のサイクルにわずか数のバッファを持っている場合、非常に迅速です。(数個以上、およびより多くのバッファ選択機能のために、私は使用しますicicle-buffer。)

ただし、デフォルトでは、next-bufferprevious-buffer、プレフィックスキーの上にありますC-x

それはそれらが再現できないこと意味します:あなたはただ打つことができませんC-x <right> <right> <right>...。代わりに、これらのコマンドを異なる反復可能なキーにバインドするかC-x <right> C-x <right> C-x <right>...、非常に高速ではないを使用する必要があります。

これらのコマンドの繰り返し可能なバージョンの場合、ライブラリmisc-cmds.elをロードし、バニラの繰り返し不可能なバージョンをそこで定義された繰り返し可能なバージョンに再マップします。

(global-set-key [remap previous-buffer] 'previous-buffer-repeat)
(global-set-key [remap next-buffer]     'next-buffer-repeat)

(同様に、同じライブラリundoでは、プレフィックスキー上であっても繰り返し可能なバージョンが見つかりますundo-repeat


ところで、あなたはかなり作ることができます任意の(でも、プレフィックスキー上)、反復コマンド、関数を使用してrepeat-command(からmisc-cmds.el)。繰り返し可能なバージョンの定義に必要なのはこれだけですnext-buffer

(defun previous-buffer-repeat ()
  "Switch to the previous buffer in the selected window.
You can repeat this by hitting the last key again..."
  (interactive)
  (require 'repeat nil t) ; Library `repeat.el' is in Emacs 22.1 and later
  (repeat-command 'next-buffer))

3
...または単に次/前のバッファをバインドC-,し、C-.再現性を得るために、あなたはとにかくそれにしている一方で、設定C-x.C-x,するother-window(lambda()(interactive)(other-window -1))。サイクリングウィンドウはおそらく再現性の必要性が低く、余分なパッケージなしで1分で脱出できます。
アンドレアススピンドラー

2
@AndreasSpindler:もちろん、繰り返し可能なキーに任意のコマンドを配置して、繰り返し可能にすることができます。それはポイントではありません。反復可能なキーは少なく、バインドされていないキーはまれになっています。これは、プレフィックスキー上にあるコマンドを繰り返し可能にする方法についてです。
ドリュー

1
私はあなたの投稿を理解していませんでしたが、多かれ少なかれこのスレッドのトピック「バッファを素早く切り替えるにはどうすればいいですか?」を参照しました。この目的のために、特定のキーバインディングとは別に、使用するヒントnext-bufferprevious-buffer最適なソリューションを見つけました。したがって、私のコメント。
アンドレアススピンドラー

@AndreasSpindler:わかった。どうも。
ドリュー

これはすばらしいことです。プレフィックスキーがある場合でも、繰り返し可能なコマンドが必要になることがよくあります。そうは言っても、prev / nextバッファーのデフォルトはCx C-leftとCx C-rightであり、古いCを使用でき、x-leftとx-rightを押すだけです。これはデフォルトとしてそれほど悪くはありません。
ディディエA.

9

誰もiswitchbまだ言及していないことに驚いています。それはのように強力ではないかもしれませんが、生まれるidoずっと前にすでにemacsの標準であり、今日でもまだ有用です。試してみるだけでido-modeiswitchb-mode

(iswitchb-mode 1)

.emacsに入力するか、でアクティブにしM-x iswitchb-modeます。


4
iswitchbEmacs 24.4で廃止されました。その機能はすべて、ido今から利用できます。
タイラー14年

4
@Tyler iswitchbのデフォルトの外観は、カラフルできれいだからです。idoを同じように設定することもできますが、iswitchbが利用できる間は(少なくとも私にとっては)意味がありません。
トム14年

8

helm-buffer-listまたはhelm-miniを使用して、バッファエントリとファジーマッチングを視覚的に選択します。バッファの切り替え以外にも多くのことができます。リンクにデモが表示されます。


6

他の人は、バッファ/ウィンドウ/フレームの切り替えに関して、生活を楽にするのに役立つパッケージについて議論しています。(私は個人的にhelm驚異的です。)より楽しいEmacsエクスペリエンスを実現できる、より簡単な変更について説明したいと思います。

私にとって、バッファ/フレームの問題の解決策C-x oは(最悪だと思うので)パッケージではありませんでした。それは単に:

  • マッピングC-;other-window(窓からサイクリング)
  • マッピングC-'other-frame(フレームを介してサイクリング)。このショートカットを追加した後、実際にフレームの使用を開始しました)。
  • 他の簡単なシングルキーストロークキーバインドを、表示されているフレーム内のバッファーを操作するためのシンプルなカスタム関数にマッピングします。例としては、他のウィンドウにバッファを投げる(2ウィンドウ設定で)、特定のウィンドウの現在のバッファと最後のバッファを切り替える、他のバッファを埋める(これはhelpポップアップするウィンドウを置き換えるのに最適です)(manページやaproposなどを読むとき)以前に表示されていたウィンドウで。

また、初心者が役立つと思われるキーバインディングに関するいくつかの考えを共有したいと思いました。(これが間違った場所である場合はごめんなさい。)具体的な提案はありませんが、むしろ、自分のために効果的なキーバインドのセットを維持できる「哲学」です。

  1. 頻繁に使用されないコマンドは、簡単なキー割り当てに値しません。

    • keyfreq.elあなたが本当にたくさん使っているものをダウンロードして見てください。私は、どのコマンドが私のキーボードで最も価値のある不動産を授与されるかを決定するために、生存の最適な方法を使用します。
    • デフォルトのEmacsキーバインドを取り除くことを恐れないでください。 C-\そのデフォルトのコマンドにマッピングされ(#2で述べた理由から)素晴らしいショートカットがある...そして、それを残すことは犯罪になります:change-input-method。(多分あなたはそれをたくさん使うでしょう、私は確かにそうしません。)
  2. 次の要因により、キーボードショートカットの使いやすさと速度が決まります(最も重要なものから開始)。

    • 継続的に修飾キーを押すと(それが何であれCtrlMetaなど、)。たとえば、私がヒットするC-c C-l C-pよりも、ヒットする方がはるかに高速ですC-x o。個人的にCtrlは、特定のキーシーケンスの連続するキーストロークの間にキーを離す必​​要があるのは非常に不便です。修飾ボタン(この場合はCtrl)を押し続けるだけで簡単になります。(この特定の例は、Ctrlキーとキーを再マップしたという事実に影響される可能性がありCaps-Lockます。)
    • 友達の交代。ヒットするC-c C-l C-pよりもヒットする方がずっと速いですC-p C-' C-;。(試してみれば明らかです。)一般的に言えば、交互の手(または、少なくとも同じ手の交互の指)を使用するキーストロークシーケンスを使用する方がはるかに簡単です。
    • 標準的な手の位置からの逸脱の程度。 これは、そこにいる狩りや熱狂的な愛好家には当てはまりません。しかし、他の人にとっては、最も頻繁に使用されるキーボードショートカットを使用すると、標準のタッチ入力位置にすばやく簡単に戻ることができます。

私が初心者に役立つかもしれないと思ったほんのいくつかの考え。後でさらに追加することがあります。


3

を使用してwindmove.elbs.elバッファをすばやく切り替えます。両方のモードはEmacsに含まれています。

  • windmove.el- 指定された方向(左、右、上、下など)のウィンドウ(現在表示されているバッファー)に切り替えます。

  • bs.el-を使用してbs-cycle-nextbs-cycle-previous現在ウィンドウに表示されていない次のバッファに切り替えます。

あなたと一緒にすることができ、セットアップwindmove (windmove-default-keybindings)に適切なコマンドをバインドするShift-Left ArrowShift-Right Arrowなど、

を設定するにはbs.el、次のように機能します。

 (global-set-key [(f9)]   'bs-cycle-previous)
 (global-set-key [(f10)]  'bs-cycle-next)

バッファーはウィンドウ(フレーム)ではありません!それらを混乱させないでください!
kuanyui

2
また、ウィンドウはフレームではありません。とにかく、windmove.elEmacsWikiページの「バッファの切り替え」の下にあり、さらにbs.elウィンドウではなくバッファで動作します。
ジョー14年

windmoveの機能を明確にしました。
ジョー14年

3

私が知っているバッファを切り替える最も速い方法はですace-jump-buffer。1回のキーストロークでバッファメニューが開き、必要なバッファの横にある文字を選択しますace-jump-line-mode。これは、26個ほどの最新のバッファーに最適です。使用履歴をさかのぼってバッファに切り替えるにido-switch-bufferは、常に適切な選択です。


3

私はブラウザスタイルのタブナビゲーションを好みます。Ctrl + TabとCtrl + Shift + Tabをそれぞれ次のバッファーと前のバッファーにバインドしました。

(global-set-key [C-tab] 'next-buffer)
(global-set-key [C-S-tab] 'previous-buffer)

2

大まかに言って、バッファを切り替えるには2つの方法があり、ほとんどのソリューションはこれらのいずれかに該当します。

  1. ミニバッファーの使用

これはC-x bデフォルトで行われることです。Idoは自動補完を提供するので、TAB TAB TABをそれほど必要としません。helm、projectileなどのプロジェクトは、プロジェクト内のファイルを操作する機能を提供することで簡単になり、idoと一緒に使用すると非常に便利です。

  1. すべてのアイテムがリストされたバッファ全体。

これは、非常に多くのバッファがあり、それらすべてのリストが必要な場合に便利です。バッファを上下に移動し、Enterキーを押して特定のファイルにアクセスできます。Ibufferはそのためにかなり適しています。

私は両方を使用し、これがあなたがそれを設定する方法です。

 (global-set-key (kbd "C-x C-b") 'ido-switch-buffer)
 (global-set-key (kbd "C-x b") 'ibuffer)`

2番目のヘルムも良いオプションです
トム14年

2

idoに加えて、次のセットアップがあります。

  1. 悪モードの場合、次のキーバインディングを使用してバッファを切り替えます

    (define-key evil-normal-state-map (kbd "C-j") 'next-buffer)
    (define-key evil-normal-state-map (kbd "C-k") 'previous-buffer)
    (define-key evil-normal-state-map (kbd "C-S-h") 'evil-window-left)
    (define-key evil-normal-state-map (kbd "C-S-j") 'evil-window-down)
    (define-key evil-normal-state-map (kbd "C-S-k") 'evil-window-up)
    (define-key evil-normal-state-map (kbd "C-S-l") 'evil-window-right)
    
  2. ウィンドウのタイトルとしてバッファ名を設定します。これは、上記のキーバインドでナビゲートするときに役立ちます

    (setq frame-title-format "%b")
    
  3. 悪モードを使用している場合は、を試すことができますevil-leader。頻繁に使用するキーをリーダーにバインドします。例えばあなたはバインドできますC-x b<leader>-b

    (global-evil-leader-mode)
    (evil-leader/set-leader ",")
    (evil-leader/set-key
     "b" 'switch-to-buffer)
    
  4. diredモードをにバインドしますC-<f8>。ここで、ディレクトリ内のファイルを開きたい場合、を押しC-<f8>、ファイル名に移動してのa代わりにを押しますRET。したがって、diredバッファーはすぐに削除されます。

    (global-set-key (kbd "C-<f8>")
            (lambda ()
              (interactive)
              (dired default-directory)))
    (put 'dired-find-alternate-file 'disabled nil)
    
  5. recentfモードを使用して、最近のファイルをナビゲートします。C-x C-r

  6. 最後の重要なポイントは、人間工学に基づいたメカニカルキーボードを使用することです。したがって、ピンキーを傷つける代わりに、手首で「ctrl」キーを簡単かつ迅速に押すことができます。

これが誰かを助けるかもしれないことを願っています。


1

他の回答からわかるように、この特定のタスクを合理化する多くの方法があります。私は個人的にバッファスイッチング装置としてLusty Emacsを使用します。ファジーな補完を非常にうまく処理できるからです。これにより、新しいバッファーを選択するために必要なキーストロークの数が最小限に抑えられます。たとえば、ox-reveal.elに切り替えるにはoxrと入力するだけでよく、スイッチの履歴も追跡するため、2回目でも必要です。


0

バッファをブラッシングし続けたいだけなら、これをinitファイルに追加してください:

(bind-key* "M-l" 'next-buffer)
(bind-key* "M-k" 'previous-buffer)

bind-keyパッケージが必要であり、キーバインディングを希望に合わせて変更できますが、これらのキーバインディングが最も快適であることがわかりました。このスニペットを追加する前に、バインドキーを要求する必要があります。

(require 'bind-key)

0

一般的なアプリケーションのようにC-TabとCS-Tabを使用しています。

(defun change-buffer-until-normal (change-fn)
  (let (current (buffer-name))
    (funcall change-fn)
    (while (and (string-prefix-p "*" (buffer-name))
        (not (eq current (buffer-name))))
      (funcall change-fn))))

(defun my-next-buffer ()
  (interactive)
  (change-buffer-until-normal 'next-buffer))

(defun my-prev-buffer ()
  (interactive)
  (change-buffer-until-normal 'previous-buffer))

(global-set-key [C-tab] 'my-next-buffer)
(global-set-key [C-S-iso-lefttab] 'my-prev-buffer)

0

これは非常にエレガントなソリューションではありません(それは代わりに関数のマクロを使用するため)、それがにジャンプする方法応答しない任意の迅速バッファが、最近使用されたバッファへジャンプするだけか。しかし、それは私にとって非常にうまくいきます:

ido-switch-buffer前のバッファー、その前のバッファー、その前のバッファーなどにジャンプするために使用する一連のマクロがあります。また、便利なキーバインドにこれらのマクロをバインドしました。

最後のバッファーにジャンプするには:

(fset 'my-goto-previous-buffer
      [?\C-x ?b return])

最後から2番目のバッファーにジャンプするには:

(fset 'my-goto-previous-buffer
      [?\C-x ?b ?\C-n return])

最後から2番目のバッファーにジャンプするには:

(fset 'my-goto-previous-buffer
      [?\C-x ?b ?\C-n ?\C-n return])

等(?\C-n訪問したバッファの履歴を好きなだけ遡って広告することができます)。

そこ前のバッファにジャンプする組み込み関数ですが、でマクロを使用する利点はido-switch-buffer、あなたが変数をカスタマイズできることであるido-ignore-buffersような特殊なバッファ削除する*Messages**scratch*、リストから他の不要なバッファを。このように、ジャンプ先のバッファは、実際にジャンプしたいバッファだけです。


-1

私のVMでは、Cx ALT-RIGHT / LEFTが遅すぎます。Cxがステータスバーに登録されるのを待たないと、他に何もできません。さらに、キーが多すぎます。だから私はC-TABとCM-TABをnextバッファーとprevバッファーにマッピングしました。これはとにかくほとんどのWindowsプログラムで行うことです。emacs内から簡単に実行でき M-xます。ステータスバーに移動します。次にglobal-set-key、バインドするキーシーケンスの入力を求めるプロンプトを入力し(C-TAB)、バインドするコマンドの入力を求めます(next-buffer)。それでおしまい!


1
ようこそ。他の答えは、これらのコマンドを他のキーにマッピングすることをすでにカバーしているようです。
アンドリュースワン

正確ではありません-.emacs構成ファイルの変更方法については誰もが話し合っています。私はEmacsセッション内からそれを行う方法を説明してきました
SN
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.