fish (简体中文)

From ArchWiki
Jump to: navigation, search

翻译状态: 本文是英文页面 Fish翻译,最后翻译时间:2017-11-07,点击这里可以查看翻译后英文页面的改动。

fish, 是 "friendly interactive shell" 的缩写, 是一个"为交互式使用而创建,用户友好的 命令行shell". [1]

安装

从官方仓库安装 fish包 ,也可以从AUR安装开发版的fish-gitAUR

如果想把fish设为默认的 Shell,参照Shell#Changing your default shell;然而,这里更推荐你不要这么做,参见 #不要把fish设为默认shell

安装完之后,输入 fish 即可进入fish。

在fish中输入 help 即可自动打开浏览器,显示帮助文档。推荐用户至少阅读 "Syntax overview" 这一节的内容,因为fish的语法和其它shell的不太一样。

配置

fish的配置脚本保存在~/.config/fish/config.fish,这个文件就和 .bashrc一样。当启动终端时,fish会执行这个文件中的脚本。

网页配置接口

通过下面命令即可用浏览器打开fish的配置页面。

fish_config

在浏览器中可以交互式配置提示和颜色主题, 配置会保存到个人配置文件, 你也可以在浏览器中查看自己定义的函数和命令历史。

命令补全

fish可以通过解析man的数据,生成自动补全规则,这些自动补全规则保存于~/.config/fish/generated_completions/。可以运行下面命令更新自动补齐规则。

fish_update_completions

你也可以在 ~/.config/fish/completions/ 中定义自己的自动补全规则. /usr/share/fish/completions/ 有更多的例子。

对Arch Linux来说, pacman, pacman-key, makepkg, cower, pbget, pacmatic这些命令的自动补全规则已经在fish中内置了----fish在不同的发行版中内置了不同的命令补全规则。fish的内存管理足够智能,不会因为命令补全产生负面影响。

故障排除

历史记录

Fish does not implement history substitution (e.g. sudo !!), and the fish developers have said that they do not plan to. Still, this is an essential piece of many users' workflow. Reddit user, crossroads1112, created a function that regains some of the functionality of history substitution and with another syntax. The function is on github and instructions are included as comments in it. There is a forked version that is closer to the original syntax and allows for command !! if you specify the command in the helper function.

Other alternatives to regaining the command !! syntax can be found on Fish' github wiki. The examples here include e.g. the bind_bang function which expands !! to the latest command in the history (this will of course make it impossible to do to bangs in a row as they will expand). Another option is the command given on this github issue.

提示与技巧

不要把fish设为默认shell

在Arch中,很多shell脚本都是为Bash而写的,并且与fish不兼容。这里不建议把fish设为默认shell,把bash设为默认shell可以使得那些为bash而写的脚本可以正常运行,确保系统环境正常初始化,环境变量正常配置。如果你把fish设为默认的shell,很可能会在启动shell时看到报错信息。

下面是一些技巧,能够使得即使不把fish设为默认shell,也能够在登录的时候自动进入fish。

修改.bashrc来启动fish

把bash设为你的默认shell,只需要在你的bash配置文件Bash#Configuration files(一般是.bashrc)的最后一行加入 exec fish,即可在进入bash之后自动启动fish。这种做法使得Bash可以正常的运行 /etc/profile/etc/profile.d下的配置。因为fish替代了bash 进程,退出 fish也会自动退出终端。和下一个方法相比,这种做法更通用,因为它能够同时在本地和SSH远程连接时运作。

Tip: 如果你想进入bash而不是fish,使用命令 bash --norc

设为默认终端模拟器shell

另外一种自动启动fish的方法是专门针对终端模拟器设置默认解释器。对大多数终端模拟器来说,只需要-e 选项即可完成配置修改。以gnome终端模拟器为例,修改使用fish的命令如下:

gnome-terminal -e fish

LilyTerm等轻量级的终端模拟器,不支持通过命令设置默认的解释器,这时候可以通过环境变量的方式:

SHELL=/usr/bin/fish lilyterm

你也可以通过修改终端模拟器的配置文件来完成配置。

这样,当你打开终端模拟器的时候,就会自动的进入fish。

设为默认终端服用器shell

如果要为tmux设置默认的shell,只需要把下面这句话放到 ~/.tmux.conf:

set-option -g default-shell "/usr/bin/fish"

这样只要启动tmux,都会自动进入fish。

设为默认shell(不建议)

If you decide to set fish as your default shell, you may find that you no longer have very much in your path. You can add a section to your ~/.config/fish/config.fish file that will set your path correctly on login. This is much like .profile or .bash_profile as it is only executed for login shells.

if status --is-login
        set PATH $PATH /usr/bin /sbin
end
Note: This route requires you to manually add various other environment variables, such as $MOZ_PLUGIN_PATH. It is a huge amount of work to get a seamless experience with fish as your default shell using this method. A better idea would be #不要把fish设为默认shell.

关闭问候语

默认情况下,每次启动fish,fish都会打印问候语。你可以在fish的配置文件中增加 set fish_greeting以关闭它。

配置su命令默认启动fish

当你使用"su"用户切换到其他用户的时候,默认使用的shell是Bash,但是你可以在fish的配置文件中添加一个函数覆盖默认的"su"命令,使得你在使用"su"命令切换用户的时候会自动使用fish:

function su
    /bin/su --shell=/usr/bin/fish $argv
end

登录fish时自动开启X

把下面配置添加到 ~/.config/fish/config.fish,即可在你登录tty1的时候自动启动X。

# Start X at login
if status --is-login
    if test -z "$DISPLAY" -a $XDG_VTNR = 1
        exec startx -- -keeptty
    end
end

使用 liquidprompt

Liquidprompt is a popular "full-featured & carefully designed adaptive prompt for Bash & Zsh" and has no plans to make it compatible with fish [2]. This project implements it for fish.

在提示中增加git 状态

If you would like fish to display the branch and dirty status when you are in a git directory, you can add the following to your ~/.config/fish/config.fish:

# fish git prompt
set __fish_git_prompt_showdirtystate 'yes'
set __fish_git_prompt_showstashstate 'yes'
set __fish_git_prompt_showupstream 'yes'
set __fish_git_prompt_color_branch yellow

# Status Chars
set __fish_git_prompt_char_dirtystate '⚡'
set __fish_git_prompt_char_stagedstate '→'
set __fish_git_prompt_char_stashstate '↩'
set __fish_git_prompt_char_upstream_ahead '↑'
set __fish_git_prompt_char_upstream_behind '↓'
 
function fish_prompt
        set last_status $status
        set_color $fish_color_cwd
        printf '%s' (prompt_pwd)
        set_color normal
        printf '%s ' (__fish_git_prompt)
       set_color normal
end

ssh-agent 问题

在fish中,eval (ssh-agent)会因为变量的设置方式而报错。一个变通的方案是使用csh风格的选项-c

 $ eval (ssh-agent -c)

"command not found" 钩子

pkgfile 包含了一个 "未找到命令"("command not found") 钩子,但你输入一个当前系统不存在的命令,pkgfile会自动从官方仓库中搜索哪个安装包有这个命令。只要你安装了pkgfile,这个钩子就会自动启用。

从jobs中删除进程

当你退出fish的时候,所有后台进程也会终止。为了保持一个任务即使在fish退出了之后也继续运行,需要先输入disown命令,再退出。举例来说,在后台启动firefox,然后退出fish,但firefox在后台继续运行:


 $ firefox &
 $ disown
 $ exit

你会发现虽然你退出了fish,但firefox没有退出。请参阅disown(1)了解更多细节。

迅速设置别名

如果想要快速的设置一个持久化的别名(即使重启也不会失效),可以直接在fish下输入:

$ alias FooAliasName "foo"
$ funcsave FooAliasName

这种做法会把你的别名设为fish的终端函数。如果你想看所有的函数,或者是编辑它们,你可以使用fish_config ,然后在Function标签下进行配置。

另请参阅