活在终端里的每一天

作者: 专拍到此一游 | 来源:发表于2016-06-02 17:19 被阅读2128次

    重回ubuntu,这次可以更主动,更成熟的享受全栈linux的工作状态,用了一段时间来折腾这几个软件,小有所成,提笔写篇文章记录一下过程. 我的终极目标是,全面启用VIM的键位和操作模式,拔掉鼠标,能像弹钢琴一样工作.

    为了达到这个目标,我这次主力配置了如下几个软件:

    1. 进化版bash--->zsh+oh-my-zsh
    2. bash的壳 ---> tmux
    3. 扔掉unity,改用平铺式窗口管理器--->awesomewm
    4. 扔掉IDE,改用强大得出乎意料的VIM
    5. 其余还有很多好玩的小软件,诸如ranger,xclip,scrot,guake等等,有空也写一下

    这一系列下来每个都有自己的配置文件,最现代化的办法应该是搞一个库专门来维护他们,以后升级电脑,换电脑直接从云端拉下来sh一下,一个一毛一样的世界就会重现在你面前,这几个东西我选择的标准基本都是1能否高度定制化(插件化,开源化)2能否配置使用vim模式的键位

    个人的配置库放在coding上,国内速度就是飞快

    1. 扔掉原装的bash,换上ZSH

    用过zsh后你就不会对系统中自带的终端有任何的留恋。没有见过zsh之前,我对linux的终端印象总是停留在rh9时代,tty上去,黑白两色。。。接触过了以后才知道这才是现代化的终端。。。大量的语法糖,超智能提示,超级美观的各种配色主题,开发活跃,大量插件。。。最要命的是,你一旦习惯了zsh给的糖,你就恨不得给你所有的服务器都搞一套。。。

    安装很简单,ubuntu16上apt里直接有,oh-my-zsh在github上,捡下来也可以一步安装:

    sudo apt-get install zsh -y #install zsh
    git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
    
    chsh -s /bin/zsh #将默认的shell切换成zsh
    

    重新登录后就可以使用zsh了,zsh使用rc作为配置模型,所以还需要创建一个~/.zshrc作为配置核心,这个文件在oh-my-zsh中提供有范例,里面有几个关键配置:

    # 使用的主题,主题位于~/.oh-my-zsh/themes下
    # 你把omz搞下来之所以花了那么久时间就是因为一野搞下来上百个主题。。。
    ZSH_THEME="lambda" 
    # 启用的插件,插件在omz/plugins目录下,有很多很神奇的插件,可以去官网探索一下
    plugins = (git)
    #zsh的alias也是亮点之一,比原生的alias强悍
    alias xclip='xclip -sel clip'  
    

    我填过的坑有:

    dir目录颜色丢失问题

    某些主题下目录是不带颜色的,对比过bashrc后重装了dircolors,解决了这个问题:

    git clone git://github.com/seebi/dircolors-solarized.git ~/dircolors-solarized
    cp ~/dircolors-solarized/dircolors.256dark ~/.dircolors
    eval 'dircolors .dircolors'
    

    接着将脚本同样写入到.zshrc里面:

    if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'
    
    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
    fi
    

    2. 装上tmux使你的终端更加强大

    tmux作为第二个出场的神器,也是我强力推荐的能显著提高生产力,增加bigger的好东西,主要出场场景有几个:

    1. 将大屏幕横着分竖着分成几个不同的区域,选项卡,提高工作效率
    2. 增加了session的概念,session可以持久化,第二天再开recover一下就回到昨天单记录点,如果装在服务器上,由于不关机,直接a一下就可以马上进入工作状态,还不怕掉线!
    3. 用在服务器上可以进行真正意义上的结对编程,多人可以同时ssh上去,然后attach到同一个session里,可以实现屏幕直播

    安装很简单,如果想要最新版本可以在github上面下,然后自己make一下,也很简单:

    sudo apt-get install tmux -y
    mkdir -p ~/.tmux
    git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
    

    tmux默认查找配置文件~/.tmux.conf,他官方提供了插件管理器,有几个强大的插件装了以后让你用得更舒服:

    set -g @plugin 'tmux-plugins/tpm'  #插件管理器
    set -g @plugin 'tmux-plugins/tmux-sensible'  #常用的高级设置
    set -g @plugin 'tmux-plugins/tmux-resurrect' #session持久化
    set -g @plugin 'tmux-plugins/tmux-pain-control' #vim模式的快捷键
    set -g @plugin 'tmux-plugins/tmux-prefix-highlight' #高亮按下前缀键
    

    tmux的快捷键很多,但都是有固定套路的,比如:

    prefix+| 将屏幕竖分为两半,同理横着就是prefix+-
    prefix+hjkl vim模式了,在各个不同的panel间移动
    prefix+c(create) 创建新的窗口,同理prefix+n(next)移动到下个窗口
    prefix+? 显示所有可用的快捷键
    

    我踩过的坑有:

    在tmux下使用vim,固定的配色会显示不正确

    这是因为tmux使用的颜色模式和原来的不一样,解决方法很简单启动tmux时使用

    alias tmux=`tmux -2`
    

    然后在tmux的配置文件中使用

    set -g default-terminal "screen-256color"
    

    3. 是时候改用awesomewm了,unity走开走开

    为了更好的使用awesomewm,我推荐你多来几个显示器,你会爽到飞起,唯一不舒服的就是,你又得再记7,8个快捷键。。。

    unity很华丽,但启动也不是一般的慢,而且实在没法做到全键盘操作,对于我等coder,华丽的界面虽然可以给你带来心灵的局部愉悦,但并不是我等的追踪的本意,是不?

    amesomewm意为平铺式窗口管理器 我原来在多个任务之间切换的时惯用虚拟桌面+alt/tab,任务一多加上坑爹的unity,实在让人抓狂,换用awesome后,手不用离开键盘,3个屏幕随意切换,再加上高度定制的配置文件,当你看明白后,可以定制里面的一切。简直就是coder式的窗口管理器!
    安装

    # awesome核心,扩展,屏保,gnome风格的窗口元素
    sudo apt-get install -y awesome awesome-extra xscreensaver gnome-settings-daemon
    

    安装很简单,注销后在登录界面可以选择使用awswome登录。配置很麻烦,因为这全套都是用lua撸出来的!包括每一个按钮,每一个函数。。。默认配置文件在~/.config/awesome/rc.lua,文件很长,我就不贴了,有兴趣的自己看我整理好的配置文件,全面定制过vim-style的快捷键:

    Mod+j/k: 在同一个屏幕中切换程序
    Mod+1/2/3:切换到当前屏幕的第N个虚拟桌面
    Ctrl+Mod+j/k:切换到下一个屏幕
    Mod+o:将当前的程序丢到另一个屏幕上显示
    

    我踩过的坑有:

    程序自启动问题

    程序自启动其实有两个点:

    1. x启动后但awesome没启动:这个点可以使用xinitrc和xprofile挂载窗口主题,屏保:
    #!/usr/bin/env bash
    gnome-settings-daemon &
    #网络管理程序
    # nm-applet &
    # 自动更新程序
    # update-notifier &
    # 屏保
    xscreensaver -nosplash &
    
    ln -sf ~/.confhub/awesomewm-config/config/xinitrc ~/.xinitrc
    ln -sf ~/.confhub/awesomewm-config/config/xinitrc ~/.xprofile
    
    1. awesome框架启动完成后,就可以使用rc.lua来加载常用程序了,记得要使用runonce来启动,容错率更高
    run_once("synapse")
    run_once("ss-qt5")
    run_once("fcitx-autostart")
    run_once("nm-applet")
    run_once("open-xscreen")
    

    4. VIM终于来了

    大神说的:世界上只有3种编辑器,VIM,Emacs,其他。。。


    大神又说:Emacs是编辑器中的神,而VIM是神的编辑器。。。

    我主要使用vim来进行nodejs和web相关的开发,vim完全可以胜任,下述的配置也是围绕这个展开,但如果你想使用vim来调试java的话,我个人感觉依然是idea+vim插件比较强势
    VIM是这堆东西里面最复杂的一个,我也留到最后再写,基本上vim一个插件就可以给你玩几天,更别提几十个插件了。。。

    所以我了解了规模以后,果断使用了github上面星最高的vim项目:·spf13,8000多颗星基于这个,移除了不用的插件,改成适合做web和nodejs开发的结构


    下面就是漫长的踩坑之旅:

    重新编译vim

    注意,ubuntu apt中的vim虽然已经是huge集了(除非你和我一样,直接使用ubuntu16,一步到位),但对于我们还是不适用,因为我们要使用YCM做语法完成和跳转,而YCM在我这里使用python2死活时不时有bug,而换成python3后就妥妥的,所以第一步就是要从source编译vim,加入python3,参考这个

    基于spf13开搞

    直接从git上拉下来,修改配置后就可以开始安装:

    git clone https://github.com/spf13/spf13-vim.git ~/.spf13-vim
    
    # 重新调整分组,去除php等我不需要的插件们
    ln -sf ~/.confhub/vim-config/vimrc.before.local ~/.vimrc.before.local
    # 额外装的插件
    ln -sf ~/.confhub/vim-config/vimrc.bundles.local ~/.vimrc.bundles.local
    # 自定义配置
    ln -sf ~/.confhub/vim-config/vimrc.local ~/.vimrc.local
    
    # 脚本会把插件全部拉下来,都在github上,很慢,要有耐心
    sh ~/.spf13-vim/bootstrap.sh
    # js的自动完成使用
    cd ~/.vim/bundle/YouCompleteMe && ./install.sh --tern-completer
    

    YCM很难整,js的语法提示部分使用的是ternjs,搞过了才知道原来很多编辑器里内带的js自动完成都是由ternjs完成的。安装编译过程可能会有很多问题,语法提示模式时YCM跟随VIM启动,然后YCM接管默认的提示模型,额外的js就去调用tern来完成提示。

    在项目的根目录放置一个.tern-project文件就可以实现完美的语法提示:

    {
        "libs": [
            "ecma6",
            "browser",
            "underscore",
            "jquery",
            "chai"
        ],
        "plugins": {
            "node": {}
        }
    }
    

    效果是这样:

    YCM的提示和系统的提示展开快捷键冲突

    这个问题纠结了很久,一直不知道是什么问题,后来在stackoverflow上发现了有人有类似的问题才反映过来:

    " fix the ycm and snippets bugs
    let g:UltiSnipsExpandTrigger = "<nop>"
    let g:ulti_expand_or_jump_res = 0
    function ExpandSnippetOrCarriageReturn()
        let snippet = UltiSnips#ExpandSnippetOrJump()
        if g:ulti_expand_or_jump_res > 0
            return snippet
        else
            return "\<CR>"
        endif
    endfunction
    inoremap <expr> <CR> pumvisible() ? "<C-R>=ExpandSnippetOrCarriageReturn()<CR>" : "\<CR>"
    

    spf13

    spf13已经是大而全的了,基本已经没啥需要改进单,为了工作方便额外,还装了如下这些插件方便js开发:

    Bundle 'mxw/vim-jsx'  #react jsx的格式化和语法高亮
    Bundle 'ternjs/tern_for_vim' #tern
    Bundle 'maksimr/vim-jsbeautify' #jsbeautify的vim接口
    Bundle 'sjl/gundo.vim' #历史记录时光机
    Bundle 'mustache/vim-mustache-handlebars' #handlebars模板高亮
    
    

    相关文章

      网友评论

      本文标题:活在终端里的每一天

      本文链接:https://www.haomeiwen.com/subject/dmiqrttx.html