Emacs에서 전체 라인을 어떻게 복제합니까?
나는 VIM에 대해서도 이와 같은 질문을 보았고 , 이맥스에 대해 어떻게해야하는지 알고 싶었다. ReSharper에서는이 작업에 CTRL-D를 사용합니다. Emacs에서이를 수행하기위한 최소 명령 수는 얼마입니까?
나는 사용한다
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
다른 작업을 수행 할 수 있습니다.
이전 답변 외에도 행을 복제하는 고유 한 함수를 정의 할 수도 있습니다. 예를 들어, .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)
처음에 CTRL-를 수행하지 않으면 커서를 줄에 놓고 A다음을 수행하십시오.
CTRL-K
CTRL-K
CTRL-Y
CTRL-Y
실행 취소와 잘 작동하고 커서 위치를 엉망으로 만들지 않는 선을 복제하는 함수 버전입니다. 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)
명령 을 사용하는 것처럼 kill-line
( C-k
) 대신 :C-a
C-k
C-k
C-y
C-y
kill-whole-line
C-S-Backspace
C-y
C-y
장점 C-k
은 포인트가 라인의 어느 위치에 있든 상관 없으며 (라인의 C-k
시작에 있어야하는 것과는 달리 ) 개행을 죽입니다 (일부 C-k
는 그렇지 않음).
이 작업을 수행하는 또 다른 기능이 있습니다. 내 버전은 킬 링을 건드리지 않고 커서는 원래 줄에 있던 새 줄에서 끝납니다. 활성 상태 인 경우 (과도 표시 모드) 영역을 복제하거나, 그렇지 않으면 기본적으로 선을 복제합니다. 접두사 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
단일 (수정되지 않은) 문자가 사용자 바인딩을 위해 예약되어 있기 때문에 모드 또는 다른 것에 의해 다시 할당되어서는 안됩니다 .
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)
선 복제가 다른 곳에서 어떻게 작동하는지는 잘 기억하지 못하지만 이전 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)이있을 때 커서를 쳐주는 것을 좋아합니까?
melpa에서 복제물 설치 :
Mx 패키지 설치 RET 복제물
(전역 세트 키 (kbd "Mc") '중복 항목)
잘 모르겠 기 때문에 슬로우 볼로이 골프 라운드를 시작하겠습니다.
ctrl-k, y, y
'나는 내 자신의 버전을 썼다 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)
나는 copy-from-above-command
열쇠에 묶여 그것을 사용합니다. XEmacs와 함께 제공되지만 GNU Emacs에 대해서는 모르겠습니다.
`copy-from-above-command '는
"/usr/share/xemacs/21.4.15/lisp/misc.elc"에서로드 된 대화식 컴파일 된 Lisp 기능입니다 (위에서 복사 한 명령 및 선택적 ARG).문서 : 바로 위부터 시작하여 공백이 아닌 이전 행의 문자를 복사하십시오 . ARG 문자를 복사하지만 해당 행의 끝을 지나서는 안됩니다. 인수가 없으면 나머지 행 전체를 복사하십시오. 복사 된 문자는 포인트 전에 버퍼에 삽입됩니다.
C-a C-k C-k C-y C-y
.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를 사용하면 현재 줄 바로 아래 대신 다른 곳에서 줄을 복제 할 수 있다는 이점이 있습니다.
이것에 대한 기본값은 끔찍합니다. 그러나 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 ...
.
나는 두 가지를 제외하고 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)))))
최근 emacs를 사용하면 줄 어디에서나 Mw를 사용하여 복사 할 수 있습니다. 따라서 다음과 같이됩니다.
M-w C-a RET C-y
어쨌든 매우 복잡한 솔루션을 보았습니다 ...
(defun duplicate-line ()
"Duplicate current line"
(interactive)
(kill-whole-line)
(yank)
(yank))
(global-set-key (kbd "C-x M-d") 'duplicate-line)
Avy 라는 패키지가 있습니다 . avy-copy-line 명령이 있습니다. 해당 명령을 사용하면 창의 모든 줄이 문자 조합을 갖습니다. 그런 다음 조합을 입력하면 해당 줄이 나타납니다. 이것은 또한 지역에서도 작동합니다. 그런 다음 두 가지 조합 만 입력하면됩니다.
인터페이스를 볼 수 있습니다 :
http://i68.tinypic.com/24fk5eu.png
@ [Kevin Conner] : 내가 아는 한 아주 가깝습니다. 고려해야 할 유일한 것은 kill-whole-line
Ck에 개행 문자를 포함시키는 것입니다.
활성 영역이없는 대화식으로 호출되는 경우 대신 한 줄로 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)
ctrl- k, ctrl- k, (새 위치에 대한 위치) ctrl-y
줄의 시작 부분에서 시작하지 않는 경우 ctrl-를 추가하십시오 a. 그리고 두 번째 ctrl- k개행 문자를 가져옵니다. 텍스트 만 원하면 제거 할 수 있습니다.
나는 선호도를 위해 글을 쓴다.
(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)
이 기능은 라인 또는 지역별로 복제 한 다음 점 및 / 또는 활성 지역을 예상대로 남겨둔다는 점에서 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)
접두사 인수와 함께 직관적 인 행동은 무엇입니까?
(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)
;; 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를 사용하여 줄을 복제 할 수 있습니다.
가장 간단한 방법은 Chris Conway의 방법입니다.
C-a C-SPACE C-n M-w C-y
That's the default way mandated by EMACS. In my opinion, it's better to use the standard. I am always careful towards customization one's own key-binding in EMACS. EMACS is already powerful enough, I think we should try our best to adapt to its own key-bindings.
Though it's a bit lengthy, but when you are used to it, you can do fast and will find this is fun!
Here's a function for duplicating current line. With prefix arguments, it will duplicate the line multiple times. E.g., C-3 C-S-o
will duplicate the current line three times. Doesn't change kill ring.
(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)
I cannot believe all these complicated solutions. This is two keystrokes:
<C-S-backspace>
runs the command kill-whole-line
C-/
runs the command undo
So <C-S-backspace> C-/
to "copy" a whole line (kill and undo).
You can, of course, combine this with numeric and negative args to kill multiple lines either forward or backward.
This feels more natural, with respect to the selected answer by Chris Conway.
(global-set-key "\C-c\C-d" "\C-a\C- \C-n\M-w\C-y\C-p\C-e")
This allows you to duplicate a line multiple times by simply repeating the \C-c\C-d key strokes.
참고URL : https://stackoverflow.com/questions/88399/how-do-i-duplicate-a-whole-line-in-emacs
'Programing' 카테고리의 다른 글
jquery를 사용하여 여러 선택 상자 값을 얻는 방법은 무엇입니까? (0) | 2020.06.13 |
---|---|
문자열에서 여러 문자를 바꾸는 가장 좋은 방법은 무엇입니까? (0) | 2020.06.13 |
ActiveRecord의 무작위 레코드 (0) | 2020.06.13 |
반복되는 문자로 채워진 가변 길이의 문자열을 만듭니다. (0) | 2020.06.13 |
matplotlib에서 서브 플롯에 대해 xlim 및 ylim을 설정하는 방법 (0) | 2020.06.12 |