从 Zsh 迁移到 Fish,感觉还不错(下)

简介: 从 Zsh 迁移到 Fish,感觉还不错

fish 中还有一个比较花哨的地方,可以打开浏览器选择主题和各种配置。直接执行 fish_config 就打开了。

另一个需要配置的一些地方就是我自己常用的两个函数了:

  • proxy, 打开关闭命令行代理
  • auto_venv,自动激活和关闭 Python 虚拟环境

以 proxy 来看一下,fish 的函数还是很直观的。

function proxy
  if test "$argv[1]" = "on"
    if test "$argv[2]" = ""
      echo "No port provided"
      return 2
    end
    # proxy offered by local shadowsocks
    export http_proxy="http://127.0.0.1:$argv[2]"
    export https_proxy="http://127.0.0.1:$argv[2]"
  else if test "$argv[1]" = "off"
    set -e http_proxy  # set --erase
    set -e https_proxy
  else if test "$argv[1]" != ""
    echo "Usage: 
        proxy          - view current proxy
        proxy on PORT  - turn on proxy at localhost:PORT
        proxy off      - turn off proxy"
    return 1
  end
  echo "Current: http_proxy=$http_proxy https_proxy=$https_proxy"
end

后,还可以把 zsh 的 history 迁移到 fish 中来。令人没想到的是,这都有现成的脚本:

pip install zsh-history-to-fish
zsh-history-to-fish -n  # -n 不要转化 && 和 ||

fish 需要一段时间才会重新读取 history 文件。至此,迁移完毕啦。

后记

在切换到 fish 之后我还是对 zsh 为什么这么慢念念不忘,在对 .zshrc 做了一番 profile 和二分查找之后终于找到了罪魁祸首,和新电脑的硬件并没有什么关系,而是这样一行:

[ -d /home/linuxbrew/.linuxbrew/bin ] && path+=(/home/linuxbrew/.linuxbrew/bin)

这行人畜无害的命令意思是:如果机器上有 linuxbrew 就把它添加到路径里。而在我的 M1 MacBook,不知道为啥 /home 被挂载到了一个网络目录,所以每次打开一个 shell 的时候都会执行一个网络操作,而且这个服务器还可能在美国,能不慢么……删除了这行后,zsh 启动又恢复到正常水平。

┬─[yifei@bogon:~]─[21:45:06]
╰─>$ ll /home
lrwxr-xr-x  1 root  wheel    25B Dec  4 14:46 /home -> /some/network/volume

不过即便如此,切换到 fish 还是值得的,一则简化并看懂了自己的配置,二则对于 shell 启动时间也是有优化的:

┬─[yifei@bogon:~]─[19:05:15]
╰─>$ time  zsh -i -c exit
________________________________________________________
Executed in  254.61 millis    fish           external
   usr time  148.16 millis    0.07 millis  148.10 millis
   sys time   98.99 millis    1.59 millis   97.40 millis
┬─[yifei@bogon:~]─[19:07:44]
╰─>$ time fish -i -c exit
________________________________________________________
Executed in   44.84 millis    fish           external
   usr time   16.57 millis    0.08 millis   16.49 millis
   sys time   21.33 millis    1.67 millis   19.66 millis

可以看到在我的配置下,fish 比 zsh 还是快多了。

最后贴上自己的配置文件供参考:

###### .dotfiles/fishrc ######
# vi:ft=fish
set DISABLE_FZF_AUTO_COMPLETION true
export TERM="xterm-256color"
export EDITOR="vi"
# PATH settings
set PATH $HOME/.local/bin $HOME/.cargo/bin $HOME/.dotfiles/bin $PATH
# Load HomeBrew
export HOMEBREW_NO_AUTO_UPDATE=1
export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles
test -f /opt/homebrew/bin/brew && eval (/opt/homebrew/bin/brew shellenv)
test -f /usr/local/bin/brew && eval (/usr/local/bin/brew shellenv)
if uname | grep Linux
  set PATH /home/linuxbrew/.linuxbrew/bin $PATH
end
# Aliases
alias dc=docker-compose
alias pc=podman-compose
alias t='tmux -2'
alias tmux='tmux -2'
alias cd..='cd ..'
alias py=python
alias ipy='python -m IPython'
alias g='git'
alias ll='ls -alh'
alias :q='exit'
alias :wq='exit'
alias mkdirp='mkdir -p'
alias shn='sudo shutdown -h now'
alias mirror='wget -E -H -k -K -p'
alias sudo='sudo ' # magic trick to bring aliases to sudo
alias px="proxychains4"
alias lcurl='curl --noproxy localhost'
alias save-last-command='history | tail -n 2 | head -n 1 >> ~/.dotfiles/useful_commands'
alias topcpu='ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head'
alias topmem='ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head'
# Venv auto actiavation
function __auto_source_venv --on-variable PWD --description "Activate/Deactivate virtualenv on directory change"
  status --is-command-substitution; and return
  # Check if we are inside a git directory
  if git rev-parse --show-toplevel &>/dev/null
    set gitdir (realpath (git rev-parse --show-toplevel))
  else
    set gitdir ""
  end
  # If venv is not activated or a different venv is activated and venv exist.
  if test "$VIRTUAL_ENV" != "$gitdir/.venv" -a -e "$gitdir/.venv/bin/activate.fish"
    source $gitdir/.venv/bin/activate.fish
  # If venv activated but the current (git) dir has no venv.
  else if not test -z "$VIRTUAL_ENV" -o -e "$gitdir/.venv"
    deactivate
  end
end
# Proxy switcher
function proxy
  if test "$argv[1]" = "on"
    if test "$argv[2]" = ""
      echo "No port provided"
      return 2
    end
    # proxy offered by local shadowsocks
    export http_proxy="http://127.0.0.1:$argv[2]"
    export https_proxy="http://127.0.0.1:$argv[2]"
  else if test "$argv[1]" = "off"
    set -e http_proxy
    set -e https_proxy
  else if test "$argv[1]" != ""
    echo "Usage: 
        proxy          - view current proxy
        proxy on PORT  - turn on proxy at localhost:PORT
        proxy off      - turn off proxy"
    return 1
  end
  echo "Current: http_proxy=$http_proxy https_proxy=$https_proxy"
end
# Load fzf config
test -f ~/.dotfiles/fzf.fish && source ~/.dotfiles/fzf.fish
###### .config/fish/config.fish ######
if status is-interactive
    # Commands to run in interactive sessions can go here
end
test -f ~/.dotfiles/fishrc && source ~/.dotfiles/fishrc
###### .dotfiles/fzf.fish ######
# vi:syntax=sh
export FZF_DEFAULT_COMMAND='fd --type f'
export FZF_CTRL_T_COMMAND='fd --type f'
export FZF_ALT_C_COMMAND='fd --type d'
export FZF_COMPLETION_TRIGGER=''
export FZF_DEFAULT_OPTS="--height 40% --reverse --border --prompt '>>> ' \
    --bind 'alt-j:preview-down,alt-k:preview-up,alt-v:execute(vi {})+abort,ctrl-y:execute-silent(cat {} | pbcopy)+abort,?:toggle-preview' \
    --header 'A-j/k: preview down/up, A-v: open in vim, C-y: copy, ?: toggle preview, C-x: split, C-v: vsplit, C-t: tabopen' \
    --preview 'test (du -k {} | cut -f1) -gt 1024 && echo too big || highlight -O ansi -l {} 2> /dev/null || cat {} || tree -C {} 2> /dev/null'"
export FZF_CTRL_T_OPTS=$FZF_DEFAULT_OPTS
export FZF_CTRL_R_OPTS="--preview 'echo {}' --preview-window hidden:wrap --bind '?:toggle-preview'"
export FZF_ALT_C_OPTS="--height 40% --reverse --border --prompt '>>> ' \
    --bind 'alt-j:preview-down,alt-k:preview-up,?:toggle-preview' \
    --header 'A-j/k: preview down/up, ?: toggle preview' \
    --preview 'tree -C {}'"
bind \cr 'commandline --replace -- (history | fzf) || commandline --function repaint'

附:Ubuntu 上安装 fish3

sudo apt-add-repository ppa:fish-shell/release-3
sudo apt update
sudo apt install fish
目录
相关文章
|
前端开发 API 定位技术
【百度地图API】如何使用suggestion--下拉列表方式的搜索建议
原文:【百度地图API】如何使用suggestion--下拉列表方式的搜索建议 摘要:   百度地图上有一个很强大的搜索建议功能,以下拉列表的方式展示出来。比如,输入“百度”,下拉列表中就会出现“北京市海淀区百度在线网络技术(北京)有限公司”。
2619 0
|
JavaScript 前端开发 API
Fish开发与使用
审批系统使用es5,现在fish组件里面,用了大量的bind(this)方法,bind解决了this作用域问题,es6有箭头函数解决这个问题 es5没有箭头函数。 正常的js文件中必须包含的几个内容: 1.在文件的开始,要引入当前js文件需要用到的html文件,调接口使用到的action文件,或者特定样式的css文件, 引入HTML文件,格式是:”hbs!”+对应文件的整个路径, 引入js文件,格式是:对应文件的整个路径,文件名不需要加后缀名js
Fish开发与使用
|
11月前
|
Ubuntu Shell 开发工具
Ubuntu下安装配置和调优 Oh-my-fish
Oh-my-fish 是一个强大的工具,可以大大增强 Fish Shell 的功能和美观度。通过安装和配置 Oh-my-fish,可以极大地提升命令行的使用体验。同时,通过适当的调优,可以优化 Oh-my-fish 的性能,使其在保持丰富功能的同时,仍然能够快速启动并高效运行。希望本文提供的详细步骤和示例代码能帮助您在 Ubuntu 系统中顺利安装、配置和调优 Oh-my-fish。
677 7
|
缓存 Java Maven
Maven配置多仓库无效?来看看这篇文章
Maven配置多仓库无效?来看看这篇文章
1786 0
Maven配置多仓库无效?来看看这篇文章
|
5月前
|
IDE 开发工具 开发者
仓颉开发语言入门教程:搭建开发环境
仓颉开发语言是华为为鸿蒙系统自主研发的编程语言,肩负重要使命。本文介绍如何从零搭建仓颉开发环境,重点演示在DevEco Studio中安装插件、配置项目及运行Hello World示例,助力开发者快速上手。
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
693 4
|
机器学习/深度学习 人工智能 自然语言处理
自动化测试的新篇章:利用AI提升软件质量
【10月更文挑战第35天】在软件开发的海洋中,自动化测试犹如一艘救生艇,它帮助团队确保产品质量,同时减少人为错误。本文将探索如何通过集成人工智能(AI)技术,使自动化测试更加智能化,从而提升软件测试的效率和准确性。我们将从AI在测试用例生成、测试执行和结果分析中的应用出发,深入讨论AI如何重塑软件测试领域,并配以实际代码示例来说明这些概念。
456 3
|
数据采集 JSON 应用服务中间件
urllib与requests模块万字超详细!!
本文介绍了Python中用于发送网络请求的两个重要模块:`urllib` 和 `requests`。首先,文章详细讲解了 `urllib` 模块的基本使用方法,包括构造请求、发送请求、处理响应等。接着,文章重点介绍了 `requests` 模块,强调了其在企业中的广泛应用,以及如何发送GET和POST请求、处理响应、使用代理、处理Cookie等内容。最后,文章还探讨了 `requests` 模块的高级功能,如处理证书错误、设置超时、使用 `retrying` 模块等,帮助读者全面掌握网络请求的处理技巧。
381 4
|
数据可视化 数据库
通义灵码个人版新功能最佳实践测评
作为一名软件开发工程师,我使用通义灵码个人版的@workspace和@terminal功能,快速熟悉新的电商项目代码并实现新功能,效率提升了约30%。通过自动识别项目结构、代码分析、智能注释和自动补全等功能,大幅减少了查找资料和调试的时间,使开发流程更加顺畅,专注于业务逻辑实现。
302 1
分布式事务的两阶段提交和三阶段提交分别有什么优缺点?
【9月更文挑战第9天】两阶段提交(2PC)和三阶段提交(3PC)是解决分布式系统事务一致性的机制。2PC实现简单,保证强一致性,但存在同步阻塞、单点故障和数据不一致风险。3PC通过引入超时机制减少阻塞时间,降低单点故障影响,但复杂性增加,仍可能数据不一致,并有额外性能开销。
550 9