버퍼를 이동하는 대신 새 탭으로 버퍼 복제


10

탭 페이지에서 버퍼를 일시적으로 최대화 한 다음 내가보고 있던 이전 버퍼 구성으로 돌아 가려고합니다. 이와 같은 작업을 수행하는 현재 워크 플로는 현재 사용중인 버퍼를 사용하여 다른 모든 버퍼를 닫거나 <c-w>o자체 탭으로 이동하는 것 <c-w>T입니다. 두 번째 방법의 문제점은 원래 탭 페이지에서 버퍼를 제거한다는 것입니다.

나는 세 개의 파일을 채우고 a.txt, b.txtc.txta, b그리고 c각각.

% echo a > a.txt
% echo b > b.txt
% echo c > c.txt

이 세 파일을 모두 하나의 탭 페이지에서 열면 다음과 같은 결과가 나타납니다.

여기에 이미지 설명을 입력하십시오

그런 다음 a.txt자체적으로 탭으로 이동할 수 있습니다 . 그러나 내가 할 때 a.txt원래 탭 페이지에서 제거됩니다. (따라서이 후에야 <c-w>Tgt)

여기에 이미지 설명을 입력하십시오

<c-w>T원래 버퍼의 내용을 유지하기 위해 눌렀을 때 선택하고 현재 포커스가있는 버퍼 만 포함하는 새 탭 페이지를 만든 다음 방금 새 탭 페이지에 포커스를 두는 기능을 원합니다. 만들어진. 다시 말해, <c-w>T원래 탭 페이지가 유지되고 현재 a.txt는 두 개의 탭 페이지에 있다는 점을 제외하고는 거의 같은 명령 입니다.

이것을 할 수있는 방법이 있습니까?

답변:


13

확실하지 않지만 시도해 볼 수 있습니다 :tab split(또는 더 짧은 버전 :tab sp).

:split명령을 표시하는 뷰포트를 복제해야 a.txt그동안, :tab수정 전용 탭 페이지에이 뷰포트를 이동해야합니다.


의 동작을 변경하려면 C-w T다음과 같이 다시 매핑하면됩니다.

nnoremap <C-w>T :tab split<CR>

보다 일반적으로, 창을 분할하는 명령을 찾을 때마다 대신 새 탭 페이지를 작성하려는 경우 접두어를 접두어로 사용할 수 있습니다 :tab.

예를 들어 새 탭 페이지에서 도움말 버퍼를 읽는 데 사용할 수 있습니다.

:tab help {your_topic}

기본적으로 새 탭 페이지는 현재 탭 뒤에 나타납니다. 그러나 다른 곳에 나타나게하려면 :tab카운트를 접두어 로 붙일 수 있습니다.

예를 들어, 세 번째 탭 페이지의 탭 페이지에서 현재 뷰포트를 복제하려면 다음을 입력하십시오.

:3tab split

그리고 첫 번째로 보이게하려면 :

:0tab split

자세한 내용은 다음을 참조하십시오 :h :tab.

:[count]tab {cmd}                   *:tab*
        Execute {cmd} and when it opens a new window open a new tab
        page instead.  Doesn't work for |:diffsplit|, |:diffpatch|,
        |:execute| and |:normal|.
        If [count] is given the new tab page appears after the tab
        page [count] otherwise the new tab page will appear after the
        current one.
        Examples:

            :tab split      " opens current buffer in new tab page
            :tab help gt    " opens tab page with help for "gt"
            :.tab help gt   " as above
            :+tab help      " opens tab page with help after the next
                            " tab page
            :-tab help      " opens tab page with help before the
                            " current one
            :0tab help      " opens tab page with help before the
                            " first one
            :$tab help      " opens tab page with help after the last
                            " one

2

이 문제로 인해 대부분 탭을 피했지만 지금은 탭 복제 동작을 원하는 기능이 있습니다. 테스트했지만 본격적으로 사용하지 않았습니다. 이 워크 플로에는 숨겨진 단점이있을 수 있습니다.

이 기능의 한 가지 문제점은 이전 버퍼 창 쌍의 일부 상태 (예 : 설정 여부 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.