Emacs にコードのブロックをアンラップさせるにはどうすればよいでしょうか?
-
09-06-2019 - |
質問
emacs バッファーに次のような行があるとします。
foo -option1 value1 -option2 value2 -option3 value3 \
-option4 value4 ...
次のようにしたいです:
foo -option1 value1 \
-option2 value2 \
-option3 value3 \
-option4 value4 \
...
各オプションと値のペアを別の行に記述したいと考えています。また、後続の行には、固定量の空白を追加するのではなく、モードに応じて適切にインデントしてもらいたいと考えています。コードが現在のブロックで動作し、最初の非空白行またはオプションと値のペアが含まれていない行で停止することを希望しますが、選択した領域で動作することに落ち着く可能性があります。
これを行うための elisp 関数を知っている人はいますか?
解決
私が探しているものを持っている人は誰もいなかったので、私は elisp マニュアルの埃を払い、自分で行うことにしました。これは十分に機能しているようですが、出力は正確には私が求めたものではありません。このバージョンでは、最初のオプションは、元の質問のように最初の行にとどまるのではなく、単独で行に進みます。
(defun tcl-multiline-options ()
"spread option/value pairs across multiple lines with continuation characters"
(interactive)
(save-excursion
(tcl-join-continuations)
(beginning-of-line)
(while (re-search-forward " -[^ ]+ +" (line-end-position) t)
(goto-char (match-beginning 0))
(insert " \\\n")
(goto-char (+(match-end 0) 3))
(indent-according-to-mode)
(forward-sexp))))
(defun tcl-join-continuations ()
"join multiple continuation lines into a single physical line"
(interactive)
(while (progn (end-of-line) (char-equal (char-before) ?\\))
(forward-line 1))
(while (save-excursion (end-of-line 0) (char-equal (char-before) ?\\))
(end-of-line 0)
(delete-char -1)
(delete-char 1)
(fixup-whitespace)))
他のヒント
この場合はマクロを使用します。C-x () でマクロの記録を開始し、 C-x で記録を停止できます。マクロを再生したい場合は、「C-x e」と入力します。
この場合、 C-a C-x ( C-s v a l u e C-f C-f \ RET SPC SPC SPC SPC C-x ) と入力します。
これは、「値」を検索し、2 つ前に移動し、スラッシュと改行を挿入し、最後に新しい行をスペースを空けて並べるマクロを記録します。その後、このマクロを数回繰り返すことができます。
編集:今気づいたのですが、リテラル テキストは「value1」ほど検索しにくいかもしれません。スペースを検索して、ヒットしたものを順番に検索することもできます。たとえば、最初の一致の後に C-S を数回押して、一部の一致をスキップします。
注記:あなたの例は「アドホック」であるため、この解決策も同様になります。アドホックなソリューションが必要な場合は、マクロを使用することがよくあります。マクロをより一貫して適用する 1 つの方法は、元のステートメントをすべて 1 行に配置することです (マクロまたは手動で行うこともできます)。
編集:( vs C-( についてのコメントありがとうございます。私の間違いは正しかったです!
個人的には、こういうことをよくやります。
しかし、私は1年間毎日それをしない限り、それを行うための機能を書きません。
次のように query-replace を使用すると簡単に実行できます。
m-x (クエリ置換 " -オプション" "^Q^J -オプション")
私は ^q ^jと言います。それはあなたが新しいラインを引用して文字列に入れて入力するものだからです。
次に、文字列を置き換えるために「Y」を押し、「n」が見つけられる奇妙なコーナーケースをスキップします。
別の主力関数は、正規表現の置換を行うことができるクエリReplace-Regexpです。
また、Grep-Query-Replaceは、GREPコマンドの出力を解析することによりクエリレプレースを実行します。これは、100個のファイルで「Foo」を検索し、ファイルからファイルまでスキップする各発生時にクエリレプレースを実行できるため便利です。
お使いのモードではすでにこれをサポートしている可能性があります。C モードと Makefile モードでは、少なくとも M-q (fill-paragraph) は fill-column に行継続を挿入し、行を折り返します。
これはどのモードで編集していますか?