2011-03-14 42 views
3

有一些優秀的Vim插件用於通過鍵入部分名稱來切換到特定的filebuffer。有誰知道這樣的插件可以在打開的窗口之間快速切換嗎?按名稱切換到VIM窗口

例如,如果我有一個名爲'a.txt'的文件在另一邊,'b.txt'在另一個文件夾中,我想通過輸入文件名來切換它們(或者只是'a'或'b'增量搜索)。這對於兩個窗口來說可能不是很有用,但我通常最多打開5個窗口,所以使用正常的導航按鈕在它們之間切換可能會很痛苦。

WinWalker似乎支持這種類型的功能,但包裝在一個更大的窗口導航框架內。

+1

你真的看所有的窗口在同一時間?使用內置的':b部分文件名'可以讓你遠離,我更喜歡使用那個(實際上我使用標籤大多),而不是有太多的窗口。有時它是應該適應我們的程序,有時它是我們對他們:) – 2011-03-14 22:11:29

+0

(不,我不知道你的問題的答案,只是想縮小一點) – 2011-03-14 22:11:47

+0

好吧,我經常打開兩個文件同時,這些通常會分成兩部分,這樣我可以在處理另一部分時參考文件的某些部分。然後我有另一個窗口顯示我的標籤,然後是一個文件樹。 – 2011-03-14 22:47:34

回答

1

我不知道如何切換到基於文件名的窗口,但我使用以下快捷方式在我的.vimrc中在窗口之間移動。

noremap <S-W> <C-w><Up> 
noremap <S-S> <C-w><Down> 
noremap <S-A> <C-w><Left> 
noremap <S-D> <C-w><Right> 

這些都很簡單,我沒有超過4個窗口打開,所以我從來沒有超過2個窗口從任何窗口移動。另外,你不要必須鍵入文件名。

我使用標準的FPS移動鍵wasd在窗口間移動,因爲它對我來說很直觀,我不必將手指移動到方向鍵上 - 小指在班次上,其他三種在字母上。你可以改變他們,無論你是舒服(hjkl將是一個不錯的替代)

我更喜歡使用Shift而不是Ctrl/Alt/Option/Cmd因爲位置和大小的鍵盤之間的變化(例如,Fn是在MacBook Pro上的最左邊,而Ctrl是完整的Mac鍵盤上最左邊的),而且我在Linux上遇到了vim問題,但沒有識別出Cmd密鑰。

+4

因爲'W','S','A不需要使用' ','D'應該可以正常工作。並且使用'nnoremap':1)在操作員掛起模式下你不需要這種行爲,並且在視覺和選擇模式下可能也不需要它; 2)你不知道op沒有將''重新映射到窗口處理以外的東西。 – ZyX 2011-03-15 05:01:32

+0

沒錯。現在它的方式,你不需要''是窗口移動的默認值。如果OP重新映射了它,那麼他/她應該相應地進行調整。 – abcd 2011-03-15 05:56:28

+0

M.但是如果你在'map'之前加上'nore',那麼無論OP是否已經重映射,你都可以使用你的解決方案。而且建議調整是不好的:用這種方法你可能會得到相互依賴的地圖,因此刪除或更改其中一個地圖會導致調試失敗。 – ZyX 2011-03-15 16:47:28

0

我建議使用Command-T插件。它爲當前文件夾(及其子文件夾)中的文件編制索引,並允許您鍵入文件名的一部分以將其打開。在我的.vimrc中,我還添加了這個鏈接:

nnoremap <S-F12> :CommandT<CR> 

這樣我按下Shift-F12並輸入文件名將其打開。

希望有所幫助。

+0

我鏈接到原始帖子中的CommandT。這絕對是非常有幫助的(也是使我想要這個功能的一部分),但是這是爲了將文件加載到特定的緩衝區中,而不是改變到另一個現有的窗口。 – 2011-03-15 17:46:55

+0

是的,對,但與你有什麼不同?我曾經在開始時就這麼想,但是當我問自己時,通過緩衝區列表打開緩衝區和通過文件列表打開緩衝區有什麼區別,它將打開緩衝區,因爲緩衝區已打開?不要完美主義者:-) – Rafid 2011-03-17 05:06:09

0

這使用python api,所以你只能在vim中使用它,但我確定有人喜歡vim腳本可以很容易地轉換它。

使用方法如下:

:WSeek win 
:WSeek READ 
:WSeek README 
:WSeek a. 
etc. 

沒有自動完成我害怕。對不起〜

" Call using: 
" :source window-swap.vim or put in plugins dir 

function! WSeek(target) 
    if !has('python') 
    echo "Error: this plugin requires vim with +python" 
    finish 
    else 
python << EOF 

import vim 

target = vim.eval("a:target") 
found = False 
for i in range(0, len(vim.windows)): 
    vim.command(str(i+1) + "wincmd w") 
    bits = vim.current.buffer.name.split("/") 
    bits = bits[-1] 
    if (bits.startswith(target)): 
    found = True 
    break 

# Go back to the start on no match 
if not found: 
    vim.command("1wincmd w") 

EOF 
    endif 
endfunction 

command! -nargs=1 WSeek :call WSeek(<q-args>) 
+1

奇怪的命令:'vim.command(「exe 1。\」wincmd w \「」)''。在這裏不需要做eval:'vim.command(「1wincmd w」)''。 – ZyX 2011-11-30 21:05:13

+0

同上:'vim.command(str(i + 1)。「wincmd w」)'。你實際上做了什麼等於'執行「執行」。(i + 1)。「。\」wincmd w \「」'。看起來很奇怪,不是嗎? – ZyX 2011-11-30 21:07:13

+0

^_ ^!哦,是的,好點。解決方案編輯,以反映@ZyX的迷人。 :) – Doug 2011-12-01 03:47:33

3

:b這是否愉快,如果你有:setswitchbuf+=useopen (在vimrc)。它支持文件名稱completion,例如與Ctrl - D

通過MarcWeber等人從#vim

0

@Aaron托馬的回答與switchbuf+=useopen我沒有工作。實際上文檔沒有提及該設置是由:b命令支持的。

我用下面的代碼片段:

let windowNr = bufwinnr(pattern) 
if windowNr > 0 
    execute windowNr 'wincmd w' 
endif 

See bufwinnr()