2010-04-13 55 views

回答

82

:!gcc -o somename % && ./somename
使用:!時,%將被當前打開文件的名稱替換。

當您的項目變大時,您也可以編寫一個makefile並編譯當前項目:make,如果有任何錯誤,vim會自動跳轉到它們。

+16

1爲指出%是由文件名取代。 – 2010-04-13 08:11:27

+0

我喜歡你回答。我想做出最終決定。請指導。 – Coder 2010-04-13 09:12:08

+0

我需要15張選票才能最終決定:( – Coder 2010-04-13 09:13:24

31

在.vimrc文件中使用以下映射代碼來編譯和運行c編程文件。

map <F8> : !gcc % && ./a.out <CR> 

F8鍵用於運行映射。 「%」是取當前文件名。

或者,如果你想保存當前的文件編譯之前,使用

map <F8> :w <CR> :!gcc % && ./a.out <CR> 

或者更理想的,如果你想使用的文件名前綴不是默認「的a.out」作爲可執行文件名,使用以下:

map <F8> :w <CR> :!gcc % -o %< && ./%< <CR> 

在上述命令中, 「<」, 「%」 後去除延伸和點(的foo.c =>富),所以 「%<」 是的文件名前綴。

你可以在cmdline.txt找到這個和類似的資訊。 vim中的命令:help: cmdline.txt。你也可以在vim中使用:help filename-modifiers找到關於「%」使用的具體細節。

+1

請注意空格字符是有效的正常模式命令將光標向右移動一個空格,因此在第二個映射中你鏈接在一起的兩個ex命令之間的空間將在編譯前移動光標(如果可能的話),如果向右移動光標失敗,編輯步驟永遠不會運行 – Ben 2016-02-29 16:43:31

5

因爲大多數的你會用一個Makefile,除了給出答案的時候,我也希望看到一個「清除」屏幕我的結果:

map <F10> :w<CR> :!clear; make<CR> :!./%<<CR>

  • :w<CR>節省文件

  • :!clear; make<CR>清除屏幕,並運行make

  • :!./%<<CR>運行的程序(%)無

+1

這真的很酷!我爲自己的需要編輯了一些東西。我用'silent!clear ...'清除了最初的「按ENTER或鍵入命令繼續」。在「編譯」區域和「運行」區域之間做了一個分隔符,爲了避免空格問題,我在文件名周圍加了引號,最後我把time命令放在那裏以獲得一些額外的有用輸出。這是我的版本: 'noremap :w :silent!clear; make :!echo「--------------- Running ---------------」;回聲;命令時間-v「./% <"' – atomictom 2014-01-26 19:41:01

+0

另外,你可以通過使用make變量來強制執行名稱與文件名(減'.c')相同的名稱(例如,如果程序的名稱存儲在一個名爲'NAME',你可以做'NAME ='%<「'),這意味着你的Makefile可以指定一個不同的默認名字,但是你仍然可以在Vim中使用這個快捷鍵 – atomictom 2014-01-26 19:45:26

2

只是想我要在這裏將其添加到這些答案擴展(<)。如前所述,您可以在vim中使用:make命令。尚未提及的是,:make可以調用除make以外的其他程序。

:set makeprg=gcc\ % 

會造成:make%符號被當前文件名替換執行gcc

然後可以得到看中,做

:set makeprg=gcc\ %\ &&\ ./a.out 

,並簡單地輸入:make將編譯和執行程序。當然你也可以爲其他語言做這個。

:set makeprg=cabal\ repl 
:set makeprg=python\ % 
1

做一些研究(包括本非常頁)後,我做了我的腦海裏添加這個快捷方式:

map <F9> :w<CR> :!gcc % -o %<.x -Wall -Wextra 2>errors.err; cat errors.err<CR> 

還可以包括-ansi -pedantic-errors如果你願意。

errors.err文件將幫助你用vi的quickfix。

+1

迄今爲止最好的*輕量級*直接從vim編譯小cpp程序 – Konrad 2018-01-05 08:29:47

0

按F7 按鈕這三個行添加到您的.vimrc文件

au FileType c set makeprg=gcc\ % 

au FileType cpp set makeprg=g++\ % 

map <F7>:make && ./a.out<CR> 

您可以編譯和運行程序。

4

加入這一行你vimrc文件

nnoremap <silent> <F8> :!clear;gcc % -o % && ./%<CR> 

現在你只需要按下F8鍵編譯和運行C程序。

+2

使用%:r代替最後兩個%s的%,否則它會覆蓋你的源文件,我會編輯你的答案,但是今天的評論者心情不好, – woky 2015-08-02 21:27:39

5

TL; DR不需要Makefile,調整&makeprg也完全沒用,但:make %<已經足夠從Vim編譯。

龍答:

我複製一個答案,我在一個封閉的「重複問題」了。

考慮到我們正在使用vim,而不是六,:make是要走的路。如果你沒有安裝gnumake,那麼你可以在其他系統上安裝gnumake,如果你不想安裝gnumake,在項目中沒有Makefile,如果你的項目只有一個文件,只需輸入:make %<。這將是足夠的(你可以用$CXXFLAGS$CFLAGS$LDFLAGS調整編譯選項播放)。然後運行該程序,鍵入:!./%<,或使用後續版本的vim,運行:terminal ./%<

如果你的項目是由幾個文件,那麼你就需要一個Makefile採取:make優勢。

如果用CMake的管理您的項目,如果你編譯項目目錄(或幾個 - >調試,釋放,......)的源樹之外,那麼整合將需要一個插件。據我所知,我提出這樣一個插件只有一個:BuildToolsWrapper集成的CMake的管理(build目錄的選擇,可能性調試之間進行選擇,或釋放,或任何build目錄)。它必須加上一個local_vimrc插件。

在所有情況下,直接從Vim內部(或外部)調用編譯器:!g++ -o %< %或任何我們在15年前用vi做的任何事情。 Vim有一個很棒的功能:它可以集成(如同在IDE中)編譯器。見:h quickfix。直接從編輯器中導出錯誤要比用我們的眼睛提取一個錯誤行要容易得多,在編輯器中輸入行號,返回到shell以查看究竟是什麼被拒絕...... C中可能已經足夠了,但在C++中,當我們「試圖調用一個不存在的重載」時,我們不能這樣工作(在編輯器和shell之間來回切換)。

最後,如果你想編譯上一個按鍵的單文件的項目,您可以添加在你的.vimrc:

nnoremap <silent> <f7> :make %<<cr> 

如果你想自動適應編譯命令取決於有種項目單文件寵物項目,或真實世界的多文件項目,以及需要更多的接線,這是什麼BTW does - 它讀取各種選項知道該怎麼做。

最後說明:&makeprg最好不要單獨使用,至少不要設置爲g ++/gcc/clang/clang ++/gfortran/...因爲,每次改變語言時,都必須改變它(除非你使用:setlocal)。我推薦的解決方案是,如果我想用clang ++代替g ++,我所要做的就是設置::let $CXX='clang++'(或者C中的$CC),然後再調用:make %<。我甚至可以定義:let $CXXFLAGS='-std=c++11'在C++ 11中編譯 - 相同的變量將用於打開警告,使用消毒器等。

+0

我明白了。這個答案是[關閉的問題](http://stackoverflow.com/questions/21474662)與當前問題重複。 – Mogsdad 2016-02-29 15:32:48

+0

事實上,我在這裏發佈是因爲其他Q/A被標記爲重複並關閉了,但我在這裏看到的所有答案都是非常重要的icient(直接調用gcc而不使用quickfix窗口,或者他們設置'makeprg',而不需要使用正確配置的gnumake)。 – 2016-02-29 15:33:47

0

可能值得補充的是SingleCompile插件爲C和如筆者說其他語言:

SingleCompile是一個Vim插件,旨在使之更方便 編譯或運行一個源文件不留Vim的。考慮這個 的情況:你剛剛寫了一個小的C源文件,用於測試一個小的 ,但是你必須編寫一個Makefile來編譯它,或者退出Vim到 編譯它,或者使用沒有quickfix特性的「!gcc」編譯它 因爲Vim的make命令只使用「make」命令?這個插件 將幫助你。

F9F10推薦映射:

nmap <F9> :SCCompile<cr> 
nmap <F10> :SCCompileRun<cr>