在Windows上創建同樣的Linux操作環境


之前的文章中,介紹了我在GNU/Linux圖形界面環境下所使用的工具集合。其基本目的是在保證占用最少系統資源的條件下,將電腦操作效率推向極致。這樣的工具組合尤如瑞士軍刀一般,簡潔、高效、功能全面。與之對應,在Windows系統下,該如何實現類似的操作習慣呢?如GNU/Linux命令行工具與圖形界面軟件,類似於Sawfish窗口管理器的功能,以及多桌面。本文將介紹我自己的解決方案。

首先,為了能夠享用GNU/Linux系統下命令行工具帶來的種種便利與高效,我在Windows下安裝了Cygwin。Cygwin是一個在windows平台上運行的類UNIX模擬環境,是Cygnus Solutions公司開發的自由軟件。Cygwin 提供一個UNIX模擬DLL以及在其上層構建的多種可以在 Linux 系統中找到的軟件包,在Windows XP SP3以上的版本提供良好的支持。在Cygwin老的版本中,終端程序基於的是Windows的cmd.exe,無法對其進行字體、顏色風格等的設置。目前Cygwin提供的mintty終端程序則可以進行很好的個性化定置,尤其是可以配置成Solarized色彩風格,具有一定的視力保護功能。這一配置可以在這里下載到。其以bash腳本的形式提供了明色調與暗色調兩種風格。只要將風格設置腳本加入到~/.bashrc中即可:

source ~/%your directory%/sol.light
or source
~/%your directory%/sol.dark

接下來,需要說明Cygwin的使用方式。除了GNU/Linux的命令行工具外,Cygwin提供了相當豐富的X視窗圖形界面程序,如Emacs、Octave。而且,相對於Cygwin多年以前的老版本,這些圖形界面程序的穩定性已經有了很大的提高,完全可以將它們作為日常必備的軟件。而回想數年之前,自己需要分別獨立安裝專為Windows編譯的Emacs、Octave、Gnuplot、Maxima、Texlive等工具,它們之間的相互協作總是存在一定的問題。而現在,所有這些軟件可以在統一的Cygwin/X環境下運行,路徑名、文件名也都符合GNU/Linux習慣,所以使用起來和在原生的GNU/Linux下是一樣的。為了使用這些圖形界面軟件,我將Cygwin在Windows下的X視窗服務器XWin作為Windows系統的自動加載項,在登錄后便會自動啟動。啟動項的創建可以有兩種方式。一是運行startxwin命令:

C:\cygwin64\bin\run.exe --quote /usr/bin/bash.exe -l -c "cd; startxwin"

該方式的好處是在X server啟動時,會自動運行~/.xinitrc中的內容。這樣,就可以自動啟動諸如mintty、Emacs這些常用的軟件。不過,該方法目前無法成功啟動X server。所以需要采用第二種方式,即運行xwin命令:

C:\cygwin64\bin\run.exe --quote /usr/bin/bash.exe -l -c "cd; xwin -multiwindow -clipboard"

該方法不去讀~/.xinitrc文件,只能在~/.XWinrc中設置系統托盤圖標的右鍵菜單項。因而,無法設置隨X server一起啟動的程序。

有了Cygwin帶來的GNU/Linux下的諸多命令行工具和圖形界面軟件,那么如何像在真正的GNU/Linux環境下實現類似於Sawfish窗口管理器所擁有的功能呢?例如:

  • 用快捷鍵啟動某個特定程序,但在啟動前如果該程序已啟動,則將其主窗口調到前台;
  • 用快捷鍵對窗口進行操作,如最大化、最小化、移動、置於所有窗口前端,等等。

幸好有Autohotkey這個軟件,上述Sawfish所擁有的功能都可以用其來模擬。通過配置,我實現的功能有:

  • 交換大小寫鎖定鍵Caps Lock與左Control鍵,對於經常使用Emacs的人來說,這一點是很有必要的。
  • 啟動常用程序的快捷鍵設置:
    • Win+1:Cygwin mintty終端程序
    • Win+2:Total Commander文件管理器
    • Win+3:Emacs
    • Win+4:Stardict電子詞典
    • Win+5:Firefox瀏覽器
  • 窗口操作:
    • Win+m:窗口最大化
    • Win+r:窗口還原
    • Win+i:窗口最小化
    • Ctrl+Alt+j,l,i,k:左、右、上、下移動窗口
    • Win+left,right,up,down:將窗口向左、右、上、下移動直至碰到另一個窗口或者屏幕邊界
    • Win+c:讓窗口位於屏幕中央
    • Win+=:增加窗口寬度
    • Win+-:減小窗口寬度
    • Win+Shift+=:增加窗口高度
    • Win+Shift+-:減小窗口高度
    • Win+Shift+h:水平最大化窗口直至窗口碰到另一個窗口或者屏幕邊界
    • Win+Shift+v:垂直最大化窗口直至窗口碰到另一個窗口或者屏幕邊界
    • Win+t:讓窗口位於其它窗口上方及恢復其原來層次
    • Win+k:關閉窗口
    • Win+?:顯示當前窗口的ahk_class,這對於窗口的匹配有用

以上配置的腳本如下:

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

; swap caps lock and left control
#IfWinActive
+Capslock::Capslock
Capslock::Control

SetTitleMatchMode 2

; Cygwin mintty terminal
#1::
IfWinExist ahk_class mintty
{
   WinActivate
}
else
{
   Run C:\cygwin\bin\mintty.exe
   WinWait ahk_class mintty
   WinActivate
}
return

; Total commander
#2::
IfWinExist Total Commander 7.56a
{
   WinActivate
}
else
{
   Run  C:\totalcmd\TOTALCMD.EXE
   WinWait Total Commander 7.50a
   WinActivate
}
return

; Emacs
#3::
IfWinExist Emacs@
{
   WinActivate
}
return

; Stardict
#4::
IfWinExist 星際譯王
{
   WinActivate
}
else
{
   Run, C:\Program Files (x86)\StarDict\stardict.exe, C:\Program Files (x86)\Common Files\GTK\2.0\bin
   WinWait StarDict
   WinActivate
}
return

; Firefox
#5::
IfWinExist ahk_class MozillaWindowClass
{
   WinActivate
}
else
{
   Run C:\Program Files (x86)\Mozilla Firefox\firefox.exe
   WinWait ahk_class MozillaWindowClass
   WinActivate
}
return

; maximize window
#m::
WinMaximize, A
Return

; minimize windows
#i::
WinMinimize, A
Return

; restore window
#r::
WinRestore, A
Return

; move window left
^!j::
WinGetPos, X, Y, , , A
WinMove, A, , X-10, Y
Return

; move window right
^!l::
WinGetPos, X, Y, , , A
WinMove, A, , X+10, Y
Return

; move window up
^!i::
WinGetPos, X, Y, , , A
WinMove, A, , X, Y-10
Return

; move window down
^!k::
WinGetPos, X, Y, , , A
WinMove, A, , X, Y+10
Return

; move window left most
#Left::
WinGetPos, X, Y, W, H, A
; WinMove, A, , 72, Y
WinMove, A, , 0, Y
Return

; move window right most
#Right::
WinGetPos, X, Y, W, H, A
WinMove, A, , A_ScreenWidth - W, Y
Return

; move window top most
#Up::
WinGetPos, X, Y, W, H, A
WinMove, A, , X, 0
Return

; move window down most
#Down::
WinGetPos, X, Y, W, H, A
WinMove, A, , X, A_ScreenHeight - H - 40
Return

; center window
#c::
WinGetPos, X, Y, W, H, A
; WinMove, A, , (A_ScreenWidth - 72)/2 - W/2 + 72, A_ScreenHeight/2 - H/2
WinMove, A, , A_ScreenWidth/2 - W/2, (A_ScreenHeight - 40)/2 - H/2 + 40
Return

; increase window width
#=::
WinGetPos, X, Y, W, H, A
WinMove, A, , , , W+10, H
Return

; decrease window width
#-::
WinGetPos, X, Y, W, H, A
WinMove, A, , , , W-10, H
Return

; increase window height
#+=::
WinGetPos, X, Y, W, H, A
WinMove, A, , , , W, H+10
Return

; decrease window height
#+-::
WinGetPos, X, Y, W, H, A
WinMove, A, , , , W, H-10
Return

; expand window horizontally
#+h::
WinGetPos, X, Y, W, H, A
; WinMove, A, , 72, Y, A_ScreenWidth - 72, H
WinMove, A, , 0, Y, A_ScreenWidth, H
Return

; expand window vertically
#+v::
WinGetPos, X, Y, W, H, A
; WinMove, A, , X, 0, W, A_ScreenHeight
WinMove, A, , X, 0, W, A_ScreenHeight - 40
Return
  
; toggle window on top
#t::
WinSet,AlwaysOnTop,Toggle,A
Return

; close window
#k::
WinClose, A
Return

; get window class
#?::
WinGetClass, win_cls, A
MsgBox, %win_cls%

最后,想要在Windows下實現多個桌面,則直接安裝VirtualWin軟件即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM