tmux、vim和系统剪切板公用问题

vim的剪切板和系统公用问题一直是一大痛点,粘贴少数文本的时候尚可,但是剪切带有换行的时候就完全乱了,下一行总是比上一行多缩进一次。对于我这种主要用python的人来说,这简直太难受了。之前我一直忍着,今天实在忍不了了,想找个方案解决这个问题,单最终还是没解决。

其实vim可以将文本剪切/粘贴自寄存器的,有一个"寄存器就和系统是公用的。在系统看vim --version是不是支持clipboard,如果没有的话,可以按照这里加上--with-clipboadrd重新编译一下vim。

我重新编译之后,发现clipboard那里已经是+了,但是发现还是不能粘贴到系统剪切板。才发现vim直接在终端模拟器下(比如我用的ITerm2)是支持的,但是在tmux下是不支持和系统剪切板公用的(发现tmux有很多不支持的地方,比如brew service)。查了一下,tmux也维护着一个剪切板(卧槽,幸亏iTerm2没有自己的剪切板),那么如果要实现vim到系统剪切板复制粘贴,要将vim和系统的剪切板通过tmux共享……

查了一下,发现这个插件:https://github.com/roxma/vim-tmux-clipboard但是尝试安装了,发现没啥用。


解决方案:

从终端向系统粘贴:在vim中是可以使用tmux进行剪切的(但可能会连行号一起剪切了,可以使用块剪切解决,不是大问题)。所以只要解决从终端向外剪切这个问题就好了。解决方案是写一个tmux脚本将tmux的buffer同步到系统的剪切buffer中,具体可以看这个commit。这个脚本用到了一个同步tmux和系统buffer的软件,安装方法:brew install reattach-to-user-namespace.

从系统向终端粘贴:粘贴到tmux没问题,但是粘贴到vim就可能出现下一行比上一行多缩进的情况。这是因为vim在下一行自动给你按照上一行缩进了。解决方法是粘贴的时候临时关闭这种缩进,使用vim命令: set paste


关于未解决的问题:


博客有一个分类是记录未解决的问题的,比如此文。但是发现这样管理不太好。所以打算换一个方案,在github上开了一个项目,只使用issue记录目前生活、编程等各方面未找到合适的解决方法的问题,等issue解决的话就关闭。如果值得分享的话再写一篇博文。

参考资料:

  1. http://harttle.com/2017/06/23/vim-tmux-clipboard.html
  2. http://foocoder.com/2013/07/28/zhong-duan-huan-jing-zhi-tmux/
  3. 终端环境之tmux
 

最近写程序的心得

最近更博客不频繁了,因为拿到毕业证之后可以安心写程序,不用操心别的事情了,所以感觉也懒惰了许多。书也没咋看,电影也没咋看,甚至游戏都不怎么玩了,今天才更新了守望先锋。

拿到毕业证之后入职,公司配了2015early版本macbook pro,8G/128G。感觉这电脑好漂亮啊,虽然比我的2013air是重了很多,但是屏幕的黑色边框,侧边的散热口,好像一体都是浑然天成的,也没有过时的感觉(当然我肯定也更喜欢最新款的mac啦)。缺点就是耗电太快了,和我的macbook air同样的使用,续航却比不过用了四年的老air,不过对我来说不是什么大问题,随处可以充电。另外值得一说的就是Retina显示屏,感觉打开了新世界的大门,网页上的任何东西都变漂亮了。不过终端上字体太锐利反而不怎么适用了。编程的显示还是不用太高的分辨率,因为来来回回也就是26个字母的显示。

最近在工作中有很多心得,第一个就是,实践才是检验真理的唯一标准。很多东西不太容易记,比如说python re的group,groups,每次用到都去查。有一次我有个东西也是不太确定,就问同事,同事说,你自己试试不就知道了。我一想也是。其实自己打开交互式终端测试一下也花不了太长时间,从网页上看到的知识,都是自己没检验过的,印象也不深刻,要说自己不尝试就完全理解,其实很难。当然,不看书和网页也不合适,书是一个总结、系统的过程,比如说你去看一个新的框架或者工具,一开始就自己尝试肯定不行,就像掉进大海一样,这时候如果稍微看看书肯定有“哦原来这个功能已经有一个专门的接口来实现了”的感觉。哎,说了这么多感觉和没说一样,就是“学而不思则罔、思而不学则怠”这个道理吧。

然后是,不要重复做事情。勤快的程序员不是好程序员。比如说吧,之前经常要做这样的事情,提交PR,然后别人提了意见,一般是通过amend再次commit的:

所以就把上面写成一个git命令,然后以后都用一条命令提交就行了。但是这个-A太危险了,又一次我把..DS_Store提交上去了,太丢人了呵呵。最近经常做的一件事就是对自己的pypi打包新版本,这就更复杂了,编辑版本号,打tag,push,upload,写了这个脚本来自动化。不过后来赵老师推荐了这个工具,也蛮好的。

说道赵老师,这是一个疯狂收藏东西的人。自动关注他之后,每天github都被刷屏。赵老师吐槽,自己的chrome如果不小心把鼠标移动到书签上,电脑就死机了,因为自己的书签太多了,内存爆炸,都显示不过来,不过后来赵老师申请了另一个google账户,重新开始chrome。

跑题了,回头说第三个心得。我发现大的项目测试有点麻烦,依赖太多了,任务队列、缓存、数据库等,所以尽量少测试几次效率就变高了。之前我写代码都很鲁莽,抱着一种“试一试吧,不行再改”的态度。估计得改改,尽量一次就写对,减少测试的次数,而且吧,这测试的一多了,人就变得不快乐了,不耐烦了。

就先写这么多吧,周末了,最近上海太热了,快四十度了,在家里打打游戏,看看书。

 

大学与腐朽

最近有些事还是不吐不快,东华大学的行政部门实在太糟糕了,简直是中国行政状况的一个缩影。

昨天回学校领取毕业证书,将近40摄氏度的天气。下了公交车之后,打算骑摩拜单车去学院楼拿,结果骑到校门口,门卫说,“摩拜单车不让进学校”。我问,“为什么?”门卫一脸很屌的样子说,“你去保卫处问领导吧。”

从我进入这个学校的第一天起,上到领导,中到某些老师,下到小保安,都觉得自己很屌的样子。

  • “学院就是这么规定的,不行就是不行。”
  • “这是学院经过研究决定的。”
  • “不行,这是规定。”

只要在东华大学这片土地上办事,你就能经常听到一些这样的话。

教务处是个典型中的典型。我就碰到过。有一次有一门课我已经修完了,但是教务系统上竟然显示我没选课。室友告诉我,他也遇到过,其实就是教务处动动鼠标就可以解决的事情,但是他们非得说改不了,死活不改,弄半天才给你办。结果我去了,还真是这样,学院教务处来来回回跑了好几趟才给解决。后来又有个同学遇到了和我一样的情况,跟我咨询怎么解决。还能怎么解决?去看教务处的老爷们的脸色吧。

最近听朋友说了一件事,她有个同学要出国了,但是教务处出了问题,要9月份才给她发毕业证。她妈后来在教务处来着死活不走,最后教务处才给办了的。我一点都不奇怪,这狗屎的部门即使他的权力不会给自己来带任何好处他们都得想办法用一用,不然整日在糜烂的办公室里等死实在太无聊。

还有种种很多事情,我很庆幸回学校是领毕业证,而且以后再也不用回来了。

比起国外的大学,他们校内的工作人员一言一行都表现出服务于学生的态度。虽然办起事来也一丝不苟,但是会热心地告诉你需要哪些文件,指导你去做。不像国内的这些蠢猪,只会摆架子。

在国外的时候,有拥有实质权力的学生组织,开学有足够的经费去举行破冰活动等,学校把学生当做学生的主体。而国内,学生会完全是学校的傀儡,老师和行政人员最喜欢摆架子,“规定”就是圣经,学校的目的不是传道授业解惑,而是不让学校里的这些猪丢了饭碗。

大学里唯一有价值的是真正有学术精神的老师,图书馆的资源,志同道合的同学聚到一起。其他的都是累赘。

 

Vim使用正则表达式搜索和替换

简单替换表达式


:[range]s/from/to/[flags]

  • range:搜索范围,如果没有指定范围,则作用于但前行。
    1. :1,10s/from/to/ 表示在第1到第10行(包含第1,第10行)之间搜索替换;
    2. :10s/from/to/ 表示只在第10行搜索替换;
    3. :%s/from/to/ 表示在所有行中搜索替换;
    4. 1,$s/from/to/ 同上。
  • flags 有如下四个选项:
    1. c confirm,每次替换前询问;
    2. e error, 不显示错误;
    3. g globle,不询问,整行替换。如果不加g选项,则只替换每行的第一个匹配到的字符串;
    4. i ignore,忽略大小写。

    这些选项可以合并使用,如cgi表示不区分大小写,整行替换,替换前询问。

正则表达式

  1. 元字符
    • 元字符
      元字符 说明
      . 匹配任意字符
      [abc] 匹配方括号中的任意一个字符,可用-表示字符范围。如[a-z0-9]匹配小写字母和数字
      [^abc] 匹配除方括号中字符之外的任意字符
      \d 匹配阿拉伯数字,等同于[0-9]
      \D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]
      \x 匹配十六进制数字,等同于[0-9A-Fa-f]
      \X 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]
      \l 匹配[a-z]
      \L 匹配[^a-z]
      \u 匹配[A-Z]
      \U 匹配[^A-Z]
      \w 匹配单词字母,等同于[0-9A-Za-z_]
      \W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]
      \t 匹配<TAB>字符
      \s 匹配空白字符,等同于[\t]
      \S 匹配非空白字符,等同于[^\t]

       

    • 一些普通字符需转意
      元字符 说明
      \* 匹配* 字符
      . 匹配. 字符
      \/ 匹配 / 字符
      \ 匹配 \ 字符
      \[ 匹配 [ 字符
      \] 匹配 ] 字符

       

    • 表示数量的元字符
      元字符 说明
      * 匹配0-任意个
      \+ 匹配1-任意个
      \? 匹配0-1个
      \{n,m} 匹配n-m个
      \{n} 匹配n个
      \{n,} 匹配n-任意个
      \{,m} 匹配0-m个

       

    • 表示位置的元字符
      元字符 说明
      $ 匹配行尾
      ^ 匹配行首
      \< 匹配单词词首
      \> 匹配单词词尾

       

  2. 替换变量在正则式中以\(\)括起来的正则表达式,在后面使用的时候可以用\1\2等变量来访问\(\)中的内容。

例子

  1. 删除行尾空格::%s/\s+$//g
  2. 删除行首多余空格:%s/^\s*// 或者 %s/^ *//
  3. 删除沒有內容的空行:%s/^$// 或者 g/^$/d
  4. 删除包含有空格组成的空行:%s/^\s*$// 或者 g/^\s*$/d
  5. 删除以空格或TAB开头到结尾的空行:%s/^[ |\t]*$// 或者 g/^[ |\t]*$/d
  6. 把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以有下列写法

全文基本完全转载自:http://tanqisen.github.io/blog/2013/01/13/vim-search-replace-regex/

以后有关vim搜索和替换的内容会在这里更新。

 

自定义git命令

我每天要用git敲很多命令,其中很多是重复了同样的流程。比如上班来到公司,先checkout到master,pull下来,checkout到自己的分支,rebase一下,以保证和master同步。我很懒,每天上班都在各种找办法偷懒,今天学到一招,可以自定义git命令。

自定义一个命令分三步:

  • 写一个脚本,放到PATH的路径下,脚本名字是git-command
  • 编辑脚本
  • 增加执行权限

下面举一个例子。我经常要做的操作是,提了一个PR,然后测试,review出现问题,改一下自己的commit,再提交一下。对于flake8和lint错误,一般用ammend,流程如下:

第一步。通过echo $PATH命令可以看你的执行路径,这里以/usr/bin为例。(其实更好的方法是将用户命令和系统命令分开,我的自定义脚本路径是~/bin/。)

第二步,在脚本写以下内容,保存退出。(脚本也支持python ruby等)

第三步,增加执行权限。

完成,现在修改一些小问题,我们可以直接修改之后使用git cmd命令推送更新了。(注意这个命令用到-f推送所以有点危险不建议学我)

另外还有一个偷懒的办法是alias。这里的alias不需要使用shell的,git提供了这个feature。直接在~/.gitconfig路径下对git的子命令进行alias即可。如下面这个.gitconfig文件所示: