乐趣区

关于linux:小技巧-在zsh中使用鼠标定位光标简单直接节省时间提升命令行操作效率

Linux 下的命令行 Shell 因为其历史起因(须要兼容没有鼠标的设施如电传打字机),往往并不自带鼠标定位光标反对,这就造成一个比拟麻烦的问题:如果我写了一个非常复杂的命令,想要批改外面的局部内容,再执行一次,就须要始终按下键盘上的方向键,找到想要替换的内容,狂按 backspace 删除,再回车执行。这一过程费时费力,且在服务器治理等存在提早的状况下经常出现方向键按太多,又得按回去的问题。本文将为读者介绍在 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。

如果你的命令并不在上一次输出,同样不必放心,! 语法提供了丰盛的参数可选,这里简略列举两项:

  1. 通过索引定位
!-3:s/8008/8088/g

定位后面倒数第三次输出的命令

  1. 通过前缀定位
!./server:s/8008/8088/g

定位最近一次输出前缀为 ./server 的命令

全部内容可参考 GNU Bash 的文档:https://www.gnu.org/software/bash/manual/html_node/History-Interaction.html#History-Interaction。

这种办法只管奇妙,但其替换的实质仍旧存在局限性,有没有更好的方法能帮忙咱们疾速定位呢?

0x03 应用鼠标疾速定位

其实在鼠标创造之初是并没有指针的,过后的『鼠标指针』只是命令行界面中一个闪动的光标,操作系统容许用户通过挪动鼠标的形式来疾速挪动光标(如 DOS 中的命令行鼠标),实现更高效的操作。

随着 GUI 的遍及,咱们逐步造成了『鼠标是为图形界面服务』的思维定式,但如果追溯过往,其实会发现并非如此。正如编辑文本时应用鼠标定位光标更不便,在命令行操作过程中应用鼠标进行定位也是晋升操作效率最简略、最间接的形式。

比拟惋惜的是,大多数终端模拟器或 Shell 并没有自带鼠标反对,但如果读者们应用的是zsh,有一个很好用的插件 mouse.zsh 能够为 zsh 新增鼠标反对,装置办法如下:

wget http://stchaz.free.fr/mouse.zsh -O /usr/bin/mouse.zsh
echo ". /usr/bin/mouse.zsh" >> ~/.zshrc
echo "bindkey -M emacs'\em'zle-toggle-mouse" >> ~/.zshrc
source ~/.zshrc

这时咱们按下 esc & m(不是同时按,是先按 esc 再按 m)就会进入鼠标模式(模仿 VT200 终端),这时终端就已反对应用鼠标定位,咱们能够在命令的任意地位点击鼠标左键进行定位,而后按下 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,退出鼠标抉择模式,这时咱们就应用鼠标胜利编辑了这一命令。

这里有几点须要留神:

  1. 如果感觉 esc & m 还是很累(毕竟要按两个键),能够将装置命令中的 echo "bindkey -M emacs'\em'zle-toggle-mouse" >> ~/.zshrc 替换为 echo "zle-toggle-mouse" >> ~/.zshrc,但毛病是在局部不反对独立编辑模式的终端下无奈失常应用鼠标进行框选。
  2. 如果你应用的是 MacOS 自带 Terminal.app,发现仍旧无奈应用鼠标进行定位,请开启自带终端的鼠标报告性能(快捷键:Command + R)。

(办法 2 能够配合办法 1 应用,利用鼠标报告性能的开关来辨别框选与鼠标抉择模式)

  1. \em代表 esc & m,这是 ECMA-48 所规定的转义序列表,你也能够应用满足 ECMA-48 规定的其余快捷键来触发鼠标抉择模式。

0x04 最佳实际

下面介绍了纯命令行的不便之处,也介绍了应用鼠标进行疾速定位的办法,但如果想问什么办法更高效,其实是没有一个固定规定的,不同的办法各自有其实用之处,笔者集体针对以上三种编辑办法总结了一些最佳实际:

1. 应用快捷键的场景

  • 须要编辑的内容在最开始(比方须要加一个 sudo)
  • 须要立即跳转本行到最开始或最初
  • 在本行最开始,想要删除整行内容
  • 须要删除某个单词或参数

2. 应用 sed 替换的场景

  • 须要反复旧命令,但新命令存在有法则的变动
  • 简略的 Typo(如输错参数)

3. 应用鼠标定位的场景

  • 须要反复旧命令,但新命令变动较多 / 较简单
  • 简单的 Typo(如漏掉要害参数等)

在读者实际操作过程中所面临的状况可能比本文所形容或总结得更为简单,因而哪种办法更好其实没有一个定论,但在不同的状况下综合应用不同办法,肯定能帮忙读者晋升命令行操作效率,而本文次要介绍的鼠标定位次要还是为了填补局部场景下的空缺。心愿本文能对读者有所帮忙、有所启发。

退出移动版