diff --git a/internal/denote/denote.go b/internal/denote/denote.go index 73ac27e..1ff1121 100644 --- a/internal/denote/denote.go +++ b/internal/denote/denote.go @@ -513,6 +513,10 @@ func EventListener() { if err := handleNewEvent(identifier); err != nil { log.Printf("error handling new for %s: %v", identifier, err) } + case "d": + if err := handleDeleteEvent(identifier); err != nil { + log.Printf("error handling delete for %s: %v", identifier, err) + } } } }) @@ -652,3 +656,31 @@ func handleNewEvent(identifier string) error { log.Printf("created new note: %s at %s", identifier, path) return nil } + +func handleDeleteEvent(identifier string) error { + // Get denote directory + denoteDir := GetDir() + + // Find file matching pattern: --* + pattern := filepath.Join(denoteDir, identifier+"--*") + matches, err := filepath.Glob(pattern) + if err != nil { + return fmt.Errorf("failed to find file: %w", err) + } + + if len(matches) == 0 { + return fmt.Errorf("no file found matching identifier: %s", identifier) + } + + if len(matches) > 1 { + log.Printf("warning: multiple files match identifier %s, deleting first: %s", identifier, matches[0]) + } + + // Delete the file + if err := os.Remove(matches[0]); err != nil { + return fmt.Errorf("failed to delete file: %w", err) + } + + log.Printf("deleted note: %s", matches[0]) + return nil +} diff --git a/internal/fs/fs.go b/internal/fs/fs.go index dd95a2b..0a6ce20 100644 --- a/internal/fs/fs.go +++ b/internal/fs/fs.go @@ -1006,7 +1006,20 @@ func (s *server) write(cs *connState, fc *plan9.Fcall) *plan9.Fcall { default: } case "event": - // Emit custom event (e.g., "r" for rename) + // Handle delete event specially + if value == "d" { + // Remove from in-memory state + s.mu.Lock() + for i, n := range s.notes { + if n.Identifier == noteID { + s.notes = append(s.notes[:i], s.notes[i+1:]...) + break + } + } + s.mu.Unlock() + } + + // Emit custom event (e.g., "r" for rename, "d" for delete) event := noteID + " " + value select { case s.eventChan <- event: diff --git a/main.go b/main.go index ea00b95..0ddb6b8 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "log" "os" "os/exec" + "path/filepath" "regexp" "strings" "unicode" @@ -61,7 +62,7 @@ func main() { } defer w.CloseFiles() - if err = ui.TagSet(w, "New Reset Sync Put"); err != nil { + if err = ui.TagSet(w, "New Put Remove Reset Sync"); err != nil { log.Fatal(err) } @@ -97,15 +98,17 @@ func main() { event := strings.TrimSpace(string(buf[:n])) parts := strings.Fields(event) - if len(parts) >= 2 && parts[1] == "n" { - // Refresh window with new results - rs, err := denote.Search(fs.Filters{}) - if err != nil { - log.Printf("error refreshing after new file: %v", err) - continue + if len(parts) >= 2 { + if parts[1] == "n" || parts[1] == "d" { + // Refresh window with new results + rs, err := denote.Search(fs.Filters{}) + if err != nil { + log.Printf("error refreshing after new file: %v", err) + continue + } + fs.Sort(rs, fs.SortById, fs.SortOrderDesc) + refreshWindow(w, rs) } - fs.Sort(rs, fs.SortById, fs.SortOrderDesc) - refreshWindow(w, rs) } } }) @@ -138,6 +141,20 @@ func main() { }); err != nil { log.Printf("failed to create new file: %v", err) } + case "Remove": + // Read chorded argument + input := strings.TrimSpace(string(e.Arg)) + if input == "" { + log.Printf("New: no input provided") + break + } + + // Write to denote//event via 9P + if err := fs.With9P(func(f *client.Fsys) error { + return fs.WriteFile(f, filepath.Join(input, "event"), "d") + }); err != nil { + log.Printf("failed to delete file: %v", err) + } case "Reset": rs, err := denote.Search(fs.Filters{}) if err != nil {