Emacs, эквивалентный из yy10p Vim?

22
задан Sard 19 July 2013 в 17:23
поделиться

10 ответов

Копирование :

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

11
ответ дан ShreevatsaR 29 November 2019 в 04:15
поделиться

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

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: Выполните макрос клавиатуры
19
ответ дан ljs 29 November 2019 в 04:15
поделиться

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

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

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

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

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

Имел меня голосование, я буду голосовать за ответ kronoz.

9
ответ дан Baxissimo 29 November 2019 в 04:15
поделиться

Вот функция, которую я взял от порта 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 раз.

3
ответ дан cjm 29 November 2019 в 04:15
поделиться

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

C-пространство C-a вниз 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: Выполните макрос клавиатуры девять раз.

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

, Если Вы действительно тоскуете по модальному подобному vi взаимодействию, Вы могли бы использовать один из vi режимов эмуляции, таких как режим гадюки. Зарегистрируйтесь в разделе "Emulation" emacs руководства онлайн.

2
ответ дан ddaa 29 November 2019 в 04:15
поделиться

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

0
ответ дан mmattax 29 November 2019 в 04:15
поделиться

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

0
ответ дан Mike Monette 29 November 2019 в 04:15
поделиться

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

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

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

-1
ответ дан jfm3 29 November 2019 в 04:15
поделиться

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

Вы можете просто передать аргумент повторения прямо в Cx). Это останавливает запись и повторяет макрос за один шаг. Или вы можете пропустить Cx) и сразу перейти к Cx e, так как Cx e завершит запись до выполнения повторов.

Какой способ выбрать, зависит от того, как вам нравится работать с подсчетом повторов. Для Cx) вы говорите, сколько повторов вы хотите всего (в данном случае 10). Для Cx e вам нужно указать, сколько еще повторов осталось (например, 9).


Ca Ck Ck также уничтожит завершающий символ новой строки, поэтому вам не придется возвращать его позже. Это быстрее, чем использование метки, и вам не нужно изменять какие-либо переменные.

Еще лучше (если вы не находитесь в терминале), вы можете использовать CS-Backspace *, чтобы уничтожить всю строку,

[* Если вы используете X windows, не забудьте ввести shift ( не alt), иначе вы можете завершить сеанс!]

Говоря о терминалах, M-9 - хорошая альтернатива если вы обнаружите, что не можете ввести C-9.


В Emacs 22 и выше по умолчанию F3 запускает макрос, а F4 завершает / повторяет макрос. Вы просто нажимаете F3, чтобы начать запись, нажимаете F4, когда закончите, и снова нажимаете F4, чтобы повторить макрос. (F4 также принимает аргумент.)


Собираем все вместе, чтобы получить 10 копий текущей строки:

  • CS-Backspace: уничтожить эту строку
  • F3: запустить макрос
  • Cy: восстановить строку
  • C-1 C-0 F4: сделайте 10 рывков

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

7
ответ дан 29 November 2019 в 04:15
поделиться

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

(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 в любом случае, так.

Не уверен, что это хорошая идея, но я заменил My на это, я посмотрю, как это пойдет.

0
ответ дан 29 November 2019 в 04:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: