2013-07-29 3 views
6

このような異なるライン上に存在する各項目で得られたEmacsバッファに供給コンマ区切りのリストに別々の行の項目を変換:Emacsは:私は、多くの場合、改行またはラインによって分離されたアイテムを貼り付け

one 
two 
three 
four 

とても多くの場合、私は実際にこのようなカンマ区切りのリストが欲しい:

"one", "two", "three", "four" 

一覧表示する行からワンタッチ変換を行うことができるように素晴らしいことです。私はこれを正規表現を使って変換できると思っていますが、Emacsの組み込み関数を持っているような一般的に使われている操作のようです。誰か提案することはできますか?

答えて

4

M-qは、linebreaksを空白(短い単語のリスト)に置き換えますが、引用符とコンマは追加しません。または、おそらくM-^を何度も同じ行に置くまでは、それ以外には何も組み込まれていません。

明らかに、キーボードマクロがこれに適しています。

(defun lines-to-cslist (start end &optional arg) 
    (interactive "r\nP") 
    (let ((insertion 
     (mapconcat 
      (lambda (x) (format "\"%s\"" x)) 
      (split-string (buffer-substring start end)) ", "))) 
    (delete-region start end) 
    (insert insertion) 
    (when arg (forward-char (length insertion))))) 
+0

この関数が期待どおりに機能するには、リスト内の最後の行の直後にカーソルを配置する必要がありますが、バッファに何かを貼り付けたばかりの場合はカーソルが自然な場所になります。これは私のために働く - ありがとう。編集:これは、偶然にも、なぜ私はEmacsが好きです! – SlowLearner

+0

@SlowLearner普遍的な引数を挿入後の場所にジャンプする命令として使用するように変更しました。そのため、 'M-x lines-to-cslist'と呼ぶと、ポイントは挿入された文字列の最後に移動します。 –

4

編集:

しかし、多くを作成しないより高速な方法は、元に戻す手順は、これらの線に沿って何かだろう私は は、あなたが機能を探している見...しかし、唯一の答えはあなた自身のものを書くことです(組み込みのものは存在しません)ので、正規表現 になると思いました。他の人がこれに遭遇し、それを .emacsに入れてください。


これは、2つのステップであるが、あなたが望んでいたという理由だけで、あなたのテキストが引用された:

のEmacs *scratch*バッファに貼り付けられたよう(つまり、関心のだな​​らば、それは行ごとに複数の単語で動作を示すためにfive sixを追加しました):

one 
two 
three 
four 
five six 

まず、"word"で個々wordを置き換える:

M-x replace-regexp RET \(.*\) RET "\1" RETは生成します。

"one" 
"two" 
"three" 
"four" 
"five six" 

,と(Emacsの、C-q C-j内)の各キャリッジリターンを置き換える:

M-x replace-regexp RET C-q C-j RET , RETは生成します。

"one", "two", "three", "four", "five six" 
1

を私は今日仕事で、このためのソリューションを書きました。以下は、ラインからCSVへ、CSVからラインへ、ユーザが指定できるセパレータで変換する関数です。この関数は、現在ハイライトされている領域で動作します。

(defun lines-to-csv (separator) 
    "Converts the current region lines to a single line, CSV value, separated by the provided separator string." 
    (interactive "sEnter separator character: ") 
    (setq current-region-string (buffer-substring-no-properties (region-beginning) (region-end))) 
    (insert 
    (mapconcat 'identity 
       (split-string current-region-string "\n") 
       separator))) 

(defun csv-to-lines (separator) 
    "Converts the current region line, as a csv string, to a set of independent lines, splitting the string based on the provided separator." 
    (interactive "sEnter separator character: ") 
    (setq current-region-string (buffer-substring-no-properties (region-beginning) (region-end))) 
    (insert 
    (mapconcat 'identity 
       (split-string current-region-string separator) 
       "\n"))) 

これを使用するには、編集する領域をハイライト表示してから、M-xを使い、使用するセパレータを指定します。

0

通常、マクロを使用してこの種のタスクを実行します。 M-X kmacro-start-macroM-x kmacro-end-or-call-macroを入力し、繰り返し実行することができます。

関連する問題