ときどき、編集している2つの機能を互いに連動させて頻繁に切り替えていることに気づきます。これらの状況ではC-s <functionname>
、他の機能に切り替えて、以前に編集していた正確な場所を見つけるためにを続けることは退屈で苦痛です。
マーカーを設定した後、バッファー内の2つの場所を簡単に行き来するにはどうすればよいですか?
ときどき、編集している2つの機能を互いに連動させて頻繁に切り替えていることに気づきます。これらの状況ではC-s <functionname>
、他の機能に切り替えて、以前に編集していた正確な場所を見つけるためにを続けることは退屈で苦痛です。
マーカーを設定した後、バッファー内の2つの場所を簡単に行き来するにはどうすればよいですか?
回答:
Emacsウィンドウ
C-x 2
同じバッファに接続された現在のウィンドウの下に別のウィンドウ(=フレームを分割)を開きます。他のウィンドウに影響を与えることなく、どちらのウィンドウでもポイントを移動できます。
を使用して、あるウィンドウから別のウィンドウに移動できますC-x o
。組み込みのwindmoveライブラリには、ウィンドウ間の移動を容易にするいくつかの機能があります。
この方法が適している場合は、間接バッファもご覧ください。
登録:
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のレジスタ機能のだ撮影利点であれば、もちろん、あなたが、しない限り、あなたが対話的にセットレジスタ(と競合することができない、名前のためのいくつかの競合しない記号ではなく、文字を使いたい行うにはそれ)。
C-x C-x
また、2つの位置の間を前後にジャンプできるため、追加する必要があります。C-u C-SPC
マークリングをポップして再度実行すると、ポイントが別の場所に移動します。
philsの答えに加えて、さらにいくつかのオプションがあります。
helm-semantic-or-imenu:現在のファイルで利用可能なすべての定義を一覧表示します。カーソルが定義内にある場合、蛍光ペンをアクティブにするとその定義が事前選択されます。
sr-speedbar:各ファイルの定義をリストするファイルブラウザー。IDEのアウトラインツリーに似ています。
これには、レジスタとマーカー(両方についての@philsの回答と、マーカーに関するIciclesの回答を参照)に加えて、ブックマーク、特に自動名前付きブックマークまたは一時ブックマークが役立ちます。これらの特別なブックマークタイプにはライブラリBookmark +が必要です。
autonamedブックマークはあなたが名前を必要としないということです。作成と削除は簡単です。キーを押すだけです。同じキーは、ポイントでブックマークを作成または削除します。(デフォルトでは、これはにバインドされてC-x p RET
いますが、もちろん任意のキーを使用できます。)
自動名前付きブックマークは、一般的なブックマークと同様に永続的です。ただし、オプションでそれらを自動的に削除することもできます。
一時的なブックマークを作成したり、既存のブックマークを一時的にしたりすることもできます。たとえば、自動名前付けされたブックマークを自動的に一時的にすることを選択できます。
あなたはすぐにできサイクルブックマークの与えられたセットの中。たとえば、自動名前付きブックマークを切り替えるには、コマンドbmkp-next-autonamed-bookmark-repeat
とbmkp-previous-autonamed-bookmark-repeat
(キーにバインドする)を使用します。
ブックマークした場所をさまざまな方法で強調表示できるため、簡単に見つけることができます。
受け入れられた答えに記載されている間接バッファに関して...
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の状況では、これは次のプロセスにつながります。
M-x winner-mode
M-x clone-indirect-buffer
(新しい間接バッファ名:File1.txt <2>)C-x 1
C-x b
(ステップ3以降に別のバッファへの切り替えが行われない限り、デフォルトは元のバッファになります)。これにより、勝者がスイッチバックする新しい構成が作成されます。前の編集場所(ウィンドウ構成)への切り替えは、スイッチ間でウィンドウ構成が変更されたかどうかによって異なります。
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
です。
あなたが使用している場合evil-mode
、vimの層が、その後、C-o
とC-i
同じように動作します。
コマンドevil-jump-backward
/ を実行しますforward
。C-o
ジャンプリスト内の古い位置にジャンプします。これは自動的に設定されます(マークはモーションコマンドに設定されます)。C-i
逆になります。の代わりにTAB
aの後に使用することもできます。したがって、両方の関数を使用すると、現在のバッファ内を行き来できます。C-o
C-i
この機能をクロスバッファにしたい場合は、httpevil-jumpers
://melpa.org/#/evil-jumperをご覧ください。
«
evil-jumperはevil-modeのアドオンで、ジャンプリストの実装を置き換えて、Vimの動作により密接に模倣します。具体的には、バッファの境界を越えてジャンプし、必要に応じてデッドバッファを復活させます。ジャンプリストはファイルに保存し、セッション間で復元することもできます。»
注:このwikiで学んだ
C-o
をC-i
し、何をするかについて少し拡大してもらえますか?
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-,
サイクリングのソート順()を変更することもできます。
最小限の、しかししばしば有用な可能性-他の機能を覗きたいだけの場合-が設定されている
(setq scroll-preserve-screen-position t)
これを切り替えるときに、あなたの正確な開始のカーソル位置に戻りますC-vとM-v。
evil-mode
Vimスタイルのマーカーを実装します。(m
、つまりevil-set-marker
)でマーカーを設定し、バックティック `(evil-goto-mark
)でマークにジャンプするか、マークの行'
(evil-goto-mark-line
)にジャンプできます。
したがって、あなたは「」との最初の場所でのマークを作成することができますma
して第二の位置にマーク「b」を作成し、ma
その後、および'a
マークにジャンプする「」と'b
「b」をマークするためにジャンプします。
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))
)))
過去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つです。
マクロは便利なキーにすばやくバインドできるため、マクロを利用することもできます。
たとえば、を使用して位置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
、通常の方法でウィンドウ間を簡単に切り替えることができます。