バッファ内の2つの場所を切り替える方法


38

ときどき、編集している2つの機能を互いに連動させて頻繁に切り替えていることに気づきます。これらの状況ではC-s <functionname>、他の機能に切り替えて、以前に編集していた正確な場所を見つけるためにを続けることは退屈で苦痛です。

マーカーを設定した後、バッファー内の2つの場所を簡単に行き来するにはどうすればよいですか?


3
あなたは間違っています。両方の機能が同時に表示されるように、垂直分割ビューが必要です。
キャプテンコードマン14年

8
OPが「間違っている」ことには同意しません。分割ウィンドウは役に立ちますが、OPは両方の機能を編集するときにウィンドウ間を前後にジャンプする必要があります。それに加えて、質問は特定のユースケースよりも一般的です:OPは、バッファ内のさまざまな場所にすばやくジャンプできるようにしたいです。以下の多くの回答は、それを行うためのいくつかの便利な方法を示しています。
ダン

@Danそれはクールな人であり、私はあなたに同意しますが、私の応答は彼の問題を解決することを意図していません-代替方法があることを指摘するだけです。
キャプテンコードマン14年

4
@CaptainCodeman、それは問題ありませんが、以下のT. Vernonの回答は分割ウィンドウの代替手段を提供します。私のコメントは、投稿における積極的な表現に対するより一般的なリクエストとして扱ってください。
ダン

1
@CaptainCodemanあなたは絶対に正しい。emacsが垂直分割ビューをサポートしていることを知りませんでした。そのため、これらの垂直分割ビューの使用法の詳細を示す回答を受け入れました。
ヴェダードシャキブ14

回答:


20

Emacsウィンドウ

C-x 2同じバッファに接続された現在のウィンドウの下に別のウィンドウ(=フレームを分割)を開きます。他のウィンドウに影響を与えることなく、どちらのウィンドウでもポイントを移動できます。

を使用して、あるウィンドウから別のウィンドウに移動できますC-x o。組み込みのwindmoveライブラリには、ウィンドウ間の移動を容易にするいくつかの機能があります。

この方法が適している場合は、間接バッファもご覧ください

ここに画像の説明を入力してください


間接バッファの使用についてもう少し行を追加する必要があるかもしれません。別のウィンドウを使用するよりも実際に便利です(そしてもう少し複雑です)。
ffevotte 14年

@Francesco(間接バッファに関する他の回答とともに)あなたの今の意味がわかります。実際、これも非常に使いやすいオプションです。それは私が念頭に置いていた使用法ではありません。間接バッファの使用は別のウィンドウを使用することに置き換わるものではありませんが、たとえば、ナローイングでビューを変更することができます。時間を見つけたら、答えにいくつかの単語を追加します。
T.バーロン14年

56

登録:

C-xrSPC走るpoint-to-register
C-xrj走るjump-to-register

プロンプトが表示されたら、任意の文字を入力してレジスタを指定します。1

ブックマーク:

C-xrm走るbookmark-set
C-xrb走るbookmark-jump

マークリング:

C-SPCC-SPC現在の位置をマークリングにプッシュします(アクティブのままにしません)。
C-uC-SPC前の位置にジャンプして、マークリングをポップします。これを繰り返し使用して、リング全体をナビゲートできます。

一部のコマンド(特に、元の場所から未知の距離または任意の距離に移動する可能性のあるコマンド)が自動的にマークリングにプッシュされるため、C-uC-SPC後で戻るために使用できます。これにはが含まれているisearchため、C-sどこかに移動して使用した後、簡単に再びジャンプできます。

交換ポイントとマーク:

そして、Tu Doがコメントしているように、2つの場所間をジャンプするのに非常に便利なC-xC-x実行exchange-point-and-markです。また、マーク/リージョンもアクティブになりますがC-SPC、強調表示をクリアするために使用できます。


1あなたのelispのレジスタ機能のだ撮影利点であれば、もちろん、あなたが、しない限り、あなたが対話的にセットレジスタ(と競合することができない、名前のためのいくつかの競合しない記号ではなく、文字を使いたい行うにはそれ)。


2
C-x C-xまた、2つの位置の間を前後にジャンプできるため、追加する必要があります。C-u C-SPCマークリングをポップして再度実行すると、ポイントが別の場所に移動します。
火ドゥ

18

philsの答えに加えて、さらにいくつかのオプションがあります。

  • helm-all-mark-rings:ローカルマークリングとグローバルマークリングの両方のコンテンツをわかりやすいインターフェイスで表示できるため、いつでも元の場所に戻ることができます。でマークをプッシュできC-SPC C-SPCます。デモ:

ヘルムオールマークリング

  • helm-semantic-or-imenu:現在のファイルで利用可能なすべての定義を一覧表示します。カーソルが定義内にある場合、蛍光ペンをアクティブにするとその定義が事前選択されます。

  • sr-speedbar:各ファイルの定義をリストするファイルブラウザー。IDEのアウトラインツリーに似ています。


9

これには、レジスタとマーカー(両方についての@philsの回答と、マーカーに関するIciclesの回答を参照)に加えて、ブックマーク、特に自動名前付きブックマークまたは一時ブックマークが役立ちます。これらの特別なブックマークタイプにはライブラリBookmark +が必要です。

  • autonamedブックマークはあなたが名前を必要としないということです。作成と削除は簡単です。キーを押すだけです。同じキーは、ポイントでブックマークを作成または削除します。(デフォルトでは、これはにバインドされてC-x p RETいますが、もちろん任意のキーを使用できます。)

  • 自動名前付きブックマークは、一般的なブックマークと同様に永続的です。ただし、オプションでそれらを自動的に削除することもできます。

  • 一時的なブックマークを作成したり、既存のブックマークを一時的にしたりすることもできます。たとえば、自動名前付けされたブックマークを自動的に一時的にすることを選択できます。

  • あなたはすぐにできサイクルブックマークの与えられたセットの中。たとえば、自動名前付きブックマークを切り替えるには、コマンドbmkp-next-autonamed-bookmark-repeatbmkp-previous-autonamed-bookmark-repeat(キーにバインドする)を使用します。

  • ブックマークした場所をさまざまな方法で強調表示できるため、簡単に見つけることができます。


7

受け入れられた答えに記載されている間接バッファに関して...

M-x clone-indirect-buffer現在のバッファの間接バッファを作成します。新しいバッファの名前には「<2>」が追加されます(重複したバッファ名を既に持っている場合はもっと大きな数)。新しいバッファが新しいウィンドウで開きます。C-x 0またはを使用して、単一のウィンドウに切り替えることができますC-x 1

ではM-x winner-mode、あなたは簡単に2つのロケーション間で切り替えることができます。C-c <left>/ M-x winner-undoおよびC-c <right>/ M-x winner-redoウィンドウ構成を切り替えます。この場合、構成は、1つのファイルを表示する2つのバッファー内の位置になります。

注:winner-undoおよびwinner-redo関数は、構成のリストで機能します。構成が変更された場合、たとえばポイントを移動すると、現在の構成がリストの先頭になり、winner-redo無効になります。この場合winner-undo、前の位置に戻ります。

OPの状況では、これは次のプロセスにつながります。

  1. 勝者モードをオンにする M-x winner-mode
  2. 訪問ファイル(ファイル名:File1.txt、バッファー名:File1.txt)
  3. M-x clone-indirect-buffer (新しい間接バッファ名:File1.txt <2>)
  4. 現在のウィンドウを唯一のウィンドウにする C-x 1
  5. 最初の編集場所を見つけて、変更を加えます。
  6. ファイルを訪問する元のバッファに切り替えますC-x b(ステップ3以降に別のバッファへの切り替えが行われない限り、デフォルトは元のバッファになります)。これにより、勝者がスイッチバックする新しい構成が作成されます。
  7. 別の編集場所を見つけて、変更を加えます。

前の編集場所(ウィンドウ構成)への切り替えは、スイッチ間でウィンドウ構成が変更されたかどうかによって異なります。

  • C-c <left>/ を使用して切り替えを行った場合M-x winner-undo
  • 変更は使用してスイッチを作らされていない場合はC-c <left>/をM-x winner-undoバック用およびC-c <right>/ M-x winner-redo前進のために。

変更とは、別winner-undoまたは以外のものwinner-redoです。


3

あなたが使用している場合evil-mode、vimの層が、その後、C-oC-i同じように動作します。

コマンドevil-jump-backward/ を実行しますforwardC-oジャンプリスト内の古い位置にジャンプします。これは自動的に設定されます(マークはモーションコマンドに設定されます)。C-i逆になります。の代わりにTABaの後に使用することもできます。したがって、両方の関数を使用すると、現在のバッファ内を行き来できます。C-oC-i

この機能をクロスバッファにしたい場合は、httpevil-jumpers//melpa.org/#/evil-jumperをご覧ください。

«
evil-jumperはevil-modeのアドオンで、ジャンプリストの実装を置き換えて、Vimの動作により密接に模倣します。具体的には、バッファの境界を越えてジャンプし、必要に応じてデッドバッファを復活させます。ジャンプリストはファイルに保存し、セッション間で復元することもできます。»

注:このwikiで学んだ


これは質問に対する答えを提供しません。著者に批判や説明を求めるには、投稿の下にコメントを残してください。
ダン

1
D'oh、そしてその自動化されたコメントによって、私は実際に答えが別の答えに対するコメントであるように意図されたように見えることを意味します。これがそれ自体で答えであることを意図している場合、何C-oC-iし、何をするかについて少し拡大してもらえますか?
ダン

あなたが正しい !できた。
エビンス

2

Iciclesを使用するとmark-ring、各バッファーまたはglobal-mark-ring(各バッファーに1つのマーカーがある)のマーカー間をすばやく移動できます。

これは、マルチコマンド C-- C-SPC(バッファ用mark-ring)またはC-- C-x C-SPC(用global-mark-ring)を使用して行います。キーを1回押した後、通常のIciclesサイクリングキーなどを使用して、リングのマーカー間を移動します。

(プレフィックスargのない同じキーは、バニラEmacsで行うのと同じように、それぞれマーク(set-mark-command)を設定し、グローバルマーク(pop-global-mark)をポップします。)

各マーカーの行のテキストは、補完候補として使用されます。入力すると、ミニバッファーの入力により候補が一致するものに絞り込まれます(たとえば、部分文字列または正規表現の一致)。一致するマーカーをすばやく切り替えたり、マーカーのいずれかに直接アクセスしたりできます。C-,サイクリングのソート順()を変更することもできます。


2

最小限の、しかししばしば有用な可能性-他の機能を覗きたいだけの場合-が設定されている

(setq scroll-preserve-screen-position t)

これを切り替えるときに、あなたの正確な開始のカーソル位置に戻りますC-vM-v


1

evil-modeVimスタイルのマーカーを実装します。(m、つまりevil-set-marker)でマーカーを設定し、バックティック `(evil-goto-mark)でマークにジャンプするか、マークの行'evil-goto-mark-line)にジャンプできます。

したがって、あなたは「」との最初の場所でのマークを作成することができますmaして第二の位置にマーク「b」を作成し、maその後、および'aマークにジャンプする「」と'b「b」をマークするためにジャンプします。


1

imenuと以下のコードを使用します

(defvar rimenu-position-pair nil "positions before and after imenu jump")
(add-hook 'imenu-after-jump-hook
          (lambda ()
            (let ((start-point (marker-position (car mark-ring)))
                  (end-point (point)))
              (setq rimenu-position-pair (list start-point end-point)))))

(defun rimenu-jump ()
  "jump to the closest before/after position of latest imenu jump"
  (interactive)
  (when rimenu-position-pair
    (let ((p1 (car rimenu-position-pair))
          (p2 (cadr rimenu-position-pair)))

      ;; jump to the far way point of the rimenu-position-pair
      (if (< (abs (- (point) p1))
             (abs (- (point) p2)))
          (goto-char p2)
          (goto-char p1))
      )))

1

過去20年ほど、私はこれらの2つの宝石を使用してきました。

(defun ska-point-to-register ()
  "Store cursorposition _fast_ in a register. Use ska-jump-to-register
to jump back to the stored position."
  (interactive)
  (point-to-register 8))

(defun ska-jump-to-register ()
  "Switches between current cursorposition and position
that was stored with ska-point-to-register."
  (interactive)
  (let ((tmp (point-marker)))
    (jump-to-register 8)
    (set-register 8 tmp)))

それらをC-にバインドします。およびC-、それぞれ、それを実現することなく常に使用します。

はい、レジスタとマーカーなどははるかに柔軟で強力ですが、それでも、これは私が他のエディターに切り替えることを不可能にする小さな、迅速なヘルパーの1つです。


1
うわー、あなたは私が生きてきたよりも長い間これを使ってきました。
ベダードシャキブ

NodeやVisual Studio Codeの世界ではまだそうなっていないと思いますが、知っている人は... :-)若くて賢い人たちがまだEmacsを使っているのを見てうれしいです。ああ、私はまだ50歳ではありません;-)
ステファンカンプハウゼン

これはすごいです。transient-mark-modeを有効にして2つの任意の場所を切り替える方法を見つけようとしてきましたが、これで問題は本当によく解決します:)ありがとう。
PlagueHammer

0

マクロは便利なキーにすばやくバインドできるため、マクロを利用することもできます。

たとえば、を使用して位置Nへのジャンプを記録し、で<F3> M-g g N <F4>キーF5に割り当てC-x C-k b <F5>ます。次に、位置MとF6で同じ操作を行います。これからは、F5とF6を交互に切り替えて、NとMの間をジャンプできます。

さらに簡単なのは、<F4>最後に記録されたマクロと最後から2 番目のマクロを実行するため<C-u> F4、キーバインド手順をスキップして、とを使用<F4>して位置を変更するだけ<C-u> F4です。


別のかなり急進的な可能性は、を使用して別のウィンドウに間接バッファを作成すること<C-x> 4 cです。このバッファの内容は同じですが、ポイントの位置が異なる場合があります。これで<C-x> o、通常の方法でウィンドウ間を簡単に切り替えることができます。

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