如何在Hammerspoon中使用hs.eventtap.keyStrokes添加换行?

我刚开始使用 Hammerspoon。我正在尝试通过按下 Cmd + Shift + l 来输出多行文本。

到目前为止我尝试过以下方法:

hs.hotkey.bind({"cmd", "shift"}, "l", function()
  hs.eventtap.keyStrokes('from sklearn import metrics')
  hs.eventtap.keyStroke("return")
  hs.eventtap.keyStrokes('from sklearn.cross_validation import train_test_split')
end)

我还尝试使用内联 "\n" 和 "%\n"

如何绑定一个按键组合来输出多行文本?或者,如何发送一个 换行符

点赞
用户9726952
用户9726952

我遇到了同样的问题。我尝试了你上面尝试的方法,虽然在许多应用程序中它可以工作,但它在Chrome中仍然不起作用。我使用了剪贴板作为解决方法。

jira_text = [[a
long
multi-line
string]]

-- 热键 JIRA 文本
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "J", function ()
  hs.alert.show("Remove this message after debugging!")
  --hs.eventtap.keyStrokes(jira_text)#don't do this!
  hs.pasteboard.writeObjects(jira_text)
  hs.eventtap.keyStroke("cmd", "v")
  end)
--

你可以进一步改进它,通过使用自定义命名的剪贴板,使它不会覆盖你的剪贴板内容(如果你需要)。

2018-05-01 18:37:33
用户2438757
用户2438757

我也遇到了这个问题,通过将系统剪贴板的内容保存到临时剪贴板中,我改进了Josh Fox的答案,并加载和粘贴多行字符串。

MULTILINE_STRING = [[multi
line
string]]

-- 粘贴多行字符串
hs.hotkey.bind({'ctrl', 'cmd'}, 'F1', function()
    -- 保存剪贴板数据到temp
    tempClipboard = hs.pasteboard.uniquePasteboard()
    hs.pasteboard.writeAllData(tempClipboard, hs.pasteboard.readAllData(nil))

    -- 将字符串载入剪贴板并粘贴
    hs.pasteboard.writeObjects(MULTILINE_STRING)
    hs.eventtap.keyStroke({'cmd'}, 'v')

    -- 回收剪贴板数据
    hs.pasteboard.writeAllData(nil, hs.pasteboard.readAllData(tempClipboard))
    hs.pasteboard.deletePasteboard(tempClipboard)
end)
2021-07-06 17:11:20
用户14908692
用户14908692

我不太喜欢所有这些剪贴板操作(副作用太多,可能存在性能问题),所以我使用了帮助函数和一些字符串分割来解决这个问题。请注意,Lua 没有本地字符串分割函数,我在这里使用了 stringy 中的函数,但是任何定制或由库提供的字符串分割函数都可以工作。

--- 防止 hs.eventtap.keyStrokes 吃掉 `\n`
--- @param str string
--- @return nil
function pasteMultilineString(str)
  local lines = stringy.split(str, "\n")
  local is_first_line = true
  for _, line in ipairs(lines) do
    if is_first_line then
      is_first_line = false
    else
      hs.eventtap.keyStroke({}, "return")
    end
    hs.eventtap.keyStrokes(line)
  end
end
2022-12-28 05:36:28