4

Say I have a line in an emacs buffer that looks like this:

foo -option1 value1 -option2 value2 -option3 value3 \
    -option4 value4 ...

I want it to look like this:

foo -option1 value1 \
    -option2 value2 \
    -option3 value3 \
    -option4 value4 \
    ...

I want each option/value pair on a separate line. I also want those subsequent lines indented appropriately according to mode rather than to add a fixed amount of whitespace. I would prefer that the code work on the current block, stopping at the first non-blank line or line that does not contain an option/value pair though I could settle for it working on a selected region.

Anybody know of an elisp function to do this?

4

4 に答える 4

2

誰も私が探していたものを持っていなかったので、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)))
于 2008-09-16T20:48:20.800 に答える
1

この場合、マクロを使用します。Cxを使用してマクロの記録を開始できます(およびCxを使用してマクロの記録を停止できます)。マクロタイプCxeを再生する場合。

この場合、Ca Cx(Cs値Cf Cf \ RET SPC SPC SPC SPC Cx)と入力します。

これにより、「値」を検索し、前方に移動し、スラッシュと改行を挿入し、最後に新しい行の間隔を空けて整列するマクロが記録されます。次に、このマクロを数回繰り返すことができます。

編集:私はちょうど気づきました、あなたのリテラルテキストは「value1」ほど検索するのが簡単ではないかもしれません。スペースを検索して、ヒットを循環させることもできます。たとえば、最初の試合の後にCsを数回押して、一部の試合をスキップします。

注:例は「アドホック」であるため、このソリューションも同様です。アドホックソリューションが必要な場合は、マクロを使用することがよくあります。マクロをより一貫して適用する1つの方法は、元のステートメントをすべて1行に配置することです(マクロまたは手動で実行することもできます)。

編集:(対C-(、あなたは私の間違いでした!

于 2008-09-16T02:54:04.160 に答える
0

個人的には、いつもこういうことをしています。

しかし、私は1年間毎日それを行わない限り、それを行う関数を作成しません。

次のように、query-replaceを使用して簡単に実行できます。

mx(query-replace "-option" "^ Q ^ J -option")

^ Q ^ Jと言うのは、改行を引用して文字列に入れるために入力するものだからです。

次に、「y」を押して文字列を置き換え、「n」を押して見つけた奇妙なコーナーケースをスキップします。

もう1つの主力関数は、正規表現の置換を実行できるquery-replace-regexpです。

また、grep-query-replaceは、grepコマンドの出力を解析することによってquery-replaceを実行します。これは、100個のファイルで「foo」を検索し、ファイルからファイルへとスキップするたびにクエリ置換を実行できるので便利です。

于 2008-09-16T03:26:28.247 に答える
0

お使いのモードはすでにこれをサポートしている可能性があります。CモードとMakefileモードでは、少なくとも、Mq(fill-paragraph)は行の継続をfill-columnに挿入し、行を折り返します。

これをどのモードで編集していますか?

于 2008-09-16T03:55:29.580 に答える