Vim 里如何映射 ?

November 28th, 2016 No comments

很多人习惯在配置文件中映射 CTRL+HJKL 为光标移动,却碰到了一些问题:

inoremap <c-h> <left>
inoremap <c-j> <down>
inoremap <c-k> <up>
inoremap <c-l> <right>

映射后无效或者映射以后按 <BS>键不能删除,这是什么原因呢?

很简单,因为你的终端软件(Xshell, SecureCRT)有些老,默认配置是按下<BS>键以后
发送的是:^H (ASCII 码 0x08),而 ^H在你的 Vim 里被你 inoremap 成 了,所以你按了<BS>会被认为按下了左键。

早在 VT100终端时代,^H(ASCII码 0x08)表示<BS> 而 ^? (ASCII码 0x7f)表示<DEL>。过去 0x7f是留给 DELETE键使用的。而到了 VT220时代,DELETE已经变为 ^[[3~ (ASCII 码 0x1b, 0x5b, 0x33, 0x7e 共4个字节),而 ^? 的 0x7f 换给了我们的<BS>,有些老点版本的终端软件,默认 <BS>还是使用 VT100的 ^H,比如 Xshell 4 Build 0142以前的版本,默认<BS>是发送^H。SecureCRT直到6.x版本还在默认发送 VT100的 ^H。

你需要做的就是改一下终端默认配置而已,大部分不那么陈旧的终端软件,如今都是默认VT220的标准,比如 Xshell4 Build 0142及以后的 Xshell5,Putty,Mac下面的 Terminal.app, iTerm2,Ubuntu下面的 gnome-terminal,他们都是把 <BS> 发送成 ^?

你可以在你服务端下面查看下默认的键位设置:

$ stty -a

现在所有 Linux服务器的 erase (bs)基本都是 ^? 了(如果链接到非 Linux老操作系统 erase不是这个的话,需要改一下,可以在系统层改,也可以vim里面 set t_kb=…),Vim里面也是认可 ^?的,可老旧的终端软件却默认发送 ^H,不过好在他们都支持修改:

Read more…

Categories: 随笔 Tags:

Vim 中正确使用 Alt映射

November 19th, 2016 No comments

最简单的做法是:首先将终端软件的 “使用 Alt键作为 Meta键” 的功能打开,其次将 Alt的模式改为 ESC+字母,意思是如果你在终端下按下 ALT+X,那么终端软件将会发送 <ESC>x 两个字节过去,字节码为:0x27, 0x78。如果你使用过 NeoVim 或者 Emacs的话,这一步应该早就做过了。

XShell4 终端设置:

SecureCRT:终端设置

其他终端软件里:

  • Putty/MinTTY 默认ALT+X 就是发送 <ESC>x过去
  • Mac下面的 iTerm2/Terminal.app 需要跟 XShell / SecureCRT一样设置一下
  • Ubuntu 下面的 GnomeTerminal 默认也是发送 <ESC>x过去的
  • 任意平台下面的 xterm 可以配置 ~/.Xdefaults 来设置这个行为。

这样的话,不管是 NeoVim 还是 Emacs都识别了,Vim 的话,你可以简单这样:

noremap <ESC>x :echo "ALT-X pressed"<cr>

注意 ESC后面是小写 x,如果你是大写 X就变成 ALT+SHIFT+X了。于是你在 Vim 中,ALT+X就能看到后面输出的那句话了。看到这里你也许要问:这和我快速按下 ESC再马上按下 x键有什么区别?答案是没有区别,在终端里面这两个操作是一模一样的键盘码传送过去。

就像你不设置 ttimeoutttimeoutlen,然后快速在 VIM 里面按下 <ESC>OP,Vim 会以为你按下了 一样。因为 F1 的终端下字符串序列就是 <ESC>OP ,而你在 Insert 模式下面马上 <ESC> 退出并按下大写 O ,向上插入一行,Vim 将会等待一秒钟(默认 timeout ),确认后面没有一个 P,才会进一步确认不是F1,而是向上插行。

所以更好的做法是直接按照 <M-x> 进行映射,并且告诉 vim,<M-x>的键盘序列码是多少,然后再加上 ttimeoutlen超时:

noremap <M-x> :echo "ALT-X pressed"<cr>
exec "set <M-x>=\ex"
set ttimeout ttimeoutlen=100

这样做的好处是告诉 Vim, ESC+x是一个完整的按键码,并且需要在 100ms以内进行判断,即,如果收到 ESC,并且100ms以后没有后续的x,则是认为是一个单独的ESC键,退出 INSERT模式,否则认为是按下了 ALT+X,这和 Vim处理方向键,处理 F1, F2等功能键的原则是相同的,具体见 :h set-termcap:

                            *:set-termcap* *E522*
For {option} the form "t_xx" may be used to set a terminal option.  This will
override the value from the termcap.  You can then use it in a mapping.  If
the "xx" part contains special characters, use the <t_xx> form: >
    :set <t_#4>=^[Ot
This can also be used to translate a special code for a normal key.  For
example, if Alt-b produces <Esc>b, use this: >
    :set <M-b>=^[b
(the ^[ is a real <Esc> here, use CTRL-V <Esc> to enter it)
The advantage over a mapping is that it works in all situations.

You can define any key codes, e.g.: >
    :set t_xy=^[foo;
There is no warning for using a name that isn't recognized.  You can map these
codes as you like: >
    :map <t_xy> something

这是最完善的 ALT键解决方案了,网上有个流传很广的方式是 map <ESC>x <M-x> 然后你后面再映射 <M-x> 时就能被触发到,这是错误的方法,不能使用更短的 ttimeoutlen来识别键盘码,而会使用普通组合键的 timeoutlen来判断,后者一般设置为默认 1000毫秒,所以这样把 26个字母映射后,你 ESC退出 INSERT模式后,一秒内按了任何一个字母就会被当成 ALT+X来处理了,经常误操作。

如此,我们可以在 .vimrc中 for循环将 <M-0><M-9><M-a><M-z>等全部 set一遍,vim中即可正常使用。

早年的终端,处理ALT组合键时,是将单个字符的最高位设置成 1,这也是 vim的默认处理方式,如今 rxvt终端也支持这种模式(见上图 SecureCRT设置面板)。这种键盘码不是 ESC+x的模式,可以直接识别,不需要计算超时,缺点是支持终端较少,对终端编码格式有依赖。

如今基本上 <ESC>+的模式基本成为大部分终端的默认方式,主流操作了,详细可以看::h map-alt-keys 以及 :h set-termcap 两个文档有具体说明,关于超时部分可以见(:h esckeys

当然,如果你真能在100ms内连续按下 ESC和 X的话,那是另外一回事情了,你可以调短 ttimeoutlen到50ms解决,但是不建议该值低于 25ms,否则在低速网络情况下,你按功能键会被vim错误识别成几个单独的按键序列。

对于牛逼的打字员,也许 ttimeoutlen 设置的再短也没有用,当他瞬间快速 ESC退出插入模式并同时按下u时,他可能发现自己居然还呆插入模式中,因为被识别称 ALT+u了,而我们之前把 开头的A-Z全部都设置了一遍,这样放错的概率会大很多。

好了,下面是终极解决方法,重新定义终端软件的按键序列码:

Read more…

Categories: 随笔 Tags:

Vim 异步运行 Shell 指令的插件 – AsyncRun

August 24th, 2016 No comments

自制另一个新的 Vim 8.0 专用异步插件:asyncrun.vim,它可以让你在 Vim 里面异步运行各种 Shell 指令并且把结果实时输出到 Quickfix,需要 Vim 7.4.1829 以上版本。

安装方法

到插件首页 https://github.com/skywind3000/asyncrun.vim 下载项目,并拷贝 asyncrun.vim 到你的 ~/.vim/plugin。或者使用 Vundle 指向 skywind3000/asyncrun.vim 来自动更新。

基本教程

使用 gcc 异步编译当前文件:

:AsyncRun gcc % -o %<
:AsyncRun g++ -O3 % -o %< -lpthread 

该命令会在后台运行 gcc 并且把输出实时显示在 Quickfix 窗口,宏 % 代表当前文件名,%< 代表没有扩展名的文件名。

异步运行 make:

:AsyncRun make
:AsyncRun make -f makefile

异步调用 grep:

:AsyncRun! grep -R word . 
:AsyncRun! grep -R <cword> .

默认 :AsyncRun 运行命令后,输出添加到 Quickfix时 Quickfix 会自动滚动到最下面那一行,使用感叹号修饰符以后,可以避免 Quickfix 自动滚动。同时 <cword> 代表当前光标下面的单词。

编译 go项目:

:AsyncRun go build %:p:h

%:p:h 代表当前文件的目录

查询 man page,异步 git push ,以及把设置 F7异步编译当前文件:

:AsyncRun! man -S 3:2:1 <cword> 
:AsyncRun git push origin master
:noremap <F7> :AsyncRun gcc % -o %< <cr> 

使用手册

AsyncRun – Run shell command:

:AsyncRun{!} [cmd] ...

后台运行命令并且实时输出到 quickfix 窗口,如果有感叹号修饰符,quickfix 窗口的自动滚动将会禁止。

命令参数以空格分割,接受下面这些以 ‘%‘, ‘#‘ or ‘<‘ 开头的替换宏:

%:p     - File name of current buffer with full path
%:t     - File name of current buffer without path
%:p:h   - File path of current buffer without file name
%:e     - File extension of current buffer
%:t:r   - File name of current buffer without path and extension
%       - File name relativize to current directory
%:h:.   - File path relativize to current directory
<cwd>   - Current working directory
<cword> - Current word under cursor
<cfile> - Current file name under cursor

运行一个命令前,环境变量也会做如下设置:

$VIM_FILEPATH  - File name of current buffer with full path
$VIM_FILENAME  - File name of current buffer without path
$VIM_FILEDIR   - Full path of current buffer without the file name
$VIM_FILEEXT   - File extension of current buffer
$VIM_FILENOEXT - File name of current buffer without path and extension
$VIM_CWD       - Current directory
$VIM_RELDIR    - File path relativize to current directory
$VIM_RELNAME   - File name relativize to current directory 
$VIM_CWORD     - Current word under cursor
$VIM_CFILE     - Current filename under cursor
$VIM_GUI       - Is running under gui ?
$VIM_VERSION   - Value of v:version
$VIM_MODE      - Execute via 0:!, 1:makeprg, 2:system()
$VIM_COLUMNS   - How many columns in vim's screen
$VIM_LINES     - How many lines in vim's screen

AsyncStop – Stop the running job:

:AsyncStop{!}

停止后台任务(使用 TERM信号),如果有感叹号修饰,则使用 KILL 信号结束

基本设置:

g:asyncrun_exit - 字符串,如果不为空那么任务结束时会被执行(VimScript)
g:asyncrun_bell - 如果非零的话,任务结束后会响铃(终端输出控制符 \a)
g:asyncrun_mode - 0:异步(需要 vim 7.4.1829) 1:同步 2:直接运行

全局变量:

g:asyncrun_code   - 退出码
g:asyncrun_status - 状态 'running', 'success' or 'failure'

如果你喜欢的话请为我投一票:
http://www.vim.org/scripts/script.php?script_id=5431

Categories: 随笔 Tags:

3D 图形光栅化的透视校正问题

August 18th, 2016 No comments

写了文章《如何写一个软件渲染器》以后,不少网友希望进一步解释背后的数学公式,询问以及自己加一个 phong 光照该如何加,本文将对透视纹理映射的插值原理做一个简单的解释,希望能帮助到大家:

透视纹理绘制发生在最后阶段,坐标已经完成projection,剔除,裁剪了,然后顶点/w,开始批量绘制扫描线之前,这时候开始计算纹理的位置。

使用w还是用z,关系不大,早年的3d引擎,直接/z的,只是后面标准化了以后,发现w更好用,可以同时表示透视投影和正交投影。同时顶点经过标准的mvp矩阵运算后,w和z是承线性关系的,方便对z/w做 [0,1] 的cvv裁剪。你可以理解成w就是另外一个z。以前屏幕坐标:

x' = x / z * d + A
y' = y / z * d + A

现在是

x' = x / w * d + A
y' = y / w * d + A

然后绘制纹理前,你需要先证明屏幕上两个点之间,1/w 承线性关系,即屏幕上两个点X1′, X2’之间任意取一点X3’,他们的(1/w)值的变化比例相同,即在 t 取任意值有:

x3' = x1' + (x2' - x1') * t
(1 / w3) = (1 / w1) + ((1 / w2)  - (1 / w1)) * t

再根据他们在同一个平面上,证明屏幕上两个点之间,u/w, v/w 承线性关系,即 t 取任意值有:

x3' = x1' + (x2' - x1') * t
(u3 / w3) = (u1 / w1) + ((u2 / w2) - (u1 / w1)) * t
(v3 / w3) = (v1 / w1) + ((v2 / w2) - (v1 / w1)) * t

具体到代码里面的做法就是三角形的三个顶点/w以后,u和v也同时/w,然后把w换成自己的倒数:w = 1 / w,及把顶点数据:

(x, y, z, w) + (u, v)

变换成:

(x / w, y / w, z / w, 1 / w) + (u / w, v / w)

然后用 1/w, u/w, v/w进行屏幕空间插值,具体绘制某个点的时候,先从1/w求倒得到w,然后乘以 u/w, v/w得到 u, v,就可以了。

更进一步,可以证明,所有在三维空间里同x,y,z成线性关系的变量,不管是纹理坐标,顶点色或者法向还是其他,他们在屏幕空间里的插值规则都可以通过:插值前先/w,插值后要用时再 * w得到具体值,然后我们把这类三维空间里同x,y,z成线性关系的变量统进行统一的批量处理,和OpenGL的 attribute,varying处理方法相同。

相关阅读:
如何写一个软件渲染器
还原被摄像机透视的纹理

Categories: 图形编程 Tags:

Vim 异步编译插件 vimmake

July 16th, 2016 No comments

推荐下自己写的用了好几年的编程插件:vimmake ?完美支持 vim的异步模式:
GitHub – skywind3000/vimmake: Customize shell commands in vim

让用户自定义各种不同的编译或运行任务,并且在 Vim 中执行他们。类似 NotePad++的自定义 Commands 和 EditPlus/UltraEdit 的 ‘User Tool’ 或者 GEdit中的 External Tool 以及 TextMate 中的 Shell Command。完美支持 vim 7.4.1829 后已经稳定成熟的异步任务机制,不需要写任何 Vim Script 也可以很容易的体验到 vim 的异步任务机制,并且使用它来执行各种艰巨的编译任务,让你一边编辑代码,一边跑编译任务。

安装:拷贝 vimmake.vim 到你的 ~/.vim/plugin 或用 vundle 指向 skywind3000/vimmake .

简单使用:异步编译 & 运行 C/C++ 代码

首先每个 “用户自定义工具” 使用一个独立的 shell脚本来描述(Windows下是.cmd的批处理文件),我们将首先编写 vimmake可以使用的 gcc编译工具脚本, “~/.vim/vimmake.gcc”:

#! /bin/sh
gcc "$VIM_FILEPATH" -o "$VIM_FILEDIR/$VIM_FILENOEXT"

就这么短短的两行,当你把它设置成 0755的权限时,就可以在 Vim中通过下面语句运行了:

:VimTool gcc

命令 :VimTool {name} 命令会在 Vim里面直接调用 ~/.vim/ 目录下,名为 “vimmake.{name}” 的脚本来完成各种类似编译或者执行的任务,所以用:VimTool gcc 就可以运行前面定义的名为 vimmake.gcc 的工具脚本来编译当前的源代码了。

现在编辑 “~/.vim/” 下面名为 “vimmake.run” 的脚本,以便用 :VimTool run 来运行当前代码:

#! /bin/sh
"$VIM_FILEDIR/$VIM_FILENOEXT"

记得将 vimmake.run 的模式设置成 0755,如今有了两个可以直接在 Vim里通过 VimTool命令启动的工具(gcc 和 run),接下来我们需要设置 run 这个工具的模式为默认运行模式,而 gcc 为 quickfix模式(输出会被捕获并重定向到 quickfix窗口),现在打开 .vimrc 添加一行:

let g:vimmake_mode = { 'gcc':'quickfix', 'run':'normal' }

而如果我们能够使用到较新版本的 vim(7.4.1829或者更高),我们就可以使用异步方式在后台启动 gcc,并且将后台进程的输出实时重定向到界面下端的 quickfix 窗口:

let g:vimmake_mode = { 'gcc':'async', 'run':'normal' }

在这之后,将 ‘gcc’的运行模式设置成 ‘async’ 后,:VimTool gcc 就可以以异步的方式运行名为 vimmake.gcc 的脚本然后在后台执行编译任务了,就像传统 IDE编译任务一样。

以往使用 Vim 的 :make 之类的命令编译项目时,往往无法异步,编译任务一运行,你就无法编辑了,只有等到编译结束,才能返回编辑状态,大项目时,不得不另外开一个终端来进行编译,这是很痛苦的事情,有了异步任务以后,你能在同一个屏幕下编辑并且实时在 quickfix窗口查看编译的进度。

vimmake 可以让你在不需要掌握晦涩的 VimScript 和繁琐的异步编程接口的情况下,直接方便的使用vim 异步功能来完成各种长时间编译任务。同时为了加快你的:编译-编辑-编译 工作流的流畅度,我们需要配置一两个热键来调用 :VimTool 命令:

noremap <F7> :VimTool gcc<cr>
noremap <F5> :VimTool run<cr>
inoremap <F7> <ESC>:VimTool gcc<cr>
inoremap <F5> <ESC>:VimTool run<cr>

在 .vimrc里面加入上面的几行代码,你就可以方便的按 F7编译当前文件,F5运行之了。和GEdit
类似,VimTool命令在运行具体工具脚本前会设置若干环境变量来记录当前编辑的文件名,路径,当前vim工作目录等一系列信息,然后在工具脚本里面可以直接取出这些值来调用需要的外部工具链:
如上图,后台运行工具脚本进行编译,并且编译器的输出会被实时显示到下面的 quickfix窗口,选中错误的那行输出,会直接跳转:

Read more…

Categories: 随笔 Tags:

如何禁止 Win7 强制更新到 Windows 10 ?

July 4th, 2016 No comments

岳父岳母,爹妈的 Windows 7 纷纷被自动升级成 Windows 10 各种问题(一台画面变成非全屏,解析度被莫名奇妙降低,占不满显示器、运行卡,另一台台式机无线网卡不能用,还有一台某炒股软件跑不起来,按win键弹出菜单时会顿一下)。

花费了我两个整天的时间帮他们降级,找了很多方法,网上大部分都不能对新版 Gwx起作用

终于,找到了并且永久性锁定自动升级的最直接方式了:

regedit:
HKEY_LOCAL_MACHINE 下面
SOFTWARE\Policies\Microsoft\Windows 下面新建项目(目录)Gwx
然后在
SOFTWARE\Policies\Microsoft\Windows\Gwx 下面新建 DWORD 值:
DisableGwx=1

好了,Windows 结扎手术完成,不用当心一不留神弄出个 Windows 10 来给大伙惹麻烦了。

补充:本来上次回家时间就短,好些事情没办,好些朋友没见,好了,微软一个强制升级,就把你锁家里了。

自己的事情也算小事了,爹妈平常和岳父母平日和我们聚少离多,也就爱炒个股看个基金寻找下乐趣,你把人家弄的用不了了,不好用了,老人家自己不会弄,又舍不得花钱请人修,只能眼巴巴花好几个月的时间等着你回去帮他们解决。这样的感受是很不好的,就像公园里两个大爷正高兴的下着棋,过来个顽皮小孩一把把老人的棋盘掀湖里去了,周围的人都会觉得小孩有些缺乏教养,没有公德心一般。

很多喜欢宠物的人为了不给大家添麻烦都倡导给自己的狗或猫做节育手术,真爱宠物就要对它负责,所以我们也本着对windows负责的态度对它做个结扎,防止它趁你不留神在外面闯祸,避免给大家添麻烦,对,公德心嘛。

Categories: 随笔 Tags:

计算机底层是如何访问显卡的?

June 17th, 2016 No comments

以前 DOS下做游戏,操作系统除了磁盘和文件管理外基本不管事情,所有游戏都是直接操作显卡和声卡的,用不了什么驱动。

虽然没有驱动,但是硬件标准还是放在那里,VGA, SVGA, VESA, VESA2.0 之类的硬件标准,最起码,你只做320x200x256c的游戏,或者 ModeX 下 320x240x256c 的游戏的话,需要用到VGA和部分 SVGA标准,而要做真彩高彩,更高分辨率的游戏的话,就必须掌握 VESA的各项规范了。

翻几段以前写的代码演示下:

例子1: 初始化 VGA/VESA 显示模式

基本是参考 VGA的编程手册来做:

INT 10,0 - Set Video Mode
    AH = 00
    AL = 00  40x25 B/W text (CGA,EGA,MCGA,VGA)
       = 01  40x25 16 color text (CGA,EGA,MCGA,VGA)
       = 02  80x25 16 shades of gray text (CGA,EGA,MCGA,VGA)
       = 03  80x25 16 color text (CGA,EGA,MCGA,VGA)
       = 04  320x200 4 color graphics (CGA,EGA,MCGA,VGA)
       = 05  320x200 4 color graphics (CGA,EGA,MCGA,VGA)
       = 06  640x200 B/W graphics (CGA,EGA,MCGA,VGA)
       = 07  80x25 Monochrome text (MDA,HERC,EGA,VGA)
       = 08  160x200 16 color graphics (PCjr)
       = 09  320x200 16 color graphics (PCjr)
       = 0A  640x200 4 color graphics (PCjr)
       = 0B  Reserved (EGA BIOS function 11)
       = 0C  Reserved (EGA BIOS function 11)
       = 0D  320x200 16 color graphics (EGA,VGA)
       = 0E  640x200 16 color graphics (EGA,VGA)
       = 0F  640x350 Monochrome graphics (EGA,VGA)
       = 10  640x350 16 color graphics (EGA or VGA with 128K)
         640x350 4 color graphics (64K EGA)
       = 11  640x480 B/W graphics (MCGA,VGA)
       = 12  640x480 16 color graphics (VGA)
       = 13  320x200 256 color graphics (MCGA,VGA)
       = 8x  EGA, MCGA or VGA ignore bit 7, see below
       = 9x  EGA, MCGA or VGA ignore bit 7, see below

    - if AL bit 7=1, prevents EGA,MCGA & VGA from clearing display
    - function updates byte at 40:49;  bit 7 of byte 40:87
      (EGA/VGA Display Data Area) is set to the value of AL bit 7

转换成代码的话,类似这样:

// enter standard graphic mode
int display_enter_graph(int mode)
{ 
    short hr = 0;
    union REGS r;
    memset(&r, 0, sizeof(r));
    if (mode < 0x100) { 
        r.w.ax = (short)mode;
        int386(0x10, &r, &r);
        r.h.ah = 0xf;
        int386(0x10, &r, &r);
        if (r.h.al != mode) hr = -1;
    }   
    else { 
        r.w.ax = 0x4f02;
        r.w.bx = (short)mode;
        int386(0x10, &r, &r);
        if (r.w.ax != 0x004f) hr = -1;
    }
    return hr;
}

Read more…

Categories: 图形编程 Tags: ,

如何在不同平台下打开新窗口运行程序?

May 12th, 2016 4 comments

如果可以让自己的工作效率提升一点点,那么即便花费几天来开发一些工具也是值得的。在不同操作系统下自动打开终端窗口来运行指定的命令就是这样一件能提高工作效率的事情。

就像 Visual Studio 调试命令行程序的人都对打开一个新窗口运行命令行程序的模式情有独钟。EditPlus 也提供新窗口运行程序(可惜只限windows)。

而如果你在使用 Sublime/Atom/GEdit/GVim 之类的工具,你就会发现调试程序的时候程序基本上是在下面的面板中运行的,所有输出也是输出到下面的面板中。这时如果程序长时间运行是非常不方便的,又或者程序有交互(需要输入数据),基于GUI面板的运行方式也会显得十分笨重,而Vim/GVim之流更过分,一执行程序整个GUI就定住了,没法一边看代码一边查看一些长时间运行的程序状态,虽然Windows下的GVim可以用!start来解决(见Gim !start),但十分遗憾,Linux桌面或者Mac下面的Vim都没有这个 !start功能。

同时,哪天你切换到Mac/Ubuntu下开发了,你会发现这个问题十分恶心,这时候你往往需要写一些脚本来做这件事情。而在不同的平台下正确的escape并传递参数,正确的生成中间脚本(bash,applescript,batch)并且通过管道传递又是一项比较浪费时间的事情。

所以这两天写了: https://github.com/skywind3000/terminal 这个脚本来做这些,满足了我如下需求:

  • 在 Windows 下打开 cmd窗口执行若干命令
  • 在 Linux 下打开 xterm/gnome-terminal 来执行若干命令
  • 在 Mac OS X 下面打开 Terminal/iTerm 窗口来执行若干命令
  • 不同的操作系统下提供统一的调用接口
  • 可以方便设置:工作目录、窗口标题、窗口配置(Terminal/gnome-terminal/iterm)
  • 新窗口内执行完程序以后可以会等待按任意键才关闭窗口
  • Windows 打开 Cygwin 的 Mintty窗口并执行 Cygwin命令(Windows下编辑,Cygwin下运行)
  • Cygwin 下直接打开 Windows的 CMD窗口执行 Win32程序(Cygwin下编辑,Windows下运行)
  • Cygwin 下直接打开 Mintty窗口并运行cygwin命令(Cygwin下编辑,cygwin下运行)

如此,不管你运行在哪个操作系统下,使用何种编辑器,都可以提供完全一致的调试体验。一边编辑代码的同时,一边查看另一个窗口的程序实时输出。

Categories: 随笔 Tags: