나는 VIM에 대해서도 이와 같은 질문을 보았고 , 이맥스에 대해 어떻게해야하는지 알고 싶었습니다. ReSharper에서는이 작업에 CTRL-D를 사용합니다. 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
다른 작업을 수행 할 수 있습니다.
C-S-backspace C-y C-y
?
이전 답변 외에도 행을 복제하는 고유 한 함수를 정의 할 수도 있습니다. 예를 들어, .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
Del
이 기능에서 바인딩을 해제하는 방법에 대한 아이디어가 있습니까?
Del
new C-d
다음 을 유지하면서 정상 으로 되 돌리는 솔루션을 찾았습니다 . 정의 (global-set-key (kbd "<delete>") 'delete-char)
후에 추가해야합니다 C-d
.
처음에 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)
crux-duplicate-current-line-or-region
는 함수를 사용하면 줄 복제와 마지막 작업을 취소하기 때문에 더 잘 작동합니다.
명령 을 사용하는 것처럼 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
단일 (수정되지 않은) 문자가 사용자 바인딩을 위해 예약되어 있기 때문에 모드 또는 다른 것에 의해 다시 할당되어서는 안됩니다 .
C-c d
하면 오류가 발생 command-execute: Wrong type argument: commandp, duplicate-line-or-region
합니다. 무슨 일이야? Windows에서 Emacs 25.1.1을 사용하고 있습니다
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)이있을 때 커서를 쳐주는 것을 좋아합니까?
.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를 사용하면 현재 줄 바로 아래 대신 다른 곳에서 줄을 복제 할 수 있다는 이점이 있습니다.
나는 copy-from-above-command
열쇠에 묶여 그것을 사용합니다. XEmacs와 함께 제공되지만 GNU Emacs에 대해서는 모르겠습니다.
`copy-from-above-command '는 대화식으로 컴파일 된 Lisp 함수
입니다. "/usr/share/xemacs/21.4.15/lisp/misc.elc"에서 불러 오기문서 : 바로 위부터 시작하여 공백이 아닌 이전 행의 문자를 복사하십시오 . ARG 문자를 복사하지만 해당 행의 끝을 지나서는 안됩니다. 인수가 없으면 나머지 행 전체를 복사하십시오. 복사 된 문자는 포인트 전에 버퍼에 삽입됩니다.
GNU Emacs 23.2.1 (amd64-portbld-freebsd8.1) of 2010-11-14 on [host clipped]
입니다.
이것에 대한 기본값은 끔찍합니다. 그러나 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 ...
.
'나는 내 자신의 버전을 썼다 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)
나는 두 가지를 제외하고 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
M-w
로 바인딩됩니다 easy-kill
. 당신이 할 때 얻을 수 있는지 확인C-h c M-w
ctrl- k, ctrl- k, (새 위치에 대한 위치)ctrl -y
줄의 시작 부분에서 시작하지 않는 경우 ctrl-를 추가하십시오 a. 그리고 두 번째 ctrl- k개행 문자를 가져옵니다. 텍스트 만 원하면 제거 할 수 있습니다.
활성 영역이없는 대화식으로 호출되는 경우 대신 한 줄로 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)
나는 선호도를 위해 하나를 씁니다.
(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
이것이 EMACS에서 규정 한 기본 방법입니다. 제 생각에는 표준을 사용하는 것이 좋습니다. 저는 EMACS에서 자신의 키 바인딩을 사용자 지정하는 데 항상주의를 기울입니다. EMACS는 이미 충분히 강력하므로 자체 키 바인딩에 적응하기 위해 최선을 다해야한다고 생각합니다.
조금 길지만 익숙해지면 빨리 할 수 있고 재미 있습니다!
현재 라인을 복제하는 기능은 다음과 같습니다. 접두사 인수를 사용하면 행을 여러 번 복제합니다. 예를 들어, 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)