IntelliJ嵌入式终端无法加载fish函数。

26

我正在使用IntelliJ的嵌入式终端和fish shell,除了一个问题外,它运行良好:似乎不会加载~/.config/fish/functions/*中定义的fish函数。

当我使用macOS的Terminal.app或iTerm2时,函数会按预期加载,只有IntelliJ的嵌入式终端无法加载。

奇怪的是,IntelliJ终端确实可以正常加载~/.config/fish/config.fish

这里是在iterm2和Terminal.app中运行echo $fish_function_path的输出:

/Users/moritz/.config/fish/functions
/usr/local/Cellar/fish/2.6.0/etc/fish/functions
/usr/local/share/fish/vendor_functions.d
/usr/local/Cellar/fish/2.6.0/share/fish/functions

在IntelliJ的嵌入式终端中运行时,以下是输出结果:

/Applications/IntelliJ IDEA.app/Contents/plugins/terminal/fish/functions
/usr/local/Cellar/fish/2.6.0/etc/fish/functions
/usr/local/share/fish/vendor_functions.d
/usr/local/Cellar/fish/2.6.0/share/fish/functions

我猜这好像是IntelliJ的嵌入式终端使用不同的值初始化fish会话中的$fish_function_path

$HOME(=/Users/moritz)和$XDG_CONFIG_HOME(未设置)在三个终端中,即iTerm2、Terminal.app和IntelliJ的嵌入式终端中都相同。


2
请关注此问题:https://youtrack.jetbrains.com/issue/IDEA-173259 以获取更新。 - Andrey
信息不足且矛盾 :-) 如果fish能够找到config.fish,它应该没有任何困难从您的个人函数目录自动加载函数。在IntelliJ中运行fish时,$HOME和$XDG_CONFIG_HOME设置为什么?假设前者已设置但后者未设置,那么“ls -ld $HOME/.config/fish/functions”输出什么?$fish_function_path设置为什么?如果您在$HOME.config/fish/functions/ij.fish中创建一个微不足道的autoloaded函数,比如说“function ij; echo ij ran; end”,您可以通过键入“ij”来运行该函数吗? - Kurtis Rader
echo $fish_function_path 显示什么?在IntellJ的终端和Terminal.app下,它们的输出有区别吗? - ridiculous_fish
嗨,Kurtis Rader,我可以在iTerm2和Terminal.app中运行该函数,但无法在IntelliJ的嵌入式终端中运行。尽管如此,我在config.fish中定义的别名甚至在IntelliJ的嵌入式终端中也能工作。如果这有矛盾之处,那就是这样的;-) - anothernode
5个回答

52

我通过在IntelliJ的嵌入式终端和iTerm2中转到设置|终端然后关闭Shell集成,从echo $fish_function_path中获得相同的结果。

我当时使用的是phpStorm 2017.3.4,但我认为这也适用于任何IntelliJ嵌入式终端。


1
哦,是的,那似乎真的有效!比我的解决方案简单得多。谢谢!我会接受这个答案,如果你愿意,我认为你可以安全地删除你回答中的最后一个预防性声明。 - anothernode
虽然,我不知道“Shell integration”到底是什么,以及关闭它会有什么副作用……? - anothernode
1
不确定 Shell 集成具体是做什么的,但这里有文档 https://www.jetbrains.com/help/idea/settings-tools-terminal.html。我找到了 IntelliJ 使用的 fish.config 文件,并决定可以不用它 :-) - Emil

37

检查IntelliJ选项,关闭shell integration

在此输入图片描述


我遇到了一个稍微不同的问题:我的Fish提示符没有显示在Webstorm的终端上。我禁用了Shell integration选项,问题得以解决。 - Jefferson Lima

10

有人在IntelliJ bug追踪器上发布了一个解决方案。

IntelliJ有自己的config.fish,其中.config/fish/config.fish会被加载,但不包括函数...

将以下内容添加到IntelliJ内部的config.fish中,fish函数将在IntelliJ的嵌入式终端中正确加载:

if test -d ~/.config/fish/functions
  for f in ~/.config/fish/functions/*.fish
    source $f
  end
end

IntelliJ的config.fish文件位置不定,苹果电脑上可能在以下位置:

  • 旗舰版:/Applications/IntelliJ\ IDEA.app/Contents/plugins/terminal/fish/config.fish
  • 社区版:/Applications/IntelliJ\ IDEA\ CE.app/Contents/plugins/terminal/fish/config.fish
  • 或者,如果通过Jetbrains Toolbox安装,则可能是以下路径:~/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/172.4574.11/IntelliJ IDEA.app/Contents/plugins/terminal/fish

或者,您可以用符号链接将整个IntelliJ的plugins/terminal目录中的fish目录替换为您通常的fish配置目录,通常为.config/fish/

还有一种选择是:您只需链接functions目录即可,例如:

ln -s ~/.config/fish/functions \
  /Applications/IntelliJ\ IDEA.app/Contents/plugins/terminal/fish/config.fish

1
我找到了一个更简单的方法,只需删除IDEA的fish目录并创建一个软链接到用户的目录即可。 - Sraw
这也是一个不错的方法,尽管有点侵入性,因为它还覆盖了那个fishd.<something>文件,而且由于某种原因,它在我的设置中也不能很好地工作。 - anothernode

2

对我而言,因为我使用的是bass,它也将一些.py文件放在那个目录中,所以我需要稍微调整一下。

if test -d ~/.config/fish/functions
  for f in ~/.config/fish/functions/*.fish
    source $f
  end
end

我发现Ultimate版本的路径有点不同: /Applications/IntelliJ\ IDEA.app/Contents/plugins/terminal/fish/config.fish

0

我在IntelliJ 2018.1和Clion 2018.1中仍然有同样的问题。我尝试按照此线程中的建议在Clion中进行修复,但不知何故它没有起作用(即使所有内容都似乎正常,我仍然收到更多错误消息)。

所以我的解决办法是将Idea终端设置为/bin/bash(在设置/工具/终端-Shell路径中),然后在终端窗口中输入fish作为第一个命令... 然后一切都正常工作,不需要调整终端插件。

(我认为Jetbrain无法或不想修复它很遗憾.. /IDEA-173259已被“关闭”)


你尝试过只关闭“shell integration”,其他保持不变吗? - anothernode
你说关闭终端集成是什么意思?我确实想在IntelliJ/CLion中使用终端窗口。 - Nightingale7
这是“shell集成”。请查看已接受的答案。 - anothernode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接