最后更新于 .

前言: 用vim也有幾年了,從windows開發到Linux,從在校大學生到在職員工,始終想為這個過程記錄點什么,為一直陪伴自己的vim,也為自己。

之前在百度貼吧混跡過,結果發的代碼全被判定為非法字符,于是打消了在百度發展的計劃,而只在上面留了一個QQ號碼,結果問問題的人卻絡繹不絕,我想也許,是該開個博客,不敢說教授,就是分享一下自己的經驗吧,希望對感興趣的各位有所幫助。

這是這個博客的第一篇日志,所以就寫個Vimer們經常會遇到的一個需求吧----一鍵編譯單個源文件。ps:本站所有文章都是直接通過vim編寫的哦。

具體功能如下:

1.按F5編譯單個文件,支持C,C++,C#,也可以支持java。

2.獲取編譯器錯誤描述,在錯誤描述上回車,可以直接跳轉到錯誤行。

先貼上代碼,可以看出,我把C#相關的注釋掉了,實際上C#也是支持的,只是后來由于不再做C#相關開發,有需要的朋友可以去掉注釋,還是可以編譯C#的。

"單個文件編譯
map <F5> :call Do_OneFileMake()<CR>
function Do_OneFileMake()
    if expand("%:p:h")!=getcwd()
        echohl WarningMsg | echo "Fail to make! This file is not in the current dir! Press <F7> to redirect to the dir of this file." | echohl None
        return
    endif
    let sourcefileename=expand("%:t")
    if (sourcefileename=="" || (&filetype!="cpp" && &filetype!="c"))
        echohl WarningMsg | echo "Fail to make! Please select the right file!" | echohl None
        return
    endif
    let deletedspacefilename=substitute(sourcefileename,' ','','g')
    if strlen(deletedspacefilename)!=strlen(sourcefileename)
        echohl WarningMsg | echo "Fail to make! Please delete the spaces in the filename!" | echohl None
        return
    endif
    if &filetype=="c"
        if g:iswindows==1
            set makeprg=gcc\ -o\ %<.exe\ %
        else
            set makeprg=gcc\ -o\ %<\ %
        endif
    elseif &filetype=="cpp"
        if g:iswindows==1
            set makeprg=g++\ -o\ %<.exe\ %
        else
            set makeprg=g++\ -o\ %<\ %
        endif
        "elseif &filetype=="cs"
        "set makeprg=csc\ \/nologo\ \/out:%<.exe\ %
    endif
    if(g:iswindows==1)
        let outfilename=substitute(sourcefileename,'\(\.[^.]*\)' ,'.exe','g')
        let toexename=outfilename
    else
        let outfilename=substitute(sourcefileename,'\(\.[^.]*\)' ,'','g')
        let toexename=outfilename
    endif
    if filereadable(outfilename)
        if(g:iswindows==1)
            let outdeletedsuccess=delete(getcwd()."\\".outfilename)
        else
            let outdeletedsuccess=delete("./".outfilename)
        endif
        if(outdeletedsuccess!=0)
            set makeprg=make
            echohl WarningMsg | echo "Fail to make! I cannot delete the ".outfilename | echohl None
            return
        endif
    endif
    execute "silent make"
    set makeprg=make
    execute "normal :"
    if filereadable(outfilename)
        if(g:iswindows==1)
            execute "!".toexename
        else
            execute "!./".toexename
        endif
    endif
    execute "copen"
endfunction
"進行make的設置
map <F6> :call Do_make()<CR>
map <c-F6> :silent make clean<CR>
function Do_make()
    set makeprg=make
    execute "silent make"
    execute "copen"
endfunction

主要介紹如下幾點:

1.如果是windows用戶,需要安裝mingw,并且將他的bin目錄添加到對應的環境變量里。

2.g:iswindows 是個我定義的全局變量,用來判斷系統是linux還是windows,這樣就不用寫兩套vimrc了,實現如下:

if(has("win32") || has("win95") || has("win64") || has("win16"))
    let g:iswindows=1
else
    let g:iswindows=0
endif

3.makeprg 是vim內置的編譯命令,可以通過更改來實現編譯對應類型文件。具體可參考vim官方說明文件。

4.最后的copen是打開quickfix,在錯誤描述上回車,可以直接跳轉到錯誤行。

Pingbacks

  1. vim的插件cvim(csupport) &laquo; My S-K-Y on #

    [...]   偶然發現的得超好用的vim插件&mdash;&mdash;csupport,它提供的功能中我最喜歡的就是自動編譯,知道emacs內置了,但是我確實是vim黨派的,不會轉到emacs中去,但是程序員打完代碼總要回到控制臺去編譯和執行不覺得很可笑么?前陣子找到一個高手,它自己寫了一段自動編譯的函數,它的那個直接復制不行,需要打開下面提供的txt中復制設置,我這里就提供下吧: [...]

Pingbacks已打開。

Trackbacks

引用地址

評論

  1. herryoli

    herryoli on #

    恩學習啦,博主很強大,以后常來學習啦

    Reply

  2. Dante

    Dante on #

    哈哈,多謝捧場啊~~~

    Reply

  3. SuperSonic

    SuperSonic on #

    Hi there,
    It agree, very amusing opinion
    Thanks
    <a href="http://www.fd3la.com/" rel="nofollow">SuperSonic</a>

    Reply

  4. Dougles

    Dougles on #

    Greatings, Interesting, did you plan to continue this article?
    Thank you
    <a href="http://www.fd3la.com/" rel="nofollow">Dougles</a>

    Reply

  5. isunbo

    isunbo on #

    有了這個實在是方便多了.但是有一點我有些不明白,我學習C語言的時候養成了一個壞習慣,比如定義一個變量并賦值我會這么寫"int i = 10",之后,我把上面的代碼寫到vimrc文件里的時候就出問題了.比如這個
    set makeprg = gcc\ -o\ %&lt;.exe\ %;后來看到報錯就把vimrc文件里所有等號兩邊的空格都給去掉了.哎,剛剛學著用,總是各種莫名其妙的錯誤啊.

    Reply

    1. Dante

      Dante on #

      呵呵,vim的腳本的確有些嚴格啊,呵呵,習慣了就好啦~~~

      Reply

  6. asnahu

    asnahu on #

    只要c/c++環境,MinGW需要是完整安裝碼?

    Reply

    1. Dante

      Dante on #

      因為我當時是直接默認全安裝的,如果想要刪掉一些功能還真的沒有嘗試過,其實也不大,全裝也沒有問題吧

      Reply

  7. asnahu

    asnahu on #

    謝謝這么快恢復,問題已經解決。^_^

    Reply

  8. Loaden

    Loaden on #

    樓主神人!學習來了。
    謝謝!

    Reply

    1. Dante

      Dante on #

      哈哈,不客氣~

      Reply

  9. YE

    YE on #

    博主很強大。弱弱的問一句,我把這些代碼拷貝到vimrc,把中文單雙引號替換掉,但按下F5仍是會出現一些錯誤,比如第31行:E115缺少引號:'\(\.[^.]*\).我是菜鳥,代碼看不懂,可以添加一些注釋或者把這段代碼做個txt作為附件嗎,網頁上拷貝的字符會變化

    Reply

    1. Dante

      Dante on #

      額,會這樣啊,好的,我傳一個txt文檔在文章最后把,你再試試啊~

      Reply

      1. YE

        YE on #

        好人啊

        Reply

        1. Dante

          Dante on #

          呵呵,分享創造價值~

          Reply

  10. vimer新人

    vimer新人 on #

    您好 我把您的配置加入到自己的配置文件中,結果按下F6顯示“|| 'make' 不是內部或外部命令,也不是可運行的程序
    || 或批處理文件” 按F5顯示“Fail to make! This file is not in the current dir! press to redirect to the dir of this file.“ 如何解決。我編輯的cs文件.謝謝

    Reply

    1. Dante

      Dante on #

      呃,就是你打開的文件并不是你vim工作的當前目錄。
      用:pwd看一下,你當前的目錄是和文件目錄相同不,如果不相同需要用:cd xxx命令,cd過去

      Reply

      1. vimer新人

        vimer新人 on #

        ok 我在試一下。謝謝,沒想到這么快回復。

        Reply

  11. wbd

    wbd on #

    學習了,樓主很強

    Reply

  12. vim fan

    vim fan on #

    樓主,你把簡單的東西寫的挺復雜。。。。

    Reply

    1. Dante

      Dante on #

      呵呵,很久之前的代碼了……,能用就一直沒有管,歡迎博友將自己的配置貼上來,我更新一下~

      Reply

  13. david

    david on #

    出現如下錯誤,解決不了,請博主看看:
    Error detected while processing function Do_OneFileMake:
    line 35:
    E115: Missing quote: '\(\.[^.]*\)
    E116: Invalid arguments for function substitute(sourcefileename,'\(\.[^.]*\)
    E15: Invalid expression: substitute(sourcefileename,'\(\.[^.]*\)
    line 36:
    E20: Mark not set
    line 37:
    E121: Undefined variable: outfilename
    E15: Invalid expression: outfilename
    line 39:
    E121: Undefined variable: outfilename
    E116: Invalid arguments for function filereadable(outfilename)

    line 54:
    E121: Undefined variable: outfilename
    E116: Invalid arguments for function filereadable(outfilename)
    E15: Invalid expression: filereadable(outfilename)

    Reply

    1. Dante

      Dante on #

      你能給我發郵件看一下你copy的函數,好像我的博客會把引號變成全角符號……
      郵箱點擊一下上面的留言就能看到。

      Reply

    2. Lees

      Lees on #

      樓主你好,我想問一下在windows下用VIM能夠斷點運行么?能的話能否告之?謝謝了

      Reply

    3. wuyuan

      wuyuan on #

      我也有這個問題,后來下載的txt文件再復制一下就好了

      Reply

  14. frankvictor

    frankvictor on #

    line 54:
    E121: Undefined variable: outfilename
    E116: Invalid arguments for function filereadable(outfilename)
    E15: Invalid expression: filereadable(outfilename)

    出現這個錯誤,請問是怎么回事啊,考的附件txt中的代碼

    Reply

    1. Dante

      Dante on #

      給我發下郵件我看一下?懷疑是哪個地方換行了。郵箱在博客的留言板頁面~

      Reply

      1. Nirocfz

        Nirocfz on #

        同樣出現這個問題,不知道咋回事

        Reply

        1. Dante

          Dante on #

          嘗試一下附件中的txt文件?

          Reply

          1. Nirocfz

            Nirocfz on #

            我把關于 g:iswindows 的if分支語句都注釋掉了,只留下else之后給linux的語句,就正常了。

            還有個問題是在終端里的vim,按F5編譯結果出來之后,只有quickfix窗口的顯示的還算正常,要刷新一次窗口才全部正常顯示,在函數最后加了個redraw! ,效果還算滿意,不過我不懂vim語法,不知道合不合適

            Reply

            1. Dante

              Dante on #

              呵呵,在終端里顯示花屏是很正常的,可以用redraw!來強制刷新,不過我一般就CTRL+L來刷新一下就行了~

              Reply

              1. Wenson

                Wenson on #

                解決了。。

                哈哈,少拷了點代碼。。

                汗 - - !

                Reply

            2. Wenson

              Wenson on #

              為什么我把那個都給注釋掉,還是出現這個問題啊~~~

              抓狂

              Reply

  15. 執著的初心

    執著的初心 on #

    哪里有qq號。。。。

    Reply

  16. 執著的初心

    執著的初心 on #

    博主很強大啊。
    我是個初學者。vim的代碼有的還看不懂。

    你這個是編譯c++的。我是做FPGA的,要用modelsim來編譯VHDL或者Verilog文件。所以還得自己動手修改才行。

    不知道能不能給源代碼做個注釋讓我參考下?尤其是比如:\(\.[^.]*\) 真的沒看懂。。。

    Reply

    1. Dante

      Dante on #

      呃,你說的語言我就聽說過VHDL。。。

      \(\.[^.]*\) 的意思是.exe之類的后綴,比如.exe.bk 就會匹配.bk。

      Reply

    2. Dante

      Dante on #

      其實代碼很簡單的,建議簡單學習一下vim的腳本,只要學過普通的腳本語言應該都不難~

      Reply

      1. 執著的初心

        執著的初心 on #

        最近稍微學習了一下,自己寫了一個modesim的。
        支持verilog和vhdl,其他的編譯器需要自己設置錯誤識別,這個比較惡心。

        最后的窗口我用的:cw命令。有錯誤顯示,沒錯誤就不顯示了。

        Reply

        1. Dante

          Dante on #

          哈哈,恭喜恭喜。
          其實錯誤識別寫起來還是挺容易的,在vim里面輸入
          :h errorformat
          介紹的挺清楚的。

          Reply

  17. oatmeal

    oatmeal on #

    博主,能不能介紹一下vim怎么聯立gbd調試單個文件的?

    謝謝了,實現的功能就是查看變量,斷點,分步執行就好了

    Reply

    1. Dante

      Dante on #

      呃,這個真沒嘗試過。。。倒是可以看看這邊文章:
      http://www.vnchuangji.cn/2010/06/%E5%9C%A8vimgvim%E4%B8%AD%E8%BF%90%E8%A1%8C%E7%BB%88%E7%AB%AF%E5%AF%B9%E4%BD%A0%E6%B2%A1%E6%9C%89%E7%9C%8B%E9%94%99%E6%88%91%E4%B9%9F%E6%B2%A1%E6%9C%89%E5%86%99%E5%8F%8D.html
      實現了Vim中托管所有的命令行操作。。

      Reply

    2. 可可火山

      可可火山 on #

      gbdtui 挺好用的,默認一半源代碼一半調試窗。

      另外我也使用makeprg來編譯單個文件或者工程,
      有個makeprgs.vim的插件也做類似的事情,能自己判斷是Makefile,ant java工程。我就自己稍微改了下來編譯debug的c++程序。

      Reply

  18. xiaoquan09

    xiaoquan09 on #

    跟著 博主 學習

    Reply

  19. zhanglistar

    zhanglistar on #

    8錯哈 我都是手寫makeprg的。
    lz的vim功底深厚啊。

    Reply

  20. cigerma

    cigerma on #

    樓主,問下vim如何判斷前一個命令是否成功執行
    比如在這一步:
    if filereadable(outfilename)
    execute "!./".toexename
    endif
    在它出錯后執行execute "copen"
    成功的時候則不執行
    這個該怎么做?

    Reply

    1. Dante

      Dante on #

      呃,外部命令恐怕不行哦,只能通過間接的方式,比如判斷命令創建的文件成功與否等等

      Reply

      1. cigerma

        cigerma on #

        汗,其實改成:
        if filereadable(outfilename)
        execute “!./”.toexename
        else
        execute "copen"
        endif
        就行了!

        Reply

  21. nan

    nan on #

    請教博主,如果希望實現一鍵編譯,但是要求在\build文件夾里執行make命令,應當如何修改Vim腳本呢?

    Reply

    1. Dante

      Dante on #

      不好意思,今天一直都在忙。
      想要更改編譯目錄的話,只需要執行:
      cd ../build
      即可,不過一鍵編譯就是為了編譯單個文件,如果要寫復雜的工程的話,還是用makefile比較好。

      Reply

  22. Springlie

    Springlie on #

    博主您好,我安裝了MinGW,并將bin放入系統變量。嘗試編譯后發現,用C++風格引入的頭文件找不到,比如:

    #include
    #include

    using namespace std;

    如果將string改成C風格的string.h,就可以找到。
    我到MinGW的include中發現,只有string.h,沒有string,也沒有vector之類的文件。可能是由于這個原因找不到。

    弱問:如何解決上述問題,在vim里正常編譯這些文件?

    Reply

    1. Dante

      Dante on #

      被轉義了。。。
      呃,是不是mingw的版本問題?或者你是用gcc還是g++編譯的?
      c++風格的要用g++編譯。

      Reply

      1. Springlie

        Springlie on #

        C++風格的文件是用g++編譯的。

        mingw應該已經是最新的了,是在http://sourceforge.net/projects/mingw/files_beta/ 下載的。

        可疑的地方就是:MinGW的include中,只有string.h文件,沒有string文件。我翻看UNIX和VC的相應位置,兩個文件是都該具備的。

        Reply

        1. Dante

          Dante on #

          C:\MinGW\include\c++\3.4.5
          C++的頭文件在這個目錄下哦,里面有string文件。

          Reply

          1. Springlie

            Springlie on #

            謝謝及時回復。
            但真相是:include下根本就沒有C++目錄。是因為mingw的版本問題么?

            Reply

            1. Dante

              Dante on #

              呃。。那就真不知道了。。我現在的版本里面是有的。。。是不是沒有全部安裝上?

              Reply

            2. kadyz

              kadyz on #

              確實是版本問題,現在去下載的MinGW版本C++的頭文件路徑已經跟網絡上普遍教程上說的不一樣了。(我下載的是4.5.0)
              我自己嘗試配置的路徑是:D:\MinGW\include;D:\MinGW\lib\gcc\mingw32\4.5.0\include;D:\MinGW\lib\gcc\mingw32\4.5.0\include\c++;D:\MinGW\lib\gcc\mingw32\4.5.0\include\c++\backward;D:\MinGW\lib\gcc\mingw32\4.5.0\include\c++\mingw32

              經過驗證是可以編譯C++的。

              Reply

  23. 匿

    on #

    每次編譯時要cd到相應目錄,能否自動完成呢

    Reply

  24. 匿

    on #

    找到了
    set autochdir

    Reply

  25. noob

    noob on #

    感謝博主的分享!但是在上面的代碼中中沒有不可以編譯java吧?我在31行后直接加了
    elseif &amp;filetype=="java"
    set makeprg=javac\ %
    但是沒有用。是不是還要作些修改呢?我不懂vim的語法,請多指教!

    Reply

    1. Dante

      Dante on #

      在vim中執行:

      <pre lang="vim" line="1">
      :h makeprg
      </pre>

      即可~~

      Reply

      1. noob

        noob on #

        還請您詳細指點一下java源代碼怎么用quickfix,感激不盡,我不太想看幫助文件:)

        Reply

  26. 吳健

    吳健 on #

    你好:
    博主,按照你說的步驟我都設置好了,可編譯時(按F6)會出現:call Do_make(),不知道怎么回事,快崩潰了

    Reply

    1. Dante

      Dante on #

      你好,用文末那個txt版的試一下?

      Reply

  27. kid7st

    kid7st on #

    博主,那個txt文件是不是失效了

    Reply

    1. Dante

      Dante on #

      嗯,可能遷移網站給搞丟了。。。
      直接用貼的代碼就行,已經優化過的。

      Reply

  28. aruralgeek

    aruralgeek on #

    let outfilename=substitute(sourcefileename,'\(\.[^.]*\),'.exe','g')
    這句在網頁顯示出來 好像有錯誤吧。特別是被斷行了,而且少個'。
    我自己改為 let outfilename=substitute(sourcefileename,'\(\.[^.]*\)‘,'.exe','g') 就可以了。
    還有,F5編譯完后 如果程序修改了 再按F5就會出現錯誤Fail to make! Please select the right file!
    不知如何解決。

    Reply

    1. Dante

      Dante on #

      感謝提醒! 的確被換行了
      是不是設置了 autochdir?

      Reply

      1. aruralgeek

        aruralgeek on #

        在每次F5之后 它的光標都會在調試信息的窗口,不管有沒有錯誤,當光標在調試信息窗口的時候,整個窗口就是沒有 文件名 狀態,也就是上面顯示是 [未命名]。如果要再通過F5編譯運行 就要光標跳到編輯窗口,才有文件名。請問能不能設置 當跳到調試信息窗口的時候 文件名也是有的呢?而且,F5之前 先將當前文件保存了,不然它還是以之前的編譯。謝謝了!

        Reply

  29. 布拉德比特

    布拉德比特 on #

    樓主啊,你的文件不提供下載了....

    Reply

    1. Dante

      Dante on #

      呃,空間搬遷了幾次,都沒了。。

      就用貼的代碼吧,可以正常運行的。

      Reply

  30. 三十

    三十 on #

    也是初學,看到上面都在說編譯的過程報錯,就仔細看了一下代碼。
    let outfilename=substitute(sourcefileename,'\(\.[^.]*\)' ,'.exe','g')
    let outfilename=substitute(sourcefileename,'\(\.[^.]*\)' ,'','g')
    這兩句博主少在'\(\.[^.]*\)的后面打了一個'加上就正常了。不知道對否

    Reply

    1. Dante

      Dante on #

      感謝提醒,已經修改~

      Reply

      1. xxx

        xxx on #

        博主啊不要亂聽別人講這個點根本就不應該加的可能它是用的LINUX才不正常,我用windows,得去掉那個點才正常,害苦我了。另外既然用到了g:iswindows博主為何不把g:iswindows這個變量加到文中呢,這個也害我弄了半天

        Reply

        1. xxx

          xxx on #

          let outfilename=substitute(sourcefileename,’\(\.[^.]*\)’ ,’.exe’,'g’)這里的那個點不應該加

          Reply

      2. xxx

        xxx on #

        博主是不是故意弄的有點問題好讓我們來點擊你博客啊!哈哈

        Reply

        1. Dante

          Dante on #

          哈哈,我不會那么壞啦
          呃,主要是這段代碼也很久不用了,所以當時也沒多想,直接加上了。。
          剛看了一下,確實不應該加,\)是一個整體,不該拆開的。

          Reply

  31. swust_long

    swust_long on #

    博主:
    謝謝你的分享!
    我剛開始用vim,你那上面貼的代碼還是有一點問題,前面的人已經說過了,我也都照看了,你好像把單引號加到右元括號前面去了;
    outfilename=substitute(sourcefileename,'\(\.[^.]*\') ,'.exe','g')
    let toexename=outfilename
    else
    let outfilename=substitute(sourcefileename,'\(\.[^.]*\') ,'','g')

    Reply

    1. nswutong

      nswutong on #

      是這樣的,希望博主改一下
      <pre>’\(\.[^.]*\')
      </pre>
      后面那個單引號的位置錯了

      Reply

      1. Dante

        Dante on #

        多謝,已經修改~

        Reply

  32. swust_long

    swust_long on #

    順便建議下樓主,把那個文件下載弄下吧;
    直接復制容易出錯。。。呵呵。。

    Reply

  33. Aikilis

    Aikilis on #

    贊!
    我自己也弄了一個,但是有個小問題想請教博主。
    我是F5編譯,F6執行,F9編譯+執行

    問題就出在F9上。。我是直接把F9映射為。這樣如果編譯沒通過的話還是會執行。。執行的以前編譯的版本。。囧。。。請問該怎么改呢?謝謝!

    Reply

    1. Aikilis

      Aikilis on #

      額。。尖括號被吃掉了。。我是直接把F9映射為F5+F6

      Reply

  34. xxx

    xxx on #

    為什么不把open換成cw這樣就可以有錯誤打開窗口,沒錯誤不打開窗口。
    另外我剛學編程,那個F6執行是什么意思是運行的意思嗎

    Reply

  35. xxx

    xxx on #

    另外我想省了編譯時要保存的這一步,所以在
    if &amp;filetype=="c"
    ……
    w
    set makeprg=gcc\ -o\ %&lt;\ %
    ……
    這里加了個w,這樣好像可以實現直接保存后編譯了,不知有什么不妥之處沒有

    Reply

    1. Dante

      Dante on #

      嗯,沒什么問題。

      Reply

  36. liaic

    liaic on #

    哈哈,成功學習博主的方法,做成了編譯NCL的快捷鍵!非常感謝!

    Reply

    1. madper

      madper on #

      ncl=腦殘了? 哈哈哈~ 玩笑~

      Reply

  37. Isaac

    Isaac on #

    首先感謝樓主,想問一下上面的配置有用到哪些vim的插件?
    還有……我想我得把那些『if g : iswindows……』刪了……潔癖……:P

    Reply

    1. Dante

      Dante on #

      呃,不需要別的插件哈。你說的是我之前的一個變量定義,刪掉就可以了。

      Reply

  38. xcxinghai

    xcxinghai on #

    我直接復制了您的代碼,但是顯示錯誤提示如下:

    第 52 行:
    E121: 未定義的變量: outfilename
    E116: Invalid arguments for function filereadable(outfilename)
    E15: 無效的表達式: filereadable(outfilename)

    我的程序應該沒問題的。

    Reply

    1. xcxinghai

      xcxinghai on #

      解決了,原來我沒有將下面判斷是什么系統語句加上去。

      Reply

  39. zxiaotian

    zxiaotian on #

    你好,請問這個代碼高亮插件是什么?

    Reply

    1. Dante

      Dante on #

      wp_syntax

      Reply

  40. MKCC

    MKCC on #

    有沒辦法自動添加MinGW的環境變量呢?讓VIM和MinGW做一個整合.
    之前看到有Code::blocks和MinGW的整合,用批處理文件過渡,想參照此法,可無奈不曉得vim如何往文件追加內容,在CMD下可以echo xxxx&gt;&gt;run.bat進行追加.不知博主是否有好的辦法?

    Reply

    1. Dante

      Dante on #

      不理解,環境變量不是直接改系統就可以了么?

      vim確實沒有提供直接追加寫文件的功能,但是vim支持各種語言來寫腳本,比如python,就可以。

      Reply

      1. MKCC

        MKCC on #

        蛋痛想搞win32綠色版gvim,所以才會這些想法.不過后來在一個外國網站找到辦法了.
        let $path="XX;".$path

        例如我的做法是把MinGW放在vim目錄下,然后
        let $path=$VIM."\MinGW\bin;".$path
        這樣就整合到一起了.

        Reply

  41. zhuojun

    zhuojun on #

    請問可以一鍵編譯運行多個C++文件嗎?謝謝!

    Reply

    1. Dante

      Dante on #

      額,那就要自己寫makefile了。。直接用make就行了。。

      Reply

  42. ayqs

    ayqs on #

    if(has("win32") || has("win95") || has("win64") || has("win16"))
    let g:iswindows=1
    else
    let g:iswindows=0
    endif

    樓主,這段代碼是加到上面那一大段代碼后面就行了吧

    Reply

  43. wangyang

    wangyang on #

    樓主你好,我是個新手。
    按照上面說的做完之后,我按F5,終端顯示的是~這個字符,然后輸入原文件的名字a.c后按回車,終端卻顯示這種結果
    ~a.c:command not found
    這是怎么會是

    Reply

    1. Dante

      Dante on #

      命令沒有綁定好。。

      Reply

  44. 黃瓜皮

    黃瓜皮 on #

    我win下的c,cpp一鍵運行vimrc配置哈,查找當前目錄下的可執行文件,如果找到多個就讓用戶選一個。如果有用望發散:

    func! GetExeFilePwd()
    let exes = glob("*.exe")
    if stridx(exes, "\n") != -1
    let charidx = 0
    let exes_list = []
    let prompt_idx = 1
    let len = strlen(exes)
    let t = -1
    while t != len
    let t = stridx(exes, "\n", charidx)
    if t == -1
    let t = len
    endif
    let exes_list = exes_list + [prompt_idx.". ".strpart(exes, charidx, t - charidx)]
    let prompt_idx = prompt_idx + 1
    let charidx = t + 1
    endwhile
    let exeidx = inputlist(["select file to execute"] + exes_list) - 1
    if exeidx != -1
    let exes = matchstr(get(exes_list, exeidx), '[a-zA-z]\+.exe')
    endif
    endif
    return exes
    endfun

    func! Run()
    let exes = GetExeFilePwd()
    if exes != ""
    execute "!".exes
    endif
    endfunc

    func! Gdb()
    let exes = GetExeFilePwd()
    if exes != ""
    exec "!gdb %&lt;&quot;
    endif
    endfunc

    Reply

  45. haoaina521

    haoaina521 on #

    最后的copen其實用cw比較好,如果有錯誤才打開quickfix。

    Reply

  46. 顯示

    顯示 on #

    為什么當程序有錯時,編譯后出現quickfix窗口,但程序源代碼顯示不出來,要用鼠標上下滑動才會顯示出來?

    Reply

  47. 木木菜

    木木菜 on #

    誒~~~~會中文亂碼怎么辦?

    Reply

  48. song

    song on #

    "------------------------------------------------------------------------------
    "
    "------------------------------------------------------------------------------
    " F9 一鍵保存、編譯、連接存并運行
    map :call Run()
    imap :call Run()
    " Ctrl + F9 一鍵保存并編譯
    map :call Compile()
    imap :call Compile()
    " Ctrl + F10 一鍵保存并連接
    map :call Link()
    imap :call Link()
    let s:LastShellReturn_C = 0
    let s:LastShellReturn_L = 0
    let s:ShowWarning = 1
    let s:Obj_Extension = '.o'
    let s:Exe_Extension = '.exe'
    let s:Sou_Error = 0
    let s:windows_CFlags = 'gcc\ -fexec-charset=gbk\ -Wall\ -g\ -O0\ -c\ %\ -o\ %&lt;.o&#039;
    let s:linux_CFlags = &#039;gcc\ -Wall\ -g\ -O0\ -c\ %\ -o\ %&lt;.o&#039;
    let s:windows_CPPFlags = &#039;g++\ -fexec-charset=gbk\ -Wall\ -g\ -O0\ -c\ %\ -o\ %&lt;.o&#039;
    let s:linux_CPPFlags = &#039;g++\ -Wall\ -g\ -O0\ -c\ %\ -o\ %&lt;.o&#039;
    func! Compile()
    exe &quot;:ccl&quot;
    exe &quot;:update&quot;
    if expand(&quot;%:e&quot;) == &quot;c&quot; || expand(&quot;%:e&quot;) == &quot;cpp&quot; || expand(&quot;%:e&quot;) == &quot;cxx&quot;
    let s:Sou_Error = 0
    let s:LastShellReturn_C = 0
    let Sou = expand(&quot;%:p&quot;)
    let Obj = expand(&quot;%:p:r&quot;).s:Obj_Extension
    let Obj_Name = expand(&quot;%:p:t:r&quot;).s:Obj_Extension
    let v:statusmsg = &#039;&#039;
    if !filereadable(Obj) || (filereadable(Obj) &amp;&amp; (getftime(Obj) = getftime(Sou))
    redraw!
    if !executable(Exe) || (executable(Exe) &amp;&amp; getftime(Exe) &lt; getftime(Obj))
    if expand(&quot;%:e&quot;) == &quot;c&quot;
    setlocal makeprg=gcc\ -o\ %&lt;\ %&lt;.o
    echohl WarningMsg | echo &quot; linking...&quot;
    silent make
    elseif expand(&quot;%:e&quot;) == &quot;cpp&quot; || expand(&quot;%:e&quot;) == &quot;cxx&quot;
    setlocal makeprg=g++\ -o\ %&lt;\ %= getftime(Obj) &amp;&amp; getftime(Obj) &gt;= getftime(Sou)
    redraw!
    echohl WarningMsg | echo " running..."
    if g:iswindows
    exe ":!%&lt;.exe&quot;
    else
    if g:isGUI
    exe &quot;:!gnome-terminal -e ./%&lt;&quot;
    else
    exe &quot;:!./%&lt;&quot;
    endif
    endif
    redraw!
    echohl WarningMsg | echo &quot; running finish&quot;
    endif
    endfunc

    Reply

    1. song

      song on #

      摘自http://zhidao.baidu.com/question/541064260.html?from=pubpage&amp;msgtype=2不過怎么不能用

      Reply

      1. song

        song on #

        我windows7 gvim mingw 新手不知怎么搞

        Reply

        1. song

          song on #

          問題解決這個是完整版的http://www.oschina.net/code/snippet_574132_13351

          Reply

  49. 小行

    小行 on #

    || 'g++' 不是內部或外部命令,也不是可運行的程序|| 或批處理文件博主,我是win7下的gvim,搞不清楚問題出在哪了。

    Reply

    1. 朱念洋

      朱念洋 on #

      win下需要裝一下 mingw

      Reply

      1. 小行

        小行 on #

        如果已經安裝了codeblocks,可以不以直接利用其目錄下的mingw?

        Reply

        1. 朱念洋

          朱念洋 on #

          理論上是可以的,只是用來編譯而已。

          Reply

          1. 小行

            小行 on #

            謝謝博主,成功了。

            Reply

發表評論