将现有命令的别名版本放在 /usr/bin/ 中

将现有命令的别名版本放在 /usr/bin/ 中

我用维姆很多,我知道我该怎么做以插入模式启动vim。所以vii我的文件中有一个别名.bash_aliases

另一方面我用git也很多,我的.gitconfig

[core]
    editor = vi

要编写提交消息,每次都会打开 vi 编辑器,并且我必须进入插入模式。所以我想到vi用替换vii, 并这样做了。

但问题是,当我这样做时git commit,它没有在插入模式下打开 vim,而是给出了以下错误:

error: cannot run vii: No such file or directory
error: There was a problem with the editor 'vii'.
Please supply the message using either -m or -F option.

这清楚地表明 git 不会查找.bash_aliases文件,即使它与 bash 没有任何关系。它直接查看是否有/usr/bin/vii。如果是的话就执行它。

问题

我可以将 vi 的别名版本放置vii在 中/usr/bin/吗?

(并且请不要建议我使用git commit -m "<commit message>"。还有其他情况我需要 vim 处于插入模式。)

答案1

别名是当前每个 shell 环境的内部 - 它们是扩大由当前运行的 shell(bash在您的情况下)执行,因此它们仅对您通过在终端中键入/粘贴来执行的内容产生影响。

您在这里至少有两个选择:

  • 创建一个包装纸名为的脚本vii将执行vim -c 'startinsert'并最好将其放入/usr/local/bin/(或者$HOME/bin,如果它存在并且位于您的搜索路径中)。该脚本只需要包含

    #!/bin/sh1
    exec vim -c 'startinsert' "$@" 2
    

    (确保通过运行使其可执行chmod +x /usr/local/bin/vii。)根据PATHgit/其他程序的配置,您可能需要指定该包装脚本的完整路径(即,editor = /usr/local/bin/vii)。

  • 如果您可以让 vim 始终以插入模式启动,请通过startinsert在 末尾添加 来配置它.vimrc


1   您可以将“she-bang”行编写为#!/bin/bash,但在不包含isms 的脚本中则无需这样做bash
2   $@必须用双引号引起来,以防使用包含空格的参数调用脚本。startinsert不需要引用(但这并没有什么坏处)。

答案2

只需将编辑器变量设置为

[core]
    editor = vim -c 'startinsert'

对于您的其他答案,不,您不能将别名放置在目录中,因为别名是 shell 中的一个概念。正常的方法是创建一个适当的包装脚本来执行指定的命令,例如,

#!/bin/sh
vim -c 'startinsert' "$@"

并将脚本另存为vii并使其可执行。您可以将脚本放置在您喜欢的任何位置,但通常此类脚本保存在文件$HOME夹中的某个位置$HOME/bin,而不是保存在全局目录中。

相关内容