目录
5.3 no such file or directory: zsh-autosuggestions.zsh^M
只要你接触过Ubuntu,必定对它的默认终端GNOME Terminal不陌生。
它的底色和字符配色大概是下图的样子。(图中蓝色箭头属于zsh的主题配置,后面会讲)
但是,这个终端工具无法实现分屏,配色也比较单一,不利于提高终端调试的效率。
基于这种需求,我们整合了一款用Terminator和zsh打造的终端利器,分享给大家。
其中,终端选择Terminator,shell工具选择zsh。
一、可分屏的终端利器Terminator
1. 安装Terminator
sudo apt update
sudo apt install terminator
2. 设置Terminator为默认终端
由于默认终端可以用Alt+Ctrl+T唤起,我们将默认终端改为Terminiator。
网上有不同的配置方法,推荐使用以下方法:
gsettings set org.gnome.desktop.default-applications.terminal exec /usr/bin/terminator
gsettings set org.gnome.desktop.default-applications.terminal exec-arg "-x"
哪天想念Gnome Terminal,用下面的方法换回:
gsettings reset org.gnome.desktop.default-applications.terminal exec
gsettings reset org.gnome.desktop.default-applications.terminal exec-arg
注意:在文件夹内右键选择在终端打开,还是会使用系统默认的终端。
3. 推荐配置
启动Terminator,右键选择“首选项设置”,打开设置界面进行配置。
主要是在Preferences->Profiles对应的选项页中修改。
3.1 General中修改字体为等宽字体
推荐DejaVu Sans Mono。
建议自己试试,找一款看着舒服,而且能轻松识别数字0和字符O就好。
3.2 General中勾选开启:选中时复制(Copy on Selection)
之后,对于想要复制的内容,选择即复制,粘贴则使用按鼠标中键。
这要比右键复制粘贴更方便,肉眼可见地提升了效率。
还有贴心的小技巧:对于单词,双击即可选中,三击选中一行。
4. 常用快捷键
新建窗口:Ctrl+Shift+T
关闭窗口:Ctrl_Shift+W
水平划分窗口:Ctrl+Shift+O
垂直划分窗口:Ctrl+Shift+E
窗口切换:Ctrl+Tab或者Alt+方向键
建议修改快捷键为自己熟悉的,比如关闭tab窗口,浏览器和IDE通常都是Ctrl+W,为了保持习惯一致,可以将其修改为Ctrl+W。
5. 常见问题
5.1 如何切换终端?
Ubuntu有一个方便的命令行实用程序,叫做update-alternatives,它可以处理默认的应用程序。当然也可以使用它来更改默认的命令行文本编辑器,终端等。
例如,修改默认的命令行文本编辑器的命令:
sudo update-alternatives --config x-terminal-emulator
它将显示系统上存在的所有终端,当前的默认终端标有星号。
如上图,有6个候选项可用于替换x-terminal-emulator。每个候选项提供序号、路径、优先级和状态等信息。其中,状态分为自动模式和手动模式两种。如果选择自动模式,则在安装或删除软件包时,系统可能会自动决定默认应用程序。该决定受优先级数字的影响。
假设Ubuntu系统上安装了2个终端,并且删除了默认的终端。那么,系统将检查哪些终端处于自动模式。如果有多个,它将选择优先级最高的一个作为默认终端。
5.2 横向分屏快捷键ctrl+shift+E不灵
考虑Ubuntu系统中有其他程序占用了快捷键ctrl+shift+E。
例如,如果安装了搜狗输入法, ctrl+shift+E是它的中英文输入法切换的快捷键。可以试试看看按了ctrl+shift+E以后输入法是不是只能输入英文了。
点击“高级”选项卡的“系统功能快捷键”按钮,弹出如下界面。
取消选择“英文输入法”的勾选,或者更改快捷键组合,都可以。
二、终端交互神器——zsh
早期的shell是sh,而现在很多Linux版本(包括Ubuntu)的系统默认shell为bash,它是对sh的增强改进版本。bash更加符合posix标准,因此更适合做脚本解释器;而从交互式角度来讲,专为交互而设计的zsh更为强大,并包含其他shell(bash/ksh/csh)的优秀特性。
所以推荐在使用终端时选择zsh,而在写脚本声明解释器时选bash。
1. zsh的几大使用功能
zsh被称为终极shell,它非常强大,比较实用的功能如下:
1)色彩高亮
如果你是颜控,相信你在第一眼就会喜欢上zsh。
除了可以变得很好看以外,不同的颜色表明当前命令的类型,并且路径有无下划线表示路径是否存在;这可以快速帮助我们发现错误。
2)命令提示
命令提示的好用之处在于帮助补全。
输入命令会根据输入的历史自动补全,并且随着输入不断修正,如果补全是你期望的结果,按下右方向键接受,再回车即可。
3)智能补全
在使用cd切换路径时,按下tab会列出当前目录下的目录和文件,如果是bash,它会提示你手动输入,但是zsh中你可以继续按一下tab进入选择模式,继续使用tab选择,或者使用方向键选择目标目录而不需手动输入。
2. 安装zsh
安装前,先查查系统已安装的shell及当前的shell。
cat /etc/shells
echo $SHELL
如果列出的shell中没有zsh,通过以下命令安装:
sudo apt update
sudo apt install zsh -y
3. 查询位置并设置zsh为默认shell
which zsh
chsh -s /bin/zsh
同理,你可以用类似命令换回bash。
which bash
chsh -s /bin/bash
三、配置zsh
直接配置zsh比较繁琐,建议直接使用Oh-My-Zsh进行配置。
1. 下载zsh
直接根据Oh-My-Zsh Gitlab仓库WiKi或者官网https://ohmyz.sh/的命令进行安装:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
直接安装可能因为网络连接不稳定而失败,建议使用git clone源码。
# 国外源
git clone https://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
# 国内源
git clone https://gitee.com/who7708/oh-my-zsh.git ~/.oh-my-zsh
2. 创建 .zshrc 配置文件
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
3. 设置主题
Oh-My-Zsh默认安装了很多主题,位于目录.oh-my-zsh/themes下。通过zsh配置文件~/.zshrc中的主题设置为自己喜欢的主题名字即可:
ZSH_THEME="robbyrussell"
如果设置ZSH_THEME="random",那么每次打开新的终端窗口时会随机选择一个主题使用,echo $RANDOM_THEME可获取当前主题名称。
如果想从限定的主题列表中随机选择,那么同时设置ZSH_THEME_RANDOM_CANDIDATES即可,例如:
ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )
关于主题,还是选择自己喜欢的就好,可以试试网友推荐的Source Code Pro for Powerline Regular或者Ubuntu mono derivative Powerline Regular,后者像是前者的微胖版本。
有的主题必须使用powerline字体,通过以下命令安装:
sudo apt install powerline fonts-powerline
推荐主题:agnoster / agnosterzak。
其中,agnoster默认安装,agnosterzak需要手动安装:
cd ~/.oh-my-zsh/themes
wget https://raw.githubusercontent.com/zakaziko99/agnosterzak-ohmyzsh-theme/master/agnosterzak.zsh-theme
这两个是带有git prompt的主题,安装后进入git仓库目录,可以直观看到当前的分支名称,可以看到仓库的状态:有几个文件没有追踪,添加了几个文件,改动了几个文件。
对于大型的git仓库,因为oh-my-zsh进入git目录会检查git的各种状态,所以在跳转的时候会明显变慢,可以禁止oh-my-zsh读取git status,使用如下命令关闭检查功能:
#针对特定git仓库
git config --add oh-my-zsh.hide-status 1
git config --add oh-my-zsh.hide-dirty 1
#全局设置:
git config --global oh-my-zsh.hide-status 1
git config --global oh-my-zsh.hide-dirty 1
4. 设置常用插件
默认安装的插件位于路径.oh-my-zsh/plugins/。
自己下载的插件存放位置稍有不同,位于~/.oh-my-zsh/custom/plugins。
插件配置通过zsh配置文件~/.zshrc中的plugins即可:
plugins=(
zsh-syntax-highlighting
zsh-autosuggestions
zsh-completions
history-substring-search
git
autojump
extract
)
常用插件的github操作如下:
cd ~/.oh-my-zsh/custom/plugins
github地址:
git clone https://github.com/zsh-users/zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-completions
git clone https://github.com/zsh-users/zsh-history-substring-search
#国内
git clone https://gitee.com/who7708/zsh-syntax-highlighting
git clone https://gitee.com/who7708/zsh-autosuggestions
git clone https://gitee.com/who7708/zsh-completions
git clone who7708/zsh-history-substring-search
若提示插件不存在,可使用如下命令单独获取:
4.1 命名高亮:zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
4.2命令补全:zsh-autosuggestions
输入命令时可提示自动补全(灰色部分),然后右方向键即可补全
git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
4.3目录跳转:autojump
可使用包管理器直接安装:
sudo apt-get install autojump
这个插件会自动统计我们经常cd的目录,不同目录会有不同的权重。在我们想要进入某个目录时,使用j <dir-name>即可以帮助我们快速跳转到目标目录;即使我们给出的目录不准确,它也会启动模糊匹配,根据权重,往往也能跳转到我们想要进入的目录;如果进入的不对,执行同样的命令它会继续搜索。
4.4文件解压:extract
Linux系统对于不同类型的压缩格式:.tar、.tar.gz、.tar.bz2、.tar.xz、.rar、.zip,解压命令各不相同。有了这个插件就不用纠结了,一律使用
x <archived file>
5. 可能出现的问题
5.1 无法下载zsh插件
选择国内源,或者使用vpn访问github。
5.2 主题乱码
可以换一个字体库,确保字体安装正确。
5.3 no such file or directory: zsh-autosuggestions.zsh^M
错误提示说找不到zsh-autosuggestions.zsh文件,但明明这个文件是存在的。核对文件名,也不存在^M字符。思考下来,可能它只是无法识别,也就是说zsh-autosuggestions.zsh文件里可能存在了隐藏字符^M,导致它认不出来该文件。
这种情况可能发生在你用windows系统git clone源文件,但使用却在Linux中。有可能git clone下载这插件时,git是按照windows的标准进行clone的,导致Linux无法识别,报这个^M的识别错误。
如果你有这种多系统中git提交代码的需求,可以对git进行如下设置:
git config --global core.autocrlf true
意思是,提交时转换为LF,检出时转换为CRLF,而CRLF是Windows的换行符。
四.ROS适配
我们在装完zsh重启后发现已经可以自动提示并右键补全了,但是我们在roscore的时候却提示commond not found,这其实比较好理解,因为我们之前在通过chsh -s /bin/zsh指令时终端解释器已经变更为zsh ,故之前在~/.bashrc中的设置需要重新在~/.zshrc中配置。我们设置如下指令即可。
source /opt/ros/noetic/setup.zsh
如果是ros和ros2的双系统,建议在~/.zshrc增加如下内容。
然后重新source zsh,完成zsh的适配,值得注意的是,我们以后所有需要在bashrc修改的需要全部移植到zshrc中了。
后面的话
Terminator是命令行终端的UI,解决快速分屏和色彩搭配问题。
Zsh是shell交互工具,能进一步提升交互效率。
无论是图个新鲜,或是想提高终端工作效率,都值得尝试一下Terminator+zsh的神器组合。
参考链接
ohmyzsh/ohmyzsh: A delightful community-driven