-1

我正在尝试改进我的屏幕软件,所以我会有很多问题,因为我很难在互联网上找到很多答案......无论如何,这个是关于我希望 screen 的 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")

在 shellrm 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

4

2 回答 2

2

在您的.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实例由于服务器关闭以外的其他原因被杀死,您仍然可以恢复文件。

于 2018-04-16T11:55:02.883 回答
-1

当“.file.swp 已经存在![O]open,[E]dit 不管怎样,[R]ecover,[Q]uit,[A]bandoned”,你会更幸运地删除“.file.swp”然后当您尝试删除“file.swp”,您不觉得吗?

你没注意到DOT吗?

于 2018-04-16T11:13:10.333 回答