存档

‘Linux’ 分类的存档

emacs 的列编辑

2010年8月29日 wd 没有评论

列编辑我觉得是一个编辑器不能缺少的东西。在 vim 里面使用 C-v 就能进入列编辑,然后我通常用到的,也就是 d (删除) 和 I (插入)。在 emacs 里面一直没怎么用上这个,总感觉是操作很麻烦。最近操作了几次,发现也没那么难,呵呵。

emacs manual 里面关于列编辑的页面。emacs 里面那个默认的列编辑不会出来像 vim 里面那样的矩形选区(不过有别的方法好像可以做到),所以当你选择的时候,还是按行来选择的,你只需要关心选择的起始点和结束点之间的那个矩形就好了,你的操作只会在里面起作用。

对应到 vim 的 d,emacs 里面的应该是 C-x r d 或 C-x r k 了吧,对应到 I,应该是 C-x r t string 了吧,不过 emacs 里面这个是替换选择的东西为 string,你要是选个空的,应该就算是插入了吧。还有个 C-x r y 复制,我觉得会这几个应该就基本可以了吧。。

分类: Linux 标签:

使用 org-mode 来做自己的 job tracker

2010年7月23日 wd 3 条评论

用 emacs 的应该都知道 org-mode 这个大杀器,一直以来都想在工作里面用上他,可总是习惯不了。

这几天尝试把 org-mode 打造成了我的一个 job tracker,用来记录自己的 todo 和完成情况。

;;
;; org-mode
;;
 
;; (setq org-agenda-files '("~/org"))
(setq org-agenda-files (file-expand-wildcards "~/org/*.org"))  ;; 把 ~/org/*.org 都加入到 agenda 里面,使用 C-c a a 看 agenda 的时候,会从这些文件里面读
(add-to-list 'auto-mode-alist '("\\.org$" . org-mode))
(define-key global-map "\C-cl" 'org-store-link)
(define-key global-map "\C-ca" 'org-agenda)
(setq org-log-done t) ;; 变到 done 状态的时候,记录一下时间
 
(add-hook 'org-mode-hook
          (lambda ()
            (org-set-local 'yas/trigger-key [tab])
            (define-key yas/keymap [tab] 'yas/next-field-group)))
 
(setq org-todo-keywords
      '((sequence "TODO(t)" "WAIT(w@/!)" "|" "DONE(d!)" "CANCELED(c@)")))  ;; 设置一下 todo 的关键字,| 左边的是未完成状态,右边是 done 的状态
 
 
(setq org-default-notes-file "~/org/todo.org") ;; 设置 remember 的默认文件 
 
;;;  Load Org Remember Stuff
(require 'remember)
(org-remember-insinuate)
 
;; Start clock in a remember buffer and switch back to previous clocking task on save
;; (add-hook 'remember-mode-hook 'org-clock-in 'append)
;; (add-hook 'org-remember-before-finalize-hook 'bh/clock-in-interrupted-task)
 
;; I use C-M-r to start org-remember
(global-set-key (kbd "C-c m r") 'org-remember)
;; (define-key global-map "\C-cr" 'org-remember)
 
;; Keep clocks running
(setq org-remember-clock-out-on-exit nil)
 
;; C-c C-c stores the note immediately
(setq org-remember-store-without-prompt t)
 
;; I don't use this -- but set it in case I forget to specify a location in a future template
(setq org-remember-default-headline "Tasks") ;; 设置默认 remember 添加的 headline
 
;; 3 remember templates for TODO tasks, Notes, and Phone calls
(setq org-remember-templates (quote (("todo" ?t "** TODO %?\nCREATED: %U" nil nil nil)
                                     ;; ("note" ?n "* %?                                                                            :NOTE:\n  %U\n  %a\n  :CLOCK:\n  :END:" nil bottom nil)
                                     ;; ("appointment" ?a "* %?\n  %U" "~/git/org/todo.org" "Appointments" nil)
                                     ;; ("org-protocol" ?w "* TODO Review %c%!\n  %U" nil bottom nil))))
                                     ))) ;;设置 todo 的模板,里面第三个参数是模板,里面的变量的意思 google 下

在 todo.org 里面有两个 headline,一个是 * Tasks ,一个是 * Done。

配置好后,在任意的 buffer 按 C-c m r 就可以打开个 buffer,输入 todo 信息,然后按 C-c C-c 就可以把 todo 添加到 todo.org 里面去了,会添加到 * Tasks 这个 headline 下面。

完成一个任务的时候,在那上面按 C-c C-t 然后选择 done 就可以设置完成。手动(还不会自动。。。)把完成的任务挪到 Done 里面。

如果想看看有完成情况的统计,可以在 agenda 里面看,C-c a a,然后按 v,选择不同的模式看。每周的工作情况在那里面一目了然,呵呵。

Week-agenda (W29):
Monday     19 July 2010 W29
Tuesday    20 July 2010
Wednesday  21 July 2010
  todo:       17:33...... [ TODO 多看看 org-mode 的 agenda
Thursday   22 July 2010
  todo:       15:18...... Closed:     DONE a test
  todo:       15:18...... [ DONE a test
Friday     23 July 2010
  todo:       14:50...... [ TODO 梳理一下
  todo:       17:08...... [ TODO 了解下
  todo:       22:49...... [ TODO 申请
Saturday   24 July 2010
Sunday     25 July 2010
分类: Linux 标签: , ,

使用 grep sort 等工具的时候要注意 LANG 的设置

2010年7月12日 wd 5 条评论

发现在使用 sort 或 grep 等工具的时候,LANG 会影响到速度。

1.5G 的文件,grep -Ei ‘keyword’ file, LANG=C 的时候执行时间是 22 秒,LANG=en_US.UTF-8 的时候,执行时间是 3分53秒,最后结果是一样的。

这还不是最恐怖的,恐怖的是下面的

$ cat a
a
b
C
d
E
 
$ LANG=en_US.UTF-8 egrep '[a-z]' a
a
b
C
d
E
 
$ LANG=C egrep '[a-z]' a
a
b
d

以后用这些工具还是小心一点吧。。。。。

分类: Linux 标签: ,

无聊又写一个用来发邮件的 pm..

2010年7月9日 wd 没有评论

继使用 perl 发中文标题邮件,和中文附件邮件后,又把他们整合了一下写了一个 pm 干这个事。

其实发带附件的邮件应该是有现成的 pm 干这个事的,比如 MIME::Lite 之类,没特殊需求还是用那个吧,这个纯属无聊写的。

文件前面有使用方法。。

package SendMail;
 
use strict;
use warnings;
use Data::Dumper;
use Encode;
use MIME::Base64;
 
=head1 Examples
use SendMail;
 
my $sm = SendMail->new( {
    To => 'you@foo.com, other@bar.com',
    Subject => 'just a test 中文',
    });
 
-- or --
 
my $sm = SendMail->new( {
    From => 'me@abc.com',
    To => 'you@foo.com, other@bar.com',
    Subject => 'just a test 中文',
    } );
 
-- or --
 
my $sm = SendMail->new( {
    From => 'me@abc.com',
    To => 'you@foo.com, other@bar.com',
    Cc => 'cc@foobar.com',
    Subject => 'just a test 中文',
    } );
 
 
$sm->attach( {
    Type => "text/plain",
    Data => "只是一个测试..a test"
    });
 
$sm->attach( {
    Type => 'application/octet-stream',
    Filename => 'test 中文.txt',
    Data => "只是一个 test ..."
    });
 
$sm->test;
 
-- or --
 
$sm->send;
 
=cut
 
 
 
use vars qw($VERSION);
$VERSION = '0.01';
 
our $boundary = "FFFFFFFFKKKKKK";
our $from = 'no-reply@abc.com';
our $subject = "No subject";
 
our $to;
our $cc;
our @body;
 
 
sub new {
    my $package = shift;
    my $info = shift;
 
    $subject = $info->{Subject} || $subject;
    $subject = encode('MIME-B', decode('utf8', $subject));
    $from = $info->{From} || $from;
    $to = $info->{To} || die "Need to set MailTo 'To'!";
    $cc = $info->{Cc} || "";
 
    push @body, "MIME-Version: 1.0";
    push @body, "Content-Type: multipart/mixed; boundary=\"$boundary\"";
    push @body, "";
 
    return bless( {}, $package);
}
 
sub attach {
    my $self = shift;
    my $f_hash = shift;
 
    die "Need data when attach!" if ( not defined $f_hash->{Data} );
 
    my $type = "text/plain";
    $type = $f_hash->{Type} if defined $f_hash->{Type};
 
    my @t;
    push @t, "--$boundary";
    if ( $type eq "text/plain" ) {
        push @t, "Content-Type: $type; charset=utf-8";
    } else {
        my $filename = "file1.txt";
        $filename = encode('MIME-B', decode('utf8', $f_hash->{Filename})) if defined $f_hash->{Filename};
        push @t, "Content-Type: $type";
        push @t, "Content-Disposition: attachment; filename=$filename";
    }
    push @t, "Content-Transfer-Encoding: base64";
    push @t, "";
    push @t, encode_base64($f_hash->{Data});
 
    push @body, @t;
}
 
sub send {
    my $self = shift;
 
    open(my $fh, '|/usr/sbin/sendmail -t');
    $self->print_to($fh);
    close($fh);
}
 
sub print_to {
    my $self = shift;
    my $fh = shift;
 
    push @body, "--$boundary--";
 
    print $fh "From: $from\r\n";
    print $fh "To: $to\r\n";
    print $fh "Cc: $cc\r\n" if $cc;
    print $fh "Subject: $subject\r\n";
 
    for ( @body ) {
        print $fh "$_\r\n";
    }
}
 
sub test {
    my $self = shift;
 
    open ( my $fh, '>-');
    $self->print_to($fh);
    close($fh);
}
 
1;
分类: Linux 标签: ,

使用 perl 发带附件的邮件

2010年7月5日 wd 没有评论

上篇 使用 perl 发带中文标题的邮件后,又研究了下发带附件的。

基本差别不大,主要是那个 Content-type 要变一下。那个 boundary 可以自己随便写,和后面的统一就行了。

my $title = encode_base64("标题", "");
my $body = encode_base64("邮件正文");
my $attach = encode_base64("附件内容");
my $filename = encode('MIME-B', decode('utf8', "文件中文.txt"))
 
open(MAIL, '|/usr/sbin/sendmail -t');
 
print MAIL "From: test\@abs.com\r\n";
print MAIL "To: test\@abs.com\r\n";
print MAIL "Subject: =?UTF-8?B?$title?=\r\n";
print MAIL "MIME-Version: 1.0\r\n";
# print MAIL "Content-type: text/plain; charset=utf-8\r\n";
print MAIL <<EOF;
Content-Type: multipart/mixed; boundary=\"FFFFFFFFKKKKKK\"
 
--FFFFFFFFKKKKKK
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64
 
$body
--FFFFFFFFKKKKKK
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=$filename.csv
Content-Transfer-Encoding: base64
 
$attach
--FFFFFFFFKKKKKK--
EOF
    close(MAIL);
分类: Linux 标签: ,

使用 perl 发送中文邮件标题乱码

2010年6月30日 wd 没有评论

代码如下面,解决乱码的方法是使用 base64 编码。

use MIME::Base64::Perl;
 
open(MAIL, '|/usr/sbin/sendmail -t');
 
my $recver = 'wangdong@abc.com';
my $alertTitle = "中文 asdfsdf sdfsdf sdf sdf s df sd fsd f sd fsd f sdf sdf sdf";
my $alertText = "body ";
 
my $encoded = encode_base64($alertTitle, "");
 
print MAIL "From: alert\@abc.com\r\n";
print MAIL "To: $recver\r\n";
print MAIL "Subject: =?UTF-8?B?" . $encoded . "?=\r\n";
print MAIL "MIME-Version: 1.0\r\n";
print MAIL "Content-type: text/plain; charset=utf-8\r\n";
print MAIL "\n";
print MAIL "$alertText";
 
close(MAIL);

这里面 encode_base64 可以把文本做 base64 编码,要注意的是这个方法的第二个参数,是用来把编码结果进行格式化的,会每 76 个字符插入一个这个参数,默认是换行。

如果不是 utf8 的文本,那把里面的 utf8 改一下就好了。

分类: Linux 标签: ,

emacs 的 emms 里面的乱码

2010年6月19日 wd 没有评论

emms 是基于 emacs 的一个播放器,不过其它他做的应该只是管理音乐,具体播放还是靠 mpg123 或 mplayer 这样的程序。

前几天下了一些 mp3, 这两天就又搞了搞 emms。emacser.cn 有篇文章就是介绍这个的,就不多说了。主要是被编码问题搞死了。

下载的 mp3 的 tag 是 gbk 的,可是设置了 emms-info-mp3info-coding-system 为 gbk 没效果,而用 mp3info 程序看了 mp3 的 tag,确实是 gbk 的,奇怪了就。后来发现 emms 还带了一个 emms-print-metadata 这个程序,这个程序貌似不需要设置编码,他会出来的结果直接就是 utf8, 可就算用这个 (通过设置 (setq emms-info-functions ‘(emms-info-libtag)) ),出来的结果还是乱码。

后来突然想起来是不是 cache 的问题,然后就发现有两个地方可能有 cache,一个是 emms-cache.el 一个是 emms-history.el,把这两个对应的 cache 文件删掉,再运行一次 emms 就没问题了。我还设置了下下面的。

(setq emms-cache-file "~/.emacs.d/emms/emms-cache"
      emms-history-file "~/.emacs.d/emms/emms-history")
分类: Linux 标签: ,

备份 gentoo

2010年5月28日 wd 1 条评论

前段时间换本子,把 gentoo 重装了一遍,记下来一些需要备份的东西。

rc-update
启动列表,从这里面能找到你之前随机启动的东西

world
主动安装的程序列表

kernel
内核的配置文件,换机器后可能需要调整里面的磁盘 cpu 什么的配置

layman
加了什么 overlay

etc.tar.gz
程序的配置文件基本都在这下面,好在这个目录也还不算大

home.tar.gz
有些程序的配置文件在这里面,比如 firefox 什么的,另外比如 kmail 把邮件也存这里面

/opt
我把自己安装的一些程序放到了这里面,这些程序基本都是不依赖别的程序的。如果是需要 make 安装的,一般会写一个 ebuild。

fonts
自己安装的字体,一般放在 /usr/share/fonts/ 下面,看习惯了

stardict dicts
这个一般在 /usr/share/stardict/dic/ 下面,好像放 home 下面也可以,没试过。。

我自己的大概就上面这些了吧,另外还有就是自己的 overlay

备份了这么多东西完全弄好好像也花了好几天时间,当时是在 5.1 前后的时候弄的,好像花了4,5 天?没事还是别折腾了

分类: Linux 标签: ,

总算搞定了我的无线

2010年5月5日 wd 1 条评论

本子的网卡是 bcm4312,内核里面是有驱动支持的,只要编译了,再装一个 firmware 就应该能用了。可我这的表现是开机能连上一会,后面会断,断了后就再也连不上了,只能重启。

没办法,找了半天,看到一个 broadcom-sta 的驱动,这个是 broadcom 官方出的。装的时候刚好赶上了 2.6.33 的内核,这个内核对比 2.6.32 有不少的变化。我记得之前没有先的选项在 .config 里面好像也是可以搜到的,不过是注释的。现在 2.6.33 里面,直接就搜不到了。而安装 broadcom-sta 的时候要求的几个内核选项花了好大功夫才搞定。

比如这个 wireless_ext。make menuconfig 后搜一下,能搜到,不过会发现他没有 Location,只有个 selected by。这就是说,只有满足了那些 selected by 的时候,这个才会被选上。在 selected by 里面,能看到 GELIC_WIRELESS [=n] && NETDEVICES [=y] && NETDEV_1000 [=y] && WLAN [=y] && GELIC_NET [=n] || IPW2100 [=m] && NETDEVICES [=y] && WLAN [=y] && PCI [=y] && CFG80211 [=y] 这样的一些内容。怎么理解呢?这些是按照那些 || 来分割的,竖线左右的是或的关系,不管哪边满足都可以。我在那个长长的列表里面摸索了半天,总算找到一个合适的,那就是先把 ipw2100 这个驱动选上,因为网卡不是这个型号的,所以把这个编译成模块,然后加在 blacklist 里面。

要使用无线,一般还需要一个模块,LIB80211_CRYPT_TKIP,用来支持 wpa 的。这个你在 dmesg | grep lib80 的时候能看到,如果没有 tkip 在里面,那基本应该是连不了 wpa 的网络的。这个模块也是需要选别的模块才能激活,上面选的那个 ipw2100 刚好还用在了这里,呵呵。另外还需要一个 hostap 的模块。

然后 broadcom-sta 还需要把 ssb,mac8012 这些模块关闭,反正按照提示来做就好了,这些都有 location,很好搞定。

装好后,就可以使用 wpa_supplicant 来连接无线了。要注意的是,使用的 driver 不是那个 braodcom,而是 wext。

分类: Linux 标签:

elisp 最最初级的一点入门知识

2010年4月25日 wd 没有评论

其实上次写 http://wdicc.com/how-i-became-a-emacser 的时候,是想写一点 eslisp 入门的东西的,结果总觉得好像也写不出来什么,就写成另一篇了,呵呵。(看这篇前最好先看看那个吧,那个更入门。)

不过我还是觉得,用 emacs 如果不会一点 elisp,那基本你是用不住的。记那些无聊的快捷键有什么意思,有意思的是你能让 emacs 用你希望的模式工作。今天 twitter 上面看到一个词”计算姬”,感觉很有点意思,呵呵,小蜜就是给你干活的嘛,不要被她折磨就好。

其实主要是我自我感觉目前了解的 elisp 的东西,好像基本就够用了,所以才想写出来,给比我还糊涂的指条明路。

1 数据类型。
elisp 是有类型在里面的,我看好像有什么 sequence, number 之类,具体有哪些不重要,重要的是你使用的时候,比如比较的时候,切记要弄明白他们是什么类型。我找到一个 format 函数,感觉很好用,可以转类型,具体可以查文档,可以多用用。

2 调试
调一个程序的时候,我觉得最基本的就是 print 和 message 这两个函数了吧,加上上面的 format,基本应该能搞定了。在一段 elisp 后面使用 C-x C-e 就能直接执行他,执行之后就能在当前的 emacs 里面起作用,不过对我等菜鸟来说,有时候会遇到一些奇怪的问题,不行就还是再启动一个 emacs 来验证结果吧。

3 emacs 简单设置
掌握了上面两个,基本就可以定义自己的东西了。一般用的是 setq,比如下面这个

;; 防止页面滚动时跳动, scroll-margin 3 可以在靠近屏幕边沿3行时就开始滚动,可以很好的看到上下文。
(setq scroll-margin 3
            scroll-conservatively 10000)
(set-terminal-coding-system 'utf-8)
(add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))

可以看到他一次设置了两个变量,其实写两个括号也是可以的。

还有下面的两行,他是执行了一个函数,这个函数里面干的什么,他接受什么参数,直接在 emacs 里面按 C-h f 然后输入你要查的函数的名字,就会显示 help 信息,很方便吧。

4 hook
下面稍微高级一点,了解下 hook 怎么用。hook 这个东西翻译过来应该是钩子的意思吧,其实就是别人的程序预留的一些接口,可以让你在他的程序里面插入一些你自己的程序。比如下面这几个。

(add-hook 'weblogger-start-edit-entry-hook (lambda()
    (auto-fill-mode -1)
    (abbrev-mode -1)
    (auto-complete-mode 1)
    ))
(add-hook 'cperl-mode-hook (lambda () (abbrev-mode -1)))
(add-hook 'view-mode-hook 'view-mode-keybinding-hook)
 
(defun weblogger-edit-entry (&optional entry)
  "Edit a entry.  If ENTRY is specified, then use that entry.
Otherwise, open a new entry."
   ...........
  (run-hooks 'weblogger-start-edit-entry-hook)
)

第一个是在 weblogger.el 开始编辑文件的时候,把那些 mode 关掉。第二个是 cperl-mode 启用的时候,把 abbrev-mode 关掉。第三个是在 view-mode-hook 执行的时候,执行那个函数。

最后是在实际代码里面这个 hook 是怎么执行的,能看到当调用 weblogger-edit-entry 的时候,就会在这里面某个时候去执行之前设置的 hook,这样个性化设置的目的就达到了。

eamcs 的各种 mode 一般都有各种的 hook,这应该能完全达到个性化的目的了,可有些时候想定制的地方没有 hook 怎么办?暴力一点,直接改他的程序好了。。。温柔一点的,那就看下面这个。

5 defadvice

defadvice 在文档里面写的很清楚,大概应该是可以在一个已有函数执行前或后执行你定义的东西。比如下面这个。

;; use this to auto cancel notify
;; (add-hook 'erc-send-pre-hook
;;           (lambda(s)
;;             (erc-tray-change-state nil)))
(eval-after-load 'erc
  '(progn
     (defadvice erc-send-input (before change-tray-status activate)
       (erc-tray-change-state nil))))

我设置了 erc 在收到消息的时候会发送 notify 到 tray,我想做到只要我在 erc 里面输入了一些东西(即使是空的),就把 tray 的状态标记为已读,就不用继续提醒我了。

erc 有个 erc-send-pre-hook,可以在发送一条消息前执行 hook,可是如果输入的是空行,是不会触发这个 hook 的,使用 defadvice 可以解决这个,具体使用方法还是看文档吧,我突然觉得我很罗嗦。。。。屁大点东西也能发一篇?。。。

我会的基本就说完了,其它高级玩意有需要的时候应该可以从文档里面去看吧,目前来看,会用 hook 和 defadvice 我就知足了,不行就来 irc 里面找牛人问一个,经过提示后,应该还是能解决的吧。反正不求能自己去写一个 mode,当时最少也要能看明白别人的那点东西,然后自己能改一下吧,要不用 emacs 会很痛苦的。

分类: Linux 标签: ,