2009/02/05

打造自己的VIM: 修改目錄(功能表)

本篇文章是[Make vim more powerful cont. and prolog]系列的第一篇。這篇文章要分享我修改vim目錄的一些分得,保括了修改目錄的方法、指令、希望修改的地方,最後將會貼一些修改後的圖及我的設定檔給各位取用。

VIM目錄基本上都會有一串數字來代表他的位置,舉例來說Close這個menu item所在的位置為10.330,如下圖所示,若想要再插入一個目錄在它底下其位址可介於10.330到10.335之間。若想在10.330處插入一個子目錄則是位址可以由10.330.0開始到10.330.9999。



指令

跟目錄有關的指令,基本上我只用到:anoremenu(abbr. :an)這個指令,它是用來插入一個目錄,而且不能remap。譬如說我想插入一個指令
  1. 在10.320的位置
  2. 第一層的menu item name為File且快速鍵為f
  3. 第二層的menu item name為Open Tab ...且沒有快速鍵
  4. 提示的指令為:tabnew
  5. 真正執行的指令為:browse tabnew
這個指令如下:

:an 10.320 &File.Open\ Tab\.\.\.<TAB>:tabnew :browse tabnew<CR>

要注意的是有些特殊字元必需用"\"來跳脫,像是"."或" "。另外<TAB>是換行的意思。

此外,若是想插入一個分隔線則指令如下:

:an 10.400 &File.-SEP2-

其中-SEP2-,同一階的目錄下名字必需不同。

若是想知道更多指令,亦或是針對不同mode出現的目錄,就自行參考[vim document usr_42]。此外,如果有人有興趣瞭解script基本語法,像是流程控制、變數型態、變數類型等等,可再自己看一下[vim document usr_41]。


目錄設定檔在哪?

可以用:version指令找到,截圖如下:



我想要改成...

在修改前,先列一下我們想要修改的地方吧:
  • 加入我自己的快速鍵
  • 把不會用到的功能刪掉
  • 一些我認為它擺錯地方的目錄移到正確的地方

修改後的結果...

Edit menu: 擴充了Find的指令,像是Find Files or Find in Files,還有一些有關設定的都放在這。


Tools menu: 加了不少自己工具,像是Code Trace、Virsual Mark等等,這些功能在之後的文章才會介紹。


View menu: 又加了不少特殊功能,F5到F7都是,這些都後面幾篇文章會介紹。



結論

「師父引入門,修行在個人」學習vim也是這樣,有心想要修改自己目錄的人都應該要自己開一下$VIMRUNTIME\menu.vim有看看,並且視自己的需求打造自己的編輯器,改過一些東西后就會發覺原來改目錄那麼簡單。所以,還等什麼,快點把你的設定檔打開吧!

我的設定檔:http://sites.google.com/site/fcwunctu/vim

2009/02/04

VIM tip: 將tab取代成space及程式縮排方式

最近找到一個vim的網站 Daily VIM,是關於一些vim tips,裡頭有些東西還不錯,近期如果有空應該會轉錄一些我覺得比較有用的到我這來。

過去將全文裡的tabs取代成space我多半用取代的方式:

:%s/\t/ /cgi

另一作法,vim控制tab距離是靠tabstop (option),若是要根據tabstop來轉換tab成space,可以用這個方法:

:set expandtab
:retab!


其中,tabstop的值可以用類似這種指令來控制:

:set tabstop=2

稍微提一下,expandtab不是只用到這裡,若是想在編輯時自動將tab轉換成space可以用此命令。而取代所有tab成space的命令是retab這行。

在縮排程式時,有另一個常用的情形是這樣,將某行右移一個tab距離,即在normal mode時,輸入>>。若要左移則輸入<<。若要縮排一個區塊則可用V先選擇欲縮排的區塊,再輸入一個<>即可。當然,若是想要多縮幾個tab距離則可以按.來重覆上一個動作。這裡的一個tab距離寬度是用shiftwidth這個option來控制的。

另外,還有一種自動縮排的功能"=",跟之前一樣先選擇一塊區塊用V鍵,再輸入=則自動完成縮排。

2009/02/03

打造自己的VIM

一年前寫了一篇關於vim的文章[Make vim more powerful], 那篇文章裡介紹了許多scripts或是小技巧,但現在來看這些scripts or tips都有一些更好的方法來取代之。此外,再加上最近因為開始了我的第一份"正式"的工作,所以我花了點時間,又重新修改我的vim環境,讓他更適合現 在的工作。這篇文章主要要介紹大都以之前那篇文章以底,並再做些更新,最後會再附上我目前的設定給大家參考。

以下是我所做的所有增加或修改,並且在後面列出快速鍵(如果有的話):
  1. [menu修改]
  2. [多檔編輯TabBar]
  3. [檔案總管 NERD Tree] (F5)
  4. [多檔字串搜尋 EasyGrep] (f/)
  5. [檔案搜尋 FuzzyFinder] (ff)
  6. [Folding 程式碼摺疊]
  7. [Marks 書籤及游標移動] (F9)
  8. [QuickFix 編譯視窗] (F8)
  9. [函式列表 TagList] (F6)
  10. [源碼追蹤ctags+cscope及預覽視窗SrcExpl] (F7)
  11. [源碼補齊 SuperTab OmniCppComplete Code_Complete]
  12. [YouCompleteMe 源碼補齊,最近改用這個]
因為功能不少,所以我也順便修改了menu,除了把我自己增加的功能放到menu裡(提醒用),也把原本gvim那不合理(我自認為)的MenuItems排列大搬家了一下,所以首先我會先介紹menu如何修改,並接序的主題儘量以menu來以一貫之。

除了這些內容外,關於VIM的文章還有VIM tip系列,要找到他們可以直接從右邊的搜尋欄輸入vim tip即可找到他們,當然這些內容會持續的更新。


最後,我的設定檔可以在[這裡]抓,需要的人請自行取用。

2009/02/01

Ubuntu: convert wav file to mp3

最近想在每天坐捷運時練練英文,我自認為英文讀寫的能力還不錯(比起聽說,聽說應該是爛到爆),所以買了一本比較注重生活會話的雜誌來每天閱讀,不知道這股拚勁什麼時候會消磨光 :)。那本雜誌的會話光碟是給wav檔,我的ipod nano沒法放那種檔案,所以只好先來轉檔了。(ipod nano是我可愛的女友送我的,大概用了2個禮拜,心得是"頗爛"。原因由iTune不好用,放歌很麻煩,音質不好)

前面都是廢話,跟本篇的主題一點關係都沒有。在Ubuntu中轉wav檔成mp3檔很簡單,先安裝lame
sudo aptitude install lame
接著再使用lame指令來轉,像是
lame -h -b 128 1.wav 1.mp3
上面是第一個方法,再介紹另一個方法,在ubuntu 8.10中的nautilus中己經有script可以幫助轉檔了,安裝這個套件 nautilus-script-audio-convert,再右鍵點選欲轉檔的檔案,選Scripts->ConvertAudioFile,接著steps by steps就完成轉檔了。

2009/01/30

Write OS: 使用開源軟體-自己動手寫作業系統

今天終於把[使用開源軟體-自己動手寫作業系統]看完,我一直都對寫作業系統很有興趣,但是一直遲遲找不到一個好的開始,因此很感謝[楊文博]寫得這本免費電子書, 讓所有有心專研這方面的人能有個完整的學習, 雖然現在這本書還沒完成,但讀完後還是授益匪淺。

目前這本書完成了3章,首先第一章的計算機啟動介紹了計算機啟動方式,基本硬體簡介及開發OS時所需使用的開源軟體。

第2章則由OS版的Hello World開始介紹(example 2-1),並進一步將Hello World放至FAT12的File system裡以擺脫512Bytes (Sector size)的限制 (example 2-2)。

第3章則由real mode進入了protected mode,本章第一個例子 (example 3-1) 便說明了GDT (Global Descriptor Table),Segment Selector 的重要觀念, 並且使用了 far jump 跳到 protected mode。接著 example 3-2 則代入了LDT (Local Descriptor Table),LDT的存在主要是為了 multi-task 環境所設計,不同的 task 擁有自己的記憶體區段。在Descriptor裡,為了使OS更加安全,descriptor包含了權限的設計,Intel設計了ring 0(高)到ring 3(低)來加以區隔 user/kernel permission,為了使權限平和的轉移,便設計了call gate來輔助,call gate說穿了只是一種特殊的descriptor,example 3-3 展示了如何使用 call gate 由一 segment 跳至另一 segment。在 example 3-3尚未展示真正的權限轉移,example 3-4做了這方面的修正,由高權限跳至低權限。example 3-5則由低權限跳至高權限,並且一起做了Task State切換(TSS: Task State Segment)。Example 3-6開始使用了paging的技術,Example 3-7則對Page Directory Size根對計憶體大小作一最佳化,Example 3-8則真的了展示Virtual memory的作用。


最後,對於有心要寫OS的人,Intel的這本書[Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A: System Programming Guide]的前幾章有些章節是必讀的,有心的人可以自己下載回來看看,想要紙本的人,也可以跟他們要。