2012-01-15 64 views
2

vi(vim)和emacs之間的主要區別之一是emacs的設計和應該在沒有退出的情況下運行,在給定vim的快速加載時間的情況下,更容易退出並開始編輯任務。我讀到這已經成爲這兩位編輯用戶的文化差異。改變退出並打開vi(vim)編輯器的做法?

我傾向於認爲保持編輯器始終處於運行狀態,有助於提高生產力,因爲您知道某些事情正在進行中,您無需重新開始。您發現運行單個vim會話並從中執行所有任務的最佳技巧和插件是什麼?

例如,我編輯Python程序,然後退出運行appengine appcfg並返回。有時退出當前文件打開另一個文件。我還沒有習慣緩衝區和標籤的概念,而是在我的屏幕會話中運行vim,如果我想編輯多個文件。

+2

不要關閉vim ... – aqua 2012-01-15 01:42:52

+0

打開另一個? Doe沒有幫助。 – 2012-01-15 01:43:39

+2

如何在屏幕會話內運行vims編輯多個文件?您仍然一次編輯一個文件!在詢問插件之前,你應該真的嘗試學習緩衝區和標籤。 – 2012-01-15 01:44:01

回答

7

所以你運行一個文件VIM每個屏幕會話?這聽起來很不好。你並不需要任何特殊的插件來輕鬆地在Vim中使用多個文件。只要做到

:e /home/project/myfile.py 

我在.vimrc自動改變當前的工作目錄到任何緩衝區是當前活動設置autochdir。所以一旦你有一個文件打開,你可以做

:e myfile2.py 
:e myfile3.py 

等BTW打開Vim中的任何文件可以用tab鍵完成竣工所以一定要確保你正在做的。一旦你有一堆打開的緩衝區的切換之間我只是做

:b myfile1.py 

,您也可以使用製表符完成你可以只輸入:b 1並按下Tab鍵,它會找出你想要myfile1.py開放所以它是超如果您可以記住一般文件名,並且如果有多個類似的匹配項,它會給你一個你可以選中的列表。爲此,我還建議看看wildmodewildmenu設置,看看你更喜歡什麼,他們會給你增強的標籤頁完成菜單。如果在任何時候你開始你要看看你能緩衝區被打開什麼,什麼迷路只是做

:ls 

,它會告訴你一切開放。

還記得可以通過一個命令之前與!

:!ls 

例如運行外部命令。希望這有助於或至少讓你朝着正確的方向前進。

+0

感謝您的提示。我不知道:e標籤完整功能。無論我做什麼:e,我必須在文件系統中查找文件,並且在vim中導航文件系統很麻煩。有時我用:探索或:Sexplore – 2012-01-16 02:16:42

+0

看看插件NERDTree和FuFBuffer。 – 2012-01-17 23:51:12

+1

@ ThePosey,我現在開始更有效地使用緩衝區了。非常感謝這些話題。使我成爲一個更好的vim用戶。 – 2012-02-10 01:24:50

1

只需使用:!命令在shell中運行內容。它與:cd%擴張混合偉大

bash> vim path/to/ex.c 
... 
:cd %:h. " move to path/ex/ 
:!gcc -o %:r % && %:r " compile ex.c into ex and run it 

您還可以:read,如果你想要把一個命令的輸出當前緩衝區混吧:

:read !ls " read in the names of all the files in the current directory 
3

可以使用甚至下降到一個shell:sh和然後使用shell中的exit返回Vim。要在同一Vim中編輯多個文件,可以使用:vsplit文件名或:split文件名(用於垂直和水平分割),然後使用Esc + Ctrl + w +箭頭鍵在不同分割之間導航。這樣你就不需要標籤。如果您正在處理一小段代碼,則工作得特別好。

5

一切別人加三說:

  • 隨着set hidden可以取代當前的打開一個新的緩衝區,即使它不保存。你可以打開幾十個這樣的緩衝區,不需要關閉Vim!見:help windowsVimwiki

  • 假設Vim編譯時使用了正確的標誌(+clientserver),您可以讓一個Vim作爲「服務器」(在終端窗口A中)運行,並在該單個Vim中打開所有文件(從終端窗口B) 。它分兩步進行:

    1. $ vim --servername WHATEVER啓動Vim
    2. $ vim --remote file.js打開一個文件

    你的文件在Vim中打開的終端窗口,你還有你的終端櫥窗內的提示。

  • 請勿觸摸標籤頁。他們錯誤地命名,並不像標籤一樣工作。

+0

+1不使用標籤。我無法得到它。我從它發佈的時候就開始關注它了。它只是一個PITA,與終端中的Firefox或標籤中的標籤相比。感謝servername和遠程命令,我認爲它們非常有用。我將讀取緩衝器的概念,因此將能夠在不保存緩衝區的情況下進行切換。我認爲你的問題是對的! :) – 2012-01-16 02:20:03

+0

yeah標籤是非常沒有價值一旦你得到的基礎知道了 – ThePosey 2012-01-16 23:44:03

1

如果我正在從控制檯vim的(我在Linux上做的,因爲我使用ssh獨家),然後我經常用CTRL-Z暫停活力。然後做我的外殼的東西和fg返回到vim。

在vim中使用ctags非常有用 - help tags欲瞭解更多信息。

我使用了一個相當強大的perforce插件:http://www.vim.org/scripts/script.php?script_id=240。差異支持令人驚歎,因爲您可以循環瀏覽所有打開的文件,或查看兩個較舊版本之間的文件歷史記錄和差異。嘗試:PVDiff:PFilelog:POpened

我爲諸如搜索和緩衝窗口操作之類的東西定義了很多宏。我在這裏列出了一些有趣的宏/函數,它們幫助我生活在vim中。


剪貼板:

let mapleader="," 
" put from clipboard 
nmap ,p "*p 
" yank to clipboard 
nmap ,y "*y 

標籤:

" jump to tag in other window 
map t :call TagJumpOtherWindow()<cr> 
function! TagJumpOtherWindow() 
    let cw = expand("<cword>") 
    winc p 
    exec "tjump " . cw 
    let @/ = cw 
    normal z. 
    winc p 
endfunction 

劃痕:

let mapleader="," 
nmap ,x0 :e e:/work/scratch0.txt<CR> 
nmap ,x1 :e e:/work/scratch1.txt<CR> 
nmap ,x2 :e e:/work/scratch2.txt<CR> 
nmap ,x3 :e e:/work/scratch3.txt<CR> 
nmap ,x4 :e e:/work/scratch4.txt<CR> 
nmap ,x5 :e e:/work/scratch5.txt<CR> 
nmap ,x6 :e e:/work/scratch6.txt<CR> 
nmap ,x7 :e e:/work/scratch7.txt<CR> 
nmap ,x8 :e e:/work/scratch8.txt<CR> 
nmap ,x9 :e e:/work/scratch9.txt<CR> 

IDE:

function! GetMsdevFile(line) 
    let mx = '^\s*\([a-zA-Z_/\.0-9:\- ]*\)' 
    let line = matchstr(a:line, mx) 
    let file = substitute(line, mx, '\1', '') 
    let file = substitute(line, '\\', '/', '') 
    return file 
endfunction 

function! GetMsdevLineNumber(line) 
    let mx = '^\s*\([a-zA-Z_/\.0-9:\- ]*\)(\(\d\+\))' 
    let line = matchstr(a:line, mx) 
    let linenumber = substitute(line, mx, '\2', '') 
    return linenumber 
endfunction 

function! GetMsdevFile2(line) 
    let file = expand("%:p:h") . "/" . GetMsdevFile(a:line) 
    let file 
    return file 
endfunction 

function! GetMsdevFile2(line) 
    let file = expand("%:p:h") . "/../" . GetMsdevFile(a:line) 
    let file 
    return file 
endfunction 

function! GotoMsdevMake(thiswin, version) 
    exec "cd ".$DIRECTORY."\\.." 
    let l = getline(".") 
    if a:version==0 
     let file = GetMsdevFile(l) 
     let linenumber = GetMsdevLineNumber(l) 
    elseif a:version==1 
     let file = GetMsdevFile2(l) 
     let linenumber = GetMsdevLineNumber(l) 
    else 
     let file = GetMsdevFile3(l) 
     let linenumber = GetMsdevLineNumber(l) 
    endif 
    if a:thiswin==1 
    winc p 
    endif 
    exec "e +" . linenumber. " " . file 
    exec "cd -" 
endfunction 

function! GetGCCFile(line) 
    let mx = '^\([a-zA-Z_/\.0-9:\- ]*\):[0-9]\+: .*' 
    let line = matchstr(a:line, mx) 
    let file = substitute(line, mx, '\1', '') 
    let file = substitute(file, '\\', '/', '') 
    return file 
endfunction 

function! GetGCCLineNumber(line) 
    let mx = '^\([a-zA-Z_/\.0-9:\- ]*\):\([0-9]\+\):.*' 
    let line = matchstr(a:line, mx) 
    let linenumber = substitute(line, mx, '\2', '') 
    return linenumber 
endfunction 


function! GotoGCCMake() 
    exec "cd ".$DIRECTORY."\\.." 
    let l = getline(".") 
    let file = GetGCCFile(l) 
    let linenumber = GetGCCLineNumber(l) 
    winc p 
    exec "e +" . linenumber. " " . file 
    exec "cd -" 
endfunction 

function! MakeOut(filename) 
    exec ":e " . a:filename 
    call MakeBuffer() 
    normal zz 

endfunction 

" use the current buffer into a Visual Studio build output buffer to jump to errors 
function! MakeBuffer() 
    normal! gg 
    exec "/).*error\\|failed" 
    nnoremap <buffer> <cr> :call GotoMsdevMake(1, 0)<cr> 
    nnoremap <buffer> :call GotoMsdevMake(1, 1)<cr> 
    nnoremap <buffer> o :call GotoMsdevMake(1, 1)<cr> 
    " nnoremap <buffer> :call GotoMsdevMake(0, 0)<cr> 
endfunction 

" use the current buffer into a GCC build output buffer to jump to errors 
function! MakeGCCErr() 
    normal! gg 
    exec "/: error:" 
    nnoremap <buffer> <cr> :call GotoGCCMake()<cr> 
    nnoremap <buffer> :call GotoGCCMake()<cr> 
    nnoremap <buffer> o :call GotoGCCMake()<cr> 
endfunction 

function! MakeGCCOut(filename) 
    exec ":e " . a:filename 
    call MakeGCCErr() 
endfunction 

nmap ,mr :call MakeOut("e:/perforce/branch/obj/release/BuildLog.htm")<cr> 
nmap ,md :call MakeOut("e:/perforce/branch/obj/debug/BuildLog.htm")<cr> 
nmap ,mm :call MakeBuffer()<CR> 
nmap ,mq :call MakeGCCErr()<cr> 
+0

'CTRL-z'和'fg'技巧是非常有用的。 – 2012-01-18 05:26:55

0

我把一個VIM窗口打開天的時間。分屏窗口在大屏幕上非常好用。 我也喜歡標籤;我將選中的單個項目集中在一個選項卡中,但保留其他選項卡用於我的日程安排,我的vim wiki,臨時備忘錄,供我中斷時使用。我發現標籤比多個窗口更容易使用。