버퍼 세트를 탭에 바인딩하는 방법은 무엇입니까?


14

동시에 다른 프로젝트에서 작업해야 할 때 다음과 같은 워크 플로가 있습니다.

  • 각 프로젝트마다 하나의 탭을 만듭니다.
  • 각 탭에서 편집하려는 파일을 열어 여러 버퍼를 만듭니다.
  • 선택적으로 동시에 두 개 이상의 파일을 볼 필요가 있다면 분할 창을 만들므로 하나의 버퍼를 보여주는 다른 창을 포함하는 탭이 있습니다.

정말 사용하지 않는 내 버퍼 사이에 이동하려면 :ls:b [name or number of buffer]대신 나는 저와 버퍼 사이를 전환 할 수 있도록 몇 가지 편리한 매핑을 생성 :bnext하고:bprevious

이 작업 방법은 꽤 좋지만 무언가가 귀찮습니다. 버퍼는 탭간에 공유됩니다.

내가 열면 file1file2tab1file3tab2있는 경우, tab1내가 몇 시간을 사용 :bnext나는 볼 수 있습니다 file3내가하지 않으려는이 탭에서. 내가 원하는 워크 플로는 다음과 같습니다.

  • vim을 시작하십시오 (버퍼가있는 첫 번째 탭이 있습니다). $ vim foo
  • 이 탭에 버퍼를 추가하십시오. :e bar
  • 새 탭을 열고 전환하십시오. :tabnew
  • 이 탭에서 새 버퍼를 엽니 다 : :e baz
  • 이 버퍼에 머물러 :bnext있거나 버퍼에 :bprevious머무르면 baz(이 탭에서 유일한 버퍼이므로)
  • 나는 이전 탭으로 들어가면 :tabprevious몇 시간을 실행 :bnext난 단지 사이를 전환 할 수 있습니다 foobar버퍼하지만 표시되지 않습니다baz

그래서 여기에 내 질문이 있습니다. 버퍼 세트를 탭에 바인딩하고 vim이 다른 탭에서 의도 한 것보다 일부 버퍼에 액세스하지 못하게 할 수 있습니까?

참고 : 내가 사용하는 것을 알고 있어요 :b [myBuffer]방법이 될 것은 탭에 버퍼를 유지하지만 편집에 3 ~ 4 파일이있을 때 정말 빠른 버퍼 이름을 입력보다 내 매핑을 사용하고 같은 느낌 (심지어 내가 할 수있는 경우 버퍼 이름과 일치하는 일부 문자 만 입력하십시오) .


1
다음은 그러한 접근법의 장단점을 강조하고 오늘 대신 다음과 같이 번역 할 수있는 것을 제안하는 오래된 토론입니다. 여러 vim 인스턴스 (프로젝트 / 버퍼 목록 당 하나) + tmux : vim.1045645.n5.nabble.com/…
VanLaser

@ VanLaser : 흥미로운 토론 링크를 주셔서 감사합니다! 개인 컴퓨터를 사용할 때 실제로 tmux와 다른 vim 인스턴스를 포함시킵니다. 내 질문은 내 전문 작업 창을 사용하고 난이 사실에서 유래 정말 사용 : 창문을 처리하는 방법을 좋아하지 않는 alt+tab정력 내에서 탭을 전환하는 것보다 훨씬 쉽게 느낀다 (또는 더 악화 마우스).
statox

1
아마 VIM-ctrlspace은 도움이 될 수 있습니다 - 그것은 tabpage 버퍼 목록 당 광고하는; 그래도 사용하지 않습니다.
VanLaser

답변:


7

흠, 나는 거기에 플러그인을 찾지 못했지만 직접 작성할 수 있습니다. 이를 위해 vimscript를 배워야합니다. 방금 탭의 버퍼간에 전환 할 수있는 기능을 구현했습니다 (아직 삭제 없음). 이것을 vimrc에 복사 할 수 있습니다 :

if !exists("g:WindowBufManager") 
  let g:WindowBufManager= {}
endif

function! StoreBufTab()
  if !has_key(g:WindowBufManager, tabpagenr())
    let  g:WindowBufManager[tabpagenr()] = []
  endif

  " add the new buffer to our explorer
  if index(g:WindowBufManager[tabpagenr()], bufname("%")) == -1 && bufname("%") != ""
    call add (g:WindowBufManager[tabpagenr()],bufname("%"))
  endif
endfunction

function! WindowBufManagerNext() 
  " find the next index of the buffer
  let s = index(g:WindowBufManager[tabpagenr()], bufname("%"))
  if (s!= -1)
    let s = (s +1) % len(g:WindowBufManager[tabpagenr()])
    execute 'b ' . g:WindowBufManager[tabpagenr()][s]
  endif
endfunction

augroup WindowBufManagerGroup
  autocmd! BufEnter * call StoreBufTab()
augroup END

vimrc를 닫고 다시여십시오. 다음 버퍼를 찾으려면

:call WindowBufManagerNext()

또는 자신의 명령 또는 매핑을 정의하십시오. 탭이나 버퍼를 닫거나 삭제하지 않는 한 작동합니다. 다중 버퍼에서도 작동하지 않습니다. 이러한 기능을 추가하려면 더 많은 작업이 필요하지만 정의 할 수는 있습니다.


나는 플러그인도 찾지 못했고 내장 기능을 기대하고 있었지만 당신이 옳은 것 같다. 아마 혼자서해야 할 것이다. 귀하의 코드 덕분에 전체 플러그인을 개발할 수있는 기반이 있습니다.
statox

6

버퍼는 전역 적이며 탭 페이지, 창 및 버퍼 위에 자신의 추상화 계층을 작성하는 것 외에는 아무것도 할 수 없습니다. philolo1의 대답은 문제에 대한 합리적인 접근 방식을 보여 주지만 그러한 "솔루션"의 한계를 빠르게 찾고 :bufdo대체 파일 과 같은 많은 내장 기능을 복제해야 합니다 ...

반면에 "인수"는 창에 대해 로컬 일 수 있으므로 "버퍼"(단어의 가장 엄격한 의미)보다 워크 플로우에서 더 유용 할 수 있습니다.

$ vim file1 file2
:tabnew
:argl file3 file4 file5
:n
:n
gt
:n
gt
:N
and so on…

인수는 버퍼만큼 유연하지는 않지만 워크 플로에보다 신뢰할 수있는 기반을 제공 할 수 있습니다.

그러나 Vim 인스턴스에서 각 프로젝트를 수행하는 것이 유일한 실용적인 해결책이라고 생각합니다.


터미널에서 사용할 수있을 때 별도의 vim 인스턴스를 사용하는 것이 더 좋습니다. 다른 의견에서 나는 전문 컴퓨터에서 창을 사용해야하고 gvim 인스턴스 간을 전환하는 것이이 OS의 엉덩이에 고통이라는 생각에 동의합니다 . 내가 전에 사용해 본 적이없는 주장을 살펴보면 좋은 해결 방법이 될 것입니다. 감사합니다!
statox

2

그래서 약간의 지연으로, 나는 (적어도 나를 위해!) 만족스러운 답변을 찾았 을 것입니다. Shougo의 플러그인 중 두 개가 필요합니다.

현재:ls에서 버퍼 만보고 (및 선택) 빠른 액세스 맵을 대신 사용합니다 .

예를 들면 다음과 같습니다.

nnoremap <leader>b :<C-u>Unite buffer_tab -no-split<CR>

단위당-버퍼 당 버퍼

이제 현재 탭 버퍼 목록 ( j, k)을 통해 이동하거나 , 하나 ( CR), 취소 ( q)를 선택하고, "입력"(삽입) 모드로 들어가서 일부 문자를 입력하여 버퍼 선택을 신속하게 필터링하거나 Tab, 동작 목록을 열 수도 있습니다. 현재 선택된 항목 (예 : 현재 활성화 항목 위로 버퍼 열기 )-간단히 말하면 일반적인 "Unite"방식으로 작동합니다.

(또한 :h unite_default_key_mappings일반적인 도움말 참조 ).


그리고 이제는 (아직 선택적인) 최종 트릭입니다. 로 altercmd , 당신은 당신의 자신의 탭이 많다는 활성화, 만들 수 있습니다 ls(뭉 칩시 기능 위의 기준) 명령을 :

:command! LS Unite buffer_tab -no-split
:AlterCommand ls LS

...을 누를 때마다 :lsVim은 실제로 대신 명령을 실행 합니다 .

참고 또한 필요하지 않습니다 :bn또는 :bp탭의 버퍼가보기 및 선택이 지금 같은 명령 때문에.


이 솔루션도 시도해 보겠습니다. 현재 VanLaser가 언급 한 ctrl-space를 주석으로 사용하려고 시도하고 있습니다. 어떤 솔루션이 가장 편리한 지 살펴 보겠습니다. 또한 꽤 멋진 altercmd 플러그인의 경우 +1입니다!
statox

2

내 계정이 새로워 서 주석을 달 수는 없지만 ctrl-space의 경우 ++++ 1입니다.

나는 도움을 통해 반쯤 만들 때까지 팔렸다. Ctrlspace는 다음과 같은 구조를 가지고 있습니다 :

workspaces --> contain tabs --> contain buffers

따라서 작업중인 각 프로젝트의 작업 영역을 저장 한 다음 원하는 때마다 즉시로드 할 수 있습니다. 이것은 vim을 닫을 때마다 모든 버퍼와 탭 분할을 저장할 수 있음을 의미합니다.

탭 이름을 지정할 수도 있습니다. 충분하지 않으면 작업 디렉토리를 매우 쉽게 변경하고 자주 사용하는 디렉토리에 대한 책갈피를 작성할 수 있습니다.

당신이 그것을 사용한다면 그것은 nerdtree와 잘 인터페이스합니다 (솔직히 당신은 아마도 ctrlspace로 일주일 후에 필요하다고 느끼지 않을 것입니다)


이 사용 사례를 고려하십시오.

프로젝트가 있습니다. 그것은 나무를 심는 것과 관련이 있습니다. 과일 나무와 머니 트리가 있습니다. 머니 트리는 달러와 센트를 포함하고 과일 트리는 사과와 오렌지를 포함합니다.

이 예제에서 사과, 오렌지, 달러 및 센트는 모두 "버퍼"입니다.

Ctrlspace를 사용하면 사과와 오렌지를 하나의 "탭"으로 분리하여 "과일"이라고 레이블을 지정할 수 있습니다.이 레이블은 창 상단의 태그 줄에 나타납니다. 마찬가지로, 달러와 센트는 "돈"탭으로 들어갑니다.

"트리"작업 공간은이 전체 구성을 저장하고 vim을 열 때마다 즉시 액세스 할 수 있습니다.


이제는 그것이 존재한다는 것을 알고 있으므로이 플러그인이 없으면 vim에서 객체 지향 개발을 실제로 상상할 수 없습니다. https://github.com/szw/vim-ctrlspace : 링크의 경우


2

그래서 마침내 내 문제를 해결하기 위해 내 플러그인을 만들기로 결정했습니다 .github에서 사용할 수 있습니다 .

나는 @ philolo1의 아이디어를 사용하여 완성하려고 시도했지만이 답변을 작성할 때 여전히 진행중인 작업입니다.

편집 워크 플로가 발전함에 따라 더 이상 플러그인을 유지 관리하지 않고 탭에 바인딩 버퍼를 바인딩하면 해결하는 것보다 더 많은 문제가 발생합니다.


플러그인은 버퍼를 탭에 바인딩합니다. 사용자가 버퍼를 열면 자동으로 탭에 "저장"되며 다른 탭에서 액세스 할 수 없습니다.

설치는 "플러그인 관리자 친화적" 이어야합니다 (적어도 Vim-PlugVundle 과 잘 작동합니다 )

주요 기능 중 일부는 다음과 같습니다.

  • 버퍼 바인딩 자동 처리 (사용자는 이전과 마찬가지로 열 수 있음)
  • :NextBuf:PrevBuf교체 :bn:bN탭의 일관된 상태를 유지하기 위해
  • :ListBuf버퍼 :ls가 탭으로 분리되어 있다는 것을 제외 하고 버퍼를 나열 할 수 있으며 기호는 사용자가 현재 탭을 쉽게 볼 수있게합니다.
  • :ChangeBuf 버퍼 번호 또는 버퍼 이름을 수락하여 버퍼 변경 및 탭 변경을 자동으로 수행
  • 버퍼 닫기는 :CloseBuf
  • 탭 닫기는 :CloseTab

다른 작업의 경우 사용자는 내장 기능 (예 :tabopen: :tabnext, 등) 을 사용할 수 있어야합니다 .

각 명령에 대해 일부 기본 매핑이 제공되며에 추가 let g:betterTabsVim_map_keys = 0하여 쉽게 비활성화 할 수 있습니다 .vimrc.

또한 명시적인 도움말 파일 ( :h betterTabs.txt) 을 만들려고했습니다 . 아직 완료되지 않았지만 사용자는 플러그인을 사용하기위한 최소값을 찾아야합니다.

플러그인이 네이티브 동작을 엉망으로 만들지 않기 위해 많은 테스트를 수행하고 있습니다.

마지막으로 누군가가 도움을 원한다면 항상 github 페이지 에서 문제 를 만들거나 풀 요청을 만들 수 있습니다.


1

이 플러그인을 확인하십시오. 그것은 당신의 요구에 완벽하게 맞는 것 같습니다. https://github.com/szw/vim-ctrlspace


실제로 VanLaser는 주석에서 언급했으며 처음에는 충분히 자세히 보지 않았지만 실제로는 좋은 것 같습니다. 지금 며칠 동안 시도해 왔습니다.
statox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.