이 문제로 인해 대부분 탭을 피했지만 지금은 탭 복제 동작을 원하는 기능이 있습니다. 테스트했지만 본격적으로 사용하지 않았습니다. 이 워크 플로에는 숨겨진 단점이있을 수 있습니다.
이 기능의 한 가지 문제점은 이전 버퍼 창 쌍의 일부 상태 (예 : 설정 여부 set number
)를 복제하지 않는다는 것 입니다. 비트를 추측하면 c-w T
복제가 수행되지 않고 창이 단순히 부모로 표시 되므로이 문제가 없을 수 있습니다.
Vim에는 버퍼, 탭 및 창과 같은 항목에 대한 1 개의 기반 목록이 있습니다. 내가 알 수있는 한 0
키는 줄의 시작 부분으로 이동하는 데 사용 되므로 숫자 인수로 0을 전달 하기 때문에 1 기반 입니다.
우리는이 기능을 에뮬레이트하기 위해 다음 세 가지 목록을 고려합니다.
- 탭 페이지의 전체 목록
- 탭별 창 목록
- 전체 버퍼 목록
이 값을 모두 저장 한 다음 "tabnew"를 통해 새 탭을 만듭니다. 새 탭은 항상 오른쪽에 만들어 지므로 탭 아래의 인덱스 tabnew
는 무효화되지 않습니다. (이를 수행하는보다 강력한 방법이 더 좋을 것입니다).
이 tabnew
명령은 또한 포커스를 새 탭과 그 안의 단일 창으로 이동합니다. 여기에서 buffer
명령을 사용하여 원래 포커스가있는 버퍼에 대한보기를 작성할 수 있습니다 .
그런 다음 원래 탭의 저장된 색인을 사용하여 초점을 해당 탭으로 복원합니다. 그리고 편집증의 대부분에서 그 탭의 초점을 원래 창으로 설정했습니다. Vim은 보이지 않는 탭에 어떤 창에 포커스가 있는지 기억하지만, 나는 그것에 의존하는 것을 좋아하지 않습니다.
(몇 가지 스타일 포인트 : 명시 적 숫자 변환 0+
, 전역 변수 및 어설 션은 모두 의도적입니다)
function! TabDuplicate()
" set vars, sanity checking
let g:tabdup_win = 0+ winnr()
let g:tabdup_buf = 0+ bufnr('%')
let g:tabdup_tabpage = 0+ tabpagenr()
call assert_true(g:tabdup_win > 0)
call assert_true(g:tabdup_buf > 0)
call assert_true(g:tabdup_tabpage > 0)
" make a new tab page,
" the new tab page will have focus
" none of the indices, which are all
" less than the current index, are
" invalidated by creating a new tab
execute "tabnew"
" visit the buffer we saved
execute "buffer " . g:tabdup_buf
" return to the original tab page
execute "tabnext " . g:tabdup_tabpage
" return focus to original window
execute g:tabdup_win . " windcmd w"
endfunction