w Emacsie edytuj wiele linii naraz

Wierzę, że textmate ma tryb, w którym jeśli zaczniesz pisać, to samo zostanie wprowadzone we wszystkich liniach, które wybrałeś. Czy w Emacsie jest coś podobnego? Domyślam się, że jest sposób, w jaki prostokąty mogą mi pomóc, ale nie jestem pewien jak...

 61
Author: Luke Girvin, 2009-04-17

8 answers

To takie proste: C-x r T

 79
Author: allyourcode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-03 13:42:47

Koniecznie musisz spróbować zainstalować wiele kursorów:

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

Jest w marmoladzie i melpie więc po prostu:
M-x package-install multiple-cursors
 50
Author: nic ferrier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-25 17:37:39

Jednym z rozwiązań jest użycie trybu CUA. Uaktywnij tryb cua za pomocą M-x cua-mode, wybierz rectangle begin: najpierw naciśnij C-Enter, a następnie przesuń kursor za pomocą standardowych komend ruchu, aby dokonać wyboru, teraz naciśnięcie klawisza enter w dowolnym momencie spowoduje przełączenie kursora przez narożniki prostokąta, umożliwiając dodanie lub dodanie tekstu do zaznaczenia.

 21
Author: boskom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-29 10:24:10

Możesz użyć następujących poleceń (i klawiszy), aby to osiągnąć:

  • open-rectangle (C-x, r, o) dodaj spacje
  • kill-rectangle (C-x, r, k) delete
  • clear-rectangle (C-x, r, c) zastąp spacjami
  • m-x string-insert-rectangle fill with specified text

Oto pełny opis tych funkcji: http://www.gnu.org/software/emacs/manual/html_node/emacs/Rectangles.html

 19
Author: paweloque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-17 18:56:07

Dla tych z Was, którzy chcą to zrobić dla bardziej skomplikowanych scenariuszy i chcą to zrobić bez instalowania nowego modułu, przeczytaj dalej. (Jest to możliwe w Emacsie bez instalowania MarkMultiple, chociaż osobiście używam i kocham MarkMultiple)

Ostatnio musiałem wysłać zapytanie SQL do pliku, a następnie sformatować je do zapytania insert MYSQL. Oto jak Emacs ułatwił mi życie....

Plik wygląda następująco:

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

And I want to make it look like:

(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. Umieść kursor w pierwszej linii
  2. Naciśnij C-x (, aby rozpocząć nagrywanie makra [W tym momencie wszystkie kluczowe wejścia są rejestrowane więc proszę postępować zgodnie z instrukcjami]
  3. Naciśnij C-a aby przejść do początku linii
  4. wpisz " ("następnie M-f, aby przejść do przodu słowo, a następnie wpisz", "
  5. C-n aby przejść do następnego wiersza, a następnie C-x ) aby zakończyć makro
  6. C-u 11 C-x e powtórz makro n (11 w tym przypadku) times

Eureka! do tej pory, jeśli nie zawiodłeś, dostaniesz coś, co wygląda tak:

(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

W tym momencie zostawię cię, abyś rozgryzł resztę. Ale zanim pójdę, chciałbym wspomnieć, że istnieje sporo sposobów osiągnięcia tego rodzaju rzeczy. To tylko jeden z tych sposobów i tak się składa, że jest to mój ulubiony sposób.

Mam nadzieję, że to pomogło;)

 14
Author: Hamster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-12 10:40:40

Myślę, że szukasz trybu cua, który został zasugerowany przez boskom. http://www.vimeo.com/1168225?pg=embed&sec=1168225 Ten screencast może dać ci pomysł, jak tego użyć.

 4
Author: Amjith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-17 19:28:40

Prostokąty służą do prostych rzeczy, takich jak usuwanie tej samej ilości spacji w sąsiednich liniach.

W Przeciwnym Razie makra klawiatury są drogą do zrobienia.

 3
Author: starblue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-17 18:50:18

Odpowiedzi pokazane powyżej służą do wstawiania tekstu w kolumnach. Funkcja TextMate "Edytuj każdy wiersz w zaznaczeniu" wstawia ten sam tekst w każdym wierszu niezależnie od długości każdego wiersza. Teraz uczę się Lispu, więc jako ćwiczenie napisałem do tego funkcję:

(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 ))))

Najpierw dokonujesz wyboru, który zawiera wszystkie linie, na które chcesz wpłynąć, a następnie uruchamiasz funkcję m-x append-to-lines.

 2
Author: gdelfino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-21 22:33:08