Page 1 of 1

Editing Workspace Files (*.tws) directly

Posted: Thu Dec 11, 2003 2:55 am
by GenieMajik
Hello all and thanks for reading...

I have a bunch of workspaces set up for my staging environment and was wondering if I could edit the workspace file directly and create workspaces for my production environment.

For example:
I have workspace D:\STG1.tws with files:
M:\something1\somethingElse1.txt
M:\something2\somethingElse1.txt
M:\something3\somethingElse1.txt
...

could I somehow copy and edit D:\STG1.tws to a D:\PROD1.tws and contain the files:
N:\something1\somethingElse1.txt
N:\something2\somethingElse1.txt
N:\something3\somethingElse1.txt
...

Can that be done?

Thanks for your help in advance. :D

GenieMajik

Got it Nevermind

Posted: Thu Dec 11, 2003 3:05 am
by GenieMajik
I read through the forums for a solution but I couldn't find one directly but it was the first time I learned that the files in a workspace are relative to the workspace tws file

So...

I could open up an existing workspace, save it as a new workspace on the same drive as the files it contains and then move that new tws file to another drive. (if that makes sense).

Sorry for the crazy post :?

But thanks anyway :D

Posted: Thu Dec 11, 2003 4:25 am
by CyberSlug
Since TWS files have special meaning to TextPad, you can't use TextPad to edit them. You must use another text editor.

I saved two documents on my desktop plus a third in a subfolder, and I saved a workspace for them. I opened the worksapce file in Notepad:

Code: Select all

ÿÿ  TextPad         txt        ECOD
Document1.txt         TIDE  , , �Ù    0 VIEW                VIEW        VIEWð¥ZECOD
Document2.txt         TIDE  B B ÷à    0 VIEW                VIEW        VIEWð¥ZECODMyFolder\anotherFile.txt         TIDE  X X 
ö    0 VIEW                 VIEW        VIEWð¥Z
It seems you could change the names as long as you have the same number of files.

Posted: Thu Dec 11, 2003 12:31 pm
by MudGuard
Since TWS files have special meaning to TextPad, you can't use TextPad to edit them. You must use another text editor.
Not true.

Open Textpad.
File - Open, choose your tws file, switch File Format to "Text" and click "Open".

Up comes the content of the tws file in Textpad (lots of unreadable characters...)

Posted: Mon Feb 02, 2004 1:07 am
by mishofsydenham
MudGuard wrote:(lots of unreadable characters...)
... which serves to show that persistence of workspaces should be implemented in XML! :D

Enhancement

Posted: Wed Mar 10, 2004 4:59 pm
by joelmw
Does anyone know if this functionality--the ability to edit workspaces directly--has been entered as an enhancement request?

:?:

Thanks.

Posted: Mon Jun 28, 2010 8:10 pm
by mike777
I have the exact same issue.

I need to move a subfolder. In it, are 30 files in a TextPad Workspace. I don't want to have to reopen each one manually after I move the folder.

I'd like to be able to open the tws file, do a search and replace, and then find all my files in the new location.

I live and die by multiple (60 plus) workspaces which contain 30-50 files each, so this is very very important to my way of working.

I've tried bringing in the tws file in Notepad++ and replacing but it really messes up the tws file and I lose all my file references. Not good.

Someone, please find an answer to this. It's hard to believe this has been a request for so long without a resolution.

Posted: Mon Jun 28, 2010 10:07 pm
by ben_josephs
This is not a perfect solution, but it's what I do.

If you use the command line and have Perl you can use something like the following script, which lists all the files in all the workspaces given as parameters (wildcards accepted).

Code: Select all

use warnings ;
use strict   ;

my @twsNames = map { glob $_ } ( @ARGV ? @ARGV : ( '*.tws' ) ) ;

for my $twsName ( @twsNames )
{
  if ( -f $twsName && $twsName =~ /\.tws$/ )
  {
    print "\n$twsName\n" ;

    if ( open TWS, $twsName )
    {
      local $/ = undef ;
      my $tws = <TWS> ;
      close TWS ;

      my @docNames = $tws =~ /[EB]COD..(.+?)\x00/gs ;

      for my $docName ( sort @docNames )
      {
        print "$docName\n" ;
      }
    }
    else
    {
      warn "Can't open $twsName.\n" ;
    }
  }
  elsif ( -f $twsName )
  {
    print "\n$twsName is not a workspace file.\n" ;
  }
  else
  {
    print "\n$twsName doesn't exist.\n" ;
  }
}
Thanks to lotus298 (see http://forums.textpad.com/viewtopic.php?t=8561) for some ideas in this.

If you redirect the output to a file, you can open it and edit the paths. You can then open each document quickly if you assign a keyboard shortcut (I use Ctrl+Shift+G) to the FileGoTo command:

Configure | Preferences | Keyboard:
Categories: File
Commands: FileGoTo

Posted: Mon Jul 05, 2010 4:34 pm
by woho
@mike777

A)
In it, are 30 files in a TextPad Workspace. I don't want to have to reopen each one manually ..
a) drag & drop from explorer to textpad is fine for opening many files in the same directory

b) Quick Open File (<Ctrl>+<Shift>+O, no menu entry for that !!) is very nice if the files are not in 1 single directory but in subdirectories on the same path ! You can use wildcards => see online help

c) if the filenames are always the same you could use also a filelist (textfile with name beginning with '@' =>search @ in the online help)

B)
not sure whether it is the same task or something different
As - as mentioned in the 2nd post of this thread - paths in *.tws are relative it works like that for me:
\myCurrProject
\mySubDir1
\mySubDir2
proj.tws .. containing files of \mySubDir*

when I copy
\myCurrProject to
\myCurrProjectBACKUP
and open
\myCurrProjectBACKUP\proj.tws
all the files in \mySubDir* are opened in \myCurrProjectBACKUP instead of \myCurrProject

Posted: Mon Jul 05, 2010 8:46 pm
by ben_josephs
You can use an @-file, as suggested by woho in point (A)(c), in conjunction with something similar to my script. above. You'll need to remove this line:

Code: Select all

print "\n$twsName\n" ; 
Here's a fairly minimal version, without error checking:

Code: Select all

my $twsName = $ARGV[ 0 ] ;

open TWS, $twsName ;
my $tws = do { local $/ ; <TWS> } ;
close TWS ;

my @docNames = $tws =~ /[EB]COD..(.+?)\x00/gs ;

print +( join "\n", sort @docNames ), "\n" ;
which you can write even more minimally, like this

Code: Select all

print +( join "\n", sort do { open TWS, $ARGV[0] ; local $/ ; <TWS> } =~ /[EB]COD..(.+?)\x00/gs ), "\n" ;
if you like that sort of thing.

On woho's point (B): a file in a workspace is stored with a relative path only if it's in or below the directory containing the workspace.

Editing Workspace Files (*.tws) directly (in R)

Posted: Wed Aug 29, 2012 7:47 pm
by BWMorlan
I use TWS all the time with my Sweave/R and routinely have 10-15 files open.

It would be very handy to be able to automatically read the TWS (I'll point to it) from R so I can add documentation on the files used in a project.

A simple scan() really messed up system, changing the character coding.

I am able to use
twsFile <- "/people/ccs3/morlan/research/bcp/bcp.tws"

if ( exists("con") ) close(con)
# con <- file(twsFile,"rb",encoding="UCS-2LE")
con <- file(twsFile,"rb")
str <- NULL
for ( ii in 1:1000 )
{
tried <- try(newC <- readChar(con,1))
if ( class(tried)!="try-error" ) str <- c(str,newC)
}

to load the tws one character at a time, but am not able to filter it very well. Has anyone written an R-function that might already do this?

I'll be writing one anyway, but if it is already out there that would be nice.

R function to scan TWS files

Posted: Wed Aug 29, 2012 9:53 pm
by BWMorlan
The following function reads in a TWS and attempts to parse it for the file names. It returns an unnamed list. It is easy to modify it, as written it expects file names to only contain letters and numbers and : to mark Windows drive letters.

Code: Select all

scan.twsFile <- function(twsFile="/people/ccs3/morlan/research/bcp/bcp.tws",type="latex")
{# PURPOSE: To read in a TextPad TWS file and produce a list of files
 # USE:  lst <- scan.twsFile(twsFile="<fullpath to twsfile>")

  if ( exists("con") ) close(con)
  con <- file(twsFile,"rb")
  str <- NULL
  fileSize <- file.info(twsFile)$size
  for ( ii in 1:fileSize )
  {
    tried <- try(newC <- readChar(con,1),silent=TRUE)
    if ( class(tried)!="try-error" ) str <- c(str,newC)
  }

  c0 <- str %in% c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
                   "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
                   "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", 
                   ":", "\\",".")
  str <- str[c0]
  str <- gsub("\\\\","/",str)
  str <- paste(str,collapse="")

###
# hope the markers don't change
###
  keyStr0 <- "EC"
  keyStr1 <- "OD"
  c0 <- regexpr(keyStr0,str)
  editFiles <- NULL
  while (c0[1]>0)
  {
    str       <- substring(str,c0[1]+nchar(keyStr0))
    c0        <- regexpr(keyStr1,str)
    str       <- substring(str,c0[1]+nchar(keyStr1))
    keyStr0   <- "TIDEVIEW"
    keyStr1   <- "VIEWECOD"
    c1        <- regexpr(keyStr0,str)
    editFiles <- c(editFiles,substring(str,1,c1-1))
    str       <- substring(str,c1)
    c0        <- regexpr(keyStr0,str)
  }

  editFiles <- editFiles[editFiles!=""]
  c0 <- substring(editFiles,1,1)=="."
  editFiles[c0] <- substring(editFiles[c0],2)

  return(invisible(editFiles))
 # END FUNCTION scan.twsFile()  as  found in   source(paste(RCommon,"LatexTools/latex.twsFiles.R",sep=""))
}# END FUNCTION scan.twsFile()