web-dev-qa-db-ja.com

Emacsでは、複数の行を一度に編集します

テキストメイトには、入力を開始すると、選択したすべての行に同じものが入力されるモードがあると思います。 emacsにこれに似たものはありますか?私は長方形が私を助けることができる方法があると推測していますが、どのように...

63
allyourcode

これと同じくらい簡単です: C-x r t

87
allyourcode

絶対に複数のカーソルをインストールする必要があります。

https://github.com/magnars/multiple-cursors.el

それはマーマレードとメルパにあるので、ちょうど:

 M-x package-install multiple-cursors 
51
nic ferrier

次のコマンド(およびキー)を使用してこれを実現できます。

  • 長方形を開く(C-x、r、o)スペースを追加する
  • キル長方形(C-x、r、k)削除
  • 明確な長方形(C-x、r、c)はスペースに置き換えます
  • 指定されたテキストでのM-x文字列挿入長方形の塗りつぶし

これらの機能の完全な説明は次のとおりです。 http://www.gnu.org/software/emacs/manual/html_node/emacs/Rectangles.html

19
paweloque

より複雑なシナリオのためにこれを行いたい、そして新しいモジュールをインストールせずにそれをしたいあなたのそれらのために読んでください。 (これはMarkMultipleをインストールしなくてもEmacsで可能ですが、私は個人的にMarkMultipleを使用し、愛しています)

最近、SQLクエリをファイルに出力し、それをMYSQL INSERTクエリにフォーマットする必要がありました。これがEmacsが私の人生を楽にしてくれた理由です。

ファイルは次のようになります。

1   I am a random text
2   I am not
3   G, you've gone mad
4   Click on this link
5   Transfer in progress (we've started the transfer process)
6   But transfer happend yesterday
7   No you are
8   Oh please! this is getting too much!
9   I love emacs
10  I cant be bothered with this any more
11  its time to raise the bar
12  show me how to expand my territory

そして、私はそれを次のように見せたいです:

(1,   ,'I am a random text'),
(2,   ,'I am not'),
(3,   ,'G, youve gone mad'),
(4,   ,'Click on this link'),
(5,   ,'Transfer in progress (weve started the transfer process)'),
(6,   ,'But transfer happend yesterday'),
(7,   ,'No you are'),
(8,   ,'Oh please! this is getting too much!'),
(9,   ,'I love emacs'),
(10,  ,'I cant be bothered with this any more'),
(11,  ,'its time to raise the bar'),
(12,  ,'show me how to expand my territory'),
  1. 最初の行にカーソルを置きます
  2. 押す C-x (マクロの記録を開始します[この時点ですべてのキー入力が記録されているので、指示に従ってください]
  3. 押す C-a行の先頭に移動する
  4. 「(」に続けてM-f Wordを前方に移動し、「、」と入力します
  5. C-nで次の行に移動し、その後にC-x )マクロを終了する
  6. C-u 11 C-x eマクロをn回(この場合は11回)繰り返します

Eureka!今までに失敗していなければ、次のようなものが得られます。

(1,   I am a random text
(2,   I am not
(3,   G, youve gone mad
(4,   Click on this link
(5,   Transfer in progress (weve started the transfer process)
(6,   But transfer happend yesterday
(7,   No you are
(8,   Oh please! this is getting too much!
(9,   I love emacs
(10,  I cant be bothered with this any more
(11,  its time to raise the bar
(12,  show me how to expand my territory

この時点で、残りの部分を理解するためにあなたを任せるつもりです。しかし、私が行く前に、この種のことを達成するためのかなりの数の方法があることに言及したいです。これはそれらの方法の1つに過ぎず、たまたま私のお気に入りの方法です。

お役に立てば幸いです;)

16
Hamster

Boskomによって提案されたcuaモードを探していると思います。 http://www.vimeo.com/1168225?pg=embed&sec=1168225 このスクリーンキャストは、これを使用する方法のアイデアを与えるかもしれません。

4
Amjith

長方形は、隣接する行の同じ量のスペースを削除するような単純なものです。

それ以外の場合は、キーボードマクロを使用します。

3
starblue

上記の回答は、列にテキストを挿入するためのものです。 TextMateの[選択範囲の各行を編集]は、各行の長さに関係なく、各行に同じテキストを挿入します。私は今LISPを学んでいるので、演習としてこれを行う関数を書きました。

(defun append-to-lines (text-to-be-inserted)
  ;;Appends text to each line in region
  (interactive "sEnter text to append: ")
  (save-excursion
    (let (point-ln mark-ln initial-ln final-ln count)
      (barf-if-buffer-read-only)
      (setq point-ln (line-number-at-pos))
      (exchange-point-and-mark)
      (setq mark-ln (line-number-at-pos))
      (if (< point-ln mark-ln)
          (progn (setq initial-ln point-ln final-ln mark-ln)
                 (exchange-point-and-mark))
        (setq initial-ln mark-ln final-ln point-ln))
      (setq count initial-ln)
      (while (<= count final-ln)
        (progn (move-end-of-line 1)
               (insert text-to-be-inserted)
               (next-line)
               (setq count (1+ count))))
      (message "From line %d to line %d." initial-ln final-ln ))))

まず、影響を与えるすべての行を含む選択を行い、次にM-x append-to-linesを使用して関数を実行します。

2
gdelfino