gpt4 book ai didi

python - 在外壳中运行视觉选择,将输出发送到新窗口

转载 作者:太空宇宙 更新时间:2023-11-03 11:31:10 24 4
gpt4 key购买 nike

所以我目前主要使用 Vim 来处理 python,我最近发现了 2 个在外部运行代码并将其带回 Vim 的好策略。第一个是使用名为 Shell 的函数来自 Vim pages :

function! s:ExecuteInShell(command)
let command = join(map(split(a:command), 'expand(v:val)'))
let winnr = bufwinnr('^' . command . '$')
silent! execute winnr < 0 ? 'botright new ' . fnameescape(command) : winnr . 'wincmd w'
setlocal buftype=nowrite bufhidden=wipe nobuflisted noswapfile nowrap number
echo 'Execute ' . command . '...'
silent! execute 'silent %!'. command
silent! execute 'resize ' . line('$')
silent! redraw
silent! execute 'au BufUnload <buffer> execute bufwinnr(' . bufnr('#') . ') . ''wincmd w'''
silent! execute 'nnoremap <silent> <buffer> <LocalLeader>r :call <SID>ExecuteInShell(''' . command . ''')<CR>'
echo 'Shell command ' . command . ' executed.'
endfunction
command! -complete=shellcmd -nargs=+ Shell call s:ExecuteInShell(<q-args>)

它允许一个人运行类似 :Shell nosetests 的东西并在新窗口中查看结果:

  1. 持久性(没有“按回车”让它消失)
  2. 使用临时缓冲区(不是临时文件)
  3. 最重要的是,再次运行该命令只会刷新当前窗口,不会每次都打开一个新窗口。

然后我使用 this还有小 gem :

:'<,'>:w !python

让我使用当前缓冲区中的选择,但在按下 Enter 后消失。

我不知道如何将两者结合起来。我想要的是:

  1. Shell 的所有窗口属性命令,但是
  2. 能够从屏幕上的选择中运行它。
  3. 编辑:对选定的 python 代码执行此操作,而不是 bash 代码。该函数已经执行了常规的 shell 命令。而不是使用 Shell 运行 $ python script.py我希望它像:'<,'>:w !python一样直接运行代码会的。

我对 Vimscript 了解不够,无法修改 Shell包括一个选择,我不能为我的生活弄清楚如何至少把 :'<,'>:w !python在不使用临时文件的情况下进入它自己的窗口,这对我来说似乎没有必要。有任何想法吗?提示?

最佳答案

您可以让函数接受范围并测试范围是否通过:

function! s:ExecuteInShell(command) range
let lines = []
if (a:firstline != a:lastline)
let lines=getline(a:firstline, a:lastline)
endif
let command = join(map(split(a:command), 'expand(v:val)'))
let winnr = bufwinnr('^' . command . '$')
silent! execute winnr < 0 ? 'botright new ' . fnameescape(command) : winnr . 'wincmd w'
setlocal buftype=nowrite bufhidden=wipe nobuflisted noswapfile nowrap number
echo 'Execute ' . command . '...'
if (len(lines))
silent! call append(line('.'), lines)
silent! 1d
silent! redir => results
silent! execute '1,$w !' . command
silent! redir end
silent! %d
let lines = split(results, '\r')
for line in lines[:1]
call append(line('$'), line[1:])
endfor
silent! 1d
else
silent! execute 'silent %!'. command
endif
silent! execute 'resize ' . line('$')
silent! redraw
silent! execute 'au BufUnload <buffer> execute bufwinnr(' . bufnr('#') . ') . ''wincmd w'''
silent! execute 'nnoremap <silent> <buffer> <LocalLeader>r :call <SID>ExecuteInShell(''' . command . ''')<CR>'
echo 'Shell command ' . command . ' executed.'
endfunction
command! -range -complete=shellcmd -nargs=+ Shell <line1>,<line2>call s:ExecuteInShell(<q-args>)

与命令一起使用:

:Shell echo 'no range supplied, but a command (echo) is.'

要在选择行时使用(您无需键入“'<,'>”部分,因为按“:”会为您提供该部分(提供的命令是因为所选行由命令解释):

:'<,'>Shell python

关于python - 在外壳中运行视觉选择,将输出发送到新窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19672278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com