vi에서 한 파일의 내용을 다른 파일로 복사하여 붙여 넣기


256

두 개의 파일로 작업하고 있는데 한 파일에서 몇 줄을 복사하여 다른 파일에 붙여 넣어야합니다. 동일한 파일에서 복사 (yy) 및 붙여 넣기 (p) 방법을 알고 있습니다. 그러나 다른 파일에서는 작동하지 않습니다. 이것은 어떻게 이루어 집니까?

또한 잘라 붙여 넣기 방법이 있습니까? 인터넷 검색을 시도했지만 대부분의 리소스는 복사 붙여 넣기에 대해서만 이야기합니다.


이것이 작동하지 않습니까? 파일 사이에 줄을 복사하는 데 자주 사용합니다.
sjngm

글쎄, 내가 따옴표를 얻을 수 있습니까?
macha

4
dd 명령은 cut처럼 작동합니다.
Martin Stålberg

답변:


218

텍스트를 자르거나 구르는 방법을 이미 알고 있으므로 다른 파일에 다시 붙여 넣을 때 몇 가지 아이디어가 있습니다.

  • 원하는 텍스트를 잡아 당겨 첫 번째 파일을 편집하십시오. 그런 다음 vi ( :e /path/to/other/file) 내에서 두 번째 파일을 열고 붙여 넣습니다.
  • 사용하여 그들 사이에 분할 창을 탐색 함께 두 파일을 열고 Ctrl+ w, Up/ Down중 하나에 의해를 :

    • vi -o /path/to/file1 /path/to/file2
    • 첫 번째 파일에서 Ctrl+ w,s

두 개의 퍼티 창을 열었습니다. "v를 먼저 비주얼 모드로 설정 한 다음 모든 줄을 선택하고 yanking을 위해"y "를 수행하십시오. 다른 파일로 이동하기 위해 Alt + Tab을 사용하지 않고 "p"는 인용 부호 만 인쇄합니다
macha

10
퍼티 창 2 개로 작업하는 경우 퍼티 / 창 복사 / 붙여 넣기 방법을 사용해야합니다. 쉽습니다. 마우스로 복사 할 내용을 표시하십시오 (다른 작업을 수행 할 필요가 없으며 표시된 텍스트가 클립 보드에 복사됩니다). 다른 퍼티 창으로 전환하십시오. vim (hit i)에 삽입 모드로 들어갑니다. 마우스 오른쪽 버튼을 클릭하십시오-퍼티 창에서 마우스 오른쪽 버튼을 클릭하면 클립 보드에있는 내용이 모두 붙여집니다.
nos

3
vi의 Yanking은 텍스트를 Windows 클립 보드에 넣지 않으며 yank 버퍼는 열린 vim 인스턴스간에 공유되지 않습니다.
Adam Batkin

1
첫 번째 파일 내에서 *를 : 나는 마지막 포인트는 어떻게해야 무엇인지 이해하지 Ctrl+ w, s.
svassr

1
나를 위해 창을 분할했지만 정확히 같은 파일을 열었습니다. 그때 열 파일을 어떻게 선택합니까? :sp myfile가로로 나누고 지정된 파일을 여는 명령 을 보았지만 창을 세로로 나누려면 어떻게해야합니까?
svassr

50

Windows에서 Vim을 사용하는 경우 다음을 사용하여 클립 보드 (MS 복사 / 붙여 넣기)에 액세스 할 수 있습니다.

"*dd -줄을 자르십시오

"*yy -한 줄 복사 (또는 3 줄을 복사하려면 3yy)

"*p -커서 다음 줄에 줄 붙여 넣기

"*P -커서 앞에 줄에 줄 붙여 넣기

별도의 Vim 창 사이 또는 Vim과 PC 응용 프로그램 ( 메모장 , Microsoft Word 등) 사이에 붙여 넣을 수 있습니다 .


17
Windows 전용 +크로스 플랫폼 시스템 클립 보드 레지스터 (Windows 및 Linux) vs.로 사용하십시오 (Windows에서와 동일하게 작동 함 ). *+*
Stephen Swensen

42

d같은 dd잘라내 기를 사용하십시오 .

다른 파일에 여러 줄을 쓰려면 다음을 사용할 수 있습니다.

:<n>,<m> w filename

위치 <n><m>범위는 행 범위를 지정하는 숫자 (또는 기호)입니다.

데스크탑 클립 보드를 사용하려면 +g명령을 살펴보십시오 .


마크로이를 수행하려면 파일에 쓰려는 텍스트 주위에 두 개의 마크 (예 : a 및 b)를 만듭니다 : 첫 번째 줄로 ma이동, 마지막 줄로 이동 mb. 그런 다음 '위 명령을 사용할 때 마크 문자 앞에 a 를 추가하십시오 .:'a,'b w filename
EchoLynx

넓은 범위의 훌륭한 솔루션!
Yasin Okumuş

29

다른 파일을 열고을 입력 할 수 있습니다 :r file_to_be_copied_from. 또는 버퍼링 할 수 있습니다. 또는 첫 번째 파일로 이동하여 복사하려는 줄로 "qY이동하여을 입력 한 다음 붙여 넣으려는 파일로 이동하여을 입력하십시오 "qP.

"buffer_name, 버퍼에 복사합니다. Yk하고 P넣습니다. 희망이 도움이됩니다!


감사! 이것은 나에게 도움이되었다
Yamamoto Atsushi 8:10에

28

이를 수행하는 한 가지 방법이 있습니다.

  • Vim을 시작하고 작업중인 파일 인 file1을 엽니 다.
  • :e file2는 줄을 복사하려는 파일 인 file2를 불러옵니다.
  • 복사하려는 줄을 찾으십시오. 세 줄이면3yy
  • :b1 이것은 버퍼 1로 전환되며, 여기서 file1은
  • 당신이 잡아 당긴 선을 어디에 삽입하고 싶은지 알아 내고 p

두 파일을 모두 볼 수 있습니다. 예를 들어 Ctrl+로 화면을 분할하십시오 w s.

절단에 관해서는, d절단 된 재료를 절단 및 완충 버퍼에 놓는다. dd줄을 "잘라낼 것"입니다.


2
주 제외 : 키보드 버튼 같은 것을 어떻게 얻습니까?
eckes


두 파일이 서로 다른 두 개의 ssh 서버에 있으며 동일한 클라이언트가 Linux / MacOS의 두 개의 서로 다른 터미널에 있습니다. 퍼티를 사용하지 않고 두 터미널을 하나의 터미널에서 동일한 vi 세션으로 열 수 없습니다.
Qiang Xu

1
클라이언트가 두 서버에 ssh를 넣을 수 있으면 scp 또는 sftp를 사용하여 두 서버에 연결할 수도 있습니다. 따라서 가장 빠른 방법은 파일을 한 서버에서 다른 서버로 복사하여 동일한 서버에 상주하고 설명 된대로 해당 파일을 편집 한 다음 필요한 경우 파일을 다른 서버로 다시 복사하는 것입니다.
Nos

16

이것들은 모두 좋은 제안이지만 다른 파일에서 텍스트의 위치를 ​​알고 있다면 sed를 쉽게 사용하십시오. :r! sed -n '1,10 p' < input_file.txt커서의 현재 위치에서 이미 열려있는 파일에 10 줄이 삽입됩니다.


이상하게도 OS x에서 불행히도 실행할 때 종료 코드 1을 얻었습니다. 그 이유는 확실하지 않습니다.
jayunit100

1
이 제안에 감사드립니다! 처음 두 줄을 원했기 때문에 sed 대신 head를 사용했습니다.:r ! head -n2 file.py
Federico Ponzi

7

파일을 편집하는 동안 시작과 끝에서 사용할 위치를 표시하십시오.

ma- a마크를 설정

mb- b마크를 설정

그런 다음 다른 파일로 복사하려면 다음 w명령을 사용하십시오 .

:'a,'bw /name/of/output/file.txt

7

2017-05 업데이트 :

vimrc 파일에 다음 줄을 추가하면

클립 보드 설정 = 이름 없음

Vim이 시스템 클립 보드를 사용하고 있습니다.


방금 다른 Vim 인스턴스 창 사이에서 내용을 복사하는 방식에서 yank 방식이 작동하지 않는다는 것을 알았습니다. (적어도 Vim 지식을 기반으로 작동하지 않습니다. 다른 방법으로 작동하는지 알 수 없습니다).

yank 방식은 내 테스트에 따라 동일한 창에서 여러 파일을 여는 방식에서만 작동합니다.

그렇게하려면 Ctrl+ x, Ctrl+ c(Windows에서) 와 같은 OS cut-copy-past 방식을 사용하는 것이 좋습니다 .


5

이 리맵은 저에게 매력처럼 작동합니다.

vmap <C-c> "*y     " Yank current selection into system clipboard
nmap <C-c> "*Y     " Yank current line into system clipboard (if nothing is selected)
nmap <C-v> "*p     " Paste from system clipboard

따라서 시각 모드에있을 때 원하는 줄을 선택하고 Ctrl+ c를 누른 다음 Ctrl+ v를 눌러 수신기 파일에 텍스트를 삽입합니다. "* y도 사용할 수 있지만 가끔 기억하기 어렵다고 생각합니다.

Vim에서 클립 보드로 텍스트를 복사 할 때도 유용합니다.

소스 : 임시 파일을 사용하여 세션간에 복사하여 붙여 넣기


4

동일한 Vim 인스턴스에서 열린 두 버퍼 (== 파일)간에 텍스트를 복사해도 문제가 없습니다.

y( 버퍼 모드를 이전에 가시 모드로 표시 한 것으로 가정)를 사용하여 하나의 버퍼에 간단히 적신 다음을 사용하여 다른 버퍼에 붙여 넣습니다 p. Vim의 동일한 인스턴스에있는 한 다른 탭에서도 작동합니다.

동일한 Vim 인스턴스에서 두 파일을 여는 방법은 시스템에 따라 다릅니다.

  • Win32에는 컨텍스트 메뉴에 두 개 이상의 파일을 선택하면 하나의 vim으로 편집 이라는 옵션이 있습니다.
  • 콘솔을 사용하면 vim file1 file2
  • 다른 도구의 편집기로 Vim을 사용하는 경우 --remote-silent모든 파일이 동일한 인스턴스에서 열리도록 옵션을 지정하십시오.

첫 번째 빔 인스턴스에 사용하여 시스템 클립 보드에 텍스트를 꺼낼 : 당신은 빔의 두 가지 경우에 두 개의 파일을 열 경우, 당신은 시스템 클립 보드 가야 "+y, 다시 (전에 비주얼 모드에 빠지게 할 영역을 표시 ) 그런 다음 두 번째 Vim으로 이동하여 클립 보드를 붙여 넣습니다 "+p.


: tabedit filename 은 대상 파일을 연 다음 p 를 사용하여 행을 붙여 넣을 수 있습니다. 나는 그것이 더 빠르다고 생각합니다.
jabalv

4

목표 : 한 파일을 다른 파일로 저장합니다.

해결책 :

  1. 저장하려는 텍스트를 선택하십시오.
    • 선택을 시작하려는 위치에 커서를 놓습니다.
    • 눌러 v문자를 선택 또는 대문자로 V전체 라인을 선택
    • 커서를 선택하려는 끝으로 이동
  2. 선택한 텍스트를 새 파일에 저장하십시오. :wSpace새 파일의 유형 과 이름 실제로 당신은 볼 수 있습니다

    :'<,'>w new.txt

    그런 다음 Enter


임시 파일에서 다시 붙여 넣는 방법?
Vineet

3

내 시나리오는 파일 1에서 파일 2로 중간에 n 줄을 알 수없는 n 줄을 복사해야한다는 것입니다.

:'a,'bw /name/of/output/file.txt

2
  1. 클립 보드 지원으로 컴파일 된 Vim 버전이 있는지 확인하십시오
    • :echo has('clipboard') 돌아와야한다 1
    • 반환되는 경우 0(예 : Mac OS X, 최소 v10.11 (El Capitan), v10.9 (Mavericks) 및 v10.8 (Mountain Lion)-클립 보드 지원이없는 Vim 버전과 함께 제공) 클립 보드를 지원하는 Vim 버전, via brew install vim(설치 후 터미널을 다시 시작하는 것을 잊지 마십시오)
  2. 시각적 모드로 들어가십시오 ( V-여러 줄, v일반 또는 Ctrlv블록 시각적)
  3. 복사 할 줄을 선택하십시오
  4. "*y -선택된 복사
  5. "*p -복사하여 붙여 넣기

추신:

  • 한 줄을 복사하여 붙여 넣어야하는 경우 JayG 의 답변 으로 2-5 단계를 바꿀 수 있습니다.
  • 라인을 선택하기 쉽게하기 위해, 당신은 추가 할 수 있습니다 set mouse+=a당신에게 .vimrc- (줄 번호 등과 같은) 외부 요소를 선택하지 동안, 당신은 마우스를 사용하여 빔의 행을 선택할 수 있습니다 주의 사항 :이 마우스로 선택한 텍스트를 복사 할 수있는 기능을 차단합니다 Vim에서 시스템 클립 보드로 .

1

예 : fileA 및 fileB-25 행에서 fileA로 시작하고 50 행을 복사하여 fileB에 붙여 넣기

fileA

Goto 25th line

25G

copy 50 lines into buffer v

"v50yy

Goto fileB

:e fileB

Goto line 10

10G    

paste contents of buffer v
"vp

1

아래 옵션은 대부분의 시간과 나중에 붙여 넣기에도 사용됩니다.

 "xnyy
x - buffer name
n - number of line to Yank - optional

줄 바꿈 된 행은 버퍼에 저장됩니다 'x'. 편집의 어느 곳에서나 사용할 수 있습니다.

다른 파일에 줄을 붙여 넣으려면

:e filename&location

예 : 현재 편집에 아래 명령을 입력하십시오

:e /u/test/Test2.sh
and paste using "xP
P - before cursor
p - after cursor

완전한 작업

파일 열기 1 :

vi Test1.sh

a10yy

-Yanked 10 lines

-현재 편집에서 두 번째 파일을 엽니 다

*:e /u/test/Test2.sh*

붙여 넣을 줄로 커서를 이동하십시오.

*"ap*

-버퍼의 라인 '*a*'은 현재 커서 위치 후에 복사됩니다


1

파일의 일부를 복사하여 다른 파일의 중간에 해당 내용을 붙여 넣으려면이 방법을 사용할 수 있습니다.

:linenumber,linenumber write newfile

예:

:2,34 write temp1

또는

:'mark, 'mark write newfile

예:

:'a,'b write temp1

이제 행이 다른 파일로 복사됩니다. 복사 후 해당 줄을 삭제하려면 할 수 있습니다

:linenumber1,linenumber2 d

또는

:'mark1,'mark2 d

이제 다른 파일로 이동하십시오. 그런 다음 붙여 넣을 줄에 커서를 놓습니다.

유형

:r!cat temp1

이제 임시 파일의 내용을 여기에 붙여 넣습니다. 내용을 붙여 넣은 후 명령 줄 자체에서 임시 파일을 삭제할 수 있습니다.

:!rm temp1

여러 번 복사하여 붙여 넣으려는 경우 도움이됩니다.


0

다른 방법은 두 개의 분할 버퍼에서 두 파일을 열고 관심있는 라인을 시각적으로 선택한 후 다음 "스 니펫"을 사용하는 것입니다.

:vnoremap <F4> :y<CR><C-W>Wr<Esc>p

0

명령 모드로 들어가서 실행

:r! sed -n '<start_line_num>, <end_line_num> p' file_to_extract_text_from

예 : 현재 열린 파일 20-30에서 줄을 추출filename

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