FC46 决胜命令行

出自Full Circle 中文项目主页

(重定向自FC46 绝胜命令行
跳转到: 导航, 搜索

决胜命令行

Conky - Part 2

作者:Lucas Westermann

这一期,我将和大家分享两个主题,一是介绍如何通过Conky和Bash创建一个TODO列表,另一个是Zenity的基本用法。我将通过TODO列表的例子来介绍Conky的使用,另外我也会附带介绍一些相关的技巧。如果有很多读者对Conky感兴趣,那么我会在后续的杂志中详细介绍它的应用。

TODO列表

我创建TODO列表的方式很简单,直接在Dropbox的目录中创建一个符号链接,链接到一个我称之为Reminders的目录。然后在这个目录里,根据TODO任务的类型创建若干个文件(例如学校、FCM、工作、个人等等)。然后在Conky中调用一个我自己写的Python脚本。该脚本会遍历这些文件,然后将每一个以“-”开头的行打印出来。当然不一定非的是python,别的语言也很容易办到。如果你有兴趣的话,可以参考文末的我的python脚本,或者自己写一个。记得使用前将“Reminders”替换为你的主目录中的某个目录名,脚本会自动按照/home/用户名/的格式加上你的主目录路径。脚本会自动忽略了以点开头的隐藏文件以及以~结尾的备份文件。

这种方式看起来虽然可行,但是貌似一点都没有技术含量。比如我们添加TODO事件时,通常会加上一些时间日期。当然仅仅添加时间也很简单,不过要是将各个TODO事件通过这个时间来排序呢?

这里我又整了两个很简单的脚本来实现。第一个是createToDo.sh,它的作用是将某个文件(文件名通过$file变量指定,文件内容即前面python脚本打印出来的内容)逐行读出,并用unix时间戳替换掉原来“月 日 时:分”格式的日期。然后从小到大进行排序,从而实现时间的排序。最后将排序后的结果输出到一个新文件中。第二个脚本是printToDo.sh,它的作用和createToDo.sh相反,它会把时间戳替换为普通格式的时间并输出。

createToDo.sh通常作为cron计划任务每小时(或者几分钟)运行一次,printToDo.sh则通过Conky中调用。这种看似麻烦的方法在我的使用中还没有遇到什么问题。这里也只是抛砖引玉,欢迎大家提出更好的解决方案,而且下一个月的《决胜命令行》栏目中,我也会介绍一些别的实现方式。

Zenity

也许很多人都没有听说过Zenity,其实他就是一个基于命令行的图形化对话框创建工具。虽然很多人对命令行都敬而远之,觉得这玩意有点高深。因此我先在这里简单介绍一下Zenity的用法,下次专题我会深入介绍Zenity。

Zenity能够创建基于文本的窗口、日历对话框、信息提示对话框、进度框、托盘区图标、列表对话框、保存对话框、复选框、错误提示对话框、等等等等。例如:

<command>|  tee  > (zenity --progress --pulsate) >file

这条命令可以将command输出的内容写入到file中,并且通过zenity打开一个进度提示框用于提示进度写出去的进度。

zenity --question --test 'Question?'; echo $?

这条命令将会创建一个对话框,并输出提示信息“Questiong?”和一组“OK”“Cancel”按钮。如果用户按下“OK”按钮,Echo $?将会返回“0”,如果按下“Cancel”将会返回1。如果只是要给用户显示警告信息,只需要将--question替换为--warning即可。

<command>|zenity --text-info --width <size in pixels>

这条命令会将command输出的所有内容放到一个文本框里,并通过一个信息框显示出来。

input=$(zenity --entry --text "How are you?" --entry-text "enter text here"); echo $input

这条Zenity命令将会创建一个基于文本的窗口及输入框,并将用户的输入返回到input变量中,最后通过echo输出

zenity --error --text 'An error occurred!'

这条命令创建一个错误提示窗口,并将错误信息输出

Zenity同时提供了更多的参数和用法,只需要灵活使用其提供的参数即可。下个月我计划深入的讲解该命令的使用。如果你有什么好的想法或者希望通过Zenity实现某种功能,欢迎给发邮件到lswest34@gmail.com,邮件主题请注明FCM或者C&C,以免不幸被扔进垃圾箱里。当然也可以提一些别的关于本文的建议或者信息。

附一:createToDo.sh脚本

#!/bin/bash
file=~/ToDo.txt
toDo=~/toDo.txt
if  -e $toDo ; then
    `rm "$toDo"`
fi
while read line; do 
    date=`date -d"$(echo "$line"|sed 's/\(.\) -.*$/\1/g')" +%s`;
    echo "$(echo "$line"|sed -e s/".*-"/"$date -"/g)" >> "$toDo";
done < "$file"

if  -e "$toDo" ; then
    temp=`sort -n "$toDo"`
    echo "$temp" > "$toDo"
fi


附二:python脚本

#!/usr/bin/env python
import os

home=os.path.expanduser("~")

for root, dirs, files in os.walk(os.path.join(home,"Reminders")):
    for infile in [f for f in files]:
        if(infile.endswith("~")!=True):
            fh=open(os.path.abspath(os.path.join(root,infile)))
            for line in fh:
                print("- "+line, end=' ')
            fh.close()
个人工具