粘贴后“插入点”的位置(以编程方式)[关闭]

Posted

技术标签:

【中文标题】粘贴后“插入点”的位置(以编程方式)[关闭]【英文标题】:Location of 'insertion point' after pasting (programmatically) [closed] 【发布时间】:2014-05-15 04:16:43 【问题描述】:

我想知道“如何”,在粘贴后,光标的位置以编程方式阻止(就像使用 zen 编码一样)。

对于“插入点”,我想说的是:当我们输入时,我们的文本会在其中闪烁。

所以,假设我粘贴了这个:'<text>%insertion point</text>' 我希望“插入点”位于特定位置(在本例中为 %insertion point)。

一些细节:

    我使用/在 Linux (Ubuntu/Fluxbox) 上工作 语言并不重要(首选:Python、C、C++(必须与 linux 兼容)) 我打算通过粘贴:在任何文本区域(不是在终端中)纯粘贴

我“不”在寻找什么:

    执行此操作的桌面程序,除非它是可编写脚本的(例如 shell 工具) 提供此功能的文本编辑器(例如 vim 模块)

我也很想跳到下一个选择,所以:

<text>%first</text><detail>%second</detail>

如果互联网上有更好的地方可以问我的问题,请告诉我。 任何可以为我指明正确方向的信息将不胜感激。

感谢您考虑我的问题

编辑: 我要提一下,不一定要在粘贴之后,重要的是要操纵“插入点”的位置。

【问题讨论】:

这要看你粘贴的是什么程序,但是光标一般不会放在粘贴文本的末尾吗? 一般是的,位置在粘贴文本的末尾。我正在寻找的是一种改变这种默认行为的方法。假设我要编写一个具有粘贴功能的脚本/程序,它会覆盖这种“默认”行为,有什么方法可以解决这个问题? 您要解决的实际问题是什么?听起来您可能没有考虑其他解决方案。 我能说的就是我需要能够操纵当前“插入点”位置的“东西”。可能是像“xdotool”这样的 shell 工具或 Python 模块,可以为我提供这样的功能。 也许我应该提一下,不一定要在我粘贴之后,重要的是要操纵“插入点”的位置。 【参考方案1】:

您可以使用xvkbd 发送粘贴键组合 CtrlV 后跟一系列 (左箭头)键完成模板行为,然后映射一个 Fluxbox 键盘快捷键来执行这个命令

命令类似于

xvkbd -text "\Cv\[Left]\[Left]\[Left]\[Left]"

然后将其分配给~/.fluxbox/keys 文件中的快捷方式(Mod1 是 Windows 键)

Mod1 P :ExecCommand xvkbd -text "\Cv\[Left]\[Left]\[Left]\[Left]"

但是,这需要以某种方式为每个模板定制,并且不适用于 CtrlV 不是“粘贴”的应用程序(如 xterm)。也许对于通用模板,您可以将它们硬编码为不同的快捷方式

Mod1 T :ExecCommand xvkbd -text "<text></text>\[Left]\[Left]\[Left]\[Left]\[Left]\[Left]\[Left]"

我怀疑,如果您只是自定义每个编辑器以单独提供此功能,您会过得更好。

编辑

这是一个 Python 脚本,它从标准输入读取并写入适合 xvkbd 的输出。它使用百分号作为插入点(例如&lt;text&gt;%&lt;/text&gt;),因此您需要使用反斜杠转义任何真正的百分号。

#!/usr/bin/env python
import sys
import re

clip = sys.stdin.read()
# split on percent sign not prefixed by backslash
parts = re.split(r'(?<!\\)%', clip, 1)
# un-escape percent sign
parts = [p.replace('\\%', '%') for p in parts]
tail_len = len(parts[-1])

print(''.join(parts) + '\[Left]' * tail_len)

您需要将剪贴板传送给它,然后将结果传递给xvkbd。我在这里使用xclip 将X剪贴板输出到标准输出

xclip -out | python pastetemplate.py | xargs -0 -I xvkbd -text ""

它仍然存在移动光标需要一段时间的问题,但是它确实自动执行了先前的过程。

我真的认为您不会有任何运气以编程方式移动光标,因为我想您必须根据目标应用程序的 GUI 工具包(例如 GTK、QT、闪光等)。但是,如果您针对特定的应用程序或工具包,您也许可以解决它。

【讨论】:

这类似于我已经尝试过的“xdotool”,它也可以发送击键。但是,这不是很实用,考虑发送 'Left' 50 次左右,这只是太慢了,您实际上会在屏幕上看到“插入的东西”移动。我正在寻找一种可以将“插入位置”操纵到 x 偏移量的解决方案。因此,例如“立即向左移动 50”。 使用“xdotool”,您可以执行“xdotool getwindowfocus key ctrl+v shift+ctrl+v”之类的操作,这将解决在终端中粘贴的问题。此外,您可以测试“如果”当前窗口是终端或其他东西并正确响应(即使用 ctrl+v 或 shift+ctrl+v)【参考方案2】:

Vim 使用 2 个寄存器存储先前被拉出/粘贴/更改的文本的位置,即'[ 用于起始行,'] 用于另一端。还有字符寄存器可以知道开始和结束的确切字符虚拟列,阅读:h '[了解更多信息。

【讨论】:

我不确定我们是否相互理解,正如我所提到的,我不是在寻找 vi[m] 这样的编辑器内部的功能。也许我误解了你的答案? 你的问题是用 vim 标记的,所以我认为它是,我的错。 我删除了 'vim' 标签以防止混淆。

以上是关于粘贴后“插入点”的位置(以编程方式)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在iOS中启用位置服务

SwiftUI:以编程方式关闭警报

对象以编程方式移动后的Fabricjs在其新位置上不可选择

在 Android 中以编程方式打开位置提供程序

应用程序打开时如何以编程方式恢复位置访问

如何以编程方式在 CKEditor 5 的当前位置插入链接