终端-从CLI复制而不使用鼠标


20

在CLI中触发命令时,我想复制刚触发的命令或在终端中编写的任何内容,然后将其粘贴到其他位置而不使用鼠标。

如下图所示,我想不使用鼠标就复制更新命令(全部或部分),并将其粘贴到某处。

从CLI复制而不使用鼠标


1
您正在使用没有鼠标的gnome吗?
ott-- 2013年

Answers:


11

您可以使用screen(1) 您选择的终端仿真器中(xtermgnome-terminal,...)。

您需要的功能是内置的screen。您需要熟悉它的工作方式:

  • 默认情况下,“命令”键绑定是Ctrl+ A,您可以通过发出“命令”序列和特定操作来编写命令。
  • “复制”命令为: AltGr+[
  • “粘贴”命令为AltGr+]

您可以“复制”命令,然后在另一个终端中“粘贴”。

screen 很有趣,一旦您开始使用它,您会想知道完全没有使用它的可能性。


没有screen命令,因此我将其安装在gnome-terminal中并screen在终端中启动。但此后无法开始。另外,我也不明白内置屏幕的含义。
祈祷

1
阅读man screen。另外,我写了“内置屏幕上”,这意味着复制/粘贴功能是screen 设计使然
dawud

您需要使用space键来选择所需的区域。您需要使用Y复制整行或所需区域。屏幕是vi动作友好的。
FelikZ

什么是AltGr钥匙?我有Alt
alhelal

1
screen工具无法正常工作在此处进行了说明。而且它似乎并不能为这个问题提供答案。
路易斯·德索萨

7

除了已经提供的答案之外,您还可以考虑使用更灵活的终端仿真器。

如果准备将终端更改为rxvt-unicode,则可以使用urxvt-perls之类的工具:在该终端仿真器中提供以下键盘功能的脚本集合:

  • 选择,复制和粘贴文本
  • 正向和反向搜索
  • 在您喜欢的浏览器中突出显示并打开URL

您只需安装软件包,然后在上添加几行~/.Xresources,然后就可以永久拔掉啮齿动物的插头。


4

您可以使用以下程序来执行此操作xclip

NAME
   xclip - command line interface to X selections (clip‐
   board)

安装后,可以使用它连接到X剪贴板。不幸的是,这在您的mysql环境中不起作用(它有用于复制行的缓冲区),但是如果您要运行“正常”命令,则可以。例如 :

$ This is a long command line

键入CtrlA以转到行的开头,将命令用引号引起来,然后将其回显:

$ echo -e "This is a long command line" |xclip 

现在,单击鼠标中键剪贴板中有“这是一个很长的命令行”。

如果要不使用鼠标进行粘贴,则取决于粘贴的位置。您可以通过运行以下命令粘贴到另一个终端:

$ xclip -o

您只需将命令杀死(剪切)CtrlK然后粘贴即可粘贴到同一终端中CtrlY

您还可以使用bash的历史记录在终端之间保存命令。将此行添加到您的~/.bashrc

PROMPT_COMMAND='history -a; history -r'

PROMPT_COMMAND是一个特殊的bash变量。如果设置了该值,则在发出新提示之前将其作为命令执行。history -a会将当前会话的历史记录写入历史记录文件,history -r然后重新加载该文件。这意味着您运行的每个命令都将立即写入历史文件。

现在,当您运行一个长长的命令行时,您可以切换到另一个终端并按回车键(只需运行$PROMT_COMMAND,或者打开一个新的终端窗口),该终端的历史记录便可以访问它。如果现在点击Up,则可以在新终端上运行它。


可以,但是我仍然必须使用鼠标吗?
祈祷

@PrayagUpd啊,是的,这将复制到中间单击缓冲区。另一种方式请参阅更新的答案。
terdon

我认为$ xclip -o这不是我想要的,因为它只是打印出我想要的内容xclipe。但对于+1 Ctrl+A,接着Ctrl+KCtrl+Y用于在同一个终端至少剪切并粘贴到。
祈祷

@PrayagUpd问题是正在使用各种剪贴板缓冲区,解决方案将取决于您要执行的操作。您能否用一个具体的示例来更新您的问题?我的意思是从哪里复制(mysql会很棘手)并复制到哪里。
terdon

1
@PrayagUpd请参阅更新的答案以获取另一个技巧。
terdon

1

@evilsoup提出了一个好的解决方案,但它经常中断。

快速解决方案

这是一个永不中断解决方案

history | tail -2 | head -1 | xclip -selection clipboard

只需运行此命令,它将把您刚运行的命令复制到剪贴板。

基本上,它的作用是打印您的命令历史记录,并接收倒数第二个命令,并将其馈送到剪贴板(最后一个命令本身就是它,因此它选择倒数第二个命令)。

自定义功能

在快速解决方案上进行开发,这是我编写的一个小函数,非常聪明,它将复制上次使用的命令。您还可以提供数字参数来复制last-nth命令。例如,复制倒数第二条命令2作为参数提供

myclipcopy () {

  if [ -z $1 ]
    then  # if no argument was provided then just copy the last used command
    history | tail -2 | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo 'Anyways, the following command has been copied:'
    history | tail -2 | head -1| sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'

  else
    myindex=$(( $1+1 ))
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo "The following command has been copied:"
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'
  fi

  #Delete this command itself from the history
  myhisnum=$(history | tail -1 | grep -oP '\s\d+\s' | grep -oP '\d+'); history -d $myhisnum
}

将上述功能复制粘贴到~/.bashrc文件中。请注意,如果将其放在单独的bash脚本文件中并运行该脚本,则该脚本将无法工作,因为在这种情况下,history命令将无法访问您的历史记录。

最后,将其运行为:

myclipcopy 3
# This copies the third-last command

此外,此功能添加的一个很酷的功能是,它在运行后会从历史记录中删除。这很有用,因为命令的“向后”索引不会更改。


这不是很可靠
mikeserv

@mikeserv:我现在将其重命名为“自定义功能”。但是你为什么要投票呢?您是否注意到这可以正确回答问题?而且,我之所以说“健壮”是因为它永远都不会破裂。通过拒绝投票,您只是在帖子中隐藏了适当的答案。
shivams

我之所以投票,是因为您承担了很多:特别是bash和linux,问题中都未指定。另外,您的管道过于复杂,正则表达式也是如此
mikeserv

@mikeserv:感谢您的评论。希望这可以帮助我产生更好的答案。我会接受我的正则表达式和管道很丑陋。但是他们经过了充分的测试,我一直在使用它。关于假设,您是否注意到最高评分的答案采用了用户正在使用的假设screen。评分第二高的答案也假定bashlinux。而且,假设bash并不重要,因为脚本仍可以在zsh或大多数其他shell中找到。
shivams

我没有说这很丑-我说那太复杂了。不,它在大多数其他shell中都无法正常工作。而且,问题中实际显示的CLI是MySQL。不过,关于其他答案的要点。
mikeserv

0

此命令使用bash的历史记录扩展(因此!!扩展到您在终端输入的最后一行)。您可能必须安装xclipxsel

echo "!!" | xclip -selection clipboard

echo "!!" | xsel -i --clipboard

这会将您的最后一个命令放在Ctrl+ v剪贴板中,因此您将能够粘贴到任何GUI程序中(或在大多数终端仿真器中使用Ctrl+ Shift+ v"+p在vim中)。

对于包含双引号的某些行,这将中断,例如:

$ echo "foo;bar"
foo;bar
$ echo "!!"
echo "echo "foo;bar""
echo foo
The program 'bar' is currently not installed. You can install it by typing:
sudo apt-get install bar

它将对您作为示例给出的命令起作用;仅在双引号转义时才有问题; & && | ||,依此类推。


感谢您的回答,这是我可以立即实现的最实用的解决方案。而且我相信只需简单地不引用!!即可避免出现“问题”,只需这样做echo !!就可以正常工作(除非在您以前的命令以或它本身采用的其他几个选项开头的不太可能的情况下)。-n-eecho
sundar-恢复莫妮卡2015年

0

也许不是最方便的解决方案,但是我使用了它,因此它不需要其他任何软安装就可以对其他人有所帮助。

  1. 您需要在任何方便的目录中创建一个临时文件

  2. 将所需的方向或文本传输到该文件。对于转移方向,您可以使用

    echo $(pwd) 1> tempo
    
  3. 要从文件获取方向,请使用命令

    cd $(tail -n 1 tempo)
    

对于复制和粘贴命令,该系统当然可以使用。希望对您有所帮助


Kusalananda感谢您的编辑。现在答案看起来好多了
Dmitriy Kormulev '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.