http://www.viemu.com/a-why-vi-vim.html
推特上看來的。要記下來以後方便教別人 vi/vim 使用。
http://www.viemu.com/a-why-vi-vim.html
推特上看來的。要記下來以後方便教別人 vi/vim 使用。
筆記一下。好久沒有安裝 vim plugin 了,在安裝好 plugin 的文件之後 (放在 C:\Program Files\Vim\vimfiles\doc 裡面),要跑個指令讓 Vim 去掃一下文件檔,把標籤抓出來存著,以後 :help blah 的時候才找得到:
:helptags C:\Program\ Files\Vim\vimfiles\doc
這實在不是因為要龜毛,但當我們要指定座標的時候,輸入數值總是比用滑鼠一個個去對,要來得容易輕鬆。
Windows 是一個多視窗系統,有時候我們想要讓視窗可以水平並排 (或是垂直並排)。Windows shell 提供功能可以對非最小化視窗進行並排動作,平均分配高度或寬度。不過我們的桌面上通常都有十幾個視窗,為了並排其中一兩個,我們的把所有視窗縮小,再進行並排。有點麻煩。
幸好,我們想並排視窗的時候,通常是為了看著 B 視窗的內容在 A 視窗裡面輸入。B 視窗可以最大化,用 A 視窗遮著,不必並排也沒關係,而這個 A 視窗,對我來說,在 99% 的情況下都是 gvim。是 gvim 就好辦。我可以把要進行輸入的 gvim 視窗疊在上面;以 X32 1024x768 的螢幕來講,在 vim 下指令:
:set co=100,lines=17 :winpos 0 0
就可以把視窗定到左上角,100 個字元寬,17 行字元高。對 guifont=細明體:h15:cCHINESEBIG5 的字型設定來說,這樣差不多就佔了上半個螢幕。
輕鬆快樂 (偽) 並排作業,你也來試試。
對,我開始改這裡的程式了。所以紀錄一下編網頁的時候會用到的 autocmd:
au BufRead *.py set ai et nu sw=4 ts=4 tw=79 au BufRead *.html set ai et nu ts=4 sw=4 au BufRead *.htm set ai et nu ts=4 sw=4 au BufRead *.css set ai et nu ts=4 sw=4
再補一個 reStructuredText 的:
au BufRead *.rst set ai et nu ts=2 sw=2
VI Improved (vim) 有個很方便很好用的功能叫作 modeline。在檔案裡面,可以用該檔案標準的註解形式向 vim 下指令。譬如一個 reStructuredText 格式的文字檔,你可以加上以下的 modeline,讓 vim 在讀它的時候自動把檔案解釋為 rst (以取得正確的語法高亮):
某些文字。 .. vim: set ft=rst:
modeline 裡可以放的指令不限一個,所以我大部分的 .py 檔案在檔尾都有這麼一行的 modeline:
# vim: set ai et nu sw=4 ts=4 tw=79:
我喜歡這樣格式化過的 .py 檔案。
只有自己會看的檔案這麼作當然沒什麼問題,但如果有別人會看的話,這位別人用的又也是 vim,我們設的 modeline 或許會有點擾人。不過,vim 這麼強大的軟體,難道不能設定為根據檔案型態決定統一的設定嗎?當然可以,只是我一直懶得把這個功能找出來...
vim 可以針對指定的條件,在軟體發生指定事件的時候執行指令。這個功能叫作 autocmd。假設我希望在開啟每一個 .py 檔的時候都執行上面 modeline 的那些指令,可以設定一個以下的 autocmd (寫在你的 .vimrc 或 Windows 下的 _vimrc 裡):
au BufRead *.py set ai et nu sw=4 ts=4 tw=79
如果我們寫的程式要給別人看,希望留給別人的 vim 一點設定的空間,可以使用 autocmd 取代 modeline。
Vim 7.0 on win32 的 reStructuredText syntax 檔,在 highlight inline markup 的時候不能接受 inline markup 裡只有單獨的字元,然後讓 highlight syntax 爛掉。
沒找到別人的解法,所以我拿 2004 年放出來的初版 rst.vim 裡的 syntax command 暫時對付一下,在 rst.vim 的 s:DefineInlineMarkup 函式最後面加上:
execute 'syn region rstInlineLiteral start="' . \ a:start . '" end="' . a:end . '"'
(大概是在第 118 行的地方,要加在 endfunction 之前)。如此一來,Vim 會用最 aggresive 的方式 matching syntax,inline markup 裡的單獨字元便不再弄壞 highlighting 了。
休假,可以作些放鬆的事情。不過休息一下之後還是得辦正事 :(
為了提振精神,我決定把放著很久沒動的本 blog 程式作點昇級。本站 (http://blog.seety.org/everydaywork/,下同) 自從改用 Django 重新設計以來,一直是用 FastCGI 進行佈署的。在最近發行的 Django 0.95 中,也包含了 magic-removal 之後加入的 FastCGI 支援。當然,Django trunk 早就有這東西了,不過直到今天以前,我都還在用舊的 fcgi.py。
Django 0.95 不但已整合了 FastCGI 佈署程式,也寫好了 FastCGI 佈署文件,FastCGI 也成了 Django 建議的佈署方式之一。在某些情況下,用 FastCGI 佈署的動態程式會跑得比用 mod_python 佈署下的程式有效率,該文件有提到這一點。
Note
hmmm.... 不過我還沒有仔細研究是在「哪些」情況下。
好,在使用 django.core.servers.fastcgi 模組 (Django 中的 FastCGI 佈署支援) 前,要先安裝 flup。你用 Debian testing/unstable 的話,直接:
$ apt-get install python-flup
就好了 (that's one of the reasons for why I love Debian)。然後,在你的 htdoc 目錄下 (我用 Apache2) 開一個 blahblah.fcgi wrapper script 檔,在裡面寫些 Python script:
!/usr/bin/env python2.4 import sys, os sys.path.append( '/path/to/your/packages' ) os.environ['DJANGO_SETTINGS_MODULE'] = \ 'yoursite.settings' from django.core.srevers.fastcgi import fastcgi runfastcgi([ "method=threaded", "daemonize=false" ])
Django 的文件裡有更詳細的說明。本來,看他們的說明應該就足夠了,遺憾的是,Django 提供的 .fcgi wrapper 裡使用的
sys.path.insert(0, "/home/user/python")
寫法,有時候會出問題。我如果像 Django 文件那樣插入 Python search path (把新的 path 放在舊的前面),Apache2/FCGI 會報:
FastCGI: comm with (dynamic) server "blahblah.fcgi" aborted: (first read) idle timeout (30sec) FastCGI: incomplete headers (0 bytes) received from server "blahblah.fcgi"
這樣的錯誤,因為 blahblah.fcgi 根本無法啟動。我得把新的 search path 放到舊的 path 後面,blahblah.fcgi 才會乖乖聽話。
在 Apache2 裡當然還得作些必要的佈署,不過 Django 文件裡寫得很清楚了。Add-Handler, RewriteRules 的設定都沒什麼問題。本小站又成長了一些 :)
Update, OT: 順帶一提,VIM 7 多了幾個令人愉快的新功能:
自從發現 vim 支援檔案中的 metadata 之後,我有了一個煩惱。我喜歡給程式碼檔案顯示行號,而 vim 編的行號會佔去五個 column,減少了視窗的可視行寬。為此,常常需要手動調整一下視窗大小。因為顯示行號的動作不適合寫死在 .gvimrc 裡,所以都是手動操作 (:set nu),這樣順便拉一下視窗大小,還不會覺得很麻煩。
一旦發現可以把 :set nu 寫到檔案裡變成 metadata 給 vim 自動在讀檔的時候執行後,就沒有「順便」拉一下視窗大小這件事了。最近又換了片新的 LCD,螢幕的可視面積大增,提醒了自已該改改 vim 預設的行列尺寸才對。
這功能很基本,奇怪我以前怎麼沒有想到要改它。請到 ~/.gvimrc 裡加上:
set columns=120 set lines=40
(第二行之前誤植為 set rows=40,謝謝 Spooky 指正)。