在Vim中运行Python代码
我正在使用Vim编写Python代码,每次我想运行我的代码时,都在Vim中input:
:w !python
这让人感到沮丧,所以我正在寻找一种在Vim中运行Python代码的更快速的方法。 从terminal执行Python脚本可能? 我正在使用Linux。
如何添加一个autocmd
,当FileType python
,创build一个映射:
nnoremap <buffer> <F9> :exec '!python' shellescape(@%, 1)<cr>
那么你可以按<F9>
来用python
执行当前的缓冲区
我有这个在我的.vimrc文件中:
imap <F5> <Esc>:w<CR>:!clear;python %<CR>
当我完成编辑Python脚本时,只需按<F5>
。 脚本被保存,然后在黑屏中执行。
我更喜欢将Python输出redirect到一个新的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> :<Cu>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
请记住,您可以使用@:
来重复上次使用的命令,所以您需要重复的是这两个字符。
或者你可以将stringw !python
保存到一个寄存器中(例如"a
),然后点击:<CR>a<CR>
将寄存器a
的内容插入命令行并运行。
或者你可以做我所做的事情,并将<leader>z
映射到:!python %<CR>
来运行当前文件。
如果你不想看到每一次打印“ :exec python file.py
”,使用这个:
nnoremap <F9> :echo system('python2 "' . expand('%') . '"')<cr> nnoremap <F10> :echo system('python3 "' . expand('%') . '"')<cr>
它也没有搞乱我的powerline / vim-airline状态栏。
一个简单的方法是在正常模式下键入:
然后按键盘上的向上箭头键,然后按Enter键。 这将在VIM上重复上次input的命令。
如果你想快速跳回你的:w
命令,一个很酷的事情是input:w
,然后按向上的箭头。 它只会循环以w
开头的命令。
对于通用的(基于filetype
从vim运行python / haskell / ruby / C ++ …),有一个很好的插件叫做vim-quickrun 。 它默认支持许多编程语言。 它也很容易configuration,所以如果需要的话,可以为任何文件types定义首选行为。 github repo没有花哨的自述文件,但是doc文件很好地logging了它。
这个.vimrc映射需要Conque Shell ,但它复制了Geany(和其他X编辑器)的行为:
- 按一个键执行
- 在gnome-terminal中执行
- 等待确认退出
-
窗口在退出时自动closures
: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; \" "')
我有这个在我的.vimrc:
"map <F9> :w<CR>:!python %<CR>"
它保存当前的缓冲区并只执行Esc + F9来执行代码
把你的光标放在代码的某处。 右键单击并select“select”选项之一来突出显示您的代码。 然后按下Ctrl键,你会看到新的提示'<,>'
现在input!python,看看是否有效。
我只是花了好几天的时间想弄清楚同样的问题! 我使用的编码:
s='My name' print (s)
当我拔出所有头发后,我终于明白了!