Vim yanking 라인 범위


84

저는 최근에 제가 사용할 수있는 도구에 대한 지식을 확장하기로 결정한 C # 개발자입니다. 제가 배우기로 결정한 첫 번째 도구는 Vi / Vim입니다. 지금까지 모든 것이 순조롭게 진행되었지만 답변을 찾을 수없는 몇 가지 질문이 있습니다.

  1. 여러 줄을 잡아 당기고 싶다고 가정 해 보겠습니다. 여러 가지 방법이 있다는 것을 알고 있지만 줄 번호로하고 싶습니다. 대체 명령이 작동하는 방식과 비슷할 것이라고 생각했습니다 81,91y. 이를 수행하는 방법이 있습니까?

  2. g일반 모드 의 명령에 대해 약간 혼란 스럽습니다 . 무수히 많은 일을하는 것 같고 g 명령이 핵심에서 수행하는 작업을 실제로 결정할 수 없습니다. 나는 그것이 모션 명령인지 아니면 일반 모드를 통해 실행되는 다른 명령에 대한 일종의 "모두 잡기"인지 혼란 스럽습니다. 누군가 이것을 설명하거나 g명령에 대한 좋은 설명을 제공하는 참조를 알려줄 수 있습니까?


1
vim (1)의 ": help"명령에 대해 알고 있습니까?
Steve Emmerson

예, 그러나 모든 참조에서 찾을 수 없습니다. 노멀 모드에서하겠다고 생각하고 있었는데 hometoast는 커맨드 모드에서 어떻게해야하는지 보여주었습니다. g 명령의 경우 다른 명령에서 예상하는 것처럼 도움말이 모든 것을 하나로 묶지 않는다는 것을 알았습니다.
jnadro52

3
제쳐두고 질문 당 하나의 게시물을 작성하는 것이 좋습니다.
Dana

1
나는 앞으로 그렇게 할 것이다. 나는 첫 번째 질문에 더 관심이 있었고 첫 번째 질문을 입력 할 때 다른 질문을 생각했습니다.
jnadro52

답변:


140

Yank 라인 81-91

:81,91y<enter>

손가락이 :,키 를 찾는 것을 좋아하지 않으면 이 방법도 작동합니다 (81 행으로 이동하고 11 행을 잡아 당김).

81gg11yy 

나의 유일한 용도는 g입니다 5gg. 5 번째 줄로 이동합니다. 22gg: 22 번째 줄. jimbo가 말했듯이 실제로는 다른 명령의 수정 자일뿐입니다.

완전성을 위해 ( http://vim.wikia.com/wiki/Power_of_g ) g명령 모드에서 작동 하는 방법을 많이 설명 합니다.


2
대문자를 사용하면 변형도 제공 gg됩니다 . 은 첫 번째 줄로 G이동하고는 마지막 줄로 이동합니다. 또한 5G줄 5로 이동합니다. 줄 번호 대신 마크를 사용할 수도 있습니다 (매크로에 적합). 예 : :'a,52y
NVRAM

1
Shift 키를 두려워하지 않는 81G11Y경우 "더 짧습니다".
Jens

1
일반 모드 방법의 단점은 "장소"를 잃는다는 것입니다. mx이전과 'x이후에 상상할 수 있지만 명령 모드 버전이 훨씬 더 간결 해집니다. 흠 ...이 글을 작성하자마자 @Asta의 답변을 보았습니다.
Eric Smith

1
@WilliamRoss 이것은 실제로 vim에서 사용하기 위해 버퍼에 줄을 넣습니다. CTRL + V를 사용하여 메모장에 붙여 넣을 수있는 시스템 클립 보드에서 반드시 필요한 것은 아닙니다. 관련 질문보기 : vi에서 다른 애플리케이션으로 텍스트를 복사 / 붙여 넣기하는 방법
hometoast

1
내가 첫 번째 해결책을 찾은 이유는 줄을 세거나 내 머리에서 빼기를 피하는 것이었기 때문입니다.
Paul Parker

22

't'를 사용하여 현재 줄을 현재 커서 위치로 복사 할 수도 있습니다.

:81,91t.<enter>

그러면 커서가있는 줄 아래에 81-91 줄이 붙여 넣어집니다.

나는 VIM에 대한 훌륭한 자료 인 http://vimcasts.org 에서 이것을 배웠다 .


t.여기서 의미 는 무엇입니까 ?
CivFan

2
내 이해에서 아프거나 o t로 생각할 수 있으며 현재 줄의 주소입니다. tt.
Asta

1
@CivFan는 동의어이다:copy
D. 벤 Knoble

11

또한 vim의 상대 줄 번호 옵션을 사용하는 것을 좋아합니다. 즉, 다음과 같이 입력 할 수 있습니다.

:-10,-7ya a

텍스트를 명명 된 버퍼로 잡아 당기려면 a.

NB A를 지정하면 버퍼 a의 현재 내용에 잡아 당기는 내용이 추가됩니다.

유사한 명령을 사용하여 텍스트 블록을 복사하고 텍스트 블록을 이동할 수도 있다는 것을 잊지 마십시오.

:-10,-7co .

10 행 위의 4 행 텍스트를 현재 행 아래로 복사하는 것을 의미합니다.

:-10,-7mo .

텍스트의 네 줄을 현재 줄 아래로 10 줄 위로 이동하는 것을 의미합니다.


8

G이 카운트 값과 함께 않다면 명령은 특정 행 번호로 이동합니다. 81G81 번 줄에 연결합니다.

y명령은 같은 운동과 결합 될 수있다 G. 따라서 91 행까지 모든 것을 잡아 당기려면 y91G.

함께하면 다음을 얻을 수 있습니다.

81Gy91G

81 번 줄로 이동 한 다음 91 번 줄로 이동하면서 잡아 당기십시오.


1
나는 이것을 두 번 이상 찬성 할 수 있기를 바랍니다. 저에게 도움이 된 것은 이것을 사용하여 레지스터 (제 경우에는 레지스터 + 즉, 클립 보드)를 잡아 당기는 것이 었습니다.81G"+y91G
mgarey

1
@mgarey 줄 범위 구문을 사용하여 레지스터에 직접 끌어 당기는 방법이 없습니까? 81,91y그리고 어떻게 든 레지스터를 목표로합니까?
diplosaurus

1
@diplosaurus 아마,하지만 모르겠어요. vi.stackexchange.com에서 질문 할 수있는 질문처럼 들립니다. 아직없는 경우 또는 여기에 있습니다. 나는 관심이있을 것이다. 저는 Vim 전문가가 아닙니다.
mgarey

2
@mgarey Google 검색으로 창의력을 발휘해야했지만 여기에서 찾았습니다. stackoverflow.com/questions/16225366/… . :81,91y +
diplosaurus

@diplosaurus :81,91y +가 작동하지 않습니다. :81,91y a예를 들어 다른 레지스터에서 작동 하지만 레지스터를 좋아하지 않는 것 같습니다 +. 이것은 다른 사람들에게 확실히 효과가 있습니까?
ojunk

4

g그 자체로는 아무것도하지 않습니다. 그것은 일종의 관련없는 명령을 보유하는 몇 가지 메타 명령 중 하나입니다.

z 또 다른 명령입니다.


감사합니다. 나는 그것이 단지 다른 목적으로 사용된다는 것을 이해합니다. 이러한 도구를 배우려고 할 때 명령을 추상화 할 수있는 것과 연결하여 올바르게 사용하는 방법을 기억합니다. g 명령은 제대로 사용하기 위해 외워야하는 것 중 하나 인 것 같습니다.
jnadro52

2

Vim은 :help index다음 g과 같이 설명 합니다.

|g|             g{char}            extended commands, see |g| below

:help g목록을 보려면 아래로 스크롤 (또는 )합니다.


1
나는 : help에 익숙했지만 : help (명령)에는 익숙하지 않았습니다. 그것은 미래에 매우 유용 할 것입니다. 감사합니다.
jnadro52

2

가장 좋은 해결책은 v를 눌러 "시각적 모드"로 들어가는 것입니다. 그리고 선을 선택한 후 y를 눌러 복사하십시오. 그런 다음 p를 눌러 복사 한 줄을 붙여 넣습니다.


동의하지 않지만 때때로 bc 비주얼 모드 만이 너무 느립니다.
D. Ben Knoble

1

91에서 96까지의 줄 :91,96y a( y)을 레지스터 a(으로 붙여 넣음)에 넣는 것 외에도 다음을 사용 하여 얀크 된 줄을 레지스터 에 추가"ap 할 수 있습니다 .

:91,96y A

즉, A레지스터 의 대소 문자 a는 덮어 쓰기 대신 레지스터에 추가 작업을 발생시킵니다 . 레지스터의 대문자는 항상 이와 같이 작동합니다. 예를 들어 레지스터 :let @A=';'에 a ;를 추가합니다 a.

더하기 (+) 또는 빼기 (-) 사용은 현재 커서 위치를 기준으로 행을 참조합니다.

:-10,+10y b

y, 현재 커서 위치 주위에 21 줄을 yank ( )하고 register에 넣습니다 b.

입력이 없으면 실제로 현재 커서 위치도 나타냅니다. 이는 다음을 의미합니다.

:-5,y a

위의 5 줄에서 현재 커서 위치까지의 텍스트를 이름이 지정된 buffer에 잡아 당깁니다 a.

:,+5y a

현재 커서 위치 뒤의 5 줄을 buffer에 잡아 당깁니다 a.

참고 : 버퍼에 매크로가있는 경우 ayank 레지스터와 매크로 레지스터는 실제로 동일한 것이기 때문에 이전 yank로 덮어 쓴 것입니다. 그렇기 때문에 우연히 매크로를 붙여넣고 편집 한 다음 레지스터에 다시 잡아 당길 수 있습니다. 저는 개인적으로 왼손으로 뻗은 글자를 얀크에 사용하고 오른손으로 뻗은 글자를 매크로에 사용합니다.

텍스트 블록 이동은 다음과 같습니다.

:+10,+13m.

즉, 현재 커서보다 10 줄 앞선 네 줄을 현재 줄 아래로 이동합니다.

추가

나는 이전에 혼란 ya:91,95ya a와 어떻게 든 동의어 ya{motion}움직임에 의해 공급 된 곳 91,95. 이것은 정확하지 않았고 "a"in ya은 완전히 불필요합니다. 내 방어에서, 내가 help yank그 전달하지 않는 ya의 가능한 별칭입니다 yank.


1
:ya의 약자 :yank이므로 모든 줄을 잡아 당기는 것에 대해 어떻게 생각하는지 잘 모르겠습니다 . 그러나 좋은 일이 흩어져있는 정보의 일부를 응축
D. 벤 Knoble에게

를 볼 때까지 저도 그렇게 생각했습니다 :help yank. 별명이 없습니다 ya에 대한이 yank. 당신 말이 맞습니다. a"all"이 아니라 기술적으로 "a"를 의미합니다. 그래도 "모두"라고 말하는 것을 선호합니다.
Paul Parker

2
:[range]y[ank] [x] Yank [range] lines [into register x]의 대괄호는가 선택 사항 y[ank]임을 나타냅니다 [ank]. :y, :ya:yan별칭에 대한 암시이다:yank
D. 벤 Knoble

나는 정정했다 :) a는 필요하지 않습니다. 반영하기 위해 답변을 편집합니다.
Paul Parker

1
귀하의 부록이 좋은,하지만 난 당신이 전 명령을 사용하여 매우 첫 번째 줄에 언급 된 :ya아닌 일반 명령y
D. 벤 Knoble

0

오랫동안 Vi / Vim 사용자로서 저는 줄 번호 (또는 '라인 마커') 대신 '마크'사용 하는 경향이 있습니다 . 다음과 같이 작동합니다. m'마크'문자입니다. 그런 다음 문자를 사용하여 마크를 식별 / 명명하십시오. 마크 머리말로 돌아가려면 작은 따옴표 ( 'a) 가있는 명명 된 마크를 범위로 사용할 수 있습니다. 예 :

File:
    <line 1>
    <line 2>
    <line 3>
    <line 4>
    <line 5>

명령 모드에서 커서를 2 행으로 이동하고을 입력 ma합니다. 4 행으로 스크롤하고을 입력 mb합니다. 마크 a 에서 마크 b로 잡아 당기려면 :

    :'a,'byank

마크 a 에서 마크 b 유형으로 삭제하려면 :

    :'a,'bdel

마크 a 에서 마크 b 까지 검색 하고 'ine'을 'ink'로 바꾸 려면 :

    :'a,'bs/ine/ink/g

마크 a 에서 마크 b 까지 복사 하여 현재 위치 아래에 붙여 넣으려면 ( '점'은 항상 현재 커서가있는 행을 참조합니다) :

    :'a,'bco . 

마크 a 에서 마크 b 사이의 코드 줄을 오른쪽으로 한 탭씩 <이동 (왼쪽으로 이동 하려면 반대쪽 갈매기 모양 표시 사용 ) :

    :'a,'b> 

명령 모드에서는으로 'a표시된 줄로 다시 이동하기 위해 입력 하기 만하면 마크로 다시 이동할 수 있습니다 a. 입력 ''하면 이전 위치로 돌아갑니다 (불행히도 이전 위치 만 기억하고 두 개의 뒤로는 기억하지 않음).

줄 번호를 알 필요없이 명명 된 버퍼에 yank, 복사, 줄 삭제, 코드의 일부만 검색 및 교체 등을 수행 할 수 있습니다.


0

줄 번호 81에서 91까지 줄을 끊으려면 다음을 수행하십시오.

접근 방식 1 : 81gg11yy

나쁘지는 않지만 몇 줄을 잡아 당기려면 약간의 수학을해야합니다.

이 접근 : 81gg다음 shift+v다음 91gg다음y

내 생각에 가장 좋은 이유는 간단하기 때문입니다. 즉, 어떤 줄 번호에서 어떤 줄 번호로 잡아 당길 것인지 만 알아야합니다.

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