6

我正在尋找一種方法來確定vim中文件的文件類型,並根據文件類型設置語法高亮。唯一的問題是我無法使用文件擴展名來確定文件類型。在vim中檢測文件類型時沒有有效的文件擴展名

這是我的情況:我用vimdiffgvimdiff作爲我P4DIFF工具,它顯示了在我的本地副本的文件,並從Perforce服務器的那些之間的變化。 Perforce公司似乎在文件中把從Perforce服務器到/ tmp目錄,並使用PID命名文件,例如:

/tmp/tmp.24673.23 

這是一個C++源文件。

我在perforce資源庫中遇到的最常見的文件類型是C/C++源代碼和頭文件,Makefiles,python腳本,perl腳本,ruby腳本和tcl腳本。

  • 我已經研究過使用modeline,但大部分在我們的樹的來源沒有嵌入到文件中的信息。

  • This提到了一種可能的搜索和識別魔法模式的方法。我找不到任何一貫的魔法模式,我可以獲得高成功率。

  • 嘗試在我的Linux機器上使用file二進制文件來查看我得到的結果。看來,以確定C/C++源代碼很好,但失敗了的Makefile,甚至Python腳本(這沒有hashbang)

一個好處是,2個文件進行比較,該文件中右側是來自本地副本,因此具有帶擴展名的正確文件名,從而正確啓用右側文件的語法高亮顯示。

有沒有一種方法可以利用它來爲左側顯示的文件設置相同的語法高亮顯示?

對此問題的任何替代解決方案也是受歡迎的。

回答

6

這是一個有趣的難題。 :)

aug SmartDiffType 
    au! 
    au VimEnter * :if &diff && len(&ft) | call setwinvar(2/winnr(),'&ft',&ft) | elseif &diff | let &ft=getwinvar(2/winnr(),'&ft') | endif 
aug END 

注:

  • 的4行以上,你只需要au VimEnter,但它通常是把自動命令在一些自動命令組與復位(一個很好的做法au!)在頂部。
  • 自動命令上VimEnter否則diff或Windows不能正常intialized尚未
  • vimdiff可能已經觸發在右邊或分割左側的舊文件,所以我們認爲這兩種情況。
  • 2/winnr()是數學特技1和2之間翻轉(2/2 = 1,2/1 = 2)
+0

非常好。我喜歡'2/winnr()'技巧! – 2013-03-12 22:52:21

+0

酷!這真的很好......只是將if-endif移到一個函數中,並用該函數的調用替換了該命令。 :) – Tuxdude 2013-03-12 23:31:47

3

假設你有開放的只有2次分裂,在左側的分裂是您的本地文件,你可以做以下

:windo let &ft = getwinvar(1, '&ft') 

這將filetype設置爲最高值最左邊的窗口所有的窗戶。

如需更多幫助,請參見:

:h :windo 
:h 'ft' 
:h getwinvar(
+0

謝謝,它的工作原理。由於右窗口具有正確的文件類型,因此我必須使用'windo let&ft = getwinvar(2,'&ft')'。有沒有辦法將它添加到'.vimrc'中,以便對於每個vimdiff,它會自動執行此操作?僅僅將'windo'命令添加到.vimrc中並不能解決問題。我猜它會在稍後被覆蓋。 – Tuxdude 2013-03-12 21:39:04

+0

儘管我確信可以創建這樣一個'autocmd',我覺得最簡單的解決方案是創建一個自定義命令:'命令! -bar -nargs = 0 SameFiletype exe'windo set ft ='。&ft'將它添加到你的'〜/ .vimrc'文件中。下一次出現的情況移動到正確的文件類型的緩衝區並執行':SameFiletype' – 2013-03-12 22:02:56

+0

謝謝,這聽起來像一個合理的方法:) – Tuxdude 2013-03-12 22:04:04

相關問題