vim에서 버퍼로 전환하는 가장 빠른 방법은 무엇입니까?


43

vim에서 버퍼를 선택하는 한 가지 방법은 표준 명령을 사용 :ls하거나 일부 외부 플러그인 / vimscript 코드를 사용하여 버퍼 목록 을 찾아서 창에서 목록을 찾아 보는 것 입니다.

가능한 한 빨리 버퍼로 직접 점프하고 싶다고 가정 해 봅시다.

순차 모드에서 버퍼 목록을 탐색하려면 이제 <C-J> <C-K>.vimrc에서 설정 한 바로 가기를 사용하십시오 .

" move among buffers with CTRL
map <C-J> :bnext<CR>
map <C-K> :bprev<CR>

다른 방법 (직접 액세스)은 번호전환 할 수 있습니다 . 버퍼 번호를 알고 있으면 버퍼 번호를 입력 한 후 바로 전환 할 수 <C-^>있습니다. 따라서 버퍼 번호 5로 전환하려면을 누릅니다 5<C-^>.

그러나 이것은 나를 위해 작동하지 않는 것 같습니다 (나는 이탈리아어 게스트 키보드 를 사용하여 Windows 게스트의 우분투 상자에서 vim 7.4를 사용합니다 ). 나는 때문에 그건 의심 ^문자가 대문자 키에 이탈리아 키보드에 도착하기 때문에 사실, ^나는 언론에 필요SHIFT-^

어떤 아이디어?


2
<c-6>대신에 를 누를 수 있습니까 <c-^>?
Peter Rincker

버퍼 번호 1로 가라는 Ctrl-1을 의미합니까? 불행히도 작동하지 않습니다. 아무 일도 일어나지 않습니다
Giorgio Robino

1
아니오. 일부 단말기는 미국 키보드의 Ctrl- ^와 동일한 Ctrl-6을 이해할 수 있습니다.
Peter Rincker

2
+1 좋아요, 작동합니다! 이탈리아어 키보드 레이아웃을 사용합니다 (퍼티 터미널 에뮬레이터 사용). 그래서 : 1<C-6>숫자 1. 감사 버퍼 switchs!
Giorgio Robino 2012

CtrlSpace 사용을 시도 할 수 있습니다 .
Hongbo Liu

답변:


51

:b명령은 또한 이동하려는 버퍼 파일 이름의 하위 문자열 을 사용할 수 있으므로 매우 편리합니다.

예를 들어, 세 개의 버퍼가있는 경우 foo, bar그리고 baz다음,

  • :b barbar파일로 전환 됩니다.

  • :b ofoo파일로 전환 됩니다.

  • :b a당신에게 오류를 줄 것이다 그것은 의미 할 수 중 하나 때문에 barbaz,하지만 당신은 예를 들어 더 구체적으로 이름을 수정할 수 있습니다 : r Enter.

이것은 대신에 의미가 있기 때문에 매우 유용 할 수 있습니다

:buffer very/very/long/path/to/a/veryVeryLongFileName.txt

당신은 같은 것을 할 수 있습니다

:b LongFileName

훨씬 짧고 쉽습니다.

이 명령을 사용하려면이 명령에 숫자를 사용할 수도 있습니다.

:b 5

8
부분 버퍼 이름 사용에 대한주의 사항 : 일부 버퍼 경로에서 단어 경계의 시작 부분에 부분 버퍼 이름이 표시되면 :b명령 을 통해 단어 중간에 부분 이름이있는 버퍼에 액세스 할 수 없습니다 . 예를 들어, 두 개의 버퍼가 있으면 path/to/foo및 의 단어가 시작될 path/to/tofu때 명령 :b f<Tab>이 일치 하므로 명령 이 절대 일치하지 않습니다 . path/to/tofupath/to/foo
tommcdo

2
:5b다음 약간 짧은 :b 5 ;-)
joeytwiddle

15

이것이 내가 사용하는 것입니다 :

nnoremap <Leader>b :ls<CR>:b<Space>

이제를 누르면 사용 가능한 버퍼\b나열 되고 준비 :b됩니다.

그런 다음 버퍼 번호 를 입력하고 Enter를 누르십시오.

또는 filename의 일부를 입력하고 Enter를 누르십시오. (그러나 일반적으로 Enter 키를 누르기 전에 Tab 키를 누르면 올바른 버퍼가 있는지 확인합니다. 그렇지 않으면 원하는 버퍼를 얻을 때까지 Tab 키를 사용하여 계속 순환합니다.)


실제로 위의 약간 수정 된 버전을 사용합니다.

nnoremap <C-e> :set nomore <Bar> :ls <Bar> :set more <CR>:b<Space>

이렇게하면 방지 할 수 있습니다 -- More --당신이 그들을 표시 가능 라인보다 더 많은 버퍼가있을 때 나타나는 프롬프트를.

그러나 일반적으로 'more'옵션을 비활성화하면이 매핑은 실제로 'more'작업을 마친 후에 옵션을 다시 활성화하기 때문에 성가 시게됩니다 ls!


1
사실, 나는 실제로 그중 하나를 사용하지 않고, 내 자신의 작은 플러그인 을 사용하지만 기능은 매우 유사합니다. 플러그인을 사용하면 열지 않은 버퍼의 파일 이름에 대해 탭 완성을 수행 할 수도 있습니다.
joeytwiddle

1
이 기술은 [count]<C-^>버퍼 번호를 알 때 사용하는 것만 큼 빠르지 는 않지만 알지 못할 때 매우 유용합니다.
joeytwiddle

2
메모 해 주셔서 감사합니다 joeytwiddle. 최대한 빨리 플러그인을 확인하겠습니다. 필자의 경우 (위의 키보드 문제 참조) [count]<C-6>알려진 버퍼로 전환하는 가장 빠른 방법 인 것
같습니다.

네, [count]<C-^>요즘 도 사용 하고 있습니다. 그러나 이것은 버퍼 번호가 무엇인지 알기 위해 MiniBufExplorer 또는 이와 유사한 것을 실행해야한다는 것을 의미합니다!
joeytwiddle

<CR>과 <SPACE>가 왜 필요한가요? 처음에는 마치 마치 그들 없이도 잘 작동하는 것처럼 보입니다.
Felix Crazzolara

9

:CtrlPBuffer플러그인 CtrlP에서 (4k ★)

이 플러그인의 주요 특징은 시각적 피드백을 통해 다른 버퍼를 편리하게 열 수 있도록 퍼지 매칭 을 제공하는 것 입니다.

로 퍼지 버퍼 목록을 열거 나을 :CtrlPBuffer누른 <C-p>다음을 눌러 <C-b>모드를로 변경하십시오 buffer.

열려는 버퍼를 지정하기에 충분한 수의 문자를 입력하십시오.
당신은 또한 사용할 수 있습니다 <C-j><C-k>순환 목록을 수동으로 버퍼를 선택합니다.

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

커스터마이징

로 버퍼 목록을 즉시 열 <C-p>려면 vimrc에 다음 행을 추가하십시오.

let g:ctrlp_cmd = 'CtrlPBuffer'

<C-f/b>ctrlp 창의 모드를 전환하는 데 사용할 수 있습니다 .

나는 개인적으로 사용 let g:ctrlp_cmd = 'CtrlPMRU'합니다. 가장 최근에 사용한 (mru) 목록에는 열린 버퍼도 포함됩니다. 다른 ctrlp 모드를 사용하고 마지막 모드를 고수하려는 경우을 설정할 수 있습니다 let g:ctrlp_cmd = 'CtrlPLastMode [--dir]'.

비슷한 플러그인

퍼지 일치와 대화식 프롬프트와 함께 버퍼 목록을 제공하는 플러그인이 더 있습니다.

어두운면과 밝은면

(즉, 플러그인이 많은 vim 설정과 vim 방식)

보다 복잡한 플러그인을 사용하기로 결정하기 전에 @Doorknob@joeytwiddle 의 답변을 연구하십시오 . 특히, 하나의 라이너가 이미 귀하의 요구를 충족시키는 지 확인하십시오.

  1. nnoremap <Leader>b :b <C-d>
  2. nnoremap <Leader>b :ls<Cr>:b<Space>

버퍼 전환을 위해 플러그인을 설치하는 것은 과도 할 수 있습니다. https://www.vi-improved.org/recommendations 의 설명 과 Drew Neil의 '톱을 갈 때' 기사 도 참조하십시오 .


예 Hotschke, 자주 사용한다고 고백합니다 : CtrlPBuffer
Giorgio Robino

나는 map <leader>a <ESC>:CtrlPBuffer<CR><CR>이전에 열린 버퍼로 점프하는 데 사용 하고 있습니다 <leader>a( <leader>b버퍼 목록을 여는 동안 )
Rolf

@Rolf : 아시나요 <C-^>(= <C-6>)? 참조하십시오 :h CTRL-^. Afaik, 이것은 당신의 매핑이하는 <leader>a것처럼 보입니다. 따라서 사람들이 플러그인을 사용하면 vim이 이미 자체적으로 수행 할 수있는 작업을 모르는 vim 사용자로 이어질 수 있다고 말하는 이유를 예를 들었습니다.
Hotschke

@Hotschke : 아니요, 몰랐습니다. 알고 배운 것, 감사합니다! 그래도 <C-^>을 다시 매핑하겠습니다.
Rolf

바닐라 Vim을 사용한 <Cd>에 ​​대한 우수한 참조. 다른 곳에서는 그 참조를 보지 못했습니다.
radke

8

joeytwiddle 및 Doorknob의 유용한 답변 외에도 :b#가장 최근에 사용한 버퍼로 전환되는을 잊지 마십시오 . 또한 그냥 할 수도 있습니다 <C-^>. 버퍼가 많고 지속적으로 전환 할 때 가장 최근의 버퍼는 일반적으로 가장 일반적인 대상입니다.

개인적으로 나는 많은 방법의 조합을 사용합니다. 나는 주로 두 개의 버퍼와 함께 일하고 나머지는 단지 가끔 참조를 위해 열 때, 나는 그들 사이를 전환하는 경향이있다 :b#<C-^>. 더 많은 작업을 수행하고 더 자주 전환해야하는 경우 숫자 (joeytwiddle 팁에서와 같이) 또는 이름의 일부 (Doorknob 팁에서와 같이)를 TAB과 함께 사용하여 완성합니다. 이름이 혼란스럽고 많은 버퍼가 열리면 (보통 10 개 이상) Ctrl-P 플러그인을 더 자주 사용합니다 ( https://github.com/kien/ctrlp.vim ) 두 번의 빠른 키 입력으로 그들 모두와 나는 그들에 대한 강력한 퍼지 검색을 사용하여 내가 원하는 것을 빨리 찾을 수 있습니다.


2
<C-^> 단독 (Peter Rincker가 제안한대로 <C-6>)은 단 두 개의 버퍼의 경우에 좋은 트릭입니다 :-)
Giorgio Robino

5

[b]b플러그인에서 vim-unimpaired(> 2K ★)

설치 한 vim-unimpaired경우 다음을 사용할 수 있습니다.

  • [b( :bp[revious])
  • ]b( :bn[ext])

열린 버퍼를 순환하는 데 사용됩니다. 동일한 명령에 대해 더 중요한 매핑을 정의 할 필요가 없습니다. 또한 첫 번째 버퍼와 마지막 버퍼로 점프 할 수 있습니다.

  • [B( :bf[irst]) 및
  • ]B( :bl[ast]).

있습니다 더 브라켓 매핑 충분히 에 포함 된 vim-unimpaired유용한 찾을 수있는가. 그들은 모두 같은 계획을 따르기 때문에 쉽게 암기 할 수 있습니다.

어두운면과 밝은면

이 플러그인은 가볍고 '비해'로 간주 될 수 있습니다. 그것은에 의해 표시된다 #vim 사회 는 "해가되지 않는다"플러그인으로.


+1 또한 카운트를 제공 할 수 있습니다. 3[b3 개의 버퍼를 다시 점프합니다.
joeytwiddle

1

현재 <Leader>+ number키를 사용 하여 전환하고 있습니다. 리더 키는 내 <space>열쇠입니다. 또한 vim-airline 을 사용 하여 창 위에 버퍼 nr을 표시합니다.

" airline settings
let g:airline#extensions#tabline#buffer_nr_show = 1
let g:airline#extensions#tabline#enabled = 1

bufnr이 종종 10을 초과하는 동안 내 매핑을 조정 number하여 일치하는 경우 버퍼를 즉시 전환하십시오. 그렇지 않으면 더 많은 숫자 입력 또는 <space>키를 기다렸다가 확인하십시오.

nnoremap <expr> <Leader>1 tweak#wtb_switch#key_leader_bufnum(1)
nnoremap <expr> <Leader>2 tweak#wtb_switch#key_leader_bufnum(2)
nnoremap <expr> <Leader>3 tweak#wtb_switch#key_leader_bufnum(3)
nnoremap <expr> <Leader>4 tweak#wtb_switch#key_leader_bufnum(4)
nnoremap <expr> <Leader>5 tweak#wtb_switch#key_leader_bufnum(5)
nnoremap <expr> <Leader>6 tweak#wtb_switch#key_leader_bufnum(6)
nnoremap <expr> <Leader>7 tweak#wtb_switch#key_leader_bufnum(7)
nnoremap <expr> <Leader>8 tweak#wtb_switch#key_leader_bufnum(8)
nnoremap <expr> <Leader>9 tweak#wtb_switch#key_leader_bufnum(9)




func! tweak#wtb_switch#key_leader_bufnum(num)
    let l:buffers = tweak#wtb_switch#buflisted()
    let l:input = a:num . ""

    while 1

        let l:cnt = 0
        let l:i=0
        " count matches
        while l:i<len(l:buffers)
            let l:bn = l:buffers[l:i] . ""
            if l:input==l:bn[0:len(l:input)-1]
                let l:cnt+=1
            endif
            let l:i+=1
        endwhile

        " no matches
        if l:cnt==0 && len(l:input)>0
            echo "no buffer [" . l:input . "]"
            return ''
        elseif l:cnt==1
            return ":b " . l:input . "\<CR>"
        endif

        echo ":b " . l:input

        let l:n = getchar()

        if l:n==char2nr("\<BS>") ||  l:n==char2nr("\<C-h>")
            " delete one word
            if len(l:input)>=2
                let l:input = l:input[0:len(l:input)-2]
            else
                let l:input = ""
            endif
        elseif l:n==char2nr("\<CR>") || (l:n<char2nr('0') || l:n>char2nr('9'))
            return ":b " . l:input . "\<CR>"
        else
            let l:input = l:input . nr2char(l:n)
        endif

        let g:n = l:n

    endwhile
endfunc

func! tweak#wtb_switch#buflisted()
  return filter(range(1, bufnr('$')), 'buflisted(v:val)')
endfunc

코드는 여기 에서 붙여 넣 습니다

그런데, 나는 또한 사용 <S-h>하고 <S-l>대한 :bp:bn, 또는 :tabp:tabn하나 이상의 tabpage가 현재 열려있는 경우. 나에게는 매우 직관적입니다.


1

요즘 [buffer_number]<Ctrl-^>에는 버퍼가 매우 빠르기 때문에 버퍼를 전환 하는 데 사용 하고 있습니다.

그러나 버퍼 번호를 아는 방법은 무엇입니까? MiniBufExplorer를 사용 하므로 Vim의 맨 위에 항상 버퍼 번호가 표시됩니다.

<C-^>한 손으로 도달 하기 가 약간 어렵 기 때문에 다음 매핑도 사용합니다 .

:nmap <C-E> <C-^>

설정이없는 최신 머신에서는 :b [part_of_filename]<Tab><Enter>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.