与えられたテキストを領域の周りにラップする方法


11

リージョンの周りにテキストを適用する必要がある状況がよくあります。HTMLおよび単純なケースの場合、これ用のライブラリがすでにあります。しかし、一般的なケースはどうですか?リージョンの最初と最後に何を挿入するか尋ねられますか。


これを使用して、任意のコンテンツを1回挿入するか、または少数のペアを何度も挿入しますか?後者の場合、smartparensなどのライブラリが役立つことが判明し、カスタムペアで拡張できます。たとえば、ペアを追加できます<?php... ?>そして、リージョンとタイプ<?php(またはキーバインド)を選択すると、ペアでラップされます。ただし、多くのワンショットペアがある場合、これらのライブラリを使用する簡単な方法はありません。
T. Verron 2014年

@ T.Verron:私はそれらが存在することを知っています。ただし、コードを
調べて

回答:


6

私はググってみて、この投稿をJohn D. Cookが見つけました。彼は、簡単なインタラクティブ関数を作成して、地域のHTML / XMLタグを簡単に取得する方法を示しています。それから私は関数を2回尋ねるように変更しました。

(defun tag-word-or-region (text-begin text-end)
  "Surround current word or region with given text."
  (interactive "sStart tag: \nsEnd tag: ")
  (let (pos1 pos2 bds)
    (if (and transient-mark-mode mark-active)
        (progn
          (goto-char (region-end))
          (insert text-end)
          (goto-char (region-beginning))
          (insert text-begin))
      (progn
        (setq bds (bounds-of-thing-at-point 'symbol))
        (goto-char (cdr bds))
        (insert text-end)
        (goto-char (car bds))
        (insert text-begin)))))

さらに重要なことに、この関数は補助ツールとしても使用できます。たとえば、キーをバインドしてテキストの特定のビットをマップする場合などです。

(defun tag-php ()
  (interactive)
  (tag-word-or-region "<?php " "?>"))

ところで、これがいくつかの境界ケースを処理する方法は最適ではありません。先頭の検索が失敗し、両方のタグが最後に残る場合があります。evilここで干渉するのは私が使用しているものかもしれません。おそらく、タイプの関数はinteractive "r" より堅牢に機能しましたか?
nperson325681 2014年

4

別のアプローチを提案します。リージョンがある場合、定義上、リージョンpointの先頭(または末尾)にある必要があり、リージョンmarkは末尾(または先頭)にあります。つまり、必要なときにテキストを入力し、を使用してexchange-point-and-markC-x C-xリージョンのもう一方の端にジャンプできます。ラッパーの後半を入力すれば完了です。

挿入テキストの入力を明示的に求められることはありませんが、少ない労力で同じことを達成する方法があるとは思えません。


開始と終了のテキストが同じである場合、何かをmultiple-cursors調整して、アクティブ領域の開始と終了に同時にテキストを挿入できるかどうか疑問に思います。
グルカ2014年

とにかく、あまり編集者ではないユーザーが手動でやらなければならないような方法です。とにかく、私はあなたの答えからサブテキストとしてマクロの使用を読みました、言わなければなりません。私はあなたのスタイルが好きです
nperson325681 2014年

1
@progo-ありがとう:)これはより手動のアプローチのように聞こえますが、実際には使用するキーストロークよりも使用するキーストロークが少なくなっています。このアプローチでは、ラッピングテキスト以外に必要なのはだけですC-x C-x。あなたの答えで、あなたはあなたの関数を呼び出す必要があります(C-c something)、そしてあなたはまたreturn各エントリーの後にヒットする必要があります。したがって、何をしても、さらに2つのキーストロークがあります。そうは言っても、elispから何かを呼び出したい場合は役に立ちません。
タイラー

3

多様性のためだけに:

いくつかの任意の開始と終了のテキストでこれを行うための別の方法は、使用することですreplace-regexp域に:試合.+とと交換before \& after、またはあなたが使用したいものは何でもテキストbeforeafter

これを行うコマンドを書くこともできますが、あるファイルで同じ開始/終了テキストを複数の場所に適用したい場合を考えています。マクロを記録するか、ミニバッファー履歴を使用して別の領域で繰り返すことができます。

もちろん、ラップするテキストが正規表現として表現できる場合は、領域を選択する必要もなくquery-replace-regexp、バッファーでa を実行できますが、ラップするテキストは一貫性がないと考えられます。

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