驚豔的cygwin——Windows下的Linux命令列環境的配置和使用
原文地址:http://oldratlee.com/post/2012-12-22/stunning-cygwin
N年前倒騰過一次cygwin
,當時體驗感覺不好。到現在一直用的是GNU utilities for
Win32
,在Windows的CMD中使用*nix
的命令工具包。
GNU utilities for Win32
很久沒有更新,utils
的版本太低,很多功能沒有(比如grep
輸出不支援彩色輸出的選項--color
)等等。另,在Windows
的“cmd的自動補全”、“命令歷史”、“bat程式設計”太弱,一直忍受著~
# 以前寫過cmd
相關的博文:
Windows命令列CMD的使用小技巧、如何在Windows下使用GNU命令
最近大半年版本管理使用Git
,用的是msysgit。msysgit
帶了MSYS的Bash。用的過程中體驗不錯,很順暢很有Linux
的Feel了:
- 有
Git
命令的自動補全 - 彩色顯示
- 可以用
bash
功能(自動補全、歷史命令搜尋等等) bash
指令碼程式設計
昨天想到就倒騰了一下cygwin
,效果驚豔啊!
安裝
在cyginw
的安裝頁面上下載setup.exe
。
啟動選擇安裝目錄和Package的映象站點(自動會預設163的Package映象站點),然後選擇和調整要安裝的Package。
# 163提供的映象讓Package下載分分鐘搞定。163也提供了Ubuntu
等等的映象,163做得很贊!
安裝過程中,會提示cygwin
常用軟體推薦
setup
預設沒有選上的常用軟體,可以根據自己需要選上:
curl
vim
subversion
git
mysql
perl
python
ruby
ed
這裡特殊說一下bash-completion
命令補全的增強包,讓bash
補全更強勁!可以命令的選項的自動補全,如可以TAB
出grep
的各個選項。
但會影響命令列自動補全速度和cygwin
啟動速度,建議先安裝上,如果發現補全速度變慢不能接受,就解除安裝掉這個包。
bash-completion
沒有包含git
命令的自動補全,在獨立的git-completion
第一次啟動時會生成Home
目錄,在${cygwin}/home/${YOUR_USER_NAME}
。
# ${cygwin}
表示你的cygwin
安裝目錄。
顯示
調整${HOME}/.bashrc
檔案,把註釋掉別名開啟:
alias df='df -h'
alias du='du -h'
alias whence='type -a' # where, of a sort
alias grep='grep --color' # show differences in colour
alias egrep='egrep --color=auto' # show differences in colour
alias fgrep='fgrep --color=auto' # show differences in colour
alias ls='ls -h --color=tty' # classify files in colour
alias dir='ls --color=auto --format=vertical'
aliasvdir='ls --color=auto --format=long'
aliasll='ls -l' # long list
aliasla='ls -A' # all but . and ..
aliasl='ls -CF' #
aliaswch='which -a' # 簡化which的輸入,列出各個目錄中找到命令
aliasvi=vim # 對映vi命令到vim
這樣調整後,可以ls
、grep
、dir
輸出彩色顯示。
另外加上命令的-h
選項,這樣檔案大小以K、M、G顯示,方便人閱讀。
git
輸出(比如log
、status
)彩色顯示,使用下面的命令配置:
git config --global color.ui auto
vi配置
在${HOME}/.vimrc
檔案中加上:
# 沒有.vimrc
檔案就新建。
set number
set hlsearch
set fileencoding=utf-8
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
set tabstop=4
set shiftwidth=4
syntax enable
set nocompatible
set backspace=indent,eol,start
說明:
set number
:顯示行號。如果使用過程中要關掉,可以使用:set nonu
來關掉。set hlsearch
:搜尋到內容高亮。set fileencoding
和set fileencodings
:預設檔案編碼和自動識別檔案編碼順序set tabstop
和set shiftwidth
: 設定Tab
寬度,預設是8。syntax enable
:開啟語法高亮。cygwin
預設vim
沒有開啟。set nocompatible
和set backspace
:配置backspace鍵,預設backspace不起作用。
參考資料:
配置碟符的連結
到D盤,要/cygdrive/d
,可以新建符號連結/d
,這樣可以減少錄入(MSYS的做法)
ln -s /cygdrive/c /c
ln -s /cygdrive/d /d
ln -s /cygdrive/e /e
自動補全不區分大小寫
~/.bashrc
檔案中新增:
shopt -s nocaseglob
~/.inputrc
檔案中新增:
set completion-ignore-case on
配置按單詞移動/刪除
.inputrc
檔案中新增:
# Ctrl+Left/Right to move by whole words
"\e[1;5C": forward-word
"\e[1;5D": backward-word
# Ctrl+Backspace/Delete to delete whole words
"\e[3;5~":kill-word
"\C-_": backward-kill-word
Windows
和cygwin
路徑的轉換
cygwin
的路徑和Windows
的路徑表示不一樣。
要注意的是,cygwin
下的cd
命令可以直接使用Windows
的路徑表示。
$ cd'C:\Windows\System32\drivers\etc'
注:不要忘了加上單引號,因為\
是bash
元字元,用於轉義。不用上單引號cd
命令收到的引數值就不是C:\Windows\System32\drivers\etc
,執行報錯。
路徑轉換的需求減了大半。
有cygpath
命令來完成轉換,相關的選項是:
-a, --absolute output absolute path
-w, --windows print Windows form of NAMEs (C:\WINNT)
-u, --unix (default) print Unix form of NAMEs (/cygdrive/c/winnt)
執行的例子:
$ cygpath -au 'C:\Windows\System32\drivers\etc'
/cygdrive/c/Windows/System32/drivers/etc
$ cygpath -aw '/cygdrive/c/Windows/System32/drivers/etc'
C:\Windows\System32\drivers\etc
在cygwin
的開啟指定檔案或資料夾到檔案瀏覽器
常常會有這樣的需求,比如開啟檔案瀏覽器explorer
,然後用烏龜看svn
日誌等等。
可以使用使用命令直接開啟指定檔案或資料夾的位置到explorer
。
開啟檔案或資料夾指令碼,可以這個指令碼命名成xpl
,加到PATH
環境變數中。
# xpl
是explorer
的縮寫
#!/bin/bash
cygwin=false;
case "`uname`" in
CYGWIN*) cygwin=true;;
esac
if [ "$1" = "" ]; then
XPATH=.# 預設是當前目錄
else
XPATH=$1
if$cygwin; then
XPATH="$(cygpath -C ANSI -w "$XPATH")";
fi
fi
explorer $XPATH
開啟檔案或資料夾,並選中的指令碼,可以這個指令碼命名成xpf
,加到PATH
環境變數中。
# xpf
是explorer and select file
的縮寫
#!/bin/bash
cygwin=false;
case "`uname`" in
CYGWIN*) cygwin=true;;
esac
if [ "$1" = "" ]; then
XPATH=.# 預設是當前目錄
else
XPATH=$1
if$cygwin; then
XPATH="$(cygpath -C ANSI -w "$XPATH")";
fi
fi
explorer '/select,' $XPATH
檔案許可權問題
現象
Windows
驅動上的檔案的cygwin
下沒有許可權:
$ rmfoo.txt
error: open("foo.txt"): Permission denied
error: unable to indexfile foo.txt
$ ll foo.txt
----------+ 1 Jerry None 486 Dec 24 14:16 foo.txt
檔案的許可權顯示的是----------+
,沒有讀寫的許可權。
解決方法
編輯/etc/fstab
,在末尾加上下面的一行:
none /cygdrivecygdrive binary,noacl,posix=0,user 0 0
關閉所有cygwin程序,再重啟cygwin命令列。
顯示檔案許可權已經正常-rw-r--r--
:
$ ll foo.txt
-rw-r--r-- 1 Jerry None 486 Dec 24 14:16 foo.tx
注意! 如果改了/etc/fstab
但是沒有生效,可以重啟一下機器!
Windows命令的亂碼
Windows
命令的輸出中文亂碼,原因是Windows
命令輸出的編碼是GBK
。cygwin
控制檯mintty
的編碼預設是UTF-8
。mintty
的選項的【Text】把編碼改成GBK
即可。
參見:本文“文字配置:字型、編碼”一節的截圖。
命令視窗設定:字型、複製/貼上等等
這些設定對使用的舒適度至關重要。
cygwin
的執行檔案是mintty.exe
,在命令視窗的標題的右鍵選單上有【options】項,有這些配置項。
外觀
配置游標顯示、窗體透明。
文字配置:字型、編碼
配置顯示字型。
我喜歡用Consolas
字型,這是Windows
上一款質量很高的等寬字型。
貼上配置
右鍵貼上配置
配置右鍵用於貼上,預設是彈出選單。這個配置很方便!
另外
cygwin
的mintty
預設就是『選中文字』即完成複製。- 快捷鍵【CRTL + Insert】/【SHIFT + Insert】一直是可以用來複制/貼上的,使用快捷鍵還是右鍵,可以根據自己的喜好和順手度來選。比如
- 我在滑鼠選中複製後,順手就用滑鼠右鍵來貼上。
- 如果用【CTRL+C】在其它視窗複製了內容,【Alt + TAB】到
cygwin
,就順手繼續來鍵盤【SHIFT + Insert】來貼上。
效果圖
展示了ls
、grep
輸出的彩色顯示,和字型效果。
vi
的語法高亮就不再截圖了。
一些最佳實踐
後記
之前對cygwin
這種適配的做法有偏見,覺得做得不會好。其實有了一個好點子,又有為之努力的人在,就會越來越好,從“醜小鴨”變成驚豔的“天鵝”。
謝謝這些為之不懈努力的人!
有了cygwin
,讓我對MacBook Pro
的需求程度降低了,在Windows
上還可以再呆一下子。 :)
OS
作為一個工作環境,幫我方便的完成要做的事,關注點是:
- 方便的大量的軟體。
Windows
這一點太強。 - 高質量的
UI
。Linux
這一點太差。 - 對程式設計師來說,舒適的命令列環境是呼吸的空氣。
Windows
的cmd
太弱,有了cygwin
可頂一下。
2014年2月24日補記
- 新增推薦軟體一節
- 新增
cygwin
命令列包管理說明 - 加強『貼上一節』
- 增加命令別名
alias vi=vim
- 修正排版和字句
PS:
2013年7月入了RMBP 15',對於程式設計師來說,生活質量確實提高不少 :)
# 這裡不得不提zsh
和oh-my-zsh!其實zsh
支援cygwin
,網上有很多資料,改天補上簡單的上手說明。
但是開了Windows
虛擬機器,因為
- 公司用旺旺作為
IM
,Windows
版本好很多。
我不是Mac或是XXX的教徒,有優點、能舒服的解決問題,就採用。