Ubuntu Wayland 上的文本扩展

Ubuntu Wayland 上的文本扩展

因为自动键斯尼皮, 和膨胀机全部依赖于 X11 窗口系统(或间接依赖于 xdotool),它们无法在 Artful 的默认 Wayland 会话中完全运行。

是否有任何替代软件可以提供 1) 简单的文本扩展,2) 系统范围的(浏览器,shell,编辑器等)?

答案1

Wayland 即将重新成为 Ubuntu 21.04 的默认设置,但我早就改用了埃斯潘索作为我的文本扩展工具。

答案2

我受 Dmtri Popov 的启发创建了一个自定义 bash 脚本“snippy” 脚本刊登在 Linux Magazine(2014 年)上。此脚本允许我将输入的缩写扩展为全文。

  • 我将所有代码片段保存在专用目录中的单独文本文件中$HOME/.local/share/snippy。每个文件都根据我想要用于插入代码片段的缩写命名。

  • 要插入代码片段,我只需输入其缩写并按Ctrl+ ,。脚本 1) 根据光标前的单词识别缩写;2) 在目录中找到相应的代码片段文件snippy;3) 用文件的完整内容替换输入的缩写。

这种方法可以快速有效地插入常用的文本片段,同时保持它们井然有序且易于访问。

设置

步骤 1.安装脚本snippy

a) 将以下代码复制到名为 的文本文件中snippy

#!/bin/bash
# Dependencies: wl-clipboard (Wayland) or xclip (x11); dotool (https://sr.ht/~geb/dotool/)

sleep_time=0.2
snippets_dir=$HOME/.local/share/snippy
f_saved_clipboard=$(mktemp)
flag_gnome_copied_files=0
if [ -z ${XDG_SESSION_TYPE+x} ] ; then
    echo "XDG_SESSION_TYPE is not set. Please set to 'x11' or 'wayland'" ; exit
else
    if [ "$XDG_SESSION_TYPE" = 'x11' ] ; then
        copy_to_clip="xsel -bi"
        paste_from_clip="xsel -bo"
    else
        copy_to_clip="wl-copy -n"
        paste_from_clip="wl-paste -n"
    fi
fi

# Select word before cursor and read name of clip from primary clipboard
echo key ctrl+shift+left | dotoolc
sleep 0.1
selected_clip="$snippets_dir/$(wl-paste -n -p)"

# Load and paste selected clip if it is valid
echo "$selected_clip" > ~/debug.txt
if [ -f "$selected_clip" ] ; then
    # Save the current clipboard
    if [[ $(wl-paste --list-types | grep x-special/gnome-copied-files) == "x-special/gnome-copied-files" ]] ; then
        flag_gnome_copied_files=1
        $paste_from_clip --type x-special/gnome-copied-files > "$f_saved_clipboard"
    else    
        $paste_from_clip > "$f_saved_clipboard"
    fi
    # Load and paste the selected clip
    $copy_to_clip < "$selected_clip"
    sleep $sleep_time
    echo key ctrl+v | dotoolc
    # Restore the clipboard
    sleep 0.4
    if [ $flag_gnome_copied_files = "1" ] ; then
    $copy_to_clip --type  x-special/gnome-copied-files < "$f_saved_clipboard"
    else
    $copy_to_clip < "$f_saved_clipboard"
    fi
    rm $f_saved_clipboard
else
    echo key ctrl+right | dotoolc   
fi

b)将脚本移至~/.local/bin. 如果目录尚不存在,则创建该目录。

如果您必须创建目录,请先注销,然后重新登录 Ubuntu,然后再继续。这样,新创建的目录将包含在 PATH 中。

C)使脚本可执行

您可以使用终端执行此操作:chmod +x ~/.local/bin/snippy。否则,在文件管理器中找到该文件,右键单击该文件并选择“属性”,然后选中“可作为程序执行”复选标记。

步骤2.安装剪贴板操作工具

安装wl-clipboard,这是一个用于在 wayland 上操作剪贴板的命令行工具。如果在 Xorg 上,则安装xclip

sudo apt install wl-clipboard # If you run Wayland
sudo apt install xclip        # If you run Xorg
步骤 3. 安装键盘自动化工具

安装dotooldotoolhttps://sr.ht/~geb/dotool/) 不幸在 Ubuntu 软件库中不可用。但是,根据网站上的说明,很容易编译和安装它。

A)下载包含源代码的存档文件:在网站的“来源”标签上https://sr.ht/~geb/dotool/,下载.tar.gz发布版本的存档(目前为 1.4,https://git.sr.ht/~geb/dotool/archive/1.4.tar.gz)。

b)提取档案文件在 Ubuntu 标准版中,您可以通过右键单击存档并选择“在此处提取”来执行此操作。这将创建一个与存档文件同名的目录,但没有扩展名.tar.gz(当前为:dotool-1.4)。

C)在该目录中打开终端。使用“文件”,您可以右键单击步骤 b) 中创建的目录并选择“在终端中打开”。或者,打开终端并使用命令cd切换到创建的目录,例如cd ~/Downloads/dotool-1.4

d)安装要求golibxkbcommon-devscdoc

sudo apt install golang-go
sudo apt install libxkbcommon-dev
sudo apt install scdoc

e)编译并安装

./build.sh && sudo ./build.sh install

F)触发 udev 规则

sudo udevadm control --reload && sudo udevadm trigger

笔记:您可以改用ydotool。原则上,此工具可以更轻松地安装,因为它位于 Ubuntu 软件存储库中。但是,Ubuntu 22.04 附带的版本已经过时了。更新的版本也必须被编译。显然,dotoolc脚本中的命令必须用等效ydotool命令替换。

步骤 4. 设置dotool

您现在应该可以访问手册了:man dotool。这表明您可能需要将自己添加到组input。在 Ubuntu 上,这是必需的。执行以下命令创建组(如果尚不存在)并将您的用户添加到其中。

sudo groupadd -f input
sudo usermod -a -G input $USER

现在重新启动系统以确保更改已正确实施。

重新登录后,测试是否dotool有效。打开终端并执行

echo type hello | dotool

如果您看到终端上输入了dotool该单词,则表示您已成功安装。每次运行时,它都需要创建一个虚拟键盘。这会导致一些延迟。为了避免这种延迟,我们将自动启动守护进程,并使用守护进程进行键盘自动化。hellodotooldotoolddotoolc

步骤 5. 设置 systemd 用户服务

A)安装用户服务文件

在终端运行以下代码即可自动安装用户服务文件:

cat > ~/.config/systemd/user/dotool.service << EOF
[Unit]
Description=dotool keyboard automation daemon

[Service]
ExecStart=/usr/local/bin/dotoold

[Install]
WantedBy=default.target
EOF

b)启用服务

systemctl --user enable dotool

注销然后重新登录(或者直接手动启动服务:systemctl --user start dotool。使用以下命令检查服务是否成功加载:

echo type hello | dotoolc

请注意我们现在如何使用dotoolc而不是。并注意现在输入dotool速度有多快。hello

步骤6.设置快捷键

设置使用桌面环境功能触发脚本的快捷键。在标准 Ubuntu 中:

  • 前往“设置”-“键盘”。
  • 在“键盘快捷键”下,点击“查看和自定义快捷键”。出现“键盘快捷键”对话框。
  • 选择“自定义快捷方式”。出现“自定义快捷方式”对话框。
  • 单击“+”,在“自定义快捷方式”对话框中输入:名称:“Snippy”,命令:“snippy”,然后单击“设置快捷方式”。现在按下您要使用的快捷方式。我使用Ctrl+ ,。点击绿色的“完成”按钮并关闭对话框。
第 7 步:设置代码片段

创建一个目录~/.local/share/snippy。在该目录中,存储您的文本片段,即根据要使用的缩写名称命名的文本文件。例如,我们创建一个名为的文本文件,dt其中包含以下文本:

“dotool 从 stdin 读取操作并使用 Linux 的 uinput 模块模拟键盘/鼠标输入。它在整个系统范围内运行并支持键盘布局。”

步骤8.测试

打开文本编辑器并输入dt。现在按下快捷键。如果缩写没有正确展开,您可能需要编辑脚本以增加到sleep_time=0.2eg 0.3(0.3 秒)。但是,您也可以尝试减少那时。在我的系统上,我可以将其设置为 0。

不幸的是,在不同于 wlroots 的 Wayland 实现上,wl-clipboard需要创建一个(透明)窗口才能访问剪贴板。这会导致闪烁。使用 dock 时,这会导致短暂创建和显示应用程序图标。

相关内容