Compare commits

..

19 Commits

7 changed files with 1162 additions and 597 deletions
+71 -24
View File
@@ -1,4 +1,7 @@
A [fzf](https://github.com/junegunn/fzf)-based **calendar** application with CalDav support. A [fzf](https://github.com/junegunn/fzf)-based **calendar** application with CalDav support.
If you are interested in this, then you may also be interested in the
corresponding journaling application
[fzf-vjour](https://github.com/baumea/fzf-vjour).
Description and Use Case Description and Use Case
------------------------ ------------------------
@@ -60,37 +63,77 @@ item_types = ["VEVENT"]
... ...
``` ```
Here is the complete list of configuration options:
```
### ROOT: Directory containing the collections
### COLLECTION_LABELS: Mappings between collections and labels
### SYNC_CMD (optional): Synchronization command
### DAY_START (optional): Hour of start of the day (defaults to 8)
### DAY_END (optional): Hour of end of the day (defaults to 18)
### EDITOR (optional): Your favorite editor, is usually already exported
### TZ (optional): Your favorite timezone, usually system's choice
### LC_TIME (optional): Your favorite locale for date and time
### ZI_DIR (optional): Location of tzdata, defaults to /usr/share/zoneinfo
```
Usage Usage
----- -----
Use the default `fzf` keys to navigate your calendar entries, e.g., `ctrl-j`
and `ctrl-k` for going down/up in the list.
After starting `fzf-vcal`, you are presented with a view on the current week. After starting `fzf-vcal`, you are presented with a view on the current week.
You can navigate that week using `j` and `h` for going down and up.
Hit `<enter>` on any day, and you will see all entries for that date, including Hit `<enter>` on any day, and you will see all entries for that date, including
previews. In both, the week and day views, you can add entries by hitting previews. In both, the week and day views, you can add entries by hitting
`ctrl-n`. `ctrl-n`.
Here is the list of available keybindings: Here is the list of all available keybindings:
| Key | View | Action |
| --- | ---- | ------ | ### Week view
| `enter` | week view | Switch to day view |
| `ctrl-n` | week view | Make a new entry | | Key | Action |
| any letter | week view | Search in the list of all entries | | --- | ------ |
| `backspace` on empty query | week view | Undo search | | `enter` | open day |
| `ctrl-u` | week view | Go back one week | | `j` | down |
| `ctrl-d` | week view | Go forth one week | | `k` | up |
| `ctrl-alt-u` | week view | Go back one month | | `l` | go to next week |
| `ctrl-alt-d` | week view | Go forth one month | | `h` | go to previous week |
| `ctrl-s` | week view | Run the synchronization command | | `ctrl-l` | go to next month |
| `ctrl-l` | week view | Go to current week | | `ctrl-h` | go to previous month |
| `ctrl-g` | week view | Goto date | | `alt-l` | go to next year |
| `enter` | day view | Open selected calendar entry in your favorite `$EDITOR` | | `alt-h` | go to previous year |
| `ctrl-n` | day view | Make a new entry | | `ctrl-r` | reload and go to week that contains `today` |
| `esc`, `backspace` or `q` | day view | Go back to week view | | `ctrl-g` | interactively go to specified week |
| `ctrl-s` | day view | Run the synchronization command | | `ctrl-t` | set timezon |
| `ctrl-alt-d` | day view | Delete selected entry | | `ctrl-s` | synchronize |
| `j` | day view | Scroll down in preview window | | `ctrl-n` | add new entry |
| `k` | day view | Scroll up in preview window | | `\` | search all appointment s|
| `w` | day view | Toggle line wrap in preview window ||
### Day view
| Key | Action |
| --- | ------ |
| `enter` | edit appointment |
| `j` | down |
| `k` | up |
| `l` | go to next day |
| `h` | go to previous day |
| `ctrl-l` | go to next week |
| `ctrl-h` | go to previous week |
| `alt-l` | go to next month |
| `alt-h` | go to previous month |
| `ctrl-r` | reload and go to `today` |
| `ctrl-g` | interactively go to specified day |
| `ctrl-t` | set timezon |
| `ctrl-s` | synchronize |
| `ctrl-n` | add new entry |
| `ctrl-alt-d` | delete entry |
| `w` | toggle line wrap in preview |
| `ctrl-d` | down in preview |
| `ctrl-u` | up in preview |
| `alt-v` | view raw iCalendar file |
| `esc` | return to week view, you can also do this with `q` or `backspace` |
### There is more
You may also invoke the script with `--help` to see further command-line options. You may also invoke the script with `--help` to see further command-line options.
@@ -98,6 +141,10 @@ Also, you may set `LC_TIME` to your preferred language, and `TZ` to your
preferred timezone. The latter is in particular helpful if you want to take a preferred timezone. The latter is in particular helpful if you want to take a
look at your calendar relative to being in another timezone. look at your calendar relative to being in another timezone.
Git support
-----------
You can track your events with `git` by simply running `fzf-vcal --git-init`.
License License
------- -------
This project is licensed under the [MIT License](./LICENSE). This project is licensed under the [MIT License](./LICENSE).
+2 -2
View File
@@ -68,8 +68,8 @@ BEGIN {
FAINT = "\033[2m"; FAINT = "\033[2m";
OFF = "\033[m"; OFF = "\033[m";
} }
BEGINFILE { inside = 0; rs = 0; dur = 0; summary = ""; start = "ERROR"; end = "" } BEGINFILE { inside = 0; rs = 0; dur = 0; summary = ""; start = "ERROR"; end = "ERROR" }
/^END:VEVENT/ { print "~", start, dur ? start " " end : (end ? end : start), title(start, summary), fn(FILENAME, n, a); nextfile } /^END:VEVENT/ { print "~", start, dur ? start " " end : end, title(start, summary), fn(FILENAME, n, a); nextfile }
/^DTSTART/ && inside { start = parse( dt) } /^DTSTART/ && inside { start = parse( dt) }
/^DTEND/ && inside { end = parse( dt) } /^DTEND/ && inside { end = parse( dt) }
/^DURATION/ && inside { end = parse_duration( dt, dta, i, n, a, seps); dur = 1 } /^DURATION/ && inside { end = parse_duration( dt, dta, i, n, a, seps); dur = 1 }
+4 -4
View File
@@ -14,7 +14,7 @@ function slice(start, stop, desc) {
} }
function hrline(hour) { function hrline(hour) {
hour = hour < 10 ? "0"hour : hour hour = hour < 10 ? "0"hour : hour
print hour, "", "", "", FAINT hour ":00 ----------------------" OFF print today, hour, "", "", "", FAINT hour ":00 ----------------------" OFF
} }
function hrlines(start, stop, h, starth, stoph, tmp, i) { function hrlines(start, stop, h, starth, stoph, tmp, i) {
starth = substr(start, 1, 2) starth = substr(start, 1, 2)
@@ -39,11 +39,11 @@ BEGIN {
OFF = "\033[m" OFF = "\033[m"
OFS = "|" OFS = "|"
} }
$1 == "00:00" && $2 == "00:00" { print $1, $3, $4, $5, allday($6); next } $1 == "00:00" && $2 == "00:00" { print today, $1, $3, $4, $5, allday($6); next }
$1 == "00:00" { print $1, $3, $4, $5, endstoday($2, $6); next } $1 == "00:00" { print today, $1, $3, $4, $5, endstoday($2, $6); next }
$1 ~ /^[0-9]{2}:[0-9]{2}$/ { $1 ~ /^[0-9]{2}:[0-9]{2}$/ {
daystart = hrlines($1, $2, daystart, starth, stoph, tmp, i) daystart = hrlines($1, $2, daystart, starth, stoph, tmp, i)
print $1, $3, $4, $5, slice($1, $2, $6) print today, $1, $3, $4, $5, slice($1, $2, $6)
} }
END { END {
hrlines(dayend":00", 0, daystart, starth, stoph, tmp, i) hrlines(dayend":00", 0, daystart, starth, stoph, tmp, i)
+18 -8
View File
@@ -1,17 +1,27 @@
BEGIN { FS="|"; i=0; dlt = -259200; spw = 604800; } BEGIN { FS="|" }
NR == FNR { NR == FNR {
i = i + 1; i = i + 1;
from[i] = int(($1 + dlt)/ spw); from_year[i] = $1
from_week[i] = $2
getline; getline;
to[i] = int(($1 + dlt) / spw); to_year[i] = $1
to_week[i] = $2
next next
} # Load start and end week numbers from first file } # Load start and end week numbers from first file
{ {
if (from[FNR] > to[FNR]) year_i = from_year[FNR]
print "FNR", FNR, ":", from[FNR],"-",to[FNR], " ",$0; week_i = from_week[FNR]
for(i=from[FNR]; i<=to[FNR]; i++) { year_end = to_year[FNR]
week[i] = week[i] " " $5 week_end = to_week[FNR]
while(year_i <= year_end && (year_i < year_end || week_i <= week_end)) {
label = year_i"|"week_i
week[label] = week[label] " " $5
week_i++
if (week_i > 53) {
week_ = 1
year_i++
}
} }
} }
END { for (i in week) print i week[i]; } END { for (label in week) print label week[label]; }
+39 -13
View File
@@ -27,10 +27,18 @@ BEGIN {
desc { desc = desc "\\n" $0; next; } desc { desc = desc "\\n" $0; next; }
{ {
from = substr($0, 1, 6) == "::: |>" ? substr($0, 8) : ""; from = substr($0, 1, 6) == "::: |>" ? substr($0, 8) : "";
if (!from)
exit 1
getline getline
to = substr($0, 1, 6) == "::: <|" ? substr($0, 8) : ""; to = substr($0, 1, 6) == "::: <|" ? substr($0, 8) : "";
if (!to)
exit 1
getline getline
location = substr($0, 1, 2) == "@ " ? substr($0, 3) : ""
if (location) getline
summary = substr($0, 1, 2) == "# " ? substr($0, 3) : "" summary = substr($0, 1, 2) == "# " ? substr($0, 3) : ""
if (!summary)
exit 1
getline # This line should be empty getline # This line should be empty
getline # First line of description getline # First line of description
desc = $0; desc = $0;
@@ -41,36 +49,53 @@ END {
# If nanoseconds are not 0, then we assume user enterd "tomorrow" or # If nanoseconds are not 0, then we assume user enterd "tomorrow" or
# something the like, and we make this a date entry, as opposed to a # something the like, and we make this a date entry, as opposed to a
# date-time entry. # date-time entry.
from = from ? from : "now" # Similalry, if the time is 00:00, we make this a date, as opposed to a
# date-time entry.
gsub("\"", "\\\"", from)
cmd = "date -d \"" from "\" +\"%N\""; cmd = "date -d \"" from "\" +\"%N\"";
cmd | getline n
close(cmd)
n = n + 0
cmd = "date -d \"" from "\" +\"%H%M\"";
cmd | getline t cmd | getline t
close(cmd) close(cmd)
t = t + 0 t = t + 0
if (t == 0) { if (n != 0 || t == 0) {
from_type = "DATE-TIME"
cmd = "date -d \"" from "\" +\"@%s\" | xargs date -u +\"%Y%m%dT%H%M00Z\" -d"
} else {
from_type = "DATE" from_type = "DATE"
cmd = "date -d \"" from "\" +\"%Y%m%d\""; cmd = "date -d \"" from "\" +\"%Y%m%d\"";
} else {
from_type = "DATE-TIME"
cmd = "date -d \"" from "\" +\"@%s\" | xargs date -u +\"%Y%m%dT%H%M00Z\" -d"
} }
cmd | getline from suc = cmd | getline from
close(cmd) close(cmd)
if (suc != 1) {
exit 1
}
# #
to = to ? to : "now" gsub("\"", "\\\"", to)
cmd = "date -d \"" to "\" +\"%N\""; cmd = "date -d \"" to "\" +\"%N\"";
cmd | getline n
close(cmd)
n = n + 0
cmd = "date -d \"" to "\" +\"%H%M\"";
cmd | getline t cmd | getline t
close(cmd) close(cmd)
t = t + 0 t = t + 0
if (t == 0) { if (n != 0 || t == 0) {
to_type = "DATE-TIME"
cmd = "date -d \"" to "\" +\"@%s\" | xargs date -u +\"%Y%m%dT%H%M00Z\" -d"
} else {
to_type = "DATE" to_type = "DATE"
cmd = "date -d \"" to "\" +\"%Y%m%d\""; cmd = "date -d \"" to "\" +\"%Y%m%d\"";
} else {
to_type = "DATE-TIME"
cmd = "date -d \"" to "\" +\"@%s\" | xargs date -u +\"%Y%m%dT%H%M00Z\" -d"
} }
cmd | getline to suc = cmd | getline to
close(cmd) close(cmd)
if (suc != 1) {
exit 1
}
escape(summary); escape(summary);
escape(location);
escape(desc); escape(desc);
# print ical # print ical
@@ -85,11 +110,12 @@ END {
print "CREATED:" zulu; print "CREATED:" zulu;
print "SEQUENCE:1"; print "SEQUENCE:1";
print "LAST-MODIFIED:" zulu; print "LAST-MODIFIED:" zulu;
print "STATUS:FINAL"; print "STATUS:VEVENT";
print "DTSTART;VALUE=" from_type ":" from print "DTSTART;VALUE=" from_type ":" from
print "DTEND;VALUE=" to_type ":" to print "DTEND;VALUE=" to_type ":" to
if (summary) print_fold("SUMMARY:", summary, i, s); if (summary) print_fold("SUMMARY:", summary, i, s);
if (desc) print_fold("DESCRIPTION:", desc, i, s); if (desc) print_fold("DESCRIPTION:", desc, i, s);
if (location) print_fold("LOCATION:", location, i, s);
print "END:VEVENT" print "END:VEVENT"
print "END:VCALENDAR" print "END:VCALENDAR"
} }
+39 -15
View File
@@ -36,47 +36,70 @@ ENDFILE {
# If nanoseconds are not 0, then we assume user enterd "tomorrow" or # If nanoseconds are not 0, then we assume user enterd "tomorrow" or
# something the like, and we make this a date entry, as opposed to a # something the like, and we make this a date entry, as opposed to a
# date-time entry. # date-time entry.
from = from ? from : "now" gsub("\"", "\\\"", from)
cmd = "date -d \"" from "\" +\"%N\""; cmd = "date -d \"" from "\" +\"%N\"";
cmd | getline n
close(cmd)
n = n + 0
cmd = "date -d \"" from "\" +\"%H%M\"";
cmd | getline t cmd | getline t
close(cmd) close(cmd)
t = t + 0 t = t + 0
if (t == 0) { if (n != 0 || t == 0) {
from_type = "DATE-TIME"
cmd = "date -d \"" from "\" +\"@%s\" | xargs date -u +\"%Y%m%dT%H%M00Z\" -d"
} else {
from_type = "DATE" from_type = "DATE"
cmd = "date -d \"" from "\" +\"%Y%m%d\""; cmd = "date -d \"" from "\" +\"%Y%m%d\"";
} else {
from_type = "DATE-TIME"
cmd = "date -d \"" from "\" +\"@%s\" | xargs date -u +\"%Y%m%dT%H%M00Z\" -d"
} }
cmd | getline from suc = cmd | getline from
close(cmd) close(cmd)
if (suc != 1) {
exit 1
}
# #
to = to ? to : "now" gsub("\"", "\\\"", to)
cmd = "date -d \"" to "\" +\"%N\""; cmd = "date -d \"" to "\" +\"%N\"";
cmd | getline n
close(cmd)
n = n + 0
cmd = "date -d \"" to "\" +\"%H%M\"";
cmd | getline t cmd | getline t
close(cmd) close(cmd)
t = t + 0 t = t + 0
if (t == 0) { if (n != 0 || t == 0) {
to_type = "DATE-TIME"
cmd = "date -d \"" to "\" +\"@%s\" | xargs date -u +\"%Y%m%dT%H%M00Z\" -d"
} else {
to_type = "DATE" to_type = "DATE"
cmd = "date -d \"" to "\" +\"%Y%m%d\""; cmd = "date -d \"" to "\" +\"%Y%m%d\"";
} else {
to_type = "DATE-TIME"
cmd = "date -d \"" to "\" +\"@%s\" | xargs date -u +\"%Y%m%dT%H%M00Z\" -d"
} }
cmd | getline to suc = cmd | getline to
close(cmd) close(cmd)
if (suc != 1) {
exit 1
}
escape(summary);
escape(location);
escape(desc);
} }
escape(summary);
escape(desc);
} }
NR == FNR && desc { desc = desc "\\n" $0; next; } NR == FNR && desc { desc = desc "\\n" $0; next; }
NR == FNR { NR == FNR {
from = substr($0, 1, 6) == "::: |>" ? substr($0, 8) : ""; from = substr($0, 1, 6) == "::: |>" ? substr($0, 8) : "";
if (!from)
exit 1
getline getline
to = substr($0, 1, 6) == "::: <|" ? substr($0, 8) : ""; to = substr($0, 1, 6) == "::: <|" ? substr($0, 8) : "";
if (!to)
exit 1
getline getline
location = substr($0, 1, 2) == "@ " ? substr($0, 3) : ""
if (location) getline
summary = substr($0, 1, 2) == "# " ? substr($0, 3) : "" summary = substr($0, 1, 2) == "# " ? substr($0, 3) : ""
if (!summary)
exit 1
getline # This line should be empty getline # This line should be empty
getline # First line of description getline # First line of description
desc = $0; desc = $0;
@@ -86,7 +109,7 @@ NR == FNR {
/^BEGIN:VEVENT$/ { inside = 1; print; next } /^BEGIN:VEVENT$/ { inside = 1; print; next }
/^X-ALT-DESC/ && inside { next } # drop this alternative description /^X-ALT-DESC/ && inside { next } # drop this alternative description
/^ / && inside { next } # drop this folded line (the only content with folded lines will be updated) /^ / && inside { next } # drop this folded line (the only content with folded lines will be updated)
/^(DTSTART|DTEND|SUMMARY|CATEGORIES|DESCRIPTION|LAST-MODIFIED)/ && inside { next } # skip for now, we will write updated fields at the end /^(DTSTART|DTEND|SUMMARY|LOCATION|CATEGORIES|DESCRIPTION|LAST-MODIFIED)/ && inside { next } # skip for now, we will write updated fields at the end
/^SEQUENCE/ && inside { seq = $2; next } # store sequence number and skip /^SEQUENCE/ && inside { seq = $2; next } # store sequence number and skip
/^END:VEVENT$/ { /^END:VEVENT$/ {
seq = seq ? seq + 1 : 1 seq = seq ? seq + 1 : 1
@@ -96,6 +119,7 @@ NR == FNR {
print "DTEND;VALUE=" to_type ":" to print "DTEND;VALUE=" to_type ":" to
print_fold("SUMMARY:", summary, i, s) print_fold("SUMMARY:", summary, i, s)
print_fold("DESCRIPTION:", desc, i, s) print_fold("DESCRIPTION:", desc, i, s)
print_fold("LOCATION:", location, i, s)
inside = "" inside = ""
} }
{ print } { print }
+989 -531
View File
File diff suppressed because it is too large Load Diff