我想创建一个python shell脚本myscript.py,它可以多次将输出提供给管道或接收管道输入.例如.
$ myscript.py | myscript.py | myscript.py ...
以下实施仅在有限的范围内起作用:
$ myscript.py
NO INPUT
(ok)
$ echo 'hello' | myscript.py
GOT INPUT >>> hello
(ok)
$ myscript.py | myscript.py
NO INPUT
(not ok, should be)
NO INPUT
GOT INPUT >>> NO INPUT
Run Code Online (Sandbox Code Playgroud)
这是myscript.py的内容:
#!/usr/bin/env python
if __name__=="__main__":
import sys,os
if (os.fstat(sys.stdin.fileno()).st_size > 0):
stdincontents=sys.stdin.read()
print "GOT INPUT >>> " + stdincontents
else:
print "NO INPUT"
Run Code Online (Sandbox Code Playgroud) 我想用来gf打开文件中的超链接文件名.org(我使用vim插件vim-orgmode):
我键入gf,文件应该打开。为了避免经过前两个步骤[[,我创建了以下脚本来完成此工作:
function! GFOrg()
python << EOF
import vim
try:
filename=vim.eval("@%")
if filename.endswith(".org"):
line = vim.current.line
linkstart=line.find("[[")
if linkstart != -1:
row, start = vim.current.window.cursor
vim.current.window.cursor = row, linkstart+2
vim.command("normal gf")
except Exception as e:
print("Error: {}".format(e))
EOF
endfunction
Run Code Online (Sandbox Code Playgroud)
现在,如果我将其映射为覆盖gf:
nnoremap gf :call GFOrg()<CR>
Run Code Online (Sandbox Code Playgroud)
我收到一个递归错误:
但是,如果我退出并重新打开Vim(实际上是MacVim),并gfgf用作映射,则只需键入gf(一次)就可以了:
nnoremap gfgf :call GFOrg()<CR>
Run Code Online (Sandbox Code Playgroud)
谁能解释为什么我不需要gf两次键入就可以映射到调用,以及为什么它停止了递归错误?