当前位置: 首页 > Linux

[Tips]在zsh中使用鼠标定位光标简单直接,节省时间,提高命令行操作效率

时间:2023-04-06 21:22:16 Linux

Linux下的命令行shell往往没有自带鼠标定位光标支持,导致一个比较麻烦的问题:如果我写了一个很复杂的命令,想修改里面的一些内容,然后再执行,我需要一直按着键盘上的方向键,找到要替换的内容,按退格键删除,回车执行。这个过程费时费力,而且在服务器管理等方面有延迟时,往往会出现方向键按多了还得按回去的问题。本文将向读者介绍在zsh中安装配置mouse.zsh插件使终端支持鼠标定位,提高命令行操作效率的技巧,以及综合应用各种方法的最佳实践。本文原发于某匿名网站,作者本人同步至SegmentFault。转载请注明原作者博客地址或此链接,谢谢!0x01现有解决方案1——快捷键大法如果你是Shell/Emacs重度用户,看完介绍,你可能会回答Ctrl+A/Ctrl+E大法好,你甚至可以求助于Meta+F/Meta+B招数,但这些快捷键往往还是无法准确定位到想要的位置,依然无法摆脱重复操作。确实,一些shell或窗口管理器如Bash/Tmux支持Vim模式,允许用户使用Vim语法来执行替换/重复/搜索等操作,但这个过程仍然无法摆脱重复的击键、陡峭的学习曲线和繁琐的记忆.0x02现有方案2——用sed??替换快捷键的复杂度是无法避免的,但是其实有一个巧妙的方法,不用输入快捷键就可以替换上次输入的命令,变相的满足了我们的需求。假设这里有一条命令:./server.sh--local-port=8008--remote-port=1233--name="server-8008-1233"--quiet--daemon--no-restart--enable-compression--log="./server-8008-1233.log"我们输入这条命令,发现local-port应该是8088而不是8008,这时候我们就很难使用方向键了或快捷键一次方便地将8008修改为8088。但是如果你使用Bash的内置!语法加上sed,这个操作就会变得很简单:!:s/8008/8088/g这时候bash会另起一行,马上把上一条命令中的8008替换成8088。如果你的命令上次没有输入,也别担心!该语法提供了丰富的可选参数。这里有两个简单的例子:按索引定位!-3:s/8008/8088/g定位前第三次输入命令以前缀!./server:s/8008/8088/g定位最近输入的命令,前缀为./server。完整内容请参考GNUBash文档:https://www.gnu.org/software/bash/manual/html_node/History-Interaction.html#History-Interaction。这种方法虽然巧妙,但其替代性仍有局限性。有没有更好的方法可以帮助我们快速定位呢?0x03使用鼠标快速定位其实在鼠标发明之初,并没有指针。当时的“鼠标指针”只是命令行界面中闪烁的光标。操作系统允许用户通过移动鼠标(如DOS命令行鼠标)快速移动光标,以提高操作效率。随着GUI的普及,我们逐渐形成了“鼠标是为图形界面而生”的思维定势,但如果回顾过去,就会发现并非如此。正如编辑文本时使用鼠标定位光标更方便一样,命令行操作时使用鼠标定位也是最简单直接的提高操作效率的方法。遗憾的是大部分终端模拟器或者shell都没有内置鼠标支持,但是如果读者使用zsh,有一个非常好用的插件mouse.zsh可以为zsh添加鼠标支持,安装方法如下如下:wgethttp://stchaz.free.fr/mouse.zsh-O/usr/bin/mouse.zshecho"./usr/bin/mouse.zsh">>~/.zshrcecho"bindkey-Memacs'\em'zle-toggle-mouse">>~/.zshrcsource~/.zshrc这时候我们按下esc&m(不能同时按下,先按下esc再按下m)进入鼠标模式(模拟VT200terminal),那么终端已经支持使用鼠标定位了,我们可以在命令中任意位置点击鼠标左键定位,然后按Ctrl+W删除光标前的单词,最后再按esc&m退出鼠标模式。这里我再举一个例子:./server.sh--no-restrat--silent假设我不小心输入了--no-restart为--no-restrat,那么我们按esc&m,然后在--后面的空格处点一下no-restrat鼠标,按Ctrl+W删除该参数。./server.sh--silent接下来我们输入正确的参数:./server.sh--no-restart--silent然后按esc&m退出鼠标选择模式,这时我们使用鼠标编辑成功这个命令。这里有几点需要注意:如果觉得esc&m还是很累(毕竟需要按两个键),可以echo"bindkey-Memacs'\em'zle-toggle-mouse"安装命令>>~/.zshrc替换为echo"zle-toggle-mouse">>~/.zshrc,但缺点是在某些不支持独立编辑模式的终端无法使用鼠标进行选框.如果您在使用MacOS自带的Terminal.app,发现仍然无法使用鼠标定位,请开启内置终端的鼠标报告功能(快捷键:Command+R)。(方法2可以和方法1结合使用,利用鼠标报告功能的切换来区分方框选择和鼠标选择模式)\em代表esc&m,是ECMA-48规定的转义序列表,您还可以使用符合ECMA标准的-48附加快捷键规则来触发鼠标选择模式。0x04BestPractice上面描述了纯命令行的不便,也介绍了使用鼠标快速定位的方法,但是如果要问哪种方法效率更高,其实没有固定的规律,不同的方法有自己的应用笔者个人总结了以上三种编辑方式的一些最佳实践:1.场景中使用快捷键编辑的内容在开头(比如需要加一个sudo),需要马上跳转到行首或行尾在这一行的开头,如果要删除整行,需要删除某个单词或参数。2、在使用sed替换的场景下,需要重复旧命令,但是新命令有规律的变化。SimpleTypo(比如输入错误的参数)3.使用鼠标定位的场景需要重复老命令,但是新命令改变了更多/复杂的typo(比如缺少关键参数等)面临的情况读者在实际操作过程中可能比本文描述或总结的要复杂,所以对于哪种方法更好并没有定论,但是在不同情况下综合运用不同的方法,一定会帮助读者提高命令行操作的效率,本文主要介绍的鼠标定位主要是为了填补一些场景下的空缺。希望这篇文章能对读者有所帮助和启发。