Table of Contents

簡介

Vim-Fanfou = VIM + Fanfou.

如同 Fanfoun 是 Twitter 的山寨, vim-fanfou 也只是我对 TwitVim 一次初級山寨。

代码

安装、使用

安装

  • 确认 Vim (7+) 和 Python 2.7(+) ,被 VIM 支持。
  • 复制 plugin 目录到对应的 Vim plugin 目录。

使用

  • Proxy 设置
    • 如果需要把 http proxy 设置加到 vimrc 里。比如:

      let g:fanfou_http_proxy = "http://<proxy-host>:<proxy-port>"
      
  • Login
    • Login 的过程就是一次 OAuth 的认证过程,使用 :FanfouSetAccount 进行登录。过程中会打开默认浏览器,进行授权。得到 PIN code 后。把他输入到 VIM 裡就完成了。 NOTE: 默认情况下 OAuth 的 Token 最终会被保存于文件 $HOME/.fanfou_auth_cache 中。
  • 输出的 Vim commands:
    • FanfouSetAccount - 用来设置 OAuth 认证 。
    • FanfouSwitchAccount - 用来切换到另一个 account。
    • FanfouHomeTimeline - 显示 Fanfou Timeline 到 Vim buffer。
    • FanfouRefresh - 刷新 Fanfou Vim Buffer。
    • FanfouPostStatus - 发送一条新的状态到 Fanfou。
    • FanfouMentions - 显示 Fanfou Mentions timeline 到 Vim buffer。
    • FanfouFavorites - 显示 Fanfou Favorites timeline 到 Vim buffer。

目前的 TODO List

目前的版本没能支持的:

  • Syntax:
    • 中文标点的问题,目前没有解决。目前匹配 @user 时用的是 /\w\@<!@\(\w\|\.\|[^\x00-\x7f]\)\+/ 会导连续的中文标点之类被归入 user name。 (可以通过 unicode 中 CJK 的标点范围来排除,目前没实现)
  • Network:
    • HTTP Proxy authorization 没有支持 ( 目前可以用没有 authorization 的 http proxy )
  • 使用方面:
    • 支持"转发"&"回复"功能.
    • 支持大于 60 条的 home timeline
    • 支持 Web browser 种类设定 ( 目前只能是当前 OS default browser )
    • 支持直接从 VIM buffer 打开一个 url
  • 开发流程上:
    • 增加更多的 Python unit tests

涉及的知识

主要使用了 Python, Vim Script 涉及到了 HTTP, OAuth, Fanfou API 和 VIM 的一些基本知识。

代码结构

  • source tree ( master branch )

    ~vim-fanfou/
    |~doc/
    | `-vim-fanfou.txt
    |~plugin/
    | |~vim_fanfou/
    | | |-__init__.py
    | | |-fanfou.py
    | | |-fanfou_base.py
    | | |-fanfou_data.py
    | | |-fanfou_oauth.py
    | | |-fanfou_oauth_base.py
    | | |-misc.py
    | | |-misc_unittest.py
    | | |-pylintrc
    | | |-vim_fanfou.py
    | | |-vim_fanfou_base.py
    | | |-vim_fanfou_unittest.py
    | | `-vim_util.py
    | `-vim_fanfou.vim
    |-CHANGES.md
    `-README.md
    
  • Documentation & utility
    • vim-fanfou/README.md - 为 Github 写的一份 readme。
    • vim-fanfou/CHANGES.md - Release notes。
    • vim-fanfou/doc - 为 vim 写的 readme。
    • vim_fanfou/plugin/vim_fanfou/pylintrc - pylint 的配置文件, disable 掉部分过于严格的检查。
  • VIM interfaces
    • vim_fanfou/vim_fanfou.vim - 用于连接 VIM 和 之后的 Python modules。主要作用:
      • 检查运行环境 (VIM & Python version),并加载 vim_fanfou/plugin/vim_fanfou 中的 Python module。
      • 读取用户配置 (如: g:fanfou_http_proxy ) 并创建 VimFanfou python object。参见该文件中的: "s:init()"
      • 输出对应的 commands
  • Python module
    • Fanfou OAuth
      • fanfou_oauth_base.py & fanfou_oauth.py
        • Fanfou OAuth 的实现,网络操作用了 Python urllib2。还使用了部分 Python modules (如: hmac, hashlib, random 等) 目的是为了 OAuth 中的 signature。
        • 其中 fanfou_oauth_base 是 OAuth 的逻辑和算法。 fanfou_oauth 是最终 interface 和一些相关的配置管理(如: API Urls; consumer key 等)
    • Fanfou API Wrapper
      • fanfou_base.py & fanfou.py 对 Fanfou API 的封装。 fanfou_base.py 用于实现基本逻辑。 fanfou.py 用于定义接口和管理配置。
    • Misc
      • misc.py - 工具函数和 Log 机制的实现。
    • Vim utility
      • 对 vim python module 的简单封装,更方便的使用 python vim module。
    • Vim Fanfou
      • vim_fanfou.py python module 于 vim_fanfou.vim 的接口实现。
      • fanfou_data.py 输出 FanfouData object。Fanfou API 的结果,都更新在这个 FanfouData Object 里。 vim_fanfou.py 再从这个 Object 里取出数据,刷新 Vim Buffer。
      • vim_fanfou_base.py 实现了 python vim module 的逻辑,如: 管理 Fanfou Vim buffer; 输出 Fanfou API 结果等。
    • Unit tests
      • vim_fanfou_unittest.py 输出 vim_fanfou_tests() 这是所有 unit tests 的执行入口。因为代码中用了 Vim 的 python module 导致 unit test 需要在 Vim process 中执行。所以输出改方法在由 vim_fanfou.vim 中的 VimFanfouTests() 方法调用所有的 unit tests。
      • misc_unittest.py - unit test for vim_fanfou/misc.py

Project page

Project page 是以 github pages 为 host 建立的 static web site。使用 Grunt + Bower + Pandoc 为工具,把对应的 .md 文件生成对应的 Static web site。目前这个 static web site 的 url : http://xiongjia.github.io/vim-fanfou/

  • souce tree ( gh-pages branch )

    ~vim-fanfou/
     |~_config/
     | |-html_home.tpl
     | |-vim_fanfou.css
     | `-vim_fanfou.js
     |+assets/
     |-_config.yml
     |-bower.json
     |-Gruntfile.js
     |-index.html
     |-index.md
     |-package.json
     `-README.md
    
  • Usage:
    • 安装 npm package 和 bower packages:
      • npm install
      • bower install
    • 更新 assets 和所有 content ( 只有当修改了 Template 后才需要这么做)
      • grunt initPack
    • 更新 Content
      • grunt pack or grunt
    • local test server ; 启动本地测试 Server 到 http://localhost:9001
      • grunt serv (该 Task 会自动监视 .md 文件, .md 文件修改后会自动更新到 对应的 site 文件,只需要刷新浏览器就可以看到改动)
  • Scripts & assets
    • "config" 目录 - 用于存放 Pandoc 的 Template 以及 Template 中用到的脚本。
    • "assets" 目录 - static site 的 js, css, font 以及 image。只有 image 需要自己管理,其他文件由 grunt initPack 生成。
    • Gruntfile.js - grunt 脚本
    • bower.json - bower 配置
    • package.json - npm 配置
    • _config.yml - site configuration 在 Gruntfile.js 会读取这个配置。
  • Content
    • index.md - 对应 index.html。 基本是标准的 md 语法,部分 Syntax highlighting 的表示符合可能不一样,具体需要参考 Pandoc 的文档。
  • misc
    • README.md - 为 github 写的 readme。

问题和解决方式

  • Lazy Initialization
    • 由于主要逻辑都用 Python 写,Vim 在使用 Plugin 的时候可能需要动态加载 Python core。这个可能造成 Vim 额外负担。
    • 目前的解决方式: 爲了减少这一个负担, vim-fanfou 只在需要时才加载 python modules。参考, vim_fanfou/plugin/vim_fanfou.vim 中的 "s:init()" function。
  • 字符集问题
    • 由于 VIM 输入是 UTF8 形式,如涉及中文字符将会导致在 Python 中不能正确计算 string length。
    • 目前的解决方式: 相关的计算使用 vim_fanfou.misc.mbstrlen() ,此方法会对 string 做 utf8 decode 随后再计算长度。
  • HTML String 转换
    • 从 Fanfou API 中输出的结果字符可能是 HTML 编码,比如 "<" = "&lt;" , ">" = "&gt;" 。
    • 在输出到 Vim buffer 是需要做一次转换。参考: vim_fanfou.misc.MsgStrConv.FromHTMLStr() 方法。