2012-01-12 6 views
4

vimでは、ファイルが現在のバッファで開かれているかどうかをbufexistsで確認することができます。短いファイル名(フルパスではない)の場合は、ファイルが開かれているかどうかをbufexists(bufname('filename'))で確認できます。VIM:ファイルが現在のタブで開いているかどうかを確認しますか?窓?

タブでファイルが開いているかどうかを確認する方法はありますか?私はvimの中で動作するように取得するかどうかはわかりません...しかし、それは一種の神託の擬似コードだ

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

私の最も近い問題を回避するには、のような何かを行うことです。私の目標は、外部のAppleScriptがファイルがすでに開いているかどうかを確認し、もしそうなら、そのファイルの行に移動することです。

理想的には、別のGUIウィンドウでも検索することができますが、別のGUIウィンドウで作業することはVIMでは非常に難しい/不可能です(例: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 

であるそのようにのように使用します。

exec "tabnext ".WhichTab('my_filename') 

echo remote_foreground(WhichWindow('my_filename')) 

または、コマンドラインから、ここWhichTabを使用してファイルの特定の行に移動するためのスクリプトです:

#!/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 
+1

良い仕事! +1 ..... – Rook

3

私はkeflavichに返信したいと思いますが、まだできません...

私はsi私がgvimの中のファイルを開くときにgvim --remote-tab-silentの動作を模倣したいと思っていました。私はあなたのこのWhichTabスクリプトを見つけましたが、任意のタブに複数のウィンドウが開いているときに問題に遭遇しました。タブ内でウィンドウを分割すると、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を返すことができると思うが、私はまだvimscriptを学び、その動的型付けの行動の詳細とその快適ではないですので、私今のようにそれを残している。

+1

良いもの。私はmacvim-skimをgithub:https://github.com/keflavich/macvim-skimに移動しました。これをPRとして追加したい場合に備えてください。後でそれを追加してみます。 – keflavich

+0

@ cpstubing06 - あなたのコードを少しテストできるように、https://github.com/keflavich/macvim-skim/issues/1で問題をアップデートできますか? 'WhichTab.vim'に関数を追加しましたが、現在は使用されていません。 – keflavich

関連する問題