1. 程式人生 > >Windows環境下配置Vim為Python的IDE

Windows環境下配置Vim為Python的IDE

因為學習使用Vim,遇到ctags這樣一個東東,花了一天時間大致搞清楚了一點,記下來,和大家分享。我寫的匆忙,大家也就隨便看看好了。希望有用。
一.        ctags是幹什麼的

ctags的功能:掃描指定的原始檔,找出其中所包含的語法元素,並將找到的相關內容記錄下來。

我用的是Exuberant Ctags,在Windows上使用,就一個可執行檔案,非常綠色,可在sourceforge下載。
二.        ctags可以識別哪些語言,是如何識別的

ctags識別很多語言,可以用如下命令來檢視:

ctags --list-languages

還可以識別自定義語言,具體沒研究過。

    ctags是可以根據檔案的副檔名以及檔名的形式來確定該檔案中是何種語言,從而使用正確的分析器。可以使用如下命令來檢視預設哪些副檔名對應哪些語言:

ctags --list-maps

還可以指定ctags用特定語言的分析器來分析某種副檔名的檔案或者名字符合特定模式的檔案。例如如下命令告知ctags,以inl為副檔名的檔案是c++檔案。

ctags --langmap=c++:+.inl –R

    並不十分清楚ctags使用何種技術來解析內容,估計包括正則表示式、詞法分析、語法分析等等。但ctags不是編譯器也不是前處理器,它的解析能力是有限的。例如它雖然可以識別巨集定義,但對於使用了巨集的語句的識別還是有缺陷的,在一些稍微正規點的程式碼(例如ACE的庫或VC的標頭檔案等)中的某些常規的巨集使用方式會導致ctags無法識別,或者識別錯誤,從而使得ctags沒有記錄user想記錄的內容,或者記錄下的資訊不準確。另一方面ctags也有聰明的一面,例如在cpp檔案中掃描到static的全域性變數時,ctags會記錄這個變數,而且還會標明說這個變數是侷限於本檔案的,同樣的定義,如果放在h檔案中,ctags則不會標明說這個變數是侷限於本檔案的,因為ctags認為h檔案是標頭檔案的一種,會被其他檔案include,所以在其他檔案中可能會用到該h檔案裡定義的這個全域性變數。
三.        ctags可以識別和記錄哪些語法元素

可以用如下命令檢視ctags可以識別的語法元素:

ctags --list-kinds

或者單獨檢視可以識別的c++的語法元素

ctags --list-kinds=c++

    ctags識別很多元素,但未必全都記錄,例如“函式宣告”這一語法元素預設是不記錄的,可以控制ctags記錄的語法元素的種類。如下命令要求ctags記錄c++檔案中的函式宣告和各種外部和前向宣告:

ctags -R --c++-kinds=+px
四.        ctags是怎麼記錄的

不管一次掃描多少檔案,一條ctags命令把記錄的內容都記到一個檔案裡去,預設是當前目錄的tags檔案,當然這是可以更改的。

每個語法元素對應檔案裡的一行,學名叫tag entry。

1)             開頭是tag的名字,其實也就是語法元素的名字,例如記錄的是函式的話則tag名就是函式名,記錄的是類的話,tag名就是類名。

2)             接下來是一個tab。

3)             接下來是語法元素所在的檔名。

4)             又是一個tab。

5)             一條“命令”。這個要解釋一下意義:ctags所記錄的內容的一個功能就是要幫助像vi這樣的編輯器快速定位到語法元素所在的檔案中去。前面已經記錄了語法元素所在的檔案,這條命令的功能就是一旦在vi中開啟語法元素所在的檔案,並且執行了該“命令”後,vi的游標就能定位到語法元素在檔案中的具體位置。所以該“命令”的內容一般分兩種,一種是一個正則表示式的搜尋命令,一種是第幾行的指向命令。預設讓ctags在記錄時自行選擇命令的種類,選擇的依據不詳,可以通過命令列引數來強制ctags使用某種命令,這裡就不多談了。

6)             對於本tag entry(簡稱tag)所對應的語法元素的描述,例如語法元素的型別等。具體內容和語法元素的種類密切相關。顯示哪些描述,顯示的格式等都是可以在命令列指定的。例如如下命令要求描述資訊中要包含:a表示如果語法元素的類的成員的話,要標明其access(即是public的還是private的);i表示如果有繼承,標明父類;K表示顯示語法元素的型別的全稱;S表示如果是函式,標明函式的signature;z表示在顯示語法元素的型別是使用kind:type的格式。

ctags -R --fields=+aiKSz

    ctags除了記錄上述的各種內容之外,還可以在tags檔案中記錄本次掃描的各個檔案,一個檔名對應一個tag entry。預設是不記錄的,要強制記錄要是使用如下命令:

ctags –R --extra=+f

    還可以強制要求ctags做這樣一件事情——如果某個語法元素是類的一個成員,當然ctags預設會給其記錄一個tag entry(說白了就是在tags檔案裡寫一行),可以要求ctags對同一個語法元素再記一行。舉一個例子來說明:假設語法元素是一個成員函式,ctags預設記錄的tag entry中的tag的名字就是該函式的名字(不包括類名作為字首),而我們強制要求ctags多記的那個tag entry的tag的名字是包含了類明作為字首的函式的全路徑名。這樣做有什麼好處見下文分析。強制ctags給類的成員函式多記一行的命令為:

ctags -R --extra=+q
五.        vi大概是怎樣使用ctags生成的tags檔案的

估計vi是這樣使用tags檔案的:我們使用vi來定位某個tag時,vi根據我們輸入的tag的名字在tags檔案中一行行查詢,判斷每一行tag entry的tag名字(即每行的開頭)是否和使用者給出的相同,如果相同就認為找到一條記錄,最後vi顯示所有找到的記錄,或者根據這些記錄直接跳轉到對應檔案的特定位置。

考慮到ctags記錄的內容和方式,出現同名的tag entry是很常見的現象,例如函式宣告和函式定義的tag名字是一樣的,過載函式的tag名字是一樣的等等。vi只是使用tag名字來搜尋,還沒智慧到可以根據函式的signature來選擇相應的tag entry。vi只能簡單的顯示tag entry的內容給user,讓user自行選擇。

ctags在記錄成員函式時預設是把函式的名字(僅僅是函式的名字,不帶任何類名和namespace作為字首)作為tag的名字的,這樣就導致很多不同類但同名的函式所對應的tag entry的名字都是一樣的,這樣user在vi中使用函式名來定位時就會出現暴多選擇,挑選起來十分麻煩。user可能會想在vi中用函式的全路徑名來進行定位,但這樣做會失敗,因為tags檔案中沒有對應名字的tag entry。要滿足使用者的這種心思,就要求ctags在記錄時針對類的成員多記錄一條tag entry,該tag entry和已有的tag entry的內容都相同,除了tag的名字不同,該tag entry的名字是類的成員的全路徑名(包括了名稱空間和類名)。這就解釋了ctags的--extra=+q這樣一條命令列選項(見四)。
六.        我的一條ctags命令

ctags -R --languages=c++ --langmap=c++:+.inl -h +.inl --c++-kinds=+px --fields=+aiKSz --extra=+q --exclude=lex.yy.cc --exclude=copy_lex.yy.cc

命令太長了,折成兩行了,可以考慮把命令的各個引數寫到檔案裡去了(具體做法就不談了)。

1.

-R

表示掃描當前目錄及所有子目錄(遞歸向下)中的原始檔。並不是所有檔案ctags都會掃描,如果使用者沒有特別指明,則ctags根據檔案的副檔名來決定是否要掃描該檔案——如果ctags可以根據檔案的副檔名可以判斷出該檔案所使用的語言,則ctags會掃描該檔案。

2.

--languages=c++

只掃描檔案內容判定為c++的檔案——即ctags觀察副檔名,如果副檔名對應c++,則掃描該檔案。反之如果某個檔案叫aaa.py(python檔案),則該檔案不會被掃描。

3.

--langmap=c++:+.inl

告知ctags,以inl為副檔名的檔案是c++語言寫的,在加之上述2中的選項,即要求ctags以c++語法掃描以inl為副檔名的檔案。

4.

-h +.inl

告知ctags,把以inl為副檔名的檔案看作是標頭檔案的一種(inl檔案中放的是inline函式的定義,本來就是為了被include的)。這樣ctags在掃描inl檔案時,就算裡面有static的全域性變數,ctags在記錄時也不會標明說該變數是侷限於本檔案的(見第一節描述)。

5.

--c++-kinds=+px

記錄型別為函式宣告和前向宣告的語法元素(見第三節)。

6.

--fields=+aiKSz

控制記錄的內容(見第四節)。

7.

--extra=+q

讓ctags額外記錄一些東西(見第四、五節)。

8.

--exclude=lex.yy.cc --exclude=copy_lex.yy.cc

告知ctags不要掃描名字是這樣的檔案。還可以控制ctags不要掃描指定目錄,這裡就不細說了。

相關推薦

Windows環境配置VimPython的IDE

因為學習使用Vim,遇到ctags這樣一個東東,花了一天時間大致搞清楚了一點,記下來,和大家分享。我寫的匆忙,大家也就隨便看看好了。希望有用。 一.        ctags是幹什麼的 ctags的功能:掃描指定的原始檔,找出其中所包含的語法元素,並將找到的相關內容記錄下來。 我用的是Exuberant Ct

windows 環境配置nodejs sdk 環境

fabric 環境版本:v1.1 fabric-sample 版本v1.1 1. 安裝nodejs 折騰了好幾個版本,我可用的版本是 網上檢視其它人不是這個版本,具體可能要自己試一下,我的Linux上環境可以部署成功的node版本是6.12.3,npm 版本是

windows環境配置tensorflow for C++完整流程

因為實驗室的需要,需要將一個工程中的python模組用C++改寫,python模組中用到了tensorflow架構,但是tensorflow作為一個對c++支援比較差的框架,為了解決其中的版本問題,我決定自己編譯這個庫來使用。軟體版本:VS2015update3+cuda9.

React-Native 之Android應用開發踩坑紀 (一)————windows環境配置

歡迎轉載,轉載註明出處: 我不只是看客 自從在公司中被老大安利了移動開發的未來 React-Native之後開始關注相關,想嘗試相關app開發。正好畢業準備畢設,腦子一熱就選擇了RN來開發一款app……題目上交就不能改了,現在好後悔。。。但硬著頭皮上吧 ,廢

Windows環境,如何TensorFlow-GPU選擇正確的CUDA版本和cuDNN版本

    又雙叒一次重新安裝系統,不得不再次安裝Python3和TensorFlow-GPU。    其實如果在Python3下只安裝的是TensorFlow-CPU版本的話,非常簡單,直接在命令列內敲:        pip3 install tensorflow就行。然而,

跟linux編輯器vi一樣強大--windows環境vim編輯器

 Vim的學習曲線相當的大(參看各種文字編輯器的學習曲線),所以,如果你一開始看到的是一大堆VIM的命令分類,你一定會對這個編輯器失去興趣的。你想以最快的速度學習人類史上最好的文字編輯器VIM嗎?你先得懂得如何在VIM倖存下來,然後一點一點地學習各種戲法。 Vim th

GO語言學習日記(一)Windows環境配置Go語言

 最近突然對Go語言非常感興趣,每一個語言在學習程式設計的時候就要學會配置環境,否者你是沒辦法編寫和編譯程式碼的。這裡就針對window的環境進行配置,其他系統的Go語言配置等我有心情的時候再去寫吧!   配置Golang語言的環境需要非常簡單,但是由於國內政策問題,導

Windows 環境配置MXNET教程

作業系統:Windows10 Professional X64 Visual studio:VS2013 CUDA:CUDA 7.5 OpenCV:OpenCV 3.0 1.程式需求 (1)VS2013的安裝,提供連結http://www.iplaysoft.com/vs

vmware虛擬機環境配置centos靜態IP的步驟

bubuko vmware虛擬機 電腦配置 static 虛擬 entos 步驟 war 配置 一、修改centos配置文件 配置文件位於/etc/sysconfig/network-scripts/ifcfg-eth0 修改的內容為: ONBOOT=yes B

Nginx 教程一:在windows環境的安裝、配置、使用以及設定windows服務自啟動

目前國內各大入口網站已經部署了Nginx,如新浪、網易、騰訊等;國內幾個重要的視訊分享網站也部署了Nginx,如六房間、酷6等。新近發現Nginx 技術在國內日趨火熱,越來越多的網站開始部署Nginx。     相比apeach、iis,nginx以輕量級、高效能、穩定

Windows環境Qt Creator配置Boost庫

環境 作業系統:windows 10 專業版 (Microsoft Windows 版本 1803 ,OS內部版本17134.48) IDE:Qt Creator 4.5.0(community) boost:boost 1.67.0 重要 在qt的p

windows環境wampserver的配置教程

module 單獨 ext 寫作 還需 sta write 打開 服務器 對於初做PHP網站的朋友來說,第一步肯定是希望在自己電腦是搭建PHP環境,省去空間和上傳的麻煩!但搭建環境也不是件容易的事情,特別是對於新手同學來說!因此在這裏跟大家介紹我作為一名新手在使用的方便好用

Windows環境QWT安裝及配置

blog data popu build design dem 用戶 script ava ** 1.QWT下載路徑 **:https://sourceforge.net/projects/qwt/ 主要下載這三個文件:qwt-6.1.2.zi

windows環境nginx服務器的安裝與配置

使用 .html cal html 資源 ive user 成功 onf 轉載至:http://www.cnblogs.com/hxxy2003/archive/2012/09/20/2695254.html nginx服務器是一個高性能的HTTP和反向代理服務器,它以穩

Windows環境Mysql如何快速導入或恢復表innodb的數據

數據恢復 myisam mysql的安裝 是否 安裝 導入表 style window 是你 註:   一、這個是對Innodb的數據恢復。MyISAM不需要這麽麻煩,只要數據文件存在直接復制過去就可以。   二、該方法只適用於       1:想要恢復或者導入表的ibd文

Idea下載後初始配置(windows環境)

輸入 ring 可能 破解 整合 註入 運行 images 同步 專業版的intellij可以免費試用30天。為了以後開發方便,咱們需要下載專業版進行破解和配置。 一、破解 安裝過程中有個界面如下,咱們選擇License server填上http://idea.iteb

Windows環境安裝配置Anaconda的Python開發環境

anacondaPython官方自帶的軟件只有基礎的庫文件,而在編程過程中需要使用各種類型的庫,都需要花費大量的時間去查找並不斷下載庫文件並加載到環境中去才能使用,這也是我自學Python遇到的一個困難點,anaconda提供了一個整合的環境解決了這個問題。 官方下載地址如下:(這裏選擇的是windows版本

Windows 環境 Docker 使用及配置

不同的 fault item 命令 oot def min 完成 /var/ 我們可以使用以下兩種方式在Windows環境下使用docker: 1. 直接安裝: Docker支持直接安裝並運行在windows環境下,但對Windows的版本和xu虛擬化服務等有著一定的要求。

Nginx在windows環境的安裝與簡單配置

erro send apache pdf lpad 首頁 調用 技術 ase 每天學習一點點 編程PDF電子書、視頻教程免費下載: http://www.shitanlife.com/code 一. 下載並安裝Nginx 去Nginx官網下載 我這裏選取nginx

windows環境wampserver配置https

bin 註釋 每天 圖片 自己 發生 example 正常 pac 因為公司業務主要是在微信上進行開展的,所以作為程序員的我們每天的開發任務就都是在與微信打交道,這個時候我們就需要在本地配置端口映射到外網,方便我們在微信客戶端進行調試。 最近某種需要,所以需要配置 http