将 .zshrc 更正为 ~/.zshrc

Jos*_*Cho 4 zsh

有没有办法设置某种别名,以便当我这样做时:

cd some/directory
vim .zshrc
Run Code Online (Sandbox Code Playgroud)

vim ~/.zshrc吗?

Mat*_*ert 12

答案比你想象的要简单得多,因为你问错了问题。

如果您真正的意思是“我如何创建允许我编辑我的别名~/.zshrc而不考虑当前工作目录的别名?” 那么答案很简单:

alias zshconfig="vim ~/.zshrc" 
Run Code Online (Sandbox Code Playgroud)

这个例子来自我自己~/.zshrc,我经常使用它。

@mateen-ulhaq在下面的评论中建议的更好的选择是:

alias zshrc="vim ~/.zshrc" 
Run Code Online (Sandbox Code Playgroud)

换句话说,不要尝试为文件名或文件名的路径设置别名。正如@michael-homer所指出的,这两件事都是可能的,但可能会产生不可预测的副作用,从而给您带来问题。

但是既然您知道您的首选$EDITORvim,只需vim为该特定文件的调用取别名,您就应该开展业务了。(将命令和参数的特定组合别名为一个不太可能脱离上下文使用的不寻常字符串要安全得多。)

然而,更一般地说,我的建议是您不应该担心优化两个字符的序列~/,而应该习惯于输入它。继续......伸出你的左手小指,就像你是埃迪范海伦练习音阶一样。(这将帮助您在掌握它的vim同时掌握它,因为您可能应该习惯Esc用小指敲击琴键!)

随着您的打字技巧的提高,您将获得对该~/序列的肌肉记忆,这将帮助您在引用主目录中的文件时可靠地键入该字符序列。您会有意地快速输入,而不会意外输入。

依赖别名的不利之处在于,无论它们在您的家用计算机上如何提高您的速度,当您需要ssh进入客户端私有子网中的某个远程 Docker 容器并发现您的所有别名都消失时,它们都会减慢您的速度。

  • 这是一种更安全的方法。 (5认同)

Gil*_*il' 6

我真的不明白这一点,但是是的。你正在做的事情比仅仅给命令一个不同的名字或一些默认参数更复杂,所以你需要一个函数,而不是别名。

function vim {
  if [[ $# -eq 1 && $1 == .zshrc && ! -e .zshrc ]]; then
    set -- ~/.zshrc
  fi
  command vim "$@"
}
Run Code Online (Sandbox Code Playgroud)

说明:当你运行时vim,它会调用该函数。在最后一行,command vim …调用外部命令,"$@"并将传递给函数的参数传递给它。在两者之间,如果只有一个参数并且该参数是确切的字符串.zshrc并且.zshrc当前目录中没有调用文件,则命令行将替换为~/.zshrc. 如果这些条件不是您想要的,请调整它们。


Mic*_*mer 5

大概您正在使用 zsh 作为您的 shell,它确实具有“全局别名”功能,可让您执行此操作:

% alias -g .zshrc='~/.zshrc'
% echo .zshrc
/home/mwh/.zshrc
Run Code Online (Sandbox Code Playgroud)

也就是说,该单词出现在命令行中的任何地方,都将.zshrc替换为~/.zshrc,然后像往常一样进行波浪号扩展。它必须是自己的外壳“词”,因此如果它只是较长名称的子字符串,则不会被扩展。这适用于任何命令。

全局别名是臭名昭著的问题,因为它们确实可以无声地扩展到任何地方,因此您可以例如rm .zshrc在另一个目录中运行,它将针对您自己的点文件。它们也适用于 shell 函数,即使是那些已经定义的函数。在这种情况下,它似乎不太可能引起问题,但要注意它的可能性。您可以使用 专门命名当前目录中的文件./.zshrc,或者使用\.zshrc或通过用引号将其括起来来获取文字字符串。

  • “全球别名是臭名昭著的问题......” 很少有人说出更真实的话。很快就会有更好的答案。(我在移动设备上打字速度相对较慢。) (4认同)