Emacs эквивалент Vim's yy10p? - PullRequest
       43

Emacs эквивалент Vim's yy10p?

21 голосов
/ 16 сентября 2008

Как я могу легко скопировать строку в Emacs 10 раз? Я не могу найти ярлык или функцию копирования строки. Я могу использовать C-aC-spcC-eM-w для кропотливого копирования строки, но как я могу вставить ее несколько раз?

Любые идеи, прежде чем я пойду и напишу свои собственные функции.

Ответы [ 11 ]

18 голосов
/ 16 сентября 2008

для этого можно использовать макрос клавиатуры: -

C-a C-k C-x (C-y C-j C-x) C-u 9 C-x e

Пояснение: -

  • C-a: перейти к началу строки
  • C-k: линия убийства
  • C-x (: начать запись макроса клавиатуры
  • C-y: линия убитых янки
  • C-j: перейти к следующей строке
  • C-x): остановить запись макроса клавиатуры
  • C-u 9: повторить 9 раз
  • C-x e: Выполнить макрос клавиатуры
11 голосов
/ 16 сентября 2008

Копирование

Если вы часто работаете со строками, возможно, вы захотите, чтобы копирование (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-u 10 C-y сработает, но в этом случае C-y использует свой аргумент для обозначения того, какой элемент списка уничтожений "yank" (вставка). Единственное решение, которое я могу придумать, это то, что говорит kronoz: запишите макрос с помощью Cx (Cy Cx), а затем позвольте аргументу Cu перейти к kmacro-end-and-call-macro (это Cu 9 Cx e или даже просто C-9 Cx e или M -9 Cx e).

Другой способ : Вы также можете просто остаться в M-x viper-mode и использовать yy10p:)

9 голосов
/ 16 сентября 2008

Вы можете это знать, но для многих команд префикс "C-u 10" сделает свое дело. К сожалению, для команды C-y yank «C-u» переопределено так, чтобы означать «вернуть столько предметов в список уничтожений и вернуть этот элемент».

Я думал, что вы могли бы использовать команды копирования в регистр и вставки в регистр с командой префикса C-u, но, очевидно, это тоже не работает.

Также C-x z, «повторить последнюю команду», похоже, невосприимчив к C-u.

Другой мыслью было бы использовать M-: для получения приглашения Eval и ввести немного elisp. Я думал, что что-то вроде (dotimes '10 'yank) может сделать это, но, похоже, это не так.

Таким образом, похоже, что использование C-u в макросе действительно может быть лучшим, что вы можете сделать, если не написать свою собственную маленькую функцию.

Если бы я проголосовал, я бы проголосовал за ответ кроноса.

7 голосов
/ 14 октября 2009

Вам не нужны и C-x), и C-x e в этом примере.

Вы можете просто дать повторяющийся аргумент прямо C-x). Это останавливает запись и повторяет макрос за один шаг. Или вы можете пропустить C-x) и сразу перейти к C-xe, поскольку C-xe завершит запись перед выполнением повторов.

Какой способ выбрать, зависит от того, насколько вам нравится ваш счетчик повторений. Для 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-Backspace: убить эту строку
  • F3: запуск макроса
  • C-y: дергать за линию
  • C-1 C-0 F4: сделайте это 10 янки

Не так коротко, как у у 10 р, но довольно близко. :)

3 голосов
/ 16 сентября 2008

Вот функция, которую я взял из порта Emacs для OS / 2. (Да, я использую 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 раз.

2 голосов
/ 16 сентября 2008

Единственный способ, которым я знаю, чтобы повторять произвольные команды, - это использовать функцию «повтора по аргументу» клавиатурных макросов.

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: скопированная строка Yank
  • C-x): конец макроса клавиатуры
  • C-9 C-x e: Выполнить макрос клавиатуры девять раз.

Это слабовато по сравнению с vim. Но только потому, что vim удивительно эффективен в таких вещах.

Если вы действительно жаждете модального взаимодействия в стиле vi, вы можете использовать один из режимов эмуляции vi, например, режим viper. Проверьте в разделе «Эмуляция» онлайн-руководства по emacs.

0 голосов
/ 11 апреля 2016

Вы можете выдернуть линию (или область) в десять раз с меньшим количеством нажатий клавиш:

  • отметить линию (или регион)
  • восстановить выделенный текст 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

0 голосов
/ 29 октября 2009

Основываясь на ответе Баксиссимо, я устранил это:

(defun yank-n-times (arg)
  "yank prefix-arg number of times. Not safe in any way."
  (interactive "*p")
  (dotimes 'arg (yank)))

Установите это для некоторого ключа, назовите его с аргументом префикса, и все готово.

edit (также измененный выше интерактивный вызов, чтобы он был менее паршивым)

Или, вот версия, которая может заменить yank-pop:

(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 этим, я посмотрю, как это будет.

0 голосов
/ 16 сентября 2008

Вы получаете строку с C-k, вы выполняете следующую команду десять раз с C-u 10, затем вставляете строку с C-y. Довольно просто.

Если вы всегда хотите, чтобы C-k выполнял всю строку, вы можете установить для kill-whole-line значение t. Больше не надо возиться с C-a или C-e.

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

0 голосов
/ 16 сентября 2008

Я не знаю прямого эквивалента (C-y 10 раз - лучшее, что я знаю), но вас может заинтересовать Viper, пакет эмуляции vi для emacs. Это часть стандартного дистрибутива emacs.

...