|Script|在控制台使用 cd 命令时,用拼音自动补全中文路径

222 views
Skip to first unread message

邵志雄

unread,
May 4, 2009, 3:03:19 AM5/4/09
to 二进制生存, shaozx...@blogger.com, nkeric-daily
在控制台使用 cd 命令时,用拼音自动补全中文路径

实验目录如下:
biff@lenovo:/domain/WorkSpace$ ls
SVN培训  全球眼  浙江建行  浙江农信

使用: (输完后按 TAB 键自动补全)
   cd S     <tab>             进入[SVN培训]
   cd q     <tab>             进入[全球眼]
   cd z     <tab>             自动补全[浙江]
   cd zj    <tab><tab>        提示[浙江建行 浙江农信]备选
   cd 浙江j <tab>             进入[浙江建行]
   cd zjj   <tab>             进入[浙江建行]
   cd zj1   <tab>             进入[浙江建行]
   cd zj2   <tab>             进入[浙江农信]

配置:
    找到 /etc/bash_completion 中 _file_dir() 函数,将
       COMPREPLY=( "${COMPREPLY[@]}" "${toks[@]}" )
    改成 ( 其中chsdir为本脚的名字,注意指定路径和赋执行权限 )
       chs=($(chsdir "x$1" "$cur"))
       COMPREPLY=( "${COMPREPLY[@]}" "${toks[@]}" "${chs[@]}" )
    ( 这是最简单的,但也是最不安全的。还有其它的方法,比如将这段函数粘到$HOME/.bashrc文件中,在引用/etc/bash_completion之后再覆盖性的定义一遍。或者另起一个文件保存这段脚本,然后在.bashrc中用 . $HOME/bin/myscript.sh 导入一遍。注意小点点。)
    ( 上面的修改只对 cd 命令生效,如果其它地方也需要补全,比如vim,还要用相同的方法处理 _filedir_xspec() 函数 )

问题:
  1、多音字无法解决,比如[浙江建行]要输入[zjjx];
  2、可以用数字序号定位,但是现在序号有乱序问题,思考中...
  有问题邮件联系!

祝Linux之行一路顺风!


---------------------------------
   google talk
sha...@gmail.com
---------------------------------
chsdir

qq274980

unread,
May 4, 2009, 3:20:16 AM5/4/09
to 二进制生存

@@ -78,6 +78,7 @@

dironly = sys.argv[1]
cur = sys.argv[2]
+ cur = cur.replace("\\","")

idx=None; _cur=cur
if len(cur)>1 and cur[-1:] >='0' and cur[-1:]<='9':


增加一行,解决无法进入带空格目录的问题

邵志雄

unread,
May 5, 2009, 8:46:14 PM5/5/09
to 二进制生存, nkeric-daily

附件里面三个文件:

chs_completion 是一个bash_completion 脚本,需要导入 bashrc
chsdir是一个python脚本,需要放在$PATH路径中
install.sh可以直接执行,自动完成上面两步的安装,或参照进行手工安装。

安装后,在控制台进入中文目录非常方便了,输入 cd + 一两个拼音首字母 然后敲<tab>键就能自动补全。

目前还没发现有什么副作用。



---------------------------------
   google talk
sha...@gmail.com
---------------------------------


2009/5/4 邵志雄 <sha...@gmail.com>
chs_completion
chsdir
install.sh

邵志雄

unread,
May 6, 2009, 7:22:23 AM5/6/09
to 二进制生存

又做了一些修订,可以用序号定位了。

如果有多个中文目录或文件备选,用1-9进行选择。

上一个版本进多级目录时有问题,比如 cd  /dir1/dir2/我的音<tab> 不能补全,已经修正了

附件是完整的版本
chs_completion
chsdir
install.sh

邵志雄

unread,
May 6, 2009, 7:40:35 AM5/6/09
to 二进制生存

组空间最大附件只允许4M,上传了一个演示的视频在这里:

http://code.google.com/p/easyscripts/downloads/list

邵志雄

unread,
May 16, 2009, 12:55:34 PM5/16/09
to 二进制生存

这几天做了些小改动,发布一个新版本

1、解决了locale报错的问题,
2、通过模糊匹配解决大字符集汉字的问题
chsdir20090509.tar.gz

邵志雄

unread,
Aug 30, 2009, 9:12:44 PM8/30/09
to 二进制生存
新增多音字支持!
遇到有未被收入的多音字,请邮件联系我!

=================================

新安装,运行 install.sh
tar xvzf chsdir_20090831.tar.gz
cd chsdir
sh install.sh (不需要使用root权限,不然就帮root用户装上了)

升级,直接拷贝 chsdir 一个文件,覆盖原来的文件
tar xvzf chsdir_20090831.tar.gz
cd chsdir
cp chsdir ~/bin/chsdir

=================================


---------------------------------
google talk
sha...@gmail.com
---------------------------------

2009/5/17 邵志雄 <sha...@gmail.com>:

邵志雄

unread,
Aug 30, 2009, 9:16:47 PM8/30/09
to 二进制生存
---------------------------------
google talk
sha...@gmail.com
---------------------------------

2009/8/31 邵志雄 <sha...@gmail.com>:

chsdir_20090831.tar.gz

hui liu

unread,
Aug 30, 2009, 9:32:04 PM8/30/09
to bin...@googlegroups.com
恩更新后达到效果了。很好很强大

在09-8-31,邵志雄 <sha...@gmail.com> 写道:

邵志雄

unread,
Aug 30, 2009, 10:12:30 PM8/30/09
to bin...@googlegroups.com
下一步是模糊音匹配,比较常遇到的是 n 和 l

不过人是有惰性的,加上模糊音匹配以后,我的拼音会不会更差了呢??

G1的谷歌拼音不支持模糊拼音,我现在还真把常见的几个字的n/l记清楚了,呵呵


---------------------------------
google talk
sha...@gmail.com
---------------------------------

2009/8/31 hui liu <liuhui3...@gmail.com>:

hui liu

unread,
Aug 30, 2009, 10:32:42 PM8/30/09
to bin...@googlegroups.com
搞个湖南话模糊匹配。哈哈

在09-8-31,邵志雄 <sha...@gmail.com> 写道:

邵志雄

unread,
Aug 31, 2009, 5:38:37 AM8/31/09
to bin...@googlegroups.com
搞定,加了十行代码,多了模糊拼音的支持,

下班咯,老婆打电话喊我回家吃饭,晚上再发布!!

:-)

邵志雄

unread,
Aug 31, 2009, 7:57:25 AM8/31/09
to bin...@googlegroups.com
增加模糊拼音匹配,如有需要,请自行配置环境变量,配置方法如下:

在系统环境变量中增加匹配的列表,例如对 n/l 进行模糊匹配
export CHSDIR="{ 'n':'l' }"
多个匹配对之间用逗号隔开:
export CHSDIR="{ 'n':'l','f':'p' }"

可以写到$HOME下的 .profile 或 .bashrc 中去

---------------------------------
google talk
sha...@gmail.com
---------------------------------

2009/8/31 邵志雄 <sha...@gmail.com>:

chsdir_20090831.tar.gz

邵志雄

unread,
Aug 31, 2009, 9:49:22 PM8/31/09
to bin...@googlegroups.com
开学纪念版!明年我儿子就要上幼儿园了,呵呵!

chsdir_20090901.tar.gz (application/x-gzip) 5K

见附件!

chsdir_20090901.tar.gz

hui liu

unread,
Aug 31, 2009, 9:51:29 PM8/31/09
to bin...@googlegroups.com
360.gif

eexp

unread,
Sep 17, 2009, 5:28:31 AM9/17/09
to 二进制生存
2009-09-17 17:26:11 四 ~/安装/chsdir-CLI拼音补全

● file install.sh
install.sh: ISO-8859 text
● enconv install.sh
● cat install.sh
EXECPATH=$HOME/应用/脚本

mkdir -p $EXECPATH
cp chsdir chs_completion $EXECPATH
chmod +x $EXECPATH/chsdir

echo '. $EXECPATH/chs_completion' >>$HOME/.bashrc
● l
chs_completion chsdir_20090509可用* chsdir_20090901* install.sh*


又见经典py错误哦。

邵志雄

unread,
Sep 17, 2009, 11:27:34 AM9/17/09
to bin...@googlegroups.com
:?

经典py错误?什么意思?


---------------------------------
google talk
sha...@gmail.com
---------------------------------

2009/9/17 eexp <exp...@gmail.com>:

eexpress

unread,
Sep 19, 2009, 8:55:31 AM9/19/09
to bin...@googlegroups.com
ub论坛。我说明了下。就是py的错误,夹杂在输出中。补全找不到吧,大概。

邵志雄

unread,
Sep 20, 2009, 10:50:09 PM9/20/09
to bin...@googlegroups.com
多谢反馈!


如果系统环境变量中找不到模糊拼音配置变量就会报错,
export CHSDIR="{'l':'n'}" 设置一个应该就好了

下个版本修正 :)

---------------------------------
google talk
sha...@gmail.com
---------------------------------

2009/9/19 eexpress <exp...@gmail.com>:

邵志雄

unread,
Sep 20, 2009, 11:10:31 PM9/20/09
to bin...@googlegroups.com
小手术:

方法一:
在 .bash_profile 中加个模糊拼音的环境变量,比如不区分 n 和 l:
export CHSDIR="{'l':'n'}"

如果你的拼音超牛B,不需要模糊拼音功能,但需要多音字支持,设置成
export CHSDIR="{'l':'l'}"
也行 :em04 ( 做个无用功 )


方法二:
修改代码,把 LIST_TEST=None 改成 LIST_TEST={}
代码:
biff@lenovo:chsdir$ svn diff chsdir -r 33
Index: chsdir
===================================================================
--- chsdir (版本 33)
+++ chsdir (工作副本)
@@ -84,12 +84,12 @@
u"-":u"-", u"+":u"+", u"[":u"[", u"]":u"]", u"<":u"<", u">":u">",
u"?":u"?", u",":u",", u"。":u".", u"/":u"/", u"、":u"," }

-LIST_TEST=None
+LIST_TEST={}
try:
LIST_TEST=eval( os.getenv("CHSDIR") )
LIST_TEST.keys()
except:
- LIST_TEST=None
+ LIST_TEST={}

def getPYSTR(s):
try: s=unicode(s,"UTF8")


---------------------------------
google talk
sha...@gmail.com
---------------------------------

2009/9/21 邵志雄 <sha...@gmail.com>:

qq274980

unread,
Sep 20, 2009, 11:31:59 PM9/20/09
to 二进制生存
新版本发布, chsdir_20090921.tar.gz

lilydjwg

unread,
Nov 7, 2009, 3:56:41 AM11/7/09
to 二进制生存
能不能弄个支持 zsh 的?

On 9月21日, 上午11时31分, qq274980 <sha...@gmail.com> wrote:
> 新版本发布, chsdir_20090921.tar.gz

邵志雄

unread,
Nov 7, 2009, 4:52:23 AM11/7/09
to bin...@googlegroups.com
没用过zsh,不太熟,有空研究一下 -_-!

---------------------------------
google talk
sha...@gmail.com
---------------------------------

2009/11/7 lilydjwg <lily...@gmail.com>:

qq274980

unread,
Dec 16, 2009, 5:06:43 AM12/16/09
to 二进制生存

使用中的2个问题,谢谢大家反馈!
内容是转发的,有兴趣可以看一看!

2009/12/16 Jianxin Zhong <azu...@gmail.com>

Hi, shaozx:

我在用 chsdir 的时候,发现两个小问题:

1)
$ ls
01-建行 03-农信
$ cd 03<TAB>


00-测试 01-建行 03-农信 0a-中国

* cd 00<tab> 正常

* cd 01<tab> 二义性

* cd 02<tab> 正常 应该也会出现二义性的情况,但这里指向01-建行,所以正常
* cd 03<tab> 正常
* cd 04<tab> 正常
* cd 0a<tab> 正常

这里的1可以理解成字母1(指向01-建行),也可以理解成序号(指向00-测试),为了解决这个二义性问题,只好将结尾的数字干掉。

1、维持现状,出现二义性的时候假设最后一个数字是序号,去掉后重新匹配;
建议遇到这种情况的时候多追加一个字母来回避。
2、修改代码,方案待定;要解决完整匹配和序号匹配间的冲突。
遇到有完整匹配的路径时,自动取消序号匹配?那么乱字符目录就进不去了,呖

补充: 0不会出现二义性,1~9才会有这个问题,刚才看代码的时候修正了,^_^


2)
$ ls
zjjh 浙江建行
$ cd zjjh<TAB>

前者会把 3 吃掉,变成 `$ cd 0`,不能补全;后者会变成 `$ cd zjjh/`,不把两个目录都作为候选。


这个问题是由这两行决定的:
if name in list or _name in list :
sys.exit(0)
代码是年初写的,中间修补过多次,不记得为什么专们加这两行。。。。真的想不起来了,但是肯定是匹配中有什么小问题吧,抽空再看看。

加这两行应该是为了加快匹配速度,在一个文件数3000+的目录下面被卡过一次,后期再测试一下,考虑去掉。


chsdir 非常有用,希望做得更好。

非常感谢分享。


第一个问题很早就发现了,但是苦无良策,只好这样放着了,等一个鱼与熊掌兼得的方案。

谢谢反馈,有什么好的想法欢迎随时与我联系!!


qq274980

unread,
Dec 24, 2009, 5:04:41 AM12/24/09
to 二进制生存
ubuntu 10.04 升级了半个月,今天bash_completion突然变化,具体变化不详。。。。但是chsdir报错了。。。杯具

qq274980

unread,
Dec 24, 2009, 7:23:23 AM12/24/09
to 二进制生存
chs_completion 对照 /etc/bash_completion 修改了一下,好了

10.04用的人还不多吧,以后再升级

Linxiao

unread,
Dec 24, 2009, 10:12:46 AM12/24/09
to bin...@googlegroups.com
呵呵,我还是等到明年再升我的8.04

2009/12/24 qq274980 <sha...@gmail.com>
--

您收到此邮件是因为您订阅了 Google 网上论坛的“二进制生存”论坛。
要向此网上论坛发帖,请发送电子邮件至 bin...@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 binsos+un...@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/binsos?hl=zh-CN 访问此网上论坛。





--
leal @ www.leal.cn



邵志雄

unread,
Jan 19, 2011, 2:43:29 AM1/19/11
to 二进制生存

1、 code.google.com 网站上有人提交修订,修正了多音字的问题,感谢 mozbugbox 提交修订代码

2、 修改了 install.sh 脚本,以前不推荐用root权限安装,现在不管了,用户自已决定

3、 有人做了ArchLinux的包,直接运行 yaourt chsdir 即可从源安装,感谢 dickeny 打包


ArchLinux,升级以后,系统 python 默认指向了 python3 ,程序运行报错,
参考 http://code.google.com/p/easyscripts/issues/detail?id=2
修改方法:
 打开 chsdir 文件,将第一行

#!/usr/bin/env python
 改成
#!/usr/bin/env python2


---------------------------------
    google talk
 sha...@gmail.com
---------------------------------


2010/10/19 qq274980 <sha...@gmail.com>
上周测试了一下,Ubuntu 10.04 可用,ArchLinux更新到最新也是可用的。

今天升级了 ArchLinux,系统 python 默认指向了 python3 ,语法报错
修改方法:
 打开 chsdir 文件,将第一行
#!/usr/bin/env python
 改成
#!/usr/bin/env python2

邵志雄

unread,
Jan 19, 2011, 2:49:27 AM1/19/11
to 二进制生存

新版本,见附件


---------------------------------
    google talk
 sha...@gmail.com
---------------------------------


2011/1/19 邵志雄 <sha...@gmail.com>
chsdir_20110119.tar.gz

邵志雄

unread,
Aug 2, 2011, 4:59:41 AM8/2/11
to 二进制生存
代码修订,识别 ~/ 缩写
ubuntu 11.04 及 ArchLinux 下测试可用。

见附件。

chsdir_20110802.tar.gz

Vayn

unread,
Aug 2, 2011, 7:54:36 PM8/2/11
to bin...@googlegroups.com
什么时候升级到 Python 3 咧?

2011/8/2 邵志雄 <sha...@gmail.com>
代码修订,识别 ~/ 缩写
ubuntu 11.04 及 ArchLinux 下测试可用。

见附件。

lilydjwg

unread,
Aug 3, 2011, 2:57:25 AM8/3/11
to bin...@googlegroups.com
On Wed, Aug 03, 2011 at 07:54:36AM +0800, Vayn wrote:
> 什么时候升级到 Python 3 咧?
>
> 2011/8/2 邵志雄 <sha...@gmail.com>
>
> > 代码修订,识别 ~/ 缩写
> > ubuntu 11.04 及 ArchLinux 下测试可用。
> >
> > 见附件。

Python 3 我倒是不担心。什么时候支持 zsh 呢?

--
Best regards,
lilydjwg

Linux Vim Python 我的博客
http://lilydjwg.is-programmer.com/

Reply all
Reply to author
Forward
0 new messages