看似简单的事情

看似简单的事情

正如标题所述,这应该是一件简单的事情,但我却无法让它正常工作。

我正在编写一个小型可执行脚本,它将负责输入脚本第一行所需的解释器位置并打开新脚本进行编辑。 好的,很酷...完成了:printf "#!%s" $(which bash) > $1; vim $1。 很简单。

问题在于,脚本会自动让我从插入模式的第 2 行开始,而我之所以认为这是一个问题,只是因为我对如何操作感到好奇,但又无法实现。这样,我就处于一个空行,可以开始操作了……无需浪费 0.5 秒左右的时间按“o”(我使用 vim 作为我的文本编辑器,仅供参考)。

$(which bash)所以我想我的问题是,当新创建的脚本在第一行打开并输出“#!”时,如何让我的自动脚本模拟按“o” ?

尝试过的事情:

  • 使用 printf 转义的换行符:printf "#!%s\n" $(which bash) > $1
  • 使用带换行符标志的 echo:echo -e "#!$(which bash)\n" > $1

答案1

这应该可以实现你想要的效果:

printf '#!%s\n\n' $(which bash) > "$1" ; vim -c startinsert +2 "$1"

它会在文件中插入两个换行符,所以不需要o。然后它会在插入模式下从第二行 (+2) 启动 vim。

此外,如果不需要扩展,则最好使用单引号而不是双引号。在这种情况下,!可能会被解释为双引号中的历史扩展特殊字符,并完全改变打印的内容。

答案2

您尝试的方法不会有帮助,因为这不取决于文件的内容;而是取决于文本编辑器。

在 Vim 中,下面的操作应该可以工作:

vim "$file" +'$normal o' +'startinsert'

每个+参数都在“命令模式”下解释;通常是行号,但任何命令实际上都可以起作用。:$normal o在最后一行后附加一个空行(这很丑陋,但我想不出任何其他方式);:startinsert进入插入模式。

相关内容