2013年7月31日星期三

VIM 编辑器的改造一

Vim 编辑器的改造一

   市场上众多IDE,简单可以分类概况一下:

   重量级:VS , eclipse ,Netbeans,IntelliJ  等

   中量级:subtext,subline,ultraEdit 等   

   轻量级:notepad等


   神级:VIM / Emacs

(神级也称SB及,有很多人嘲笑黑屏时代原始社会的IDE,个人认为这是癖好问题,至于选择不选择使用这个编辑器依然是自己爱好的事情,据说微软内部人员只用两种编辑器VIM、Emacs, linux之父用的是 emacs的一个小变种等等。关于Vim和Emacs 之争,编辑器之神,神的编辑器,直道现在还未了解。在这里不做叙述,我只表明自己的态度,自己试过emacs,vim,选择了后者。)


   vim 强大在于可扩展性性,使得编辑效率极大的提升,用户可以完全抛弃鼠标,专注于屏幕,强大高效的完成代码的编辑工作。

   用户关系的更多的是Vim的配置,开源的好处就是可以各取所需找到自己想要的东西,当然完全符合自己胃口的东西又是非常难找的。因为网上推荐的很多,同一个功能或许有很多不同但优秀的插件。你不知道哪一个最好,就得一个一个的去实验,发现其中的优劣。然而这个圈子是小众,不可能有大的优胜劣汰,功能性能的插件需要一段时间才能被大家抛弃,优胜劣汰的优势不明显,开源允许各种差异的存在。

 The import thing is u choice !     痛苦就是在于选择的过程。有的插件做的好,学习成本就很小,bug非常小。在这个博文并不是让用户复制联贴我的vimrc的插件,而且向大家推荐好的东西,比较不好的东西。


  首先推荐几个我自己认为写的比较好的blog
  
  1. 子龙山人: http://zilongshanren.com/blog/2013/01/15/vim-the-killer/

  2. vimer: http://www.vimer.cn/

  3. vim 官网 : http://www.vim.org

 下面的内容是自己这几天的总结,里面有自己的喜好,还有对与一些内容的补充。

 插件1:vim 插件管理者   vundle 替换 pathogen

 好处: 1.vundle 在vimrc配置简单
     
        2.vundle可以更新插件,这个功能是重点。

我在这里不叙述了,有人写的比我好,自己看吧,怎么配置怎么用。

blog: http://williamherry.com/blog/2012/07/16/master-vim-01-vundle/

 插件2: vim-airline 替代  powerline  


看着是不是很给力,笔者在用的过程之中遇到了几个问题:

1. 有的时候启动失败,不显示。有的是用户的问题 在linux环境之中 sudo 才显示,有的时候不是这个问题

2. 卡顿现象,时不时出现卡顿反映奇慢的事情。


作者的解释如下:
There's already powerline, why yet another statusline?
  • 100% vimscript; no python needed.
  • small. i want the core plugin to be less than 200 lines as a rule (specifically adhering to the open/closed principle).
  • integrates with a variety of plugins: vim-bufferlinefugitiveunitectrlpminibufexplgundoundotree,nerdtreetagbarsyntastic and lawrencium.
  • looks good with regular fonts and provides configuration points so you can use unicode or powerline symbols.
  • fast to load, taking roughly 1ms. by comparison, powerline needs 60ms on the same machine.
  • fully customizable; if you know a little statusline syntax you can tweak it to your needs.
  • trivial to write colorschemes; for a minimal theme you need to edit 9 lines of colors (please send pull requests).
What about old powerline?
  • the old version still works well, but since it's deprecated new features won't get added.
  • it uses different font codes, which makes it incompatible with other powerline bindings in the same terminal (e.g. bash, zsh, tmux, etc.).
大概的意思就是:用的是vim脚本写的更快,比powerline更NB, 因为我自己比较懒,不想再重新弄了,但是我还是推荐 vim-airline这个新生代。

插件3. 文件浏览插件 NerdTree 和 Ctrlp  

  笔者强烈建议安装 Ctrlp,快捷键 Ctrl + P 


左侧是Nerd 下面是Ctrlp 搜索文件非常方便,在搜索文件时候不一定是全拼文件
如:\wwwroot\china\beijing  可以wwwchbei  就搜索到了

注意: 三个窗口的切换快捷键:Ctrl + W 两次 ,切换到的那一个窗口下面的line颜色条会变化,仔细看一看你自己在的窗口颜色条 ,退出直接 : q 

NerdTree 我一般都不怎么用,把它放到左侧,显示文件目录结构,打开文件一般用CtrlP,时间久了对CtrlP更加依赖


插件4. TagBar插件 显示文件的变量名,以及函数名称,即eclipse的outline

笔者设置了快捷键 F4 呼出,非常方便


在vimrc中的设置

nmap <silent> <F4> :TagbarToggle<CR>

let g:tagbar_ctags_bin = 'ctags'

let g:tagbar_width = 30

全局搜索设置: 

 一直在找全局的搜索设置,很多博文都没有说明白怎么弄,都给力一堆设置,或者copy别人的。用过eclipse就知道它的全局搜索非常厉害。在这个方面,有人用ctags,有人用scope等等

ctags是在项目中生成tags文件,详细记录了类的变量等等,但是有一个问题就是,在用户编辑状态反复生成ctags比较麻烦,好在有人用开源了解决方案,我也觉得比较繁琐。后来经过查找,vim自带的就有全局搜索名为:vimgrep

注意: grep是linux命令 vimgrep是vim命令

语法: vimgrep XXX path  如: vimgrep  def *.py /搜索函数的定义字符



(最下面的小萝莉:Quickfix里面就是内容)如果用户在vimrc里面不设置,搜索结果则覆盖全屏幕,这时候 :cw 一下 把结果放到 Quickfix Window 

语法: cw 把结果放到 Quickfix Window 
     
       cclose 关闭

       cn 下一个


       cp 上一个


笔者稍微参考网上改进了一下,搜索结果以下窗口显示  F5 命令搜索, F6上一个  F7下一个

nnoremap <F5> :vimgrep /word/ **/*.py \| cw

nnoremap <F6> :cp <CR>

nnoremap <F7> :cn <CR>

保存一下,退出vimrc 自己试验一下 F5,更改word内容试一试




以下插件可以参考子龙山人的配置,自己不做阐述只列出必要的插件

插件5:Vim-Surround  强烈推荐极大效率插件

 作用:hello world 加上双引号 ysiw "  即快速又给力非常方便,它的用法参加github上面的说明,这个插件强烈推荐大家使用


插件6:UltiSnips 效率插件,不解释,看视频


插件7:自动补全插件 neocomplcache-clang:解决clang_complete和neocomplcache的冲突

插件8:supertab 


今天就写到这里,下一篇我将阐述vim tab 窗口,窗口分割,调试等等内容,抛砖引玉,希望您的神配置。







2013年7月26日星期五

django tutorial 笔记1

初学django框架,最好就是从djangoproject 网站按照tutorial 一步一步做 https://docs.djangoproject.com
现在不做过多阐述,只对于tutorial学习前三个向导做一下补充,也是自己做的时候的一些错误记录
在tutorial 1 中 (https://docs.djangoproject.com/en/1.5/intro/tutorial01/),对于教程有几点补充的部分


(1)如何终止 runserver ?

例子中如下命令启动runserver
python manage.py runserver




 看terminal中写道终止Server 是快捷键 Ctrl + C ,我按了例子去做,大多数情况是终止不了的,这个只是终端终止某些命令的操作,实际操作并不适用。那么是不是已经终止了呢?我们再运行一下试试!

显示端口被占用,说明刚才那个server,并未终止,在浏览器上运行网址,有可能正常显示,也有可能需要很长时间加载,一直加载未反应。
解决办法:
  1. 换用新的端口运行、
python manage.py runserver 8001
   这个方法确实可行,但是在程序过程中有时候需要重启server,频繁的换端口,看起来并不好。
  2. 结束进程

  找到端口的进程,并且结束它

  linux 命令 : ps -aux|grep 8000 这个命令搜索8000端口的进程,或者搜索manage这个命令 ps -aux|grep manage
 

在这里面可以看到机器运行的诸多含有 manage 的命令所占的进程,主要查看
 python manage.py runserver 所占的进程,看图中有4个 实际上我只运行了两次,每次运行这条命令实际是调用 /user/bin/python 的 所以只需要结束 这个所占用的进程编号就可以了

注意:直接kill pid 可能结束不了,带上 -9 强制结束进程, kill -9 pid 这样你的runserver 就被kill了。


(2) __unicode__ 函数有毛用?()



 在看着教程之中一直不知道 __unicode__ 有什么用,官方解释是说

 还是没有给出实际的例子说明白,unicode 究竟是干嘛的,在java里面 对于网络传输的数据都进行unicode编码,在这个里面看起来有点多此一举的样子。于是我就实验了一下

\
在程序输出的时候

__unicode__ 方法 相当于toString

在程序直接输出 Poll 一个对象的时候,显示的是这个,如果按照原来教程的例子,显示的是对象的一个属性,大概 __unicode__ 就像是java 对象中的toString 方法,在java里面直接打印一个对象如果你事先没有复写toString 方法打印的是对象的时间物理地址,这个在java调试的过程之中可以测试。

(3) django模板,url调用过程

   1. url的调用
 
    第一步,在这个例子之中,先检索 mysite 的 url.py 的模板目录匹配,也就是先匹配更目录,polls/admin 即mvc 中的model部分






   第二部,更加用户访问的模块,匹配相应模块的 url.py部分。如:访问polls/1 则在polls/url.py中配置

这个有较大的自由度,用户可以更加自己的意愿分别对url进行相应的配置,只要符合规则,任意的url均可以访问,这个对比 php的 zend framework 和 C# (不知4.0怎样)自由度比较
大,就拿zend 吐槽一下吧。
看zend 的配置吧,虽然灵活度比较高 在模块的 config里面,看看它的配置



想屎吧,对于轻量级的php网站来说,zend framework 但从url分派上面,就恶心人,看见实例的array array array 嵌套,这种嵌套还算是最简单的嵌套。我想 zend framework 3 今后可能简化这个复杂的操作,最后一切都要归为最简单。

在此有一个小疑问:Poll_id 有什么用?










解释是,用户看的是正则表达式,实际上django调用了 detail函数 传递的是 poll_id

 查看view.py 正好也验证了这个说法,







这些函数返回给视图的就是两个参数 httpResonse poll_id


参数name 有什么用?

自己试验了一下,即使不传递name,也正常工作,就行html有的标签的别名一样

上述的两个参数看似都没有用,当你在看到 tutorial 03 时候,有一个模板上面的 函数让我迷糊不解


教程的意思说的是,在模板里面直接使用 /polls/ 耦合度太高,如果这个url 很多,或者发生变动就不好了,意思大概是解耦,最好不要用这种做法。 提倡的是用 {% url %}取而代之。在这里面没有详细说明模板里面的url的作用。
自己测试了一下 这个里面的 url 大概就是 reverse的意思.需要注意的是, 'detail' 这个不是函数名称,而是最初 url.py的 name, 之前如果没有设置name,在这里面是不行的。第三个参数 poll.id 就是最初里面的 <poll_id> 这个函数的结果返回的是, 返回details 的url ,reverse 一下,可以自己测试一下 {% url 'detail' poll.id %}
/polls/1/details/

 (2)模板的调用也大致相同,也是先调用 mysite 目录的templates文件的模板,然后分发调用子模块的模板,这个很容易理解。

(3)参数传递





在程序返回给视图,传递的参数需要时字典,直接传递参数 poll_list列表是不可以的。可以自己试试

(4)调试,log输出

自己在测试的时候,发现print 除了模板页显示,其它部分不显示,后来发现可以在terminal 看到


而且 terminal里面的信息,有时候比浏览器的信息更加准确看到出错的位置。对于loging 应该有比较给力调试方式,今后再列出



对于教程就先写到这里。这是看完前三个,记录的一些小问题。