Shell screenrc 中的命令

Shell command in screenrc

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

在新的 screen 会话中,我要求 screen 打开一些 windows 并命名它们并在每个中打开一个文件,然后垂直拆分并打开新的空 windows:

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] 打开,[E] 无论如何,[R] 恢复,[Q] 退出,[A] 放弃”)

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

...

还有很多其他 'blind' 尝试...

嗯,我不知道我在做什么 :p

当“.file.swp 已经存在![O]open,[E]dit anyway,[R]ecover,[Q]uit,[A]bandoned”,你将有更多的运气删除“ .file.swp" 那么当您尝试删除 "file.swp" 时,您不觉得吗?

你没注意到 DOT 吗?

在您的 .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 等将在删除它们的同时生成交换文件另一个 window,所以你可以这样做:

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