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


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.