2013-08-06 33 views
2

我想設置VIM編譯和乳寧C和C++程序的權利在編輯器中工作,但這些似乎並沒有工作:Vim的自動命令不能與nnoremap

autocmd! filetype *.c  nnoremap <leader>cc :!gcc -o %:p:r %<cr> 
autocmd! filetype *.c  nnoremap <leader>cr :!gcc -o %:p:r %<cr>:!%:p:r<cr> 
autocmd! filetype *.cpp *.cc nnoremap <leader>cc :!g++ -o %:p:r %<cr> 
autocmd! filetype *.cpp *.cc nnoremap <leader>cr :!g++ -o %:p:r %<cr>:!%:p:r<cr> 

回答

11

FileType自動命令使用文件類型而不是文件名來匹配。你可以改用c和cpp。見:h FileType。但是,您的問題並不止於此:

  • 這些是全局映射。在那裏打開一個c文件並且映射改變。打開一個cpp文件,不管你在什麼緩衝區,映射都會改變。改爲使用nnoremap <buffer>。見:h :map-local
  • 使用autocmd!沒有組。 autocmd!將刪除先前定義的所有內容,並添加當前的自動命令。最好與augroup創建一個組。
  • (可選)您可以使用%<而不是%:r
  • 您可能還想研究將其推入ftplugin或/ ftplugin變體之後。 :h ftplugin:h after-directory

一起:

augroup CBuild 
    autocmd! 
    autocmd filetype c nnoremap <buffer> <leader>cc :!gcc -o %:p:r %<cr> 
    autocmd filetype c nnoremap <buffer> <leader>cr :!gcc -o %:p:r %<cr>:!%:p:r<cr> 
    autocmd filetype cpp nnoremap <buffer> <leader>cc :!g++ -o %:p:r %<cr> 
    autocmd filetype cpp nnoremap <buffer> <leader>cr :!g++ -o %:p:r %<cr>:!%:p:r<cr> 
augroup END 
+0

謝謝。把這些東西放到ftplugin目錄中是可取的,但是vim似乎不能識別cpp.vim,並且當一個cpp文件被打開時,它會來源c.vim並忽略前者。無論如何要解決這個問題嗎? – qed

+0

我已經做了一個快速測試,並沒有創建一個ftplugin'〜/ .vim/ftplugin/cpp.vim'的問題。如果你想看看什麼來源,你可以看看':scriptnames'。 –

0

我修改了它這樣的,它的工作原理如下:

autocmd! filetype c  nnoremap <leader>cc :!gcc -o %:p:r %<cr> 
autocmd! filetype c  nnoremap <leader>cr :!gcc -o %:p:r %<cr>:!%:p:r<cr> 
autocmd! filetype cpp  nnoremap <leader>cc :!g++ -o %:p:r %<cr> 
autocmd! filetype cpp  nnoremap <leader>cr :!g++ -o %:p:r %<cr>:!%:p:r<cr> 
+1

...您有限的理解 「工作」。看到彼得Rincker的答案爲剩餘的問題與此。 –