zoukankan      html  css  js  c++  java
  • 在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:cygwin64in
    un.exe --quote /usr/bin/bash.exe -l -c "cd; startxwin"

    该方式的好处是在X server启动时,会自动运行~/.xinitrc中的内容。这样,就可以自动启动诸如mintty、Emacs这些常用的软件。不过,该方法目前无法成功启动X server。所以需要采用第二种方式,即运行xwin命令:

    C:cygwin64in
    un.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:cygwininmintty.exe
       WinWait ahk_class mintty
       WinActivate
    }
    return
    
    ; Total commander
    #2::
    IfWinExist Total Commander 7.56a
    {
       WinActivate
    }
    else
    {
       Run  C:	otalcmdTOTALCMD.EXE
       WinWait Total Commander 7.50a
       WinActivate
    }
    return
    
    ; Emacs
    #3::
    IfWinExist Emacs@
    {
       WinActivate
    }
    return
    
    ; Stardict
    #4::
    IfWinExist 星际译王
    {
       WinActivate
    }
    else
    {
       Run, C:Program Files (x86)StarDictstardict.exe, C:Program Files (x86)Common FilesGTK2.0in
       WinWait StarDict
       WinActivate
    }
    return
    
    ; Firefox
    #5::
    IfWinExist ahk_class MozillaWindowClass
    {
       WinActivate
    }
    else
    {
       Run C:Program Files (x86)Mozilla Firefoxfirefox.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软件即可。

  • 相关阅读:
    select 标签的数据绑定
    JQ选择器-选择符合条件的元素,获取对应关系元素
    Velocity中判断表达式是不是为空
    重要的serialVersionUID
    编译nginx的时候报错 需要安装PCRE
    Mac 允许安装任何来源的app
    Charles
    Excel_日期和时间函数、EDATE、EOMONTH
    项目9: 成绩中国式排名(难度:中等)
    Mysql:IFNULL的使用说明
  • 原文地址:https://www.cnblogs.com/quantumman/p/4907558.html
Copyright © 2011-2022 走看看