在这个 bash 教程视频链接的末尾,Spencer Krum 展示了一个巧妙的技巧:如何在 vim 中打开一个文件,该文件位于紧接在前面的 'git grep -n' 搜索字符串所在的行号处。看起来很整洁,但他的代码在我尝试过的两个不同的 linux 机器上并不像描述的那样工作。它总是打开一个空白文件。 原代码在这里
我的步骤:
首先,我确保已初始化 git 并在 grep 目录中设置文件。例如,我有一个包含三行单词的 somefile.txt:
- 它的
- 一种
- 神秘
然后我跑了:git init;git add .; git commit
然后,修改您的 .bashrc 文件以重新定义 vim,如下所示。确保在完成后获取 .bashrc 文件: source ~/.bashrc
最后,运行 git grep -n 命令,并使用您知道在 git 目录中的文件中的搜索词,该文件是您当前的工作目录。最后,运行 vim。它应该打开您的文件,光标位于搜索词行。但它没有:git grep -n mystery;vim
#Spencers Original
vim () {
last_command=$(history | tail -n 2 | head -n 1)
if [[ $last_command =~ 'git grep' ]] && [[ "$*" =~ :[0-9]+:$ ]]; then
line_number=$(echo $* | awk -F: '{print $(NF-1)}')
/usr/bin/vim +${line_number} ${*%:${line_number}:}
else
/usr/bin/vim "$@"
fi
}
为了得到想要的结果,我必须在第一个 if 语句的第二个子句中简化正则表达式,并创建一些临时变量来运行额外的 eval 逻辑。
以下是我修改后的代码:
#My revised version
vim () {
last_command=$(history | tail -n 2 | head -n 1)
rempws="${last_command#*" "}"
remtws="${rempws%*" "}"
file_name="$(eval $remtws | awk -F: '{print $(NF-2)}')"
line_number="$(eval $remtws | awk -F: '{print $(NF-1)}')"
if [[ $last_command =~ 'git grep' ]] && [[ $line_number =~ [0-9] ]]
then
/usr/bin/vim +${line_number} ${file_name}
else
/usr/bin/vim "$@"
fi
}
这与 2015 年以来的 bash 更新有关吗?我认为它与 git 无关,因为我的 git grep -n 命令确实返回了一个格式为“somefile.txt:3:mystery”的字符串。观众中的每个人都喜欢它,它仍然在 github 上以非功能形式存在,所以我担心我错过了一些关于 bash 的基本知识。
告诉我为什么我很笨。