从Atom切换到VisualStudio Code

Github的Atom是一个跨时代的编辑器,因为它是第一款基于Web技术的桌面编辑器,是一个全新的概念上的突破,为此Atom也在Github上获得了超过4万个星星。伴随Atom而生的还有Electron这个把Web技术用于桌面的平台,随后缔造了无数基于Electron的桌面Web应用。但是现在,Atom面临一个及其有力的挑战者,那就是微软的VisualStudio Code (vscode),目前在Github也获得了三万六千多个星星。 ...

October 21, 2017

用pyInstaller冻结Python程序

所谓冻结“Freezing“,指的是将Python程序编译,并将其和Python解释器一起其他的资源文件整合打包到一起,形成一个可以独立运行的程序。这样用户在接收到这个程序包的时候可以开箱即用,不需要安装额外的依赖。就像超市里面的熟食那样方便,买回家可以直接食用。 The Hichhiker’s Guide to Python里面的一章Freezing Your Code专门讲了几种冻结代码的工具,比如:bbFreeze、py2exe、pyInstaller、cx_Freeze、py2app等。这篇文章以pyInstaller为例,介绍怎么冻结一个基于pywebview的程序。 ...

October 11, 2017

让Atom编辑器成为你手中的大刀

编辑器就像是厨师手里的菜刀,一个厨师不可能只用一把刀解决所有问题。一个厨师至少要配两种刀,一是在任何情况下都能使用的小刀,以Vim或者Sublime Text这种体积在10MB以下的最好;另一种是像Atom这种大刀,体积在100MB级别,虽然不锋利但是扩展性俱佳,挥舞起来能够吹枯拉朽。 ...

May 13, 2017

使用Vim的目录比较插件DirDiff来显示Git改动

使用git的时候常常要用到文件比较工具,图形界面下可选的文件比较工具非常多,但是在终端下好用的就寥寥无几了。 Vim作为一款强大的文本编辑器,自带有文件比较功能。可惜Vim的文件比较功能只能用来查看文件的差异,不能对比目录。不过好在Vim有海量的扩展,有一款扩展可以弥补这个缺憾,就是DirDiff。 下面介绍如何在git中使用Vim的DiffDir插件。 首先我们在~/.gitconfig里面自定义一个difftool叫vimdiffdir: 我们就可以在git的difftool命令中调用vimdiffdir: 方便起见,我们可以为vimdiffdir起一个同名的别名: 来简化了vimdiffdir的使用: git有一个show命令来显示某个commit的改动,有了vimdiffdir,我们也可以自定义一个vimshow命令来在Vim中查看commit的改动,这需要在~/.gitconfig中加入: 然后就可以: 大功告成!...

February 4, 2015

在Vim的Normal Mode和Insert Mode间切换光标提示

Vim是模式化的编辑器,一个常见的操作是在正常模式(normal mode)和插入模式(insert mode)之间切换。这两种模式下面都需要移动光标,如果光标指示能告诉我们现在所处的模式的话,是可以减少一些误操作(比如少按一些ESC)。 如果使用形界面的Vim,如GVim或者MacVim,光标的切换是自动进行的,正常模式下是竖长条,插入模式下是竖细线;但是如果使用的是终端模式的Vim,根据终端能力的不同,可能并不会支持光标的变化。 Vim Tips Wiki上面的这篇文章介绍了如何在一些常见的终端模拟器里面配置光标切换。 Mode-dependent_cursor_in_vim介绍如何配置Cygwin+Mintty下Vim的光标切换。 由于终端的差异性,想找一个通用的光标切换解决方案很难,但是StackOverflow上给了一个基于cursorline的解决方案: 把上面的配置加入.vimrc,产生的效果是:在插入模式下,光标所在行会被高亮,而且高亮模式是对主题敏感的,不同的主题可以有不同的显示,可以是下划线,也可以是特定的背景色,简洁明了。

January 27, 2015

tmux man-page search highlighting in Cygwin/Mintty

Inspired by the question tmux-man-page-search-highlightingon StackOverflow, I found the solution for this problem from tmux faq, but I applied it with a little tweak (The original solution will cause coloring problems in ls output for my Cygwin/Mintty). Make sure you have ncurses package installed in Cygwin! The result can be found at .terminfo/73/screen-256color The final step is to set the default-terminal to screen-256color in your .tmux.conf Cheers.

January 14, 2015

Cygwin Tmux always creates new windows in HOME directory

Tmux is a convenient terminal multiplexer, not until recently Cygwin has packed Tmux in its distribution source, now we can install Tmux from setup-x86{_64}.exe, the package installer provided by Cygwin. One problem I experienced while using tmux is that: every time I created a new window in Tmux, the working directory is always HOME, even if I specified the startup directory in the option: Having examined this problem for a while, I can now tell what is wrong....

October 8, 2014

在Cygwin+Mintty下跑Windows的cmd控制台程序

众所周知,Windows自带的控制台程序cmd.exe对用户不是非常友好,跟Unix下的一系列终端以及shell相比,功能和易用性都相去甚远。 有几个开源项目致力于提高cmd.exe的用户体验: clink为cmd.exe添加向bash那样的命令行编辑和补全功能。 console2是另一款功能强大的控制台模拟器。 这些模拟器在cmd.exe的基础上添加了多标签页支持、字体设置、拷贝复制、背景设置等等功能。虽然这些改进十分贴心,但大部分都只是界面上的修修改改,并没有将Unix的终端体验完全带入Windows。 要达到Unix上终端的顺畅体验,是需要靠一大堆Unix应用程序支持的。在Windows上,能够基本提供Unix体验的,目前只有Cygwin,Cygwin终端模拟器Mintty也是非常出色,提供强大的功能。 但是Cygwin有一个致命弱点,就是性能太差。整个Unix的编程接口是Cygwin在应用程序级别模拟出来的,而非在内核直接实现。这导致在使用上能明显感觉程序运行速度较慢,特别是涉及文件系统操作的时候。 比如用Cygwin跑一个Python的Web应用,往往这个Web应用需要的启动时间比在Unix下要长久许多。为了克服这个缺点,我们可能希望用Windows原生的Python,而不是用Cygwin下的Python来运行这个Web应用。通常我的做法是在mintty终端里面直接运行cmd.exe,启动控制台,再运行Python,这样可以获得一部分性能的提升。 遗憾的是Mintty对cmd控制台的支持有很多限制,例如无法使用tab补全、命令行历史无法访问等等。一个解决办法是打开新窗口运行cmd.exe: 如果使用Tmux和Screen这些终端复用工具,切换Windows窗口这个操作便显得十分麻烦,影响工作流。那有什么办法可以让Mintty对cmd控制台支持得更好呢,Minty的问题跟踪列表里面有一个讨论Issue 56 Improve support for native console programs,里面提供了一个解决方案:使用winpty来为控制台程序作代理。winpty提供了一个程序console.exe: 这样,cmd控制台是不是运行得正常多了呢!但还有些小问题没有解决,比如上下左右键无法使用。使用可以解决这个问题,clink模拟了bash的命令行编辑功能,可以使用emacs的键绑定来前后移动: 详细的键绑定列表请看库readline的文档。clink还支持vi模式的键绑定。如果使用可执行文件安装的clink,可以在%USERPROFILE%\AppData\Local\clink目录下创建一个clink_inputrc文件,内容是: 如果使直接解压zip文件安装的clink,clink_inputrc要放在clink目录下面的profile文件夹中。 其他: 为了向Posix兼容Windows自身也提供了类Unix的编程接口,称作Subsystem for UNIX-based Applications (SUA)。 shell-terminal提供了和Winpty的类似功能。

September 22, 2014

Vim g(global)命令的妙用:将过滤的结果在新窗口显示

原文是Redirect g search output。 查看服务器日志的时候,常常需要把带某些关键字的行过滤出来,集中到一个地方查看。在Vim中,我们可以使用自定义命令来达到这个目的。 下面我们要创建:Filter命令,用来过滤关键字并把结果放到一个新开的临时窗口中: 详细解释: command!, 定义一个命令 -nargs=?, 这个命令接受0或1个参数 Filter, 命令的名字,后面跟的是命令的内容 let @a='', 清空寄存器a execute 'g/<pattern>/y A', 执行'g/<pattern>/y A' (搜索与<pattern>匹配的行,将其添加到寄存A) new, 创建一个新窗口 setlocal bt=nofile, 把当前窗口设为scratch模式 put! a, 把寄存器a的内容粘贴到新窗口 记得把:Filter的定义加入到你的**.vimrc**中。 简单的例子: 过滤将带有404错误的行。 还可以使用正则表达式: 过滤带有red或者blue的行。 如果:Filter不带任何参数,会重复上回搜索的结果。 其他: :help :gPower of gFilter buffer on a search result

July 30, 2014

git小贴士:推送本地分支到异名远程分支

今天学习了一个小技巧,如何把改动从本地分支推送到远程仓库的一个异名分支: local_branch:remote_branch是一个所谓的,它的完整版是: 把本地分支同步到远程同名分支: 把本地分支同步到远程异名分支: 如果省略,则删除远程分支: 如果省略和,则将所有本地分支的改动同步到远程的同名分支: :也可以省略,上面的命令和git push orgin等效。 non-fast-forward 默认情况下push命令只使用fast-forward操作,如果在前面指定+,可以让push使用non-fast-forward操作,这跟在push后面指定--force参数是一个道理 *参考: git push --help

July 11, 2014

Vim小贴士:将字母替换成全大写

Changing_case_with_regular_expressionsVim的Normal模式可以使用gU<motion>来将当前字母改成大写。但是想批量修改的话,需要使用Vim的正则表达式查找和替换。 比如我们想将abc替换成ABC,最直接的方法: 或者使用: \U表示把后续的字符替换成大写;表示查找到的字符串,这边是abc。上面命令的执行结果就是把abc替换成ABC。 \U会影响所有的后续字符,要取消其影响的话,需要使用\E: 我们可以配合backreferences使用: 其它: \L将其后续字符替换成全小写。 \u和\l和\U和\L类似,但只作用于紧接其后的字符。 查看Vim帮助:help sub-replace-special

July 10, 2014

Cygwin上使用ssh-agent

你想在Cygwin下用ssh的公钥私钥的验证方式来登录服务器。 首先你得用ssh-keygen在~/.ssh目录下面生成了一对公钥和私钥:id_rsa.pub和id_rsa。然后把id_rsa.pub的内容拷到服务器的~/.ssh/authorized_keys文件中,之后登录该服务器的时候,ssh就会优先使用公钥私钥验证了。 可是你对私钥设了一个非常强劲的口令,结果每次用ssh登录的时候都要需要验证这个口令,每次输入都非常麻烦!ssh-agent就是用来解决这个问题的!我们只输入一次口令后,ssh-agent将口令缓存下来,以后每次登录的时候就不需要重复输入了!这里有详细介绍ssh-agent的使用。 ssh-agent在Cygwin下面的使用可以参考这篇文章。配置每次打开mintty的时候自动运行ssh-agent, 把下面的代码加入~/.bash_profile: 关于ssh-agent-forwarding 如果你维护的服务器非常多,经常需要登录到一个服务器后,再从这个服务器登录到其它服务器,ssh-agent的forwarding功能就变得非常有用了。只要你把公钥都拷贝到这些服务器上,ssh-agent可以让你在这些服务器间畅通无阻,不用再输入密码。 Agent Forwarding功能需要在.ssh/config文件中开启: 上面的配置只对example.com生效,下面的配置可以全面生效: 参考Github的帮助或者unixwiz上详尽的解释。

July 3, 2014