developer tip

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

copycodes 2020. 9. 28. 09:21
반응형

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


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

레지스터의 다른 용도는 무엇입니까? 어떻게 사용하나요?

VI 레지스터에 대해 알고있는 모든 것 (vi 7.2에 중점을 둡니다)-공유하십시오.


Vim에 등록하면 그 안에 저장된 텍스트에서 작업이나 명령을 실행할 수 있습니다. 레지스터에 액세스하려면 "a명령 앞에 입력 a합니다. 여기서은 레지스터의 이름입니다. 현재 행을 register에 복사하려면 k다음을 입력하십시오.

"kyy

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

"키

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

"kp

Linux의 시스템 클립 보드에서 붙여 넣으려면

"+ p

Windows의 시스템 클립 보드 (또는 Linux의 "마우스 강조 표시"클립 보드)에서 붙여 넣으려면

"*피

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

: reg


0레지스터를 발견했을 때 기뻤습니다 . 특정 레지스터에 할당하지 않고 텍스트를 잡아 당기면 레지스터에 할당 0되고 기본 "레지스터 에 저장됩니다 . 0"레지스터 의 차이점은 0yanked 텍스트로만 채워지는 반면 기본 레지스터는 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.


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

다음과 같이 탭으로 구분 된 값 파일을 다루고 있다고 가정 해 보겠습니다.

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. a:이 열 끝에 추가 할 삽입 모드입니다.

  4. %: 추가 할 백분율 기호를 입력합니다.

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

  6. j0: 다음 줄의 처음으로 이동합니다.

  7. q: 매크로 기록 중지

이제 입력 @m하여 현재 행에서이 매크로를 실행할 수 있습니다 . 또한, 우리는 @@반복하거나 100@m100 번을 입력 할 수 있습니다 ! 인생은 꽤 좋아 보인다.

At this point you should be saying, "BUT WAIT, WHAT THE HECK DOES THIS HAVE TO DO WITH REGISTERS?"

Excellent point. Let's investigate what is in the contents of the m register by typing "mp. We then get the following:

EEa%<ESC>j0

At first this looks like you accidentally opened a binary file in notepad, but upon second glance, it's the exact sequence of characters in our macro!

You are a curious person, so let's do something interesting and edit this line of text to insert a ! instead of boring old %.

EEa!<ESC>j0

Then let's yank this into the n register by typing B"nyE. Then, just for kicks, let's run the n macro on a line of our data using @n....

OMG, IT ADDED A !

Essentially, running a macro is like pressing the exact sequence of keys in that macro's register. If that isn't a cool register trick, I'll eat my hat.


Other useful registers:

"* or "+ - the contents of the system clipboard

"/ - last search command

": - last command.

Note with vim macros, you can edit them, since they are just a list of the keystrokes used when recording the macro. So you can write to a text file the macro (using "ap to write macro a) and edit them, and load them into a register with "ay$. Nice way of storing useful macros.


The black hole register _ is the /dev/null of registers.

I use it in my vimrc to allow deleting single characters without updating the default register:

noremap x "_x

and to paste in visual mode without updating the default register:

vnoremap p "_dP

If you ever want to paste the contents of the register in an ex-mode command, hit <C-r><registerletter>.

Why would you use this? I wanted to do a search and replace for a longish string, so I selected it in visual mode, started typing out the search/replace expression :%s/[PASTE YANKED PHRASE]//g and went on my day.

If you only want to paste a single word in ex mode, can make sure the cursor is on it before entering ex mode, and then hit <C-r><C-w> when in ex mode to paste the word.


I think the secret guru register is the expression = register. It can be used for creative mappings.

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

You can use it in conjunction with your system as above or get responses from custom VimL functions etc.

or just ad hoc stuff like

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

A cool trick is to use "1p to paste the last delete/change (, and then use . to repeatedly to paste the subsequent deletes. In other words, "1p... is basically equivalent to "1p"2p"3p"4p.

You can use this to reverse-order a handful of lines: dddddddddd"1p....


From vim's help page:

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...>

  • q5 records edits into register 5 (next q stops recording)
  • :reg show all registers and any contents in them
  • @5 execute register 5 macro (recorded edits)

I use the default register to grep for text in my vim window without having to reach for the mouse.

  1. yank text
  2. :!grep "<CTRL-R>0"<CR>

Use registers in commands with @. E.g.:

echo @a
echo @0
echo @+

Set them in command:

let @a = 'abc'

Now "ap will paste abc.


A big source of confusion is the default register ". It is important to know the way it works. It is much better if the default register is avoided most of the times. The explanation from the Vim documentation:

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.

So the default register is actually a pointer to the last used register. When you delete, or yank something this register is going to point to other registers. You can test that by checking the registers. There is always another register that is exactly the same as the default register: the yank register ("0) , the first delete register("1) , small delete register("-) or any other register that was used to delete or yank.

The only exception is the black hole register. Vim doc says:

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

Usually you are much better off by using directly: "0, "- and "1-"9 default registers or named registers.


One overlooked register is the '.' dot register which contains the last inserted text no matter how it was inserted eg ct] (change till ]). Then you realise you need to insert it elsewhere but can't use the dot repeat method.

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

My favorite register is the ':' register. Running @: in Normal mode allows me to repeat the previously ran ex command.


My friend Brian wrote a comprehensive article on this. I think it is a great intro to how to use topics. https://www.brianstorti.com/vim-registers/

참고URL : https://stackoverflow.com/questions/1497958/how-do-i-use-vim-registers

반응형