Основы множественных курсоров

55

Я недавно узнал multiple-cursors, и это выглядит как очень полезный пакет. Я просмотрел документацию по исходному репо , но команды все еще выглядят немного неясными для меня.

Затем я посмотрел видео в Emacs Rocks !, и это отличное видео, но оно сосредоточено в основном на том, на что multiple-cursorsспособен, а не на том, как это сделать.

Существуют ли какие-либо руководства, учебные пособия или примеры, иллюстрирующие его основные функции?

Амелио Васкес-Рейна
источник
4
Я смог быстро начать работу, multiple-cursorsпросто прочитав файл README. Моя рекомендация - просто учиться mc/mark-next-like-this. Попробуйте и ознакомьтесь с тем, что он делает. Оттуда обращайтесь к README всякий раз, когда у вас возникает вопрос, который начинается с «Интересно, могут ли это делать несколько курсоров ...» Все это говорит, я думаю, что это более базовое введение, чем скалы Emacs! видео будет полезно для начинающих.
Ниспио
Полностью согласен! Совершенно неясно, как его использовать. Я просто маскирую строки, затем делаю mc / edit-lines с привязкой KBD (не через Mx, как отмечено на Github). Затем я вижу несколько курсоров, но они просто исчезают после любого ввода текста
Дима Фомин

Ответы:

19

В дополнение к описанию использования @bastibe я использую несколько курсоров для добавления или удаления текста в начале / конце группы строк:

  1. Переместить точку в начало или конец области интереса
  2. звонить set-rectangular-region-anchor(привязанный к любому ключу, который вам нравится, я думаю, что предложение от Magnars было H-space, если у вас есть гипер-ключ)
  3. Перемещайте точку вперед или назад по строке ( C-nи C-p), пока у вас не появится курсор на каждой строке, которую вы хотите редактировать
  4. Вставьте или удалите текст по мере необходимости, при необходимости перемещаясь в конец строки ( C-e), чтобы внести туда изменения.

Вы можете использовать forward-wordи forward sentenceт. Д. Для перемещения вперед и назад по линиям, что позволяет редактировать четвертое слово в каждой строке, даже если текст в каждой строке не идентичен.

В качестве примера, я делаю такую ​​работу постоянно:

  • C-u M-!ls / test-dat / pp5 / * fsaRETURN

    Это вставляет содержимое каталога pp5 в буфер. Я ставлю точку !в начале списка:

!/test-dat/pp5/ONAB-6-5_Frag#89.fsa
/test-dat/pp5/QCJB-22-5_Frag#90.fsa
/test-dat/pp5/ONGL-1-5_Frag#102.fsa
/test-dat/pp5/ONGL-1-5_Frag#78.fsa
  • Добавьте курсоры к каждой строке с H-space, C-nх 4
  • продублируйте каждую строку C-k C-y space C-y C-a

!/test-dat/pp5/ONAB-6-5_Frag#89.fsa /test-dat/pp5/ONAB-6-5_Frag#89.fsa
!/test-dat/pp5/QCJB-22-5_Frag#90.fsa /test-dat/pp5/QCJB-22-5_Frag#90.fsa
!/test-dat/pp5/ONGL-1-5_Frag#102.fsa /test-dat/pp5/ONGL-1-5_Frag#102.fsa
!/test-dat/pp5/ONGL-1-5_Frag#78.fsa /test-dat/pp5/ONGL-1-5_Frag#78.fsa
  • обрезать первый раздел в имена переменных с M-dx 3 C-d C-fx3 M-dx3 <-

ONAB-6-5 <-! /test-dat/pp5/ONAB-6-5_Frag#89.fsa
QCJB-22-5 <-! /test-dat/pp5/QCJB-22-5_Frag#90.fsa
ONGL-1-5 <-! /test-dat/pp5/ONGL-1-5_Frag#102.fsa
ONGL-1-5 <-! /test-dat/pp5/ONGL-1-5_Frag#78.fsa
  • затем оберните фактическое имя файла в функцию, чтобы загрузить его: read.file ( C-d" C-e")RETURN

ONAB-6-5 <- read.file("/test-dat/pp5/ONAB-6-5_Frag#89.fsa")
QCJB-22-5 <- read.file("/test-dat/pp5/QCJB-22-5_Frag#90.fsa")
ONGL-1-5 <- read.file("/test-dat/pp5/ONGL-1-5_Frag#102.fsa")
ONGL-1-5 <- read.file("/test-dat/pp5/ONGL-1-5_Frag#78.fsa")

И вуаля, вы преобразовали листинг файла в код, чтобы прочитать этот листинг. Это на самом деле гораздо сложнее описать, чем на самом деле сделать!

Тайлер
источник
3
Если вы делаете это часто, вы можете обернуть это в макрос клавиатуры. Клавиатурные макросы и multiple-cursorsмогут составить действительно мощную комбинацию.
Ниспио
@nispio согласился! Иногда я повторяю один и тот же процесс, и макрос будет полезен. Тем не менее, часто есть небольшие различия в середине рабочего процесса, которые требуют небольших изменений, которые «сломают» макрос.
Тайлер
1
Часто вы можете точно описать местоположение, к которому хотите перейти курсор, используя регулярное выражение. В таких случаях использование phi-searchможет быть более надежным, чем навигация с помощью таких команд, какM-f (x3)
nispio
@nispio, конечно, это зависит от ситуации. С последовательно структурированными именами легко перемещаться по слову. Я не использовал поиск по нескольким курсорам, так как встроенные команды поиска в emacs хрупки с mc. Я не знал о phi-search, это выглядит великолепно!
Тайлер
22

У меня есть два варианта использования multiple-cursors:

  • Заменить некоторую строку. Отметьте один экземпляр строки, затем используйте mc/mark-next-like-thisи, mc/mark-previous-like-thisчтобы отметить больше ее экземпляров. Затем я сразу же C-wудаляю, чтобы удалить каждый экземпляр, и вместо этого пишу новую строку. Я часто использую это для переименования переменной в коде.
  • Редактировать несколько мест одновременно. Либо пометьте несколько экземпляров строки, как раньше, но сразу же отмените выделение (но не курсоры), используя C-g, или поместите метку и укажите в том же столбце разных строк, и используйте, mc/edit-linesчтобы получить один курсор на строку. Теперь вы можете использовать обычные команды редактирования, которые работают с каждым из этих курсоров.

Первый вариант использования особенно полезен с expand-region. Я er/expand-regionпривязался к C-j, и mc/mark-next-like-thisи mc/mark-previous-like-thisк C->и C-<. При этом я могу легко выбрать слово, которое включено, и мгновенно отметить следующее / предыдущее вхождение этого слова.

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

bastibe
источник
Спасибо @ Bastibe. Какие-либо конкретные привязки, которые вы или multiple-cursors рекомендуете, например, mark-next-like-this& mark-previous-like-this?
Амелио Васкес-Рейна
@ user815423426, как указано в посте, я использую C->и C-<для mark-next-like-thisи mark-previous-like-this.
Бастиб
почему бы не использовать стандартный M-% для поиска и замены ?
Дима Фомин
6

Я хотел бы добавить некоторые дополнения, которые я иногда использую multiple-cursors.

Я нашел следующее, чтобы быть полезным:

гу-гоу к полукоксу

Иногда вам нужно перейти к следующему #или следующему ,или к определенному разделителю. Это особенно удобно, когда вам нужно перемещаться по разному количеству слов для каждого курсора. Он предоставляет функции iy-go-to-charи iy-go-to-char-backward, которые вы можете связать и использовать красиво.

расширить регион

Это действительно полезно по той же причине: iyкогда под каждым курсором есть несколько разные строки, и вы, возможно, захотите выбрать строку в кавычках под точкой или подобным.

пользовательские вещи

Это вещи, которые просто elisp в моем конфиге, но я считаю полезным. Вероятно, не написано мной.

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

(defun prompt-for-insert ()
  (interactive)
  (insert (read-string "Insert: ")))

Номер приращения в точке
Это либо пришло от SO, либо от emacswiki. Не уверен, какой. Это довольно полезно само по себе, а также при использовании в сочетании сmc/insert-numbers

(defun my-increment-number-decimal (&optional arg)
  "Increment the number forward from point by 'arg'."
  (interactive "p*")
  (save-excursion
    (save-match-data
      (let (inc-by field-width answer)
        (setq inc-by (if arg arg 1))
        (skip-chars-backward "0123456789")
        (when (re-search-forward "[0-9]+" nil t)
          (setq field-width (- (match-end 0) (match-beginning 0)))
          (setq answer (+ (string-to-number (match-string 0) 10) inc-by))
          (when (< answer 0)
            (setq answer (+ (expt 10 field-width) answer)))
          (replace-match (format (concat "%0" (int-to-string field-width) "d")
                                 answer)))))))

eval-and-replace
Это супер мощный инструмент, который позволяет использовать некоторые действительно полезные биты 'n'. Он оценивает, какой пол находится за курсором, и вставляет результат его оценки.
Объедините это с, multiple-cursors-numbersнапример, для вставки степеней двух, или серии, которая проходит 0 1 2 0 1 2 0 1 2через каждую строку или что-то. (Я сделал оба из них с пользой) Или используйте его, s.elчтобы записать эти утомительные настройки Java с настройками по умолчанию. Вы записываете каждый CONFIG_VALUE_VARIABLE, а затем трансформируете это в CONFIG_VALUE_VARIABLE = "configValueVariable"бег s-camel-case.

(defun eval-and-replace ()
  (interactive)
  (let ((value (eval (preceding-sexp))))
    (kill-sexp -1)
    (insert (format "%s" value))))
Squidly
источник
iy-go-to-char очень полезен. Как раз то, что я искал.
Генрих Хартманн
1
  1. Перейти к концу * того, что вы хотите выбрать.
  2. Нажмите C-S-bили, M-S-bчтобы выбрать назад, пока не получите выделенную часть. Вы можете также использовать стрелку влево.
  3. Затем нажмите C->(нажмите Shift, если клавиша >находится над клавишей клавиатуры), пока не будет выбрано более одного элемента.

* Важно выбрать задом наперед или первый выбор поместит курсор в неправильное положение.

morishi
источник