如何将终端滚动回到上次输入命令的位置?

42

我有一个程序,其输出非常大。一旦完成后,我经常希望能够滚动回到运行的开头,这样我就可以查看那里的某些内容。然而,由于输出太长了,我发现自己不停地使用PageUp键进行滚动,并试图拖动右侧的滚动条到可能开始的位置。经过一段时间,这开始变得非常烦人,所以我想知道:

是否有一种简便的方法让终端滚动回到最后一条命令所在的位置?


1
对于使用Windows和ConEmu的用户,您可以使用Ctrl+Alt+RePag。 - Fran Cano
10个回答

33

我刚在OSX的终端中找到了这个:

编辑 > 导航 > 跳转至上一个标记:cmd + UP。


7
这个选项非常棒,希望我能在Linux终端中找到一个等效的选项。 - gib
3
如果你在运行上个命令和跳转到上一个标记之间重新调整了终端窗口大小,那么它将不准确。我认为上一个标记是基于行的,所以跳转回那一行时,根据新的窗口宽度,内容已经改变了。 - blobdon

8
在MacOS上使用iTerm2:
您必须安装Shell Integration(iTerm-> Install Shell Integration),然后打开一个新标签页。
+Shift+Up跳转到最后一个标记。也可以在“编辑”->“标记和注释”->“下一个标记”下找到。

2
我认为只有先设置标记才能起作用,对吧?快捷键是 ⇧+⌘+M。 - phip
1
这需要安装Shell Integration,就像我之前提到的那样。然后iTerm会自动在每个输入的命令旁边打上一个标记。 - caarrrl
是的,这取决于Shell集成。与其他终端(如kittyfoot和希望最终实现的tmux + tmux/tmux PR #3596)的OSC 133提示符+滚动集成方式非常相似。 - TrinitronX

6
我在macOS中使用,我想到了一个方法。首先,您应该确保在iTerm2的首选项中检查了无限回滚enter image description here 在您在终端中运行命令并获得长长的输出后,
按下Cmd+F(也许是Windows中的ctrl+F),然后您可以像这样在终端中搜索:

enter image description here

最后,只需搜索您的用户名并按下Enter键,通常您将跳转到最后一个命令:

enter image description here


2
这是一个hack,但我确实喜欢你的想法。 - Jay Modi

5

在Linux中实现IT技术

Add to your prompt an identifier (for example add in the bottom of your .bashrc):

promptCount=0
PROMPT_COMMAND=promptCount=$((promptCount+1))
PS1="/\$promptCount\\ $PS1"

Now use the search funcionality of the terminal, perhaps Ctrl + Shift + F, for the prompt line you wish.

使其更加方便:

Install xdotool (command-line X11 automation tool)

Create a function that will press the exact keys that you would press when finding the N prompt line through the searching functionality (add in the bottom of your .bashrc):

gp () { xdotool key ctrl+shift+F; xdotool type /$1\\ ; xdotool key KP_Enter;sleep 0,2; xdotool key Alt+F4; }

(At least these are the exact keys that I would press to do it in Manjaro Xfce)

现在:

输入图像描述

GIF 图片中没有显示一个小框架,它用于显示搜索窗口,N 的标识符被写入,按下快捷键 Enter ,然后关闭窗口。您可以尝试通过更改传递给 sleep 命令的参数值来加速这个过程。 在我的情况下,直到 0.11 左右,它都能正常工作。


3
一个简单的 Hack,适用于输出需要一些时间才能打印完毕的情况(比如调用 make 命令):
执行命令后立即向上滚动一小段距离(例如一行),因为此时不在底部,这可以防止大多数终端自动向下滚动。 当你认为已经打印完毕时(滚动条位置和感觉是很好的指标),你可以向下滚动。 只需避免在打印期间滚动到最后一行。

3
我通常使用less来管道输出,例如command | less,因为它有许多有用的快速导航键,并支持搜索。你还可以自动从输出的开头开始。
以下是一些快速导航的有用命令:
  • fSPACE向前翻一页,b向后翻一页。一页指终端窗口大小的输出。
  • g跳到开头,G跳到结尾,[n]g 跳到第 n 行。例如,5g将跳转到第5行。
  • /pattern 搜索术语,然后使用 n查找下一个匹配项,使用N查找上一个匹配项。支持 RegExp。
  • q退出。
  • 欲了解更多信息,请执行 man less。Man页面默认也使用less,因此上述所有内容都适用。

    3
    如果您正在使用像GNOME Terminal这样的终端,您可以进行向后搜索。例如,Ctrl+Shift+f,然后输入文字命令或正则表达式以匹配它(并确保相应地设置“作为正则表达式匹配”)。
    一种解决方法是将输出发送到像less这样的分页器中,您可以浏览和检查输出,然后返回到命令行,就好像没有打印任何内容一样。

    这是适用于Linux的唯一有用的答案。我的终端中 less 命令很混乱,所以我现在将使用 Ctrl Shift f 并搜索我的用户名。 - bruno

    1
    我们可以在运行命令之前使用Ctrl-L清除终端。运行命令后,使用Ctrl-Home回到顶部。

    0

    直接将输出重定向到一个文件,这样可以使你的终端窗口保持“干净”,不是更容易吗?

    类似这样:command >> 输出文件


    是的,我以前做过这个。但是90%的时间,运行是没有用的,因为我不需要进一步的结果。过了一段时间,那个文件夹就开始堆积无用的文件。当然,我可以覆盖相同的几个文件,但我仍然需要再次打开文件,即使我经常只花几秒钟看一眼,然后再继续前进。 - kramer65
    你尝试过类似这样的命令吗:command > /dev/null 2>&1。这可以将输出重定向到 /dev/null 的虚无之中,并将错误重定向到标准输出流。 - zaSmilingIdiot

    0

    如果你使用screen,我认为有一种方法。

    1. 使用screen命令启动会话
    2. 执行您的命令(该命令在屏幕上输出一些数据)
    3. 键入Ctrl+a,然后是[。屏幕进入复制模式。
    4. 您可以使用?向后搜索命令提示符(就像vi一样)

    此外,screen具有许多优点。请查看http://kb.iu.edu/data/acuy.html


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接