Emacsで不連続な領域を選択する方法は?


31

現在のバッファーで既にテキストを選択しているとします。前の選択を維持したまま、別のテキストを選択することは可能ですか?

追加:この機能の動機の1つは次のとおりです。次のようなテキストがあると仮定します。

paragraph 1 ...

paragraph 2 ...

paragraph 3 ...

paragraph 4 ...

paragraph 5 ...

いくつかの段落(2、4、6など)を削除して、段落1の前に挿入したいと思います。


1
二次 選択があります。
わさま​​さ

2
パッケージmultiselectがあります:skamphausen.de/cgi-bin/ska/multiselectちょっとしたハックのように見えます。
トバイアス

選択する対象のサイズと理由に応じて、multiple-cursors解決策が得られる場合があります。
ジョーダンビオンド

@wasamasaあなたが提供したリンクの指示に従いました。最初の選択の後、メタキーを保持している2番目の領域を選択しました。選択されましたが、2つの問題があります。(1)2番目の選択は、実際の選択ではないようです。コピーまたは削除が機能しないためです。(2)3番目の選択をこの方法で選択することはできません。
名前

1
Emacs Wikiには、二次選択に関する優れたセクションがあります。さまざまな機能強化により、たとえばキーボードからさらに使いやすくなりました。
ドリュー

回答:


43

あなたは使用することができますappend-next-kill(と結合したC-M-w上記の挿入したいテキストを蓄積するために、デフォルトでは)paragraph 1

  1. paragraph 2通常どおりに殺します。

  2. それを殺す前にマークparagraph 4して押してくださいC-M-w。前に移動したいすべての段落に対してこの手順を繰り返しますparagraph 1

完了したら、前に蓄積されたテキストをヤンクできますparagraph 1


5
基本的なものであっても、学ぶべき新しいことが常にあります!私はこれを行う必要があるときにキルリングを移動することで通常多くのキーを押すことを無駄にするので、これは非常に便利です。私はこれをもう少し賛成できればいいのに…
意味のあるユーザー名

9

マークリングと組み合わせてレジスタを使用できます。で現在のマークをプッシュし、C-<SPC> C-<SPC>後でで回復しますC-u C-<SPC>。たとえばb、でレジスタに保存し、でC-x r <SPC> b後でジャンプしC-x r j bます。

次に、別の地域をマークします。 C-u C-x r s aマークされた領域をコピーしてa、テキストを登録および削除します。次に、次の領域をマークし、C-u C-x r + aそのレジスタに別の選択を追加してa削除します。

その後、でコンテンツを挿入できC-x r i aます。

Emacsマニュアルの「レジスタへのテキストの保存」セクションを参照してください。


5

Emacs-24.4の新しい長方形領域のサポートは、実際にこの機能に必要なインフラストラクチャ(の大部分)を導入しました[結局、長方形領域不連続な領域です]。

そのため、求めている機能だけを提供する「分割領域」パッケージを実装できるようになりました。

確かに、多くのEmacsコマンドはまだ新しいインフラストラクチャを使用するように適応されていないため(upcase-region、またはundo-in-region、query-replaceなどのコマンドなど)、したがって、四角形ではまだ適切に動作しません(したがって、それらは「分割領域」でも適切に動作しません)、しかしこれらはバグであり、うまくいけば時間とともに修正されるはずです。


4

browse-kill-ring.elをインストールします

関心のあるすべての領域をコピーアンドキルします。

再挿入を開始する場所に行きました。

M-x browse-kill-ring RET バッファを開き、その中にカーソルを置きます。

入力nしてチャンクを移動します。

RET オリジナル/その他のバッファのポイントにチャンクが挿入されます。


3

操作する行を正規表現の一致によって区別できる場合は、発生モードを使用して新しいウィンドウで表示できます。その後、発生編集モードを使用してそれらを編集し、元のバッファーにOccurバッファーで行った変更を反映させることができます。

これは、たとえば、複数のカーソルモードとの組み合わせで見事に機能します。Occurバッファーに表示するように選択した行は、元のバッファー内の距離に関係なく連続して表示されるため、すべての行をマークするか、サブセットを作成し、mc/edit-linesそれらを一度にアクティブ化して編集します。(はい、複数のカーソルでこれをすべて単独で実行できることは知ってmc/mark-all-like-thisいますが、オプションがあると便利です。)

複雑な正規表現の検索と置換の設定や、バッファの各行で順番に実行する必要があるマクロなど、作業したい行のみが表示されている場合に簡単に実行できるその他の編集操作この方法でも実行できます。


3

これは一般的な質問に対応しますが、特に言及したユースケース(コードを少し移動する)には対応しません。

Emacsには、非隣接領域と呼ばれるものがあります。これは、あなたが尋ねている種類の選択です。Vanilla Emacsは、長方形である場合を除いて、非連続領域を作成する特別な方法を提供しません。しかし、ライブラリゾーンはそうします。

ライブラリゾーンでは、バッファに複数のゾーンを定義できます。ゾーンリストは、連続しない領域です。また、使用方法に応じて、複数のリージョンと考えることもできます。複数のゾーンリストをいつでも定義して、それぞれ異なるゾーン変数に割り当てることができ、それらを切り替えることができます。

ライブラリBookmark +も使用する場合、ゾーンのリストを永続的に保存し、後のEmacsセッションでそれらを復元できます。Bookmark +では、ブックマークに任意のタグを割り当てることもできます。つまり、ゾーンのリストにタグを付けることができます。

通常、特定のゾーンリスト内のゾーンは同じバッファ内にありますが、そうである必要はありません。この場合、ゾーンリストは非連続領域よりも一般的です。各ゾーンには、ゾーンの制限だけでなく、追加の情報を含めることができ、識別子を持つことができるという点でもより一般的です。

ゾーンを作成するにはいくつかの方法があります。最も簡単な方法の1つは、C-x n aアクティブリージョンからゾーンを定義し、それを現在のゾーンセットに追加することです。(C-x n nnarrow-to-region)は、ナローイングに加えて、これも行います。)

これらは、ゾーンのセット(リスト)でできることの一部です。

  • それらを並べ替えます。
  • 隣接または重複するゾーンを結合(結合)します(並べ替えを含む)。
  • それらを交差させます。
  • リスト内のゾーンにバッファを絞り込みます。絞り込み間を循環します。複数のナローイングを参照してください。
  • リスト内のゾーンをアクティブリージョンとして選択します。地域間を循環します。
  • それらを検索します(最初に自動的に結合されます)。このためには、ライブラリIsearch +が必要です。
  • それらに対するクエリ置換。
  • それらをハイライトしてハイライトを解除します。(このためには、ライブラリハイライトまたはライブラリが必要facemenu+.elです。

Narrow Indirectも参照してください。これにより、特定のバッファのクローンであり、バッファのさまざまな部分に絞り込まれる間接バッファを作成できます。


2

別のオプション:段落の転置

完全を期すために、マークされた領域を使用して段落の順序を変更することができますM-0 M-x transpose-paragraph(引数がゼロの場合tra-par、ポイントとマークが含まれる段落、つまり領域の開始と終了を入れ替えます)。

ちなみに、これはすべてのtranspose-.*コマンド(-words、-sexp、-sentences、...)で機能し、多くの状況で非常に便利です。


2

もう1つの方法は、objedパッケージを使用することです(私は作成者です)。mポイントが現在のタイプの次のオブジェクトに自動的に移動されるように、任意のテキストオブジェクトをマークできます。オブジェクトに移動してマークを解除し、もう一度mを押します。以下にスクリーンキャストの例を示します(マーキング行を表示しますが、段落、定義解除などの他のオブジェクトでも機能します)。

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


Melpaからこのパッケージをインストールしようとすると、エラーが発生しますpackage-install-from-archive: http://melpa.milkbox.net/packages/objed-20181201.1346.tar: Not found
名前

@Nameパッケージリストを更新する必要があるようです。試してみてくださいM-x package-refresh-contents、その後M-x package-install
クレメラ

@Name動作しますか?さらに質問がある場合はお知らせください。
クレメラ

パッケージをインストールできました。うまく機能しているようで、その機能をすべてテストしていません。ありがとうございました。
名前
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.