в Emacs редактируйте несколько строк одновременно - PullRequest
62 голосов
/ 17 апреля 2009

Я считаю, что у textmate есть режим, в котором, если вы начнете печатать, то же самое будет введено во все выбранные вами строки. Есть ли что-то подобное в emacs? Я предполагаю, что прямоугольники могут помочь мне, но я не уверен, как ...

Ответы [ 8 ]

86 голосов
/ 17 апреля 2009

Это так просто: C-x r t

50 голосов
/ 25 февраля 2013

Вам абсолютно необходимо попробовать установить несколько курсоров:

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

Это мармелад и мельпа, просто:

M-x package-install multiple-cursors
21 голосов
/ 17 апреля 2009

Одним из решений является использование режима CUA. Активируйте режим cua с помощью M-x cua-mode, выберите начало прямоугольника: сначала нажмите C-Enter, затем переместите курсор стандартными командами перемещения, чтобы сделать выбор, теперь нажатие клавиши ввода в любое время будет перемещать курсор по углам прямоугольника, позволяя добавлять или добавлять текст выбор.

19 голосов
/ 17 апреля 2009

Для этого можно использовать следующие команды (и клавиши):

  • открытый прямоугольник (C-x, r, o) добавить пробелы
  • kill-rectangle (C-x, r, k) удалить
  • прозрачный прямоугольник (C-x, r, c) заменить на пробелы
  • M-x строка-вставка-прямоугольник с указанным текстом

Вот полное описание этих функций: http://www.gnu.org/software/emacs/manual/html_node/emacs/Rectangles.html

16 голосов
/ 12 февраля 2014

Для тех из вас, кто хочет сделать это для более сложных сценариев и хочет сделать это без установки нового модуля, пожалуйста, читайте дальше. (Это возможно в Emacs без установки MarkMultiple, хотя я лично использую и люблю 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 для перемещения вперед по слову и затем введите ","
  5. C-n для перехода к следующей строке, затем C-x ) для завершения макроса
  6. C-u 11 C-x e повторить макрос n (в нашем случае 11) раз

Эврика! Теперь, если вы не ошиблись, вы получите что-то похожее на это:

(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

В этот момент я собираюсь оставить вас, чтобы выяснить все остальное. Но прежде чем я уйду, я хотел бы упомянуть, что есть немало способов достижения такого рода вещей. Это только один из тех способов, и это мой любимый способ.

Надеюсь, вы нашли это полезным;)

4 голосов
/ 17 апреля 2009

Полагаю, вы ищете режим cua, предложенный Boskom. http://www.vimeo.com/1168225?pg=embed&sec=1168225 этот скринкаст может дать вам представление о том, как его использовать.

3 голосов
/ 17 апреля 2009

Прямоугольники для простых вещей, таких как удаление одинакового количества пробелов в соседних строках.

В противном случае клавиатурные макросы - это путь.

2 голосов
/ 22 апреля 2009

Ответы, показанные выше, предназначены для вставки текста в столбцы. 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...