Вопрос

Как я могу легко скопировать строку 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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top