簡介
如同 Fanfoun 是 Twitter 的山寨, vim-fanfou 也只是我对 TwitVim 一次初級山寨。
代码
- github repository: https://github.com/xiongjia/vim-fanfou
- 在 VIM.org 上: http://www.vim.org/scripts/script.php?script_id=4972
- Releases: https://github.com/xiongjia/vim-fanfou/releases
- Project Page: http://xiongjia.github.io/vim-fanfou/
安装、使用
安装
- 确认 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
中。
- Login 的过程就是一次 OAuth 的认证过程,使用
- 输出的 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 的标点范围来排除,目前没实现)
- 中文标点的问题,目前没有解决。目前匹配 @user 时用的是
- 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 的一些基本知识。
- Python 与 Vim 的交互
- Vim 通过输出一个 Python module 的方式来达到与 Python 交互的目的。主要可以参考 VIM Documentation
:help if_pyth
- 我的 gist 中有个简单的、基本的 Python 与 VIM 交互的 Sample, 参考: https://gist.github.com/xiongjia/64e1353afb9415e85479
- Vim 通过输出一个 Python module 的方式来达到与 Python 交互的目的。主要可以参考 VIM Documentation
- Fanfou API
- 主要参考 Fanfou API 的 Wiki: https://github.com/FanfouAPI/FanFouAPIDoc
- 我的 gist 中有我以前用纯 Python 实现的一份试验性 Fanfou client, 参考: https://gist.github.com/xiongjia/b8893dc5eb5bbb04cfbc (注:这份我早先的实现存在诸多 bugs)
代码结构
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
- 检查运行环境 (VIM & Python version),并加载
- 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 forvim_fanfou/misc.py
- Fanfou OAuth
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
orgrunt
- local test server ; 启动本地测试 Server 到 http://localhost:9001
grunt serv
(该 Task 会自动监视 .md 文件, .md 文件修改后会自动更新到 对应的 site 文件,只需要刷新浏览器就可以看到改动)
- 安装 npm package 和 bower packages:
- 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 编码,比如 "<" = "<" , ">" = ">" 。
- 在输出到 Vim buffer 是需要做一次转换。参考:
vim_fanfou.misc.MsgStrConv.FromHTMLStr()
方法。