Повторите последнюю вставку текста

10

В Vim вы можете нажать, .чтобы повторить последнее изменение, включая вставку текста.

Пока в Emacs C-x zповторяется только последняя команда. Я знаю, что здесь можно использовать макросы, но чаще всего я понимаю, что мне нужно вставлять тот же текст слишком поздно. Когда мне нужно вставить его еще раз , определение макроса бессмысленно.

Q: Есть ли способ повторить вставку текста в Emacs?

Уи
источник
1
Какой «текст» вы хотите повторить? Технически говоря, последняя вставка - это только последний символ, который, вероятно, не тот, что вам нужен. Итак, как бы вы определили «вставку текста» для вашей цели? Разъяснение этого может также помочь вам найти способы достичь этого.
Т. Веррон
Хм хороший вопрос - как определить эту последнюю непрерывную модификацию буфера . Возможно, изменение буфера между двумя точками перемещения, которые не являются результатом изменения буфера ( C-fпоиск и т. Д.)? Если это имеет какой-то смысл ...
OOI
Уточните, что вы хотите с рецептом. Существует много видов «вставки» (способы вставки текста). Вы вставляете в интерактивном режиме? Если так, то как?
Дрю
Интерактивное. Но в идеале это не имеет значения, как и что. Как будто я забыл начать определять макрос . В этом случае проблема в том, когда это так. Может быть, какой-то крючок может быть использован.
Уи
2
Как вы определяете «последнюю вставку» в Emacs? Поскольку переключателя режима редактирования / команды нет, как в vi, как далеко в истории мы должны идти? Я обычно просто выбираю «последнюю вставку» ( C-spaceпереместите курсор, M-wчтобы скопировать), а затем вставляю C-yстолько раз, сколько необходимо.
Алена

Ответы:

7

dot-modeявляется «второстепенным режимом для повторения ввода или команд» и может делать то, что вам нужно. Это в основном просто повторяет последние вставки / удаления, которые вы делаете. Это очень похоже на .в Vi (м).

Билл Бенедетто
источник
2
Что же это сделать?
Малабарба
1
Добро пожаловать в Emacs.SE. Прямо сейчас ваш ответ ближе к комментарию, чем к ответу. Не могли бы вы отредактировать его, чтобы объяснить, что dot-modeи как он обеспечивает функциональность, которую пытается получить OP?
Дан
7

Это как если бы я забыл начать определять макрос

Вы можете использовать kmacro-edit-lossage( C-x C-k l) для этого: он позволяет вам просматривать ваши 300 последних нажатий клавиш (включая простые вставки) и редактировать их как макрос.

Для простого использования вы просто найдете начало вставки, которую хотите повторить, удалите весь текст из «Macro:» до этой точки и нажмите C-c C-c. Теперь у вас есть макрос, который вы можете использовать для выполнения тех же действий, как если бы вы не забыли записать его в первую очередь.

К сожалению, это не работает, если последние 300 нажатий клавиш включают щелчки мыши.

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

(defadvice recent-keys (after tv/recent-keys-no-mouse first ())
  "Return only the keys since the last mouse event"
  (let* ((vec ad-return-value)
         (lst (append vec nil))
         (nmax (length vec))
         (i (- nmax 1)))
    (while
        (and
         (>= i 0)
         (not
          (let ((mod (event-modifiers (elt vec i))))
            (or (memq 'click mod)
                (memq 'double mod)
                (memq 'triple mod)
                (memq 'drag mod)
                (memq 'down mod)))))
      (setq i (- i 1)))
    (setq ad-return-value (vconcat (nthcdr (+ i 1) lst) nil))))

(defun tv/kmacro-edit-lossage-no-mouse ()
  "Same as `kmacro-edit-lossage', but fallback if the keys contain mouse events.

Source: http://emacs.stackexchange.com/a/4071/184"
  (interactive)
  (ad-activate-regexp "tv/recent-keys-no-mouse")
  (call-interactively #'kmacro-edit-lossage)
  (ad-deactivate-regexp "tv/recent-keys-no-mouse"))

;; If you want this function to replace the default one, uncomment this line:
; (global-set-key (kbd "C-x C-k l") 'tv/kmacro-edit-lossage-no-mouse)
Т. Веррон
источник
Я часто прокручиваю с помощью мыши, было бы здорово увидеть, как удалить их из макроса.
Уи
Вау, эта команда была бы полезна, если бы она полностью не завершилась, если бы последние 300 включали щелчки мышью. Может быть, просто не включайте клики и дайте знать пользователю вместо того, чтобы просто отказываться работать.
няня
@nanny Я добавил немного elisp, чтобы обеспечить (imo) лучший откат, чем просто сбой с сообщением об ошибке: с этой функцией будут сохраняться только ключи после последнего события мыши. Полное удаление событий мыши тоже должно быть возможным, но результат макроса будет несколько непредсказуемым.
Т. Веррон
@ooi Не знаю, автоматически ли вы пинговали предыдущий комментарий, так что вот ваш пинг тоже.
Т. Веррон
Спасибо, я работал над тем же. Я думаю, что это может быть возможно отфильтровать аргументы edmacro-fix-menu-commands. Он принимает необязательный аргумент, который может игнорировать события мыши. Но я не знаю достаточно о системе рекомендаций, чтобы заставить ее работать.
няня
4

Я думаю, что dabbrev-expandфункция могла бы добиться цели. Предположим, вы уже набрали несколько слов: emacs, emotion, emoji, ... В следующий раз, когда вы введете слово, начинающееся с 'em', вы можете нажать, M-/и emacs предложит вам вставить одно из уже вставленных слов. начало их. Продолжайте нажимать, M-/и Emacs покажет вам «эмодзи», затем «эмоции, затем ...»

Вы также можете посмотреть на команду repeat-complex-command . Популярный пример: вы хотите повторить команду query-replaceво многих разных буферах, всегда используя одни и те же аргументы, замените «pitt» на «patt».

Вы запускаете его один раз, переходите в другое окно и вводите C-x ESC ESCего снова.

И в заключение, могу ли я предложить повторную вставку ? Этот файл el поможет вам выполнить вставку, используя некоторую логику. Это больше похоже на «повторную вставку последней вставки, но для каждой итерации аргументы будут меняться.

Этот пример можно найти в файле el :

;; You can also iterate over lists:
;;   My desk is cluttered
;;   My desk is a real mess
;;   My desk is very hard to see
;;   My desk is buried
;;
;; from m-x insert-patterned
;;    ";;   My desk is %s"
;;    (cluttered "a real mess" "very hard to see" buried)

Я надеюсь, что это поможет.

Нсуками _
источник
1
Может быть, вы можете немного расширить ...
Т. Веррон
@ T.Verron Готово :)
Nsukami _
1
Команда Repeat-complex-command похожа repeat(что упоминается в OP) и не очень полезна для вставки текста. Repeat-insertнужно подумать, прежде чем вставлять текст, как макрос. Но dabbrev-expandэто хорошая идея!
Т. Веррон