문제

Emacs에서 어떻게 한 줄을 쉽게 10번 복사할 수 있나요?복사줄 바로가기나 기능을 찾을 수 없습니다.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-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를 사용하세요 :)

다른 팁

이를 위해 키보드 매크로를 사용할 수 있습니다.

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

설명:-

  • CA :줄의 시작으로 이동
  • C-k :킬라인
  • C-x( :키보드 매크로 기록 시작
  • C-y :양크 킬링 라인
  • CJ :다음 줄로 이동
  • C-x) :키보드 매크로 기록 중지
  • C-U 9 :9회 반복
  • C-xe :키보드 매크로 실행

알고 계시겠지만, 많은 명령에 "C-u 10" 접두어를 붙이면 됩니다.불행하게도 C-y yank 명령의 경우 "C-u"는 "킬 링에 있는 많은 항목으로 돌아가서 해당 항목을 잡아당긴다"는 의미로 재정의되었습니다.

나는 C-u 접두어 명령과 함께 copy-to-register 및 insert-register 명령을 사용할 수 있을 것이라고 생각했지만 분명히 그것도 작동하지 않습니다.

또한 C-x z, "마지막 명령 반복"은 C-u에 영향을 받지 않는 것 같습니다.

또 다른 생각은 M-을 사용하는 것입니다.Eval 프롬프트를 받고 약간의 elisp를 입력합니다.나는 (dotimes '10 'yank) 같은 것이 가능하다고 생각했지만 그렇지 않은 것 같습니다.

따라서 매크로에서 C-u를 사용하는 것이 실제로 자신만의 작은 함수를 작성하는 것 외에 할 수 있는 최선인 것처럼 보입니다.

내가 투표했다면 kronoz 답변에 투표하겠습니다.

이 예에서는 C-x )와 C-x e가 모두 필요하지 않습니다.

반복 인수를 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(~ 아니다 alt) 또는 세션을 종료할 수 있습니다!]

터미널 얘기가 나와서 말인데, C-9를 입력할 수 없다면 M-9가 좋은 대안이 됩니다.


Emacs 22 이상에서는 기본적으로 F3이 매크로를 시작하고 F4가 매크로를 종료/반복합니다.녹화를 시작하려면 F3을 누르고, 완료되면 F4를 누르고, 매크로를 반복하려면 다시 F4를 누르세요.(F4도 인수를 취합니다.)


이 모든 것을 종합하면 현재 줄의 10개 복사본을 얻을 수 있습니다.

  • C-S-백스페이스:이 줄을 죽여라
  • F3 :매크로 시작
  • C-y :줄을 잡아당기다
  • C-1 C-0 F4 :10개로 만들어요

y y 10p만큼 짧지는 않지만 꽤 가깝습니다.:)

다음은 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번 복제했습니다.

임의의 명령을 반복하는 유일한 방법은 키보드 매크로의 "인수별 반복" 기능을 사용하는 것입니다.

C-a C-공간 아래로 M-w C-x ( C-y C-x ) C-9 C-x e

  • CA :줄의 시작으로 이동
  • C 공간 :마크 설정
  • 아래에 :다음 줄의 시작으로 이동
  • M-w :지역 복사
  • C-x( :키보드 매크로 시작
  • C-y :복사된 줄을 양크합니다.
  • C-x) :키보드 매크로 종료
  • C-9 C-xe :키보드 매크로를 9번 실행합니다.

vim에 비해 좀 약하네요.하지만 vim이 이런 종류의 작업에 놀라울 정도로 효율적이기 때문입니다.

모달 vi와 유사한 상호 작용을 정말로 원하는 경우 viper-mode와 같은 vi 에뮬레이션 모드 중 하나를 사용할 수 있습니다.온라인 emacs 매뉴얼의 "에뮬레이션" 섹션을 확인하십시오.

당신은 라인을 죽이고 싶을 것입니다 :C-a C-k, 그리고 C-y 또는 ?

나는 직접적으로 동등한 것을 모르지만(C-y 10번이 내가 아는 것 중 최고임) emacs용 vi 에뮬레이션 패키지인 Viper에 관심이 있을 수도 있습니다.이는 표준 emacs 배포판의 일부입니다.

Baxissimo의 답변을 바탕으로 나는 이것을 부정했습니다.

(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

C-k로 라인을 얻고, C-u 10으로 다음 명령이 10번 발생하도록 한 다음, C-y로 라인을 붙여넣습니다.꽤 간단합니다.

C-k가 항상 전체 행을 수행하도록 하려면 kill-whole-line을 t로 설정할 수 있습니다.더 이상 C-a 또는 C-e를 조작하지 마세요.

멋진 킬링, 레지스터, 매크로를 사용하여 할 수 있는 일이 많습니다. 이를 익히는 것이 좋습니다. 하지만 줄을 10번 잡아당기는 것이 힘들거나 이상할 필요는 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top