都多久了我也不太记得,网易云下竟然由于qt的某个问题不能使用fcitx输入中文了!WTF!不过我们可以曲线救国。

就算直接不能输入中文我们也有办法暂时解决这个问题。那就是使用zenity+xclip制作一个可输入中文的带有 GUI 的一个脚本。

xclip是Unix以及类Unix系统下非常强大的剪贴板交互程序

我们可以简单看一下xclip的help输出:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
Usage: xclip [OPTION] [FILE]...
Access an X server selection for reading or writing.

  -i, -in          read text into X selection from standard input or files
                   (default)
  -o, -out         prints the selection to standard out (generally for
                   piping to a file or program)
  -l, -loops       number of selection requests to wait for before exiting
  -d, -display     X display to connect to (eg localhost:0")
  -h, -help        usage information
      -selection   selection to access ("primary", "secondary", "clipboard" or "buffer-cut")
      -noutf8      don't treat text as utf-8, use old unicode
      -target      use the given target atom
      -rmlastnl    remove the last newline charater if present
      -version     version information
      -silent      errors only, run in background (default)
      -quiet       run in foreground, show what's happening
      -verbose     running commentary

按照功能,我们需要:

  1. 输入文字
  2. 将文字输入到剪贴板
  3. 将文字传给clipboard程序

非常简单的三个部分。输入文字部分由zenity负责,同时将输入的文字存入变量中,之后用管道传给xclip程序。

那么需要用到的xclip选项应该就很容易选择了。

1
2
3
# xclip option
xclip -i  # read text into X selection from standard input or files
xclip --selectron clipboard # copy input to clipboard for output

思路明确了以后就非常容易办了,我们再看一下zenity entry部分的帮助说明:

1
2
3
4
5
6
7
8
用法:
  zenity [OPTION…]

文字输入选项
  --entry                                显示文本输入对话框
  --text=文字                            设置对话框文字
  --entry-text=文字                      设置输入文字
  --hide-text                            隐藏输入文字

也就是说我们只需要使用 --entry 选项显示输入框即可,在尝试中发现,bash下执行zenity –entry后会将输入打印到终端,也就是说我们需要将其存为变量才可以使用。因此完整代码如下:

1
2
3
4
5
#!/bin/bash
words_to_copy=$(zenity --entry)
# Use zenity to display a GUI information message.
echo $words_to_copy | xclip -i 
echo $words_to_copy | xclip -sel c