我正在努力改进我的屏幕软件,所以我会有很多问题,因为有很多答案我很难在互联网上找到......无论如何,这个是关于我希望屏幕在打开时执行的 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;
、touch
和bar
:)
相反,您可以运行 shell 解释器来运行多个命令,包括vim
:
screen -t name1 sh -c 'rm /path/to/my/.file1.sw*; vim /path/to/my/file1.txt'
传递给sh
命令的选项将被正确解释,因为在屏幕中,它们都只是一个选项。
如果您真的打算这样做,您可能会遇到冲突,因为name2
和name3
等将在另一个窗口中删除交换文件的同时生成交换文件,因此您可以这样做:
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吗?