在 Vim 中通过外部命令选择管道部分线

Pipe partial line selection through external command in Vim

我知道我可以将 :! 与视觉选择一起使用,通过外部命令将选定的 管道化,但是有没有办法对单个行执行相同的操作一行字?我需要在配置文件中对令牌进行 base64 编码,我遇到了问题,整行都发送到 base64。如果我将单词移到它自己的行,我将以 base64 字符串中编码的尾随 \n 字符结束。我知道有一个专门用于此的插件,但一般来说是否可以通过外部程序将缓冲区的单位小于整行?

Ex 命令(以 : 开头的所有内容)在行上工作,对此您无能为力。

过滤 "non-lines" 更复杂。您需要:

  1. 拉出选择,
  2. 必要时转义,
  3. 运行 您的过滤器在子外壳中具有该选择,
  4. 必要时清理输出,
  5. 用过滤器的输出替换选择。

简而言之:

c<C-r>=system('echo "<C-r>"" | base64 | tr -d "\n"')<CR>

这显然比过滤行要多得多。将它映射到更简单的东西。

Ex 命令:! 是其中之一)都是基于行的,因为 ex 编辑器此模式所基于的是基于行的。

如果您经常需要过滤部分行,我确实建议使用其中一个插件。如果你想手动执行此操作,@romainl 的回答概述了(乏味的)步骤 - 插件可以大大简化:

  • 有了尊者vis.vim,就可以用:B !base64
  • unimpaired.vim 插件以前有 ]Y / [Y 映射直接编码/解码 Base64(在 Vimscript 中实现)
  • express.vim 定义了一个 g= 运算符,然后将查询要应用于它的表达式。你可以在这里使用!base64