V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
simple26
V2EX  ›  Vim

用 Vim 写 Python 的最佳实践

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

    先来晒个图:

    这里写图片描述

    对于一些 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/README.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   ·   实用小工具   ·   2415 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 15:48 · PVG 23:48 · LAX 07:48 · JFK 10:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.