vim 레지스터는 어떻게 사용합니까?


925

레지스터를 사용하는 하나의 인스턴스 만 CtrlR*클립 보드에서 텍스트를 붙여 넣는 것입니다.

레지스터의 다른 용도는 무엇입니까? 그것들을 사용하는 방법?

VI 레지스터에 대해 알고있는 모든 것 (vi 7.2에 중점을 두자)은 우리와 공유하십시오.


22
나는 레지스터 사용에 대해 긴 대답을 했다
Benoit

답변:


1185

Vim의 레지스터를 사용하면 저장된 텍스트에 대해 동작이나 명령을 실행할 수 있습니다. 레지스터에 액세스하려면 "a명령 앞에 입력하십시오 . 여기서 a레지스터 이름입니다. 현재 줄을 register에 복사하려면 k다음을 입력하십시오.

"kyy

또는 대문자를 사용하여 레지스터에 추가 할 수 있습니다

"Kyy

그런 다음 문서를 이동하여 다음을 사용하여 다른 곳에 붙여 넣을 수 있습니다.

"kp

Linux의 시스템 클립 보드에서 붙여 넣기

"+p

Windows의 시스템 클립 보드 또는 Linux의 "mouse highlight"클립 보드에서 붙여 넣기

"*p

현재 정의 된 모든 레지스터 유형에 액세스하려면

:reg

165
그리고 "+시스템 클립 보드를 참조하는 특수 레지스터이다.
Aaron McDaid

17
Windows에서는 클립 보드에 "*; 따라서 파일 끝까지 복사 명령이됩니다 "*yG.
Aditya MP

44
X (Linux, 아마도 OS-X) *에서 "마우스 하이라이트"클립 보드이며 +Ctrl-XCV 클립 보드입니다.
dotancohen 2016 년

20
클립 보드 레지스터에 추가하는 방법이 +있습니까 ( 자본이 없기 때문에 )?
naitsirhc

8
@dotancohen 기술적으로 그것은 PRIMARY 선택이라고 불리지 만, 사람들이 "마우스
하이 글 라이트

783

0레지스터를 발견했을 때 나는 기뻤습니다 . 특정 레지스터에 텍스트를 할당하지 않고 텍스트를 잡아 당기면 0기본 "레지스터 에 저장 될뿐만 아니라 레지스터에 할당됩니다 . 0"레지스터 의 차이점은 0양각 텍스트로만 채워지는 반면 기본 레지스터는 d/ D/ x/ X/ c/ C/ s/ S명령을 사용하여 삭제 된 텍스트로 채워집니다 .

텍스트를 복사하고 삭제하고 복사 한 텍스트로 바꾸려는 경우에 유용합니다. 다음 단계는 예를 보여줍니다.

  • 복사하려는 텍스트를 Yank하십시오 y[motion]-이 텍스트는 저장 "되고 0등록됩니다
  • 바꾸려는 텍스트를 삭제하십시오 d[motion]-이 텍스트는 "레지스터에 저장됩니다
  • 구부러진 텍스트를 "0p

"다음 명령에 레지스터를 사용하는 명령은 어디에 있습니까 ?

마지막 단계에서을 사용하여 기본 레지스터에서 붙여 넣으 p려면 방금 삭제 한 텍스트 (아마 의도하지 않은 텍스트)가 사용됩니다.

참고 p또는 P기본 레지스터에서 붙여 넣습니다. 이에 상응하는 Longhand는 ""p(또는 ""P)이고 "0마지막 yank를 "1보유하고, 마지막 삭제 또는 변경을 보유합니다.

자세한 내용은을 참조하십시오 :help registers.


17
p또는 P기본 레지스터에서 붙여 넣기 long과 동등한 값은 ""p(또는 ""P)입니다.
nelstrom

186
그건 그렇고, "0은 마지막 k 크를 보유하고,"1은 마지막 삭제 또는 변경을 보유합니다.
FireAphis

6
"다음 명령에 레지스터를 사용하는 명령입니다. 그래서 ""p사용하는 것입니다 "붙여 넣기 명령에 대한 등록을하고 "0p사용하는 것 0레지스터.
Ramon Marco L. Navarro

5
0p현재 행의 첫 문자로 이동하여 기본 레지스터 ( ") 의 내용에서 붙여 넣기를 의미합니다 . "p레지스터를 사용할 명령을 지정해야하므로 불완전한 명령이 p됩니다.
Ramon Marco L. Navarro

15
같은 방식으로 "1은 마지막 삭제를 보유하고,"2는 두 번째 마지막 삭제를 보유하고, "3은 마지막 세 번째를 보유합니다."9
James

330

레지스터에서 가장 좋아하는 부분 중 하나는 매크로로 사용하는 것입니다!

탭으로 구분 된 값 파일을 다음과 같이 처리한다고 가정 해 봅시다.

ID  Df  %Dev    Lambda
1   0   0.000000    0.313682
2   1   0.023113    0.304332
3   1   0.044869    0.295261
4   1   0.065347    0.286460
5   1   0.084623    0.277922
6   1   0.102767    0.269638
7   1   0.119845    0.261601

이제 % Dev 필드 끝에 백분율 기호를 추가해야한다고 결정합니다 (두 번째 줄부터 시작). m다음과 같이 (임의로 선택한) 레지스터 에 간단한 매크로를 만듭니다 .

  1. 누릅니다 : qm: m등록에서 매크로 기록을 시작합니다 .

  2. EE: 3 번째 열의 끝으로 이동하십시오.

  3. a:이 열의 끝에 추가 할 삽입 모드.

  4. %: 추가 할 퍼센트 부호를 입력하십시오.

  5. <ESC>: 명령 모드로 돌아갑니다.

  6. j0: 다음 줄의 시작으로 이동하십시오.

  7. q: 매크로 기록 중지

이제 @m현재 줄에서이 매크로를 실행하도록 입력 하면됩니다. 한층 더 @@반복 해 입력 할 수도 있습니다 100@m! 인생은 꽤 좋아 보인다.

이 시점에서 " 하지만 대기자는 등록자와 어떤 관계가 있습니까?"

훌륭한 지적입니다. m를 입력 하여 레지스터 내용에 무엇이 있는지 조사해 봅시다 "mp. 그런 다음 다음을 얻습니다.

EEa%<ESC>j0

처음에는 실수로 메모장에서 이진 파일을 연 것처럼 보이지만 두 번째로 보면 매크로의 정확한 문자 시퀀스입니다!

당신은 호기심 많은 사람이므로, 흥미로운 것을하고이 텍스트 줄을 편집 !하여 지루한 것 대신 삽입하십시오 %.

EEa!<ESC>j0

그런 다음 n을 입력하여 이것을 레지스터에 넣습니다 B"nyE. 그런 다음 킥을 위해 ...를 n사용하여 데이터 라인 에서 매크로를 실행하십시오 @n.

세상에, A 추가 !

기본적으로 매크로를 실행하는 것은 해당 매크로의 레지스터에서 정확한 키 시퀀스를 누르는 것과 같습니다. 그것이 멋진 등록 트릭이 아니라면 모자를 먹을 것입니다.


65
이것이 핵심입니다. 지금까지 레지스터는 매크로 버퍼와 동일하다는 것을 알지 못했습니다. 즉, 모든 매크로를 텍스트로 저장하고, 잡아 당기고, 실행할 수 있습니다. 꽤 시원하고 조금 이상합니다. 매우 Vim.
naught101

1
사소한 편집 메모지 만 굵은 글씨체로 고정되어 있습니다. 현재로서는 매우 독특합니다.
ashrasmun

1
다음 줄에서 첫 번째 공백이 아닌 문자로 이동 하는 +대신 사용할 수 있습니다 j0.
Gokul

100

다른 유용한 레지스터 :

"*또는 "+-시스템 클립 보드의 내용

"/ -마지막 검색 명령

": -마지막 명령.

vim 매크로를 사용하면 매크로를 기록 할 때 사용되는 키 입력 목록 일 뿐이므로 편집 할 수 있습니다. 따라서 "ap매크로 a 를 작성 하는 데 사용하는 매크로를 텍스트 파일 에 쓰고 편집 한 다음로 레지스터에로드 할 수 있습니다 "ay$. 유용한 매크로를 저장하는 좋은 방법입니다.


6
OSX의 기본 vim에는 "* 통합이 포함되어 있지 않습니다. homebrew-alt에서 제공하는 버전을 설치할 수 있습니다. 확인하십시오 vim --version- -clipboard필요하지 않다는 +clipboard것을 의미합니다.
Xavier Shay

15
X11에서, "*그리고 "+심지어 쿨러는 : "+마지막으로 복사 한 텍스트 붙여 넣습니다 ctrl+c(복사 버퍼), 또는 무엇을 적 바로 가기 사용 (또는 right-click>copy). "*마우스로 강조 표시된 마지막 텍스트를 붙여 넣습니다 (선택 버퍼). 따라서로 무언가를 복사 ctrl+c한 다음 마우스로 무언가를 강조 표시 할 경우 붙여 넣을 것을 선택할 수 있습니다. 이 두 레지스터가 동의어 인 Windows에서는 작동하지 않습니다.
naught101

1
내가 찾고 있었어요 당신을 축복 "*하고 "+년! 나는 gvim만이 시스템 클립 보드에 접근 할 수 있다고 생각했지만 분명히 일반 vim도 그렇게한다!
Tarrasch

@Tarrasch gvim 대신 콘솔 vim을 사용하면 더 많은 것을 발견 할 수 있습니다. 내 생각에 프리 노드에서도 #vim을 방문하십시오!
trusktr

1
하나가있는 경우 사용할 수 있도록 설정하는 방법 -xterm_clipboardvim --version. 설치할 간단한 패키지가 있습니까? (데비안 / apt-get). 감사.
Dr Beco

77

블랙홀 레지스터 _ 는 IS /dev/null레지스터.

기본 레지스터를 업데이트하지 않고 단일 문자를 삭제할 수 있도록 vimrc에서 사용합니다.

noremap x "_x

기본 레지스터를 업데이트하지 않고 시각적 모드로 붙여 넣습니다.

vnoremap p "_dP

두 번째 매핑도 매우 유용합니다. 에 대한 설명은 여기를 참조하십시오 : marcorucci.com/blog/#visualModePaste
mrucci

21
에 대한 매핑은 x문자를 바꾸는 데 덜 편리합니다.
skeept

x를 눌러도 마지막으로 찾은 항목이 지워지지 않습니다. 레지스터 0에 있습니다. xa를 몇 번 누른 다음 "0p를 눌러
붙인

2
위의 skeept 설명을 확장하려면이 x매핑을 사용하면 더 이상 xp"명령"을 수행 하여 다음 문자로 전류를 전환 할 수 없습니다 . 오타 수정에 매우 유용합니다. 또한 Xp이전 문자로 전류를 전환 해야 합니다.
Daniel Andersson

56

ex-mode 명령에 레지스터 내용을 붙여 넣으려면를 누르십시오 <C-r><registerletter>.

왜 이것을 사용 하시겠습니까? 검색을하고 긴 문자열을 바꾸고 싶었으므로 시각적 모드에서 선택하고 검색 / 바꾸기 표현식을 입력하기 시작했으며 :%s/[PASTE YANKED PHRASE]//g하루를 보냈습니다.

ex 모드에서 한 단어 만 붙여 넣으려면 ex 모드로 들어가기 전에 커서가 커서에 있는지 확인한 다음 <C-r><C-w>ex 모드에서 단어를 붙여 넣으십시오.


6
:커맨드 라인에 텍스트를 붙여 넣는 것이 오늘 내가 배운 가장 좋은 것
Shahbaz

1
삽입 모드에서 <CR> <registerletter>를 사용할 수도 있습니다
Floegipoky

1
찾기 / 바꾸기 정규식을 먼저 쓰고 /[write out your regex]<cr>나서 바꾸는 것을 좋아 s/<C-R>//replacement/합니다. 이렇게하면 교체를 실행하기 전에 정규식에 대한 실시간 피드백을 활용할 수 있습니다.
GabeIsman

44

비밀 전문가 레지스터는 표현식 = 레지스터라고 생각합니다. 광고 소재 매핑에 사용할 수 있습니다.

:inoremap  \d The current date <c-r>=system("date")<cr>

위와 같이 시스템과 함께 사용하거나 맞춤형 VimL 기능 등으로부터 응답을 얻을 수 있습니다.

또는 그냥 임시 같은 것들

<c-r>=35+7<cr>

3
([식 레지스터 사용에 대한 비디오] 데릭 와이어트의 체크 아웃 derekwyatt.org/vim/vim-tutorial-videos/... )
제로미 Anglim

1
@JeromyAnglim의 링크는 다음과 같습니다. derekwyatt.org/vim/tutorials/advanced/#expression-register
Djizeus

39

멋진 속임수는 "1p마지막 삭제 / 변경을 붙여 넣는 데 사용 하는 것입니다 (그리고 .이후 삭제를 반복하여 붙여 넣는 데 사용 합니다. 다시 말해 "1p...기본적으로와 동일합니다 "1p"2p"3p"4p.

이것을 사용하여 몇 줄을 역순으로 정렬 할 수 있습니다. dddddddddd"1p....


아하 이것은 환상적입니다. 내가 정말로 원하는 것은
yanks에

18

vim의 도움말 페이지에서 :

CTRL-R {0-9a-z"%#:-=.}                  *c_CTRL-R* *c_<C-R>*
        Insert the contents of a numbered or named register.  Between
        typing CTRL-R and the second character '"' will be displayed
        <...snip...>
        Special registers:
            '"' the unnamed register, containing the text of
                the last delete or yank
            '%' the current file name
            '#' the alternate file name
            '*' the clipboard contents (X11: primary selection)
            '+' the clipboard contents
            '/' the last search pattern
            ':' the last command-line
            '-' the last small (less than a line) delete
            '.' the last inserted text
                            *c_CTRL-R_=*
            '=' the expression register: you are prompted to
                enter an expression (see |expression|)
                (doesn't work at the expression prompt; some
                things such as changing the buffer or current
                window are not allowed to avoid side effects)
                When the result is a |List| the items are used
                as lines.  They can have line breaks inside
                too.
                When the result is a Float it's automatically
                converted to a String.
        See |registers| about registers.  {not in Vi}
        <...snip...>

17
  • q5는 레지스터 5에 편집 내용을 기록합니다 (다음 q는 기록을 중지합니다)
  • : reg 모든 레지스터와 그 내용을 보여줍니다
  • @ 5 레지스터 5 매크로 실행 (기록 된 편집)

15
@ 키가 매크로를 시작하는 것을 좋아하지 않습니다 (세 번의 키 입력). 그래서 레지스터 q에 저장된 매크로를 시작하기 위해 F2를 매핑했습니다. 레지스터 q를 nmap <F2> @q 사용합니다 . 그러면 F2의 매크로를 재생하기 위해 저장하기 때문에 방금 히트했습니다 qq. 빠른 매크로 저장 및 재생.
Andrej Panjkov

16

기본 레지스터를 사용하여 마우스에 도달하지 않고도 vim 창에서 텍스트를 grep합니다.

  1. 양키 텍스트
  2. :!grep "<CTRL-R>0"<CR>

12

와 함께 명령에 레지스터를 사용하십시오@ . 예 :

echo @a
echo @0
echo @+

명령으로 설정하십시오.

let @a = 'abc'

이제 "ap붙여 넣습니다 abc.


8

혼동의 큰 원인은 기본 레지스터 "입니다. 작동 방식을 아는 것이 중요합니다. 대부분의 경우 기본 레지스터를 사용하지 않는 것이 훨씬 좋습니다. Vim 문서의 설명 :

Vim fills this register with text deleted with the "d", "c", "s", "x" commands
or copied with the yank "y" command, regardless of whether or not a specific
register was used (e.g.  "xdd).  This is like the unnamed register is pointing
to the last used register.

따라서 기본 레지스터는 실제로 마지막으로 사용 된 레지스터에 대한 포인터입니다. 삭제하거나 무언가를 잡아 당기면이 레지스터는 다른 레지스터를 가리 킵니다. 레지스터를 확인하여 테스트 할 수 있습니다. 기본 레지스터와 정확히 동일한 또 다른 레지스터가 있습니다. yank 레지스터 ( "0), 첫 번째 삭제 레지스터 ( "1), 작은 삭제 레지스터 ( "-) 또는 삭제 또는 yank에 사용 된 기타 레지스터.

유일한 예외는 블랙홀 레지스터입니다. Vim doc는 말합니다 :

An exception is the '_' register: "_dd does not store the deleted text in any
register.

: 일반적으로 당신은 훨씬 더 떨어져 직접 사용하여 있습니다 "0, "-그리고 "1-"9기본 레지스터 또는 명명 된 레지스터.


8

간과 된 레지스터 중 하나는 '.'입니다. 삽입 된 방법에 관계없이 마지막으로 삽입 된 텍스트를 포함하는 도트 레지스터 (예 : ct] (변경 될 때까지)). 그런 다음 다른 곳에 삽입해야하지만 도트 반복 방법을 사용할 수 없다는 것을 알고 있습니다.

 :reg .
 :%s/fred/<C-R>./

7

내가 가장 좋아하는 레지스터는 ':'레지스터입니다. @:일반 모드에서 실행 하면 이전에 실행 한 ex 명령을 반복 할 수 있습니다.


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