用 Vim 写 Python 的最佳实践 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
simple26
V2EX    Vim

用 Vim 写 Python 的最佳实践

  •  6
     
  •   simple26 2017-01-27 07:40:23 +08:00 18022 次点击
    这是一个创建于 3203 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先来晒个图:

    这里写图片描述

    对于一 Python 的小项目,使用 vim 是一个不错的选择。下面的整理自在知乎的回答 用 Vim 写 Python 的最佳实践是什么?,比原来的回答多加了一点点内容。

    下面的内容是对知乎旧有回答的一个补充,尤其有一些主要针对 vim8. 如果想要查看更多内容,可以查看知乎对于该问题的其它一些回答。

    语法检查

    如果用 vim8, 那么可以用异步检测的 w0rp/ale 代替 syntastic 了,再也不用羡慕 flycheck, 也不用因为语法检查而卡顿了。

    关于 ale 这部分的个性化配置,其实有点 “吹毛求疵”,一般使用默认的应该就够了,不过我喜欢 fancy 的东西,就折腾了一把。涉及的东西可能比较细枝末节,可以直接看 space-vim: syntax-checking 了解一下大概的配置 。主要是针对 ale 提供的 statusline 内容进行再提取进行展示。如果没有语法错误就不显示在 statusline, 如果有 warning 或 error, 则通过不同颜色就行区分。

    这里写图片描述

    而关于侧边的 warning 或 error sign, 我喜欢干净一点,用前景色区分就好,下面这样有时候会像一块块的补丁贴在上面,觉得不太好看。

    这里写图片描述

    这里写图片描述

    syntax 增强

    vim 自带对于 python 的高亮有点弱,连 self 都不给我亮起来, 这一点可以通过 python-mode/python-mode 来进行增强:

    hi pythonSelf ctermfg=174 guifg=#6094DB cterm=bold gui=bold 

    具体可以看这里 space-vim: python layer

    在 python-mode 的 syntax/python.vim 里,可以看到比 vim 自带的 syntax/python.vim 更加细致的高亮群组,应该不难看懂各项内容,照着颜色表自行修改高亮风格就可以了。这是 terminal 256 色对照表 256 Terminal colors and their 24bit equivalent (or similar), 这是 GUI 颜色对照表 Complete HTML True Color Chart

    这么做的优点自然是想要什么效果完全可自定义,但是也有缺点,因为可能没办法适配所有的 vim 主题。当你切换主题时,这些针对 python 自定义的高亮也许会有些不太契合。就算是只算流行的那些 vim 主题,恐怕也有两位数了,有些是冷色调,有些是暖色调,有些以蓝色为主,有些是红色居多,应该不太容易找一些百搭的配色。不过每个人所中意的主题可能也就是那么几个,所以自行选择吧.....

    其实 python-mode 有点集大成的意思,囊括了用 vim 写 python 的很多功能,有兴趣的可以尝试靠它 “一招打遍天下”。不过,目前我只是中意这一部分而已。

    代码格式化

    这一点可以通过 google/yapf 来完成,安装好 yapf, 像下面这样 <LocalLeader>= 就能对当前文件进行格式化:

     autocmd FileType python nnoremap <LocalLeader>= :0,$!yapf<CR> 

    自动补全

    这一点因为我主要还是使用 vim , 因此用的 YouCompleteMe, 实际后端用的是已经提到的 jedi-vim. 如果不喜欢 ycmd, 使用 neovim 的可以尝试使用 deoplete.nvim .

    import 整理

    各种 import 是不是显得有点乱?使用 timothycrosley/isort 整理一下吧:

    autocmd FileType python nnoremap <LocalLeader>i :!isort %<CR><CR> 

    一键运行

    这个可以通过 skywind3000/asyncrun.vim 来增强, 把之前的 ! 换成 AsyncRun! 就好了. 其实还是有些小小的注意点:

    很多人的一键运行可能大概长这样:

    ... exec "!g++ % -o %<" exec "!time ./%<" ... 

    可以直接把上面的 ! 换成 AsyncRun! 吗?答案是不可以,如果要达到之前的效果,应该要这样:

    exec "AsyncRun! g++ -stdc++11 % -o %<; time ./%<" 

    要用分号链接多条命令( linux )或者 & 链接多条命令( windows ),具体可以看 这里

    具体的 vim 配置在这里: space-vim (觉得不错的话可以顺便到 github 点个 star 支持下哈), 启用 ycmd, syntax-checking, programming, python Layer 就能达到上面的效果了。

    第 1 条附言    2017-01-28 06:38:12 +08:00
    大家新年快乐!
    第 2 条附言    2017-01-28 13:34:36 +08:00
    大家果然都是默默点收藏...
    第 3 条附言    2017-02-01 13:15:22 +08:00
    骗 star 还是要靠老外... https://news.ycombinator.com/item?id=13537515
    62 条回复    2019-10-16 09:30:16 +08:00
    rashawn
        1
    rashawn  
       2017-01-27 08:07:41 +08:00 via iPhone
    开 2M 文件需要几秒
    simple26
        2
    simple26  
    OP
       2017-01-27 08:20:23 +08:00
    @rashawn 没试过 关于启动优化 你可以请教 @chemzqm 这是他写的 vim 启动优化经验 https://zhuanlan.zhihu.com/p/24484514
    rashawn
        3
    rashawn  
       2017-01-27 08:37:48 +08:00 via iPhone
    @simple26 他说的是启动优化 我说的是打开一个新的大文件的时间
    simple26
        4
    simple26  
    OP
       2017-01-27 08:48:37 +08:00
    @rashawn 额 我想这两个具有一定的相关性 如果你的启动时间都达到 1 秒的话 打开大文件必然会更久

    打开不同的 2 M 文件也会有很多差别 比如是否有 syntax 高亮等等 我刚刚试了一下打开 35 M 的 pdf 不过才 1 秒 要知道有时候针对一些源文件即使 十几 k 可能都快 1 秒了
    simple26
        5
    simple26  
    OP
       2017-01-27 08:56:43 +08:00
    @rashawn 如果觉得你的 vim 打开某些大文件有点慢 你应该向他学习具体定位到时什么原因导致的打开如此缓慢 再进一步针对性地调优
    wyfyw
        6
    wyfyw  
       2017-01-27 09:00:59 +08:00
    你的第一个截图很好看,哈哈。
    simple26
        7
    simple26  
    OP
       2017-01-27 09:09:05 +08:00
    @wyfyw 不 是都很好看哈哈哈 (看脸的时代不解释)
    congeec
        8
    congeec  
       2017-01-27 09:42:05 +08:00
    neomake 代替 ale 和 AsyncRun

    @rashawn 跟文件类型和与文件类型相关的配置有关,基本上都是秒开
    20015jjw
        9
    20015jjw  
       2017-01-27 10:02:35 +08:00 via Android
    很棒 学习一波
    rashawn
        10
    rashawn  
       2017-01-27 10:11:03 +08:00 via iPhone
    我是觉得加了 pythonmode 以后 2M 肯定不能秒开
    simple26
        11
    simple26  
    OP
       2017-01-27 10:32:18 +08:00
    @congeec 目前我还是喜欢 ale 和 AsyncRun
    simple26
        12
    simple26  
    OP
       2017-01-27 10:34:35 +08:00
    @rashawn 2 M 的 python 文件真的没试过 一般大小的 python 都是秒开

    如果它真的会导致缓慢 可以考虑单独把 syntax/python.vim 抽离出来 如果我也只是喜欢这个部分而已
    matrix67
        13
    matrix67  
       2017-01-27 10:45:48 +08:00
    matrix67
        14
    matrix67  
       2017-01-27 10:47:15 +08:00
    重构没有好方法啊
    simple26
        15
    simple26  
    OP
       2017-01-27 11:00:05 +08:00
    @matrix67 我老实交代:都是写的小东西,还没有大规模的重构过

    如果以后真的有重构这个需求,个人觉得我会选择 IDE 而不是 vim 。我是一个没有 “信仰” 的人,针对特定的场景选择自己觉得最合适的工具才是上策。
    congeec
        16
    congeec  
       2017-01-27 11:22:57 +08:00 via iPhone
    @matrix67 pymode 可以重构,这货以来 rope. Jedi 的重构功能连 alpha 都算不上。 so ,重构总的来说不好用, debug 也被 IDE 完爆。这就是只用 vim 的缺陷
    ispinfx
        17
    ispinfx  
       2017-01-27 11:44:49 +08:00
    字体?
    clavichord93
        18
    clavichord93  
       2017-01-27 11:47:12 +08:00 via iPhone
    改行号是什么插件?
    simple26
        19
    simple26  
    OP
       2017-01-27 11:49:18 +08:00
    @ispinfx Source Code Pro for Powerline
    simple26
        20
    simple26  
    OP
       2017-01-27 11:50:40 +08:00   1
    @clavichord93 哪里有改行号?如果你其实指的是相对行号的话 set relativenumber
    zgqq
        21
    zgqq  
       2017-01-27 11:57:26 +08:00 via Android
    @congeec vim 没法跟 ide 比, ide 重构实在太强大,但是 vim 改配置可以秒杀一切
    lcdtyph
        22
    lcdtyph  
       2017-01-27 11:57:33 +08:00 via Android
    您的 ycm 怎么配置的呀,为什么我的补全框只有 id ,没有后面的 function 什么的
    clavichord93
        23
    clavichord93  
       2017-01-27 12:00:53 +08:00 via iPhone
    @simple26 哦哦哦,真棒!
    simple26
        24
    simple26  
    OP
       2017-01-27 12:02:03 +08:00
    @lcdtyph 应该没什么两样 可以看一下这里 mac: https://github.com/liuchengxu/space-vim/issues/50 ubuntu 16.04 : https://github.com/liuchengxu/space-vim/blob/master/layers/%2Btools/ycmd/EADME.md#install-notification

    你成功编译 YCM 后 应该就都是一样的了
    lcdtyph
        25
    lcdtyph  
       2017-01-27 12:06:20 +08:00 via Android
    @simple26 感谢,等有电脑我试试
    param
        26
    param  
       2017-01-27 13:32:51 +08:00 via Android
    配色好看
    simple26
        27
    simple26  
    OP
       2017-01-27 13:44:38 +08:00
    @param 有品位 哈哈 ^_^
    clavichord93
        28
    clavichord93  
       2017-01-27 16:44:45 +08:00 via iPhone
    @simple26 还有你这是 macvim 吗?怎么把标签页隐藏的?
    simple26
        29
    simple26  
    OP
       2017-01-27 16:48:50 +08:00
    @clavichord93 这是 iterm2 我很少用 macvim
    simple26
        30
    simple26  
    OP
       2017-01-27 16:49:58 +08:00
    @clavichord93 macvim 对字体的渲染好像没有 terminal 的好看
    clavichord93
        31
    clavichord93  
       2017-01-27 16:54:34 +08:00
    @simple26 好吧。话说 iterm2 到底哪里比 terminal.app 好。。。
    simple26
        32
    simple26  
    OP
       2017-01-27 16:56:22 +08:00
    @clavichord93 自行体验
    Yc1992
        33
    Yc1992  
       2017-01-27 17:13:52 +08:00 via Android
    低配 spacemacs
    KentY
        34
    KentY  
       2017-01-27 17:21:48 +08:00
    @clavichord93 in my vimrc, I wrote this:

    set nu
    function! ToggleRelativeNumber()
    let &relativenumber = &relativenumber?0:1
    endfunction

    nnoremap <silent> <Leader>nu :call ToggleRelativeNumber()<cr>
    zhouquanbest
        35
    zhouquanbest  
       2017-01-27 17:46:09 +08:00
    这是什么主题呀 看起来不错
    simple26
        36
    simple26  
    OP
       2017-01-27 17:47:08 +08:00 via iPhone
    @Yc1992 没办法 就是喜欢 spacemacs 的调调
    simple26
        37
    simple26  
    OP
       2017-01-27 17:48:31 +08:00
    Ultraman
        38
    Ultraman  
       2017-01-27 17:55:40 +08:00 via Android
    试着用过 vim 结果个人不习惯搞得我都有心理阴影了不想看代码然后果断换回 sublime
    simple26
        39
    simple26  
    OP
       2017-01-27 17:59:44 +08:00
    @vcinex 都是个人选择而已 自己喜欢就好 什么舒服用什么 这年头工具不有的是~
    has
        40
    has  
       2017-01-27 18:25:58 +08:00
    自动补全功能触发候选列表后如何关闭?
    simple26
        41
    simple26  
    OP
       2017-01-27 18:46:55 +08:00
    @has keep typing 如果没有合适的候选项 继续输入就好了
    has
        42
    has  
       2017-01-27 18:51:50 +08:00
    @simple26 #41 假如我要按空格呢?默认会补全当前候选项
    假如我要换行呢?也是的
    simple26
        43
    simple26  
    OP
       2017-01-27 18:56:15 +08:00
    @has 那你可以看一下我的配置 具体我忘了 我的配置没有这个问题 按空格或换行 不会补全当前候选项
    congeec
        44
    congeec  
       2017-01-27 21:16:03 +08:00   1
    @has Ctrl-E
    4ever911
        45
    4ever911  
       2017-01-28 08:49:11 +08:00
    Fisa VIM + monokai 飘过
    simple26
        46
    simple26  
    OP
       2017-01-28 08:55:20 +08:00
    @4ever911 monokai 还是我说的那个问题 像贴"补丁" 影响视觉效果(当然 你也可以理解为更 “醒目”)
    simple26
        47
    simple26  
    OP
       2017-01-28 09:27:42 +08:00
    @4ever911 看了一下 感觉 Fisa 的作者应该有段时间没有更新了( Plug 'klen/python-mode' -> Plug 'python-mode/python-mode' )我对 python 的设置有更多内容 是他的超集 看了一圈没有学到什么新内容~
    junnplus
        48
    junnplus  
       2017-01-29 15:35:41 +08:00
    试用下 ale 插件,发现会有点问题?异步检测不错,但是在 save 的时候还会进行检测,而且表现和异步检测不一致?我配置了 python flack8_args 的 ignore 参数,在 save 的时候还会提醒
    simple26
        49
    simple26  
    OP
       2017-01-29 15:41:18 +08:00
    @junnplus

    你可以具体描述一下你的疑惑 我之前对 ale 也有一些误解

    python flack8_args 的 ignore 这个参数在哪里?是 ale 提供的?我没有用过...
    junnplus
        50
    junnplus  
       2017-01-29 15:51:33 +08:00
    @simple26 需求是:对某些 pep8 规范进行忽略,比如取消对超多 80 个字符的提醒(E501),
    在 syntastic 中的设置是这样的`let g:syntastic_python_flake8_args = '--ignore=E501'`
    我看了 ale 需要这样 let g:ale_python_flake8_args 可生效,但是生效是在异步检测, save 之后还会提醒
    simple26
        51
    simple26  
    OP
       2017-01-29 16:00:53 +08:00
    @junnplus 那么这个时候或许你该到 ale 提个 issue 问一下~ 如果真的是 ale 的问题 相信他会解决的
    Gem
        52
    Gem  
       2017-01-29 21:45:25 +08:00
    有没有配套的 iTerm2 theme?
    simple26
        53
    simple26  
    OP
       2017-01-29 22:38:20 +08:00
    @Gem https://github.com/nashamri/spacemacs-theme/issues/29 应该是有的 你可以看一下 我懒得去看了~
    simple26
        54
    simple26  
    OP
       2017-01-30 13:03:19 +08:00
    @clavichord93 https://alexpearce.me/2014/05/italics-in-iterm2-vim-tmux/ 这个点或许可以可以让你试一下 iTerm2 我也刚发现 感觉还不错
    clavichord93
        55
    clavichord93  
       2017-01-30 15:02:39 +08:00 via iPhone
    @simple26 试了一下,感觉 ctrl+d 已经足够让我换到 iterm2 了…
    lzhCoooder
        56
    lzhCoooder  
       2017-01-30 23:01:04 +08:00
    mark 一记,非常棒
    xuboying
        57
    xuboying  
       2017-01-31 01:18:47 +08:00 via Android   1
    @junnplus 直接写 dot flake8 的配置文件
    NoAnyLove
        58
    NoAnyLove  
       2017-01-31 06:19:53 +08:00
    直接晒我的配置文件吧。主要是针对 Python 的配置,本来还要支持 C 的,不过没时间弄完。 youcompleteme 的参数提示功能一直没有合并进主 repo 中。。。。。

    基本上就是:

    - 用 vim-plug 管理插件
    - 代码自动补完用 jedi-vim + ultisnips + youcompleteme 。 jedi-vim 好用比 ycm 的 jedi 后端好用,用 youcompleteme 可以把 jedi-vim 和 ultisnips 的候选一起显示。
    - 语法检查什么的也交给 youcompleteme 了
    - vim-autoformat 调用 yapf 进行代码格式化
    - nerdcommenter 注释功能
    - python-mode 一些细节化的支持。不过它自带的 rope 和语法检查什么的都关闭了
    - ctrlp.vim 好打开文件
    - etc.

    最后: C 的重构确实是个大问题啊
    NoAnyLove
        59
    NoAnyLove  
       2017-01-31 06:22:34 +08:00
    Betsy
        60
    Betsy  
       2017-02-06 21:56:32 +08:00
    我特别喜欢楼主配色中,侧边的 warning 或 error 标识,这部分能写在 vimrc 文件中吗?可以告诉我该怎么实现吗?
    djFFFFF
        61
    djFFFFF  
       2017-02-17 01:26:46 +08:00
    @Betsy
    hi ALEErrorSign ctermfg=197 ctermbg=NONE cterm=bold
    hi ALEWarningSign ctermfg=192 ctermbg=NONE cterm=bold
    hi SignColumn ctermfg=NONE ctermbg=NONE cterm=bold
    我在用的配色
    Jinhgg
        62
    Jinhgg  
       2019-10-16 09:30:16 +08:00 via Android
    不用插件才是最佳实践,频繁换开发环境安装插件太麻烦
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3025 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 12:57 PVG 20:57 LAX 04:57 JFK 07:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86