Vim : 줄을 이전에 잡아 당긴 다른 줄로 바꾸기


112

하루에 한 번 이상 다음과 같은 상황이 발생합니다.

A: This line should also replace line X
...
X: This is line should be replaced

나는 그 일을 효율적으로 수행하지 못한다고 생각합니다.

내가하는 일 :

  • A 행으로 이동 : AG
  • Yank 라인 A : yy
  • X 행 : XG로 이동
  • A 행 붙여 넣기 : P
  • 이전 줄로 이동 : j
  • 이전 줄 삭제 : dd

이것은 라인 X가 이제 기본 레지스터에 있다는 추가적인 단점이 있습니다. A로 교체해야하는 다른 라인을 찾으면 짜증납니다. 추가 레지스터 ( "ayy , "aP )에 양킹하여 붙여 넣으면 이 간단한 작업도 가능합니다. 덜 효율적입니다.

내 질문 :

  • 이전에 잡아 당긴 줄을 대체하는 내장 Vim 명령을 놓쳤습니까?
  • 그렇지 않은 경우 기본 레지스터에 늘어진 줄을 남기거나 복원하는 내 명령을 어떻게 바인딩 할 수 있습니까?

2
이것이 Vim의 편집 모델에서 가장 큰 문제입니다. 해결책을 알고 싶습니다. CUA 편집기는 잘라내 기와 삭제를 구분하므로 일부 텍스트를 잘라낸 다음 원하는 모든 항목을 삭제하고 붙여 넣을 수 있습니다. Vim으로 삭제하면 잘라낸 텍스트가 삭제됩니다. 다른 편집기보다 훨씬 더 많은 키 입력을 사용하게됩니다.
Mud


에 대한 자세한 내용 @Mud :move블랙 홀 (레지스터 _) (또는 사실, 단지 레지스터)
sehe

2
@sehe 저는 레지스터를 완벽하게 알고 있지만 잘라 내기 / 붙여 넣기 작업 당 4 개의 키 입력을 추가하고 더 많은 고려가 필요합니다. 많은 편집을 할 때 빠르게 합산됩니다.
Mud

몇 바이트의 메모리를 절약하는 것 외에 다른 레지스터와 달리 블랙홀 레지스터를 사용하면 이점이 있습니까? 나는 당신이 그것을 다시 읽지 않으면 모든 레지스터가 블랙홀 레지스터가 될 수 있다고 주장합니다.
sleblanc

답변:


91

내가 할 것 :

  1. aG
  2. Y
  3. xG
  4. Vp

당신은 정상 모드를 종료 할 필요가 없습니다,하지만 하지 라인을 가득 차면. 그러나 V"0p2 단계에서 항상 줄을 잡아 당기는 것을 사용할 수 있습니다 .


11
@duddle : 예, Y동의어입니다yy
icecrime은

8
1 단계와 2 단계는 : ay를 사용하여 결합 할 수 있습니다. [예 : 20y] 다음 Vp가 트릭을 수행해야합니다. 그것을 잡아 당기기 위해 줄로 갈 필요가 없습니다.
Bharad

2
. 당신은 모든 다음 줄 단지로 대체 할 수 0P 대신 V의 ccCTRL + r0ESC "(리피터)를 추가 라인 덮어 쓸 경우
요르단 모리스

Y동의어입니다 yy,하지만 난 그것을 위해 매핑 제안 y$일치 D하고 C.
mgold

아래의 Jordan Morris stackoverflow.com/users/970673/jordan-morris 의 답변을 확인하십시오. 실제로 명령을 여러 번 반복 할 수 있도록 허용하여 vim 명령을 최대한 사용합니다.
JESii 2014-06-14

105

Vp: 줄을 선택하고 홱 잡아 당긴 것을 붙여 넣기


3
VP전체 시퀀스에 대해 Shift 키를 계속 사용할 수 있기 때문에 편리합니다.
George Hilliard

24
(아마도) 중요한주의 사항에 주목할 가치가 있지만 매우 좋은 트릭입니다. 이로 인해 yank 레지스터가 덮어 쓰여지는 줄의 내용으로 업데이트되므로 일부 작업에서는 제대로 재생되지 않을 수 있습니다. 예를 들어 덮어 쓰려는 경우 여러 목적지에 동일한 라인.
underscore_d

8
@underscore_d, 당신이 할 경우 멋지게 재생 V"0p되며, 마지막으로 잡아 당긴 레지스터에서 붙여 넣습니다 .
timblaktu

@timblaktu 무엇을 설명 할 수 있습니까 V"0p? V는 시각적 라인 라인 모드로 들어가고 p는 붙여 넣기를위한 것입니다. "와 0은 무엇입니까? 감사합니다
theprogrammer

43

이것은 X 행이 이제 기본 레지스터에 있다는 추가 단점이 있습니다 .A로 대체해야 할 다른 행을 찾으면 짜증납니다.

일반 레지스터에 영향을주지 않고 텍스트를 삭제하려면 블랙홀 레지스터를 사용할 수 있습니다 "_.

"_dd

10
내가 만들어 내 .vimrc 파일에 일부 매핑을 추가 d하고 dd항상 블랙홀를 사용 x하고 xx대부분의 편집자는 "컷"전화 (삭제 및 기본 레지스터에 저장) 될지 수행noremap x d noremap xx dd noremap d "_d noremap dd "_dd
IMSoP

2
다른 컴퓨터 나 IDE 용 VIM 스타일 플러그인에서는 쉽지 않을 수 있기 때문에 VIM에서 항목을 다시 매핑하는 것을 조심합니다. 또한 VIM의 디자이너는 실제로 파는 경우 기본 매핑 문제를 해결하는 경향이 있습니다.
요르단 모리스

15

사용 Vp또는 VP줄 위에 붙여 넣기 를 제안하는 답변을 기반으로 -yank 레지스터의 내용을 변경하지 않기 위해 가장 인체 공학적인 명령은 다음과 같습니다.

VPY


이것은 yank 내용을 동일하게 유지하는 가장 간단한 솔루션입니다. 감사합니다!
heylookltsme ​​22:41에

14
  1. yy
  2. j (바꾸려는 줄로 이동)
  3. Vp (대문자 v 다음에 p가 얀크 된 내용으로 대체 됨)

대박! 실제로 매우 짧고 시각적 모드로 여러 줄을 쉽게 선택할 수 있습니다. 또한 붙여 넣기 버퍼를 그대로 유지합니다. dd가 해당 버퍼를 덮어 쓸 때 짜증이납니다 ...
Aktau

@Aktau 이것은 버퍼를 그대로 두지 않습니다.
요르단 모리스

9

명령 줄 (Ex) 모드를 사용하고 다음 두 명령을 수행합니다.

:XmA
:Ad

이것은 X 행을 A 바로 아래로 이동 한 다음 A를 삭제하면 해당 행이 위로 이동합니다.

예를 들면

:7m3
:3d

예를 들어 줄 수 있습니까? 예를 들어 50Gm30G를 누르면 Vim이 50 행으로 이동 한 다음 맨 아래로 이동합니다. 또한 : 광고는 A = 50 또는 A = 50G에 대해 아무것도하지 않습니다
바삭 바삭한

7
  1. 첫 번째 줄의 시작으로 이동합니다.

  2. y, $– 끝에 줄 바꿈없이 줄 복사

  3. 대상 라인의 시작으로 이동합니다.

    1. V, p– 하나의 대상 줄만 교체

    2. c, c, Ctrlr, 0, Esc- 원래 양키와 목표 라인을 교체

  4. 다음 타겟 라인의 시작으로 이동합니다.

  5. . – 4.2에서 실행 된 명령을 반복합니다.

노트:

  • 4.1는 y, $당신이 경우에 때문에 y, y또는 Y당신은 LINEBREAK을 복사합니다, 그리고 Ctrlr0실제로 목표 라인 아래 LINEBREAK을 추가합니다.

  • 4.2는 V p기술적으로 마지막 작업이 삭제이기 때문에 반복으로 작동하지 않는을 대체 하므로 .줄을 삭제합니다.

  • EX 모드 (명령 줄)에서 '현재 줄을 레지스터로 교체'를 실행하는 방법을 아는 사람이 있다면 여러분의 의견을 듣고 싶습니다 (그리고 문서를 어디에서 찾았는지 알고 싶습니다). 4.2보다 빠르거나 줄 바꿈 경고가없는 반복 가능한 EX 명령이있을 수 있습니다.


1
이제 4.3에서와 같이 도트 명령으로 전체 프로세스를 반복 할 수 있으므로 4.2 단계가 킬러입니다. 이것이 바로 vim의 전부입니다!
JESii 2014-06-14

1
나는 이것을 이해하지 못한다. 'AG'는 내 메이커를 줄 끝에 놓고 삽입 모드로 들어가 'G'를 입력합니다. 내가 얻지 못하는 것은 무엇입니까?
gustafbstrom

@gustafbstrom 공정한 비판-A가 줄 번호를 나타내기로되어 있었지만 나는 그것을 지적하지 못했습니다. 편집.
요르단 모리스

5

내가 할 일은 다음과 같습니다.

  • 줄 A의 시작으로 이동 AG(여기서 A는 분명히 줄 번호 임)
  • 예를 들어 (새 줄없이) 일부 레지스터에 줄을 얀크합니다. 유형"ay$
  • 라인 삽입으로 이동, XG
  • 대체 라인, S
  • 레지스터 A에서 삽입, Ctrl-Ra

4

비주얼 모드와 함께 사용할 수 있습니다.

  • A 행으로 이동 : AG
  • 시각적 모드로 선을 선택하십시오. VESC
  • X 행으로 이동 : XG
  • 라인에 대한 대체 모드를 입력하십시오. S
  • 복사 한 행 을 붙여 넣으십시오 : shift+ insert(또는 클립 보드에서 붙여 넣기 위해 가지고있는 다른 맵핑).

아. VS 에 대해 몰랐습니다 . 그러나 삽입 모드에서 액세스 할 수있는 유일한 OS 클립 보드에 연결하지 않기 때문에 단계가 작동하지 않습니다. 따라서 먼저 삽입 모드를 종료해야합니다.
바삭

3

다음을 수행 할 수도 있습니다.

Vy (in normal mode at the line you want to copy)
Vp (in normal mode at the line you want to replace)
  • 공백이나 줄 끝을 만들지 않습니다.
  • 커서는 복사 된 텍스트의 시작 부분에 위치합니다.

동일한 키를 사용하여 두 줄 이상의 줄을 잡아 당기거나 붙여 넣을 수 있습니다.

V (in normal mode at what you want to yank)
(use jk to move the selection)
y (to yank the selection)
V (in normal mode at where you want to paste)
(use jk to move the selection)
p (to replace the selection with the yanked lines)

2

일반 모드에서이 명령을 사용할 수 있습니다.

:AmX | Xd

m에 대한 명령은 m[ove]복사하는 대신, 사용 라인을 이동하려는 경우 줄 번호 X 후 줄 번호 A를 이동하는 co[py]. d명령입니다 d[elete].

다음을 사용하여 co행 범위를 이동 (복사 ) 할 수 있습니다.

:start,end m X

2

cicld (감사합니다!) 의 최근 댓글에 비추어 볼 때 원래 문제를 완전히 이해하지 못한 것 같습니다. 줄을 옮기는 것은 적절하지 않지만 복사는 (줄이 홱 잡아 당기기 때문에) 그래서 다음과 같이 수정합니다.

:1t20:20d_
  1. 20 행 이후 의 첫 번째 행 ( :t명령은의 별칭 :copy임)을 복사합니다 ( 21 행에 배치됨).

  2. 라인 20을 삭제하고 삭제 된 라인을 '블랙홀'레지스터 ( _)에 넣습니다 (즉, 현재 yank 버퍼에 영향을주지 않음).

최근 주석에서 언급했듯이 이것은 현재 커서 위치에 영향을주지 않습니다.


1
  1. : ay (여기서 a는 줄 번호입니다. 예 : 20y). 이것은 줄을 잡아 당깁니다 (의도 한 말장난).
  2. Vp

1

이를 위해 Ex 명령을 사용하는 것이 더 쉽습니다. 전의. 9 행을 46 행으로 이동하려면 :

 :46|9m.|-1d

그러면 커서가 46 행으로 이동하고 9 행을 현재 아래로 이동 한 다음 이전 행을 삭제합니다 (이동 된 행이 현재 행이므로).

또는 마크 사용, 마크 'a'사용 :

:46ma a|9m'a|'ad

EX 명령의 장점은 커서가있는 곳 (일반 모드)에서 실행할 수 있다는 것입니다. 나는 선호한다 :1m20|.+1d(1 행을 20 행으로 이동하고 다음 행, 즉 이전에 20 행에 있던 텍스트를 삭제). 그래도 같은 생각!
circld

1

나는 종종 한 줄을 Y하고 여러 위치에서 대체해야하며 각 위치에는 다른 값이 있습니다 (정규식을 할 수 없음을 의미합니다).

Y 원하는 원래 줄을 잡아 당기려면

교체하려는 모든 라인에서 VpzeroY


0

"블랙홀"레지스터를 사용하면됩니다.

주어진:

nnoremap <Cd> "_dd

해결책은 다음과 같습니다.

<Cd> yy

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.