Spor prosjekttid med Alfred Timekeeper

Hva du skal skape

Alfred Time Keeper

Mange mennesker jonglerer flere prosjekter med forskjellige tidsplaner. Fra webapps til dedikerte programmer er det allerede en rekke måter å holde oversikt over tid brukt på et prosjekt. De fleste krever nettjeneste og / eller et program for å holde seg løpende hele tiden. Ofte er dette ikke praktisk.

Alfred Timekeeper fungerer på samme måte som et holdkort system: du sparer en tidsstempel når du starter og slutter å jobbe. Siden det bare registreres tidsstempler, er et program eller en webtjeneste ikke alltid åpen.

I denne opplæringen antar jeg at du allerede er kjent med å skrive arbeidsflyter i Alfred. Hvis ikke, vennligst sjekk ut disse veiledningene: Alfred for Beginners, Intermediates, Advanced brukere og Alfred Debugging.

Samlet design

Mange jobber med ulike datamaskiner på forskjellige steder. Det gjør det vanskeligere å holde oversikt over prosjekter og tidsstyring. Ved å bruke Dropbox, synkroniseres all prosjekt- og tidsstyringsinformasjon automatisk.

Denne tilnærmingen krever oppbevaring av all informasjon i filer og ikke i dataminnet. Denne begrensningen krever bruk av to datalagringsarrangementer: lokal katalog av informasjon som bare brukes av programmets program, og a synkronisert katalog som deles med hver datamaskin som er koblet til den.

Lokal lagring inneholder referansen til den synkroniserte katalogen og redaktøren for å redigere tidsskrifter. Disse filene er i Alfreds datakatalogplassering.

Den synkroniserte katalogen holder alle tidsplanene, lister over prosjekter, sist kjent tilstand for innspillingsinformasjon, og tidssoneinformasjonen. Det kommer til å ligge i en Dropbox-plassering. Ethvert filsystemsynkroniseringssystem kan brukes, jeg har nettopp tilfeldigvis hatt Dropbox allerede.

Opprette arbeidsflyten

I Alfred oppretter du en ny arbeidsflyt som heter Alfred Timekeeper.

Opprette arbeidsflyten

I denne nye arbeidsflyten må du opprette en Filfilter som bare vil vise kataloger.

Angi tidsskriftsregisterkommando

Du kan angi Filtyper ved å dra en katalog fra Finder til Filtyper område. Sett Søkeomfang til katalogen som inneholder DropBox-kontoen din.

Legg til en Kjør skript blokkere etter denne blokken, unselecting all escaping alternativer. Til denne blokken legger du til dette skriptet:

####### Kontanter. ########REV = "$ HOME /Library/Caches/com.runningwithcrayons.Alfred-2/Workflow Data /" NVPREFS = "$ HOME / Bibliotek / Application Support / Alfred 2 / Workflow Data /" ############################################# ####################################################################### kommentarer bundled fra arbeidsflytets info.plist ######################################plist##################################### ##############################################################################??n= bundled "" info.plist " ############################################ ################################################################ komme tilbake til ################################################## ########################################################################################/08/08 AMENOs #################################### -d "$ (getDataDir)"]; så mkdir -p "$ (getDataDir)"; trykk "$ (getDataDir) /dir.txt"; trykk "$ (getDataDir) /editor.txt"; fi # Lagre kataloginformasjonen. ekko "query"> "$ (getDataDir) /dir.txt"; # Fortell brukeren. ekko "Angi katalog til" query '. "; 

Dette skriptet sjekker at datakatalogen skal være der. Hvis ikke, skapes det katalogen og filene som brukes til arbeidsflyten. Det tar innspill i spørsmål makro og plasserer den i dir.txt filen i datakatalogen. Det underretter deretter brukeren av handlingen.

Koble til Kjør skript blokkere til en varslingsblokk. Alle Kjør skript blokker herfra bør koble til denne varslingsblokken. Sett sin utgang for å være spørsmål makro og sett Vis bare om bestått i argument har innhold.

Når du er lagret, må du angi tidskatalogen. Inne i Dropbox-katalogen, opprett en katalog for tidsskrifter og bruk ATK: setdir kommandoen for å angi den katalogen. Du kjører nå et system for flere tidsprogrammer!

Det er den grunnleggende oppsettrutinen for arbeidsflyten. Før du tar tak i hovedprogrammet, må du sette opp arbeidsmiljøet.

Sette opp miljøet

Den enkleste måten å installere go programmeringsspråket er ved Hjemme brygget. Hvis du ikke har installert Hjemme brygget ennå, opplæringen Homebrew Demystified: OS Xs Ultimate Package Manager vil vise deg hvordan.

I en terminal, skriv inn:

brygge installasjon gå 

Opprett katalogen i hjemmekatalogen . Go-språket lagrer alle nedlastede biblioteker der. Legg til i .bashrc fil og / eller .zshrc fil denne linjen:

eksporter GOPATH = "/ Brukere //gå" 

Hvis du bruker fisk, legg dette til i config.fish fil:

sett -xg GOPATH "/ Brukere //gå" 

Etter gjenopplasting av skallet kan du installere goAlfred-biblioteket ved å skrive:

gå github.com/raguay/goAlfred 

Dette biblioteket gjør det enklere å bruke språket med Alfred. Det vil opprette katalogene til datalagringsområdet for Alfred-arbeidsflyter og gjøre XML-oppføringen nødvendig Skriptfiltre.

Timekeeper.go

For å opprette hovedprogramfilen må du gå til katalogen for arbeidsflyten. Åpne Kjør skript blokkere.

Åpner Workflow Directory

Klikk på Åpne arbeidsflytmappe knappen nederst på siden Manus: område. Dette åpner arbeidsflytkatalogen i Finder (eller Pathfinder hvis du har det). For å åpne katalogen i et terminalskall, kan du bruke Alfred Workflow TerminalFinder til å åpne en Finder- eller Path Finder-katalog i en terminalsession (eller iTerm).

Opprette Programfilen i Terminal

En gang i terminalprogrammet skriver du:

trykk på Timekeeper.go 

Åpne den filen i valgfri redaktør. Når du er åpen, legg inn denne koden:

pakke hoved // // Program: TimeKeeper.go // // Beskrivelse: Dette programmet kjører tilbakemeldingslogikken for å velge på / av-status for // det nåværende tidsbestemte prosjektet. // // // Importer bibliotekene vi bruker til dette programmet. / / import ("fmt" "github.com/raguay/goAlfred" "io" "io / ioutil" "os" "regexp" "strconv" "strenger" "tid") // // Oppsett og konstanter som brukes . // // MAXPROJECTS Dette er maksimalt antall prosjekter tillatt. // TSDir Dette holder katalognavnet for tidsarkene. Det er en komplett sti. // const (MAXPROJECTS int = 20) var TSDir = "" // // Funksjon: hoved // // Beskrivelse: Dette er hovedfunksjonen for TimeKeeper-programmet. Det tar kommandolinjen // og analyserer den for riktig funksjonalitet. // func main () hvis len (os.Args)> 1 switch os.Args [1] [0] case 'm': // // atk: måned // SystemViewMonth () case 'w': / // atk: uke // SystemViewWeek () tilfelle 't': // // atk: nåværende // SystemViewDate () case 'r': // // atk: fjern // FjernProject () : // // atk: prosjekt // ChangeProject () tilfelle 'b': // // atk: nåværende // SystemViewDay () tilfelle 'a': // // atk: addproject // AddProject () ': // // atk: state // StopStart () case' p ': // // Brukes for atk: prosjekt script fileter // prosjekt () tilfelle' T ': // // atk: time // SystemAllProjects () case 's: fallthrough default: // // Brukes for skriptfiltret på atk: state // state () // // Funksjon: getTimeSheetDir // // Beskrivelse: Denne funksjonen brukes til å cache en kopi av klokkeslett // arkkatalog og gi den i retur. // func getTimeSheetDir () streng hvis strenger.Contains ("", TSDir) Filnavn: = goAlfred.Data () + "/dir.txt" buf, err: = ioutil.ReadFile (Filnavn) hvis err == nil // // Konverter katalogveien til en streng og trim den. // TSDir = strings.TrimSpace (streng (buf)) // // Returner katalogen til tidsarkene. // return (TSDir) // // Funksjon: SystemAllProjects // // Beskrivelse: Denne funksjonen viser til terminalen tiden for alle prosjekter på // dagen gitt på kommandolinjen neste. // func SystemAllProjects () // // Få gjeldende dato hvis det ikke finnes en på kommandolinjen. // tm: = time.Now () hvis len (os.Args)> 2 if strings.Contains ("today", os.Args [2]) // // Dagens dato. // tm = time.Now () annet hvis strenger.Contains ("igår", os.Args [2]) // // I går er det i dag minus en dag. // tm = time.Now () tm = tm.AddDate (0, 0, -1) else // // Parse datastrengen gitt. // tm, _ = time.Parse ("2006-Jan-02", os.Args [2]) // // Få listen over prosjektnavn. // proj: = GetListOfProjects () // // For hvert prosjekt, få tid brukt på den for den oppgitte dagen. // numproj: = len (proj) - 1 for i: = 0; Jeg < numproj; i++  fmt.Printf("%s: %s\n", proj[i], formatTimeString(GetTimeAtDate(proj[i], tm)))   // // Function: SystemViewMonth // // Description: This function will calculate the time the current month for all the projects. // func SystemViewMonth()  // // Get the current project. // currentProject := GetCurrentProject() // // Get the time on that project for this month. The current time gives the current month. // tm := GetTimeAtMonth(currentProject, time.Now()) // // format the time string and print it out. // fmt.Print(formatTimeString(tm))  // // Function: GetTimeAtDate // // Description: This function will take a project and calculate the time spent // on that project for a particular date. // func GetTimeAtMonth(project string, date time.Time) int64  tm := int64(0) dateStart := time.Date(date.Year(), date.Month(), 1, 0, 0, 0, 0, time.UTC) // // Get the time added up for the whole week. // for i := 0; i <= date.Day(); i++  tm += GetTimeAtDate(project, dateStart.AddDate(0, 0, i))  // // Return the amount of time calculated. // return (tm)  // // Function: SystemViewWeek // // Description: This function will calculate the time the current week for all the projects. // // Inputs: // variable description // func SystemViewWeek()  currentProject := GetCurrentProject() tm := GetTimeAtWeek(currentProject, time.Now()) fmt.Print(formatTimeString(tm))  // // Function: GetTimeAtDate // // Description: This function will take a project and calculate the time spent // on that project for a particular date. // func GetTimeAtWeek(project string, date time.Time) int64  tm := int64(0) dateStart := date dateEnd := date switch date.Weekday()  case 0:  dateEnd = dateEnd.AddDate(0, 0, 6)  case 1:  dateStart = dateStart.AddDate(0, 0, -1) dateEnd = dateEnd.AddDate(0, 0, 5)  case 2:  dateStart = dateStart.AddDate(0, 0, -2) dateEnd = dateEnd.AddDate(0, 0, 4)  case 3:  dateStart = dateStart.AddDate(0, 0, -3) dateEnd = dateEnd.AddDate(0, 0, 3)  case 4:  dateStart = dateStart.AddDate(0, 0, -4) dateEnd = dateEnd.AddDate(0, 0, 2)  case 5:  dateStart = dateStart.AddDate(0, 0, -5) dateEnd = dateEnd.AddDate(0, 0, 1)  case 6:  dateStart = dateStart.AddDate(0, 0, -6)   // // Get the time added up for th whole week. // for i := 0; i < 7; i++  tm += GetTimeAtDate(project, dateStart.AddDate(0, 0, i))  return (tm)  // // Function: SystemViewDate // // Description: This function will calculate the time for projects at a certain date. // func SystemViewDate()  currentProject := GetCurrentProject() tm := GetTimeAtDate(currentProject, time.Now()) fmt.Print(formatTimeString(tm))  // // function: SystemViewDay // // Description: This function is for displaying a nice time for the current project. // func SystemViewDay()  currentProject := GetCurrentProject() tm := GetTimeAtDate(currentProject, time.Now()) ctime := formatTimeString(tm) state := GetCurrentState() fmt.Printf("The current time on %s is %s. Current state is %s.", currentProject, ctime, state)  // // Function: GetTimeAtDate // // Description: This function will take a project and calculate the time spent // on that project for a particular date. // func GetTimeAtDate(project string, date time.Time) int64  // // Get the current project. // filename := generateTimeLogFileName(project, date) tm := readDayTime(filename) return tm  // // Function: formatTimeString // // Description: This function takes the number of seconds and returns a string // in hour:minute:seconds format with zero padding. // // Input: // tm time in seconds (an int64) // func formatTimeString(tm int64) string  min := int(tm / 60) sec := tm - int64(min*60) hr := min / 60 min = min - (hr * 60) return fmt.Sprintf("%02d:%02d:%02d", hr, min, sec)  // // Function: readDayTime // // Description: This function reads a time sheet file and calculates the time // represented in that file. func readDayTime(filename string) int64  buf, _ := ioutil.ReadFile(filename) times := regexp.MustCompile("\n|\r").Split(string(buf), -1) // // Loop through all the time lines. // tmwork := int64(0) firsttime := int64(0) first := false for i := 0; i < len(times); i++  if !strings.Contains("", times[i])  // // Split by colon to time and action. // parts := strings.Split(times[i], ":") if strings.Contains("start", parts[1])  firsttime, _ = strconv.ParseInt(parts[0], 10, 64) first = true  else  tm, _ := strconv.ParseInt(parts[0], 10, 64) tmwork += tm - firsttime first = false    // // If a start was the last thing processed, that means it is still being timed. Get the // current time to see the overall time. firsttime is the time stamp when the start // was given. // if first  currentTime := time.Now() ctime := currentTime.Unix() tmwork += ctime - firsttime  // // Return the final Time. // return tmwork  // // Function: RemoveProject // // Description: This function will remove a project from the list a valid projects. // func RemoveProject()  // // Get the project name from the command line. // proj := GetCommandLineString() // // Get the list of project names. // projects := GetListOfProjects() // // Open the projects file in truncation mode to remove all the old stuff. // Filename := getTimeSheetDir() + "/projects.txt" Fh, err := os.OpenFile(Filename, os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0666) if err != nil  // // The file would not open. Error out. // fmt.Print("Could not open the projects file: ", Filename, "\n") os.Exit(1)  // // Loop through all the projects. // for i := 0; i < len(projects); i++  if !strings.Contains(proj, projects[i])  // // It is not the project to be removed. Put it into the file. // Fh.WriteString(projects[i] + "\n")   // // Close the file. // Fh.Close() // // Tell the user that the project has been removed. // fmt.Print(proj + " has been removed!")  // // Function: ChangeProject // // Description: This function will change the currently active project. If the old // project was started, it will stop it first, then set the new project // and start it. // func ChangeProject()  // // Get the project name from the command line. // proj := GetCommandLineString() // // Get the current project. // currentProject := GetCurrentProject() // // Stop the current project. // StopStartProject(currentProject, "stop") // // Save the new project to the data file. // SaveProject(proj) // // Start the new project. // StopStartProject(proj, "start") // // Tell the user it is started. // fmt.Print("The current project is now " + proj + " and is started.")  // // Function: GetCommandLineString // // Description: This function is used to get the after the function if there is one. // If not, then just return nothing. // func GetCommandLineString() string  // // See if we have any input other then the command. // clstring := "" if len(os.Args) > 2 clstring = strings.TrimSpace (os.Args [2]) // // Returner strengen. // return (clstring) // // Funksjon: AddProject // // Beskrivelse: Denne funksjonen vil legge til et nytt prosjekt i listen over gjeldende prosjekter. // func AddProject () // // Få prosjektnavnet fra kommandolinjen. // proj: = GetCommandLineString () // // Opprett filnavnet som inneholder alle prosjektene. // projectFile: = getTimeSheetDir () + "/projects.txt" Fh, err: = os.OpenFile (projectFile, os.O_APPEND | os.O_WRONLY | os.O_CREATE, 0666) hvis err! = null Fh, err = os.Create (projectFile) hvis err! = null // // Filen ville ikke åpne. Feil ut. // fmt.Print ("Kunne ikke åpne prosjektfilen:", projectFile, "\ n") os.Exit (1) // // Skriv den nye kommandoen med tidsstempelet til bufferen. // _, err = io.WriteString (Fh, proj + "\ n") // // Løs filen. // Fh.Close () // // Fortell brukeren at prosjektet er lagt til. // fmt.Print ("Lagt prosjekt" + proj + "til listen.") // // Funksjon: state // // Beskrivelse: Denne funksjonen gir riktig utgang for å endre tilstanden. Staten // første er den motsatte fra den nåværende tilstanden. // func state () // // Få siste status for det nåværende prosjektet. // stateFile: = getTimeSheetDir () + "/laststate.txt" buf, _: = ioutil.ReadFile (stateFile) curState: = streng (buf) // // Sett den første kommandoen til motsatt av gjeldende tilstand. På den måten / / brukeren skyver bare retur til bytteforhold. // hvis strenger.Contains (curState, "start") goAlfred.AddResult ("stop", "stop", "stop", "", "icon.png", "yes", "", "" goAlfred .AddResult ("start", "start", "start", "", "icon.png", "yes", "", "") else goAlfred.AddResult start "," "," icon.png "," ja "," "," ") goAlfred.AddResult (" stop "," stop "," stop "," "," icon.png " , "", "") // // Skriv ut xml-strengen. // fmt.Print (goAlfred.ToXML ()) // // Funksjon: prosjekt // // Beskrivelse: Denne funksjonen oppretter en liste over prosjektene og viser dem // lik inngangen. // func prosjekt () // // Få prosjektnavnet fra kommandolinjen. // proj: = GetCommandLineString () // // Angi standardstrengen. // goAlfred.SetDefaultString ("Alfred Time Keeper: Beklager, ingen kamp ...") // // Få det siste prosjektet. // latestproject: = GetCurrentProject () // // Få listen over prosjekter. // prosjekter: = lage ([] streng, MAXPROJECTS) prosjekter = GetListOfProjects () // // Regexp split setningen gir en streng mer enn delt ut. Den siste // strengen er et fangstfall. Det trenger ikke å bli inkludert. // numproj: = len (prosjekter) - 1 // // For hvert prosjekt, opprett en resultatlinje. Vis alle satt det nåværende prosjektet. // for i: = 0; Jeg < numproj; i++  if !strings.Contains(projects[i], latestproject)  goAlfred.AddResultsSimilar(proj, projects[i], projects[i], projects[i], "", "icon.png", "yes", "", "")   // // Print out the xml string. // fmt.Print(goAlfred.ToXML())  // // Function: GetListOfProjects // // Description: This function will return an array of string with the names of the project. // func GetListOfProjects() []string  // // Create the projects array and populate it. // projectFile := getTimeSheetDir() + "/projects.txt" buf, _ := ioutil.ReadFile(projectFile) // // Split out the different project names into separate strings. // return (regexp.MustCompile("\n|\r").Split(string(buf), -1))  // // Function: StopStart // // Description: This will place a start or stop time stamp for the current project and // current date. // func StopStart()  // // See if we have any input other then the command. If not, assume a stop command. // cmd := "stop" if len(os.Args) > 2 cmd = strings.ToLower (os.Args [2]) // // Få det nåværende prosjektet. // currentProject: = GetCurrentProject () // // Kjør den aktuelle funksjonen og skriv ut resultatene. // fmt.Print (StopStartProject (currentProject, cmd)) // // Funksjon: GetCurrentProject // // Beskrivelse: Denne funksjonen henter det nåværende prosjektet fra // tilstandsfilen. // func GetCurrentProject () streng // // Få det nåværende prosjektet. // Filnavn: = getTimeSheetDir () + "/project.txt" buf, _: = ioutil.ReadFile (Filnavn) // // Konverter det nåværende prosjektet til en streng, trim det og returner det. // return (strings.TrimSpace (streng (buf))) // // Funksjon: SaveProject // // Beskrivelse: Denne funksjonen lagrer det oppgitte prosjektnavnet til // aktuelle prosjektfilen. // // Inputs: // proj Navn på det nye prosjektet // func SaveProject (proj streng) // // Skriv det nye prosjektet. // Filnavn: = getTimeSheetDir () + "/project.txt" err: = ioutil.WriteFile (Filnavn, [] byte (proj), 0666) hvis err! = Null fmt.Print ("Kan ikke skrive prosjektfilen : "+ Filnavn) os.Exit (1) // // Funksjon: StopStartProject // // Beskrivelse: Denne funksjonen brukes til å angi tilstanden for det oppgitte prosjektet. // // Inputs: // currentProject Prosjektet for å påvirke tilstanden til. // cmd Start- eller stoppkommandoen. // func StopStartProject (currentProject string, cmd string) streng // // Oppsett resultatstrengen. // resultStr: = "" currentState: = GetCurrentState () // // Er den nåværende tilstanden den samme som den nye staten? // hvis strenger.Contains (cmd, currentState) // // Det er allerede i den aktuelle tilstanden. Ikke gjør noe, men gi en melding. // resultStr = "Already" + cmd + "\ n" else // // Ok, vi kan fortsette med å skrive den nye staten i // // datert prosjektfil. Åpne filen for å skrive. // currentTime: = time.Now () Filnavn: = generateTimeLogFileName (currentProject, currentTime) Fh, err: = os.OpenFile (Filnavn, os.O_APPEND | os.O_WRONLY | os.O_CREATE, 0666) hvis err! = null  // // Filen ville ikke åpne. Feil ut. // fmt.Print ("Kunne ikke åpne den daterte prosjektfilen:", Filnavn, "\ n") os.Exit (1) // // Skriv den nye kommandoen med tidsstempelet til bufferen. // str: = fmt.Sprintf ("% d:% s \ n", currentTime.Unix (), cmd) _, err = io.WriteString (Fh, str) // // Slett filen. // Fh.Close () // // Skriv den siste tilstandsfilen med den nye staten. // ioutil.WriteFile (getTimeSheetDir () + "/ laststate.txt", [] byte (cmd), 0666) // // Fortell brukeren den er satt. // resultStr = currentProject + "er nå" + cmd // // Returner den resulterende strengen. // return (resultStr) // // function: GetCurrentState // // Beskrivelse: Denne funksjonen får nåværende status for prosjektet. // func GetCurrentState () streng // // Få den nåværende tilstanden. // Filnavn: = getTimeSheetDir () + "/laststate.txt" buf, err: = ioutil.ReadFile (Filnavn) currentState: = "stop" hvis err == nil // // Konverter det nåværende prosjektet til en streng og trim det. // currentState = strings.TrimSpace (streng (buf)) return currentState // // Funksjon: generateTimeLogFileName // // Beskrivelse: Denne funksjonen lager tidloggfilen basert på prosjektnavnet og // dato. // // Inputs: // proj Navn på prosjektet // dt Dato i spørsmålet // func generateTimeLogFileName (proj streng, dt time.Time) streng // // Generer riktig filnavn basert på prosjektnavn og dato . // filnavn: = getTimeSheetDir () + "/" + proj + "_" + dt.Format ("2006-01-02") + ".txt" returnering (filnavn) 

Denne koden definerer all funksjonaliteten til Alfred Timekeeper. Utformingen av programmet er å gjøre forskjellige funksjoner basert på et kommandobrev og opsjonsparametere etter det. Det vil få tidsskriftet katalog fra Alfred og opprette prosjektfiler og tidsskrifter etter behov.

kompilering

Du må kompilere programmet før du kan bruke det. Go-språket er ikke et tolket språk, men et kompilert språk. Dette gjør at programmet kan kjøre mye raskere.

I terminalprogrammet skriver du:

gå bygge timekeeper.go 
Samler Timekeeper.go

Hvis alt er på plass riktig, bør du nå ha tidtakeren program i den katalogen. Det er i rødt over. Hvis noe ikke ble kopiert riktig og kompileringen mislykkes, ser du opp linjenummeret og sammenligner det med det ovenfor. Eller få en ny kopi fra nedlastingen gitt med denne opplæringen.

Legge til Alfred Funksjoner

Når programmet er ferdig, må du ringe det fra Alfred. Lage en søkeord blokkere med søkeordet satt til ATK: addproject. Koble den til en Kjør skript blokkere og sett denne koden:

./ TimeKeeper en "query" 

Alle Kjør skript blokker her ute bør settes til å kjøre bash skript og ingen av de angitte valgmulighetene. Ovennevnte skript tillater opprettelse av nye prosjekter. Bruk dette til å lage dine forskjellige prosjekter. Jeg har prosjektene: Envato, CustomCT, og oppdrag laget for arbeidet jeg gjør.

Nå som du har prosjekter, trenger du nå å sette en som dagens prosjekt. Lage en Skriptfilter som Nedenfor:

Skriptfilter for å velge et prosjekt

Legg til en Kjør skript blokkere etter det med følgende skript:

./ Timekeeper c "query" 
Stille inn prosjektet

Nå kan du sette prosjektet du vil jobbe med. I Alfred Prompt, skriv inn ATK: prosjekt og en liste over de opprettede prosjektene skal vises. Velg prosjektet du vil ha, og det starter automatisk timing for deg.

Derfor, hvis du valgte Guider prosjekt, det er en fil som heter Tutorials_2014-05-05.txt (det vil si så lenge du opprettet den 5. mai 2014). Innsiden den filen er et tidsstempel, et kolon og a start uttalelse. Du vil også ha project.txt fil med det valgte prosjektet, laststate.txt fil med siste tilstand (dvs. start eller Stoppe), og projects.txt fil med en liste over opprettede prosjekter.

Tidspunktet har startet, men nå må du stoppe det. Lage en ny Skriptfilter blokkere med søkeordet satt til ATK: state og manuset satt til:

./ TimeKeeper s "query" 

Det burde koble til en Kjør skript blokkere med skriptet satt til:

./ TimeKeeper o "query" 

De s kommandoen forteller Timekeeper-programmet for å generere en XML-utgang for neste tilstand. Det vil automatisk ha det første alternativet i XML for å være motsatt av gjeldende tilstand.

Endre timing stater

Du kan nå bytte tilstanden til timing et prosjekt med ATK: state. Du kan også opprette hurtigtaster for å starte og stoppe timingen. Prøv å gjøre det på egen hånd. Du lærer aldri før du prøver!

Legge til en ekstern utløser

Det kan hende du vil ha et eksternt program for å stille inn tidsposisjonen. Opprett derfor en Ekstern utløser blokkere som vist. Koble denne blokken til det forrige Kjør skript blokkere.

Legge til en ekstern utløser - Konfigurasjon

De Eksempelkode nederst kan kjøres av ethvert AppleScript-bevisst program for å utløse start stopp handlinger på det nåværende prosjektet. Hvis du erstatter teksten test med Stoppe, det vil stoppe timingen. Hvis du erstatter teksten test med start, det vil starte timingen. Brukes med ControlPlane, Du kan opprette en regel for å slå av timing når datamaskinen sover og gjenoppta timing når datamaskinen våkner.

Nå som du starter og stopper tiden, må du se tiden. Lage en søkeord blokkere med ATK: nåværende. Koble den til en Kjør skript blokkere med dette skriptet:

ekko '. / Timekeeper b'; 

Koble den til Melding blokkere.

Nåværende tidskommando

Når du kjører ATK: nåværende i Alfred-ledetekst, får du nåværende tid på prosjektet og den nåværende tilstanden.

Andre datamaskin

Hvis du har en annen datamaskin, kan du konfigurere Alfred til å dele over Dropbox. Når du er satt opp, oppdateres alle arbeidsflytene automatisk fra en datamaskin til den andre.

Sette opp Alfred Syncing

Velg Angi synkroniseringsmappe å sette opp synkronisering via Dropbox og følg instruksjonene. På den andre datamaskinen, bruk kommandoen ATK: setdir å angi tidsskriftskatalogen du opprettet i Dropbox. De to systemene kan nå starte og stoppe prosjektets timing. Pass på at Dropbox er fullt synkronisert mellom tilstandsendringer.

Konklusjon

Det er grunnleggende for Alfred Timekeeper. Arbeidsflyten pakket med nedlastingen er den fulle versjonen med andre funksjoner. Du forstår nå hvordan du oppretter ditt eget tidsstyringssystem som er skalerbart for bruk på flere datamaskiner ved hjelp av Dropbox, og tar ikke opp datamaterialer. 

Siden jeg bruker dette hver dag, vil jeg legge til flere funksjoner som et webgrensesnitt for å se tidskrifter grafisk. Hvis du kan komme opp med andre funksjoner, prøv å legge til dem selv! Det er gøy å jobbe med Alfreds arbeidsflyter.