Повторіть останню вставку тексту


10

У Vim ви можете натиснути, .щоб повторити останню зміну, включаючи вставлення тексту.

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

Питання: Чи є спосіб повторити вставлення тексту всередині Emacs?


1
Який «текст» ви хочете повторити? Технічно кажучи, остання вставка - це лише останній символ, який, мабуть, не те, що ви хочете. Отже, як би ви визначили "вставку тексту" для своєї мети? Уточнення його також може допомогти вам у пошуку шляхів його досягнення.
Т. Веррон

Добре питання - як визначити останню безперервну модифікацію буфера . Можливо, модифікація буфера між двома рухами точки, які не є результатом зміни буфера ( C-f, пошук тощо)? Якщо це має сенс ...
ooi

Уточнити, що ти хочеш, за рецептом. Існує багато видів "вставки" (способи вставлення тексту). Ви вставляєте інтерактивно? Якщо так, то як?
Дрю

Інтерактивно. Але в ідеалі було б не важливо, як чи що. Це як якщо б я забув , щоб почати визначення макросу . У такому випадку проблема полягає в тому, коли це. Можливо, якийсь гачок вдасться використати.
ooi

2
Як ви визначаєте "останню вставку" в Emacs? Оскільки немає перемикача режиму редагування / командування, як in vi, як далеко в історії ми повинні зайти? Зазвичай я просто вибираю "останню вставку" ( C-spaceпереміщувати курсор, M-wкопіювати), а потім C-yвставляти стільки часу, скільки потрібно.
Ален

Відповіді:


7

dot-modeце "другорядний режим для повторення набору тексту або команд" і може робити все, що вам потрібно. Це в основному просто повторює останні вставки / видалення, які ви робите. Він досить схожий на .Vi (m).


2
Що ж це зробити?
Малабарба

1
Ласкаво просимо на Emacs.SE. Зараз ти відповідь ближче до коментаря, ніж до відповіді. Скажіть, будь ласка, відредагуйте, щоб пояснити, що dot-modeробить і як вона забезпечує функціонал, який намагається отримати ОП?
Дан

7

Це як якщо б я забув , щоб почати визначення макросу

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

Для простого використання ви просто знайдете початок вставки, яку ви хочете повторити, видаліть увесь текст з "Макрос:" до цього пункту та натисніть 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)

Я часто прокручую за допомогою миші, було б круто подивитися, як видалити їх з макросу.
ooi

Нічого собі, ця команда була б корисною, якщо вона не повністю провалилася, якщо останні 300 включали клацання миші. Можливо, просто не включайте кліки та повідомляйте користувача, а не просто відмовляйтеся працювати.
няня

@nanny Я додав деякий elisp, щоб увімкнути (imo) кращий відкат, ніж просто помилка з повідомленням про помилку: за допомогою цієї функції зберігатимуться лише клавіші після останньої події миші. Повністю видалити події миші теж слід, але результат макросу був би дещо непередбачуваним.
Т. Веррон

@ooi Не маю уявлення, якщо ви автоматично пінгвали за попереднім коментарем, тож ось і ваш пінг.
Т. Веррон

Дякую, я працював над тим самим. Я думаю, що можливо, можна фільтрувати аргументи edmacro-fix-menu-commands. Він займає необов'язковий аргумент, який може ігнорувати події миші. Але я не знаю достатньо про систему консультацій, щоб змусити її працювати.
няня

4

Я думаю, що dabbrev-expandфункція могла б зробити свою справу. Припустимо, ви вже ввели кілька слів: emacs, emotion, emoji, ... Наступного разу, коли ви введете слово, що починається з 'em', ви можете натиснути, M-/і emacs запропонує вам вставити одне з уже вставлених слів починаючи з 'em'. Продовжуйте натискати, M-/і emacs покаже вам "емодзі", потім "емоції, потім ...

Можливо, ви також можете переглянути команду повтор-комплекс-команда . Популярний приклад: ви хочете повторити команду 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 Done :)
Nsukami _

1
Команда "Повтор-комплекс" схожа repeat(про яку згадує ОП), не дуже корисна для вставки тексту. Repeat-insertпотрібно продумати, перш ніж вставляти текст, як макрос. Але dabbrev-expandце приємна ідея!
Т. Веррон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.