1. 程式人生 > >驚豔的cygwin——Windows下的Linux命令列環境的配置和使用

驚豔的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,用的是msysgitmsysgit帶了MSYS的Bash。用的過程中體驗不錯,很順暢很有Linux的Feel了:

  • Git命令的自動補全
  • 彩色顯示
  • 可以用bash功能(自動補全、歷史命令搜尋等等)
  • bash指令碼程式設計

昨天想到就倒騰了一下cygwin,效果驚豔啊!

安裝

cyginw安裝頁面上下載setup.exe

啟動選擇安裝目錄和Package的映象站點(自動會預設163的Package映象站點),然後選擇和調整要安裝的Package。
# 163提供的映象讓Package下載分分鐘搞定。163也提供了Ubuntu等等的映象,163做得很贊!

安裝過程中,會提示cygwin

的安裝目錄安裝包的本地存放目錄,推薦把這2個目錄分開,讓檔案更有整潔清楚。

常用軟體推薦

setup預設沒有選上的常用軟體,可以根據自己需要選上:

  • curl
  • vim
  • subversion
  • git
  • mysql
  • perl
  • python
  • ruby
  • ed

這裡特殊說一下bash-completion 命令補全的增強包,讓bash補全更強勁!可以命令的選項的自動補全,如可以TABgrep的各個選項。

但會影響命令列自動補全速度和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

這樣調整後,可以lsgrepdir輸出彩色顯示。

另外加上命令的-h選項,這樣檔案大小以K、M、G顯示,方便人閱讀。

git輸出(比如logstatus)彩色顯示,使用下面的命令配置:

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 fileencodingset fileencodings:預設檔案編碼和自動識別檔案編碼順序
  • set tabstopset shiftwidth: 設定Tab寬度,預設是8。
  • syntax enable:開啟語法高亮。cygwin預設vim沒有開啟。
  • set nocompatibleset 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

Windowscygwin路徑的轉換

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環境變數中。
# xplexplorer的縮寫

#!/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環境變數中。
# xpfexplorer 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命令輸出的編碼是GBKcygwin控制檯mintty的編碼預設是UTF-8mintty的選項的【Text】把編碼改成GBK即可。

參見:本文“文字配置:字型、編碼”一節的截圖。

命令視窗設定:字型、複製/貼上等等

這些設定對使用的舒適度至關重要。

cygwin的執行檔案是mintty.exe,在命令視窗的標題的右鍵選單上有【options】項,有這些配置項。

外觀

外觀 配置游標顯示、窗體透明。

文字配置:字型、編碼

字型 配置顯示字型。

我喜歡用Consolas字型,這是Windows上一款質量很高的等寬字型。

貼上配置

右鍵貼上配置
右鍵貼上配置

配置右鍵用於貼上,預設是彈出選單。這個配置很方便!

另外

  • cygwinmintty預設就是『選中文字』即完成複製。
  • 快捷鍵【CRTL + Insert】/【SHIFT + Insert】一直是可以用來複制/貼上的,使用快捷鍵還是右鍵,可以根據自己的喜好和順手度來選。比如
    • 我在滑鼠選中複製後,順手就用滑鼠右鍵來貼上。
    • 如果用【CTRL+C】在其它視窗複製了內容,【Alt + TAB】到cygwin,就順手繼續來鍵盤【SHIFT + Insert】來貼上。

效果圖

效果圖

展示了lsgrep輸出的彩色顯示,和字型效果。

vi的語法高亮就不再截圖了。

一些最佳實踐

後記

之前對cygwin這種適配的做法有偏見,覺得做得不會好。其實有了一個好點子,又有為之努力的人在,就會越來越好,從“醜小鴨”變成驚豔的“天鵝”。

謝謝這些為之不懈努力的人!

有了cygwin,讓我對MacBook Pro的需求程度降低了,在Windows上還可以再呆一下子。 :)

OS作為一個工作環境,幫我方便的完成要做的事,關注點是:

  • 方便的大量的軟體。Windows這一點太強。
  • 高質量的UILinux這一點太差。
  • 對程式設計師來說,舒適的命令列環境是呼吸的空氣。Windowscmd太弱,有了cygwin可頂一下。

2014年2月24日補記

  • 新增推薦軟體一節
  • 新增cygwin命令列包管理說明
  • 加強『貼上一節』
  • 增加命令別名 alias vi=vim
  • 修正排版和字句

PS:

2013年7月入了RMBP 15',對於程式設計師來說,生活質量確實提高不少 :)
# 這裡不得不提zshoh-my-zsh!其實zsh支援cygwin,網上有很多資料,改天補上簡單的上手說明。

但是開了Windows虛擬機器,因為

  • 公司用旺旺作為IMWindows版本好很多。

我不是Mac或是XXX的教徒,有優點、能舒服的解決問題,就採用。

相關資料