Emacs的三种行滚动方式

第一种,光标到达屏幕边缘触发滚动。这是Emacs默认的滚动方式。

第二种,光标粘住某一行(stick the text line),直到该行离开屏幕,光标停留在屏幕边缘。

1
2
3
4
5
(global-set-key  [(meta down)] (lambda (&optional n) (interactive "p")
(scroll-up (or n 1))))

(global-set-key [(meta up)] (lambda (&optional n) (interactive "p")
(scroll-down (or n 1))))

第三种,光标停留在屏幕上的某一行(stick the absolut line),无论怎么滚动,光标都不会移动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
;; scroll functions
(defun hold-line-scroll-up()
"Scroll the page with the cursor in the same line"
(interactive)
;; move the cursor also
(let ((tmp (current-column)))
(scroll-up 1)
(line-move-to-column tmp)
(forward-line 1)
)
)

(defun hold-line-scroll-down()
"Scroll the page with the cursor in the same line"
(interactive)
;; move the cursor also
(let ((tmp (current-column)))
(scroll-down 1)
(line-move-to-column tmp)
(forward-line -1)
)
)

(global-set-key (kbd "M-n") 'hold-line-scroll-up)
(global-set-key (kbd "M-p") 'hold-line-scroll-down)

这三种方式,第一种太简单了。第二、三种各有优缺点,所以绑定到不同的按键组合。

Emacs的三种行滚动方式

第一种,光标到达屏幕边缘触发滚动。这是Emacs默认的滚动方式。

第二种,光标粘住某一行(stick the text line),直到该行离开屏幕,光标停留在屏幕边缘。

(global-set-key  [(meta down)] (lambda (&optional n) (interactive "p")
                              (scroll-up (or n 1))))

(global-set-key  [(meta up)] (lambda (&optional n) (interactive "p")
                              (scroll-down (or n 1))))

第三种,光标停留在屏幕上的某一行(stick the absolut line),无论怎么滚动,光标都不会移动。

;; scroll functions
(defun hold-line-scroll-up()
  "Scroll the page with the cursor in the same line"
  (interactive)
  ;; move the cursor also
  (let ((tmp (current-column)))
    (scroll-up 1)
    (line-move-to-column tmp)
    (forward-line 1)
    )
  )

(defun hold-line-scroll-down()
  "Scroll the page with the cursor in the same line"
  (interactive)
  ;; move the cursor also
  (let ((tmp (current-column)))
    (scroll-down 1)
    (line-move-to-column tmp)
    (forward-line -1)
    )
  )

(global-set-key (kbd "M-n") 'hold-line-scroll-up)
(global-set-key (kbd "M-p") 'hold-line-scroll-down)

这三种方式,第一种太简单了。第二、三种各有优缺点,所以绑定到不同的按键组合。

Wsizer: 用键盘控制窗口

Wsizer是一个我刚刚开发完成的软件。它拥有我很喜欢的一些功能。和DeskAngel一样,那些功能都来源于日常使用的积累。

作为第一版,它包含三个部分的功能。

第一个功能,最小化窗口到系统托盘区。这个功能同样也包含在DeskAngel中,但是Wsizer取消了让用户感到疑惑的预定义的列表。
操作也和DA中的一样简单,按下’Alt’键,然后最小化窗口,窗口就会从任务栏上消失,改为出现在系统托盘区。系统托盘区的图标是窗口的主图标。

第二个功能是显示窗口的大小和位置。当窗口在屏幕上移动的时候,Wsizer在该窗口的中间画出大小和位置信息。用户可以根据需要选择仅仅显示
大小、位置或是全部。通过该功能你可以观察到一些有趣的事情,比如在窗口最大化之后,窗口的左上角不是位于(0, 0)坐标。

最后的功能是热键功能。通过预定义的热键,用户可以对当前窗口进行更多方便快捷的操作。所有的热键都可以由用户自己更改
热键功能也可以分为三个部分:
1.) 改变窗口大小到预定义尺寸。比如Wsizer默认提过3个预先定义的尺寸640x480;720x480;800x600,用户就可以通过快捷键’win+[‘和’win+]’
轻松控制窗口的大小。当窗口宽度小于640,按一下’win+[‘,窗口之间扩大到720x480;再按,扩大到800x600……;如果按’win+]’,窗口将缩
小到定义的大小。

2.) 改变窗口宽度或高度。这个功能可以让用户单独控制窗口的宽度或是高度。预定于的快捷键为:
增加宽度:win+right
减少宽度:win+left
增加高度:win+down
减少高度:win+up

3.) 改变窗口位置。以上的功能仅仅只是对窗口尺寸的控制。通过Wsizer,用户还可以方便的移动窗口。手一会离开键盘去拿鼠标,一会又放下鼠标
去敲键盘是比较累人而且没有效率的。因为在用鼠标的时候不想按键盘,我在DeskAngel中加入了映射’Right Button + Left Button’到’Alt + Right
Button’的功能,方便控制取词软件;因为在用键盘的时候不想去按鼠标,我在Wsizer中加入了热键移动窗口的功能。预定义的快捷键为:
窗口往左移动:win+ctrl+left
窗口往右移动:win+ctrl+right
窗口往上移动:win+ctrl+up
窗口往下移动:win+ctrl+down

如果你喜欢上述的功能,现在就可以下载试用:http://wsizer.deskangel.com/download.html

任何问题都可以发送邮件或是访问论坛。

DeskAngel使用指南

DeskAngel使用指南
(括号中为菜单中的名字,该功能可通过菜单开启或关闭)

DeskAngel集成了很多有用的功能,是使用windows系统的人士日常

办公不可或缺的一款工具。下面将详细描述一些主要的功能。

1. 切换窗口永在最前状态(激活窗口最前功能)
对经常在电脑上编辑文件的人来说,这是非常有用的一个功能。比如你需要从多个文件中收集资料,并把它们汇总到一个最终文件。这时你可以把打开最终文件的窗口固定在最前面,这样无论切换到哪个窗口,你都可以看到最后的文件的样子,而且大大减少移动鼠标和按键盘的次数。

切换窗口永在最前状态是在窗口的标题栏上右键单击鼠标。如果原来的窗口状态不是永在最前,此时就会变成永在最前窗口;反之则还原。原来在标题栏上右击会弹出的菜单则被禁止,大部分人从来不会用到那个菜单。

2. 直接滚动文档
直接滚动文档主要是指滚动非激活窗口的文档。一般情况下,只有被激活的窗口才可以接收鼠标和键盘的输入。要滚动文档,必须先激活该文档所在的窗口,获得输入焦点,同时,原来的窗口则失去焦点,无法再接收输入信息。直接滚动文档功能超越了这个限制。你可以保留原来窗口的输入焦点,而滚动其他窗口的文档或页面。

比如你正在写一个文档,底下同时打开了一个文件作为你的参考。当需要滚动参考文档的时候,按照以前的步骤,需要:
a.) 先移动鼠标到需要滚动的窗口
b.)点一下激活该窗口
c.) 滚动文档
d.)把鼠标移回原窗口
e.)点一下激活
f.)输入
如果使用直接滚动功能,只要把鼠标放在需要滚动的窗口中,需要的时候滚一下滚轮就可以了。既没有用Alt+tab切换时的屏幕闪烁、顺序混乱,也不需要在聚精会神写文章的时候来回移动并点击鼠标。

3. 屏幕抓图(屏幕抓图至文件,屏幕抓图)
屏幕抓图,然后存到一个文件,这样的功能有很多软件已经实现了。但是DeskAngel提供了一个别的程序没有的功能,就是在把截图保存到文件之后,在剪切板中返回该文件的路径。这样有什么用呢?

来看一个情景。

比如你抓了一张图片,然后想把它贴到论坛上。普通的做法是,
a.) 点击论坛上的打开按钮,弹出打开文件对话框
b.) 在那里不停的点击,寻找那张图片所在的文件夹
c.) 因为文件名不太好认,需要预览,确认
d.) 最后,上传了。
如果用DeskAngel的话,只需要
a.) 打开对话框
b.) 在对话框的地址栏里右键或是Ctrl+V粘贴图片路径
c.) 然后上传即可。

有些论坛甚至不需要打开对话框,直接在编辑框里粘贴地址即可上传。

如果不选该功能,抓取的图片会存在剪切板上,也是比较好用的。

4. 模拟win键(模拟win键)
很多键盘,特别是一些笔记本,比如以前的thinkpad,都没有提供win键。虽然它们提供的一些随机软件也能模拟win键,但是功能太弱。

就拿thinkpad那说,随机软件可以把左alt模拟成win键,但是按下左alt之后只能弹出开始菜单而已,以win键为修饰键的一些快捷键全都不起作用。

有一些软件也能完全模拟win键,比如KeyTweak,但是每次改动之后都要重启系统才可以生效。

DeskAngel开启模拟win键的功能后,把win键指定到比较不常用的F6。如果以后要用到F6,可以在菜单中随时关闭模拟即可。

5. 最大化/还原窗口(中键功能)
很多人都不知道,鼠标的滚轮是可以和左右键一样单击的,它的功能是以前三键鼠标的中键。DeskAngel把单击滚轮设置为最大化/还原鼠标下的窗口。如果你不喜欢,或是用其他软件指定成别的功能,可以通过菜单关闭即可。

6. 自动滚动文档
这是另一个非常酷的功能。当你按下鼠标滚轮,如果不做滚动,直接放开,就是放大还原功能;如果保持按下,并往前或是往后滚动一下,文档就自动开始滚动;如果此时往同方向再滚动一次,文档将加速滚动;同方向滚动越多,加速越快。

当你觉得差不多了,不要马上放开滚轮按键,先按下右键并保持,滚动将会暂停。这时你可以仔细看一下是否是需要的内容。放开右键,继续滚动;放开滚轮,终止滚动。

7. 左右键模拟alt+右键(左右键->Alt+右键)
这个功能对经常使用翻译软件屏幕取词的人比较有用。大多数的翻译软件提供鼠标直接取词和按下键盘某键再点击鼠标取词。前者鼠标一动,取词窗口就弹出或是更新,既浪费系统资源,又影响阅读;后者当你靠着椅背阅读的时候,一手抓鼠标,一手还得抓键盘。DeskAngel提供的这个功能,可以解放你的一只手去抓饮料。

要使用该功能,先在翻译软件中设置屏幕取词快捷键为Alt+右键,然后在DeskAngel的菜单中启用该功能。之后,遇到不认识的单词,只需按下鼠标左键并保持,再按下鼠标右键即可。

8. 卷起窗口(卷起窗口至标题栏)
某些庞大复杂的软件会有这个功能,把窗口除标题栏之外隐藏起来。DeskAngel也能实现这个功能。只需要在标题栏上双击即可。要展开也是双击。原本双击标题栏最大化和还原的功能被屏蔽。因为你可以使用滚轮键。

9. 半透明窗口(透明窗口)
半透明化的窗口可以让你看到窗口下面的内容。激活该功能后,使用Ctrl+Alt+滚轮,即可调节窗口的透明度,非常方便。

10. 关闭显示器(关闭显示器)
笔记本上一般都有关闭显示器的快捷键,但是标准键盘上没有。有时候要趴在电脑前小睡一下,就可以用这个功能把显示器暂时关闭。要用显示器的时候,一动鼠标或键盘即可。

11. 获取窗口信息(获取窗口信息)
这是一个辅助功能,启用该功能后,右键单击任意窗口,在屏幕的左上方会显示该窗口的类名;根窗口的类名和当前是否是最前窗口。

要恢复右键功能,必须用左键单击DeskAngel图标,在弹出的菜单上先取消该功能,右键才会恢复。

12. 最小化窗口至系统通知区域(允许图标化指定窗口)
这个功能是需要自己编辑配置文档的。

打开settings.ini文件,找到[notifyicon],在list=后面加上程序的全路径,(逗号再加空格),然后是窗口的类名。

默认的设置提供了一些范例,可以照着修改。改错了也没有关系,只是不起作用而已。

也许以后作者或其他人会写一个工具来设置这个配置文件。

以上是一些比较常用的功能,还有比如输入的时候可以隐藏鼠标,先点击窗口下边框然后按左右边框可拖动窗口(为移动鼠标不方便的人士)等等。

配置文件settings.ini中也有很多可以微调的地方,比如设置屏幕抓图的格式(支持png, bmp, jpeg, tiff和gif),最小透明度等。

Wildcard search with source code (C language)

Using recursive procedure to deal with the wildcard search. It is too easy to comment.

#include
#include

//
// b_full means the whole string matching
//
bool WildSearch(char *psz_buf,
                      int n_buflen,
                      char *psz_sub,
                      int n_sublen,
                      bool b_full,
                      char sz_prechar)
{
    if (n_buflen == 0 && n_sublen != 0)
    {
        if (n_sublen == 1 && psz_sub[0] == '*')
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    else if (n_buflen != 0 && n_sublen == 0)
    {
        if (b_full)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    else if (n_buflen == 0 && n_sublen == 0)
    {
        return true;
    }

    if (psz_sub[0] == '*')
    {
        psz_sub++;
        n_sublen--;
        if (n_sublen == 0)
        {
            return true;
        }
        return WildSearch(psz_buf, n_buflen, psz_sub, n_sublen, b_full, '*');
    }
    else if (psz_sub[0] == '?')
    {
        psz_buf++;
        n_buflen--;
        psz_sub++;
        n_sublen--;
        return WildSearch(psz_buf, n_buflen, psz_sub, n_sublen, b_full, '?');
    }
    else
    {
        char *psz_star_pos = strchr(psz_sub, '*');
        char *psz_question_pos = strchr(psz_sub, '?');
        int n_len_to_star = (psz_star_pos == NULL) ? (int)strlen(psz_sub) : (int)(psz_star_pos - psz_sub);
        int n_len_to_question = (psz_question_pos == NULL) ? (int)strlen(psz_sub) : (int)(psz_question_pos - psz_sub);

        int n_compare_len = n_len_to_question > n_len_to_star ? n_len_to_star : n_len_to_question;
        if (_strnicmp(psz_buf, psz_sub, n_compare_len) == 0)
        //if (psz_buf[0] == psz_sub[0])
        {
            sz_prechar = psz_sub[0];
            psz_buf++;
            n_buflen--;
            psz_sub++;
            n_sublen--;
            return WildSearch(psz_buf, n_buflen, psz_sub, n_sublen, b_full, sz_prechar);
        }
        else
        {
            if (sz_prechar != '*')
            {
                return false;
            }
            psz_buf++;
            n_buflen--;
            return WildSearch(psz_buf, n_buflen, psz_sub, n_sublen, b_full, sz_prechar);
        }
    }
    return true;
}

int main(int argc, char** argv)
{
    char sz_buf[] = "abcdefghijk";
    char sz_sub[] = "abc?e*fg?i?*k*";
    //char sz_sub[] = "ae";

    bool b_result = WildSearch(sz_buf, (int)strlen(sz_buf), sz_sub, (int)strlen(sz_sub), false, ' ');

    printf("%d\n", b_result);

    return 0;
}

DeskAngel, why I develop it

DeskAngel is a desktop enhancement tool for windows operation system. In order to arrange my daily work and make the windows more fashion. I started to develop it on year 2002, under windows 2000 pro. It went through windows 2000, windows xp and now arrived at windows vista. Some features are dropped in the journey, but more are added.

Under windows 2K, ‘connect to remote pc’ is one of my favorites. Because in our office, we should access data share pc, our assistant’s pc, my colleagues’ pc and etc. Sometimes we must delete the previous connection in order to fire a new connection request. It helped me much. But windows xp comes and, it can remember network accounts and passwords, the feature became outdated.

Then, I have my first notebook, IBM thinkpad r40e. It has a full-size keyboard, but is lack of win key. I used to lock my system by ‘win+l’ hotkey when I left and won’t like to change it. IBM do provided a tool to map alt or control to win key, but the mapped key only pop up start menu. It could not be used as a modifier key. I also tried some other keymap tools, some of them can do the job, but they all need to restart the windows after mapped. So, I implemented the feature myself. I’m a programmer, huh!

Nowadays, my most loves are: ‘set window top most’, ‘maximize/restore by middle click’, ‘inactive document scroll’, ‘left+right->alt+right’ and ‘screen clipping’. ‘turn off monitor’ and ‘auto scroll’ are also very useful when I’m working on a desktop pc. Now, things become common and usual. Says, if you never knew it, never had it, and never used it, life won’t be different, but once you have it, you couldn’t live without it. DeskAngel is such a tool.

Besides the features that make daily works easy, DeskAngel also offers some functions which make windows look a little cool and fashion. In the age of windows 2k, DeakAngel can make the text background of icons on desktop transparent, just like other softwares do. Windows xp can transparent it by itself, so that is another feature which was dropped by time. But that is not the only effect that DA can do.

The operation system of windows 2k and laters provide a way to create a translucent window, DA can do it for every windows alread created on desktop. Linux can display only the title of a window, DA can do it. Linux display a cross-arrow cursor when you are moving a window, DA can do it. Windows 7 displays only icons on taskbar, DA can do it. Windows 7 can snap a window to the edges of screen, DA can do it too. :-) And one of the users want to hide the cursor when he is typing in non-microsoft applications, now it’s available.

Until Now, DeskAngel has about 20 features and most of them can be disabled if you don’t like it. DA is totally free, and portable, without any advertisement, backdoor or something like that. After started, you can find it on the system notification area, aka system tray. It is running in background, silently. If you don’t like it, double click the icon to exit. If you like it, signle click or right click it and select ‘start with windows’.

As it is a tool that I also use day by day, bugs will be fixed immediately and new features will be added quickly if they are useful, sometimes it will be updated frequently. No matter how many features will be added, small, simple and fast are the most important things I have considered.

Feel free to download it and have a try. Any kind of feedback are welcome.