当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 3 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 待办事项管理脚本兼谈dash里面诡异的local及其他
帖子发表于 : 2011-02-15 19:27 
头像

注册: 2005-07-02 14:41
帖子: 4160
系统: Ubuntu 14.04 (Kylin)
送出感谢: 64
接收感谢: 12
基本的想法就是每件todo对应一个文件,事项就是文件名,备注就是文件内容。做完的记录在.done目录里面。

代码:https://gist.github.com/827296

我在dash和mksh下试过,没发现什么大问题。应该还是比较通用的。

======================
用法举例
======================

初始化

ftm init

(默认文件都存在~/.config/ftm下,可以 ftm init /path/your/dir 来制定其他目录)

新增

ftm -a 明天去买牙膏

写备注(调用默认编辑器编辑)

ftm -e 明天去买牙膏

也可以偷懒,尾部省略(要求唯一匹配)

ftm -e 明天

看备注:

ftm -c 明天去买牙膏
要买白人牌的

列出所有todo

ftm -l

列出带“买”字的todo

ftm -l 买

做完了:

ftm -d 明天去买牙膏

支持尾部省略(要求唯一匹配)

ftm -d 明天

或者,ftm -d 标记ftm -l列出的第一项

ftm -n也是显示ftm -l列出的第一项

ftm -s ERE正则表达式

搜索所有todo的备注

其他用法

ftm -h

或者直接看原文件的注释,最详细。

===================
关于这个脚本
===================

没经验,写得乱七八糟的。

语法真是诡异,fi和esac之类的倒觉得还好,我感到奇怪的是函数定义里面 { 和 } 居然是关键词。最要命的是quote和escape,大部分时间都浪费在这上面。

都用了全局变量。其实函数里面应该用local的。但是dash里面的local很诡异,比如下面的例子:

代码:
f() {
  local x=1
  readonly x
  echo $x
}

g() {
  local x=2
  readonly x
  echo $x
}

f
g
f


mksh和bash都输出

代码:
1
2
1


dash就报错。所以为了兼容这个dash,我就全用了全局变量。

顺带一提,ftm init dir可以指定保存的目录,这个数据要记录下来。但我又不想为了这个搞一个配置文件。不知道有什么好办法?

我现在的做法是用sed修改源代码中的变量,类似:

代码:
config_bang() {
    readonly var_pattern="^(readonly $1=).*"
    readonly new_var_pattern=$2
    sed -i -r -e "s:$var_pattern:\1$new_var_pattern:" $0
}


可以工作,但总觉得这样搞不靠谱。


_________________
https://weakish.github.io


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 待办事项管理脚本兼谈dash里面诡异的local及其他
帖子发表于 : 2011-02-15 20:45 
头像

注册: 2008-09-18 13:11
帖子: 2770
送出感谢: 1
接收感谢: 449
local那个应该是dash的bug,而且很可能是readonly的bug。先定一个全局的x,后面再执行fg就不会报错了
另外这样定义也不会报错:local readonly x=1

另外呢,按照这个规范 http://standards.freedesktop.org/basedi ... atest.html
配置文件该放$XDG_CONFIG_HOME/ftm,XDG_CONFIG_HOME没设置才用$HOME/.config/ftm
而所有的todo文件是数据,该放在$XDG_DATA_HOME/ftm或$HOME/.local/share/ftm里

还有就是help()的输出,按照惯例来说,[]里面的参数是可选的,你那个不该加[]


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 待办事项管理脚本兼谈dash里面诡异的local及其他
帖子发表于 : 2011-02-16 19:30 
头像

注册: 2005-07-02 14:41
帖子: 4160
系统: Ubuntu 14.04 (Kylin)
送出感谢: 64
接收感谢: 12
astolia 写道:
local那个应该是dash的bug,而且很可能是readonly的bug。先定一个全局的x,后面再执行fg就不会报错了


反正dash的local和readonly碰一起就很诡异。比如下面的例子,定义全局变量也没用:

代码:
x='global'

g() {
  local x
  readonly x=$1
  echo $x
}

f() {
  local x
  readonly x='f'
  g $x
}

f


dash还是报错:

代码:
readonly: 13: x: is read only



引用:
另外这样定义也不会报错:local readonly x=1


这样就不readonly了。貌似是定义了两个local变量,一个叫readonly,一个叫x。

代码:
f() {
  local  readonly x='x'
  x='y'
  echo $x
}
f


dash/bash/mksh输出都是y。

引用:
所有的todo文件是数据,该放在$XDG_DATA_HOME/ftm或$HOME/.local/share/ftm里


发现我以前没认真看XDG。-_-! 以为放~/.config就可以了。现在看了下,正当做法是先找$XDG_DATA_HOME,没设定的话,默认取~/.local/share。然后建立ftm目录(还要判断ftm是否存在,不存在的话权限设为0700,存在的话不作变动)。好复杂。我还是不赶时髦,用老式的~/.ftm吧。

引用:
还有就是help()的输出,按照惯例来说,[]里面的参数是可选的,你那个不该加[]


谢谢指出。其实edit/done什么的都有默认项,但是add确实没有。


_________________
https://weakish.github.io


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 3 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译