Compare commits

..

14 Commits

Author SHA1 Message Date
amin fffd1bca7c improvement: week view with ctrl-h and ctrl-l 2025-06-13 14:58:09 +02:00
amin 13aebae71f bug fix: return from dayview 2025-06-13 14:57:17 +02:00
amin 93317350f1 bugfix: cleanup at tend 2025-06-13 14:51:56 +02:00
amin e67fcca02c feat: import 2025-06-13 14:47:01 +02:00
amin 735665bb92 extended description of configuration 2025-06-13 14:12:29 +02:00
amin 0ffa57373a feat:change tz from within application 2025-06-13 14:07:44 +02:00
amin 6d8520a016 non-recursive, clean 2025-06-13 13:04:35 +02:00
amin ff898c84c8 feat:location support 2025-06-12 21:47:30 +02:00
amin dc88d5a965 feat: dayview: jump to next/previous day 2025-06-12 15:22:27 +02:00
amin cdc008e361 bugfix: corrected week calculation (iso) 2025-06-12 14:57:36 +02:00
amin 7549acb20c bugfix: handle wrong date input in entry creation 2025-06-12 12:44:55 +02:00
amin aee1a1bf24 improvement: no jump to "day" line in search view 2025-06-12 11:40:47 +02:00
amin 4ebcbe36e3 bugfix: disable up/down limits in search view 2025-06-12 11:39:14 +02:00
amin acc231027b update readme 2025-06-11 22:27:53 +02:00
7 changed files with 1002 additions and 558 deletions
+22 -1
View File
@@ -1,4 +1,7 @@
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
------------------------
@@ -60,6 +63,20 @@ 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
-----
Use the default `fzf` keys to navigate your calendar entries, e.g., `ctrl-j`
@@ -81,12 +98,16 @@ Here is the list of available keybindings:
| `ctrl-alt-u` | week view | Go back one month |
| `ctrl-alt-d` | week view | Go forth one month |
| `ctrl-s` | week view | Run the synchronization command |
| `ctrl-l` | week view | Go to current week |
| `ctrl-r` | week view | Go to current week |
| `ctrl-g` | week view | Goto date |
| `ctrl-t` | week view | Change timezone |
| `enter` | day view | Open selected calendar entry in your favorite `$EDITOR` |
| `ctrl-n` | day view | Make a new entry |
| `ctrl-l` | day view | Move to next day |
| `ctrl-h` | day view | Move to previous day |
| `esc`, `backspace` or `q` | day view | Go back to week view |
| `ctrl-s` | day view | Run the synchronization command |
| `ctrl-t` | day view | Change timezone |
| `ctrl-alt-d` | day view | Delete selected entry |
| `j` | day view | Scroll down in preview window |
| `k` | day view | Scroll up in preview window |
+2 -2
View File
@@ -68,8 +68,8 @@ BEGIN {
FAINT = "\033[2m";
OFF = "\033[m";
}
BEGINFILE { inside = 0; rs = 0; dur = 0; summary = ""; start = "ERROR"; end = "" }
/^END:VEVENT/ { print "~", start, dur ? start " " end : (end ? end : start), title(start, summary), fn(FILENAME, n, a); nextfile }
BEGINFILE { inside = 0; rs = 0; dur = 0; summary = ""; start = "ERROR"; end = "ERROR" }
/^END:VEVENT/ { print "~", start, dur ? start " " end : end, title(start, summary), fn(FILENAME, n, a); nextfile }
/^DTSTART/ && inside { start = parse( dt) }
/^DTEND/ && inside { end = parse( dt) }
/^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) {
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) {
starth = substr(start, 1, 2)
@@ -39,11 +39,11 @@ BEGIN {
OFF = "\033[m"
OFS = "|"
}
$1 == "00:00" && $2 == "00:00" { print $1, $3, $4, $5, allday($6); next }
$1 == "00:00" { print $1, $3, $4, $5, endstoday($2, $6); next }
$1 == "00:00" && $2 == "00:00" { print today, $1, $3, $4, $5, allday($6); next }
$1 == "00:00" { print today, $1, $3, $4, $5, endstoday($2, $6); next }
$1 ~ /^[0-9]{2}:[0-9]{2}$/ {
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 {
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 {
i = i + 1;
from[i] = int(($1 + dlt)/ spw);
from_year[i] = $1
from_week[i] = $2
getline;
to[i] = int(($1 + dlt) / spw);
to_year[i] = $1
to_week[i] = $2
next
} # Load start and end week numbers from first file
{
if (from[FNR] > to[FNR])
print "FNR", FNR, ":", from[FNR],"-",to[FNR], " ",$0;
for(i=from[FNR]; i<=to[FNR]; i++) {
week[i] = week[i] " " $5
year_i = from_year[FNR]
week_i = from_week[FNR]
year_end = to_year[FNR]
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]; }
+20 -4
View File
@@ -27,10 +27,18 @@ BEGIN {
desc { desc = desc "\\n" $0; next; }
{
from = substr($0, 1, 6) == "::: |>" ? substr($0, 8) : "";
if (!from)
exit 1
getline
to = substr($0, 1, 6) == "::: <|" ? substr($0, 8) : "";
if (!to)
exit 1
getline
location = substr($0, 1, 2) == "@ " ? substr($0, 3) : ""
if (location) getline
summary = substr($0, 1, 2) == "# " ? substr($0, 3) : ""
if (!summary)
exit 1
getline # This line should be empty
getline # First line of description
desc = $0;
@@ -41,7 +49,7 @@ END {
# 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
# date-time entry.
from = from ? from : "now"
gsub("\"", "\\\"", from)
cmd = "date -d \"" from "\" +\"%N\"";
cmd | getline t
close(cmd)
@@ -53,10 +61,13 @@ END {
from_type = "DATE"
cmd = "date -d \"" from "\" +\"%Y%m%d\"";
}
cmd | getline from
suc = cmd | getline from
close(cmd)
if (suc != 1) {
exit 1
}
#
to = to ? to : "now"
gsub("\"", "\\\"", to)
cmd = "date -d \"" to "\" +\"%N\"";
cmd | getline t
close(cmd)
@@ -68,9 +79,13 @@ END {
to_type = "DATE"
cmd = "date -d \"" to "\" +\"%Y%m%d\"";
}
cmd | getline to
suc = cmd | getline to
close(cmd)
if (suc != 1) {
exit 1
}
escape(summary);
escape(location);
escape(desc);
# print ical
@@ -90,6 +105,7 @@ END {
print "DTEND;VALUE=" to_type ":" to
if (summary) print_fold("SUMMARY:", summary, i, s);
if (desc) print_fold("DESCRIPTION:", desc, i, s);
if (location) print_fold("LOCATION:", location, i, s);
print "END:VEVENT"
print "END:VCALENDAR"
}
+21 -5
View File
@@ -36,7 +36,7 @@ ENDFILE {
# 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
# date-time entry.
from = from ? from : "now"
gsub("\"", "\\\"", from)
cmd = "date -d \"" from "\" +\"%N\"";
cmd | getline t
close(cmd)
@@ -48,10 +48,13 @@ ENDFILE {
from_type = "DATE"
cmd = "date -d \"" from "\" +\"%Y%m%d\"";
}
cmd | getline from
suc = cmd | getline from
close(cmd)
if (suc != 1) {
exit 1
}
#
to = to ? to : "now"
gsub("\"", "\\\"", to)
cmd = "date -d \"" to "\" +\"%N\"";
cmd | getline t
close(cmd)
@@ -63,20 +66,32 @@ ENDFILE {
to_type = "DATE"
cmd = "date -d \"" to "\" +\"%Y%m%d\"";
}
cmd | getline to
suc = cmd | getline to
close(cmd)
if (suc != 1) {
exit 1
}
escape(summary);
escape(location);
escape(desc);
}
}
NR == FNR && desc { desc = desc "\\n" $0; next; }
NR == FNR {
from = substr($0, 1, 6) == "::: |>" ? substr($0, 8) : "";
if (!from)
exit 1
getline
to = substr($0, 1, 6) == "::: <|" ? substr($0, 8) : "";
if (!to)
exit 1
getline
location = substr($0, 1, 2) == "@ " ? substr($0, 3) : ""
if (location) getline
summary = substr($0, 1, 2) == "# " ? substr($0, 3) : ""
if (!summary)
exit 1
getline # This line should be empty
getline # First line of description
desc = $0;
@@ -86,7 +101,7 @@ NR == FNR {
/^BEGIN:VEVENT$/ { inside = 1; print; next }
/^X-ALT-DESC/ && inside { next } # drop this alternative description
/^ / && 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
/^END:VEVENT$/ {
seq = seq ? seq + 1 : 1
@@ -96,6 +111,7 @@ NR == FNR {
print "DTEND;VALUE=" to_type ":" to
print_fold("SUMMARY:", summary, i, s)
print_fold("DESCRIPTION:", desc, i, s)
print_fold("LOCATION:", location, i, s)
inside = ""
}
{ print }
+886 -505
View File
File diff suppressed because it is too large Load Diff