В Emacs, редактировать сразу несколько строк

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

Ответ 2

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

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

В мармеладе и мелпе так просто:

M-x package-install multiple-cursors

Ответ 3

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

Ответ 4

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

  • open-rectangle (C-x, r, o) добавить пробелы
  • kill-rectangle (C-x, r, k) delete
  • clear-rectangle (C-x, r, c) заменить пробелами
  • M-x string-insert-rectangle заполнить заданным текстом

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

Ответ 5

Для тех из вас, кто хочет сделать это для более сложных сценариев и хотите сделать это, не устанавливая новый модуль, пожалуйста, прочитайте. (Это возможно в 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'),
  • Поместите курсор в первую строку
  • Нажмите C-x (, чтобы начать запись макроса [В этот момент записываются все ваши ключевые входы поэтому внимательно следуйте инструкциям]
  • Нажмите C-a, чтобы перейти к началу строки
  • Введите "(", затем M-f, чтобы переместить слово, а затем введите ","
  • C-n, чтобы перейти к следующей строке, а затем C-x ), чтобы завершить макрос
  • 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

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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