我想使用缩写fish shell 的功能,尤其是针对已知的 bash 变量!!
或常用 git 命令的别名。我知道可以像以下代码片段一样添加缩写:
abbr -a gco git checkout
我也知道此设置保留在位于的文件中.config/fish/fishd.host
,但该文件也表示不应编辑它,因为更改可能会丢失(因为该文件是自动生成的)。
所以我的问题是如何在配置文件中添加这些缩写,因为我想将我的点文件放在 git 存储库中。如果我在单独的机器上使用这些点文件,我不想abbr
再次执行所有这些命令。
答案1
抱歉,我不确定我是否理解了您的问题。但是如果您的问题是如何abbr
在启动时设置您的定义(以及在可以存储在存储库中并在机器之间共享的文件中),您应该使用~/.config/fish/config.fish
Fish 在 Bash 中相当于的文件.bashrc
。
由于缩写存储在全局/通用变量中,因此每次打开终端窗口时不需要重置它们,因此您可以在该配置文件中放置一个保护措施,以防止每次重置它们(加快速度),如下所述:
https://github.com/fish-shell/fish-shell/issues/1976#issuecomment-168698602
编辑(2019 年 4 月):
在 Fish 更改了 3.0.0 版中通用变量的存储方式后,保护功能似乎可以防止在打开新的终端窗口或重新启动计算机后也包括在缩写列表中所做的更改。因此,我从示例中删除了这些行。
例如我config.fish
看起来像这样(对于 Git 命令):
echo -n Setting abbreviations...
abbr g 'git'
abbr ga 'git add'
abbr gb 'git branch'
abbr gbl 'git blame'
abbr gc 'git commit -m'
abbr gca 'git commit --amend -m'
abbr gco 'git checkout'
abbr gcp 'git cherry-pick'
abbr gd 'git diff'
abbr gf 'git fetch'
abbr gl 'git log'
abbr gm 'git merge'
abbr gp 'git push'
abbr gpf 'git push --force-with-lease'
abbr gpl 'git pull'
abbr gr 'git remote'
abbr grb 'git rebase'
abbr gs 'git status'
abbr gst 'git stash'
echo 'Done'
答案2
Fish 初始化通用缩写的标准方法是创建一个abbr.fish
文件来~/.config/fish/conf.d
进行初始化。在该文件中,您可以检查通用变量以确定您的缩写是否已设置。这将设置它们和指示变量一次,确保您不会在每次 shell 调用时产生开销。
# ~/.config/fish/conf.d/abbr.fish
if not set -q MY_ABBR_SET
set -U MY_ABBR_SET true
abbr -a -- - 'cd -'
abbr -a la 'ls -la'
abbr -a ldot 'ls -ld .*'
abbr -a ll 'ls -lGFh'
abbr -a lsa 'ls -aGF'
abbr -a nv nvim
abbr -a tarls 'tar -tvf'
abbr -a untar 'tar -xv'
abbr -a zz exit
# git
abbr -a gad 'git add'
abbr -a gbn 'git rev-parse --abbrev-ref HEAD'
abbr -a gcl 'git clean'
abbr -a gco 'git checkout'
abbr -a gwhoami 'echo "user.name:" (git config user.name) && echo "user.email:" (git config user.email)'
# ... etc...
end
如果要更改或添加新的缩写,只需修改 abbr.fish 文件,然后删除变量。下次调用 fish 时,您的缩写将再次设置:
# erasing this will cause abbr.fish
# to setup your abbreviations again
set -e MY_ABBR_SET
如果您需要清除所有缩写并重新开始,此功能可以提供帮助:
function abbr-erase-all --description 'Erase all your abbrs'
while true
read -l -P "This will erase all your abbreviations. You sure? [y/N] " confirm
switch $confirm
case Y y
break
case '' N n
return 1
end
end
for abbr_name in (abbr -l)
abbr -e $abbr_name
end
set -q MY_ABBR_SET && set -e MY_ABBR_SET
end
答案3
解决了这个问题!我最终做的只是将输出abbr -s
变成 Fish 脚本。简而言之:
abbr -s > abbr.fish
(edit abbr.fish, add the following line to the top:) #! /usr/bin/fish
chmod +x abbr.fish
您已经完成了!
现在您要做的只是abbr.fish
在任何需要缩写的 Fish 机器上运行它,然后就可以了。
答案4
我再次尝试使用 fish,并找到了一种现在对我有用的解决方案。鱼类文件。
他们只是建议重置fish_user_abbreviations
并一遍又一遍地调用abbr
。(我甚至没有if
在我的例子中使用,但效果也很好)
if status --is-interactive
set -g fish_user_abbreviations
abbr --add first 'echo my first abbreviation'
abbr --add second 'echo my second abbreviation'
# etcetera
end
它实际上类似于MJV 建议,但没有缓存的缺点。缺点可能是启动速度稍慢,但我会留意这一点。我选择该变体,因为文档中也提到了它。