본문 바로가기

정리/IT공부

빠르게! vi (vim)에서 복사하기

728x90

아마 대부분 이 글을 보는 분들은 하나의 terminal에서 vi (vim) 작업을 하고 있고 다른 terminal을 켜서 vi 로 새로운 파일을 만들고 거기에 복사하는 방법을 찾고 계실 것입니다.   편의상 vim 을 vi 이라고 하겠습니다.


저의 결론부터 말씀드리자면 마우스를 이용한 copy & paste 이외에는 방법이 없습니다.. (아직까지는!!!믿으세요 괜히 더 고생하지마시고요...)

맨 밑에서 그 이유를 말씀드리겠는데요. 지금은 이유야 어찌됐든 그 대안이 필요합니다.


그래서 그 대안이 뭐냐? sp 입니다.


<요약>

현재 vi 에서 

:sp ./filename

->현재 폴더에서 filename을 분할 창에서 연다

->ctrl +ww 눌러 본래 창으로 커서를 옮긴다.

->커서를 복사할 내용 첫 머리에 놓는다. 그리고 명령모드에서 다음을 입력한다.

:ma

->이제 복사할내용의 끝머리에 커서를 놓는다.

:"+y'a

-> 마크한 라인부터 마지막 라인까지 + 레지스터에 복사한다.(표시한 곳부터)

:ctrl+ww

-> 분할 창 화면 중 다른 화면으로 커서가 넘어간다.

:p

-> 붙여넣기가 되죠!

:wq!

-> 저장 후 강제 종료


다른 터미널에서

$vi ./filename

하면 확인할 수 있습니다.



<설명>

편의상 작업중인 파일을 src(일부 복사 예정), 앞으로 붙여넣을 위치에 있는 파일을 dest라 합시다.


src 파일을 vi로 열고 우선 명령모드로 가셔서 다음을 입력합니다.(esc 누르면 명령모드,  i 누르면 입력모드)


: sp dest

또는 

: sp /home/user/somwhere/dest



그러면 화면이 분할되며 그곳에서 dest라는 파일이 열립니다.  (참고로 이미 있는 파일도 열 수 있습니다.)

다른 창으로 커서를 옮기려면 ctrl+ww 를 누르면 됩니다.


이제 복사할 차례입니다.

src로 와서 복사할 내용의 첫 머리에 커서를 놓고 명령모드로 갑니다. 그리고 다음을 입력합니다.

(마우스 말고 키보드로 커서를 놓으십쇼.)

ma


그러면 현재 커서 위치에서 mark 를 줍니다. (표시해놓는거죠)

다음 복사할 내용의 끝에 커서를 놓고 명령모드로 가서 다음을 입력합니다.

"+y'a

쌍따옴표더하기y엔터키옆따옴표a

그러면 + register 에 마크되어있는 지점부터 현재까지 모두 복사가됩니다.


ctrl+ww 로 dest로 넘어와서  (커서가 넘어오는 것을 확인하세요.)

명령모드에서

를 누르면

복사가 끝납니다.




그나마 가장 편한 방법입니다!




<도대체 왜 불가능한가?>


그 이유는 다음의 구조를 보시죠.

우선 ubuntu 를 쓰고 있다는 가정하에 두개의 터미널에서 우리는 vi 작업을 하고 있다고 합시다.

중앙 terminal은 이런저런 명령어를 수행해본 터미널입니다. 무시해주세요.





그 구조는 다음과 같겠네요.


그리고 우리는 그 터미널을 가상의 terminal1, terminal2라고 합시다.

대략적으로 vi 와 terminal 그리고 Xwindow는 아래와 같은 구조를 이루겠죠?


[tree1]

Xwindow (그냥 GUI 에 대한 적당한 명칭을 몰라서 이렇게 쓰겠습니다.)

├   XXX   -terminal1 - vi 1

└   XXX   -terminal2 - vi 2




정말로 이렇게 되어있는지 확인해 봅시다.


오호 vim 확인했습니다. 부모프로세스를 확인해보죠.






아니 그런데  terminal1 과 terminal2 는 bash의 자식 프로세스네요. 그런데 다른 pid를 갖고 있습니다.!!!!


그러나 bash 각각의 부모프로세스는 2702로 같네요?

그게 뭘까요?


gnome-terminal 이네요

[tree1]을 정리하면 다음과 같겠네요.


gnome-terminal

├   bash1 - vim1

└   bash2 - vim2


이걸 왜 설명했냐하면 복사를 하기위해선 자료를 공유해야합니다. 하다못해 buffer 같은 것들을요.

 부모 프로세스와 자식프로세스는 자원을 공유할 수 있다고 알려져 있습니다. 2018.10.

fork 이용하여 공유 한다고는 합니다.

부모와 손자프로세스는 자원 공유를 위해선 뭔가 필요할 거고. 그 기능을 넣지 않는 이상, 당장은 공유될 수는 없어 보입니다.


(향후에 vi 소스를 수정하면 copy &paste가 가능할 것도 같네요. 소스를 받아야겠어요.)


이상입니다.