在Vim中运行Python代码

时间:2013-09-22 20:35:08

标签: python vim

我正在使用Vim编写Python代码,每次我想运行我的代码时,我都会在Vim中输入:

:w !python

这令人沮丧,所以我一直在寻找一种更快的方法来在Vim中运行Python代码。从终端执行Python脚本可能吗? 我正在使用Linux。

23 个答案:

答案 0 :(得分:106)

autocmd时添加FileType python如何创建映射:

nnoremap <buffer> <F9> :exec '!python' shellescape(@%, 1)<cr>

然后您可以按<F9>python

执行当前缓冲区

答案 1 :(得分:22)

我的.vimrc文件中有这个:

imap <F5> <Esc>:w<CR>:!clear;python %<CR>

当我完成编辑Python脚本时,我只需按<F5>。保存脚本,然后在空白屏幕中执行。

答案 2 :(得分:12)

我更喜欢将Python输出重定向到新的Vim窗口(如果该窗口保持打开状态,则在下次使用此函数执行Python代码时更新其内容):

" Bind F5 to save file if modified and execute python script in a buffer.
nnoremap <silent> <F5> :call SaveAndExecutePython()<CR>
vnoremap <silent> <F5> :<C-u>call SaveAndExecutePython()<CR>

function! SaveAndExecutePython()
    " SOURCE [reusable window]: https://github.com/fatih/vim-go/blob/master/autoload/go/ui.vim

    " save and reload current file
    silent execute "update | edit"

    " get file path of current file
    let s:current_buffer_file_path = expand("%")

    let s:output_buffer_name = "Python"
    let s:output_buffer_filetype = "output"

    " reuse existing buffer window if it exists otherwise create a new one
    if !exists("s:buf_nr") || !bufexists(s:buf_nr)
        silent execute 'botright new ' . s:output_buffer_name
        let s:buf_nr = bufnr('%')
    elseif bufwinnr(s:buf_nr) == -1
        silent execute 'botright new'
        silent execute s:buf_nr . 'buffer'
    elseif bufwinnr(s:buf_nr) != bufwinnr('%')
        silent execute bufwinnr(s:buf_nr) . 'wincmd w'
    endif

    silent execute "setlocal filetype=" . s:output_buffer_filetype
    setlocal bufhidden=delete
    setlocal buftype=nofile
    setlocal noswapfile
    setlocal nobuflisted
    setlocal winfixheight
    setlocal cursorline " make it easy to distinguish
    setlocal nonumber
    setlocal norelativenumber
    setlocal showbreak=""

    " clear the buffer
    setlocal noreadonly
    setlocal modifiable
    %delete _

    " add the console output
    silent execute ".!python " . shellescape(s:current_buffer_file_path, 1)

    " resize window to content length
    " Note: This is annoying because if you print a lot of lines then your code buffer is forced to a height of one line every time you run this function.
    "       However without this line the buffer starts off as a default size and if you resize the buffer then it keeps that custom size after repeated runs of this function.
    "       But if you close the output buffer then it returns to using the default size when its recreated
    "execute 'resize' . line('$')

    " make the buffer non modifiable
    setlocal readonly
    setlocal nomodifiable
endfunction

答案 3 :(得分:10)

只需按<esc>进入普通模式并输入:

! clear; python %

enter image description here

  

分步说明:

     

!允许您运行终端命令

     

clear将清空您的终端屏幕

     

;结束第一个命令,允许您引入第二个命令

     

python将使用python运行脚本(可以将其替换为   例如ruby

     

%合并当前文件名,并将其作为参数传递给   python命令

答案 4 :(得分:5)

基于先前的答案,如果您希望在查看代码输出时看到代码,则可以发现:ter:terminal)命令很有用。

autocmd Filetype python nnoremap <buffer> <F5> :w<CR>:ter python2 "%"<CR>
autocmd Filetype python nnoremap <buffer> <F6> :w<CR>:vert ter python3 "%"<CR>

在第二行中使用vert以垂直拆分而不是水平的方式运行代码。

它的负面影响是,如果不关闭代码运行所在的拆分窗口,则在多次运行后您将有很多拆分(在原始python IDLE中不会发生,重复使用相同的输出窗口)。

(我将这些行保留在/home/user/.vimrc中)

答案 5 :(得分:4)

请记住,您可以使用@:重复上次使用的命令,因此您需要重复的是这两个字符。

或者您可以将字符串w !python保存到其中一个寄存器中(例如"a),然后点击:<C-R>a<CR>将寄存器a的内容插入到命令行并运行它。

或者您可以执行我的操作并将<leader>z映射到:!python %<CR>以运行当前文件。

答案 6 :(得分:3)

插件:jupyter-vim

因此,您可以向正在运行的<leader>E(替换<leader>e)发送行(jupyter-client),视觉选择(ipython

enter image description here

我更喜欢将编辑器和解释器分开(每个都在其外壳中)。想象一下,您发送了错误的输入阅读命令...

答案 7 :(得分:2)

如果您不希望每次都看到“:exec python file.py”,请使用:

nnoremap <F9> :echo system('python2 "' . expand('%') . '"')<cr>
nnoremap <F10> :echo system('python3 "' . expand('%') . '"')<cr>

它也没有弄乱我的powerline / vim-airline状态栏。

答案 8 :(得分:2)

我用

:! [filename.py]; python %

那是对我有用的

答案 9 :(得分:2)

可接受的答案对我有效(在Linux上),但是我希望此命令在运行之前也可以保存缓冲区,因此我对其进行了一些修改:

nnoremap <buffer> <F9> :w <bar> :exec '!python' shellescape(@%, 1)<cr>

:w <bar>保存缓冲区,然后在其中运行代码。

答案 10 :(得分:1)

对于泛型使用(基于filetype从vim运行python / haskell / ruby​​ / C ++ ...),有一个很好的插件叫vim-quickrun。它默认支持许多编程语言。它也很容易配置,因此可以根据需要为任何文件类型定义首选行为。 github repo没有花哨的自述文件,但doc文件中有详细记录。

答案 11 :(得分:1)

我在.vimrc上有这个:

"map <F9> :w<CR>:!python %<CR>"

保存当前缓冲区并执行仅使用Esc + F9

的代码

答案 12 :(得分:1)

如果您想快速跳回:w命令,最好输入:w,然后按向上箭头。它只会循环显示以w开头的命令。

答案 13 :(得分:1)

一种简单的方法是在正常模式下键入:,然后按键盘上的向上箭头键并按Enter键。这将重复VIM上最后输入的命令。

答案 14 :(得分:1)

您也可以使用skywind3000/asyncrun.vim。它类似于@FocusedWolf列出的内容。

答案 15 :(得分:0)

  1. 转到您的主目录。 cd
  2. 使用vim打开.vimrc文件。 vim .vimrc
  3. 将下一个代码添加到文件中。 nmap <F4> <Esc>:w<CR>:!clear;python %<CR>
  4. 保存并退出。 ZZ

下次要运行代码时,只需在“正常模式”下按F4。如果要在“插入模式”下运行代码,请将nmap替换为imap

答案 16 :(得分:0)

考虑使用shebang行,这样您就可以使用任何语言,而不仅限于Python。

添加shebang:

将此添加到脚本的第一行:

#!/usr/bin/env python3

或者这,如果您使用的是Python 2:

#!/usr/bin/env python2

Vim键映射:

将此添加到您的~/.vimrc

nmap <F7> :w<cr>:!clear;"%:p"<cr>

使文件可执行:

输入Vim:

:!chmod +x %

或在终端机中

chmod +x script_name.py

说明:

在正常模式下按F7时,Vim会尝试将当前文件作为bash脚本执行。然后,bash解释器将看到shebang行并了解该文件应传递给Python(或在需要时传递给其他程序)。

此外,您将能够使用其名称从终端运行脚本:

./script_name.py

代替这种方式(也可以):

python3 script_name.py

答案 17 :(得分:0)

你有没有试过只使用:

:!python nameofyourfile.py

示例:https://www.youtube.com/watch?v=mjUxEX4OssM

这可能只是您的语法,也可能是您缺少其他人使用过的插件或软件包。您是使用普通终端还是其他类似 MobaXterm 的终端? 上面的代码适用于在 vim 中使用终端运行 python 脚本(输出将显示在 vim 会话中)。

答案 18 :(得分:0)

您可以使用augroup命令通过1个键盘绑定扩展到任何语言,例如:

augroup rungroup
    autocmd!
    autocmd BufRead,BufNewFile *.go nnoremap <F5> :exec '!go run' shellescape(@%, 1)<cr>
    autocmd BufRead,BufNewFile *.py nnoremap <F5> :exec '!python' shellescape(@%, 1)<cr>
augroup END

答案 19 :(得分:0)

" run current python file to new buffer
function! RunPython()
    let s:current_file = expand("%")
    enew|silent execute ".!python " . shellescape(s:current_file, 1)
    setlocal buftype=nofile bufhidden=wipe noswapfile nowrap
    setlocal nobuflisted
endfunction
autocmd FileType python nnoremap <Leader>c :call RunPython()<CR>

答案 20 :(得分:0)

不要将命令映射放在.vimrc中,而是将映射放在~/.vim/ftplugin/python.vim文件中(Windows $HOME\vimfiles\ftplugin\python.vim)。如果您没有此文件或目录,只需制作它们即可。这样,只有在打开.py文件或任何带有filetype=python的文件时才会映射密钥,因为您只会在Python脚本上运行此命令。

对于实际的映射,我希望能够在脚本运行时在Vim中进行编辑。关于@cazyas的回答,我在ftplugin\python.vim(Windows)中有以下内容:

noremap <F5> <Esc>:w<CR>:!START /B python %<CR>

这将在后台运行当前的Python脚本。对于Linux,只需将其更改为:

noremap <F5> <Esc>:w<CR>:!python % &<CR>

答案 21 :(得分:0)

这个.vimrc映射需要Conque Shell,但它复制了Geany(和其他X编辑器)的行为:

  • 按键执行
  • 执行gnome-terminal
  • 等待确认退出
  • 窗口在退出时自动关闭

    :let dummy = conque_term#subprocess('gnome-terminal -e "bash -c \"python ' . expand("%") . '; answer=\\\"z\\\"; while [ $answer != \\\"q\\\" ]; do printf \\\"\nexited with code $?, press (q) to quit: \\\"; read -n 1 answer; done; \" "')

答案 22 :(得分:-1)

将光标放在某处的代码中。右键单击并选择“选择”选项之一以突出显示您的代码。然后按Ctrl:,您将看到新提示“&lt ;,&gt;”

现在输入!python并查看是否有效。

我只是花了几天时间试图弄清楚同样的问题!我用了编码:

s='My name'
print (s) 

在我拔掉所有头发之后,我终于把它弄好了!