현재 프로세스의 탭에서 git diff에 대한 vimdiff를 시작할 수 있습니까?

Jan 20 2021

파일 버퍼가 열려 있고 하나의 :terminal탭 페이지에서 분할이 열려 있다고 가정 해 보겠습니다 . 실행하는 새 탭을 만들고 싶지만 vimdiffgit diff가 표시됩니다. git difftool HEAD~1현재 vim 프로세스에 다른 탭 페이지에 표시 하려고 합니다.

플러그인없이 Vim 8에서 가능합니까?

나는 내가 할 때 이런 환상을 얻은 :tab terminal다음 실행 git difftool HEAD~1합니다. 그러나 이것은 vim 하위 프로세스를 시작하며 그것을 피하고 싶습니다.

이 질문과 비슷합니다. 두 개의 분할이 이미 열려있는 경우 어떻게 vimdiff 모드로 들어가나요? 그러나 git diffs.

답변

2 NikolasTapia Jan 20 2021 at 17:03

이것은 확실히 바닐라 vim에서 가능하지만, tpope의 우수한 vim-fugitive플러그인을 살펴볼 것을 제안합니다 . 그런 다음 :tab Gdiff원하는 것을 얻기 위해 간단히해야합니다 .

실제로 플러그인을 설치하지 않으려면 현재 파일이 버퍼 번호에 있다고 가정하면 다음이 작동 할 수 있습니다. 1:

  1. :tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
  2. 새로 열린 탭에서 :vert sb 1 | windo diffthis

설명

  1. 먼저 새 탭을 열고 버퍼 1에있는 파일 버전의 tabnew내용을 여기에로드 HEAD^합니다.
  2. 와 함께 버퍼 1을 포함하는 수직 분할을 연 vert sb 1다음 :diffthis탭의 모든 버퍼에 발행 하여 diff 모드로 들어갑니다.

편집하다

영업 단계에 좀 더 설명 1. 요청 git show요구 형태의 입력 작업 트리의 루트에 상대적이어야합니다. 예를 들어 버퍼 1에있는 파일의 절대 경로가 폴더 를 포함하는 경우 (즉 , 저장소의 루트) 제대로 작동하려면 . 또는 둘 중 하나를 사용하면 작동하지 않습니다. 그래서 저는 이 예제에서 git 루트 (이 될 것임 )에 상대적인 현재 폴더의 경로를 얻었습니다 .<rev>:<path><path>/a/b/foo.extb.gitbgit showHEAD^:b/foo.e/a/b/foo.extfoo.extgit rev-parse --show-prefixb/

그런 다음 vim경로 확장을 사용 하여 파일 이름 (즉 foo.ext) 을 추가했습니다 . 버퍼 1에로드 된 파일의 경로를 가져 오도록 #1지시 vim하고 에서 반환 된 경로 :t에서 마지막 이후의 모든 것 인 "꼬리"를 추출합니다 . 일부의 경우 와 동일하지만, 항상 그런 것은 아닙니다. 당신이 실행 한 경우 예를 들어, 다음 반환 대신의 . 자세한 정보를 확인하십시오 ./#1#1#1:tvim b/foo.ext#1b/foo.extfoo.ext:help expand

물론에서 :tabnew | r! git show HEAD^:b/foo.ext와 같이 경로를 수동으로 입력 할 수 있으며 작동합니다. 그러나 위 버전은 스크립트가 가능하거나 맵에 할당 할 수 있습니다.