Emacs эквивалент Vim yy10p?
Как я могу скопировать строку в 10 раз легко в Emacs? Я не могу найти ярлык или функцию копирования. Я могу использовать C-aC-spcC-eM-w для кропотливой копирования строки, но как я могу вставить ее более одного раза?
Любые идеи, прежде чем я пойду и напишу свои собственные функции.
Ответы
Ответ 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.
Там вы можете много сделать с мошенническими кольцами, реестрами и макросами, и я призываю вас изучить их, но вытаскивание линии десять раз не должно быть жестким или странным.