Vim 명령 줄에 기울어 진 텍스트를 붙여 넣는 방법


답변:


1157

예. 히트 Ctrl- R다음 ". k 된 문자에 리터럴 제어 문자가있는 경우 Ctrl- R, Ctrl- O,을 사용하십시오 ".

다음은 레지스터로 수행 할 수있는 작업에 대한 설명입니다. 레지스터로 할 수있는 일은 매우 특별합니다. 일단 레지스터를 사용하는 방법을 알고 나면 레지스터 없이는 살 수 없습니다.

레지스터는 기본적으로 문자열의 저장 위치입니다. Vim에는 다른 방식으로 작동하는 많은 레지스터가 있습니다.

  • 0(yank register : y일반 모드에서 레지스터를 지정하지 않고 사용할 때 , yanked 텍스트는 기본 레지스터로 이동합니다),
  • 19(당신과 같은 명령을 사용하면 이동 삭제 레지스터 c또는 d레지스터 1 무엇인지, 무엇을 삭제 한 것은 1를 등록 진행을,이 등록 간다 )
  • "(기본 레지스터, 또한 익명의 레지스터로 알려진이 곳입니다. "오면 Ctrl- R, "),
  • az자신의 사용 (대문자 A하기 Z위해 해당 레지스터에 추가된다).
  • _( /dev/null(Unix) 또는 NUL(Windows) 와 같은 방식으로 쓸 수 있지만 쓸 수는 있지만 버리고 읽을 때 항상 비어 있습니다.)
  • - (작은 삭제 레지스터),
  • /(당신이 텍스트를 찾을 때 검색 패턴 레지스터, 업데이트 /, ?, *또는 #예를 들어, 당신은 동적 검색 패턴을 변경하는 데에 쓸 수 있습니다)
  • :(저장 마지막 VimL을 통해 명령을 입력 Q하거나 :, 읽기 전용)
  • +*(시스템 클립 보드에 등록, 당신은 클립 보드를 설정하기 위해 그들에게 작성하고 그들로부터 클립 보드의 내용을 읽을 수 있습니다)

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

언제든지 :registers모든 레지스터의 내용을 표시하는 데 사용할 수 있습니다. 이 명령에 대한 동의어 및 shorthands은 :display, :reg:di.

삽입 또는 명령 행 모드에서 Ctrl- R와 레지스터 이름을 추가하면이 레지스터의 내용이 삽입됩니다. 문자 그대로 (자동 들여 쓰기, 0x08백 스페이스 와 같은 제어 문자 변환 등) 문자를 삽입하려는 경우 Ctrl- R, Ctrl- O, 레지스터 이름을 사용할 수 있습니다 . 자세한 내용은 :help i_CTRL-R다음 단락을 참조하십시오.

그러나 다음을 수행 할 수도 있습니다 (아마도 레지스터 사용을 많이 잊었을 것입니다).

  • 일반 모드에서을 누르십시오 ":p. vim에서 사용한 마지막 명령은 버퍼에 붙여 넣습니다.
    분해하자 : "다음 얀크, 삭제 또는 붙여 넣기 작업 중에 사용할 레지스터를 선택할 수있는 일반 모드 명령입니다. 그래서 ":선택 결장 레지스터 (마지막 명령을 저장). 그런 다음 p이미 알고있는 명령으로 레지스터의 내용을 붙여 넣습니다.

    cf. :help ",:help quote_:

  • VimL 파일 (예 :)을 편집하고 있으며 .vimrc현재 몇 줄을 연속으로 실행하려고 yj:@"Enter합니다.
    여기서 yj현재 줄과 다음 줄을 줄입니다 (이는 j가 선으로 동작하기 때문에이 답변의 범위를 벗어남). 기본 레지스터 (명명되지 않은 레지스터라고도 함)로 들어갑니다. 그런 다음 :@Ex 명령은 인수로 제공된 레지스터에 저장된 Ex 명령을 재생 "하며 이름없는 레지스터를 참조하는 방법입니다. 또한이 답변의 상단을 참조하십시오.

    "여기서 사용 된 (레지스터 이름)을 "이전 모드 (일반 모드 명령 )와 혼동하지 마십시오 .

    cf. :help :@:help quote_quote

  • 삽입 모드의 파일 또는 명령 줄에 Ctrl- R,를 사용 하여 마지막 검색 패턴을 삽입하십시오 /.

    cf. :help quote_/,help i_CTRL-R

    추론 : 검색 패턴을 유지하지만, 대안을 추가 : / Ctrl- R, / \|alternative.

  • 비주얼 모드에서 한 줄의 중간에 두 단어를 선택하고으로 줄을 지어 y명명되지 않은 레지스터에 있습니다. 이제 두 단어를 사용하여 현재 위치 바로 아래에 새 줄을 열려고합니다 :pu. 이 약칭입니다 :put ". 이 :put명령은 많은 Ex 명령과 마찬가지로 줄 단위로만 작동합니다.

    cf. :help :put

    당신은 또한 할 수 있습니다 : :call setreg('"', @", 'V')그때 p. setreg함수는 두번째 인자의 내용으로 초기화 (및 이름으로 변수로 레지스터를 사용하여 이름이 (a 문자열) 첫 번째 인수로 주어진 어느 레지스터를 설정 VimL의 레지스터 이름), 및 세 번째 인수에 지정된 모드로, 선 단위, 문자 단위 및 문자 단위 는 블록 단위가 아닙니다 .@xxV^V

    cf. :help setreg(). 역 기능은 getreg()getregtype()입니다.

  • 당신이 매크로를 기록하는 경우 qa... q다음 :echo @a사용자가 입력 한 내용을 말할 것입니다, 그리고 @a(아마도 당신이 그 일을 알고 반복적 인 작업을 피하기 위해 매우 유용) 매크로를 재생합니다

    cf. :help q,help @

    이전 예제의 결과 : 8go클립 보드에있는 경우 클립 @+보드 내용을 매크로로 재생하여 파일의 8 바이트로 이동합니다. 실제로 이것은 거의 모든 레지스터에서 작동합니다. 마지막으로 삽입 된 문자열이 dd삽입 모드 인 경우 @.( .레지스터에 마지막으로 삽입 된 문자열이 포함되어 있기 때문에 ) 행을 삭제합니다. (이 상태 때문에 빔의 내용은 해당 레지스터,이 점에서 잘못 #, %, :.만이 작업으로 p, P, :putCtrl- R).

    cf. :help @

    :@(레지스터에서 Vim 명령을 재생하는 명령)과 @( 레지스터에서 정상 모드 명령을 재생하는 일반 모드 명령 )을 혼동하지 마십시오 .

    주목할만한 예외는 @:입니다. 명령 레지스터는 초기 콜론을 포함하지 않으며 최종 캐리지 리턴도 포함하지 않습니다. 그러나 일반 모드에서는 @:레지스터를 일반 모드에서 재생하지 않고 Ex 명령으로 해석하여 예상 한대로 수행합니다. 따라서 마지막 명령이 :e인 경우 레지스터 는 파일을 포함 e하지만 @:파일을 다시로드 하지만 단어의 끝으로 이동하지는 않습니다.

    cf. :help @:

  • 실행하기 전에 일반 모드에서 수행 할 작업을 표시하십시오 @='dd' Enter. =키 를 누르 자마자 Vim은 표현식 평가로 전환합니다. 표현식을 입력 Enter하고을 누르면 Vim이이를 계산하고 결과는 레지스터 내용으로 작동합니다. 물론 레지스터 =는 읽기 전용이며 원샷입니다. 사용하기 시작할 때마다 새 표현식을 입력해야합니다.

    cf. :help quote_=

    Corollary : 명령을 편집 할 때 현재 버퍼의 일부 행을 명령 행에 삽입해야한다는 것을 알고 있다면 Esc!를 누르지 마십시오 . Ctrl-를 사용하십시오 R =getline(58) Enter. 그런 다음 명령 행 편집으로 돌아가지만 58 행의 내용이 삽입되었습니다.

  • 검색 패턴을 수동으로 정의하십시오. :let @/ = 'foo'

    cf. :help :let

    그렇게 /하면 패턴에서 벗어날 필요가 없습니다 . 그러나 모든 작은 따옴표를 두 배로 늘려야합니다.

  • 모두와 함께 시작하는 라인을 복사 한 foo후, 및 포함하는 모든 라인을 bar클립 보드 체인에이 명령을 : qaq(리셋 그 안에 빈 매크로를 저장하는 레지스터), , , .:g/^foo/y A:g/bar/y A:let @+ = @a

    대문자 레지스터 이름을 사용하면 레지스터가 추가 모드에서 작동합니다.

    더 나은 방법 Q으로을 다시 매핑하지 않은 경우을 사용하여 mswin.vimEx 모드를 시작하고 Q실제로 "Ex 명령"이라고하는 "콜론 명령"을 연결 한 다음을 입력하여 일반 모드로 돌아갑니다 visual.

    cf. :help :g, :help :y,:help Q

  • 파일을 두 번 공백으로 :g/^/put _만듭니다. 이것은 블랙홀 레지스터의 내용을 /dev/null(모든 줄이 시작하기 때문에) 각 줄 다음에 줄 단위로 읽습니다 (읽을 때 비어 있지만 쓰기 가능한 것처럼 동작합니다 ).

  • foo각 줄 앞에 포함 된 줄을 추가하십시오 :g/^/-put ='foo'. 이것은 표현식 레지스터를 영리하게 사용합니다. 여기, (cf. ) -의 동의어입니다 . 때문에 선 후 풋 텍스트를 명시 적으로 이전에 따라 행동하도록 지시해야합니다..-1:help :range:put

  • 전체 버퍼를 시스템 클립 보드에 복사하십시오 :%y+.

    cf. :help :range( %부분) 및 :help :y.

  • 매크로를 misrecorded 한 경우에는 입력 할 수 있습니다 :let @a=' Ctrl- R =replace(@a,"'","''",'g') Enter '편집 그것. 그러면 register에 저장된 매크로의 내용이 수정되며 a식 레지스터를 사용하여이를 수행하는 방법이 여기에 표시됩니다.

  • 당신이 한 경우 dddd, 당신이 할 수있는 uu취소하기 위해. 함께 p하면 마지막으로 삭제 라인을 얻을 수 있습니다. 그러나 실제로 레지스터를 @1통해 최대 9 개의 삭제를 복구 할 수도 있습니다 @9.

    더 나은, 당신이 할 경우 "1P, 다음 .일반 모드로 재생됩니다 "2P, 등등.

    cf. :help .:help quote_number

  • 삽입 모드에서 현재 날짜를 삽입하려는 경우 : Ctrl- R=strftime('%y%m%d')Enter.

    cf. :help strftime()

다시 한 번 혼란 스러울 수있는 것은 다음과 같습니다.

  • :@ 레지스터의 내용을 vimscript로 해석하여 소싱하는 명령 줄 명령입니다.
  • @ 일반 모드 명령에서 레지스터의 내용을 일반 모드 키 스트로크로 해석합니다 ( :레지스터 를 사용할 때를 제외하고 초기 콜론없이 마지막으로 재생 된 명령을 포함 함).이 경우 콜론을 다시 입력 한 것처럼 명령을 재생합니다. 최종 리턴 키).

  • " 정상 모드 명령에서 yank, paste, delete, correct 등을위한 레지스터를 선택하는 데 도움이됩니다.

  • " 또한 유효한 레지스터 이름 (기본 또는 이름이없는 레지스터)이므로 레지스터 이름이 필요한 명령에 대한 인수로 전달 될 수 있습니다.

205
“대답과 질문 사이에 100/1 길이 비율”배지가 없습니까? :)
Benoit

8
대단한 대답이지만 1400 자에 미치지 못하는 약 900 단어입니다. :)

19
이 답변은 vim 사용 방식을 변경했습니다. 감사합니다 Benoit
P. Myer Nore

11
잊지 마세요 : reg는 모든 레지스터와 내용을 보여줍니다
eugenevd

3
vim의 최신 버전에서 한 줄보다 작은 삭제는 번호가 지정된 레지스터로 이동하는 대신 "작은 삭제 레지스터"로 이동합니다. 참고 자료 : Vi and Vim , Vi and Vim , Reddit
Christian Long

48

시스템 클립 보드 인 것을 붙여 넣으려면 SHIFT- 만 사용하면 INS됩니다.

Windows에서는 작동하지만 Linux에서도 잘 작동한다고 생각합니다.


7
예, 리눅스에서도 작동합니다. Vim과 GVim 모두 그놈에서 테스트되었습니다.
Teoulas

3
이것은 실제로 키보드 입력으로 보드를 Vim에 공급합니다. 따라서 일반 모드에 있고 paste :!rm -rf /<cr>이면 실행합니다. 대신 레지스터를 사용하십시오!
lericson

4
@lericson 내 대답에서 이것이 시스템 키보드에있는 것에 유용하다고 말하지 않았습니까? 나는 downvote를 이해하지 못한다. 그리고 예를 들어, 진지하게? 클립 보드에 정말 있습니까? 그리고 타이핑 shift-ins이 더 쉽다고 생각하지 ctrl-R+*않습니까? 당신이 gvim에 있다면 이것은 물론입니다. 다른 컴퓨터에 연결된 터미널에 있고 클립 보드에서 붙여 넣기를 원하는 경우보다 더 나은 것을 알고 shift-ins있습니까? 그 상황에서는 레지스터가 작동하지 않기 때문입니다. 의견을 제시하기 전에 생각하고 다른 행동 (예 : 다운 투팅)을하십시오.
skeept

나는 그것이 잘못된 정보라고 생각하며 그 판결에 따라 행동했습니다.
lericson

1
나를 위해 작동하지 않습니다. 명령 줄에 '<S-Insert>'가 추가되었습니다. 아마도 뭔가 빠졌을 것입니다. (우분투 19.04 / 2 : 8.1.0320-1 우분투 3.1).
Max Waterman

39

"양념 된 텍스트를 Vim 명령 줄에 붙여넣고 싶습니다."

가장 많이 투표 된 답변은 매우 완전하지만 명령 기록 편집을 선호합니다.

일반 모드에서 다음을 입력하십시오 q:.. 일반 vim 명령으로 편집 및 검색 할 수있는 최근 명령 목록이 표시됩니다. 맨 아래에 빈 명령 줄이 시작됩니다.

기사는 다음 텍스트를 명령 줄로 빠지게 라인 (또는 꼴은 아무것도)을 붙여, 요청 꺼낼 것을 정확한 우선 : q:p(새 명령으로 빠지게 텍스트 UT 다음 (P) 명령 기록 편집 모드로 얻고, 원하는대로 편집 enter하여 실행합니다.

명령 히스토리 모드에서 벗어나려면 반대입니다. 명령 기록의 일반 모드에서 다음을 입력하십시오. :q+enter


1
기존 명령을 이미 수정 중이고 'q :'를 누르지 않은 경우 ctrl + f를 누르면 명령 기록을 편집하는 기능이 나타납니다.
Clay

14

시스템 클립 보드의 내용을 Vim 명령 행에 붙여 넣으려면 ( "명령 모드") Ctrl+ R다음에를 사용하십시오 +. 나에게 적어도 우분투에서는 Shift+ Ins가 작동하지 않습니다.

추신 : 왜 Ctrl+가 R뒤에 오는지 잘 모르겠습니다 *. 이는 이론적으로 Ctrl+ R뒤에 오는 +것이 항상 작동하지 않는 것 같습니다. 나는 +버전을 검색하고 발견 했으며 적어도 내 상자에서 항상 작동하는 것 같습니다.


2
Ctrl-r +와 Ctrl-r *의 차이점은 전자는 일반 클립 보드이지만 Linux에는 가장 최근에 선택한 텍스트를 나타내는 "기본"이라는 두 번째 클립 보드 유형이 있습니다 (중간 버튼 마우스 붙여 넣기). . 하지만 이것은 Windows 또는 MAC에서 사용할 수 없습니다
마티아스 이어

13

yank 레지스터가 매크로 버퍼와 동일하다는 점도 주목할 가치가 있습니다. 즉, 당신은 단순히 다음 (붙여 넣은 조각 포함) 문서의 전체 명령을 쓸 수 있습니다 "by받는 사람을 꺼낼 b레지스터, 다음으로 실행 @b.


1

비슷한 문제가 발생했습니다. 선택한 텍스트가 명령으로 끝나기를 원했지만 붙여 넣는 것에 의존하지 않았습니다. 다음은 매핑을 작성하려는 명령입니다.

:call VimuxRunCommand("python")

이 플러그인의 문서는 문자열 리터럴 만 사용하여 표시됩니다. 큰 따옴표가 포함 된 텍스트를 선택하려고하면 다음이 중단됩니다.

vnoremap y:call VimuxRunCommand("<c-r>"")<cr>

이 문제를 해결하려면 @다음을 사용하여 매크로의 내용을 참조하십시오 .

vnoremap y:call VimuxRunCommand(@")<cr>

명명되지 않은 레지스터의 내용을 전달하고 큰 따옴표 및 여러 줄로 된 대소 문자와 함께 작동합니다.


마지막 예에 "."가없는 것 같습니다. 아마도 VimuxRunCommand ( "@")를 의미했을 것입니다.
kd8azz

@문자를 vimux 명령으로 보냅니다 . @다음 큰 따옴표를 이스케이프 처리하는 것으로 생각 하고 일반 문자 대신 레지스터로 취급됩니다. vnoremapI 정의한은 그렇게 선택된 텍스트를 양키하고 인접한 창에서 실행하는 인터프리터를 보내는 vimux 명령으로 붙여 넣 비주얼 모드에서 활성이다. 스크립트 작업과 몇 번의 키 입력으로 스크립트의 작은 부분을 테스트하는 데 정말 좋습니다.
Conrad.Dean

1

OS X

Mac OS X에서 Vim을 사용하는 경우 불행히도 이전 버전과 함께 제공되며 클립 보드 옵션을 준수하지 않습니다. 다행히 Homebrew 는이 문제를 쉽게 해결할 수 있습니다.

Vim 설치 :

brew install vim --with-lua --with-override-system-vi

Vim의 GUI 버전을 설치하십시오 :

brew install macvim --with-lua --with-override-system-vi

적용하려면 터미널을 다시 시작하십시오.


다음 줄을 추가하십시오 ~/.vimrc
set clipboard=unnamed

이제 Vim에서 줄을 복사하여 yy시스템 전체에 붙여 넣을 수 있습니다.


1

상황에 따라이 정보는 기본 옵션이있는 Linux Mint의 기본 플러그인, 플러그인 없음, .vimrc Vim 7.4 동작이 아닙니다.

당신은 항상 마우스로 텍스트 (또는 사용하여 선택할 수 있습니다 V또는 v하고 "* 레지스터의 선택을 배치)을하고, 명령 행에 붙여 넣습니다 Shift+ Ctrl+v 있습니다.

명령 행에 Ctrl+ r를 입력 하면 레지스터 이름을 묻는 메시지가 나타납니다. 입력 :CTRL-r*하면 컨텐츠 레지스터 *가 명령 행에 배치됩니다. "*뿐만 아니라 모든 레지스터를 붙여 넣습니다. 참조 :help c_CTRL-R.

또한 마우스 가운데 버튼은 명령 줄에 붙여 넣습니다.

:help->quote-plusX Window가 선택을 처리하는 방법에 대한 설명을 참조하십시오 . 평범한 즉시 사용 가능한 Vim (다시 말해 Linux Mint의 Vim 7.4에서도)에서 마우스 왼쪽 버튼으로 선택한 내용을 마우스 가운데 버튼으로 명령 줄에 붙여 넣을 수 있습니다.

또한 마우스 가운데 버튼은 Vim에서 선택한 텍스트를 다른 많은 X Window 응용 프로그램, 심지어 GUI 응용 프로그램 (예 : Firefox 및 Thunderbird) 에도 붙여 넣습니다. )에도 붙여넣고 다른 응용 프로그램에서 텍스트를 선택한 경우 명령 줄에 텍스트 붙여 넣기도 가능합니다 .

addl 정보는 : help-> x11-selection을 참조하십시오.

tl; dr

: CTRL-r 접근 방식을 먼저 시도한 다음 다른 것이 필요한 경우 Shift+ Ctrl+ v또는 마우스 가운데 버튼을 사용하십시오.

혼란 스러울 수 있습니다.


0
  1. "[a-z]y: [az] 레지스터로 텍스트 복사

  2. 사용하여 :!편집 명령으로 이동

  3. Ctrl+ R: 등록 ID를 따라 복사 한 내용을 붙여 넣습니다.

CentOS 7에 사용되었습니다.


무엇을 의미하는지 "그것은 CentOS는 7로 사용" ?
Peter Mortensen

0

두 개의 다른 레지스터 (예 : register a및 register b) 에 두 개의 값이 묶여 있으면 변수를 설정 c하고 작업을 수행 할 수 있습니다 .

예를 들어 어디서나 :set c = str2float(@a) + str2float(@b)내용을 붙여 넣을 수 c있습니다.

예를 들어 INSERT 모드 동안, CTRL + R다음 입력 =식 레지스터에 입력하고 바로 입력 c등호 후 Enter 키를 누르십시오. 지금 총을 가지고 있어야 완료 ab 등록 되었습니다.

이 모든 것을 매크로로 기록하고 반복 할 수 있습니다!

str2float함수는 float로 작업하는 경우에 사용되며 그렇지 않은 경우 대신 정수를 얻습니다.

이것이 관용인지 확실하지 않지만 행에 2 개의 숫자를 추가하고 500 줄 더 반복 해야하는 경우에 효과적이었습니다.

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