屏幕中的外壳命令



我正在努力改进我的屏幕软件,所以我会有很多问题,因为有很多答案我很难在互联网上找到......无论如何,这个是关于我希望屏幕在打开时执行的 shell 命令,但它没有......

在新的屏幕上,我要求屏幕打开一些窗口并命名它们并在每个窗口中打开一个文件,然后垂直拆分并打开新的空窗口:

screen -t name1 vim /path/to/folder/file1.txt
screen -t name2 vim /path/to/folder/file2.txt
screen -t name3 vim /path/to/folder/file3.txt
screen -t name4 vim /path/to/folder/file4.txt
split -v
focus
screen
focus
screen

但是这些文件会像往常一样创建 .file.txt.swp 和 .file.txt.swo 隐藏文件,所以当我的计算机关闭并且文件无法正确关闭时,当我重新打开屏幕时,它会询问我必须如何处理 .sw* 文件......我想先运行这个命令rm /path/to/folder/.*.sw*这样它就不会在打开时要求操作(".file.txt.swp 已经存在![O]open, [E]dit anyway, [R]ecover, [Q]uit, [A]bandoned")

在 shell 中rm path/to/folder/.*.sw*按预期删除每个交换文件,但我无法让它在 .screenrc 中工作

这不起作用:

rm /path/to/folder/.*.sw*
screen -t name1 vim /path/to/folder/file1.txt
screen -t name2 vim /path/to/folder/file2.txt
screen -t name3 vim /path/to/folder/file3.txt
screen -t name4 vim /path/to/folder/file4.txt
split -v
focus
screen
focus
screen

这也不是:

exec rm /path/to/folder/.*.sw*
...

也不是这个:

eval 'rm /path/to/folder/.*.sw*'
...

甚至这个:

stuff rm /path/to/folder/.*.sw*
...

以及许多其他"盲目"尝试...

好吧,我不知道我在做什么:p

在你的.screenrc中,screen命令接受一个字符串,它自己评估而不是传递给shell。因此,您不能如此轻松地将多个命令组合在一起... 例如,像这样的配置行:

screen -t test1 touch foo; touch bar

将导致三个文件被触摸 -foo;touchbar:)

相反,您可以运行 shell 解释器来运行多个命令,包括vim

screen -t name1 sh -c 'rm /path/to/my/.file1.sw*; vim /path/to/my/file1.txt'

传递给sh命令的选项将被正确解释,因为在屏幕中,它们都只是一个选项。

如果您真的打算这样做,您可能会遇到冲突,因为name2name3等将在另一个窗口中删除交换文件的同时生成交换文件,因此您可以这样做:

screen -t name1 sh -c 'rm /path/to/my/.file1.sw*; vim /path/to/my/file1.txt'
screen -t name2 sh -c 'sleep 1; vim /path/to/my/file2.txt'
screen -t name3 sh -c 'sleep 1; vim /path/to/my/file3.txt'
screen -t name4 sh -c 'sleep 1; vim /path/to/my/file4.txt'

请注意,另一种选择可能是告诉vim根本不创建交换文件。以交互方式,您可以使用以下方法执行此操作:

:set noswapfile

要将其放在命令行上(而不是使其成为所有vim实例的默认值),您可以使用 vim 的-n选项,该选项会导致 vim 打开文件而不进行交换:

screen -t name1 vim -n /path/to/my/file1.txt
screen -t name2 vim -n /path/to/my/file2.txt
screen -t name3 vim -n /path/to/my/file3.txt
screen -t name4 vim -n /path/to/my/file4.txt

结果当然是四个文件的未保存更改将丢失。

另一种选择可能是将临时文件移动到单独的位置。例如,如果您使用tmpfs/shmfs并且您的/tmp 目录在每次重新启动时都是空的,则可以使用:

screen -t name1 vim --cmd 'set dir=/tmp' /path/to/my/file1.txt
screen -t name2 vim --cmd 'set dir=/tmp' /path/to/my/file2.txt
screen -t name3 vim --cmd 'set dir=/tmp' /path/to/my/file3.txt
screen -t name4 vim --cmd 'set dir=/tmp' /path/to/my/file4.txt

然后,如果vim实例因服务器关闭以外的其他原因而终止,您仍然可以恢复该文件。

当 ".file.swp 已经存在时![O]open, [E]dit 无论如何, [R]ecover, [Q]uit, [A]bandoned",当你尝试删除"file.swp"时,你会有更多的运气删除".file.swp",你不觉得吗?

你没注意到DOT吗?

相关内容

  • 没有找到相关文章

最新更新