複数カーソルの基礎


55

私は最近multiple-cursors、について学びました 。これは非常に便利なパッケージのようです。元のリポジトリのドキュメントを調べましたが、コマンドはまだ少しわかりにくいように見えます。

その後、Emacs Rocks!でビデオを見ましたが、ビデオは素晴らしいですが、それは主に、それを行う方法multiple-cursorsではなく、できることに焦点を当てています。

最も基本的な機能を説明するウォークスルー、チュートリアル、または例はありますか?


4
multiple-cursorsREADMEファイルを読むだけで、すぐに起動して実行することができました。私の推薦はただ学ぶことmc/mark-next-like-thisです。試してみて、それが何をするのかを理解してください。「複数のカーソルでできるかどうか」で始まる質問があるときはいつでも、READMEを参照してください。それはすべて、Emacs Rocksよりも基本的な入門だと思います!ビデオは初心者に役立ちます。
nispio 14年

完全に同意する!それを使用する方法は絶対に不明です。私はちょうどその後、私は複数のカーソルを見たが、彼らはただのテキスト入力した後。消える(GitHubの上で述べたようにではないのMx経由)をKBDとMC /編集ラインがバインドさんのラインを隠してきた
ディマFominを

回答:


19

@bastibeの説明に加えて、複数のカーソルを使用して、行グループの先頭/末尾からテキストを追加または削除します。

  1. ポイントを関心領域の先頭または末尾に移動します
  2. 呼び出しset-rectangular-region-anchor(あなたが好きなキーにバインドされH-spaceている、ハイパーキーを持っている場合、マグナーズからの提案は、だと思います)
  3. 編集するすべての行にカーソルがあるまでC-n、ポイントを行(およびC-p)ずつ前後に移動しました
  4. 必要に応じてテキストを挿入または削除し、必要に応じて行の最後(C-e)に移動して変更を加えます。

あなたは使用することができforward-wordforward sentenceあなたはそれぞれの行のテキストが同一でない場合でも、各行に4ワードを編集することを可能にする、線に沿って前後に移動することなど。

例として、私は常にこの種の仕事をしています:

  • C-u M-!ls / test-dat / pp5 / * fsaRETURN

    これにより、pp5ディレクトリの内容がバッファに挿入されます。!リストの最初にポイントを置きます:

!/test-dat/pp5/ONAB-6-5_Frag#89.fsa
/test-dat/pp5/QCJB-22-5_Frag#90.fsa
/test-dat/pp5/ONGL-1-5_Frag#102.fsa
/test-dat/pp5/ONGL-1-5_Frag#78.fsa
  • H-spaceC-nx 4ですべての行にカーソルを追加します
  • 各行を複製します C-k C-y space C-y C-a

!/test-dat/pp5/ONAB-6-5_Frag#89.fsa /test-dat/pp5/ONAB-6-5_Frag#89.fsa
!/test-dat/pp5/QCJB-22-5_Frag#90.fsa /test-dat/pp5/QCJB-22-5_Frag#90.fsa
!/test-dat/pp5/ONGL-1-5_Frag#102.fsa /test-dat/pp5/ONGL-1-5_Frag#102.fsa
!/test-dat/pp5/ONGL-1-5_Frag#78.fsa /test-dat/pp5/ONGL-1-5_Frag#78.fsa
  • M-dx 3 C-d C-fx3 M-dx3 <-で最初のセクションを変数名にトリミングします

ONAB-6-5 <-! /test-dat/pp5/ONAB-6-5_Frag#89.fsa
QCJB-22-5 <-! /test-dat/pp5/QCJB-22-5_Frag#90.fsa
ONGL-1-5 <-! /test-dat/pp5/ONGL-1-5_Frag#102.fsa
ONGL-1-5 <-! /test-dat/pp5/ONGL-1-5_Frag#78.fsa
  • 次に、実際のファイル名を関数にラップしてロードします:read.file(C-d" C-e")RETURN

ONAB-6-5 <- read.file("/test-dat/pp5/ONAB-6-5_Frag#89.fsa")
QCJB-22-5 <- read.file("/test-dat/pp5/QCJB-22-5_Frag#90.fsa")
ONGL-1-5 <- read.file("/test-dat/pp5/ONGL-1-5_Frag#102.fsa")
ONGL-1-5 <- read.file("/test-dat/pp5/ONGL-1-5_Frag#78.fsa")

そして出来上がり、あなたはそのリストを読むためにファイルリストをコードに変換しました。実際に説明するよりも実際に説明する方がはるかに難しいのです!


3
これと同じことを頻繁に行う場合は、キーボードマクロでラップできます。キーボードマクロとmultiple-cursors非常に強力な組み合わせを作成できます。
nispio

@nispioは同意しました!時々、同じプロセスを繰り返しているので、マクロが役立ちます。ただし、多くの場合、ワークフローの途中でわずかな違いがあり、マクロを「壊す」わずかな変更が必要になります。
タイラー14年

1
多くの場合、正規表現を使用して、カーソルをジャンプする場所を正確に記述することができます。このような場合には、使用してphi-searchのようなコマンドで移動するよりも、より堅牢にすることができますM-f (x3)
nispio

@nispio確かに、それは状況に依存します。一貫して構造化された名前を使用すると、単語ごとに簡単に移動できます。組み込みのemacs検索コマンドはmcでは壊れやすいため、複数のカーソルで検索を使用したことはありませんでした。私は知らなかったphi-search、それは素晴らしいですね!
タイラー14年

22

基本的に、次の2つの使用例がありmultiple-cursorsます。

  • いくつかの文字列を置き換えます。文字列の1つのインスタンスをマークし、次にmc/mark-next-like-thismc/mark-previous-like-thisを使用して、そのインスタンスをさらにマークします。その後、すぐにヒットC-wしてすべてのインスタンスを削除し、代わりに新しい文字列を書き込みます。これを頻繁に使用して、コード内の変数の名前を変更します。
  • 複数の場所を同時に編集します。前と同様に文字列の複数のインスタンスをマークしますが、を使用して選択をキャンセルしますが(カーソルではなく)C-g、異なる行の同じ列にマークとポイントを配置し、mc/edit-lines1行に1つのカーソルを取得します。これらのカーソルのすべてを操作する通常の編集コマンドを使用できるようになりました。

最初のユースケースは特に便利ですexpand-region。私がしているer/expand-regionにバインドされたC-j、とmc/mark-next-like-thisしてmc/mark-previous-like-thisC->してC-<。これにより、ワードポイントがオンになっていることを簡単に選択し、そのワードの次/前の出現を即座にマークできます。

2番目のユースケースは、マクロのほとんどの用途を置き換えてくれました。マクロを記録し、それを複数の場所に適用する代わりに、すべての場所にカーソルを置き、すべての場所で一度に操作を行います。


ありがとう@bastibe。multiple-cursors 例えばmark-next-like-this&に推奨される特定のバインディングmark-previous-like-this
アメリオバスケスレイナ14年

ポストに概説されているよう@ user815423426、私が使用C->してC-<のためにmark-next-like-thismark-previous-like-this
バスティーブ14年

検索と置換に標準M-%を使用しないのはなぜですか?
ディマフォミン

6

私は時々私が時々使用するいくつかのエキストラを追加したいと思いmultiple-cursorsます。

次のことが有用であることがわかりました。

iy-go-to-char

時々、次#または次,または特定の区切り文字に移動する必要があることに気づきます。これは、カーソルごとに異なる数の単語を移動する必要がある場合に特に便利です。関数iy-go-to-charとを提供します。これらの関数をiy-go-to-char-backwardバインドして使用できます。

拡張領域

これはiy、各カーソルの下にわずかに異なる行があり、ポイントの下の引用符付き文字列などを選択したい場合と同様の理由で本当に便利です。

カスタムのもの

これらは私の設定では単なる省略ですが、便利です。おそらく私によって書かれていません。

入力のプロンプト
各カーソルの下に異なる文字列を配置する要求に応じて、Magnarsからこれを取得しました。コードは単純ですが、何かにバインドして複数のカーソルに使用すると、場所ごとにわずかに異なるものを挿入する便利な方法です。

(defun prompt-for-insert ()
  (interactive)
  (insert (read-string "Insert: ")))

ポイントのインクリメント番号
これは、SOまたはemacswikiから取得されました。どっちがわからない。それはそれ自体で非常に有用であり、またmc/insert-numbers

(defun my-increment-number-decimal (&optional arg)
  "Increment the number forward from point by 'arg'."
  (interactive "p*")
  (save-excursion
    (save-match-data
      (let (inc-by field-width answer)
        (setq inc-by (if arg arg 1))
        (skip-chars-backward "0123456789")
        (when (re-search-forward "[0-9]+" nil t)
          (setq field-width (- (match-end 0) (match-beginning 0)))
          (setq answer (+ (string-to-number (match-string 0) 10) inc-by))
          (when (< answer 0)
            (setq answer (+ (expt 10 field-width) answer)))
          (replace-match (format (concat "%0" (int-to-string field-width) "d")
                                 answer)))))))

eval-and-replace
これは非常に強力で、いくつかの本当に便利なビット「n」個を有効にします。sexpがカーソルの背後にあるものを評価し、評価の結果を挿入します。
組み合わせて、multiple-cursors-numbersたとえば2の累乗、または0 1 2 0 1 2 0 1 2各行または何かにまたがるシリーズを挿入します。(私はこれらの両方を便利に実行しました)またはそれを使用して、s.elこれらの退屈なjava configをデフォルトのもので書き出します。あなたはそれぞれを書きCONFIG_VALUE_VARIABLE、それからCONFIG_VALUE_VARIABLE = "configValueVariable"を実行することでそれに変えs-camel-caseます。

(defun eval-and-replace ()
  (interactive)
  (let ((value (eval (preceding-sexp))))
    (kill-sexp -1)
    (insert (format "%s" value))))

iy-go-to-charは非常に役立ちます。まさに私が探していたもの。
ハインリッヒハートマン

1
  1. 選択したいものの最後に移動します*。
  2. C-S-bまたはM-S-bを押して、選択した部分を取得するまで逆方向に選択します。また、左シフト矢印も使用できます。
  3. 次に、複数の項目を選択するまで(キーがキーボードのキーの上にあるC->場合はShift >キーを押します)を押します。

*逆方向に選択することが重要です。さもないと、最初の選択でカーソルが間違った位置に配置されます。

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