2012年12月8日星期六

终端下使用Emacs的一些Tips

这里说的终端,其实主要是指终端模拟器,也即putty/mintty, xshell, gnome-terminal, xfce4-terminal等。虽然说理论上来说,大多数内容也适用于控制台,但我并没有在上面验证过。

* 多frame

如果你像我一样用Frame Bufs这个扩展将不同“工程”的buffer组织在不同的frame上,那么肯定也想问终端下是否支持frame,答案是肯定的。仍然使用C-x 5 2来创建新的frame, 用C-x 5 o切换frame。与GUI下的差别是你不能调整frame的大小了,因为一致都是全屏——如果你想要用半个终端来跑别的东西,建议用tmux或者 Emacs里面的ansi-term-mode.

参考: Emacs Journey: CLI Emacs and multiple-frames

* 鼠标

除了终端模拟器自己的拷贝、粘贴和右键菜单,终端模拟器里面跑的应用程序其实也是可以使用鼠标的,这些终端模拟器大都支持一种叫做Xterm mouse tracking的功能: 终端模拟器收到鼠标时,先看看是不是应该用来应对自己的功能(比如文字拷贝、粘贴和右键菜单),如果不是,则将按键信息通过Xterm control sequences将按键信息发送给应用程序。

GNU Emacs可以通过M-x xterm-mouse-mode打开终端下的鼠标功能。

不过有几点值得注意:

  • 所用的Emacs必须编译进了鼠标支持才能使用xterm-mouse-mode。一般来说,如果你安装的Emacs是带X11版本的,那么就没有问题;如果你安装的是emacs-nox,那么就不支持鼠标了。
    (其实这个说法并不严谨,但根据Emacs的缺省编译设置,的确是在有window-system的时候才打开HAVE_MOUSE这个定义,configure脚本没有单独对鼠标支持提供开关。而最近的一个HAVE_MOUSE补丁则完全放开了鼠标支持,你可以在老版本Emacs代码上打上这个补丁重新编译)
  • 如果你想为鼠标事件增加Ctrl,Alt和Shift修饰键(modifier)的支持,比如绑定<S-mouse-1>或者<M-mouse-3>到某个事件,虽然理论上是支持的,但实际上都比较悲摧,自己用C-h k试试就知道了(唯一比较幸运一点的是Ctrl)
  • 鼠标滚轮可以用。不过跟GUI下不同的是,几乎没有带修饰键的版本可用(也就是说不能绑定<C-mouse-4>, <M-mouse-4>这些事件 (P.S. 在Linux系统上,鼠标滚轮事件名叫<mouse-4>和<mouse-5>,跟Windows下的<wheel-up>和<wheel-down>并不一样(不清楚Mac OS X等系统))
  • 终端模拟器都有一些自己鼠标功能(比如选择文本拷贝到本地剪贴板,显示右键菜单),可能会保留Ctrl/Alt/Shift中的某一个用来做这方面的用途
    这个设置在Putty里面是Configuration->Window->Selection->Shift overrides application's use of mouse; 在Mintty里则是 Configuration->Mouse->Modifier key for overriding default ; 而Gnome Terminal里则不提供配置,右键(<mouse-3>)始终被自己接管,按住Shift始终是本地的选择文字功能,里面跑的应用程序永远无法得到这两个事件


* 颜色

如果你用终端模拟器(gnome-terminal,guake, putty或者mintty)来运行emacs, 其实它们也是支持256色的。这样你的语法高亮配色就有了更多选择。

如果你的UNIX比较新,terminfo里面有xterm-256color 这个类型的终端描述的话,只要先执行如下语句:
export TERM=xterm-256color

然后再启动emacs,那么emacs就有了256色了, 用M-x list-colors-display看看列出了多少颜色就知道生效与否了。

** 终端模拟器支持

putty缺省是支持256色的,只要你没有在选项Window->Colours里面关闭Allow terminal to use xterm 256-color mode这一项。那么用上面的TERM环境变量就够了。

mintty里面,你可以直接在Options->Terminal->Type里面选择xterm-256color,这样进去之后shell就会继承这个设置,不用手工设置TERM环境变量了——当然你在交互式方式或者~/.bashrc里面设置也行,不过这本来就应该是终端模拟器端的设置。

另外,如果你又在终端模拟器(gnome-terminal, putty)里面跑了screen/tmux的话,那么得启动screen/tmux之前把TERM设置成256色模式(xterm-256color或者rxvt-256color之类),然后在screen/tmux的window中把TERM设置为screen-256color,详细内容请参看ArchWiki: Tmux: Set the correct TERM

一些文章上说,只要在tmux里面启动一个window后,在里面执行export TERM=screen-256color(或者在~/.tmux.conf里面添加set -g default-terminal "screen-256color" 来自动设置)。但根据我的试验,启动tmux之前不设置TERM是实际上得不到256种不同颜色的

** terminfo问题

如果用的Linux比较老,terminfo数据库里没有xterm-256color或者screen-256color这个类型的定义(用ls /lib/terminfo/s/可以列举所有以s开头的terminal type),那么你就没法用这个功能了(FIXME: 怎么加上这个类型定义?)

实测是否真支持256色(而不是名义上有256色却有很多重复的颜色)的一个方法是用这篇The 256 color of xterm里面提供的perl脚本256colors2.pl,它会显示类似如下的图:

xterm 256 color test

 

* 待续

  • 快捷键(key bindings)
  • Emacs菜单问题 (lacarte)
  • Emacs overlay和fringe (auto-complete, hideshow-fringe, qtmstr-outline etc)

 

 

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/12/08/tips-about-emacs-on-term.html)

Emacs 24.3支持cygwin上使用Win32 GUI

刚看见GNU Emacs 24.3发了第一个pretest版本(24.2.90),我从git仓库里打开NEWS看了一下,发现了这么一条:


  ** Cygwin builds can use the native MS Windows user interface.  Pass --with-w32 to configure. The default remains the X11 interface.


哈,这正是我原来一直梦想着的特性:底层采用Cygwin的POSIX兼容层,界面采用Win32原生GUI——这在以前看到rxvt的win32原生GUI版本时就有了这个愿望。

这样有什么好处呢?

1 底层采用Cygwin的POSIX兼容层

  • Emacs与shell和其它程序的交互就跟UNIX下面一样了,这样很多win32特有的兼容性问题就不存在了,比如调用一个shell命令时的引号问题(比如悲摧的find-grep,比如M-x shell-toggle-cd里面的"cd /path/to/somewhere""cd /d x:\path\to\somewhere"问题);反过来,你在git/hg里面可以很方便地调用ediff和emerge来比较文件、解决合并冲突了
  • cygwin有虚拟终端支持,这样你可以用M-x term来运行各类终端程序,比如bpython, midnight commander。反过来,如果用cygwin版本的Emacs,你也可以在screen里面跑emacs

2. GUI采用win32 gui

  • 相对terminal版本,GUI的优势是有丰富的颜色、字体以及fringe修饰
  • 相对原来的X11 GUI版本,优势是不必启动一个X11 server了
  • 这个cygwin-w32版本有win32 native版本的几乎所有功能
    • 可以从Windows程序(比如资源管理器)拖放文件到Emacs
    • 可以使用Windows所管理的字体,也就是你不用自己再安装配置X11字体
    • 可以使用<lwindow>, <rwindow>, <apps>等键,也就是说w32-lwindow-modifier等变量仍然可以设置
    • 缺省打开浏览器的方法与win32 native版本和cygwin原来的设置都是一样的: browse-url-default-windows-browser
    • 虽然缺省shell改成了bash (由Cygwin提供的环境变量SHELL决定),但你应该可以用(let ((shell-file-name "cmd")) (shell))的方式来运行cmd(不过我不推荐你用(setq shell-file-name "cmd")修改掉缺省的shell——调用很多外部程序时需要这个设置,而cmd实在是配合不好)

3. 为什么不用native win32 gui版本?

这主要是Cygwin的优势了:

从安装的方便性上来说,很多外部程序(比如find, grep, diff, git),你不用繁琐地到处去寻找win32 native port来安装了,你可以很方便地安装和使用cygwin的版本(在此推荐一下cyg-apt  t,你只要简单地cyg-apt install w3m就可以安装上w3m了。另外[url=]我也略做过改进,以支持多个repo),何况有些程序目前没有win32 native port,比如dict, sdcv

目前发现的一些小问题:

* 窗口没有图标(我发现nt/emacs.rc并没有被编译、包含进可执行文件,但手工加了一下之后,窗口还是没有图标——待有空仔细看看代码看问题在哪里)

 

附两张截图:

Emacs 24.2.90 cygwin build, with Win32 GUI  


快写完的时候,邮箱收到了cygwin-announce邮件列表的通知,说是已经提供了23.2.90的测试版本,这次新增的w32 gui版本也提供了,所以你只要打开Cygwin setup.exe,选择安装emacs-w32就可以了。
如果你用cyg-apt的话,那么就是这么几步:

cyg-apt setup #第一次运行cyg-apt的话,需要用这个建立配置文件~/.cyg-apt
cyg
-apt update # update setup.ini
cyg
-apt install emacs-w32



P.S. 根据这个HAVE_MOUSE补丁,新的Emacs不需要跟X11库链接也可以在terminal下支持鼠标了(这个补丁也可以在老版本的Emacs源代码上使用)——但你还是需要在运行期执行M-x xterm-mouse-mode打开鼠标支持

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/12/08/emacs-24_3-cygwin-w32-gui.html)

2012年12月3日星期一

[Emacs] 小技巧: 高亮/修改所有同名符号

(此篇面向初级用户,写的比较啰嗦,请中高级用户见谅。

其实这篇的草稿是9月初写的,躺在草稿箱里面3个月了,最近工作和生活都比较忙,没时间来整理格式 :-( )

** hi-lock-mode

Emacs自带hi-lock-mode (hi-lock.el),里面提供了一下几个很有用的命令:

  • highlight-phrase (M-s h p)
  • highlight-regexp (M-s h r)
  • highlight-lines-matching-regexp (M-s h l)

使用时直接输入上面命令或快捷键即可,不用先打开 hi-lock-mode ,Emacs会自动打开。

使用时Emacs会先问你要高亮什么内容,如果你不想手工输入的话,得事先拷贝好内容再在这里粘贴。

然后Emacs会问你使用那种风格(face)来显示高亮,除了hi-lock.el提供的 hi-yellow, hi-pink, hi-green 等颜色之外,你也可以使用Emacs里面其它的face。

要去除高亮,用 M-x unhighlight-regexp (M-s h u),它会自动提供当前已有条目(刚才通过上 述三个命令输入的内容)供你选择。

** highlight-symbol

http://nschum.de/src/emacs/highlight-symbol/

这个第三方库其实是对hi-lock-mode的封装,使得用户用起来更方便:

  • highlight-symbol-at-point: 因为大多数时候我们只关注当前焦点所在的符号,所以可以省略输入高亮内容那一步,颜色也不用用户输入了,它会自己随机挑一个,这个命令正是这样工作的;

  • 可以方便地跳转到当前符号的上一次/下一此出现位置(highlight-symbol-prev, highlight-symbol-next)

  • 还可以限定只在当前函数里面查找(highlight-symbol-next-in-defun, highlight-symbol-prev-in-defun)

这就跟vim用户很喜欢的*和#键功能差不多了,我绑定的快捷键也是沿用了这两个符号:

(require 'highlight-symbol) ;;Use autoload' oridle-require' if you like

(global-set-key (kbd "M-s j") 'highlight-symbol-at-point)
(global-set-key (kbd "<C-double-mouse-1") 'highlight-symbol-at-point)

(global-set-key (kbd "M-s *") 'highlight-symbol-next)
(global-set-key (kbd "M-s #") 'highlight-symbol-prev)

(global-set-key (kbd "C-*") 'highlight-symbol-next)
(global-set-key (kbd "C-#") 'highlight-symbol-prev)

后两个(C-*, C-#)是为了应付连续按的场景的,单次按键比多次要方便一点。不过这两个组合键在term(console, gnome-terminal, putty等)下面是没法用的(我比较少有在term下用emacs,如果用得比较多,倒是可以考虑绑定到M-*和M-# 上)。

** idle-highlight

https://github.com/nonsequitur/idle-highlight-mode

很多朋友很喜欢能够自动高亮当前焦点所在的符号,当焦点移开之后又自动取消高 亮, idle-highlight.el 就是干这个的。

idle-highlight.el放到load-path内,然后在dotemacs里面加入:

(autoload 'idle-highlight-mode "idle-highlight" "highlight the word the point is on" t)

使用时只要M-x idle-highlight-mode RET 就可以了。

如果想打开文件时自动开启该功能 如果要自动对所有文件都打开该功能,在dotemacs里面加入:

 

(add-hook 'find-file-hook 'idle-highlight-mode)

 

如果只对某些主模式打开,则加入:

(add-hook 'emacs-lisp-mode-hook 'idle-highlight-mode)
(add-hook 'python-mode-hook 'idle-highlight-mode)
(add-hook 'js-mode-hook 'idle-highlight-mode)

Emacs 24里面将所有编程语言的major mode做了变更,都变成继承自prog-mode了,这种情况下只 需要这样就可以对所有编程语言添加此功能(而其它文本编辑不受影响):

(add-hook 'prog-mode-hook 'idle-highlight-mode)

** semantic-idle-local-symbol-highlight-mode

CEDET里面提供了一个 semantic-idle-local-symbol-highlight-mode ,跟idle-highlight功能类 似,但依赖于CEDET的语法解析功能。我不怎么用CEDET,所以不能给出评价。有兴趣的可以看看Emacs中文网的这篇 [用CEDET浏览和编辑C++代码] 里面的 [相应说明]。

** iedit

https://github.com/victorhge/iedit/

http://www.emacswiki.org/emacs/Iedit

修改代码的时候尝尝需要对函数名、变量名进行修改,这就需要对同一符号的多次出现 (occurrence)进行批量替换(这个活儿在重构里面叫做rename method 或者rename field

iedit.el可以部分实现这个目标。之所以说"部分"是因为它只是个编辑功能,只能应付单一文件的 情况,做不到基于工程或者语法来修改所有调用到的地方。

iedit.el提供的iedit-mode是个临时模式,使用方法如下:

1. 加载iedit.el,将iedit.el放到site-lisp目录下,然后

  a). 动态加载: M-x load-library RET iedit.el RET

  b). Emacs启动时加载: 在dotemacs里面加入:

(autoload 'iedit-mode "iedit"
"Edit multiple regions with the same content simultaneously." t)
2. 需要修改某个符号(函数名、变量名)时,将光标移动到该符号上,然后 M-x iedit-mode RET (或者按C-; 这是缺省配置的快捷键)即可进入批量修 改模式,使用该符号的所有地方会被高亮。通过编辑修改该符号的名称,所做改动会即时反馈到所有高亮的地方。

3. 修改完成后,重新输入 M-x iedit-mode RET 退出此模式。

如前所说,iedit比较简单,没有语法分析能力,所以如果你一个文件里有两个类用了同名的变 量,它也区分不了,解决办法是结合Emacs Narrowing来实现: Emacs narrowing功能使得我们可以只编辑一个文件的一部分,而其它部分并不在可编辑范围内。所以实现上述目标的方法是:

1. 选择(mark)要修改的函数(C-M-h)或者类;

2. 输入 M-x narrow-to-region (或者 C-x n n), 如果你是第一次使用这个功能,Emacs 会问你是否要启用该功能(因为这个功能会导致初学者晕头,所以为防止误入,缺省被禁用了);

3. 好了,Emacs现在只显示你选中的那一块代码了,你现在做全buffer的替换,并不会影响文件的其它部分:用上面的 M-x iedit-mode RET 来做替换吧;

4. 修改完成,再用C-; 退出iedit-mode

5. 用 M-x widen RET (或者 C-x n w) 回到编辑整个文件的模式

 

参考: - emacs-fu: interactive replacement

** 其它补充

* auto-highlight-symbol-mode

https://github.com/mitsuo-saito/auto-highlight-symbol-mode/wiki/

这是写这篇文章时翻到的一个扩展,看说明它用一个el文件把上述几个功能都包含了,并不需要三个文件:

  • automatic highlighting current symbol like eclipse IDE.
  • cycle through highlighted locations.
  • can specify the range to highlight.
  • can edit the highlighted symbols at a time.

我还没有试过,有兴趣的朋友自己试试吧。

 * occur: 列出所有包含某个符号的行

M-x list-matching-lines RET (缺省绑定到了M-s o) 然后输入要查找的符号即可。Emacs会在一个新的窗口列出结 果,可以用 M-g n和M-g p 跳转到下一次、上一次出现的地方。(注: 此命令有个比较简短的别名: occur ),

如果想将当前符号作为输入,免去每次输入的麻烦,可以用下面这个函数:

(require 'thingatpt)

(defun occur-at-point (nlines)
(interactive "P")
(occur (format "%s" (thing-at-point 'symbol)) nlines))

(define-key search-map "O" 'occur-at-point)

要深入研究一下occur的话: http://emacswiki.org/emacs/OccurMode

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/12/03/emacs-find-modify-all-occurences.html)

2012年9月30日星期日

又两个grep的替代品: Rak和Grin

看这个意思,各种语言都要把grep重新实现一遍:

Rak
http://rak.rubyforge.org/

引用Rak is a grep replacement in pure Ruby. It accepts Ruby syntax regular expressions and automatically recurses directories, skipping .svn/, .cvs/, pkg/ and more things you don't care about. It is based on the Perl tool ack by Andy Lester.



Grin
http://pypi.python.org/pypi/grin/

引用A grep program configured the way I like it.

I wrote grin to help me search directories full of source code. The venerable GNU grep and find are great tools, but they fall just a little short for my normal use cases.

...Also, I was bored. It seems to be catching. Perl has ack, Ruby has rak, and now Python has grin

grin比ack好的一点是,ack缺省是按编程语言扩展名来搜的,一些它不识别的编程语言就得重新定义,所以常常临时需要用ack -a,而grin跟grep的行为比较一致,没有这个问题。

参见: grep的两个替代品(ack & glark) - 巴蛮子 - 博客园

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/21/another-grep-replacements-rak-grin.html)

tmux/screen里面如何用鼠标滚轮来卷动窗口内容

tmux里面用鼠标滚轮来卷动窗口内容

在tmux里面,因为每个窗口(tmux window)的历史内容已经被tmux接管了,所以原来console/terminal提供的Shift+PgUp/PgDn所显示的内容并不是当前窗口的历史内容,所以要用C-b [ 进入copy-mode,然后才能用PgUp/PgDn/光标/Ctrl-S等键在copy-mode中移动。

如果要启用鼠标滚轮来卷动窗口内容的话,可以按C-b :然后输入
    setw mode-mouse on
这就可以了。如果要对所有窗口开启的话:
    setw -g mode-mouse on
(这种情况下,Vi/Emacs等全屏程序并不受影响,还可以自己接管滚轮事件)

也可以加到~/.tmux.conf里面
     set-window-option -g mode-mouse on
(setw其实是set-window-option的别名)

摘自: Scroll shell output with mouse in tmux - Super User

gnu screen里面呢
一种说法是在~/.screenrc里面添加
    termcapinfo xterm* ti@:te@
xterm*用于匹配(glob match)你的当前term类型
Using the scrollwheel in GNU screen

另一种说法就比较复杂了,详见链接: How to use mousewheel in GNU Screen | Mikael Ståldal’s technical blog 

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/17/mouse-wheel-in-tmux-screen.html)

tmux如何查看历史输出

在tmux里面,因为每个窗口(tmux window)的历史内容已经被tmux接管了,所以原来console/terminal提供的Shift+PgUp/PgDn所显示的内容并不是当前窗口的历史内容,那么应该怎么办呢?

改用C-b [进入copy mode,然后就可以用PgUp/PgDn/光标来浏览历史输出了,按q退出。C-b PgUp也可以直接进入coy mode. 参见:How do I scroll in tmux? - Super User

copy mode其实比较类似于vi/emacs里面一个只读buffer,可以移动光标,可以搜索,用C-SPC开始选择,选择完后用M-w拷贝(拷贝后自动退出copy mode),然后可以C-b ]粘贴(可在其它窗口粘贴), C-b =可以从剪贴板历史中选择。

gnu screen里面呢
gnu screen进入copy mode的方式跟tmux类似(C-a [),但进入后它是vi style keybindings。

对于拷贝文字,第一次空格设置开始标记,然后用hjklw之类移动光标,第二次空格完成拷贝。粘贴也是用C-a ]

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/17/tmux-scroll-back.html)

Hack: 支持多个repo的cyg-apt

原本是为了在Cygwin下面安装deepgrep这个工具(见介绍 deepgrep: grep nested archives with one command ),但我发现自己编译它有点麻烦,然后又发现Cygwin Ports这个非官方仓库里面有这个strigi包。

但这个strigi包的依赖又有点多,用cygwin setup下载很有点受不了:cygwin setup缺省会下载所有的更新,虽然可以选择不管它们,但界面操作起来可有点麻烦,本来一次性麻烦一点也就罢了,但因为这个镜像很不稳定,一旦在某个包上卡死,或者发现它正在下某个我不想下载的大软件包(比如emacs24),就得重来。。。

也试用了apt-cyg-multi,但它不支持跨repo的包依赖,比如这个strigi的依赖里有几个包是在官方仓库里的,而我没有安装,它就一会儿又报告一个错误,我把缺的安装上了,再跑它,它又报告一个错误,我又得去装缺的那个。。。

算了,还是自己动手吧,看了一下apt-cyg-multi的代码,用bash写的,我觉得可读性不是太好,调试也比较麻烦,不想在这个上面改。

于是又拿起了自己简单修改过的cyg-apt,是python写的,bootstrap代价有点大,但对我而言python是必装的,也不是大问题了。

完成的代码在这里: http://code.google.com/p/bamanzi-misc/source/browse/trunk/cygwin/cyg-apt,还没有在cyg-apt原项目网站上提交patch。

支持多repo的方法是在~/.cyg-apt里面添加一个mirrors配置项,格式为python的dict格式,例如:

mirrors = { 'main': 'http://ftp.cn.debian.org/cygwin', 'ports': 'http://downloads.sourceforge.net/cygwin-ports' }

然后执行:

cyg-apt update
cyg
-apt install strigi

就等着安装完成吧。

(不过,尚不支持同一类仓库的多个mirror——如果想一个mirror连不上时,转向另一个mirror去下载,目前是不支持的。因为我觉得暂时没有太大必要,因为在~/.cyg-apt里换一个mirror就是了,至于原来下载下来的包虽说是按mirror url分目录存放的,但手工挪一下倒也不难)

另外,我改掉了cyg-apt原本每次都去自动更新setup.ini的行为,改为cyg-apt update时才更新,这跟Debian apt-get的行为一致 —— 不过cyg-apt原本的对某些子命令(比如install)会自动更新setup.ini行为并未删除,而是改到配置项auto_update(或者命令行选项'-a')上了。

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/09/08/cyg-apt-for-multi-repo.html)

deepgrep: grep nested archives with one command

Total Commander里面有个功能是我很离不开的,导致我在linux下还得用wine来跑它:可以支持搜索压缩包里面的文件内容,并且可以通过它的packer插件支持各种类型的压缩包。

先说说我最需要这个功能的一个场景吧,比如,我常常修改一些Firefox的扩展,有的扩展的安装包会在被firefox解压,但里面还有一个 content jar文件(其实是采用zip压缩格式); 而新版本的firefox对安装的扩展大都不会将xpi解压,这个xpi文件其实也是zip格式,里面很可能还会有个jar包。我有时需要搜索所有扩展的 install.rdf文件,以确定名称为xxxx的某个扩展到底在哪个文件里,有时需要搜索xpi或者jar里面的js、xul代码,以查找某个函数或 者某个页面元素的定义。

zgrep/bzgrep都只能搜索单个的gzip/bzip2压缩文件,而不能支持包含多个文件的包,不适用于上面的问题;

zipgrep性质上比较接近,支持zip文件,但有两个问题:
1. 不支持压缩包嵌套的场景(比如在上述xpi里面的content jar中间搜索js/xul的内容),
2. 它只能指定搜索某个zip文件,而不是以目录为搜索范围,然后透明地搜索多个zip文件;

前两天看见Planet Debian上有篇deepgrep: grep nested archives with one command,这个东西正式我一直以来想要的!

唯一的遗憾是deepgrep不能显示搜索结果所在的行号,这使得我想在Emacs里面集成它有点困难(本来想在grep-mode的基础上改改,可以打开搜索结果所在的文件(压缩包内的),并跳到指定的行)。

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/17/deepgrep-goes-thru-nested-archives.html)

Python脚本重定向其输出时的编码问题

python有一个比较烦的问题是,同一段程序,里面有print语句,直接运行时没有问题,一旦将其输出设了个重定向,这个脚本就不正常了,报告UnicodeEncodeError

究其原因,是Python感知到输出到控制台时,会从控制台取当前编码;而重定向后Python程序无法得知写那个文件该用哪个编码(不过为啥不用控制台的值?), 缺省就用了ascii (准确地说,是系统缺省编码sys.getdefaultencoding(),可以在sitecustomize模块里修改。而python3将缺省编码改为utf-8了) 。python - UnicodeDecodeError when redirecting to file - Stack Overflow

解决办法有两个:
 
一个是刚才提到的修改sitecustomize模块(缺省不存在,特意留给用户定制的),在里面调用sys.setdefaultcoding('xxxx')——这个函数python在import site之后就没有了,应用程序的python代码里是没法调的

方法二是shell里设置环境变量PYTHONIOENCODING,设成utf_8或者gbk都可以(只要字符集够) PrintFails - PythonInfo Wiki

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/16/python-encoding-when-redirection.html)

[git/hg] 什么叫做bare repo?

[git/hg]什么叫做bare repo?

引用一个bare repo与普通repo的区别是没有项目文件的working copy,即repo根目录下只有专用目录,而没有任何其他代码文件和文件夹;这是为了响应作为codebase应当遵循的“Only store, never update from revisions(只存储版本,不更新到实际代码文件)”原则。

hg管理的repo天生就能做codebase使用,无论是否是bare的,这点是由其分布式版本控制系统的本质决定的,它可以随时把当前的repo通过自带的http server发布代码,特别适合分布式开源项目的代码分享。

git也是分布式代码版本管理工具,不过它对作为codebase的repo做了严格的bare要求。可以看到的是许多人在初学git时不了解这一点,抱怨自己做spike时不知如何提交代码到在本机上的codebase。这里顺手写下两个tips:

* 初始建立一个bare repo

$ git init --bare

* 如果已有一个repo了,使用下面的方法将其转化为bare的

$ git config --bool core.bare true

之后可删除除了repo根目录.git文件夹之外的所有文件,即只保留专用目录


摘自: git vs hg - 挖金子的矿工 - 博客频道 - CSDN.NET

补充:
1. 上面部分说法可能不对,因为该博文是针对老版hg写的,而后来hg也有了类似git的repo内多命名分支,而对于bare repo,官方wiki (GitConcepts#Bare_repositories上)说要这样: hg update null

2. 对git而言, bare repo不仅仅是没有checkout, 而且There is no .git directory is created. Instead, the files normally in the .git directory are placed in the top-level directory where the working directory would normally be. (来自Shared Repositories Should Be Bare Repositories - GitGuys)

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/15/git-hg-bare-repo.html)

几个与Dropbox和Ubuntu One有关的链接

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/14/links-for-dropbox-ubuntu-one.html)

Create a Git Mirror (for your hg repository) / hg tip

为hg仓库建立一个git的镜像真的很简单,只需要三步:
  1. 安装hg的hg-git扩展: easy_install hg-git, 然后在~/.hgrc里面启用这个扩展;
  2. 在hg repo的hgrc里面的.hg/hgrc里添加一个path: 格式为:github = git+ssh://git@github.com/username/project.git (当然,你得先在github上创建一个空的git仓库)
  3. hg push github

注意:如果在github上的仓库不为空,hg push会被拒绝,除非你先将github上的历史pull过来。

来自:  Create a Git Mirror (for your hg repository) / hg tip

关于hg-git的更详细的说明,可查看其主页: Hg-Git Mercurial Plugin — durin42 / hg-git / overview — Bitbucket

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/13/create-git-mirror-for-hg-repo.html)

浏览器里最强的搜索栏(duckduckgo !bang)

为了进行一些专项搜索(比如在AMO上搜索Firefox扩展,在PyPi上搜索Python包,在http://packages.debian.org搜索Debian包),我给Firefox和Chrome都配了好多搜索引擎,每个配上一个关键字,这样就可以在地址栏输入"amo firebug"直接从AMO网站上按关键字搜索firebug了。。。

早上看见一篇 Useful duckduckgo searches for developers,里面说到DuckDuckGo搜索引擎提供一种!Bang语法,翻了一下,哇,这才是终极的替代品!

为什么这么说?因为大多数情况下我不再需要上面那些配置,直接在DuckDuckGo的输入框里面输入"!amo firebug"或者"!dpkg gedit"就能完成上述功能了! 而且很多关键字跟我原来的习惯是一致的:amo, pypi, dpkg...

如果说我将DuckDuckGo设置为Firefox/Chrome的默认搜索引擎,那就更方便了,都不用进入DuckDuckGo的网站,直接在Firefox/Chrome搜索框里按!bang方式输入就行了,哈哈。

不过上面为什么说“大多数情况下”?你看看!Bang页面列出的用法就知道了,很多很多常用网站都有对应的关键字,下面是我常用的一些搜索,包含了各项Google应用、Python/Javascript语法、Python软件包、Linux软件包、man page、Vim/Emacs/TotalCommander插件。。。 该页面还有很多很多。。。

如果还有一些你常用的没有包含在里面,可以提交申请,也可以再配合浏览器的搜索引擎来进行本地扩展。

Google (!g)
Google HK (!ghk)
Google CN (!gcn)
Google Images (!img)
Google Maps (!gmap)
Google Blogs (!gblogs)
Google Groups (!gg)
Google Reader (!gr)
 
Chrome Extension Repository (!crx)
Firefox Add-ons (!firefox)
Firefox Addons (!amo)
 
Vim Scripts (!vimscripts)
Vim.org (!vim)
Vimdoc (!vimdoc)
EmacsWiki (!emacs)
EmacsWiki (!emacswiki)
 
!github
!bitbucket
!sourceforge
Google Code (!gcode)
 
Debian Packages (!dpkg)
Debian file search (!dfiles)
openSUSE Software (!susepkg)
Ubuntu Packages (!upackages)
Ubuntu Manpages (!uman)
man.cx (!man)
 
JavaScript Docs (!js)
Mozilla Developer Center (!mdc)
Mozilla Developer Network (!mdn)
Python Docs (!py)
Pypi.python.org (!pypi)
Python2.6 Docs (!python26)
Python2.7 Docs (!python27)
 
Wikipedia (!w)
Wikipedia (ZH) (!wzh)
Wiktionary (!wt)
 
DICT.org (!dict)
WordNet (!wordnet)
Google Translate (!tr)  (可惜没有en <-> 中文的。下面这个可以用来查单词,但整句就不行了)
LEO Dictionary Chinese (!leoc)
 
AlternativeTo (!altto)
TotalCmd.Net (!totalcmd)
 
Twitter (!twitter)
StackOverflow (!so)
stackexchange.com (!sx)

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/09/27/most-powerful-search-box-in-firefox.html)

2012年9月6日星期四

2012-09 短博客

(8月试验了一下这种形式,觉得还不错,用评论来发比较短的博文很方便,修改也方便。本月继续。

不过这种方式对于通过RSS订阅的朋友来说就很不爽,所以我打算每月底整理一下,将通过评论发的“短博文”改放到正文来——有点想以前杂志上的“外xx篇”哈。而试图通过tag来分类查看的网友,就有点对不住了 :-)

之前的“网海拾贝”的形式就不搞了,光秃秃的放一些链接意思不大,整理起来也比较麻烦。)

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/09/06/shortblogs-2012-09.html)

2012年8月22日星期三

2012-08 短博客

清博客? 短博客?

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/articles/shortblog-2012-08.html)

2012年7月17日星期二

网海拾贝 2012-07 (linuxmint, git/hg, emacs, vim...)

1. LinuxMint

其实前几天写过了一篇相关的博文。这里是相关的一些链接。

2.Git/Hg

因为工作上的需要,我最近在研究GitHub以及探索内部开源的一些支撑手段,当然也就碰到了git。但在公司的Windows上使用git不太爽(其实我个人觉得还好,但我觉得在公司内推广git还是有些难度),于是又玩起了mercurial,觉得不错,回头详细写一篇对比。

2.1. 对比

2.2. 迁移/配合使用

2.3. Git

2.4. Hg

3.Emacs

3.1 org-mode

3.2 Emacs 24

3.3 CEDET

3.4 Why Emacs (& Emacs vs Vim)

这些链接其实有一半没认真看过,都是陆陆续续添加到Read It Later列表里面的,因为有一阵老想写一篇《为什么我转向了Emacs》,现在觉得其实没多大意义 :-)。

3.5 misc

4. Vim

5. Misc

5.1 Programming

5.2 Linux

5.3 Android

5.4 Wine

5.5 Misc

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/07/17/various-goodies-2012-07.html)