用python处理vi yank缓冲区

时间:2019-02-15 10:33:43

标签: python vim

我想在VI中添加键映射。想法是拉动文本并将其传递给python代码。 随后,此python代码可用于对缓冲区@"

中包含的被选中文本进行一些操作

为此,我将以下行添加到.vimrc

:map <F2> :echo system("python /tmp/t.py ".shellescape(@")) <Enter>

通过按F2键,python脚本将以@"作为输入来运行代码。问题是,连接的缓冲区包含结束行\,是用<C-r>V连接的列。 列输入的缓冲区看起来像这样

1.233\
1.111\
1.222

我想完成以下

1)可能在yank缓冲区中不要包含\

2)使pyhon脚本在VI中全局可见。现在,它必须与VI文件位于同一文件夹中,否则需要绝对路径

可以通过将脚本放入python网站包并将其导入来适当地完成后一个操作,但是我想,知识渊博的人可能会有更好的主意。我记得通过将python脚本放在特殊的Vi文件夹中看到了这一点。

python代码:

import sys   

def to_float(v):
   if len(v)>0 and v != "":
      try:
         return float(v)
      except ValueError:
          #print('yanked wrong text 1 "%s" '%v)
          try:
             return float(v[:-1])
          except ValueError:
             #print('yanked wrong text 2 "%s" '%v)
             return 0.
   else :
       return 0.      

def func(v):
  s=0.
  for i in v[1].split():  
    #print('from py >> %s <<'%i) 
    s=s+to_float(i)     
  print(">>>Summ: %17.8E"%s)   

func(sys.argv)

1 个答案:

答案 0 :(得分:1)

Python-inside-Vim(只要正确设置)。只需将其转储到您的.vimrc中(并确保不要在pythonEOF之间的任何缩进中添加缩进):

python << EOF
import vim
def float_or_0(value):
    try:
        return float(value)
    except:
        return 0.0
def sum_column():
    lines = vim.eval('@"').splitlines()
    total = sum(float_or_0(x) for x in lines)
    print(">>>Summ: %17.8E" % total) 
EOF
xmap <F2> y:py sum_column()<Enter>

选择您的列,然后按F2。魔法。通过shell命令行传输文本没有麻烦。

或者,您可以从Quickly calculate the total of a column of numbers中选择一种策略。