Эквивалент Emacs для Vim yy10p?
Вопрос
Как я могу легко скопировать строку 10 раз в Emacs?Я не могу найти ярлык или функцию для копирования строки.Я могу использовать C-aC-spcC-eM-w для тщательного копирования строки, но как я могу затем вставить ее более одного раза?
Есть какие-нибудь идеи, прежде чем я пойду и напишу свои собственные функции.
Решение
Копирование:
Если вы часто работаете со строками, возможно, вам захочется сделать копию (kill-ring-save
) и вырезать (kill-region
) работать с линиями, когда регион не выбран:
(defadvice kill-ring-save (before slickcopy activate compile)
"When called interactively with no active region, copy a single line instead."
(interactive
(if mark-active (list (region-beginning) (region-end))
(list (line-beginning-position)
(line-beginning-position 2)))))
(defadvice kill-region (before slickcut activate compile)
"When called interactively with no active region, kill a single line instead."
(interactive
(if mark-active (list (region-beginning) (region-end))
(list (line-beginning-position)
(line-beginning-position 2)))))
Затем вы можете скопировать строку просто с помощью M-w.
Склеивание:
Часто префиксный аргумент просто выполняет действие несколько раз, поэтому вы ожидаете, что C-u10 C-y сработает, но в этом случае C-y использует свой аргумент, чтобы указать, какой элемент kill-ring "выдернуть" (вставить).Единственное решение, которое я могу придумать, - это то, что говорит кроноз:запишите макрос с помощью C-x ( C-y C-x ), а затем пусть аргумент C-u переходит в kmacro-end-and-call-macro
вместо этого (это C-u 9 C-x e или даже просто C-9 C-x e или M-9 C-x e).
Другой способ:Вы также можете просто остаться в M-x viper-mode
и используй yy10p :)
Другие советы
для этого вы можете использовать макрос клавиатуры:-
C-a C-k C-x ( C-y C-j C-x ) C-u 9 C-x e
Объяснение:-
- C-a :Перейти к началу строки
- К-к :Линия уничтожения
- C-x ( :Начать запись макроса клавиатуры
- C-y :Дергать за оборванную леску
- Си-джей :Перейти к следующей строке
- C-x ) :Остановить запись макроса клавиатуры
- C-u 9 :Повторите 9 раз
- C-x e :Выполнить макрос клавиатуры
Возможно, вы это знаете, но для многие команды с префиксом "C-u 10" сделают свое дело.К сожалению, для команды C-y yank "C-u" переопределено как означающее "верни столько-то предметов в кольцо уничтожения и выдерни этот предмет".
Я подумал, что вы могли бы использовать команды copy-to-register и insert-register с командой C-u prefix, но, видимо, это тоже не работает.
Также C-xz, "повторить последнюю команду", похоже, невосприимчив к C-u.
Другой мыслью было бы использовать M-:чтобы получить приглашение Eval и ввести немного elisp.Я думал, что что-то вроде (dotimes '10'yank) могло бы это сделать, но, похоже, это не так.
Таким образом, похоже, что использование C-u в макросе действительно может быть лучшим, что вы можете сделать, если не считать написания вашей собственной маленькой функции.
Если бы у меня был голос, я бы проголосовал за ответ kronoz.
В этом примере вам не нужны оба C-x ) и C-x e.
Вы можете просто передать аргумент repeat прямо в C-x ).Это останавливает запись и повторяет макрос за один шаг.Или вы можете пропустить C-x ) и перейти сразу к C-x e, поскольку C-x e завершит запись перед выполнением повторов.
Какой способ выбрать, зависит от того, как вы хотите, чтобы работало количество повторений.Для C-x) вы говорите, сколько повторений вы хотели в общей сложности (в данном случае 10).Для C-x e вам нужно сказать, сколько еще повторений осталось (т. е.9).
C-a C-k C-k также уничтожит завершающий перевод строки, так что вам не придется позже вставлять его обратно самостоятельно.Это быстрее, чем использование метки, и вам не нужно изменять какие-либо переменные.
Еще лучше (если вы не находитесь в терминале), вы можете использовать C-S-Backspace *, чтобы уничтожить всю строку, независимо от того, где вы в ней находитесь.
[* Если вы используете X windows, обязательно введите shift (нет alt) или вы можете прекратить свой сеанс!]
Говоря о терминалах, M-9 - хорошая альтернатива, если вы обнаружите, что не можете ввести C-9.
В Emacs 22 и выше по умолчанию F3 запускает макрос, а F4 завершает / повторяет макрос.Вы просто нажимаете клавишу F3, чтобы начать запись, нажимаете клавишу F4, когда закончите, и еще раз нажимаете клавишу F4, чтобы повторить макрос.(F4 также принимает аргумент.)
Собрав все это вместе, получаем 10 копий текущей строки:
- C-S-Обратное пространство :убейте эту линию
- F3 :запустить макрос
- C-y :дерни за леску
- C-1 C-0 F4 :сделай это на 10 рывков
Не такой короткий, как y y 10 p, но довольно близкий.:)
Вот функция, которую я взял из порта OS / 2 Emacs.(Да, я уже некоторое время пользуюсь Emacs.)
;; Author: Eberhard Mattes <mattes@azu.informatik.uni-stuttgart.de>
(defun emx-dup-line (arg)
"Duplicate current line.
Set mark to the beginning of the new line.
With argument, do this that many times."
(interactive "*p")
(setq last-command 'identity) ; Don't append to kill ring
(let ((s (point)))
(beginning-of-line)
(let ((b (point)))
(forward-line)
(if (not (eq (preceding-char) ?\n)) (insert ?\n))
(copy-region-as-kill b (point))
(while (> arg 0)
(yank)
(setq arg (1- arg)))
(goto-char s))))
У меня это привязано к F9 d:
(global-set-key [f9 ?d] 'emx-dup-line)
Затем я бы использовал C-u 10 F9 d, чтобы дублировать строку 10 раз.
Единственный известный мне способ повторить произвольные команды - это использовать функцию "повторить по аргументу" клавиатурных макросов.
C-a C-пробел вниз M-w C-x ( C-y C-x ) C-9 C-x e
- C-a :Перейти к началу строки
- C-пробел :Установить отметку
- вниз :Перейдите к началу следующей строки
- M-w :Регион копирования
- C-x ( :Запустить макрос клавиатуры
- C-y :Дернуть скопированную строку
- C-x ) :Макрос завершения работы клавиатуры
- C-9 C-x e :Выполните клавиатурный макрос девять раз.
Это довольно слабо по сравнению с vim.Но только потому, что vim удивительно эффективен в подобных вещах.
Если вы действительно жаждете модального vi-подобного взаимодействия, вы могли бы использовать один из режимов эмуляции vi, например viper-mode.Ознакомьтесь с разделом "Эмуляция" онлайн-руководства по emacs.
Вам захочется прервать линию:C-a C-k, а затем C-y или ?
Я не знаю прямого эквивалента (C-y 10 раз - лучшее, что я знаю), но вас может заинтересовать Viper, который представляет собой пакет эмуляции vi для emacs.Это часть стандартного дистрибутива emacs.
Основываясь на ответе Баксиссимо, я опроверг это:
(defun yank-n-times (arg)
"yank prefix-arg number of times. Not safe in any way."
(interactive "*p")
(dotimes 'arg (yank)))
Установите для этого какой-нибудь ключ, вызовите его с префиксным аргументом и вперед.
Редактировать (также изменен интерактивный вызов выше, чтобы быть менее паршивым)
Или, вот версия, которая может как бы заменить янк-поп:
(defun yank-n-times (&optional arg)
"yank prefix-arg number of times. Call yank-pop if last command was yank."
(interactive "*p")
(if (or (string= last-command "yank")
(string= last-command "yank-pop"))
(yank-pop arg)
(if (> arg 1)
(dotimes 'arg (yank))
(message "Previous arg was not a yank, and called without a prefix."))))
сообщение в некотором роде лживое, но вы все равно не должны вызывать его без префикса, большего 1, так что.
Не уверен, что это хорошая идея, но я заменил M-y на это, посмотрим, что из этого выйдет.
Вы могли бы дернуть строку (или область) в десять раз меньшим количеством нажатий клавиш:
- отметьте линию (или область)
- дерните выделенный текст 10 раз:
C-w C-x ( C-y C-1 C-0 C-x )
В качестве альтернативы используйте функциональные клавиши F3 и F4 для запуска и завершения макроса клавиатуры:
C-w F3 C-y C-1 C-0 F4
Вы получаете строку с помощью C-k, выполняете следующую команду десять раз с помощью C-u 10, затем вставляете строку с помощью C-y.Довольно просто.
Если вы всегда хотите, чтобы C-k выполнял всю строку целиком, вы можете установить kill-whole-line равным t .Больше никакой возни с C-a или C-e.
Вы многое можете сделать с помощью модных колец блокировки, регистров и макросов, и я призываю вас изучить их, но десятикратное нажатие на строку не обязательно должно быть трудным или странным.