Emacs에서 전체 라인을 어떻게 복제합니까?


155

나는 VIM에 대해서도 이와 같은 질문을 보았고 , 이맥스에 대해 어떻게해야하는지 알고 싶었습니다. ReSharper에서는이 작업에 CTRL-D를 사용합니다. Emacs에서이를 수행하기위한 최소 명령 수는 얼마입니까?


2
물론, 그것은 emacs이므로 TMTOWTDI-22가 있습니다! (및 계산) c2.com/cgi/wiki?ThereIsMoreThanOneWayToDoIt

답변:


150

나는 사용한다

C-a C-SPACE C-n M-w C-y

어느 것이

  • C-a: 커서를 줄의 시작으로 이동
  • C-SPACE: 선택 시작 ( "설정 표시")
  • C-n: 커서를 다음 줄로 이동
  • M-w: 복사 영역
  • C-y: 페이스트 ( "생크")

전술 한

C-a C-k C-k C-y C-y

같은 것 (TMTOWTDI)

  • C-a: 커서를 줄의 시작으로 이동
  • C-k: 줄을 자르십시오 ( "kill")
  • C-k: 줄 바꿈 잘라
  • C-y: 붙여 넣기 ( "생크") (사각형으로 돌아옴)
  • C-y: 다시 붙여 넣기 (이제 두 줄의 사본이 있음)

이것들은 C-d편집기에서 와 비교할 때 매우 장황 하지만, Emacs에는 항상 사용자 정의가 있습니다. 기본적으로 C-d바인딩되어 delete-char있으므로 어떻 C-c C-d습니까? 에 다음을 추가하십시오 .emacs.

(global-set-key "\C-c\C-d" "\C-a\C- \C-n\M-w\C-y")

(@Nathan의 elisp 버전은 키 바인딩이 변경 되어도 깨지지 않기 때문에 바람직합니다.)

주의 : 일부 Emacs 모드는 C-c C-d다른 작업을 수행 할 수 있습니다.


5
안녕하세요! '(setq kill-whole-line t)'가 있으면 줄의 내용과 함께 줄 바꿈이 이미 종료되므로 하나의 'Ck'(솔루션 2) 만 필요합니다. 'C-k'를 선호했습니다. 건배, 다니엘
danielpoe

179
이것은 정말 당황 스럽습니다.
tofutim

18
무엇에 대해 C-S-backspace C-y C-y?
ericzma

1
Mw는 무엇입니까? 어떤 키를 사용해야합니까?
Bala

4
@Bala "M"은 "Meta"입니다 (보통 Esc 또는 Alt, 키보드 레이아웃에 따라 다름). "Mw"는 "Meta"와 "w"입니다 (내 키보드에서 "Alt-w").
Chris Conway

96

이전 답변 외에도 행을 복제하는 고유 한 함수를 정의 할 수도 있습니다. 예를 들어, .emacs 파일에 다음을 입력하면 Cd가 현재 행과 중복됩니다.

(defun duplicate-line()
  (interactive)
  (move-beginning-of-line 1)
  (kill-line)
  (yank)
  (open-line 1)
  (next-line 1)
  (yank)
)
(global-set-key (kbd "C-d") 'duplicate-line)

이와 관련하여 다음과 같은 오류가 발생합니다.Symbol's function definition is void: move-beginning-of-line
Rohaq

5
이것의 문제점은 "Del"키가 라인을 복제하는 것에 묶여 있다는 것입니다.
David Gomes

그렇다면 Del이 기능에서 바인딩을 해제하는 방법에 대한 아이디어가 있습니까?
Alexander Shcheblikin

OK, Delnew C-d다음 을 유지하면서 정상 으로 되 돌리는 솔루션을 찾았습니다 . 정의 (global-set-key (kbd "<delete>") 'delete-char)후에 추가해야합니다 C-d.
Alexander Shcheblikin

빈 줄에서 시도하면 한 줄이 아닌 두 줄이 삽입됩니다. 이유를 모르겠습니다. 쉬운 수정이 있습니까?
Zelphir Kaltstahl

68

처음에 CTRL-를 수행하지 않으면 커서를 줄에 놓고 A다음을 수행하십시오.

CTRL-K

CTRL-K

CTRL-Y

CTRL-Y


나는 두 번째 CY가 필요하다고 생각하지 않습니다.
Bastien Léonard 2016 년

4
없이는 복제되지 않습니다
epatel

17
Ck 대신 CS-Backspace (kill-whole-line)를 사용하십시오. 커서 위치로 나사를 조이거나 줄 바꿈을 죽일 필요가 없습니다.
Nietzche-jou

이것은 잘 작동하지만 짧은 방법이 없습니까?
Stryker

52

실행 취소와 함께 잘 작동하고 커서 위치를 엉망으로 만들지 않는 선을 복제하는 함수 버전입니다. 1997 년 11 월부터 gnu.emacs.sources에서 논의한 결과입니다 .

(defun duplicate-line (arg)
  "Duplicate current line, leaving point in lower line."
  (interactive "*p")

  ;; save the point for undo
  (setq buffer-undo-list (cons (point) buffer-undo-list))

  ;; local variables for start and end of line
  (let ((bol (save-excursion (beginning-of-line) (point)))
        eol)
    (save-excursion

      ;; don't use forward-line for this, because you would have
      ;; to check whether you are at the end of the buffer
      (end-of-line)
      (setq eol (point))

      ;; store the line and disable the recording of undo information
      (let ((line (buffer-substring bol eol))
            (buffer-undo-list t)
            (count arg))
        ;; insert the line arg times
        (while (> count 0)
          (newline)         ;; because there is no newline in 'line'
          (insert line)
          (setq count (1- count)))
        )

      ;; create the undo information
      (setq buffer-undo-list (cons (cons eol (point)) buffer-undo-list)))
    ) ; end-of-let

  ;; put the point in the lowest line and return
  (next-line arg))

그런 다음 CTRL-D를 정의하여이 함수를 호출 할 수 있습니다.

(global-set-key (kbd "C-d") 'duplicate-line)

우수한! 실행 취소 및 커서 위치 기능이이 기능을 최고로 만듭니다. 감사!
ptrn

또한 링크에는 지역 코드도 있습니다!
pcarvalho

아주 좋은 해결책. Thx
Plankalkül 2016 년

잘 작동합니다. 솔루션 주셔서 감사합니다.
Stryker

@pesche crux-duplicate-current-line-or-region는 함수를 사용하면 줄 복제와 마지막 작업을 취소하기 때문에 더 잘 작동합니다.
rofrol

47

명령 을 사용하는 것처럼 kill-line( C-k) 대신 :C-a C-k C-k C-y C-ykill-whole-line

C-S-Backspace
C-y
C-y

장점 C-k은 포인트가 라인의 어느 위치에 있든 상관 없으며 (라인의 C-k시작 부분에 있어야하는 것과는 달리 ) 개행을 종료합니다 (일부 C-k는 그렇지 않음).


2
쿠도 @RayVega! 이 솔루션을 사용해 보았지만 챔피언처럼 작동합니다 (GNU Emacs 23.3.1에서는 어쨌든). 이 솔루션이 일부 사람들에게 적합하지 않습니까? 이것은 (자신의) 질문에 대한 가장 좋은 답변입니다.
JS.

1
이 답변을 정답으로 받아 들여야합니다. 요청한 내용과 "최소 명령 수"로 정확하게 수행합니다.
Davor Cubranic

24

이 작업을 수행하는 또 다른 기능이 있습니다. 내 버전은 킬 링을 건드리지 않고 커서는 원래 줄에 있던 새 줄에서 끝납니다. 활성 상태 인 경우 (과도 표시 모드) 영역을 복제하거나, 그렇지 않으면 기본적으로 선을 복제합니다. 또한 접두사 arg가 주어지면 여러 복사본을 만들고 음수 접두사 arg가 주어지면 원래 줄을 주석 처리합니다 (이전 명령을 유지하면서 다른 버전의 명령 / 문을 테스트하는 데 유용합니다).

(defun duplicate-line-or-region (&optional n)
  "Duplicate current line, or region if active.
With argument N, make N copies.
With negative N, comment out original line and use the absolute value."
  (interactive "*p")
  (let ((use-region (use-region-p)))
    (save-excursion
      (let ((text (if use-region        ;Get region if active, otherwise line
                      (buffer-substring (region-beginning) (region-end))
                    (prog1 (thing-at-point 'line)
                      (end-of-line)
                      (if (< 0 (forward-line 1)) ;Go to beginning of next line, or make a new one
                          (newline))))))
        (dotimes (i (abs (or n 1)))     ;Insert N times, or once if not specified
          (insert text))))
    (if use-region nil                  ;Only if we're working with a line (not a region)
      (let ((pos (- (point) (line-beginning-position)))) ;Save column
        (if (> 0 n)                             ;Comment out original with negative arg
            (comment-region (line-beginning-position) (line-end-position)))
        (forward-line 1)
        (forward-char pos)))))

나는 그것을 묶었 다 C-c d.

(global-set-key [?\C-c ?d] 'duplicate-line-or-region)

C-c단일 (수정되지 않은) 문자가 사용자 바인딩을 위해 예약되어 있기 때문에 모드 또는 다른 것에 의해 다시 할당되어서는 안됩니다 .


지금까지 최고의 솔루션
레오 Ufimtsev

1
이것을 .emacs 파일에 넣었지만 사용하려고 C-c d하면 오류가 발생 command-execute: Wrong type argument: commandp, duplicate-line-or-region합니다. 무슨 일이야? Windows에서 Emacs 25.1.1을 사용하고 있습니다
junius

정말 좋은 해결책은 지역 기능과 음수 인수가있는 주석 기능에 감사드립니다. 또한 제안 된 키 바인딩과 같습니다.
Alex Trueman

18

Nathan이 .emacs 파일에 추가 한 방법은 갈 수 있지만 대체하여 약간 단순화 할 수 있습니다

  (open-line 1)
  (next-line 1)

  (newline)

굽힐 수 있는

(defun duplicate-line()
  (interactive)
  (move-beginning-of-line 1)
  (kill-line)
  (yank)
  (newline)
  (yank)
)
(global-set-key (kbd "C-d") 'duplicate-line)

이거 좋은데. 감사!
tejasbubane


5

선 복제가 다른 곳에서 어떻게 작동하는지는 잘 기억하지 못하지만 이전 SciTE 사용자는 SciTE-way에 대해 한 가지를 좋아했습니다. 커서 위치에 닿지 않습니다! 위의 모든 낭송은 나에게 충분하지 않았습니다. 여기 히피 버전이 있습니다.

(defun duplicate-line ()
    "Clone line at cursor, leaving the latter intact."
    (interactive)
    (save-excursion
        (let ((kill-read-only-ok t) deactivate-mark)
            (toggle-read-only 1)
            (kill-whole-line)
            (toggle-read-only 0)
            (yank))))

실제로는 프로세스에서 아무 것도 제거되지 않고 마크와 현재 선택은 그대로 유지됩니다.

BTW, 왜이 멋진 클린 킬-전체 라인 (CS-backspace)이있을 때 커서를 쳐주는 것을 좋아합니까?


4

잘 모르겠 기 때문에 슬로우 볼로이 골프 라운드를 시작하겠습니다.

ctrl-k, y, y


4

.emacs에 갖고 싶은 것이 있다면

(setq kill-whole-line t)

기본적으로 킬 라인을 호출 할 때마다 (즉, Ck를 통해) 전체 라인과 개행을 죽입니다. 그런 다음 추가 코드없이 Ca Ck Cy Cy를 수행하여 행을 복제 할 수 있습니다. 그것은 고장

C-a go to beginning of line
C-k kill-line (i.e. cut the line into clipboard)
C-y yank (i.e. paste); the first time you get the killed line back; 
    second time gives the duplicated line.

그러나 이것을 자주 사용하는 경우 전용 키 바인딩이 더 나은 아이디어 일 수 있지만 Ca Ck Cy Cy를 사용하면 현재 줄 바로 아래 대신 다른 곳에서 줄을 복제 할 수 있다는 이점이 있습니다.


4

나는 copy-from-above-command열쇠에 묶여 그것을 사용합니다. XEmacs와 함께 제공되지만 GNU Emacs에 대해서는 모르겠습니다.

`copy-from-above-command '는 대화식으로 컴파일 된 Lisp 함수
입니다. "/usr/share/xemacs/21.4.15/lisp/misc.elc"에서 불러 오기

문서 : 바로 위부터 시작하여 공백이 아닌 이전 행의 문자를 복사하십시오 . ARG 문자를 복사하지만 해당 행의 끝을 지나서는 안됩니다. 인수가 없으면 나머지 행 전체를 복사하십시오. 복사 된 문자는 포인트 전에 버퍼에 삽입됩니다.


버전 23은 표준 GNU Emacs 배포판의 일부입니다.
viam0Zah

내 버전에없는 것 같습니다. 무언가를로드해야합니까? 내 버전은 GNU Emacs 23.2.1 (amd64-portbld-freebsd8.1) of 2010-11-14 on [host clipped]입니다.
qmega

2
@qmega 당신은해야합니다 ( 'misc가 필요합니다).
Dmitry

4

Avy 라는 패키지가 있습니다 . avy-copy-line 명령이 있습니다. 해당 명령을 사용하면 창의 모든 줄이 문자 조합을 갖습니다. 그런 다음 조합을 입력하면 해당 줄이 나타납니다. 이것은 또한 지역에서도 작동합니다. 그런 다음 두 가지 조합 만 입력하면됩니다.

인터페이스를 볼 수 있습니다 :

여기에 이미지 설명을 입력하십시오



3

이것에 대한 기본값은 끔찍합니다. 그러나 SlickEdit 및 TextMate와 같이 작동하도록 Emacs를 확장 할 수 있습니다. 즉, 텍스트를 선택하지 않은 경우 현재 행을 복사 / 잘라냅니다.

(transient-mark-mode t)
(defadvice kill-ring-save (before slick-copy activate compile)
  "When called interactively with no active region, copy a single line instead."
  (interactive
   (if mark-active (list (region-beginning) (region-end))
     (message "Copied line")
     (list (line-beginning-position)
           (line-beginning-position 2)))))
(defadvice kill-region (before slick-cut 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)))))

위의를에 배치하십시오 .emacs. 그런 다음 줄을 복사하려면 M-w. 줄을 삭제하려면 C-w. 줄을 복제하려면 C-a M-w C-y C-y C-y ....


3

'나는 내 자신의 버전을 썼다 duplicate-line.

  (defun jr-duplicate-line ()
    "EASY"
    (interactive)
    (save-excursion
      (let ((line-text (buffer-substring-no-properties
                        (line-beginning-position)
                        (line-end-position))))
        (move-end-of-line 1)
        (newline)
        (insert line-text))))
  (global-set-key "\C-cd" 'jr-duplicate-line)

3

나는 두 가지를 제외하고 FraGGod의 버전을 좋아했다. (1) 버퍼가 이미 읽기 전용인지 여부를 확인하지 않고 (interactive "*")(2) 마지막 행이 비어 있으면 버퍼의 마지막 행에서 실패합니다. 이 경우 줄을 죽일 수 없습니다) 버퍼를 읽기 전용으로 둡니다.

이를 해결하기 위해 다음과 같이 변경했습니다.

(defun duplicate-line ()
  "Clone line at cursor, leaving the latter intact."
  (interactive "*")
  (save-excursion
    ;; The last line of the buffer cannot be killed
    ;; if it is empty. Instead, simply add a new line.
    (if (and (eobp) (bolp))
        (newline)
      ;; Otherwise kill the whole line, and yank it back.
      (let ((kill-read-only-ok t)
            deactivate-mark)
        (toggle-read-only 1)
        (kill-whole-line)
        (toggle-read-only 0)
        (yank)))))

3

최근 emacs를 사용하면 줄 어디에서나 Mw를 사용하여 복사 할 수 있습니다. 따라서 다음과 같이됩니다.

M-w C-a RET C-y

정말? 어떤 "최근"이맥스가 될까요? 24.4의 경우가 아님 : "지금 마크가 설정되지 않았으므로 지역이 없습니다."
Davor Cubranic

현재 Emacs는 24.5이며 M-w로 바인딩됩니다 easy-kill. 당신이 할 때 얻을 수 있는지 확인C-h c M-w
Louis Kottmann

Emacs 24.5.1에서는 작동하지 않았습니다. 선행 빈 줄을 삽입 한 후 줄의 시작 부분에서 같은 줄의 시작 부분까지만 복사했습니다.
Derek Mahar

3

어쨌든 매우 복잡한 솔루션을 보았습니다 ...

(defun duplicate-line ()
  "Duplicate current line"
  (interactive)
  (kill-whole-line)
  (yank)
  (yank))
(global-set-key (kbd "C-x M-d") 'duplicate-line)

이것은 킬 링을 망칠 것입니다.
Dodgie

마지막 줄일 때 줄을 추가하고 파일이 새 줄로 끝나지 않습니다
Mark

2

@ [Kevin Conner] : 내가 아는 한 아주 가깝습니다. 고려해야 할 유일한 것은 kill-whole-lineCk에 개행 문자를 포함시키는 것입니다.


@Allen는 : 제거 []인은@[Kevin Conner]
JFS

2

ctrl- k, ctrl- k, (새 위치에 대한 위치)ctrl -y

줄의 시작 부분에서 시작하지 않는 경우 ctrl-를 추가하십시오 a. 그리고 두 번째 ctrl- k개행 문자를 가져옵니다. 텍스트 만 원하면 제거 할 수 있습니다.


이것은 가장 간단한 방법이어야합니다. 감사!
bartlomiej.n

2

활성 영역이없는 대화식으로 호출되는 경우 대신 한 줄로 COPY (Mw)하십시오.

(defadvice kill-ring-save (before slick-copy activate compile)
  "When called interactively with no active region, COPY a single line instead."
  (interactive
   (if mark-active (list (region-beginning) (region-end))
     (message "Copied line")
     (list (line-beginning-position)
           (line-beginning-position 2)))))

활성 지역없이 대화식으로 호출 할 경우 단일 회선 대신 킬 (Cw)합니다.

(defadvice kill-region (before slick-cut activate compile)
  "When called interactively with no active region, KILL a single line instead."
  (interactive
   (if mark-active (list (region-beginning) (region-end))
     (message "Killed line")
     (list (line-beginning-position)
           (line-beginning-position 2)))))

또한 관련 메모에서 :

(defun move-line-up ()
  "Move up the current line."
  (interactive)
  (transpose-lines 1)
  (forward-line -2)
  (indent-according-to-mode))

(defun move-line-down ()
  "Move down the current line."
  (interactive)
  (forward-line 1)
  (transpose-lines 1)
  (forward-line -1)
  (indent-according-to-mode))

(global-set-key [(meta shift up)]  'move-line-up)
(global-set-key [(meta shift down)]  'move-line-down)

1

나는 선호도를 위해 하나를 씁니다.

(defun duplicate-line ()
  "Duplicate current line."
  (interactive)
  (let ((text (buffer-substring-no-properties (point-at-bol) (point-at-eol)))
        (cur-col (current-column)))
    (end-of-line) (insert "\n" text)
    (beginning-of-line) (right-char cur-col)))
(global-set-key (kbd "C-c d l") 'duplicate-line)

그러나 현재 줄에 멀티 바이트 문자 (예 : CJK 문자)가 포함되어 있으면 문제가 있음을 알았습니다. 이 문제가 발생하면 대신 다음을 시도하십시오.

(defun duplicate-line ()
  "Duplicate current line."
  (interactive)
  (let* ((text (buffer-substring-no-properties (point-at-bol) (point-at-eol)))
         (cur-col (length (buffer-substring-no-properties (point-at-bol) (point)))))
    (end-of-line) (insert "\n" text)
    (beginning-of-line) (right-char cur-col)))
(global-set-key (kbd "C-c d l") 'duplicate-line)

1

이 기능은 라인 또는 지역별로 복제 한 다음 점 및 / 또는 활성 지역을 예상대로 남겨둔다는 점에서 JetBrains의 구현과 일치해야합니다.

대화 형 양식을 둘러싼 래퍼입니다.

(defun wrx/duplicate-line-or-region (beg end)
  "Implements functionality of JetBrains' `Command-d' shortcut for `duplicate-line'.
   BEG & END correspond point & mark, smaller first
   `use-region-p' explained: 
   http://emacs.stackexchange.com/questions/12334/elisp-for-applying-command-to-only-the-selected-region#answer-12335"
  (interactive "r")
  (if (use-region-p)
      (wrx/duplicate-region-in-buffer beg end)
    (wrx/duplicate-line-in-buffer)))

어느 것이 이것을 부르나요?

(defun wrx/duplicate-region-in-buffer (beg end)
  "copy and duplicate context of current active region
   |------------------------+----------------------------|
   |        before          |           after            |
   |------------------------+----------------------------|
   | first <MARK>line here  | first line here            |
   | second item<POINT> now | second item<MARK>line here |
   |                        | second item<POINT> now     |
   |------------------------+----------------------------|
   TODO: Acts funky when point < mark"
  (set-mark-command nil)
  (insert (buffer-substring beg end))
  (setq deactivate-mark nil))

아니면 이거

(defun wrx/duplicate-line-in-buffer ()
  "Duplicate current line, maintaining column position.
   |--------------------------+--------------------------|
   |          before          |          after           |
   |--------------------------+--------------------------|
   | lorem ipsum<POINT> dolor | lorem ipsum dolor        |
   |                          | lorem ipsum<POINT> dolor |
   |--------------------------+--------------------------|
   TODO: Save history for `Cmd-Z'
   Context: 
   http://stackoverflow.com/questions/88399/how-do-i-duplicate-a-whole-line-in-emacs#answer-551053"
  (setq columns-over (current-column))
  (save-excursion
    (kill-whole-line)
    (yank)
    (yank))
  (let (v)
    (dotimes (n columns-over v)
      (right-char)
      (setq v (cons n v))))
  (next-line))

그리고 나는 이것을 meta + shift + d에 묶었습니다.

(global-set-key (kbd "M-D") 'wrx/duplicate-line-or-region)

1

다른 답변에서 언급했듯이 키 획을 lisp 코드에 바인딩하는 것이 다른 키 획에 바인딩하는 것보다 낫습니다. @ mw의 대답으로 코드는 줄을 복제하고 마크를 줄 바꿈으로 이동시킵니다. 이 수정은 마크 위치를 새 줄의 동일한 열에 유지합니다.

fun duplicate-line ()
  (interactive)
  (let ((col (current-column)))
    (move-beginning-of-line 1)
    (kill-line)
    (yank)
    (newline)
    (yank)
    (move-to-column col)))

1

Spacemacs를 사용하는 경우 간단히 다음을 사용하여을 사용할 수 있습니다 duplicate-line-or-region.

SPC x l d 

0

접두사 인수와 함께 직관적 인 행동은 무엇입니까?

(defun duplicate-line (&optional arg)
  "Duplicate it. With prefix ARG, duplicate ARG times."
  (interactive "p")
  (next-line 
   (save-excursion 
     (let ((beg (line-beginning-position))
           (end (line-end-position)))
       (copy-region-as-kill beg end)
       (dotimes (num arg arg)
         (end-of-line) (newline)
         (yank))))))

커서는 마지막 줄에 남아 있습니다. 또는 다음 몇 줄을 한 번에 복제 할 접두사를 지정할 수도 있습니다.

(defun duplicate-line (&optional arg)
  "Duplicate it. With prefix ARG, duplicate ARG times."
  (interactive "p")
  (save-excursion 
    (let ((beg (line-beginning-position))
          (end 
           (progn (forward-line (1- arg)) (line-end-position))))
      (copy-region-as-kill beg end)
      (end-of-line) (newline)
      (yank)))
  (next-line arg))

접두사 인수의 동작을 전환하기 위해 래퍼 함수를 ​​사용하여 둘 다 자주 사용합니다.

그리고 키 바인딩 : (global-set-key (kbd "C-S-d") 'duplicate-line)


0
;; http://www.emacswiki.org/emacs/WholeLineOrRegion#toc2
;; cut, copy, yank
(defadvice kill-ring-save (around slick-copy activate)
  "When called interactively with no active region, copy a single line instead."
  (if (or (use-region-p) (not (called-interactively-p)))
      ad-do-it
    (kill-new (buffer-substring (line-beginning-position)
                                (line-beginning-position 2))
              nil '(yank-line))
    (message "Copied line")))
(defadvice kill-region (around slick-copy activate)
  "When called interactively with no active region, kill a single line instead."
  (if (or (use-region-p) (not (called-interactively-p)))
      ad-do-it
    (kill-new (filter-buffer-substring (line-beginning-position)
                                       (line-beginning-position 2) t)
              nil '(yank-line))))
(defun yank-line (string)
  "Insert STRING above the current line."
  (beginning-of-line)
  (unless (= (elt string (1- (length string))) ?\n)
    (save-excursion (insert "\n")))
  (insert string))

(global-set-key (kbd "<f2>") 'kill-region)    ; cut.
(global-set-key (kbd "<f3>") 'kill-ring-save) ; copy.
(global-set-key (kbd "<f4>") 'yank)           ; paste.

위의 elisp를 init.el에 추가하면 이제 전체 줄 잘라 내기 / 복사 기능을 사용할 수 있습니다. 그러면 F3 F4를 사용하여 줄을 복제 할 수 있습니다.


0

가장 간단한 방법은 Chris Conway의 방법입니다.

C-a C-SPACE C-n M-w C-y

이것이 EMACS에서 규정 한 기본 방법입니다. 제 생각에는 표준을 사용하는 것이 좋습니다. 저는 EMACS에서 자신의 키 바인딩을 사용자 지정하는 데 항상주의를 기울입니다. EMACS는 이미 충분히 강력하므로 자체 키 바인딩에 적응하기 위해 최선을 다해야한다고 생각합니다.

조금 길지만 익숙해지면 빨리 할 수 ​​있고 재미 있습니다!


4
Emacs는 모든 것을 고려할 때 거의 요구하지 않습니다. 여러분에게주는 큰 승리는 자신의 필요에 따라 쉽게 사용자 정의 있다는 것입니다. 물론 실제로 고집하는 것이 유익한 일을 수행하는 많은 표준 방법이 있지만 "기본"Emacs를 사용하고 있고 "표준을 사용하는 것이 더 낫다"고 생각하기 때문에 필요한 것보다 더 어려운 방법을 사용하는 경우 , 당신은 거의 잘못하고 있습니다.
phils

0

현재 라인을 복제하는 기능은 다음과 같습니다. 접두사 인수를 사용하면 행을 여러 번 복제합니다. 예를 들어, C-3 C-S-o현재 줄을 세 번 복제합니다. 킬 링을 변경하지 않습니다.

(defun duplicate-lines (arg)
  (interactive "P")
  (let* ((arg (if arg arg 1))
         (beg (save-excursion (beginning-of-line) (point)))
         (end (save-excursion (end-of-line) (point)))
         (line (buffer-substring-no-properties beg end)))
    (save-excursion
      (end-of-line)
      (open-line arg)
      (setq num 0)
      (while (< num arg)
        (setq num (1+ num))
        (forward-line 1)
        (insert-string line))
      )))

(global-set-key (kbd "C-S-o") 'duplicate-lines)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.