cygwin的坑坑窪窪

背景介紹

使用中遇到的問題

cygwin使用過程當中存在不少問題,例如權限、時區之類的問題。html

本文目的

弄清楚cygwin的哪些操做或者特性會跟windows自己的衝突,以便更好的使用cygwin管理Windows Server系統。node

環境

操做系統:WindowsServer2012 x64linux

Cygwin版本: CYGWIN_NT-6.2 TEST 2.0.2(0.287/5/3)2015-05-0817:00 x86_64 Cygwinshell

Cygwin核心概念

Windows安全概述

Windows NT系統包含了一個基於ACL的複雜的安全模型,cygwin默認狀況下在支持它們的文件系統(一般會是NTFS)上將Win32文件的屬主和權限映射爲ACL。擁有Administrator權限的用戶能夠修改文件的屬主。數據庫

在Windows安全模型中,幾乎全部的object都是安全的。這裏的object指的是文件、進程、線程、信號量等。每個object都有一個叫作SD(security descriptor)的數據結構,SD包含了全部的權限管理信息。vim

SD包含下面幾個要素:windows

  • Flags which control several aspects of this SD. This is not discussed here.安全

  • object屬主的SIDbash

  • object屬組的SID網絡

  • 一個ACE(Access Control Entries)列表,稱爲DACL(Discretionary Access Control List)

  • 另一個ACE列表,稱爲SACL(Security Access Control List)

每一個ACE都包含一個SID(Security IDentifier)。SID是全部用戶、組、計算機、AD域的惟一標識符。與POSIX中的UID/GID不一樣的是,SID是跨計算機、域全局惟一的。

例如:一個計算機「foo」的SID爲:

S-1-5-21-165875785-1005667432-441284377

該計算機「foo」中的一個用戶「johndoe」的SID爲:

S-1-5-21-165875785-1005667432-441284377-1023

格式:

  • 第1段恆爲S;第2段爲SID結構的版本號,目前爲1;

  • 第三、4段表明SID的類型或類別,計算機和域永遠以S-1-5-21開始;

  • 接下來的3段是一個32位的值,表明一個計算機系統的96位惟一標識;

  • 用戶的SID是在計算機SID的後面加上一個編號,這個編號稱爲RID(relative identifier),當用戶建立的時候,RID就跟着一塊兒建立出來了。

對域而言,也是相似的結構。 
SID of a domain 「bar.local」:

S-1-5-21-186985262-1144665072-740312968

SID of a user 「johndoe」 in the domain 「bar.local」:

S-1-5-21-186985262-1144665072-740312968-1207

注意:雖然上面的johndoe用戶在計算機中存在,又在域中存在,可是他具備不一樣的SID,所以這兩個SID並非同一個帳戶。不一樣的SID,就是不一樣的帳戶。

從Cygwin 1.7.34版本以後,cygwin就會自動的將Windows中的SID翻譯成POSIX的UID、GID。Windows系統中的RID會被轉換成/etc/passwd、/etc/group中的UID、GID。

ACE包含3個部分:

  • ACE類型:allow ACE或deny ACE

  • 32位的權限位

  • 這些權限容許或拒絕的SID

文件權限

cygwin將Windows系統的文件權限實現成POSIX的文件權限,而POSIX文件是以ACL來管理文件權限的。POSIX的文件、目錄權限是被mount選項來控制的,默認設置爲acl。 
也就是說在默認狀況下,/etc/fstab文件內容爲:

none /cygdrive cygdrive binary,posix=0,user 00

這說明cygwin會模擬POSIX文件權限,從而可能會致使Windows系統中應用程序的文件權限產生混亂,爲了解決這個問題,須要添加noacl參數,將/etc/fatab改成:

none /cygdrive cygdrive binary,user,noacl,posix=000

在D:\(即/cygwin/d)下分別建立3個文件測試一下權限,效果分別以下圖所示: 
150605170455

左圖爲Windows系統中建立的文件的權限,中間爲cygwin在默認狀況下模擬POSIX文件權限建立出來的文件權限,右圖爲cygwin添加了noacl參數以後,在cygwin中建立的文件的權限。能夠看出,添加noacl參數以後,cygwin將不會模擬POSIX文件權限,在cygwin中建立的文件的權限跟Windows系統的文件權限保持一致。

可是上面的改動僅僅是修改了/cygdrive目錄,也就是windows系統中的全部的磁盤(C:、D:、E:、F:等),而cygwin自己的/並未修改,一樣會存在上述的權限問題,所以須要一併修改,最終完整的/etc/fatab文件內容以下:

none /cygdrive cygdrive binary,user,noacl,posix=000
D:\cygwin64 / ntfs binary,noacl,override00
D:\cygwin64\bin/usr/bin ntfs binary,noacl,override00
D:\cygwin64\lib /usr/lib ntfs binary,noacl,override00

cygserver

cygserver 是爲Cygwin做爲後臺服務運行而設計的,默認安裝Cygwin的時候並無啓動它。咱們須要打開它,並將它做爲Windows的標準服務來安裝。

在Cygwin中輸入命令:

cygserver-config

按照界面提示進行cygserver的安裝,並贊成將其安裝爲服務。

運行該服務:

cygrunsrv --start cygserver

cygrunsrv實際上是啓動的Windows標準服務cygserver,這個命令也能夠在Cmd下這樣作: net start cygserver,或者也能夠按下按鍵 Windows+R ,鍵入 services.msc 回車,找到CYGWI cygwerver服務,並啓動之。

查看cygserver服務的狀態:

cygrunsrv --qurey cygserver

cygserver的配置文件:

/etc/cygserver.conf

cygwin命令行工具

全部cygwin的命令行工具都支持 –help(-h)/–version 參數來獲取幫助和查詢版本。

cygcheck:列出系統信息,檢查已安裝的包,查詢包的數據庫。
cygpath:對windows和unix文件路徑作轉換。例如,對於文件「~/.bashrc」-w轉換爲windows文件路徑「D:\cygwin64\home\yhn1792\.bashrc」,-u轉換爲unix文件路徑「/home/yhn1792/.bashrc」。
dumper:對windows進程進行core dump,便於進行gdb調試。
getconf:將系統配置變量值寫入標準輸出。
getfacl:獲取文件或目錄的ACL。
setfacl:設置文件或目錄的ACL。
kill:給cygwin進程發送信號。
ldd:顯示共享的lib依賴關係。
locale:獲取locale信息。
mkgroup:顯示/etc/group風格的組。
mkpasswd:顯示/etc/passwd風格的用戶。
mount:顯示掛載點,或掛載文件系統。
umount:卸載文件系統。
passwd:修改用戶的密碼或者密碼的屬性。
pldd:顯示一個進程加載的動態共享對象。
ps:顯示cygwin進程的狀態。-W參數能夠列出windows系統的進程。
regtool:查看或者修改windows系統的註冊表。
strace:跟蹤系統調用和信號。
tzset:從當前的windows系統時區設置中打印POSIX兼容的時區ID。export TZ=$(tzset)

HOME主目錄

若是某些其餘軟件(如msysGit)爲 Windows 設置了 HOME 環境變量,會影響到 Cygwin 中用戶主目錄的設置,甚至會形成在 Cygwin 中不一樣的命令有不一樣的用戶主目錄的狀況。例如:Cygwin下Git 的用戶主目錄被設置爲 /cygdrive/c/Documents and Settings/jiangxin,而 SSH 客戶端軟件的主目錄被設置爲 /home/jiangxin,這會給用戶形成困惑。

之因此出現這種狀況,是由於 Cygwin 肯定用戶主目錄有幾個不一樣的依據,要按照順序肯定主目錄:

  • 首先查看系統的 HOME 環境變量;

  • 其次查看 /etc/passwd 中爲用戶設置的主目錄。

有的軟件遵守這個原則,而有些 Cygwin 應用如 SSH,卻沒有使用 HOME 環境變量而是直接使用 /etc/passwd 中的設置。要想避免在同一個 Cygwin 環境下有兩個不一樣的用戶主目錄設置,能夠採用下面兩種方法。

方法1:修改 Cygwin 啓動的批處理文件(如:C:\cygwin\Cygwin.bat ),在批處理的開頭添加以下的一行代碼,就能夠防止其餘軟件在 Windows 引入的 HOME 環境變量被帶入到 Cygwin 中。

set HOME=

方法2:若是但願使用 HOME 環境變量指向的主目錄,則可經過手工編輯 /etc/passwd 文件,將其中的用戶主目錄修改爲 HOME 環境變量所指向的目錄。

命令行補齊忽略文件名大小寫

Windows 的文件系統忽略文件名的大小寫,在 Cygwin 下最好對命令行補齊進行相關設置,以忽略大小寫,這樣使用起來更方便。 
編輯文件 ~/.inputrc ,在其中添加設置:

set completion-ignore-case on

或者取消已有的相關設置前面的井(#)號註釋符。

修改完畢後,再從新進入 Cygwin,這樣就能夠實現命令行補齊對文件名大小寫的忽略。

時區

查看時區命令:

tzset

查看時區環境變量:

echo $TZ

查看系統當前時間(UTC時間):

cygcheck -s | grep -i time

查看當前時間(GMT時間):

date -R

下面,經過一個樣例來演示如何設置時區:

### 查看當前UTC時間
$ cygcheck -s | grep -i time
CurrentSystemTime:FriJun0507:50:252015### 查看當前GMT時間,UTC+8小時
$ date -R
Fri,05Jun201515:50:44+0800### 設置爲洛杉磯時間進行測試(注意:此時僅在當前shell環境生效,如需全局生效請寫入配置文件)
$ export TZ=America/Los_Angeles### UTC時間不變
$ cygcheck -s | grep -i time
CurrentSystemTime:FriJun0508:50:502015### 當前時間變爲洛杉磯當地時間,UTC-7
$ date -R
Fri,05Jun201500:50:56-0700

文件系統

cygwin支持POSIX以及Win32類型的文件路徑格式,使用/或者\來分割文件路徑。cygwin的DLL庫會根據須要將POSIX格式轉換爲native NT格式。

$ df -h
文件系統容量已用可用已用%掛載點
D:/cygwin64/bin   16G661M15G5%/usr/bin
D:/cygwin64/lib   16G661M15G5%/usr/lib
D:/cygwin64       16G  661M   15G    5% /
C:45G18G27G41%/cygdrive/c
D:16G661M15G5%/cygdrive/d
E:3.6G3.6G0100%/cygdrive/e

從cygwin1.7.0版本以後,Windows文件系統的POSIX樣式佈局將會保存在/etc/fatab文件中,這是一個全局文件,每一個用戶的文件能夠保存在/etc/fstab.d/${USER}。

$ cat /etc/fatab
none /cygdrive cygdrive binary,posix=0,user 00

符號連接

cygwin用如下幾種方式建立符號連接:

  • 默認以純文本格式建立,指明瞭目標文件的路徑,標記爲DOS SYSTEM屬性,使用UTF-16編碼目標文件的文件名;

  • Windows的快捷方式格式.lnk,有一個特殊的header和DOS READONLY屬性,當CYGWIN環境變量設置爲winsymlinks 或winsymlinks:lnk的時候將會建立這種類型的符號連接;

  • Native Windows symlinks:Windows Vista/2008或更新版本,當CYGWIN環境變量設置爲winsymlinks:native or winsymlinks: nativestrict的時候將會建立這種類型的符號連接;

  • 在NFS文件系統上,cygwin會建立真正的NFS符號連接;

注意:上述的各類符號連接能在全部環境下識別和使用,可是若是純文本符號連接丟失了DOS SYSTEM屬性、快捷方式格式的符號連接丟失了DOS READONLY屬性,那它們將不會被認爲是一個符號連接。

硬連接

Hard links are fully supported on NTFS and NFS file systems. On FAT and other file systems which don’t support hardlinks, the call returns with an error, just like on other POSIX systems.

inode

On file systems which don’t support unique persistent file IDs (FAT, older Samba shares) the inode number for a file is calculated by hashing its full Win32 path. The inode number generated by the stat call always matches the one returned in d_ino of the dirent structure. It is worth noting that the number produced by this method is not guaranteed to be unique. However, we have not found this to be a significant problem because of the low probability of generating a duplicate inode number.

$ ls -lai /tmp/總用量23281474976710864 drwxrwxrwt+1AdministratorNone06月114:30.281474976710851 drwxr-xr-x+1AdministratorNone06月119:07..844424930152905-rw-r--r--1AdministratorNone776月114:29 awk.1040844424930152887-rw-r--r--1AdministratorNone776月114:29 awk.1668844424930150273-rw-r--r--1AdministratorNone776月114:22 awk.1716

擴展屬性

Cygwin 1.7 and later supports Extended Attributes (EAs) via the linux-specific function calls getxattr, setxattr, list xattr, and removexattr. All EAs on Samba or NTFS are treated as user EAs, so, if the name of an EA is 「foo」 from the Windows perspective, it’s transformed into 「user.foo」 within Cygwin. This allows Linux-compatible EA operations and keeps tools like attr, or setfattr happy.

chroot

chroot從cygwin1.1.3開始支持,可是chroot並非Windows上的概念。 
在cygwin上chroot有不少限制: 
a)chroot不是一個提高權限的命令,全部用戶均可以調用它; 
b)對本地Windows進程而言,chroot環境並不安全。 
因此,在cygwin環境下不建議使用chroot。

文本模式和二進制模式

Windows本地應用建立的文件是能夠與cygwin應用共同協做的。例如,Windows本地應用建立的文件,應該是能夠被cygwin應用可讀的,反之亦然。

可是在文本文件中,Win32和UNIX是有不一樣的行結束符的。UNIX文本文件中行結束符是一個換行(Line Feed,LF),而Win32文本文件中是兩個字符:一個回車符(Carriage Return,CR)和一個換行(Line Feed,LF)。

Unix/Binary:若是選擇這一項,Cygwin不會轉換文本文件中的行結束符。這是默認選項,適用於大多數的用戶。選擇該選項意味着,用標準的Windows工具(如Notepad)建立的文件,在用Cygwin環境下編譯的程序(如cat)來查看時,貌似帶有額外的行結束符。

DOS/Text:在這種模式下,Cygwin試圖轉換文件的行結束符,這樣一來,用標準的Windows編輯器建立的文件和程序就好像是在Cygwin下運行的程序,由於每一個行結束符只有一個LF字符。Cygwin不會爲以二進制方式打開的文件執行該轉換。(回想一下,在打開文件時須要傳遞一個標誌,代表文件是文本仍是二進制數據。)除非須要在環境中使用開發宿主機上的某些」頑固」的程序,不然不該該選擇該選項。

進程的建立

cygwin的fork系統調用沒有與Win32的API映射的很好,這致使很難正確的實現fork調用。當前,cygwin fork並非copy-on-write機制。 
在cygwin中,父進程建立子進程的流程:

  • 父進程爲子進程在cygwin進程表上初始化一個空間;

  • 使用Win32的CreateProcess調用建立一個掛起的子進程;

  • 父進程調用setjmp來保存他本身的上下文,並在cygwin共享內存中設置一個指向該上下文的指針;

  • 父進程拷貝本身地址空間的數據到這個掛起的子進程的地址空間,來填充子進程的.data和.bss;

  • 當子進程的地址空間初始化完成以後,子進程開始進入運行狀態,父進程等待互斥量;

  • 子進程發現本身已經被fork出來,而後使用以保存的調轉buffer進行跳轉。而後子進程設置父進程等待的互斥量,而且被另一個互斥量阻塞;

  • 父進程將堆棧數據拷貝到子進程,以後父進程釋放子進程等待的互斥量,而且從fork調用中返回;

  • 最後,子進程從最後一個互斥量中激活,從新建立從共享區域中傳來的內存映射區域,而後從fork中返回;

總之,當前Windows的實現機制使得cygwin不可能實現一個完美、可靠的fork調用,偶爾的fork失敗也是不可避免的。

國際化

根據POSIX標準,cygwin能夠經過設置LC_ALL, LC_CTYPE, and LANG環境變量來改變語言,這三個變量是按順序的。變量的內容依從於POSIX標準。 
格式爲:

language[[_TERRITORY][.charset][@modifier]]
  • 「language」是一個ISO 639-1定義的兩位、小寫的語言代碼字符串,若是沒有語言在ISO 639-1中沒有找到,則可使用ISO 639-3的三位字符串來表示。

  • 「TERRITORY」是ISO 3166中定義的兩位大寫國家碼字符串。

  • 「charset」爲字符編碼。

例如:

"fr_FR.UTF-8" 
language = french, territory =France, charset = UTF-8

注意:默認的locale是」C.UTF-8」。

Windows系統使用UTF-16對文件名進行編碼,因此cygwin將根據LC_ALL, LC_CTYPE, and LANG變量來決定如何將UTF-16格式的文件名轉換爲cygwin指定的格式。

使用 locale.exe -a 命令查看全部locale列表。

潛在的問題  
1. 一個cygwin進程啓動的時候,Windows的環境變量由UTF-16轉換爲UTF-8,若是環境變量僅僅包含ASCII編碼,那麼就不會有問題。可是若是包含本地字符集,例如GBK,那麼將可能會出現亂碼的狀況。 
2. 符號連接:符號連接包含了目標文件的路徑名,若是該路徑名包含了非ASCII碼,那麼改變了locale以後,則有可能出現亂碼。cygwin1.7以及以後的版本不存在該問題。

使用Native Win32路徑

是能夠的,可是不推薦這樣用。

下面路徑會被認爲是native Win32路徑: 
a)以盤符開始的路徑:

    C:\foo
    C:/foo

b)全路徑中至少包含了一個反斜槓:

C:/foo/bar\baz/...

c)UNC路徑使用了反斜槓:

\\server\share\...

文件權限

FAT或FAT32

a)讀權限:在FAT或FAT32文件系統中,文件老是可讀的;
b)寫權限:chmod只能改變文件的寫權限;
c)可執行權限:UNIX系統中文件是否有可執行權限取決於文件是否有x權限位,Windows系統中則是根據文件擴展名是否爲.bat/.com/.exe/文件內容是否以#!開始等來判斷。

NTFS

文件權限經過文件的ACL來肯定

NFS

文件權限就是標準的POSIX權限了,從server端經過NFSv3協議傳輸過來。

/etc下面特殊的文件須要確保有PublicRead權限:

/etc/fstab
/etc/fstab.d/$USER
/etc/passwd
/etc/group

非法文件名

Win32應用程序會認爲包含AUX, COM1, LPT1 or PRN的文件名爲非法的,例如:prn.txt or foo.aux等。可是這個限制對cygwin應用程序是無效的,cygwin應用不會認爲它們是非法的。

文件名中的非法字符

在Windows文件系統中,ASCII碼的1-31號字符不能用於文件名中,而且下面的字符在Win32 API中有着特殊的意義:

"*:<>?| \

cygwin將會把上面除了\以外的字符作一個轉換,轉換成UNICODE,範圍是:0xf000 - 0xf0ff。由於\在文件路徑中能夠做爲分隔符,因此不會對其進行轉換。

文件名中包含不經常使用(國外)字符

Windows文件系統使用UTF-16的Unicode編碼來存儲文件名信息。若是不用UTF-8編碼的話,那麼頗有可能會有一個或多個字符沒法對應到你的字符集。

建議使用UTF-8字符集。

大小寫敏感的文件名

在Win32系統中,文件名是不區分大小寫的。

.exe擴展名

Windows系統中,Win32可執行文件若是以.exe爲擴展名,那麼在執行命令的時候不須要帶上.exe就能夠執行了。可是若是是以.bat/.com爲擴展名的文件則必需要帶上其擴展名才能夠執行。

例如:若是filename.exe存在,而filename不存在,那麼ls filename將會列出filename.exe文件的信息。

若是一個shell腳本myprog和一個程序myprog.exe同時存在一個目錄下,那麼無.exe擴展的shell腳本myprog將會優先執行。即:./myprog將會執行shell腳本而不是myprog.exe,若是不存在myprog腳本,纔會是去執行.exe文件。

@pathname

在bash和cmd中使用@pathname會產生不一樣的效果,樣例以下:

Example3.2Using@pathname 
bash$ /bin/echo ’Thisis"a         long"           line’> mylist
bash$ /bin/echo @mylist@mylist
bash$ cmd
c:\> c:\cygwin\bin\echo @mylistThisis a         long line

須要注意的要點

cygwin不是一個完整的操做系統,與windows的native特性有很大不一樣,下面列出一些須要注意的地方:

  1. cygwin僅僅是對windows系統的文件系統作了一下POSIX映射,自己並不提供文件系統的驅動;

  2. 一些windows自帶的命令行工具(例如:find.exe,link.exe,sort.exe等),可能會與cygwin衝突,要確保這些命令使用了絕對路徑(/usr/bin/find),或者在PATH環境變量中要將cygwin的bin目錄放在前面;

  3. windows系統沒法識別cygwin的文件路徑格式,因此須要藉助cygpath命令進行轉換,例如:notepad.exe 「$(cygpath -aw 「Desktop/Phone Numbers.txt」)」;

  4. 一些cygpath的工具,例如:ncftp/lynx/wget等,須要網絡鏈接,而且cygpath是依賴於windows的網絡鏈接的,因此若是這些工具出現問題,須要使用windows的工具(ping.exe/telnet/ftp)進行調試;

  5. cygpath和windows的符號連接是不同的;

  6. 編碼格式;

  7. 用戶、組,文件權限、ACL等安全特性的區別;

問題彙總

cygwin安裝sshd

cygwin安裝成功後,鏈接 ssh localhost,一直出現錯誤:

cygwin Connection closed by::1

費了不少時間查找,總算解決了,原文以下:

在google上看到cygwin的一個官方mail問答。參考Installing the Cygwin SSH daemon 。問題關鍵就是一個特殊的權限問題,在SYSTEM帳戶下運行的sshd服務須要有改變user id的特權(關於權限的問題,在cygwin的/usr/share/doc/Cygwin/openssh.README 中已經說得很明確了:2003Server has a funny new feature.When starting services under SYSTEM  account, these services have nearly all user rights which SYSTEM holds...exceptfor the "Create a token object" right, which is needed to allow public key authentication :-()。因此事件日誌會有seteuid的錯誤。至於解決方案,就是讓cygwin幫你建立兩個特殊用戶sshd和cyg_server,其中sshd服務在cyg_server用戶下運行,cyg_server有相應的權限(在/usr/share/doc/Cygwin/openssh.README 中也有說明)。

關鍵的就是這兩個用戶都要建立。

解決Cygwin下vi和vim方向鍵和Backspace很差用的問題

默認的vi(vim)沒有配置文件,所以致使了方向鍵出現ABCD,以及Backspace只會移動光標,字符不消失的問題。cygwin自帶vi(vim)配置文件的例子,直接拷貝便可,參考如下命令:

$ cp /usr/share/vim/vim74/vimrc_example.vim  ~/.vimrc
Cygwin 中 「Command not found」 的問題

在 Cygwin 上面編譯一些 Unix 軟件時,好比 ffmpeg, gvim 等,因爲 Unix / DOS 系統的差別常常會出現一些莫名奇妙的問題,最近常常碰到的一個問題就是:

line 9: $'\r': command not found

這樣的錯誤,初步判斷多是由於 \r\n 的區別引發的,遇到這種狀況,可使用 dos2unix 來修復。 
執行: dos2unix configure configure,以後再運行: ./configure ,就不會再出現上面的錯誤了。

換行符引發的問題

windows中的換行符是\r\n, linux/unix下的換行符是\n。 
其中:

回車符:\r=0x0d(13)return;#回車(carriage return)  換行符:\n=0x0a(10)           newline。#換行(newline)在DOS使用的換行符爲^M$,咱們稱爲CR與LF兩個符號。而在Linux中,則僅有LF ($)這個換行符。能夠用以下命令完成格式轉換:$dos2unix,$unix2dos。

cgywin命令輸出有中文亂碼

執行一些命令(ipconfig等)若是有中文輸出,則會出現中文亂碼問題。 
須要在Options->Text中將本地語言改成zh_CN,字符集改成GBK。

顏色問題

ls顏色:Cygwin默認ls的輸出是沒有顏色的,而Ubuntu等一些主流發行版默認爲終端配置了顏色輸出,因爲Cygwin採用的mintty.exe虛擬終端是支持顏色的,所以能夠編輯~/.bashrc文件,追加:

[plain] view plaincopy
[-x /usr/bin/dircolors ]&&eval"$(dircolors -b)"alias ls='ls --color=auto'

grep顏色:一樣,grep默認也沒有顏色。編輯~/.bashrc文件,追加:

[plain] view plaincopy
alias grep='grep --color=auto'

vim註釋深藍色問題:vim的默認語法着色中,註釋是深藍色,這在黑色背景下看不清楚。能夠將其改爲淺藍色,編輯~/.vimrc(沒有則建立),添加:

[plain] view plaincopy
syntax on
hi comment ctermfg=blue

或者將背景色設置爲dark,編輯~/.vimrc文件,添加:

[plain] view plaincopy
syntax on  
set background=dark

Cywin輸入、顯示中文不正常

解決:修改.inputrc,解除如下幾行註釋:

#set meta-flag on #set convert-meta off#set input-meta on#set output-meta on

命令行下面home/end鍵無效

在~/.inputrc中添加以下幾行:

vim ~/.inputrc
"\e[3~":delete-char"\e[1~": beginning-of-line
"\e[4~":end-of-line
"\e[H": beginning-of-line
"\e[F":end-of-line
"\e[7~": beginning-of-line
"\e[8~":end-of-line
"\eOH": beginning-of-line
"\eOF":end-of-line

參考資料

cygwin用戶手冊:https://cygwin.com/cygwin-ug-net.html  
cygwin安裝指南:https://cygwin.com/install.html  
cygwin FAQ:https://cygwin.com/faq.html

相關文章
相關標籤/搜索