使用 Shift+Arrow 或 Ctrl+Shift+Arrow 在 urxvt 终端中选择文本

使用 Shift+Arrow 或 Ctrl+Shift+Arrow 在 urxvt 终端中选择文本

我在 Archlinux 中使用 zsh + rxvt-unicode 作为终端模拟器。我已使用Ctrl+在终端中成功设置导航Arrow keys,但无法将终端设置为在按 Shift + 箭头(或按 Ctrl + Shift + 箭头选择整个单词)时能够选择文本。经过几天的寻找解决方案后,我找不到解决方案。启用keyboard-select.Xresources没有起到作用。所以我感兴趣的是我应该做什么才能在控制台中选择文本而不使用鼠标,就像在所有文本编辑器中所做的那样?

答案1

我通过三个步骤使它对我有用:

步骤 1. 让元密钥发挥作用:

放进URxvt*altSendsEscape: true~/.Xresources,然后xrdb ~/.Xresources放进去~/.xinitrc

对于 xterm,在 中~/.Xresources,放置xterm*metaSendsEscape: true.

对于 rxvt,我的直觉告诉我它看起来相同或非常相似。

步骤 2. 修补光标移动

这将为您提供 Emacs 元键,因此您无需按 Escape 键。我在使用 bash 时设置了这个,并让它工作,然后切换到 zsh;它仍然有效,但是,对于 Emacs 键绑定的单词移动,zsh 和 bash 似乎有些不同:我得到的最接近 Emacs 的行为是这样的修补。如果您习惯使用 Emacs,那么在 shell 中进行相同的光标移动会非常方便。

例如,现在用 C-SPC 设置标记,用 Mb 标记先前输入的单词,用 Cw 终止它(或者,用 Mw 不删除它),用 Cy 拉出它,等等。

好的,我知道您想要 Ctrl-Left 等等,但那是巨大的向下贸易:那样的话,你必须抵达对于每个光标移动,以及向后伸手继续打字。存在很大的烦恼和生产力下降! “新”(但更好)的快捷方式一开始就很僵硬,但我建议任何人,只要强迫自己使用它们,很快(当你一直打字时!),它们就会自然而然地出现。

步骤 3. 要复制到 X 剪贴板,我进行了如下设置(在 中~/.zshrc):

# clipboard
X_CLIPBOARD='xclip -d ":0" -selection clipboard'
alias xi="$X_CLIPBOARD"    # `-i` (or `-in`) is default 
alias xo="$X_CLIPBOARD -o"

现在,您可以通过管道输出到xi,并将其粘贴到任何地方(即使在非 X tty 中也可以工作,因为-d如果 X 正在运行);要在 shell 命令中使用它,只需反引号即可xo

要在 Emacs 中使用它(在 tty 中运行),我必须创建一个脚本来复制xo上面别名的功能:

#!/bin/zsh
xclip -d ":0" -o -selection clipboard

然后,在~/.emacs

(defun pst ()
  "Inserts the X clipboard (xclip -d ':0' -o -selection clipboard)
   at point. `M-1' (the '(1)) to insert in the current buffer."
  (interactive)
  (shell-command "pst" '(1))
  (end-of-line) )

原因是,我找不到将 Emacs 连接到 zsh 别名的方法,尽管我怀疑这是可能的。无论如何,调用M-x pst.

编辑

我添加了此解决方法,以使 Emacs 的forward-char字符数与您刚刚插入的字符数相同。 (下面的第一段代码是脚本 - 参见上面 - 也已更改。)我使用中间文件来执行此操作 - 尽管作为程序员,这违背了我的直觉(作为一个坏习惯),但是,好吧,这似乎有效。显然,end-of-line(在我的第一个答案中)并不好,因为有时您想在句子中间插入一个单词。

#!/bin/zsh

CLIP=`xclip -d ":0" -o -selection clipboard`
CLIP_LEN=`echo -n $CLIP | wc -c`
echo "(set-variable '*clip-len* $CLIP_LEN)" > ~/.clip_len
echo -n $CLIP


(setq *clip-len* 0)

(defun pst ()
  "Inserts the X clipboard (xclip -d ':0' -o -selection clipboard)
at point. `M-1' (the '(1)) to insert in the current buffer."
  (interactive)
  (shell-command "pst" '(1))
  (load-file "~/.clip_len")
  (forward-char *clip-len*) )

相关内容