3
10
2017
9

在 Vim 8 里用 git subrepo 安装 vim-go

我一直没有使用 Vim 插件管理插件。我没数过,但是三四个实现肯定是有的。我不喜欢它们的原因,一是迁移成本,二是依赖太巨大:我在一个新环境上配置 Vim 时,我不希望必须访问 GitHub,而且是几十个 clone,这得多慢啊……而且这还意味着它需要有 git,能够联网,DNS 解析正常,等等。这些在各种奇怪的环境里都不容易实现啊。

后来,Vim 8 出来了,内建 packages 管理功能。不愧是官方出品,没有奇怪的依赖。插件来源用户随意,把文件放对位置就可以了。

然后,我又遇见了 git-subrepo,给了 submodule 以外的选择。简单来说它有点 vendoring 的感觉,把第三方仓库放自己里边了。如果目标没有安装 git-subrepo,也没有关系,所有文件都在这儿了,只是没有与第三方仓库同步的能力了而已。

而且,git-subrepo 和 git-notes 类似,它使用额外的 ref 来存储第三方仓库的数据。但与 notes 不同的是,subrepo 已经存在于第三方仓库了,所以我不必把 subrepo 的 ref 推得到处都是,还在每个地方 fetch 下来浪费空间。万一第三方仓库没了或者搬家了,关系也不大,反正我用的代码还在我的仓库里呀。

git-subrepo 是很棒的「pay as you go」设计呢。

有了这两个东西,我就可以尝试一下新的 Vim 插件管理方案了。刚好我需要安装 vim-go,所以就开始尝试啦~

于是开始安装:

cd ~/.vim
git subrepo clone git@github.com:fatih/vim-go.git pack/go/start/vim-go

Vim 8 会自动加载pack/*/start/*下的东西(它下边的目录跟原来的 ~/.vim 布局和用法一样),:packadd命令会加载pack/*/opt/*下的东西。

然后记得设置环境变量。首先是 GOPATH,这是放所有 Go 的源码和编译出来的库和二进制文件的地方。Go 1.8 开始默认 ~/go,但是也需要设置 GOPATH,不然 vim-go 不认。然后得把 $GOPATH/bin 加到 PATH 里去。

确认环境变量设置好之后,打开一个新的 Vim,执行:GoInstallBinaries命令安装依赖。如果中途有神秘失败的,可以把地址拷出来,在命令行里手动调用 go install xxx 安装。部分软件需要访问 Google 的服务器,国内用户注意自行配置一下国际互联网的访问。

安装好之后就有补全、自动格式化、自动加 imports、重命名什么的啦。具体看 vim-go 的文档吧。不过有几点我稍微调整了一下。

我使用 syntastic 来进行代码检查。它默认不启用针对 Go 的检查,需要配置一下:

let g:syntastic_go_checkers = ['go', 'golint']

syntastic 的显示效果比 :GoMetaLinter 命令使用 quickfix 窗口的要好很多哦。

另外不要使用 :GoLint 这个命令,它连非常简单的未定义变量都检查不出来。

而且 vim-go 好 chatty,连跳转到定义都要用显眼的颜色来报告一下成功了……安静真的很珍贵的说。

:GoDoc 我还不会用,因为它报错了:

vim-go: gogetdoc: couldn't get package for .../t.go: can't find package containing .../t.go^@

写 Go 的时候,特别是调试的时候,加句fmt.Printf得记得修改 import,不需要了还得再去删掉才能通过编译……Go 编译是快了,但是处理未使用变量比等待编译结束更令人心烦啊。

有了 goimports 这个命令之后,不需要在开发过程中反复手动修改导入的包列表了。它可以自动添加和删除 import。不过 vim-go 并没有提供在保存时自动调用的支持,所以我就自己动手了。

首先禁用掉它自己的自动格式化:

let g:go_fmt_autosave = 0

然后,是我自己设置的自动命令:

if !exists('#GoImports') && executable("goimports")
  augroup GoImports
    au!
    autocmd BufWrite *.go silent call s:GoImports()
  augroup END
endif

function! s:GoImports()
  let pos = getpos('.')
  let na = line('$')
  %!goimports
  if v:shell_error
    undo
  endif
  let nb = line('$')
  let pos[1] = pos[1] + nb - na
  call setpos('.', pos)
endfunction

还有待提高(比如 undo 的处理),但至少能用。

Category: Vim | Tags: vim go Git
11
16
2015
23

[译] Vim 的蔓延

译自 Vim Creep。原文为英文,有很棒的朗读版。


开始的时候,一切都很平常。在初入大学的那一年,你试过它一两次,但是 Nano 和 Pico 更加简单——更像你高中时候在 Windows 和 Mac 机器上已经用过的东西。但随着时间的推移,你在大学的计算机科学课程上经历渐渐丰富,你开始注意到一件事:所有真正厉害的程序员——你花了十页代码的作业,他们随便写了四行就解决了;你艰苦奋斗了几个星期才勉强完成的课程项目,他们竟然在一天之内就超额完成了——他们都不用 Nano 或者 Pico。

一天夜里,为了完成一项午夜就要交付的作业,你正熬夜赶工。偶然间越过一位安静的超级程序员的肩膀,你瞟到了他的屏幕。你的眼睛在已经昏暗的计算机实验室里一排排的显示器中闪烁着,满怀敬畏地见证着代码和文字以不可能的方式闪过屏幕。

你疑惑地问:「你是怎么做到的?」

一个简洁的词从他口中吐出,永远地改变了你的生活:「Vim。」

一开始你很沮丧,更不谈工作成效了。你的浏览器历史里满是 Vim 在线文档的记录;你那些使用 Nano 和 Pico 的朋友认为你疯了;用 Emacs 的朋友央求你改变心意;为了查阅方便,你甚至花钱买了一份 Vim 速查表的纸板。经过了数星期的刻苦训练,你还是习惯性地去拿鼠标,然后又停下,意识到你得去网上学习一下完成一些常见的任务的正确方法。你以前可从来没有想过这个。

随着时间的流逝,你挣扎的次数越来越少了。你不太明白发生了什么,但是 Vim 不再阻碍你了。它的好超过了你的预期。它不再仅仅是一个使用键盘快捷键的文本编辑器——它成为了你身体的一部分。不,它成为了作为一名程序员的你的一部分本能。

只用 Vim 来编辑源码似乎大材小用了。你在你家里的所有机器上都安装了 Vim。你用它来输入一切文字,从电子邮件到学术论文。为了能够随身携带,你往U盘里安装了一个移动版的 Vim,并配有精心调整的个性化的 .vimrc 文件。这样,它陪伴着你,使你心安,让你不论在哪里都有一点家的感觉。

Vim 进入了你网上生活的每一部分。不满足于功能贫乏的 ViewSourceWith,你很快学会了 Vimperator,然后又换成 Pentadactyl。你以前只是在互联网上冲浪,而现在,你就是互联网。当你要写一个 iPhone 应用程序的时候,你做的第一件事情是把 XCode 的默认编辑器换成 MacVim。当你的工作是写 .NET 代码,你立即购买了一份 ViEmu for Visual Studio,因为你对免费的替代品——VsVim——的功能并不满意。

一天夜里,你正在你的工位上埋头苦干,完成一个第二天上午就要到期的项目。你对你自己笑了。普通程序员可绝不能在期限之前完成这样的工作。你录制各种宏;你轻轻地敲动手指,移动着整块整块的代码;你用上了一大堆寄存器;你重写着重构着整个组件,却根本不瞅一眼鼠标。你注意到显示器上映出的影像。一位同事正在你身后睁大了眼睛看着。你微微停顿了一下,让他知道你注意到了他的存在。

「你是怎么做到的?」他问道,语气里充满了敬畏。

你微笑了一下,准备说出那个改变了你的一生的词。那个词,如果你的同事也选择追随的话,他会掉进同样的兔子洞,进入一个充满无限可能的无限组合的世界,那些组合产生出他之前只能在最疯狂的梦中见到的极致高效。他让你记起多年以前那个昏暗的计算机实验室里的自己。带着些许兴奋,你轻轻地说出那个词。

「Vim。」

:wq


翻译比阅读难多了喵 0.0

Category: Vim | Tags: vim 文学 译作
4
16
2014
62

Sublime Text 能做的,Vim 都能做到吗?

前两天突发奇想,想知道现在越来越流行的 Sublime Text 除了易于上手外,和 Vim 相比还有哪些独到的特性呢?

于是我在 SegmentFault 上提出了这么一个问题,最终的答案整理如下。括号中是项目数,由很简单的 Vim 命令统计或者目测完成。

Sublime Text 能做的,Vim 在不做任何配置、或仅作极少量的配置也能做到的(16):

ST: 随时保留文件的修改 / 自动保存。
Vim:
  1. 当意外退出时,默认在最后四秒内的最多200字符可能会丢失。这两个数值都是可以配置的。
  2. 设置 'autowriteall',在需要保存文件时会自动保存文件。
ST: 按 HTML 标签选择。
Vim: vit, vat, v2it 等。各种文本对象。
ST: CSS 的属性名称自动完成。
Vim: CSS 属性名称和值的智能补全。
ST: 会话保持。
Vim: :mksession 以及 :source。当然很容易配置成自动化的。
ST: 跨平台。
Vim: 把 ST 支持平台数平方一下。
ST: 变身:Vim 模式。
Vim: 变身:简易模式。
ST: 多文件搜索。
Vim: :vimgrep 命令。还有 grep.vimag.vim
ST: 在跳转框内使用 : 到达指定行。
Vim: 行号+G 或者 :行号(并回车)。
ST: 并列显示多个文件。
Vim: 不仅支持各种布局的多窗口,还支持多标签页。
ST: 界面干净。
Vim: guioptions 想去掉什么就去掉什么。
ST: 简易的编辑快捷键,如删除单词删除行头行尾。
Vim: daw, d^, d$,还想要什么?。
ST: 早期版本底部多出一个版面的空间,可以把代码最后的几千显示在窗口上半部分。
Vim: z. 把当前行放到窗口中间。Ctrl-E / Ctrl-Y 来滚动显示的行。
ST & Vim: 已拼单词提示/关键字补全。自动缩进。快捷键。命令行。

Sublime Text 能做的,Vim 在安装额外的插件或者适当配置后也能做到的(8):

ST: 快捷键切换注释。
Vim: 多个插件都可以,如 EnhCommentify
ST: 按照文件名称首字母搜索。
Vim: 多个插件都可以,如 LustyExplorer(按文件名子序列搜索)、Command-T(在当前目录下递归地搜索)。
ST: HTML片断快速插入。
Vim: neosnippet、snipMate 等。
ST: Livereload 插件,网页修改后可直接查看效果。
Vim: 使用 BufWritePost 事件通知浏览器刷新。或者直接使用 inotify 等技术监听文件更新。
ST: 侧栏管理项目目录。
Vim: 自带 netrw 插件、更强大的 NERD tree
ST: 多行移动。
Vim: 进可视模式d了再到需要的位置p就可以,不过还是有些麻烦。可以把以下配置复制到你的 vimrc 中:
" 上下移动一行文字
nmap <C-j> mz:m+<cr>`z
nmap <C-k> mz:m-2<cr>`z
vmap <C-j> :m'>+<cr>`<my`>mzgv`yo`z
vmap <C-k> :m'<-2<cr>`>my`<mzgv`yo`z
ST: 括号自动匹配。
Vim: 有几个插件。我不推荐使用这种功能。
ST & Vim: Zencoding。

Sublime Text 能做的,但是 Vim 还不能完全做到的(5):

ST: 多重光标选择,同时修改。
Vim: 列模式。正则替换。. 重复单个命令。使用宏来重复连续的多条命令。
ST: 简单全面的插件体系。
Vim: vim-addon-manager、Vundle、Bundle 等。
ST: UI 清亮。
Vim: 非 Windows 平台上的 GUI 版本也挺不错。Windows 版本的字体渲染很糟糕。
ST: 按名称搜索命令并执行。
Vim: 传统的命令行补全。
ST: 快。
Vim: 少装些插件,避免使用复杂的语法高亮。

Sublime Text 能做的,但是 Vim 还不能做到的(5):

ST: 代码地图 / Minimap。
Vim: 无。不过有好些人表示 taglist / tagbar 之类的比这个好看的缩略图更中用。
ST: 「经常友好地弹一个窗口,提醒用户付费。」
Vim: 默认在启动时会希望你给乌干达的儿童捐款。
ST: 「如果作者不幸挂掉,将会有一大波程序员陷入悲痛。」
Vim: 如果作者不幸挂掉,将会有一大波程序员尝试成为新的维护者。
ST: Linux 下的中文显示可能有问题,不支持输入法。
Vim: 如果其它程序中没有问题,那么在 Vim 中也不会有问题。
ST: 小巧。安装后大小:14277.00 KiB。
Vim: 带 GTK 2 图形界面、多种解释器支持的巨型版本安装后大小:28056.00 KiB。

后记

我当然是不会换用 Sublime Text,除非其出正式版本并对用户的数据表现出一个负责的态度

markdown 不支持描述性列表好讨厌啊,逼我用 Vim 的宏来修正么 :-( 以后这种复杂的内容还是部分用 HTML 吧,简单的部分用 markdown 写了再通过 Vim 的「filter」功能送给 markdown 好了。

本页用到了仅火狐 21+ 支持的 HTML 5 特性:Scoped CSS

Category: Vim | Tags: vim Sublime Text
8
10
2013
42

Vim 7.4 发布

Vim 7.4 刚刚发布了!(怎么没有 Vim 7.4c d e f 了呢=w=)

主要新特性如下:

  1. 新的更快的正则引擎,与旧的同时存在,并且可以指定使用哪个。
  2. 更 pythonic 的 Python 接口。
  3. 位操作函数。
  4. luaeval() 函数。
  5. 其它新增函数、部分函数功能增强。
  6. 自动命令部分添加了InsertCharPreCompleteDoneQuitPreTextChangedTextChangedI事件。
  7. rxvt-unicode 终端的鼠标支持。
  8. 等等。

Python 部分的改进主要如下:

  1. vim.bindeval函数可以获得 Vim 的字典、列表或者函数对象。
  2. buffer 和 window 对象以及vim模块添加了vars属性,用于存取局部于缓冲区、窗口以及全局的 Vim 变量。
  3. 可以从{rtp}/python2{rtp}/python3{rtp}/python导入模块。
  4. 添加了新的 tabpage 对象用于操作标签页。
  5. Vim 错误会自动转成 Python 异常。
  6. vim.buffers改用缓冲区作为键,因此可以方便地从缓冲区号找到对应的 buffer 对象。
  7. 添加了类似其它解释器接口的:pydopy3do命令。
  8. 添加了 Vim 函数pyeval()py3eval()。其返回值会自动转换成 Vim 对象。
  9. 所有接受str对象的接口,现在能够同时接受unicode(Python 2)或者bytes(Python 3)对象。
  10. window 对象添加了 .col.row 属性。
  11. 添加和修正了一些 Vim 添加对象的dir()方法。
  12. vim.vvars用于访问v:开头的特殊变量。
  13. vim.options以及 buffer 和 window 对象的options属于用于像字典那样存取 Vim 的全局或者局部选项。
  14. vim.strwidth函数,功能和 Vim 内建函数strwidth一致。
  15. 可能有更多没有写到发行说明中的内容。

详情请:help version-7.4

附:我编译的 Windows 32 位和 64 位版本: http://lilydjwg.is-programmer.com/pages/19540.html#win-vim

我维护的 Arch Linux lilydjwg 仓库也有 64 位的 gvim 和 vim。

2014年12月2日更新:现在我打包的 Vim 在 Arch Linux 中文社区源里了,名字叫 vim-runtime-lily、gvim-lily 以及 vim-lily。

Category: Vim | Tags: vim python
8
5
2013
10

rst_tables 改进版

rst_tables 是一个用来创建和格式化 rst(reStructuredText)格式文档中的表格用的。此文档里的表格得画成表格的样子,囧死了……比如(网页上显示的可能没对齐,在 Vim 里应该很齐的www):

+----------+----------+-----------------------------------------+
| 格式名称 | 使用频率 | 使用场景                                |
+==========+==========+=========================================+
| markdown | 非常高   | 简单的文字,如博客、简单文档            |
+----------+----------+-----------------------------------------+
| rst      | 较低     | 较复杂的文档,如包含表格或者描述性列表。|
|          |          | 以及 Python 库的文档。                  |
+----------+----------+-----------------------------------------+

所以,作为编辑器之神的 Vim,当然会有更方便的创建这种非人道的表格的办法啦。(其实我是看到 Vimwiki 的表格挺不错的 n(≧▽≦)n

略作搜索,找到了 rst_tables。它是这样子写的(墙外视频演示):

格式名称  使用频率  使用场景
markdown  非常高  简单的文字,如博客、简单文档
rst  较低  较复杂的文档,如包含表格或者描述性列表。以及 Python 库的文档。

每行的单元格间空两格,然后光标放在光标上,按\\c(其实是<leader><leader>ccreate),就创建好啦。如果后期又修改了,按\\fformat)就可以重新格式化啦。

rst 的表格里可以写多行文字,就如前边所示那样。修改表格第一行那些减号的数量后再按\\f,可以调整栏宽。

好啦,rst_tables 本身的介绍至此结束。下面讲讲我作出的改进:

  1. 去除对 vim_bridges Python 库的依赖。根本没大量使用的东西,也没省下几行代码,何必用呢。
  2. 正确对齐和排版中文。官方版考虑了中文字符的宽度,但是用 Python 的 textwrap 来排版,造成各种混乱。我给改成用 Vim 原生排版功能排了。
  3. 使用 Python 3 接口,免得非 UTF-8 'encoding' 时出问题。同时使用了 Vim 7.4 新添加的 Python 接口。
  4. 如果没有 Python 支持,不要载入。
  5. 键映射局部于缓冲区。
  6. 放到 plugin 目录下,因为那些 Python 函数定义不需要载入多次。

安装很简单,把这个文件(使用「Raw」链接来下载)扔到 ~/.vim/plugin 下即可。

Category: Vim | Tags: vim python 中文支持
5
13
2013
4

我的 neocomplcache 升级步骤

志以备忘。

  1. 下载新的 neocomplcache 压缩包
  2. 找到最近的关于 neocomplcache 的「移除 text mode 支持」和「允许使用 sudo」的补丁,依次删除之
  3. 找到最近一次的 neocomplcache 安装,删除之
  4. 解压新的 neocomplcache,并删除vest目录,重新检出README.md
  5. 提交
  6. cherry-pick 最后一次「允许使用 sudo」的提交
  7. cherry-pick 最后一次「移除 text mode 支持」的提交,解决冲突。在必要的时候搜索包含「is_text_mode」的代码并删除之。提交
  8. 2013年7月18日更新cherry-pick 最后一次「安装 neocomplcache 时对 ftplugin/snippet 的修改」的提交。Tab 大小非八个空格的都给我去死!
  9. 更新 Vim 文档的 tags 文件
  10. 测试没有问题后推送到远程仓库

附注:

移除 text mode 支持」提交是为了在写一般文字(注释、git 提交信息、文章等)时依旧能够精确地按原大小写补全。因为我是中文用户,含有大写的单词是专有名词(如 Python、gVim、iOS、FreeBSD)的概率要远高于句首大写首字母单词。

允许使用 sudo」。在使用 sudo 命令并且$HOME环境变量被保持的时候不要显示错误信息并禁用 neocomplcache。在这种情况下继续使用 neocomplcache 可能造成生成的缓存文件无法被当前用户修改。我很少遇到这种情况,因为只有少数特定文件我才会使用 sudo 去编辑。作者给出了另外两种(对我来说不可行的)解决方案:

  1. 使用 sudo.vim 插件。这样将不会有备份文件,撒消文件的情况不清楚,交换文件亦可能有问题。没有备份文件将导致错误的配置无法被简单地撒消。sudo.vim 使用tee覆写文件,在文件还没写完时停机或者硬盘空间不足时将导致数据丢失,并且因为编辑的通常是重要系统文件而导致系统故障。(参见如何更安全地覆写数据文件。)就算没有遇到这种极端的情况,覆写文件亦将对正在使用此文件的其它进程造成不可预料的影响。

  2. 让 sudo 重置 $HOME 到相应用户的家目录。这样我自己的 Vim、zsh 等配置就用不了了。

Category: Vim | Tags: vim neocomplcache
3
30
2013
7

Vim 的 Tornado 模板语法高亮

很简单的东西,竟然没有人来做。之前虽然没有高亮,但也没出什么问题,于是我忍了。可今天,我要在 HTML 模板里用小于号了,于是 Vim 给我高亮成错误。于是我就做了:

" Vim syntax file
" FileType:     Tornado template
" Author:       lilydjwg <lilydjwg@gmail.com>

" Add something like the following in modeline to your templates:
" {# vim:se syntax=html.tornadotmpl: #}

syntax region tmplCode matchgroup=PreProc start="{[%{]!\@!" end="[%}]}" contains=@Python,tmplKeyword containedin=ALL
syntax region tmplComment matchgroup=PreProc start="{#!\@!" end="#}"
syntax region tmplComment matchgroup=PreProc start="{%\s\+comment\s\+" end="%}"
syntax keyword tmplKeyword end include apply autoescape block extends module raw set

let b:current_syntax_save = b:current_syntax
unlet b:current_syntax
syntax include @Python syntax/python.vim
let b:current_syntax = b:current_syntax_save
unlet b:current_syntax_save

highlight link tmplCode Normal
highlight link tmplComment Comment
highlight link tmplKeyword Keyword

此文件可从 vim.org 下载(记得要评分哦),将其放入~/.vim/syntax即完成安装。使用方法很简单,比如 HTML 模板就写set syntax=html.tornadotmpl,JavaScript 的就写成set syntax=javascript.tornadotmpl。可以按注释里那样子写到模式行里去。详见手册:help 'syntax'

Category: Vim | Tags: vim tornado
1
3
2012
18

neocomplcache: 请尊重大小写!

今天给 Vim 加了个 CursorHold 事件。加完提交到 git 仓库中,发现写 Cur 时,neocomplcache 给出的补全是 Cursorhold,而不是代码中写的 CursorHold,得手动改过来,很郁闷。这已经不是我第一次遇到了,决定需求解决方案。

neocomplcache 关于大小写的设置变量有两个,g:neocomplcache_enable_ignore_caseg:neocomplcache_enable_smart_case。这两个我都没有设置啊。以为是 bug,上网搜索无果,遂看源码,最终发现这真是款自作聪明的插件——在输入文本而不是代码时,它将总是忽略大小写!

补丁如下:

commit aaed422a2dff182954813c16db242545389a0018
Author: 依云 <lilydjwg@gmail.com>
Date:   2012-01-03 23:01:43 +0800

    neocomplcache: never use 'is_text_mode'
    
    This always causes inconvenience for me.

diff --git a/autoload/neocomplcache.vim b/autoload/neocomplcache.vim
index 26a2d09..ac1e0f0 100644
--- a/autoload/neocomplcache.vim
+++ b/autoload/neocomplcache.vim
@@ -995,9 +995,6 @@ endfunction"}}}
 function! neocomplcache#is_eskk_enabled()"{{{
   return exists('*eskk#is_enabled') && eskk#is_enabled()
 endfunction"}}}
-function! neocomplcache#is_text_mode()"{{{
-  return s:is_text_mode || s:within_comment
-endfunction"}}}
 function! neocomplcache#is_win()"{{{
   return has('win32') || has('win64')
 endfunction"}}}
@@ -1135,9 +1132,7 @@ function! neocomplcache#get_complete_result(cur_text, ...)"{{{
       " Save options.
       let l:ignorecase_save = &ignorecase
 
-      if neocomplcache#is_text_mode()
-        let &ignorecase = 1
-      elseif g:neocomplcache_enable_smart_case && l:cur_keyword_str =~ '\u'
+      if g:neocomplcache_enable_smart_case && l:cur_keyword_str =~ '\u'
         let &ignorecase = 0
       else
         let &ignorecase = g:neocomplcache_enable_ignore_case
@@ -1289,26 +1284,6 @@ function! neocomplcache#integrate_completion(complete_result, is_sort)"{{{
     endfor
   endif"}}}
 
-  " Convert words.
-  if neocomplcache#is_text_mode()"{{{
-    if l:cur_keyword_str =~ '^\l\+$'
-      for l:keyword in l:complete_words
-        let l:keyword.word = tolower(l:keyword.word)
-        let l:keyword.abbr = tolower(l:keyword.abbr)
-      endfor
-    elseif l:cur_keyword_str =~ '^\u\+$'
-      for l:keyword in l:complete_words
-        let l:keyword.word = toupper(l:keyword.word)
-        let l:keyword.abbr = toupper(l:keyword.abbr)
-      endfor
-    elseif l:cur_keyword_str =~ '^\u\l\+$'
-      for l:keyword in l:complete_words
-        let l:keyword.word = toupper(l:keyword.word[0]).tolower(l:keyword.word[1:])
-        let l:keyword.abbr = toupper(l:keyword.abbr[0]).tolower(l:keyword.abbr[1:])
-      endfor
-    endif
-  endif"}}}
-
   if g:neocomplcache_max_keyword_width >= 0"{{{
     " Abbr check.
     let l:abbr_pattern = printf('%%.%ds..%%s', g:neocomplcache_max_keyword_width-15)
@@ -1671,9 +1646,7 @@ function! neocomplcache#complete_common_string()"{{{
   " Get cursor word.
   let [l:cur_keyword_pos, l:cur_keyword_str] = neocomplcache#match_word(s:get_cur_text())
 
-  if neocomplcache#is_text_mode()
-    let &ignorecase = 1
-  elseif g:neocomplcache_enable_smart_case && l:cur_keyword_str =~ '\u'
+  if g:neocomplcache_enable_smart_case && l:cur_keyword_str =~ '\u'
     let &ignorecase = 0
   else
     let &ignorecase = g:neocomplcache_enable_ignore_case
@@ -1771,9 +1744,7 @@ function! s:make_quick_match_list(list, cur_keyword_str)"{{{
   " Save options.
   let l:ignorecase_save = &ignorecase
 
-  if neocomplcache#is_text_mode()
-    let &ignorecase = 1
-  elseif g:neocomplcache_enable_smart_case && a:cur_keyword_str =~ '\u'
+  if g:neocomplcache_enable_smart_case && a:cur_keyword_str =~ '\u'
     let &ignorecase = 0
   else
     let &ignorecase = g:neocomplcache_enable_ignore_case
diff --git a/autoload/neocomplcache/sources/dictionary_complete.vim b/autoload/neocomplcache/sources/dictionary_complete.vim
index 97e7b12..dda34be 100644
--- a/autoload/neocomplcache/sources/dictionary_complete.vim
+++ b/autoload/neocomplcache/sources/dictionary_complete.vim
@@ -79,11 +79,7 @@ endfunction"}}}
 function! s:source.get_keyword_list(cur_keyword_str)"{{{
   let l:list = []
 
-  let l:filetype = neocomplcache#is_text_mode() ? 'text' : neocomplcache#get_context_filetype()
-  if neocomplcache#is_text_mode() && !has_key(s:dictionary_list, 'text')
-    " Caching.
-    call s:caching()
-  endif
+  let l:filetype = neocomplcache#get_context_filetype()
 
   for l:ft in neocomplcache#get_source_filetypes(l:filetype)
     call neocomplcache#cache#check_cache('dictionary_cache', l:ft, s:async_dictionary_list,
@@ -102,7 +98,7 @@ function! s:caching()"{{{
     return
   endif
 
-  let l:key = neocomplcache#is_text_mode() ? 'text' : neocomplcache#get_context_filetype()
+  let l:key = neocomplcache#get_context_filetype()
   for l:filetype in neocomplcache#get_source_filetypes(l:key)
     if !has_key(s:dictionary_list, l:filetype)
           \ && !has_key(s:async_dictionary_list, l:filetype)

2012年3月30日更新:针对 neocomplcache 6.2 的补丁在此

2013年6月2日更新:针对 neocomplcache 8.0 的补丁在这里或者这里。对应的 git 提交为 17dd164。

Category: Vim | Tags: vim
12
21
2011
5

Rcode.vim 2.0 发布

Rcode, 即「Run Code」的缩写。Vim 拥有多种脚本语言的接口。有时候需要对文本进行较复杂的处理,但是在单行的命令行里能写的代码功能有限。你可能会立即想到,先把代码写到一个文件里再加载。没错,这就是 Rcode.vim 为你做的。2.0 版本在原来简单的「编写」->「执行」基础上添加了代码保存功能,可供重新载入(并加以修改)。此特性是由易名建议的。

命令和键映射:
:Rcode		启动 Rcode,需要一个参数指明语言,如 vim、
		awk 等。使用 <C-D> 可以查看所有当前被
		支持的语言。会开启一个新的缓冲区,请把你的代
		码写在里边。此命令可以接受一个范围。

:RcLoad {name}	加载之前保存的代码。
		「name」是「{lang}/{filename}」的形式,这和
		保存的参数有些不同,因为脚本需要知道代码的语种。
		此命令可以接受一个范围。

:RcSelect	列出所有已保存的代码,使用数字来选择。

在 Rcode 的缓冲区里:

<C-CR>
:Run		在你启动 Rcode 时的缓冲区上执行代码。
:Save {name}	保存代码以在日后可使用「:RcLoad」命令载入。

别名:
在 Python 中,「v」为「vim」模块,「b」为当前的缓冲区对象。
在 Lua 中,「b」为当前的缓冲区对象。 

设置:
g:Rcode_after	执行代码后的行为。
		0 什么也不做,1 关闭该窗口,2 关闭的同时也不
		要记住代码,不然下次使用「:Rcode」命令时会显
		示此代码。默认值为 1。

g:Rcode_snippet_path	代码保存的路径。
			默认值是 "$HOME/.vim/rcode"。

下载地址

Category: Vim | Tags: vim
10
31
2011
16

在 Linux 下交叉编译带 Python 3 支持的 gvim.exe

今天再一次在 yaourt 的输出中瞥见 mingw 这几个字符,好奇地看了下说明:A C and C++ cross-compilers for building Windows executables on Linux。这个不就是传说中的交叉编译器么?

试试看。以前自己在虚拟机里为 Windows 编译过很多次的 vim,要是能弄到真机下来编译效率应该会高很多。(不,我不是说虚拟机的性能差,而是 Windows 下跑 mingw 这种一堆进程的东西效率差。)

说干就干,几十 M 的 mingw-gcc 及其依赖下好,git archive all|tar x -C ~tmp/vim弄份崭新的 vim 源码,把以前在 win 下用的Make_ming.mak拷过来改改,设置CROSS=yes什么的,然后开始编译!然后很快就出错了,找不到编译器i586-pc-mingw32msvc-gcc。唔,我确实没有那个东东,只有i486-mingw-gcc,去把CROSS_COMPILE这个变量改了就好。然后再 make。这一次的结局是——找不到 Python/Ruby/Lua 的头文件、找不到它们中的符号……好吧,你这交叉编译器当然找不到它们,先注释掉好了。然后重新编译,很顺利地出来个 gvim.exe 了~拿到 Windows 虚拟机里跑一下,一切正常~

好开心,第一次玩交叉编译就成功了。不过还有些小遗憾:没有那些外部脚本语言的支持。这可怎么办呢?我上哪儿找用于交叉编译的库呢?光想是没有用的,还是得尝试。用 Linux 版的库肯定不行,那就试试 Windows 版的。先拿 Python 3 支持测试。把 Windows 下安装的 Python 3 文件夹复制过来,修改下路径,再 make。很正常地,我的第一次尝试总是不成功,好在也不是大问题:Make_ming.mak里写的 include 目录不对:

ifeq ($(CROSS),no)
PYTHON3INC=-I $(PYTHON3)/include
else
PYTHON3INC=-I $(PYTHON3)/win32inc
endif

看看自己的 Python 3 目录,这里的win32inc应该是include。改改就好了 ;-)

嗯,顺利成功了!接下来,把 Windows 版的 Ruby 和 Lua 也弄过来就不用再跑到虚拟机里去编译 Windows 版的 Vim 了!嗯,NSIS 也有 Linux 版,虽然是在 AUR 里。

最后,编译好的 gvim 还是在这里

Category: Vim | Tags: vim windows 交叉编译 编译 linux

Mastodon | Theme: Aeros 2.0 by TheBuckmaker.com