현재 프로세스의 탭에서 git diff에 대한 vimdiff를 시작할 수 있습니까?
파일 버퍼가 열려 있고 하나의 :terminal
탭 페이지에서 분할이 열려 있다고 가정 해 보겠습니다 . 실행하는 새 탭을 만들고 싶지만 vimdiff
git diff가 표시됩니다. git difftool HEAD~1
현재 vim 프로세스에 다른 탭 페이지에 표시 하려고 합니다.
플러그인없이 Vim 8에서 가능합니까?
나는 내가 할 때 이런 환상을 얻은 :tab terminal
다음 실행 git difftool HEAD~1
합니다. 그러나 이것은 vim 하위 프로세스를 시작하며 그것을 피하고 싶습니다.
이 질문과 비슷합니다. 두 개의 분할이 이미 열려있는 경우 어떻게 vimdiff 모드로 들어가나요? 그러나 git diffs.
답변
이것은 확실히 바닐라 vim
에서 가능하지만, tpope의 우수한 vim-fugitive플러그인을 살펴볼 것을 제안합니다 . 그런 다음 :tab Gdiff
원하는 것을 얻기 위해 간단히해야합니다 .
실제로 플러그인을 설치하지 않으려면 현재 파일이 버퍼 번호에 있다고 가정하면 다음이 작동 할 수 있습니다. 1:
:tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
- 새로 열린 탭에서
:vert sb 1 | windo diffthis
설명
- 먼저 새 탭을 열고 버퍼 1에있는 파일 버전의
tabnew
내용을 여기에로드HEAD^
합니다. - 와 함께 버퍼 1을 포함하는 수직 분할을 연
vert sb 1
다음:diffthis
탭의 모든 버퍼에 발행 하여 diff 모드로 들어갑니다.
편집하다
영업 단계에 좀 더 설명 1. 요청 git show
요구 형태의 입력 작업 트리의 루트에 상대적이어야합니다. 예를 들어 버퍼 1에있는 파일의 절대 경로가 폴더 를 포함하는 경우 (즉 , 저장소의 루트) 제대로 작동하려면 . 또는 둘 중 하나를 사용하면 작동하지 않습니다. 그래서 저는 이 예제에서 git 루트 (이 될 것임 )에 상대적인 현재 폴더의 경로를 얻었습니다 .<rev>:<path>
<path>
/a/b/foo.ext
b
.git
b
git show
HEAD^:b/foo.e
/a/b/foo.ext
foo.ext
git rev-parse --show-prefix
b/
그런 다음 vim
경로 확장을 사용 하여 파일 이름 (즉 foo.ext
) 을 추가했습니다 . 버퍼 1에로드 된 파일의 경로를 가져 오도록 #1
지시 vim
하고 에서 반환 된 경로 :t
에서 마지막 이후의 모든 것 인 "꼬리"를 추출합니다 . 일부의 경우 와 동일하지만, 항상 그런 것은 아닙니다. 당신이 실행 한 경우 예를 들어, 다음 반환 대신의 . 자세한 정보를 확인하십시오 ./
#1
#1
#1:t
vim b/foo.ext
#1
b/foo.ext
foo.ext
:help expand
물론에서 :tabnew | r! git show HEAD^:b/foo.ext
와 같이 경로를 수동으로 입력 할 수 있으며 작동합니다. 그러나 위 버전은 스크립트가 가능하거나 맵에 할당 할 수 있습니다.