gpt4 book ai didi

vim 在选择时运行一系列命令(或函数)

转载 作者:行者123 更新时间:2023-12-04 21:07:34 24 4
gpt4 key购买 nike

我有一系列 vim 命令将选定的块写入临时文件,在该文件上运行一个函数 (knitcite),然后读入另一个文件:

w! ~/.vbuf <CR> 
!knitcite ~/.vbuf ~/.vbuf <CR>
r ~/.vbuf <CR>

如果我在运行第一个命令之前在可视模式下选择了一个文本块,它会变成
:'<,'>w! ~/.vbuf <CR>

根据需要将选定的内容传递给文件。我可以把它放到我的 .vimrc 中的一个简单的 vim 函数中,但无法弄清楚如何将视觉选择的内容传递给函数。如果这是一个单一的命令而不是三个命令,我可以用一个可视化 map 来做到这一点,但不知道如何用三个命令来做到这一点。就像是:
command knitcite call Knitcite()
func! Knitcite()
exec "w! ~/.vbuf <CR>"
exec "!knitcite ~/.vbuf ~/.vbuf <CR> "
exec "r ~/.vbuf <CR>"
func

但这不会从视觉块传入任何数据。我想我需要为我的 Knitcite 函数提供一个参数,但无法弄清楚它会是什么。 (似乎这可能与 this SO question 有关,但我不知道如何从该答案中概括。)

最佳答案

最简单的做法是用作过滤器:

:'<,'>!knitcite

knitcite在过滤器模式下不起作用(通常它使用 - 将 stdin 表示为文件名,其他选项可能适用)您可以将其包装在 shell 脚本中:

#!/bin/bash
tmpname="/tmp/$(basename "$0").tmp$RANDOM"

trap "rm -f '$tmpname'" ERR INT EXIT
knitcite <(cat) "$tmpname"
cat "$tmpname"

否则,您似乎想用输出替换视觉选择:
:'<,'>w! ~/.vbuf
:'<,'>d _
:silent! !knitcite ~/.vbuf ~/.vbuf.out
:'<-1r ~/.vbuf.out

备注
  • 使用单独的临时文件输出:否则,在大多数平台上可能会出现问题,在读取输入之前可能会发生输出文件的截断!
  • 将黑洞寄存器 ("_) 与 :delete 一起使用避免破坏任何寄存器的命令
  • 关于vim 在选择时运行一系列命令(或函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12753302/

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