버퍼를 사용하는보다 효율적인 방법은 무엇입니까?


13

최근에 사용중인 플러그인의 수를 대폭 줄 였으므로 내장 Vim 기능 만 사용하여 답변을 찾고 있습니다.

많은 버퍼를 편집 할 때 워크 플로에서 결함을 발견했습니다. 버퍼에 있고 이름을 기억하지 않고 다른 버퍼가 아닌 다른 버퍼로 전환하고 싶습니다. . 따라서 사용할 :b#수 없으며 명령으로 완료를 사용하는 :b것도 편리하지 않습니다.

이를 위해 다음을 수행했습니다.

  • :buffers열린 버퍼 목록을 얻는 데 처음 사용
  • 사용하려는 버퍼 수를 기억하십시오
  • Enter버퍼 목록을 닫으려면을 누르십시오.
  • 사용할 버퍼 번호 :bX와 함께 사용하십시오 X.

이 워크 플로우는 나에게 무거워 보였으므로 다음 줄을 추가했습니다 .vimrc.

" Improve the navigation in the buffers 
nnoremap <Leader><S-b> :B<CR> 
command! B call Buffers() 

function! Buffers() 
    execute "buffers" 
    let buffer=input("Enter a buffer:") 
    execute "b" . buffer 
endfunction 

이것은 :B함수 호출이 :buffers입력을 기다렸다가 마지막에 입력 을 호출 하는 명령 (및 매핑)을 제공합니다 :b.

잘 작동하지만 그러한 기능을 개발해야한다는 것에 놀랐습니다. 보통 Vim은 매우 효율적인 기본 워크 플로우를 가지고 있으므로 제외 된 것을 알지 못하는 버퍼로 전환하는 더 좋은 방법이 있는지 궁금합니다. 편집 세션에서 이미 열린 것처럼


3
나는 않습니다 :ls다음 :b#은 또한 궁금 대답?로 상당한 충분하지 않는 것 때문에 주석으로 (할 'LS'의 버퍼 목록에서 바로 갈 수 있습니다, 첫째 탈출 히트 반환해야 여부.) (게시 I 뭔가
빠졌고

2
@LindaJeanne : 내가 말했듯 :b#이 내가 원하는 것은 아니지만 예, :b누르지 않고 직접 입력하여 키 입력을 저장할 수 있다는 사실 enter은 흥미 롭습니다. (실제로는 대답하기에는 너무 가벼울 수도 있지만, 의견을
가질

LindaJeanne이 #문자를 리터럴 #문자가 아닌 (버퍼) 숫자의 스탠드 인으로 의미한다고 생각합니다 .
8bittree

답변:


12

많은 버퍼를 편집 할 때 워크 플로에서 결함을 발견했습니다. 버퍼에 있고 이름을 기억하지 않고 다른 버퍼가 아닌 다른 버퍼로 전환하고 싶습니다. . 따라서 사용할 :b#수 없으며 명령으로 완료를 사용하는 :b것도 편리하지 않습니다.

반대로 탭 완성이 매우 편리하다는 것을 알았습니다. 올바른 옵션을 자신에게 적합한 값으로 설정하면 많은 도움이 될 수 있습니다. 이들은 관련 라인입니다 vimrc (그들은 나를 위해 일하지만 그들은 당신을 위해 일하지 않을 수 있으므로 복사하지 마십시오) :

nnoremap ,b :buffer *
set wildmenu
set wildignore+=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=*/min/*,*/vendor/*,*/node_modules/*,*/bower_components/*
set wildignore+=tags,cscope.*
set wildignore+=*.tar.*
set wildignorecase
set wildmode=full

이를 통해 올바른 버퍼가 5-6 번 이상 키 스트로크되는 경우는 거의 없습니다.

탭 완성


이것은 :B함수 호출이 :buffers입력을 기다렸다가 마지막에 입력 을 호출 하는 명령 (및 매핑)을 제공합니다 :b.

배리 아서 (Barry Arthur)는 몇 년 전부터 훨씬 더 간단한 솔루션을 생각해 냈습니다.

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

몇 년 전에 약간 더 다양한 변형을 제안했습니다.

nnoremap gb :ls<CR>:b

gb


우리는 vim 스크립트를 이야기하고 있기 때문에, 여기에 내가 같은 명령과 같은 목록 오른쪽 명령 스텁으로하는 "자동 웁니다"명령 줄을 썼다 좋은 작은 기능입니다 :ls또는 :ilist. 위의 매핑에 비해 해당 기능의 장점은 특정 매핑을 기억할 필요가 없다는 것입니다. 그것은 Vim처럼 작동 하지만 약간 비틀어 집니다.

" smooth listing
cnoremap <expr> <CR> <SID>CCR()

function! s:CCR()
    if getcmdtype() == ":"
        let cmdline = getcmdline()
            if cmdline =~ '\v\C^(dli|il)' | return "\<CR>:" . cmdline[0] . "jump  " . split(cmdline, " ")[1] . "\<S-Left>\<Left>"
        elseif cmdline =~ '\v\C^(cli|lli)' | return "\<CR>:silent " . repeat(cmdline[0], 2) . "\<Space>"
        elseif cmdline =~ '\C^changes' | set nomore | return "\<CR>:sil se more|norm! g;\<S-Left>"
        elseif cmdline =~ '\C^ju' | set nomore | return "\<CR>:sil se more|norm! \<C-o>\<S-Left>"
        elseif cmdline =~ '\C^ol' | set nomore | return "\<CR>:sil se more|e #<"
        elseif cmdline =~ '\C^undol' | return "\<CR>:u "
        elseif cmdline =~ '\C^ls' | return "\<CR>:b"
        elseif cmdline =~ '/#$' | return "\<CR>:"
        else | return "\<CR>" | endif
    else | return "\<CR>" | endif
endfunction

ccr


즉, 나는 "파일 기반 탐색"에 대한 "기호 기반 탐색"의 큰 지지자입니다. 해당되는 경우 기호 기반 탐색은 파일 기반 탐색보다 훨씬 빠르고 경제적입니다.

마지막 GIF는 기호 기반 탐색의 한 가지 수단을 보여줍니다 . 예제는 어리석지 만…


나는 wild*옵션으로 충분히 연주하지 않았다고 생각 합니다. 내 방식으로 조정하려고합니다. Barry Arthur 솔루션에 대해서는 흥미로운 @ nobe4의 답변과 매우 비슷합니다. 마지막으로 CCR()함수를 실제로 살펴 보려면 더 자세히 살펴 봐야 하지만 유망합니다. 답변 주셔서 감사합니다.
statox

5
이 답변을 참조하십시오 . 특히 만화.
romainl

나는 확실히 이들 중 일부를 훔칠 것입니다!
statox

7

얼마 전에 같은 문제가 발생하여 해결책을 찾았습니다.

nnoremap <leader>b :buffers<CR>:buffer<space>

버퍼 목록을 열고 숨기지 않고 버퍼를 전환하는 옵션을 제공합니다.

Vim에 "list and select"옵션이없는 것이 합리적이라고 생각합니다.이 두 가지 작업입니다. 그러나 Vim은 명령을 결합 할만큼 강력합니다.

그것을 유닉스 철학으로 생각하십시오 : 한 가지 일을하고 잘하십시오.

:buffers버퍼를 나열하고 :buffer xxx하나를 선택할 수 있습니다.


1
그것은 내 질문에서 제안한 기능을 밝게하는 좋은 방법입니다.
statox

1
끝에 공간을 더 보이게하려면 다음을 수행하십시오. nnoremap <leader> b : buffers <CR> : buffer <Space> |
Tyler Durden

1

잠시 동안 나는 이런 식으로 nobe4의 기술을 사용했다.

nnoremap <Leader>b :set nomore<Bar>:ls<Bar>:set more<CR>:b<Space>

그런 다음 탭 완성을 사용하기 시작했습니다 (romainl이 제안한대로)

그러나 최근에는 키를 가장 적게 사용하는 가장 빠른 방법을 사용하는 것이 발견되었습니다 .

{count} CTRL-^

이것은 그렇게 다르지 :b#<Enter>않지만 말한 것처럼 버퍼 번호 를 알아야 합니다!

그래서 MiniBufExplorer 플러그인을 실행합니다 .이 플러그인은 맨 위에 파일 이름 목록을 표시합니다 (거의 다른 모든 편집기와 마찬가지로). 나는 많은 대안이 있다고 확신합니다.

마지막으로 Ctrl-^손가락에 약간의 스트레치가 있기 때문에 이것은 매우 일반적인 작업이므로로 이동했습니다 Ctrl-E. 그 구현 은 너무 복잡하지 않습니다.

nnoremap <C-E> :<C-U>call SwitchToBuffer()<CR>

function! SwitchToBuffer()
  if v:count > 0
    exec v:count . "b"
    return
  endif

  " Whatever you want to do if you didn't provide a count
  " In this case, fall back to nobe4's technique:
  call feedkeys(":ls\n:b ")
endfunction

따라서 현재 버퍼 전환 프로세스는 다음과 같습니다.

  1. MiniBufExplorer를보십시오
  2. 히트 3 Ctrl-E

슬프게도 MBE와 위의 스크립트는 요청 한대로 Vim 내장이 아닙니다. 구성이없는 원격 컴퓨터에있을 때 :b [partial]탭 완성을 사용합니다.

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