2012-01-12 2 views
4

vim에서는 파일이 현재 버퍼에 열려 있는지 확인할 수 있습니다 (bufexists). 짧은 파일 이름 (전체 경로가 아님)의 경우 bufexists(bufname('filename'))을 사용하여 파일이 열려 있는지 확인할 수 있습니다.VIM : 현재 탭에서 파일이 열려 있는지 확인하십시오. 창문?

파일이 에 열려 있는지 확인할 수있는 방법이 있습니까? 내가 그 정력에 작동하도록하는 방법을 잘 모르겠어요 ... 그러나,이 종류의 파이썬 의사의

:tabdo if bufnr(bufname('filename')) in tabpagebuflist(): echo "Yes" 

:

내 가장 가까운 해결 방법은 그런 짓을하는 것입니다. 내 목표는 외부의 AppleScript가 파일이 이미 열려 있는지 확인하고 그 파일의 행으로 이동하는 경우입니다.

이상적으로 다른 GUI 창에서도 검색 할 수 있기를 원하지만 다른 GUI 창으로 작업하는 것이 매우 어렵거나 불가능한 경우 (예 : Open vim tab in new (GUI) window?) 모았습니다.

답변

6

참을성이없고 좋은 문서가 나에게 잘 어울립니다. (크게 도움이 된 해결책은 Check if current tab is empty in vimOpen vim tab in new (GUI) window?입니다.) https://github.com/keflavich/macvim-skim

function! WhichTab(filename) 
    " Try to determine whether file is open in any tab. 
    " Return number of tab it's open in 
    let buffername = bufname(a:filename) 
    if buffername == "" 
     return 0 
    endif 
    let buffernumber = bufnr(buffername) 

    " tabdo will loop through pages and leave you on the last one; 
    " this is to make sure we don't leave the current page 
    let currenttab = tabpagenr() 
    let tab_arr = [] 
    tabdo let tab_arr += tabpagebuflist() 

    " return to current page 
    exec "tabnext ".currenttab 

    " Start checking tab numbers for matches 
    let i = 0 
    for tnum in tab_arr 
     let i += 1 
     echo "tnum: ".tnum." buff: ".buffernumber." i: ".i 
     if tnum == buffernumber 
      return i 
     endif 
    endfor 

endfunction 

function! WhichWindow(filename) 
    " Try to determine whether the file is open in any GVIM *window* 
    let serverlist = split(serverlist(),"\n") 

    "let currentserver = ???? 
    for server in serverlist 
     let remotetabnum = remote_expr(server, 
      \"WhichTab('".a:filename."')") 
     if remotetabnum != 0 
      return server 
     endif 
    endfor 

endfunction 

은 다음과 같이 사용에 출처는 :

#!/bin/bash 

file="$1" 
line="$2" 

for server in `mvim --serverlist` 
do 
    foundfile=`mvim --servername $server --remote-expr "WhichTab('$file')"` 
    if [[ $foundfile > 0 ]] 
    then 
     mvim --servername $server --remote-expr "foreground()" 
     mvim --servername $server --remote-send ":exec \"tabnext $foundfile\" <CR>" 
     mvim --servername $server --remote-send ":$line <CR>" 
    fi 
done 
: 명령 줄에서

exec "tabnext ".WhichTab('my_filename') 

echo remote_foreground(WhichWindow('my_filename')) 

또는 여기 WhichTab를 사용하여 파일의 특정 라인으로 이동하는 스크립트입니다

+1

잘 했어! +1 ..... – Rook

3

keflavich에게 답장을 보내고 싶지만 아직 할 수는 없습니다 ...

나는 milar 문제. gvim 내부에서 파일을 열 때 gvim --remote-tab-silent의 동작을 모방하려고합니다. 나는이 YourTab 스크립트를 발견했지만 특정 탭에 하나 이상의 창이 열려있을 때 문제가 발생했습니다. 탭 내부의 창을 분할하면 tabpagebuflist()에 의해 반환 된 버퍼가 두 개 이상 있으므로 목록에서 버퍼 번호의 위치를 ​​사용하는 방법이 작동하지 않습니다. 그 가능성을 설명하는 나의 솔루션이 있습니다.

" Note: returns a list of tabnos where the buf is found or 0 for none. 
"    tabnos start at 1, so 0 is always invalid 
function! WhichTabNo(bufNo) 
    let tabNos = [] 
    for tabNo in range(1, tabpagenr("$")) 
     for bufInTab in tabpagebuflist(tabNo) 
      if (bufInTab == a:bufNo) 
       call add(tabNos, tabNo) 
      endif 
     endfor 
    endfor 
    let numBufsFound = len(tabNos) 
    return (numBufsFound == 0) ? 0 : tabNos 
endfunction 

는 난 그냥 스칼라 0으로 평가됩니다 빈리스트가 될 것 tabNos를 반환 할 수 있다고 생각하지만, 나는 아직 vim 스크립트를 배워 동적 타이핑 행동의 내역과 그 편안하지 않다, 그래서 지금 그걸 좋아하지.

+1

좋은 물건. 저는 macvim-skim을 github로 옮겼습니다 : https://github.com/keflavich/macvim-skim. 그렇지 않으면 나중에 추가하겠습니다. – keflavich

+0

@ cpstubing06 - 코드를 약간 테스트 할 수 있도록 https://github.com/keflavich/macvim-skim/issues/1에서 문제를 업데이트 할 수 있습니까? 'WhichTab.vim'에 함수를 추가했지만 지금은 사용하지 않았습니다. – keflavich

관련 문제