This layer provides two-way Google calendar synchronization using the org-gcal
package and a dedicated calendar view using calfw
package.
Calendar events are synchronized to your computer by org-gcal
. They are stored in org format in one or several files user definable files. This allow the user both to include these calendar events in org-agenda
and to create new events from any emacs buffer with org-capture
. To learn how to setup and use the many features of org-mode
see orgmode.org.
Your calendar events and TODOs (if you are an org user) can be viewed in either org-agenda
or the dedicated calendar view provided by calfw
. Calfw has daily, weekly and monthly calendar views and lets the user to easily create new events from the view itself.
To use google-calendar layer.
git clone https://github.com/mhkc/google-calendar-layer ~/.emacs.d/private/google-calendar
- add it to your
~/.spacemacs
. You will need to addgoogle-calendar
to the existingdotspacemacs-configuration-layers
list in this file.
To use sync your Google calendar with org-gcal you need Auth credentials from Google Developers Console.
- Go to Google Developers Console
- Create a project (with any name)
- Go to Google Calendar API and enable the API
- Click on Credentials and create a new “OAuth client ID”.
- You will need to create a “Consent screen” that will be shown when you allow org-gcal to access your data.
- After the screen is created select the Application type “Other”.
- Click on Create Client ID
- Save the Client ID and Client secret for later.
- Go to the calendar setting of your Google Caldendar by clicking on the cogwheel icon in the top right corner.
- Click on the “Calendar” that, which will display a list of your calendars.
- Select the calendar you want to synchronize with. Save the Calendar-ID which is located in the section called Calendar address, following the ICAL and HTML buttons.
Set the following variables with your Client ID and Secret.
(setq org-gcal-client-id "YourClientId"
org-gcal-client-secret "YourSecret")
You need to specify which calendar is going to be synchronized to which file. The variable org-gcal-file-alist
expect a list where each element is an associated list containing a Calendar-ID and which file to synchronize to, see example. If you want to synchronize multiple calendars its recommended to synchronize them with different files. This also enables the user to create events for a specific calendar. Currently org-gcal
do not support synchronization of multiple Google accounts.
(setq org-gcal-file-alist '(("[email protected]" . "/path/to/first_schedule_file.org")
("[email protected]" . "/path/to/second_schedule_file.org")))
You need to include the calendar event files in org-agenda
, do so by adding the paths to the files to the org-agenda-files
variable.
(setq org-agenda-files
(quote ("/path/to/first_schedule_file.org" "/path/to/second_schedule_file.org")))
You can create new calendar events from any Emacs buffer with org-capture
. This layer provides convenient accessory functions that automatically synchronize the new event to Google calendar, see below.
You can configure how the calfw calendar buffer should be displayed by altering the variable calfw-calendar-window-setup
. When you close the calendar view this layer tries to restore the previous window configuration, if you would like to disable this behavior set calfw-restore-windows-after-quit
to nil.
Calfw lets you customize the name of the months and days by altering the following arrays.
;; Month
(setq calendar-month-name-array
["January" "February" "March" "April" "May" "June"
"July" "August" "September" "October" "November" "December"])
;; Week days
(setq calendar-day-name-array
["Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday"])
You can also change which day the week begins with the following variable.
;; First day of the week
(setq calendar-week-start-day 1) ; 0:Sunday, 1:Monday
In Calfw calendar view you can capture TODOs or events. To do so you need to bind a org-capture template to the variable cfw:org-capture-template
. The following are an example template for creating a calendar event that works with the google-calendar/sync-cal-after-capture
function.
(setq cfw:org-capture-template '("s" "Scedule an event" entry
(file "/path/to/a/schedule/file.org")
"* %^{Description}\n%^{LOCATION}p\n%(cfw:org-capture-day)\n%?"))
Depending on your taste and OS you might want to set different notification styles. For macOS users osx-notifier
or growl
on older system might work the best.
Name | Summary |
---|---|
fringe | Changes the current frame’s fringe background color |
mode-line | Changes the current frame’s mode-line background color |
gntp | Uses gntp, it requires [gntp.el](https://github.com/tekai/gntp.el) |
growl | Uses Growl on OS X, if growlnotify is on the PATH |
ignore | Ignores the alert entirely |
libnotify | Uses libnotify if notify-send is on the PATH |
log | Logs the alert text to Alerts, with a timestamp |
message | Uses the Emacs `message` facility |
notifications | Uses notifications library via D-Bus |
notifier | Uses terminal-notifier on OS X, if it is on the PATH |
osx-notifier | Native OSX notification using AppleScript |
toaster | Use the toast notification system |
(setq alert-default-style 'libnotify)
There are many ways to use this layer in conjunction with org-agenda
, for instance you can capture tasks directly to the schedule org file for instance by using the template described above.
To automatically convert the newly to a calendar event you need to also add the following function to the org-capture-after-finalize-hook
. The function checks if the capture entry is put in one of the calendar org files, and if so creates an calendar event of the file.
(add-hook 'org-capture-after-finalize-hook 'google-calendar/sync-cal-after-capture)
For a calendar event to be considered valid by org-gcal
it needs.
- A header
- A non-interactive timestamp or time range.
Spacemacs leader key shortcuts.
Key Binding | Description |
---|---|
SPC a g f | Fetch new events |
SPC a g s | Sync calendar |
SPC a g r | Refresh OAuth token |
SPC a g c | Open calendar view |
Changing the calendar view.
Key Binding | Description |
---|---|
D | Day view |
W | Week view |
T | Two weeks view |
M | Month view |
Navigation in calendar view.
Key Binding | Description |
---|---|
l | Go right |
h | Go left |
k | Go up |
j | Go down |
n | Next week |
p | Previous week |
N | Next month |
P | Previous month |
t | Today |
g | Absolute date (YYYY/MM/DD) |
TAB | Next item in a day |
Actions you can perform in calendar view.
Key Binding | Description |
---|---|
c | Capture new event |
v | Pop-up detail agenda buffer |
r | Refresh buffer |
RET | Jump |
q | Quit calendar view |