Archive

Archive for the ‘随笔’ Category

笔记软件为何需要本地存储?

November 2nd, 2022 6 comments

不要忘记历史:

  • Evernote:导出备份的 .enex 文件, 再导入时提示有几篇日志图片 太多,没有会员无 法导入。
  • 印象笔记:用户因为从 Evernote 导入到印象笔记时触发了一个 BUG,五年笔 记丢失。新版本禁止导出公开格式的 .enex 文件,只能导出自己加密的 .note 格式,别的软件无法识别,只能映像笔记自己导出导入。
  • Notion:因为服务器在境外,偶尔会有无法访问的情况。未来有被墙的风险。
  • Wolai:CEO 公开声称用户上传非法信息要报警。CEO 公开声称自己审查用户笔记。公开挂程面试序员的隐私信息。
  • 百度:百度盘扫描用户上传文件并做精准广告推送(上传证件图片的人被推荐电子证件钱包) 百度盘替换用户视频,换成净网行动的宣传视频。
  • 某在线文档:用户用在线编辑的文稿,因为保存到在线云盘,数日后触发关键字被删除。
  • 语雀:本来免费的,近期突然宣布新的收费策略,规定免费用户总文档数量不能超过 100 篇(包括小记、文档、数据表、表格、画板等),见这里:如何看待语雀付费策略?遭到大量投诉后又改为:免费用户每月 100篇,还是无法分享。

当年 github 就是天天被码云投诉,然后被墙掉了(不一定全是因为它,但它投诉了不少);现在码云又在投诉仅有的 gitlab ,oschina 上天天看得到 gitlab 的黑文章,比如:

扒一扒极狐 GitLab 的底裤 – OSCHINA – 中文开源技术交流社区

OSCHINA 和码云是一家,天天发这些,也不标注下 “利益相关”,兴许各位的 notion 最近经常不容易访问到,也是被国内的竞争对手天天举报吧?按某些公司的尿性,面试程序员的隐私可以挂,用户的笔记随便审核举报,投诉下它 notion 简直小儿科,也许哪天真的就完全用不了。

因此,你的笔记如果打算保留十年以上,请选择支持本地存储+公开格式(最好文本)的软件,前者在于自己掌握数据,后者在于自己保留可以随时离开的权力。

Categories: 随笔 Tags:

如何长时间保存重要数据?

May 9th, 2019 23 comments

我大学毕业时把所有资料刻录成几张 dvd,才几年就发现读取不了了,而我老爸读大学时候的笔记本,几十年后仍保存完好。我前几年保存在移动硬盘里的照片,因为搬家时摔了一次,完全毁坏了,但是我家里小时候的相册却能几十年没有事情。

所以今天数据存储固然比过去更加方便,但是可靠性却大为降低。硬件坏了你还可以花钱再买,数据丢了,你就再也无力回天了。数据对我来讲是最宝贵的东西,无数血与泪的教训后,让我开始深入思考,怎么样才能让我的数据长期安全的保存几十年甚至终身?

可以用光碟么?

光碟是最廉价最受欢迎的介质,他们本来设计寿命是 10-20 年的,而一般情况你不要指望你光盘上的东西五年后还能正常读出来。即便一些号称长期保存百年以上的光盘,寿命也会由于我们各种不当行为大大降低,比如,没法按要求的条件保存(放桌面上被阳光暴晒变形),不小心刮花光盘,在盘面上留下指纹或者手上的油脂,这些都会促进光盘表面化学成分变质,最终导致你的数据损坏。

可以用机械硬盘么?

这两年 HDD/SSD 技术进步很快,成本越来越低。8T 的 HDD 差不多只 1000 元人名币的成本,1T 的 SSD 也从过去的好几千元降价到 600 多了。HDD/SSD 都能组成阵列,用虚拟逻辑卷的形式跨越物理大小的限制,为你提供超大规模的连续存储空间。

然而当你想要维护更大规模的盘阵时,你基础硬件设施的成本会大幅上升,4路阵列和8路16路的成本完全不一样。同时更新换代快,我过去保存的几块 IDE/SATA 接口的硬盘,今天我已经没有任何可用的设备来读取他们了。

遗憾的是,不管是 HDD 还是 SSD 他们都不能长期可靠的保存数据,每年有 1% 的概率由于磁场变化造成 HDD 数据损坏,这个损坏率会随着硬盘寿命逐年变大。而 SSD 的寿命比 HDD 更短,同时他们还会受到温度的影响,如果长期处在40度以上的工作温度,二者的寿命都会减半。

Read more…

Categories: 随笔 Tags:

用 Vim/VsCode 来写 WordPress 博客

May 8th, 2019 3 comments

试用过一段时间各种静态页面博客系统,Hugo 这些,虽然发展的不错,但是比起 WordPress 来还是太弱了。WordPress 毕竟是发展了 15 年的东西各种功能和插件都比较完善。

所以这次回过头来重新使用 WordPress,顺便做了升级,速度更快了(升级 PHP7,引入页面缓存等),代码高亮等各种小功能也调优了一下,又加了一些类似热门文章和访问计数等小功能。

然后我写了一个命令行工具,可以让我在喜欢的文本编辑器里用 MarkDown 写博客,然后命令行发布到 WordPress,具体见 markpress 相关文档。

下面是一些调优后的效果,首先 Markdown 的代码块,使用 highlight.js 以后好看很多:

#include <stdio.h>
int main(void)
{
    printf("Hello, World !!\n");
    return 0;
}

这个插件支持 185 种语言(包括 Vim)的高亮,可以选择 89 种主题,是目前最强的代码高亮解决方案。

MarkPress 页面生成基本尊崇 Github 规范:

  1. 连接会被自动识别,只需要直写 URL,就会自动识别出来加上 <a> 标签。
  2. 比如双波浪线包围的内容 ~~测试~~ 会被划掉显示为:测试
  3. 比如 Github Emoji,直接写 :smile: 的 shortcode,就会变成 :smile:

除此之外还有很多 github 没有的扩展,比如:

折叠菜单点击左边箭头打开

第一行隐藏的折叠内容
第二行隐藏的折叠内容

MathJax 的内嵌公式,被 $ 符号包围住的内容会被识别成 latex 公式:

$z=\sqrt{x^2 + \sqrt{y^2}}$

得到:

$z=\sqrt{x^2 + \sqrt{y^2}}$

然后是 GraphViz 图形,现在在 MarkDown 中用 viz-{引擎名称} 开头的代码块:

```viz-dot
digraph G {
   A -> B
   B -> C
   B -> D
}
```

能被转换为内嵌 SVG 代码,并被主流浏览器正常显示:

Read more…

Categories: 随笔 Tags:

别让 cd 浪费你的时间

February 8th, 2019 4 comments

终端下工作最烦躁的就是路径切换,没有自动路径切换的帮助,就像在泥里走路,于是有了各种 autojump / z / fasd 等工具来提升路径切换的效率,今天向大家介绍一个更好用的工具:z.lua,用熟练了以后就像终端里溜冰,路劲切换从此指哪打哪。

z.lua 是一个会学习你使用习惯的 cd 命令,它会跟踪你在 shell 下访问过的路径,通过一套称为 Frecent 的机制(源自 Mozilla),经过一段简短的学习之后,z.lua 会帮你跳转到所有匹配正则关键字的路径里 Frecent 值最高的那条路径去。

正则将按顺序进行匹配,”z foo bar” 可以匹配到 /foo/bar ,但是不能匹配 /bar/foo。

特性说明:

  • 性能比 z.sh 快三倍,比 fasd / autojump 快十倍以上。
  • 支持 Posix Shell:bash, zsh, dash, sh, ash, busybox 等等。
  • 支持 Fish Shell,Power Shell 和 Windows cmd。
  • 使用增强匹配算法,更准确的带你去到你想去的地方。
  • 低占用,能够仅在当前路径改变时才更新数据库(将 $_ZL_ADD_ONCE 设成 1)。
  • 交互选择模式,如果有多个匹配结果的话,跳转前允许你进行选择。
  • 交互选择模式,支持使用 fzf 进行可视化结果筛选(可选)。
  • 快速跳转到父目录,或者项目根目录,代替反复 “cd ../../..” 。
  • 为不同的操作系统,不同的 Shell 程序提供统一的使用体验。
  • 兼容 lua 5.1, 5.2 和 5.3 以上版本。
  • 自包含且无额外依赖,单个 z.lua 文件完成所有工作。

软件安装:

将下面对应语句添加到你的 .bashrc / .zshrc / .profile 或者对应 shell 的初始化脚本末尾:

eval "$(lua /path/to/z.lua --init bash enhanced once echo)"    # BASH 初始化
eval "$(lua /path/to/z.lua --init zsh enhanced once echo)"     # ZSH 初始化
eval "$(lua /path/to/z.lua --init posix enhanced once echo)"   # 其他 Posix Shell 初始化
source (lua /path/to/z.lua --init fish enhanced once echo | psub)  # Fish Shell 初始化
iex ($(lua /path/to/z.lua --init powershell enhanced once echo) -join "`n") # Power Shell 初始化

然后重新登陆,即可使用。

用户评价:

“我喜欢它的原理,我在命令行下面的行为十分有规律,并且我十分懒惰,懒得管理和维护一套书签或者路径别名。“

“总之,z.lua 做到了它所宣称的目标。如果你需要快速的在目录间切换,它可能是最好的选择。“

”我终于可以在自己的树莓派1上使用 autojump 类似的功能了,而不用像以前传统 autojump 那样每次打开终端都要等待 30 秒。”

基本使用:

cd 到一个包含 foo 的目录:

z foo

cd 到一个以 foo 结尾的目录:

z foo$

对长路径使用多个关键字进行匹配:
假设路径历史数据库(~/.zlua)中有两条记录:

10   /home/user/work/inbox
30   /home/user/mail/inbox

“z in”将会跳转到 /home/user/mail/inbox 因为它有更高的权重,同时你可以传递更多参数给 z.lua 来更加精确的指明,如 “z w in” 则会让你跳到 /home/user/work/inbox。

交互选择:

使用 -i 参数进行跳转时, 如果有多个匹配结果,那么 z.lua 会给你显示一个列表:

$ z -i soft
3: 0.25   /home/data/software
2: 3.75   /home/skywind/tmp/comma/software
1: 21     /home/skywind/software
> {光标位置}

然后你按照最前面的序号输入你想要去的地方,比如输入 3 就会进入 /home/data/software。如果你不输入任何东西直接按回车,那么将会直接退出而不进行任何跳转。

PS:交互选择同时支持 “-I” 参数(大写 i),让你可以使用 fzf 在多项结果进行快速选择(如果系统里面安装了的话)。

快速回到父目录:

“-b” 选项可快速回到某一级父目录,避免重复输入 “cd ../../..”,一般把 “z -b” 别名成 “zb” 命令:

  • (没有参数):cd 到项目根目录,即跳转到父目录中包含 (.git/.svn/.hg) 的地方。
  • (单个参数):cd 到最近一级以关键字开头的父目录中。
  • (两个参数):对当前目录进行字符串替换,然后 cd 过去。

使用举例:

# 一直向上退到项目根目录(就是里面有一个 .git 目录的地方)
~/github/lorem/src/public$ zb
  => cd ~/github/lorem

# cd 到第一个以 g 开头的父目录
~/github/vimium/src/public$ zb g
  => cd ~/github

# 快速回到 site 目录
~/github/demo/src/org/main/site/utils/file/reader/whatever$ zb si
  => cd ~/github/demo/src/org/main/site

# 将 jekyll 替换为 ghost
~/github/jekyll/test$ zb jekyll ghost
  => cd ~/github/ghost/test

向后跳转同样也支持环境变量 $_ZL_ECHO(用来显示跳转结果),这样为搭配其他工具提供了可能性(并不需要改变当前工作目录):

# 假设我们位于 ~/github/vim/src/libvterm
# 打开 $_ZL_ECHO 用于在每次跳转后调用一次 pwd 显示当前目录
$ _ZL_ECHO=1

# 看看我项目根目录(有 .git 那个)目录里有什么?
$ ls -l `zb`
  => ls -l ~/github/vim

# 检查 "<项目根目录>/logs" 下面的日志
$ tail -f `zb`/logs/error.log
  => tail -f ~/github/vim/logs/error.log

# 查看一下某一级父目录里有些啥
$ ls -l `zb git`
  => ls -l ~/github

Bonus:“zb ..” 相当于 “cd ..”,“zb …” 相当于 “cd ../..”,而 “zb ….” 相当于 “cd ../../..” 等等。 最后 “zb ..20” 等同于调用 “cd ..” 二十次。

常用技巧:

推荐一些常用别名,放在你的配置文件中:

alias zc='z -c' # 严格匹配当前路径的子路径
alias zz='z -i' # 使用交互式选择模式
alias zf='z -I' # 使用 fzf 对多个结果进行选择
alias zb='z -b' # 快速回到父目录

z.lua 可以方便的导入 z.sh 的数据(他们格式相同):

cat ~/.z >> ~/.zlua

还可以导入 autojump 的数据:

FN="$HOME/.local/share/autojump/autojump.txt"
awk -F '\t' '{print $2 "|" $1 "|" 0}' $FN >> ~/.zlua

更多内容,参考项目文档:

https://github.com/skywind3000/z.lua

Categories: 随笔 Tags:

为什么希特勒要反犹太人?

August 22nd, 2018 No comments

因为希特勒需要一个假想敌,这个假想敌一方面能给国内的飞涨的物价、大规模的失业、饥荒还有战争背锅。另一方面可以吓唬德国人民,让他们认为只有服从纳粹,才能对抗可怕的敌人。

所有这些战争都是在德国媒体疯狂的鼓动下进行的,尽管现实中的假想敌可能没做什么,却也会被媒体描述成歇斯底里的存在,他们马上就会到来,破坏你的土地家园,奴役你的妻儿。因此对付这个假想敌的重要性超越了:公共权力,社会福利,医疗,住房等一切现实问题。

所有事情都要为其开道,一切问题的对错都以是否有利于实现目标进行判断,一切德国法律也需为它做出修改,一切妨碍实现最高目标的人员都应即时调整,一切社会资源都应该向其集中,这样才能凝聚内部最大的力量抵抗外敌。

  • 希特勒让犹太人对德国国内所有社会弊病背锅。
  • kim家族猛烈的抨击美国和西方资本主义,认为他们应该为朝鲜所发生的一切负责
  • pakistan 军zf总是鼓动大家,同印度的异教徒做斗争。

以上

Categories: 随笔 Tags:

VimScript 五分钟入门(翻译)

May 26th, 2018 No comments

译注:折腾 Vim 当然要能看懂和改写相关脚本,而中文资料匮乏,缺一个提纲挈领的教程。本文翻译自 Andrew Scala 的 《Five Minute Vimscript》,立足于让你用最短的时间掌握 VimScript 的基础和要点,你可以把它看成一份语言速查表。

Vim有着丰富的内建文档系统,使用 :h <关键词> 就可以阅读,如果你想在方便的尝试各种 vimscript ,你可以通过 NORMAL 模式下使用 gQ 命令进入 VimScript 的交互式环境调试命令。

注意:下面的例子中会包含一些形如 <符号> 的符号,意味着正式使用时应该被完全替换成真实的东西,包括左右两边的尖括号。而单独的 <> 在 VimScript 中被用作比较符号。

变量

  • let 命令用来对变量进行初始化或者赋值。
  • unlet 命令用来删除一个变量。
  • unlet! 命令同样可以用来删除变量,但是会忽略诸如变量不存在的错误提示。

默认情况下,如果一个变量在函数体以外初始化的,那么它的作用域是全局变量;而如果它是在函数体以内初始化的,那它的作用于是局部变量。同时你可以通过变量名称前加冒号前缀明确的指明变量的作用域:

  • g:var – 全局
  • a:var – 函数参数
  • l:var – 函数局部变量
  • b:var – buffer 局部变量
  • w:var – window 局部变量
  • t:var – tab 局部变量
  • s:var – 当前脚本内可见的局部变量
  • v:var – Vim 预定义的内部变量

你可以通过 $name 的模式读取或者改写环境变量,同时可以用 &option 的方式来读写 vim 内部的设置值。

数据类型

Number:32 位有符号整数

-123
0x10
0177

Float: 浮点数,需要编译 Vim 的时候,有 +float 特性支持

123.456
1.15e-6
-1.1e3

String: NULL 结尾的 8位无符号字符串

"ab\txx\"--"
'x-z''a,c'

Funcref: 函数引用,函数引用类型的变量名必须以大写字母开头

:let Myfunc = function("strlen")
:echo Myfunc('foobar') " Call strlen on 'foobar'.
6

List: 有序列表

:let mylist = [1, 2, ['a', 'b']]
:echo mylist[0]
1
:echo mylist[2][0]
a
:echo mylist[-2]
2
:echo mylist[999]
E684: list index out of range: 999
:echo get(mylist, 999, "THERE IS NO 1000th ELEMENT")
THERE IS NO 1000th ELEMENT

Dictionary: 无序的 Key/Value 容器

:let mydict = {'blue': "#0000ff", 'foo': {999: "baz"}}
:echo mydict["blue"]
#0000ff
:echo mydict.foo
{999: "baz"}
:echo mydict.foo.999
baz
:let mydict.blue = "BLUE"
:echo mydict.blue
BLUE

没有布尔类型,整数 0 被当作假,其他被当作真。字符串在比较真假前会被转换成整数,大部分字符串都会被转化为 0,除非以非零开头的字符串才会转化成非零。

Read more…

Categories: 随笔 Tags:

Windows 10 – 1803 更新又给我出幺蛾子

May 2nd, 2018 1 comment

Windows 10 的 1803 版本更新后,Cygwin 的 Open SSH 服务无法始用,调查半天,Windows 10 新建了个 sshd 的服务,原来的 Cygwin Open SSH 服务被删除了,也安装不上去,解决方法是 ssh-host-config 后面加个参数 --name sshd2 换个新名字重新安装服务。

Categories: 随笔 Tags:

Vim 8 下 C/C++ 开发环境搭建

April 22nd, 2018 19 comments

挺多人问怎么在 Vim 中搭建 C/C++ 开发环境,我本来想找篇文章发给人家,结果网上看了一圈,要不就是内容太过陈旧,要不就是太过零碎,不成体系。2018 年了,Vim 8 发布已经一年半,各大 Linux 发行版和 Mac OS X自带的 Vim 都已经跟进到 8了,不少文章还在介绍一些十年前的老方法。于是有了这篇文章。

那如何高效的再 Vim 8 中开发 C/C++ 项目呢?假设你已经有一定 Vim 使用经验,并且折腾过 Vim 配置,能够相对舒适的在 Vim 中编写其他代码的时候,准备在 Vim 开始 C/C++ 项目开发,或者你已经用 Vim 编写了几年 C/C++ 代码,想要更进一步,让自己的工作更加顺畅的话,本文就是为你准备的:

插件管理

为什么把插件管理放在第一个来讲呢?这是比较基本的一个东西,如今 Vim 下熟练开发的人,基本上手都有 20-50 个插件,遥想十年前,Vim里常用的插件一只手都数得过来。过去我一直使用老牌的 Vundle 来管理插件,但是随着插件越来越多,更新越来越频繁,Vundle 这种每次更新就要好几分钟的东西实在是不堪重负了,在我逐步对 Vundle 失去耐心之后,我试用了 vim-plug ,用了两天以后就再也回不去 Vundle了,它支持全异步的插件安装,安装50个插件只需要一分钟不到的时间,这在 Vundle 下面根本不可想像的事情,插件更新也很快,不像原来每次更新都可以去喝杯茶去,最重要的是它支持插件延迟加载:

" 定义插件,默认用法,和 Vundle 的语法差不多
Plug 'junegunn/vim-easy-align'
Plug 'skywind3000/quickmenu.vim'

" 延迟按需加载,使用到命令的时候再加载或者打开对应文件类型才加载
Plug 'scrooloose/nerdtree', { 'on':  'NERDTreeToggle' }
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }

" 确定插件仓库中的分支或者 tag
Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }

定义好插件以后一个::PlugInstall 命令就并行安装所有插件了,比 Vundle 快捷不少,关键是 vim-plug 只有单个文件,正好可以放在我 github 上的 vim 配置仓库中,每次需要更新 vim-plug 时只需要 :PlugUpgrade,即可自我更新。

抛弃 Vundle 切换到 vim-plug 以后,不仅插件安装和更新快了一个数量级,大量的插件我都配置成了延迟加载,Vim 启动速度比 Vundle 时候提高了不少。使用 Vundle 的时候一旦插件数量超过30个,管理是一件很痛苦的事情,而用了 vim-plug 以后,50-60个插件都轻轻松松。

符号索引

现在有好多 ctags 的代替品,比如 gtags, etags 和 cquery。然而我并不排斥 ctags,因为他支持 50+ 种语言,没有任何一个符号索引工具有它支持的语言多。同时 Vim 和 ctags 集成的相当好,用它依赖最少,大量基础工作可以直接通过 ctags 进行,然而到现在为止,我就没见过几个人把 ctags 用对了的。

就连配置文件他们都没写对,正确的 ctags 配置应该是:

set tags=./.tags;,.tags

这里解释一下,首先我把 tag 文件的名字从 tags 换成了 .tags,前面多加了一个点,这样即便放到项目中也不容易污染当前项目的文件,删除时也好删除,gitignore 也好写,默认忽略点开头的文件名即可。

前半部分 ./.tags; 代表在文件的所在目录下(不是 :pwd 返回的 Vim 当前目录)查找名字为 .tags 的符号文件,后面一个分号代表查找不到的话向上递归到父目录,直到找到 .tags 文件或者递归到了根目录还没找到,这样对于复杂工程很友好,源代码都是分布在不同子目录中,而只需要在项目顶层目录放一个 .tags文件即可;逗号分隔的后半部分 .tags 是指同时在 Vim 的当前目录(:pwd命令返回的目录,可以用 :cd ..命令改变)下面查找 .tags 文件。

最后请更新你的 ctags,不要再使用老旧的 Exuberant Ctags,这货停止更新快十年了,请使用最新的 Universal CTags 代替之,它在 Exuberant Ctags 的基础上继续更新迭代了近十年,如今任然活跃的维护着,功能更强大,语言支持更多。

(注意最新版 universal ctags 调用时需要加一个 –output-format=e-ctags,输出格式才和老的 exuberant ctags 兼容否则会有 windows 下路径名等小问题)。

自动索引

过去写几行代码又需要运行一下 ctags 来生成索引,每次生成耗费不少时间。如今 Vim 8 下面自动异步生成 tags 的工具有很多,这里推荐最好的一个:vim-gutentags,这个插件主要做两件事情:

  • 确定文件所属的工程目录,即文件当前路径向上递归查找是否有 .git, .svn, .project 等标志性文件(可以自定义)来确定当前文档所属的工程目录。
  • 检测同一个工程下面的文件改动,能会自动增量更新对应工程的 .tags 文件。每次改了几行不用全部重新生成,并且这个增量更新能够保证 .tags 文件的符号排序,方便 Vim 中用二分查找快速搜索符号。

vim-gutentags 需要简单配置一下:

" gutentags 搜索工程目录的标志,碰到这些文件/目录名就停止向上一级目录递归
let g:gutentags_project_root = ['.root', '.svn', '.git', '.hg', '.project']

" 所生成的数据文件的名称
let g:gutentags_ctags_tagfile = '.tags'

" 将自动生成的 tags 文件全部放入 ~/.cache/tags 目录中,避免污染工程目录
let s:vim_tags = expand('~/.cache/tags')
let g:gutentags_cache_dir = s:vim_tags

" 配置 ctags 的参数
let g:gutentags_ctags_extra_args = ['--fields=+niazS', '--extra=+q']
let g:gutentags_ctags_extra_args += ['--c++-kinds=+px']
let g:gutentags_ctags_extra_args += ['--c-kinds=+px']

有了上面的设置,你平时基本感觉不到 tags 文件的生成过程了,只要文件修改过,gutentags 都在后台为你默默打点是否需要更新数据文件,你根本不用管,还会帮你:

setlocal tags+=... 

为当前文件添加上对应的 tags 文件的路劲而不影响其他文件。得益于 Vim 8 的异步机制,你可以任意随时使用 ctags 相关功能,并且数据库都是最新的。需要注意的是,gutentags 需要靠上面定义的 project_root 里的标志,判断文件所在的工程,如果一个文件没有托管在 .git/.svn 中,gutentags 找不到工程目录的话,就不会为该野文件生成 tags,这也很合理。想要避免的话,你可以在你的野文件目录中放一个名字为 .root 的空白文件,主动告诉 gutentags 这里就是工程目录。

最后啰嗦两句,少用 CTRL-] 直接在当前窗口里跳转到定义,多使用 CTRL-W ] 用新窗口打开并查看光标下符号的定义,或者 CTRL-W } 使用 preview 窗口预览光标下符号的定义。

我自己还写过不少关于 ctags 的 vimscript,例如在最下面命令行显示函数的原型而不用急着跳转,或者重复按 ALT+; 在 preview 窗口中轮流查看多个定义,不切走当前窗口,不会出一个很长的列表让你选择,有兴趣可以刨我的 vim dotfiles

编译运行

再 Vim 8 以前,编译和运行程序要么就让 vim 傻等着结束,不能做其他事情,要么切到一个新的终端下面去单独运行编译命令和执行命令,要么开个 tmux 左右切换。如今新版本的异步模式可以让这个流程更加简化,这里我们使用 AsyncRun 插件,简单设置下:

Plug 'skywind3000/asyncrun.vim'

" 自动打开 quickfix window ,高度为 6
let g:asyncrun_open = 6

" 任务结束时候响铃提醒
let g:asyncrun_bell = 1

" 设置 F10 打开/关闭 Quickfix 窗口
nnoremap <F10> :call asyncrun#quickfix_toggle(6)<cr>

该插件可以在后台运行 shell 命令,并且把结果输出到 quickfix 窗口:

最简单的编译单个文件,和 sublime 的默认 build system 差不多,我们定义 F9 为编译单文件:

Read more…

Categories: 随笔 Tags:
Wordpress Social Share Plugin powered by Ultimatelysocial