【问题标题】:Fastest way(s) to move the cursor on a terminal command line?在终端命令行上移动光标的最快方法?
【发布时间】:2023-03-28 12:31:01
【问题描述】:

在终端中给定的很长的命令行上移动的最佳方式是什么?

假设我使用箭头键或 Ctrl-R 来获得这么长的命令行:

./cmd --option1 --option2 --option3 --option4 --option5 --option6 --option7 --option8 --option9 --option10 --option11 --option12 --option13 --option14 --option15 --option16 --option17 --option18 --option19 --option20 --option21 --option22 --option23 --option24 --option25 --option26 --option27 --option28 --option29 --option30 --option31 --option32 --option33 --option34 --option35 --option36 --option37 --option38 --option39 --option40 --option41 --option42 --option43 --option44 --option45 --option46 --option47 --option48 --option49 --option50 

现在我需要将光标(从行首或行尾开始)移动到--option25 以在那里修改某些内容。

到达那里最快的方法是什么?我通常做的是 Ctrl-A 到开始,然后反复 Alt-F 前进, 逐字逐句(或 Ctrl-E 走到结尾,Alt-B 然后向后退) .但是排长队需要太多时间。必须有一种方法可以搜索并直接跳转到我需要修改的部分,例如option25?

【问题讨论】:

    标签: bash terminal window


    【解决方案1】:

    我更喜欢 vi 编辑模式(因为这些击键现在嵌入到我的脊髓中(大脑根本不使用),以及 WordStar 3.3 中的 CTRL-K、CTRL-X :-)。您可以使用命令行set -o vi 来激活它(并使用set -o emacs 来恢复)。

    在 Vi 中,它会是(ESC-K 首先排好队)“f5;;B”(不带双引号)。

    当然,您必须了解要避免这种情况。基本上是

    f5 to find the first occurrence of "5" (in --option5).
    ;  to find the next one (in --option15).
    ;  to find the next one (in --option25).
    B  to back up to the start of the word.
    

    让我们看看emacs爱好者能否想出更好的解决方案,少于5次击键(虽然我不想引发宗教战争)。

    您是否考虑过是否愿意将这个长得可怕的命令放入脚本中? :-)

    实际上,我可以比这更好:“3f5B”找到第三次出现的“5”,然后返回到单词的开头。

    【讨论】:

    • 不需要脚本 - 只需在 vi 模式下按“v”并在编辑器中打开命令行。您可以使用换行符更好地格式化命令行、错误、“脚本”,并且不需要临时文件。 :) 所以,“v/25”让你在 4 个字符内到达那里。
    • 但是,您需要的不仅仅是 键来运行它。 @dannysauer
    【解决方案2】:

    运行一次命令后,运行fc

    它将使用前面的命令启动$EDITOR,然后您可以使用常规编辑器修改该命令。保存退出后,文件将被执行。

    ..但是,正如 Pax 所说 - 命令行并不特别适合编辑荒谬的长行 - 为什么不将命令变成脚本?

    【讨论】:

      【解决方案3】:

      一种选择是在emacs 中使用M-x shell。这提供了emacs 拥有的所有编辑功能和击键,因此C-s 可用于搜索文本option25,例如。

      (但如果有人可以为我指出良好的搜索和编辑工具,我仍然更喜欢使用真正的终端外壳。)

      【讨论】:

        【解决方案4】:

        由于尚未关闭,这里还有一些选择。

        • 使用 Ctrl+x 后跟 Ctrl+e 在指定的编辑器中打开当前行$FCEDIT$EDITORemacs(按此顺序尝试)。
        • 如果您之前运行过该命令,请按 Ctrl+r 进行反向历史搜索并输入 option25(在这种情况下)。将显示该行。点击 Tab 开始编辑。
        • 使用带有s/// 修饰符的历史扩展。例如。 !-2:s/--option25/--newoption/ 将重新运行倒数第二个命令,但替换 option25。要修改最后一个./cmd 命令,请使用!string 语法:!./cmd:s/--option25/--newoption/
          可以使用任何分隔符代替 / 在替换中。
        • 如果编辑上一行,可以使用快速替换:^--option25^--newoption
        • 字符搜索。 Pax 提到了这一点,可以在常规 emacs 模式下使用 Ctrl+] 进行前向搜索和 Ctrl+ Alt+] 用于向后搜索。

        我推荐第二个选项。 Ctrl+r 非常方便快捷,无需与编辑器混为一谈,并且您在命令运行之前就可以看到结果(与历史扩展不同)。

        【讨论】:

          【解决方案5】:

          使用 Meta-b / Meta-f 分别向后/向前移动一个单词。

          在 OSX 中,Meta 翻译为 ESC,这很糟糕。

          但或者,您可以打开终端首选项 -> 设置 -> 配置文件 -> 键盘并选中“使用选项作为元键”

          【讨论】:

            【解决方案6】:

            明确地说,您不想要“在 终端 命令行上移动光标的快速方法”。 您真正想要的是一种在 shell 程序中快速浏览命令行的方法。

            Bash 是非常常见的 shell,例如。 它使用Readline 库来实现命令行输入。可以这么说,了解 Readline 绑定非常方便,因为它不仅用于 bash。例如,gdb 也使用 Readline 来处理输入。

            在 Readline 文档中,您可以找到所有与导航相关的绑定(以及更多): http://www.gnu.org/software/bash/manual/bash.html#Readline-Interaction

            如果上面的链接失效,请短复制粘贴:

            基本要素

            • Ctrl-b 后退一个字符。
            • Ctrl-f 向前移动一个字符。
            • [DEL] 或 [Backspace] 删除光标左侧的字符。
            • Ctrl-d 删除光标下的字符。
            • Ctrl-_ 或 C-x C-u 撤消上一个编辑命令。您可以一直撤消到空行。

            运动

            • Ctrl-a 移动到行首。
            • Ctrl-e 移动到行尾。
            • Meta-f 向前移动一个单词,其中单词由字母和数字组成。
            • Meta-b 向后移动一个单词。
            • Ctrl-l 清屏,在顶部重新打印当前行。

            杀死和拉扯

            • Ctrl-k 删除从当前光标位置到行尾的文本。
            • M-d 从光标终止到当前单词的结尾,或者如果在单词之间,则到下一个单词的结尾。字边界与 M-f 使用的相同。
            • M-[DEL] 从光标终止当前单词的开头,或者如果在单词之间,则终止到前一个单词的开头。字边界与 M-b 使用的相同。
            • Ctrl-w 从光标处终止到上一个空格。这与 M- 不​​同,因为单词边界不同。
            • Ctrl-y 将最近删除的文本拉回光标处的缓冲区。
            • M-y 旋转杀伤环,拉出新顶部。只有在前面的命令是 C-y 或 M-y 时才能执行此操作。

            M 是元键。 对于 Max OS X 终端,您可以为此在设置/键盘中启用“使用选项作为元键”。 对于 Linux,它更复杂。

            更新

            另请注意,Readline 可以在两种模式下运行:

            切换 Bash 以使用 vi 模式:

            $ set -o vi
            

            我个人更喜欢 vi 模式,因为我使用 vim 进行文本编辑。

            奖金

            在 macOS 终端应用程序(以及 iTerm 中)中,您可以按住 Option 键并单击以移动光标(光标将移动到单击位置)。这甚至可以在 vim 中使用。

            【讨论】:

            • 我更喜欢这个答案,因为它理解了 bash 键盘输入的工作原理(其来源),即 Readline。
            • 在标准 Ubuntu 终端中,Meta (M) 是 Alt+Shift,除非您禁用菜单访问键盘快捷键,在这种情况下它只是 Alt。
            • 在 Konsole 的 Kde 中,Meta (M) 是 alt 键
            • 问题是如果 Meta 是 ALT,Meta+F 不起作用,因为 ALT 可以访问正在运行的程序的菜单(在本例中为终端)。有其他选择吗?
            • 什么是M-f,所以你这里不用控制,那是什么?
            【解决方案7】:

            增量历史搜索

            在终端输入:

            gedit  ~/.inputrc
            

            然后复制粘贴并保存

            "\e[A": history-search-backward
            "\e[B": history-search-forward
            "\e[C": forward-char
            "\e[D": backward-char
            

            要查找上一个命令,您只需输入前 2 或 3 个字母,然后向上箭头将带您快速到达那里,说我想要:

            for f in *.mid ; do timidity "$f"; done
            

            我需要做的就是输入

            fo
            

            点击向上箭头命令很快就会出现

            【讨论】:

              【解决方案8】:

              如果您想前进一定数量的单词,请点击M-<n>M- 用于 Meta,通常是转义键)然后点击一个数字。这会向 readline 发送一个重复参数,因此您可以重复任何您想要的命令 - 如果您想继续前进,请点击 M-<n> M-f,光标将向前移动 <n> 字数。

              例如

               $|echo "two three four five six seven"
               $ M-4
               (arg: 4) echo "two three four five six seven"
               $ M-f
               $ echo "two three four| five six seven"
              

              因此,对于您的示例,您将点击行首的光标M-26 M-f,您的光标将位于--option25| - 或- 从行尾M-26 M-b 将光标放在@ 987654329@

              【讨论】:

                【解决方案9】:

                按住 Option 键并单击您希望光标移动的位置,终端会将光标移动到该精确位置。

                【讨论】:

                • 你只是复制了我的效率
                • 这适用于哪些环境?我猜只在 Mac OS 中?
                • 在远程 ssh linux 上工作,甚至通过跳转服务器。
                【解决方案10】:

                使用鼠标

                有时,编辑命令行最简单的方法是使用鼠标。以前的一些答案给出了在 $EDITOR 中打开当前行的命令。对我(带有 grml 配置的 zhs)来说,这个组合是 Alt+e。如果您在编辑器中启用鼠标,则可以使用它。

                要在 Vim 中启用鼠标,请将其添加到 ~/.vimrc

                set mouse=a
                set ttymouse=xterm2
                

                如果您想在终端中进行文本选择(而不是将鼠标单击传递给 vim),请在单击时按住 Shift;当然,这是特定于终端的。

                系统管理员不应该害怕鼠标。

                【讨论】:

                  【解决方案11】:

                  在 Cygwin 中,您可以通过右键单击窗口来激活此类功能。在弹出窗口中,选择选项... -> 鼠标 -> 激活点击放置命令行光标 -> 应用。

                  从现在开始,只需在命令行中的某个位置单击鼠标左键即可将光标放置在那里。

                  【讨论】:

                    【解决方案12】:

                    首先: 导出 EDITOR='nano -m'

                    然后: CTRL+X CTRL+E 依次进行。

                    您当前的行将在启用鼠标的 nano 编辑器中打开。您可以单击文本的任何部分并进行编辑

                    然后 CTRL+X 退出,y 确认保存。

                    【讨论】:

                      【解决方案13】:

                      我编写了一个脚本来使命令行鼠标点击时光标移动

                      1. 启用 xterm 鼠标跟踪报告
                      2. 设置 readline 绑定以使用点击生成的转义序列

                      可以在github上找到

                      更多信息another post

                      如果echo -e "\e[?1000;1006;1015h" # Enable tracking 使用鼠标单击时在终端上打印转义序列,则将起作用

                      【讨论】:

                        【解决方案14】:

                        它可能不是最快的,但它需要在这里,一些关于ANSI cursor movements的阅读

                        ANSI 转义序列允许您随意在屏幕上移动光标。这对于 由 shell 脚本生成的全屏用户界面更有用,但也可以在提示中使用。运动转义序列如下:

                        - Position the Cursor:
                          \033[<L>;<C>H
                             Or
                          \033[<L>;<C>f
                          puts the cursor at line L and column C.
                        - Move the cursor up N lines:
                          \033[<N>A
                        - Move the cursor down N lines:
                          \033[<N>B
                        - Move the cursor forward N columns:
                          \033[<N>C
                        - Move the cursor backward N columns:
                          \033[<N>D
                        
                        - Clear the screen, move to (0,0):
                          \033[2J  or \033c
                        - Erase to end of line:
                          \033[K
                        
                        - Save cursor position:
                          \033[s
                        - Restore cursor position:
                          \033[u
                        

                        (...)

                        尝试在提示符处输入以下代码行(如果输入时提示符位于终端下方的几行,它的作用会更清楚一些):echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D" 这应该将光标移动七排好屏幕,打印“BASH”这个词,然后返回到它开始产生正常提示的地方。


                        示例

                        将光标向后移动 7 行:

                        echo -e "\033[7A"
                        

                        将光标移动到第 10 行第 5 列:

                        echo -e "\033[10;5H"
                        

                        快速回显colors codes,为程序着色:

                        echo -e "\033[35;42m" ; ifconfig
                        

                        【讨论】:

                          【解决方案15】:

                          使用选项键并单击您要使用鼠标或触摸板放置光标的位置是您使用的是 Mac 内置终端。

                          【讨论】:

                          • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
                          猜你喜欢
                          • 2018-12-05
                          • 1970-01-01
                          • 2013-08-19
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2014-08-28
                          • 1970-01-01
                          相关资源
                          最近更新 更多