Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Копирование

Если вы часто работаете с строками, вы можете сделать копию (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 использует свой аргумент для обозначения того, какой элемент kill-ring используется для "yank" (paste). Единственное решение, о котором я могу думать, это то, что говорит кронос: записывать макрос с 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:)

Ответ 2

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

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: Yank убил линию
  • C-j: переход к следующей строке
  • C-x): остановить запись макроса клавиатуры
  • C-u 9: Повторить 9 раз
  • C-x e: выполнить макрос клавиатуры

Ответ 3

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

Я думал, что вы можете использовать команды copy-to-register и insert-register с помощью команды pre-command C-u, но, видимо, это тоже не работает.

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

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

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

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

Ответ 4

В этом примере вам не нужны как 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-окна, обязательно введите shift ( not 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 янков

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

Ответ 5

Здесь функция, которую я взял из порта OS/2 Emacs. (Да, я использовал Emacs некоторое время.)

;; Author: Eberhard Mattes <[email protected]>
(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 раз.

Ответ 6

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

C-a C-пространство вниз M-w C-x (C-y C-x) C-9 C-x e

  • C-a: перейти к началу строки
  • C-space: Установить метку
  • вниз: переход к началу следующей строки
  • M-w: область копирования
  • C-x (: запуск макроса клавиатуры
  • C-y: скопированная строка Yank
  • C-x): Конец макроса клавиатуры
  • C-9 C-x e: выполнить макрос клавиатуры девять раз.

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

Если вы действительно хотите работать с модальным vi-подобным взаимодействием, вы можете использовать один из режимов эмуляции vi, например, viper-mode. Ознакомьтесь с разделом "Эмуляция" онлайн-руководства emacs.

Ответ 7

Вы хотите убить строку: C-a C-k, а затем C-y или?

Ответ 8

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

Ответ 9

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

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

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

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

Или, здесь версия, которая может сортировать замену 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 этим, я посмотрю, как это происходит.

Ответ 10

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

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

Ответ 11

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

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

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