Source code for pestifer.subcommands.setup_vmd
# Author: Cameron F. Abrams <cfa22@drexel.edu>
"""
The setup-vmd subcommand. Generates ~/.pestifer/vmd_init.tcl with a
hardcoded PESTIFER_TCLROOT and appends a one-line source hook to ~/.vmdrc.
"""
import argparse as ap
import os
from dataclasses import dataclass
from pathlib import Path
from . import Subcommand
from ..core.resourcemanager import ResourceManager
_VMDRC_HOOK = 'if {[file exists ~/.pestifer/vmd_init.tcl]} { source ~/.pestifer/vmd_init.tcl }'
_VMDRC_MARKER = '# pestifer setup-vmd'
[docs]
@dataclass
class SetupVMDSubcommand(Subcommand):
name: str = 'setup-vmd'
short_help: str = "install pestifer's Tcl library into your VMD startup environment"
long_help: str = (
"Generates ~/.pestifer/vmd_init.tcl with the absolute path to pestifer's "
"Tcl root and appends a one-line source hook to ~/.vmdrc. "
"Re-run after upgrading pestifer or switching conda environments."
)
[docs]
@staticmethod
def func(args: ap.Namespace, **kwargs):
r = ResourceManager()
tcl_root = r.get_tcldir()
assert os.path.exists(tcl_root), f'Tcl root not found: {tcl_root}'
pestifer_dir = Path.home() / '.pestifer'
pestifer_dir.mkdir(exist_ok=True)
vmd_init = pestifer_dir / 'vmd_init.tcl'
vmd_init.write_text(
f'# Auto-generated by: pestifer setup-vmd\n'
f'# Re-run this command after upgrading pestifer or switching environments.\n'
f'set PESTIFER_TCLROOT {{{tcl_root}}}\n'
f'source ${{PESTIFER_TCLROOT}}/vmdrc.tcl\n'
)
print(f'Written: {vmd_init}')
vmdrc = Path.home() / '.vmdrc'
existing = vmdrc.read_text() if vmdrc.exists() else ''
if _VMDRC_MARKER in existing:
print(f'{vmdrc}: hook already present, not modified')
else:
with open(vmdrc, 'a') as f:
f.write(f'\n{_VMDRC_MARKER}\n{_VMDRC_HOOK}\n')
print(f'Appended source hook to {vmdrc}')
return True
[docs]
def add_subparser(self, subparsers):
super().add_subparser(subparsers)
return self.parser