diff options
author | William Carroll <wpcarro@gmail.com> | 2019-10-09T11·13+0100 |
---|---|---|
committer | William Carroll <wpcarro@gmail.com> | 2019-12-24T15·21+0000 |
commit | 6b456c1b7a4f6899f063a6e65355af51901d9c7a (patch) | |
tree | cfc70d74818ae9fabdbbfb0cf16cce092e4c1a09 /configs/shared/.config | |
parent | a7c72adb2ebec1e497fc040eaf3551d564d61a5b (diff) |
Massive configuration overhaul
Currently paying the price of months of non-diligent git usage. Here's what has changed. - Theming support in Gvcci and wpgtk - Dropping support for i3 - Supporting EXWM - Many Elisp modules - Collapsed redundant directories in ./configs
Diffstat (limited to 'configs/shared/.config')
23 files changed, 2257 insertions, 0 deletions
diff --git a/configs/shared/.config/compton.conf b/configs/shared/.config/compton.conf new file mode 100644 index 000000000000..a6b5f637e60a --- /dev/null +++ b/configs/shared/.config/compton.conf @@ -0,0 +1,33 @@ +# shadow +shadow = false; +shadow-radius = 7; +shadow-offset-x = -7; +shadow-offset-y = -7; + +# TODO: Remove active opacity + +# opacity +menu-opacity = 0.8; +inactive-opacity = 0.96; +active-opacity = 0.96; + +# transitions +fading = true; +fade-in-step = 0.07; +fade-out-step = 0.07; + +# lock screen +# NOTE: Need this rule here because I set XSECURELOCK_NO_COMPOSITE=1 in +# ~/.profile. Without this, the lock screen will adopt the opacity settings +# above, which is a security risk if you lock your screen while it has sensitive +# content on it. +# +# NOTE: For some reason, `100:class_g` doesn't work, so settling for +# `99:class_g` instead. +opacity-rule = [ + "99:class_g = 'xsecurelock'", + # TODO: Ensure this works. + "80:class_g = 'terminator'", + # TODO: Ensure this work. + "80:class_g = 'Google Emacs'" +]; diff --git a/configs/shared/.config/i3/config b/configs/shared/.config/i3/config new file mode 100644 index 000000000000..e52bf23b3d96 --- /dev/null +++ b/configs/shared/.config/i3/config @@ -0,0 +1,329 @@ +# Keymapping philosophy: +# When I feel it's appropriate, I try to borrow existing KBDs from OSX or +# Windows. For example, I use Ctrl+Alt+Del to start the screen lock, since this +# is a really well-known KBD. One notable difference is that when I'm borrowing +# OSX KBDs, I prefer using Alt instead of Super since the keyboard that I'm +# using has the Alt key in the same location as the Super key on my mac +# keyboard. I could rebind this, and I just may. But for now, that's worth +# pointing out. +# The reason behind borrowing from Windows and OSX is that some of these +# keybindings are hardwired into my muscle memory. I also tend to work between +# Linux and OSX quite often. Since OSX is much more difficult to remap KBDs +# than it is in Linux, I prefer to support the OSX KBDs to reduce the number of +# KBDs my feeble memory needs to store. + +set $mod Mod1 +set $window Mod1+Ctrl +set $super Mod4 +set $terminal terminator +set $browser google-chrome + +# Font for window titles. Will also be used by the bar unless a different font +# is used in the bar block below. +font pango:Monospace 10px + +# Use Mouse+$mod to drag floating windows to their wanted position +floating_modifier $mod + +# i3-gaps (depends on i3-gaps installation) +# gaps inner 7 +# gaps outer 0 +# smart_gaps on +# +# bindsym $mod+Ctrl+plus gaps outer current plus 5 +# bindsym $mod+Ctrl+minus gaps outer current minus 5 +# bindsym $mod+Shift+plus gaps inner current plus 5 +# bindsym $mod+Shift+minus gaps inner current minus 5 + +# Support XF86 keys for audio playback and volume control +bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle +bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% +bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% +bindsym XF86AudioPrev exec --no-startup-id playerctl previous +bindsym XF86AudioNext exec --no-startup-id playerctl next +bindsym XF86AudioStop exec --no-startup-id playerctl play-pause +bindsym XF86AudioPlay exec --no-startup-id playerctl play-pause + +# KBD Principles: +# $mod+Ctrl+<app_char> = starting an application +# where <app_char> is a reserved character for a commonly used application. +# +# <app_char> definitions: +# terminal = t, Return +# emacs = e +# chrome = c +# spotify = s +# intellij = i +bindsym $mod+Ctrl+t exec $terminal +bindsym $mod+Return exec $terminal +bindsym $mod+Ctrl+e exec emacsclient --create-frame +bindsym $mod+Ctrl+c exec $browser +bindsym $mod+Ctrl+s exec spotify +bindsym $mod+Ctrl+i exec zsh -i -c intellij + +# support dmenu-based bookmarks +# bindsym $mod+Ctrl+b exec rofi -dmenu <$DOTFILES/bookmarks.txt | xargs $browser + +set $bookmarks_mode Bookmarks (a) add, (d) delete, (b) browse +mode "$bookmarks_mode" { + bindsym a exec zsh -i -c add_bookmark, mode "default" + bindsym d exec zsh -i -c rm_bookmark, mode "default" + bindsym b exec zsh -i -c open_bookmark, mode "default" + + bindsym Escape mode "default" + bindsym Ctrl+g mode "default" + bindsym Ctrl+c mode "default" +} +bindsym $mod+Ctrl+b mode "$bookmarks_mode" + +# pass integration +bindsym $mod+Ctrl+backslash exec ~/.config/i3/passmenu # mirroring the 1password KBD + +# integrate with Emacs's org-mode +bindsym $mod+o exec zsh -i -c org_capture +# TODO: Support "coding size", "dialog-size" (for org_capture) +# TODO: Support way to cycle through predefined sizes. +for_window [class="GoogleEmacs" instance="floating"] floating enable, resize set height 1200px, resize set width 780px + +# Here is a sketch of the cycle sizes idea. +# TODO: Support this. +# mode "cycle_sizes_floating_mode" { +# # coding mode +# bindsym a for_window [mode="floating", class="actively-selected"] resize set height 1200px, resize set width 780px +# bindsym b for_window [mode="floating", class="actively-selected"] resize set height 500px, resize set width 500px +# +# bindsym Escape mode "default" +# bindsym Ctrl+g mode "default" +# bindsym Ctrl+c mode "default" +# } + +# ensure Spotify windows float +for_window [class="Spotify"] floating enable + +# ensure system service that run through XDG start +exec --no-startup-id dex -ae i3 + +# rofi configuration +bindsym $mod+space exec --no-startup-id rofi -show combi +bindsym $mod+t exec --no-startup-id ~/.config/i3/dmenu_timer.sh ~/.local/share/sounds/gong.mp3 + +# switch workspaces +bindsym $mod+Tab workspace next +bindsym $mod+Shift+Tab workspace prev + +# file manager +bindsym $mod+n exec $terminal -x lf ~/Dropbox + +# clipboard manager +# NOTE: Ctrl-c is already covered since `clipmenu` listens for X clipboard +# events using `clipnotify`. +# NOTE: `clipmenud` is started in `.xsessionrc.shared` +# NOTE: This is a bit of a hack intended to support pasting in both the terminal +# and in GUI applications. `st` expects `ctrl+Shift+v` while GUIs expect +# `ctrl+v`. In the instances where GUIs don't support `ctrl+Shift+v` already, it +# acts like `ctrl+v`, so it should "just work". +bindsym Ctrl+$mod+v exec clipmenu && xdotool key --clearmodifiers ctrl+Shift+v + +# Screenshot +# TODO: Support variants: (a) App (r) Region (f) Fullscreen. +# TODO: Support hosting to third-party image hosting. +set $screenshot_mode Screenshot (g) googleplex (l) local +mode "$screenshot_mode" { + bindsym g exec zsh -i -c snipit, mode "default" + bindsym l exec zsh -i -c screenshot, mode "default" + + bindsym Escape mode "default" + bindsym Ctrl+g mode "default" + bindsym Ctrl+c mode "default" +} +bindsym $mod+s mode "$screenshot_mode" + +# online documentation +bindsym $mod+Shift+slash exec $browser https://i3wm.org/docs/userguide.html + +# no title bars +for_window [class="^.*"] border pixel 1 + +# disable mouse hover focus +focus_follows_mouse no + +# kill focused window +bindsym $window+q kill + +# Toggle focus +bindsym $window+f floating toggle + +# GTK Themes +exec --no-startup-id gnome-settings-daemon + +# wireless selection mechanism +exec --no-startup-id nm-applet + +# set the split direction +bindsym $mod+v split vertical +# cannot bind $mod+h because of movement commands +bindsym $mod+Shift+v split horizontal + +# sound applet +exec --no-startup-id gnome-sound-applet + +# change focus +bindsym $window+h focus left +bindsym $window+j focus down +bindsym $window+k focus up +bindsym $window+l focus right + +# move focused window +bindsym $mod+Shift+h move left 100 +bindsym $mod+Shift+j move down 100 +bindsym $mod+Shift+k move up 100 +bindsym $mod+Shift+l move right 100 + +# enter fullscreen mode for the focused container +bindsym $window+z fullscreen toggle + +# change container layout (stacked, tabbed, toggle split) +bindsym $super+e layout toggle split +bindsym $super+s layout stacking +bindsym $super+t layout tabbed + +# toggle tiling / floating +bindsym $mod+Shift+f floating toggle + +# toggle stickiness +bindsym $mod+Shift+s sticky toggle + +# focus the parent container +# bindsym $mod+a focus parent +bindsym $mod+Shift+a focus child + +# Define names for default workspaces for which we configure key bindings later on. +# We use variables to avoid repeating the names in multiple places. +set $ws1 "1" +set $ws2 "2" +set $ws3 "3" +set $ws4 "4" +set $ws5 "5" +set $ws6 "6" +set $ws7 "7" +set $ws8 "8" +set $ws9 "9" +set $ws10 "10" + +# jump to workspace +bindsym $mod+1 workspace $ws1 +bindsym $mod+2 workspace $ws2 +bindsym $mod+3 workspace $ws3 +bindsym $mod+4 workspace $ws4 +bindsym $mod+5 workspace $ws5 +bindsym $mod+6 workspace $ws6 +bindsym $mod+7 workspace $ws7 +bindsym $mod+8 workspace $ws8 +bindsym $mod+9 workspace $ws9 +bindsym $mod+0 workspace $ws10 + +# edit configuration files +# TODO: Standardize KBDs for C,R,U,D operations. +# TODO: Move shell script to /usr/local/bin +# Create +# TODO: Choose another KBD. This is temporary. +bindsym $mod+a exec zsh -i -c add_config +# Read +bindsym $mod+c exec zsh -i -c edit_config +# Update +# TODO: Support operation to update_config label and path +# Delete +bindsym $mod+Shift+c exec zsh -i -c rm_config + +# move and follow focused container to workspace +bindsym $mod+Shift+1 move container to workspace $ws1; workspace $ws1 +bindsym $mod+Shift+2 move container to workspace $ws2; workspace $ws2 +bindsym $mod+Shift+3 move container to workspace $ws3; workspace $ws3 +bindsym $mod+Shift+4 move container to workspace $ws4; workspace $ws4 +bindsym $mod+Shift+5 move container to workspace $ws5; workspace $ws5 +bindsym $mod+Shift+6 move container to workspace $ws6; workspace $ws6 +bindsym $mod+Shift+7 move container to workspace $ws7; workspace $ws7 +bindsym $mod+Shift+8 move container to workspace $ws8; workspace $ws8 +bindsym $mod+Shift+9 move container to workspace $ws9; workspace $ws9 +bindsym $mod+Shift+0 move container to workspace $ws10; workspace $ws10 + +# move focused container to workspace +bindsym $mod+Ctrl+1 move container to workspace $ws1 +bindsym $mod+Ctrl+2 move container to workspace $ws2 +bindsym $mod+Ctrl+3 move container to workspace $ws3 +bindsym $mod+Ctrl+4 move container to workspace $ws4 +bindsym $mod+Ctrl+5 move container to workspace $ws5 +bindsym $mod+Ctrl+6 move container to workspace $ws6 +bindsym $mod+Ctrl+7 move container to workspace $ws7 +bindsym $mod+Ctrl+8 move container to workspace $ws8 +bindsym $mod+Ctrl+9 move container to workspace $ws9 +bindsym $mod+Ctrl+0 move container to workspace $ws10 + +# reload, restart i3 +bindsym $super+r exec cat ~/.config/i3/config.shared ~/.config/i3/config.device >~/.config/i3/config; reload +bindsym $super+Shift+r exec cat ~/.config/i3/config.shared ~/.config/i3/config.device >~/.config/i3/config; restart + +# logout dialog +set $mode_system System (l) lock, (e) logout, (s) suspend, (h) hibernate, (r) reboot, (Shift+s) shutdown +mode "$mode_system" { + bindsym l exec --no-startup-id xsecurelock, mode "default" + bindsym e exit, mode "default" + bindsym s exec --no-startup-id xsecurelock && systemctl suspend, mode "default" + bindsym h exec --no-startup-id xsecurelock && systemctl hibernate, mode "default" + bindsym r exec --no-startup-id systemctl reboot, mode "default" + bindsym Shift+s exec --no-startup-id systemctl poweroff, mode "default" + + # back to normal: Enter or Escape + bindsym Escape mode "default" + bindsym Ctrl+g mode "default" + bindsym Ctrl+c mode "default" +} +bindsym Ctrl+Mod1+Delete mode "$mode_system" + +# resize window (you can also use the mouse for that) +mode "resize" { + bindsym h resize shrink width 10 px or 10 ppt + bindsym j resize shrink height 10 px or 10 ppt + bindsym k resize grow height 10 px or 10 ppt + bindsym l resize grow width 10 px or 10 ppt + + bindsym Escape mode "default" + bindsym Ctrl+g mode "default" + bindsym Ctrl+c mode "default" +} +bindsym $mod+Shift+r mode "resize" + +# passthrough mode to support Emacs, Tmux, Vim KBDs for window and pane management +mode "passthrough" { + bindsym $mod+Escape mode "default" +} +bindsym $mod+Escape mode "passthrough" + +# class border backgr text indicator child_border +client.focused #83526a #83526a #8de0e1 #E8C35F #83526a +client.focused_inactive #83526a #83526a #8de0e1 #E8C35F #5a3849 +client.unfocused #5a3849 #5a3849 #8de0e1 #E8C35F #5a3849 +client.urgent #E8C35F #E8C35F #8de0e1 #E8C35F #E8C35F +client.placeholder #31213f #629c9d #8de0e1 #31213f #629c9d +client.background #31213f + +bar { + status_command i3status + font pango:Monospace 10px + position top + # disable system tray icons + tray_output none + colors { + background #31213f + statusline #83526a # text color in status line + separator #83526a + # class border text indicator + focused_workspace #83526a #8de0e1 #31213f + active_workspace #83526a #5a3849 #83526a + inactive_workspace #5a3849 #83526a #5a3849 + urgent_workspace #5a3849 #83526a #5a3849 + } +} + +# wpg integration +exec --no-startup-id ~/.config/wpg/wp_init.sh \ No newline at end of file diff --git a/configs/shared/.config/i3/config.bak b/configs/shared/.config/i3/config.bak new file mode 100644 index 000000000000..ccfae1d453b8 --- /dev/null +++ b/configs/shared/.config/i3/config.bak @@ -0,0 +1,330 @@ +# Keymapping philosophy: +# When I feel it's appropriate, I try to borrow existing KBDs from OSX or +# Windows. For example, I use Ctrl+Alt+Del to start the screen lock, since this +# is a really well-known KBD. One notable difference is that when I'm borrowing +# OSX KBDs, I prefer using Alt instead of Super since the keyboard that I'm +# using has the Alt key in the same location as the Super key on my mac +# keyboard. I could rebind this, and I just may. But for now, that's worth +# pointing out. +# The reason behind borrowing from Windows and OSX is that some of these +# keybindings are hardwired into my muscle memory. I also tend to work between +# Linux and OSX quite often. Since OSX is much more difficult to remap KBDs +# than it is in Linux, I prefer to support the OSX KBDs to reduce the number of +# KBDs my feeble memory needs to store. + +set $mod Mod1 +set $window Mod1+Ctrl +set $super Mod4 +# TODO: Support alacritty or another fast terminal. +set $terminal terminator +set $browser google-chrome + +# Font for window titles. Will also be used by the bar unless a different font +# is used in the bar block below. +font pango:Monospace 10px + +# Use Mouse+$mod to drag floating windows to their wanted position +floating_modifier $mod + +# i3-gaps (depends on i3-gaps installation) +# gaps inner 7 +# gaps outer 0 +# smart_gaps on +# +# bindsym $mod+Ctrl+plus gaps outer current plus 5 +# bindsym $mod+Ctrl+minus gaps outer current minus 5 +# bindsym $mod+Shift+plus gaps inner current plus 5 +# bindsym $mod+Shift+minus gaps inner current minus 5 + +# Support XF86 keys for audio playback and volume control +bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle +bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% +bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% +bindsym XF86AudioPrev exec --no-startup-id playerctl previous +bindsym XF86AudioNext exec --no-startup-id playerctl next +bindsym XF86AudioStop exec --no-startup-id playerctl play-pause +bindsym XF86AudioPlay exec --no-startup-id playerctl play-pause + +# KBD Principles: +# $mod+Ctrl+<app_char> = starting an application +# where <app_char> is a reserved character for a commonly used application. +# +# <app_char> definitions: +# terminal = t, Return +# emacs = e +# chrome = c +# spotify = s +# intellij = i +bindsym $mod+Ctrl+t exec $terminal +bindsym $mod+Return exec $terminal +bindsym $mod+Ctrl+e exec emacsclient --create-frame +bindsym $mod+Ctrl+c exec $browser +bindsym $mod+Ctrl+s exec spotify +bindsym $mod+Ctrl+i exec zsh -i -c intellij + +# support dmenu-based bookmarks +# bindsym $mod+Ctrl+b exec rofi -dmenu <$DOTFILES/bookmarks.txt | xargs $browser + +set $bookmarks_mode Bookmarks (a) add, (d) delete, (b) browse +mode "$bookmarks_mode" { + bindsym a exec zsh -i -c add_bookmark, mode "default" + bindsym d exec zsh -i -c rm_bookmark, mode "default" + bindsym b exec zsh -i -c open_bookmark, mode "default" + + bindsym Escape mode "default" + bindsym Ctrl+g mode "default" + bindsym Ctrl+c mode "default" +} +bindsym $mod+Ctrl+b mode "$bookmarks_mode" + +# pass integration +bindsym $mod+Ctrl+backslash exec ~/.config/i3/passmenu # mirroring the 1password KBD + +# integrate with Emacs's org-mode +bindsym $mod+o exec zsh -i -c org_capture +# TODO: Support "coding size", "dialog-size" (for org_capture) +# TODO: Support way to cycle through predefined sizes. +for_window [class="GoogleEmacs" instance="floating"] floating enable, resize set height 1200px, resize set width 780px + +# Here is a sketch of the cycle sizes idea. +# TODO: Support this. +# mode "cycle_sizes_floating_mode" { +# # coding mode +# bindsym a for_window [mode="floating", class="actively-selected"] resize set height 1200px, resize set width 780px +# bindsym b for_window [mode="floating", class="actively-selected"] resize set height 500px, resize set width 500px +# +# bindsym Escape mode "default" +# bindsym Ctrl+g mode "default" +# bindsym Ctrl+c mode "default" +# } + +# ensure Spotify windows float +for_window [class="Spotify"] floating enable + +# ensure system service that run through XDG start +exec --no-startup-id dex -ae i3 + +# rofi configuration +bindsym $mod+space exec --no-startup-id rofi -show combi +bindsym $mod+t exec --no-startup-id ~/.config/i3/dmenu_timer.sh ~/.local/share/sounds/gong.mp3 + +# switch workspaces +bindsym $mod+Tab workspace next +bindsym $mod+Shift+Tab workspace prev + +# file manager +bindsym $mod+n exec $terminal -x lf ~/Dropbox + +# clipboard manager +# NOTE: Ctrl-c is already covered since `clipmenu` listens for X clipboard +# events using `clipnotify`. +# NOTE: `clipmenud` is started in `.xsessionrc.shared` +# NOTE: This is a bit of a hack intended to support pasting in both the terminal +# and in GUI applications. `st` expects `ctrl+Shift+v` while GUIs expect +# `ctrl+v`. In the instances where GUIs don't support `ctrl+Shift+v` already, it +# acts like `ctrl+v`, so it should "just work". +bindsym Ctrl+$mod+v exec clipmenu && xdotool key --clearmodifiers ctrl+Shift+v + +# Screenshot +# TODO: Support variants: (a) App (r) Region (f) Fullscreen. +# TODO: Support hosting to third-party image hosting. +set $screenshot_mode Screenshot (g) googleplex (l) local +mode "$screenshot_mode" { + bindsym g exec zsh -i -c snipit, mode "default" + bindsym l exec zsh -i -c screenshot, mode "default" + + bindsym Escape mode "default" + bindsym Ctrl+g mode "default" + bindsym Ctrl+c mode "default" +} +bindsym $mod+s mode "$screenshot_mode" + +# online documentation +bindsym $mod+Shift+slash exec $browser https://i3wm.org/docs/userguide.html + +# no title bars +for_window [class="^.*"] border pixel 1 + +# disable mouse hover focus +focus_follows_mouse no + +# kill focused window +bindsym $window+q kill + +# Toggle focus +bindsym $window+f floating toggle + +# GTK Themes +exec --no-startup-id gnome-settings-daemon + +# wireless selection mechanism +exec --no-startup-id nm-applet + +# set the split direction +bindsym $mod+v split vertical +# cannot bind $mod+h because of movement commands +bindsym $mod+Shift+v split horizontal + +# sound applet +exec --no-startup-id gnome-sound-applet + +# change focus +bindsym $window+h focus left +bindsym $window+j focus down +bindsym $window+k focus up +bindsym $window+l focus right + +# move focused window +bindsym $mod+Shift+h move left 100 +bindsym $mod+Shift+j move down 100 +bindsym $mod+Shift+k move up 100 +bindsym $mod+Shift+l move right 100 + +# enter fullscreen mode for the focused container +bindsym $window+z fullscreen toggle + +# change container layout (stacked, tabbed, toggle split) +bindsym $super+e layout toggle split +bindsym $super+s layout stacking +bindsym $super+t layout tabbed + +# toggle tiling / floating +bindsym $mod+Shift+f floating toggle + +# toggle stickiness +bindsym $mod+Shift+s sticky toggle + +# focus the parent container +# bindsym $mod+a focus parent +bindsym $mod+Shift+a focus child + +# Define names for default workspaces for which we configure key bindings later on. +# We use variables to avoid repeating the names in multiple places. +set $ws1 "1" +set $ws2 "2" +set $ws3 "3" +set $ws4 "4" +set $ws5 "5" +set $ws6 "6" +set $ws7 "7" +set $ws8 "8" +set $ws9 "9" +set $ws10 "10" + +# jump to workspace +bindsym $mod+1 workspace $ws1 +bindsym $mod+2 workspace $ws2 +bindsym $mod+3 workspace $ws3 +bindsym $mod+4 workspace $ws4 +bindsym $mod+5 workspace $ws5 +bindsym $mod+6 workspace $ws6 +bindsym $mod+7 workspace $ws7 +bindsym $mod+8 workspace $ws8 +bindsym $mod+9 workspace $ws9 +bindsym $mod+0 workspace $ws10 + +# edit configuration files +# TODO: Standardize KBDs for C,R,U,D operations. +# TODO: Move shell script to /usr/local/bin +# Create +# TODO: Choose another KBD. This is temporary. +bindsym $mod+a exec zsh -i -c add_config +# Read +bindsym $mod+c exec zsh -i -c edit_config +# Update +# TODO: Support operation to update_config label and path +# Delete +bindsym $mod+Shift+c exec zsh -i -c rm_config + +# move and follow focused container to workspace +bindsym $mod+Shift+1 move container to workspace $ws1; workspace $ws1 +bindsym $mod+Shift+2 move container to workspace $ws2; workspace $ws2 +bindsym $mod+Shift+3 move container to workspace $ws3; workspace $ws3 +bindsym $mod+Shift+4 move container to workspace $ws4; workspace $ws4 +bindsym $mod+Shift+5 move container to workspace $ws5; workspace $ws5 +bindsym $mod+Shift+6 move container to workspace $ws6; workspace $ws6 +bindsym $mod+Shift+7 move container to workspace $ws7; workspace $ws7 +bindsym $mod+Shift+8 move container to workspace $ws8; workspace $ws8 +bindsym $mod+Shift+9 move container to workspace $ws9; workspace $ws9 +bindsym $mod+Shift+0 move container to workspace $ws10; workspace $ws10 + +# move focused container to workspace +bindsym $mod+Ctrl+1 move container to workspace $ws1 +bindsym $mod+Ctrl+2 move container to workspace $ws2 +bindsym $mod+Ctrl+3 move container to workspace $ws3 +bindsym $mod+Ctrl+4 move container to workspace $ws4 +bindsym $mod+Ctrl+5 move container to workspace $ws5 +bindsym $mod+Ctrl+6 move container to workspace $ws6 +bindsym $mod+Ctrl+7 move container to workspace $ws7 +bindsym $mod+Ctrl+8 move container to workspace $ws8 +bindsym $mod+Ctrl+9 move container to workspace $ws9 +bindsym $mod+Ctrl+0 move container to workspace $ws10 + +# reload, restart i3 +bindsym $super+r exec cat ~/.config/i3/config.shared ~/.config/i3/config.device >~/.config/i3/config; reload +bindsym $super+Shift+r exec cat ~/.config/i3/config.shared ~/.config/i3/config.device >~/.config/i3/config; restart + +# logout dialog +set $mode_system System (l) lock, (e) logout, (s) suspend, (h) hibernate, (r) reboot, (Shift+s) shutdown +mode "$mode_system" { + bindsym l exec --no-startup-id xsecurelock, mode "default" + bindsym e exit, mode "default" + bindsym s exec --no-startup-id xsecurelock && systemctl suspend, mode "default" + bindsym h exec --no-startup-id xsecurelock && systemctl hibernate, mode "default" + bindsym r exec --no-startup-id systemctl reboot, mode "default" + bindsym Shift+s exec --no-startup-id systemctl poweroff, mode "default" + + # back to normal: Enter or Escape + bindsym Escape mode "default" + bindsym Ctrl+g mode "default" + bindsym Ctrl+c mode "default" +} +bindsym Ctrl+Mod1+Delete mode "$mode_system" + +# resize window (you can also use the mouse for that) +mode "resize" { + bindsym h resize shrink width 10 px or 10 ppt + bindsym j resize shrink height 10 px or 10 ppt + bindsym k resize grow height 10 px or 10 ppt + bindsym l resize grow width 10 px or 10 ppt + + bindsym Escape mode "default" + bindsym Ctrl+g mode "default" + bindsym Ctrl+c mode "default" +} +bindsym $mod+Shift+r mode "resize" + +# passthrough mode to support Emacs, Tmux, Vim KBDs for window and pane management +mode "passthrough" { + bindsym $mod+Escape mode "default" +} +bindsym $mod+Escape mode "passthrough" + +# class border backgr text indicator child_border +# client.focused {active} {active} {color15} {color2} {active} +# client.focused_inactive {active} {active} {color15} {color2} {inactive} +# client.unfocused {inactive} {inactive} {color15} {color2} {inactive} +# client.urgent {color2} {color2} {color15} {color2} {color2} +# client.placeholder {color0} {color8} {color15} {color0} {color8} +# client.background {color0} + +bar { + status_command i3status + font pango:Monospace 10px + position top + # disable system tray icons + tray_output none + colors { + # background {color0} + # statusline {inactive} + # separator {active} + # class border text indicator + # focused_workspace {active} {color15} {color0} + # active_workspace {active} {inactive} {active} + # inactive_workspace {inactive} {active} {inactive} + # urgent_workspace {inactive} {active} {inactive} + } +} + +# wpg integration +exec --no-startup-id ~/.config/wpg/wp_init.sh \ No newline at end of file diff --git a/configs/shared/.config/i3/dmenu_timer.sh b/configs/shared/.config/i3/dmenu_timer.sh new file mode 100755 index 000000000000..9d62ead73091 --- /dev/null +++ b/configs/shared/.config/i3/dmenu_timer.sh @@ -0,0 +1,113 @@ +#!/usr/bin/env bash + +# Select common timer intervals with dmenu and play an alarm sound when +# finished. Useful if you bind a KBD in a window manager such as i3. Pass the +# path to the alarm mp3 as the only argument. +# +# Usage: ./dmenu_timer.sh path/to/alarm.mp3 + +times=$(cat <<EOF +1 minute +2 minutes +3 minutes +4 minutes +5 minutes +10 minutes +15 minutes +20 minutes +30 minutes +45 minutes +1 hour +2 hours +EOF +) +selection=$(echo "$times" | dmenu) + +case $selection in + '1 minute') + notify-send 'Timer' 'Set for 1 minute' && \ + sleep 1m && \ + notify-send 'Timer' 'Finished.' && \ + mpg123 $1 && \ + exit 0 + ;; + '2 minutes') + notify-send 'Timer' 'Set for 2 minute' && \ + sleep 2m && \ + notify-send 'Timer' 'Finished.' && \ + mpg123 $1 && \ + exit 0 + ;; + '3 minutes') + notify-send 'Timer' 'Set for 3 minutes' && \ + sleep 3m && \ + notify-send 'Timer' 'Finished.' && \ + mpg123 $1 && \ + exit 0 + ;; + '4 minutes') + notify-send 'Timer' 'Set for 4 minutes' && \ + sleep 4m && \ + notify-send 'Timer' 'Finished.' && \ + mpg123 $1 && \ + exit 0 + ;; + '5 minutes') + notify-send 'Timer' 'Set for 5 minutes' && \ + sleep 5m && \ + notify-send 'Timer' 'Finished.' && \ + mpg123 $1 && \ + exit 0 + ;; + '10 minutes') + notify-send 'Timer' 'Set for 10 minutes' && \ + sleep 10m && \ + notify-send 'Timer' 'Finished.' && \ + mpg123 $1 && \ + exit 0 + ;; + '15 minutes') + notify-send 'Timer' 'Set for 15 minutes' && \ + sleep 15m && \ + notify-send 'Timer' 'Finished.' && \ + mpg123 $1 && \ + exit 0 + ;; + '20 minutes') + notify-send 'Timer' 'Set for 20 minutes' && \ + sleep 20m && \ + notify-send 'Timer' 'Finished.' && \ + mpg123 $1 && \ + exit 0 + ;; + '30 minutes') + notify-send 'Timer' 'Set for 30 minutes' && \ + sleep 30m && \ + notify-send 'Timer' 'Finished.' && \ + mpg123 $1 && \ + exit 0 + ;; + '45 minutes') + notify-send 'Timer' 'Set for 45 minutes' && \ + sleep 45m && \ + notify-send 'Timer' 'Finished.' && \ + mpg123 $1 && \ + exit 0 + ;; + '1 hour') + notify-send 'Timer' 'Set for 1 hour' && \ + sleep 1h && \ + notify-send 'Timer' 'Finished.' && \ + mpg123 $1 && \ + exit 0 + ;; + '2 hours') + notify-send 'Timer' 'Set for 2 hours' && \ + sleep 2h && \ + notify-send 'Timer' 'Finished.' && \ + mpg123 $1 && \ + exit 0 + ;; + *) + notify-send 'Timer' 'No supported time selected. Exiting...' && exit 1 +esac diff --git a/configs/shared/.config/i3/passmenu b/configs/shared/.config/i3/passmenu new file mode 100755 index 000000000000..71c4538fa61a --- /dev/null +++ b/configs/shared/.config/i3/passmenu @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +shopt -s nullglob globstar + +typeit=0 +if [[ $1 == "--type" ]]; then + typeit=1 + shift +fi + +prefix=${PASSWORD_STORE_DIR-~/.password-store} +password_files=( "$prefix"/**/*.gpg ) +password_files=( "${password_files[@]#"$prefix"/}" ) +password_files=( "${password_files[@]%.gpg}" ) + +password=$(printf '%s\n' "${password_files[@]}" | dmenu "$@") + +[[ -n $password ]] || exit + +if [[ $typeit -eq 0 ]]; then + pass show -c "$password" 2>/dev/null +else + pass show "$password" | { IFS= read -r pass; printf %s "$pass"; } | + xdotool type --clearmodifiers --file - +fi \ No newline at end of file diff --git a/configs/shared/.config/i3/workspace_1.json b/configs/shared/.config/i3/workspace_1.json new file mode 100644 index 000000000000..b5d3f9d8c53f --- /dev/null +++ b/configs/shared/.config/i3/workspace_1.json @@ -0,0 +1,76 @@ +// vim:ts=4:sw=4:et +{ + // splitv split container with 2 children + "border": "normal", + "floating": "auto_off", + "layout": "splitv", + "percent": 0.5, + "type": "con", + "nodes": [ + { + "border": "pixel", + "current_border_width": 3, + "floating": "auto_off", + "geometry": { + "height": 925, + "width": 1072, + "x": 0, + "y": 0 + }, + "name": "emacs@wpcarro.lon.corp.google.com", + "percent": 0.5, + "swallows": [ + { + "class": "^GoogleEmacs$", + "instance": "^emacs$", + "title": "^google-emacs$" + } + ], + "type": "con" + }, + { + "border": "pixel", + "current_border_width": 3, + "floating": "auto_off", + "geometry": { + "height": 484, + "width": 724, + "x": 0, + "y": 0 + }, + "name": "i3-save-tree", + "percent": 0.5, + "swallows": [ + { + "class": "^st\\-256color$", + "instance": "^st\\-256color$", + "title": "^st-term$" + } + ], + "type": "con" + } + ] +} + +{ + "border": "pixel", + "current_border_width": 3, + "floating": "auto_off", + "geometry": { + "height": 2125, + "width": 1914, + "x": 1923, + "y": 32 + }, + "name": "i3: Layout saving in i3 - Google Chrome", + "percent": 0.5, + "swallows": [ + { + "class": "^Google\\-chrome$", + "instance": "^google\\-chrome$", + "title": "Chrome", + "window_role": "^browser$" + } + ], + "type": "con" +} diff --git a/configs/shared/.config/i3status/config b/configs/shared/.config/i3status/config new file mode 100644 index 000000000000..d276046d9720 --- /dev/null +++ b/configs/shared/.config/i3status/config @@ -0,0 +1,58 @@ +general { + markup = pango + separator = " " + colors = true +} + +/* order += "battery 0" # TODO: remove this if "battery 1" works for Dell */ +order += "battery 1" # trying to support two different laptops +order += "tztime local" +order += "tztime lon" +order += "tztime est" +order += "tztime pst" +order += "disk /" + +disk "/" { + prefix_type = "decimal" + format = "%used/%total" +} + +# Useful commands for dealing with timezones: +# - cat /etc/timezone +# - man date +# - timedatectl +tztime local { + format = "%d/%m/%Y" +} + +tztime lon { + format = "LON %H:%M" + timezone = "Europe/London" +} + +tztime est { + format = "NYC %H:%M" + timezone = "US/Eastern" +} + +tztime pst { + format = "MTV %H:%M" + timezone = "US/Pacific" +} + +# TODO: remove this if "battery 1" works for Dell laptop +/* battery 0 { */ +/* format = "Battery %percentage" */ +/* format_down = "" # This hides the battery when there isn't any (e.g. on a Desktop) */ +/* low_threshold = 30 */ +/* threshold_type = time */ +/* integer_battery_capacity = true */ +/* } */ + +battery 1 { + format = "Battery %percentage" + format_down = "" # This hides the battery when there isn't any (e.g. on a Desktop) + low_threshold = 30 + threshold_type = time + integer_battery_capacity = true +} diff --git a/configs/shared/.config/lf/lfrc b/configs/shared/.config/lf/lfrc new file mode 100644 index 000000000000..f6045d2973c7 --- /dev/null +++ b/configs/shared/.config/lf/lfrc @@ -0,0 +1,163 @@ +# It might be possible to attempt to share KBDs between `lf` and `dired`. +# Currently shared KBDs with `dired`: +# - D: delete file +# - R: rename file +# - +: create directory +# - c: create file +# +# The following command prefixes are used by lf (taken from the docs): +# +# : read (default) builtin/custom command +# $ shell shell command +# % shell-pipe shell command running with the ui +# ! shell-wait shell command waiting for key press +# & shell-async shell command running asynchronously +# / search search file in current directory +# ? search-back search file in the reverse order +# +# `x` will be used as a generic prefix KBD for most of my user-defined KBDs. Do +# not map anything to just `x`. Instead prefer `x<char>`. Mneumonically, "x" is +# intended to resemble "eXecute". +# +# If `x<char>` does one thing; `x<uppercase-char>` should do the opposite when +# possible. This is convenient for things that pass the round-trip test like +# encrypt/decrypt, archive/unarchive. + +# TODO: move most of these commands to function.zsh and call those functions +# herein. Especially the `archive` and `extract` functions. +# +# TODO: consider integrations with `xdg-open` and configuring filetypes to +# behave in expected "dwim" ways. +# +# TODO: learn more about the terms "archive", "compress", "decompress", +# "expand", "extract", etc. See if a larger abstraction can be created on top +# without sacrificing too much nuance. This might be the case of "serialize", +# "deserialize", "pickle", "unpickle", "marshal", "unmarshal", "encode", +# "decode" -- in which case, a broader abstraction would be nice to decrease the +# surface area of the vocabulary. +# +# TODO: find a way to visualize all of the bound or unbound KBDs. +# +# TODO: support polymorphic way encrypt/decrypt a file or directory. +# +# TODO: support "toggle" for encryption/decryption that detects which function +# to run based on the extension. +# +# TODO: support "toggle" for archive/unarchive that detects which function to +# run based on the extension. + +# Basic configuration +set hidden on +set info size:time +set sortby time +set period 1 # auto-refreshes the view + +# Arguably the most import function herein +cmd help $lf -doc | less + +# delete a file, dir +map D delete + +# reload the view +map r load + +# rename files +cmd rename %[ -e $1 ] && printf 'file exists' || mv $f $1 +map R push :rename<space> + +cmd mkdir %{{ + # mkdir and cd into that dir + mkdir -p "$1" +}} +map + push :mkdir<space> + +cmd touch %{{ + # Create a file + touch "$1" +}} +map c push :touch<space> # this interferes with `clear` command + +cmd encrypt %{{ + # depends on my shell function, encrypt + zsh -i -c "encrypt $f" +}} +map xe :encrypt + +cmd decrypt %{{ + # depends on my shell function, decrypt + zsh -i -c "decrypt $f" +}} +map xE :decrypt + +cmd archive %{{ + # Generic function for archiving directories. + # TODO: support selections of multiple files. + set -f + printf "Which type of archive would you like to create? (tar,tar.gz,zip) " + read answer + case $answer in + tar.gz) tar -czf "$f.tar.gz" "$(basename $f)"; rm -rf "$f";; + tar) tar -cf "$f.tar" "$(basename $f)"; rm -rf "$f";; + zip) zip -r "$f.zip" "$(basename $f)"; rm -rf "$f";; + *) printf "\"$1\" is not a support archive. Aborting..." + esac +}} +map xa :archive + +cmd unarchive %{{ + # Generic function for extracting archived directories. + # Assumes directories were archived with the `archive`. + set -f + case $f in + *.tar.gz) tar -xzvf $f; rm "$f";; + *.tar) tar -xvf $f; rm "$f";; + *.zip) unzip "$f"; rm "$f";; + # TODO: grab extension from $f and display it in `printf` call. + *) printf "Unsupported archive type. Aborting..." + esac +}} +map xA: unarchive + +cmd tar %{{ + # tars a directory + set -f + printf "gzip? (y,n) " + read answer + case $answer in + y) tar -czf "$f.tar.gz" "$(basename $f)"; rm -rf "$f";; + n) tar -cf "$f.tar" "$(basename $f)"; rm -rf "$f";; + *) printf "\"$answer\" is not a supported answer. Aborting...";; + esac +}} +map xt :tar + +cmd untar %{{ + # untars a directory tar'd with `tar`. + set -f + case $f in + *.tar.gz) tar -xzvf $f; rm "$f";; + *.tar) tar -xvf $f; rm "$f";; + esac +}} +map xT :untar + +cmd zip %{{ + # zip a directory + set -f + zip -r "$f.zip" "$(basename $f)" + rm -rf "$f" +}} +map xz :zip + +cmd unzip %{{ + # unzip a directory + set -f + unzip "$f" + rm "$f" +}} +map xZ :unzip + +# outputs the size of a particular file, dir +# TODO: consider mapping this to a KBD +cmd size %du -hs "$f" +map xs :size diff --git a/configs/shared/.config/lf/marks b/configs/shared/.config/lf/marks new file mode 100644 index 000000000000..aee01d1aa6c3 --- /dev/null +++ b/configs/shared/.config/lf/marks @@ -0,0 +1,7 @@ +':/usr/local/google/home/wpcarro/Dropbox/programming/i3-quickterm +D:~/Dropbox +G:/usr/local/google/home/wpcarro/Downloads +M:/usr/local/google/home/wpcarro/Downloads +c:~/Dropbox/dotfiles/configs +d:~/Dropbox/dotfiles +s:~/Pictures/screenshots diff --git a/configs/shared/.config/mpd/database b/configs/shared/.config/mpd/database new file mode 100644 index 000000000000..b39f769e68e0 --- /dev/null +++ b/configs/shared/.config/mpd/database Binary files differdiff --git a/configs/shared/.config/mpd/mpd.conf b/configs/shared/.config/mpd/mpd.conf new file mode 100644 index 000000000000..fbb3858f3d74 --- /dev/null +++ b/configs/shared/.config/mpd/mpd.conf @@ -0,0 +1,4 @@ +db_file "~/.config/mpd/database" +log_file "syslog" +# music_directory "~/.local/share/sounds" +auto_update "yes" \ No newline at end of file diff --git a/configs/shared/.config/nixpkgs/config.nix b/configs/shared/.config/nixpkgs/config.nix new file mode 100644 index 000000000000..1dd1750ae025 --- /dev/null +++ b/configs/shared/.config/nixpkgs/config.nix @@ -0,0 +1,3 @@ +{ + allowUnfree = true; +} diff --git a/configs/shared/.config/nvim/init.vim b/configs/shared/.config/nvim/init.vim new file mode 100644 index 000000000000..eb7dbf3b5313 --- /dev/null +++ b/configs/shared/.config/nvim/init.vim @@ -0,0 +1,669 @@ +" -- BEGIN: Vundle config -- +set nocompatible " be iMproved, required +filetype off " required + +" set the runtime path to include Vundle and initialize +" share Vundle between vim and neovim +set rtp+=~/.vim/bundle/Vundle.vim +set rtp+=~/.config/nvim/bundle/Vundle.vim +call vundle#begin() +" alternatively, pass a path where Vundle should install plugins +"call vundle#begin('~/some/path/here') + +" let Vundle manage Vundle, required +Plugin 'VundleVim/Vundle.vim' + +" Rust IDE features +Plugin 'racer-rust/vim-racer' + +set hidden +let g:racer_experimental_completer = 1 +autocmd FileType rust nmap gd <Plug>(rust-def) +autocmd FileType rust nmap gs <Plug>(rust-def-split) +autocmd FileType rust nmap gx <Plug>(rust-def-vertical) +autocmd FileType rust nmap <leader>gd <Plug>(rust-doc) + +Plugin 'xolox/vim-misc' + +" The following are examples of different formats supported. +" Keep Plugin commands between vundle#begin/end. + +" Displays git information in airline. +Plugin 'tpope/vim-fugitive' + +" easier file navigation +Plugin 'tpope/vim-vinegar' + +" Displays git-tracked C*UD ops within gutter. +Plugin 'airblade/vim-gitgutter' + +" Fuzzy-finder +Plugin 'kien/ctrlp.vim' + +" Grep file contents +Plugin 'mileszs/ack.vim' + +" Syntax and other light-weight suppor for a variety of languages +Plugin 'sheerun/vim-polyglot' + +" Themes +Plugin 'deviantfero/wpgtk.vim' +Plugin 'rainglow/vim' + + +" Executes shell commands and pipes output into new Vim buffer. +Plugin 'sjl/clam.vim' + +" Multiple cursors for simultaneous edits. +" NOTE: use <C-n> to run miltiple cursors not <C-d> +Plugin 'terryma/vim-multiple-cursors' + +" Visualize buffers +Plugin 'vim-airline/vim-airline' +Plugin 'vim-airline/vim-airline-themes' + +" Visually align assignments +Plugin 'godlygeek/tabular' + +" Visually Highlight and comment code. +Plugin 'tpope/vim-commentary' + +" Macros for quotes, parens, etc. +Plugin 'tpope/vim-surround' + +" Allows Plugins to be repeated with `.` character +Plugin 'tpope/vim-repeat' + +" Pairs of mappings +Plugin 'tpope/vim-unimpaired' + +" LISPs support +Plugin 'guns/vim-sexp' +Plugin 'tpope/vim-sexp-mappings-for-regular-people' +let g:sexp_enable_insert_mode_mappings = 0 +let g:sexp_filetypes = '' + +" Seamlessly navigate Vim and Tmux with similar bindings. +Plugin 'christoomey/vim-tmux-navigator' + +" Async `:make` for code linting etc. +Plugin 'neomake/neomake' + +" Better buffer mgt than CtrlP +Plugin 'yegappan/mru' + +Plugin 'zanglg/nova.vim' + +" Emulates Emacs's Helm Swoop search +Plugin 'pelodelfuego/vim-swoop' + +" Transparent encryption + decryption +Plugin 'jamessan/vim-gnupg' + +" Javascript auto-formatting +" Plugin 'prettier/vim-prettier', { +" \ 'do': 'yarn install', + " \ 'for': ['javascript', 'typescript', 'css', 'less', 'scss', 'json', 'graphql', 'markdown'] } + +" Support Org mode +Plugin 'jceb/vim-orgmode' + +" Autocompletion +Plugin 'junegunn/fzf' + +" Text objects made easy +Plugin 'kana/vim-textobj-user' + +" Elixir text objects +Plugin 'andyl/vim-textobj-elixir' + +" Making HTML editing faster +Plugin 'mattn/emmet-vim' + +" Snippets for all languages +Plugin 'honza/vim-snippets' + +" Automatic bracket insertion +Plugin 'jiangmiao/auto-pairs' + +" Linting & error warnings +Plugin 'vim-syntastic/syntastic' + +" Angular.js support +Plugin 'burnettk/vim-angular' + +" Asynchronous Linting Engine +Plugin 'w0rp/ale' + +call vundle#end() " required +filetype plugin indent on " required +" Put your non-Plugin stuff after this line +" -- END: Vundle config -- + +" Changes <leader> to <space> character. +let mapleader = " " + + +" Highlight column width +set textwidth=80 +set colorcolumn=+0 + +" autoreload a file when it changes on disk +set autoread + +" default to case-insensitive searching +set ignorecase + +" JSX configuration +let g:jsx_ext_required = 0 + + +autocmd FileType reason nnoremap <buffer> gd :call LanguageClient_textDocument_definition()<CR> +autocmd FileType reason nnoremap <buffer> gf :call LanguageClient_textDocument_formatting()<CR> +autocmd FileType reason nnoremap <buffer> gh :call LanguageClient_textDocument_hover()<CR> +autocmd FileType reason nnoremap <buffer> gr :call LanguageClient_textDocument_rename()<CR> + +" Replace <CR> with G for faster navigation +nnoremap <CR> G +onoremap <CR> G +vnoremap <CR> G + +" Mirror ZLE KBD +inoremap <M-'> :echo "Working"<CR> + +" Syntastic configuration +set statusline+=%#warningmsg# +set statusline+=%{SyntasticStatuslineFlag()} +set statusline+=%* + +let g:syntastic_always_populate_loc_list = 1 +let g:syntastic_auto_loc_list = 1 +let g:syntastic_check_on_open = 1 +let g:syntastic_check_on_wq = 0 +" let g:syntastic_javascript_checkers = ['eslint'] +let g:syntastic_javascript_eslint_generic = 1 +" this is a hack to prevent a false negative +" https://github.com/vim-syntastic/syntastic/issues/1692 +" let g:syntastic_javascript_eslint_exec = '/bin/ls' +" let g:syntastic_javascript_eslint_exe = 'npx eslint' +" let g:syntastic_javascript_eslint_args = '-f compact' + +" javascript autocompletion +" autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS +" autocmd FileType javascript nnoremap <buffer> gf :Prettier<CR> + +" Maximize the current window +" Similar to Tmux mapping alt-z in my tmux.conf +nnoremap t% :tab sp<CR> + +" Allow C-g to act like C-c the way it does in Emacs +cnoremap <C-g> <C-c> + +" Prettier configuration +" let g:prettier#exec_cmd_async = 1 +" force Prettier to run on files even without the @format pragma +" let g:prettier#autoformat = 0 + + +" Basic settings +" Thin cursor on INSERT mode +if has('nvim') + let $NVIM_TUI_ENABLE_CURSOR_SHAPE = 1 +endif + +set number +set nowrap +set tabstop=2 +set expandtab +set shiftwidth=2 +set background=dark + +syntax enable +colorscheme peacock + +" Vim in terminal cannot have a different font from the one set within your +" terminal. However, this setting will set the font for the GUI version. +if has('gui_running') + set guifont=Operator\ Mono:h12 +endif + +if has('termguicolors') + set termguicolors +endif + +if &term =~# '^screen' + let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum" + let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum" +endif + +set history=1000 +set undolevels=1000 + +set t_Co=255 + +" Support italics +highlight Comment cterm=italic + + +" quickly edit popular configuration files +nnoremap <leader>ev :vsplit $MYVIMRC<CR> +nnoremap <leader>ee :vsplit ~/.emacs.d/init.el<CR> +nnoremap <leader>ez :vsplit ~/.zshrc<CR> +nnoremap <leader>ea :vsplit ~/aliases.zsh<CR> +nnoremap <leader>ef :vsplit ~/functions.zsh<CR> +nnoremap <leader>el :vsplit ~/variables.zsh<CR> +nnoremap <leader>ex :vsplit ~/.Xresources<CR> +nnoremap <leader>ei :vsplit ~/.config/i3/config.shared<CR> + +" quickly source your vimrc +nnoremap <leader>sv :source $MYVIMRC<CR> + +" quickly edit your snippets +nnoremap <leader>es :vsplit<CR>:edit ~/.vim/bundle/vim-snippets/snippets/reason.snippets<CR> + + +" Auto resize window splits +autocmd VimResized * wincmd = + + +" Neomake Settings +autocmd! BufWritePost * Neomake + +" Elixir linting +let g:neomake_elixir_credo_maker = { + \ 'exe': 'mix', + \ 'args': ['credo', 'list', '%:p', '--format=oneline'], + \ 'errorformat': + \ '%W[F] %. %f:%l:%c %m,' . + \ '%W[F] %. %f:%l %m,' . + \ '%W[R] %. %f:%l:%c %m,' . + \ '%W[R] %. %f:%l %m,' . + \ '%I[C] %. %f:%l:%c %m,' . + \ '%I[C] %. %f:%l %m,' . + \ '%-Z%.%#' + \ } + + +let g:neomake_elixir_enabled_makers = ['mix', 'credo'] + +augroup my_error_signs + au! + autocmd ColorScheme * hi NeomakeErrorSign ctermfg=203 guifg=#ff5f5f + autocmd ColorScheme * hi NeomakeWarningSign ctermfg=209 guifg=#ffaf00 + autocmd ColorScheme * hi NeomakeInfoSign ctermfg=183 guifg=#dfafff + autocmd ColorScheme * hi NeomakeMessageSign ctermfg=27 guifg=#0087ff +augroup END + + +" templates +if has("autocmd") + autocmd BufNewFile *.c 0r ~/.config/nvim/templates/boilerplate.c + autocmd BufNewFile *.rs 0r ~/.config/nvim/templates/boilerplate.rs +endif + +let g:neomake_error_sign = { + \ 'text': '>>', + \ 'texthl': 'NeoMakeErrorSign', + \ } + +let g:neomake_warning_sign = { + \ 'text': '>>', + \ 'texthl': 'NeoMakeWarningSign', + \ } + +let g:neomake_info_sign = { + \ 'text': '>>', + \ 'texthl': 'NeoMakeInfoSign', + \ } + +let g:neomake_message_sign = { + \ 'text': '>>', + \ 'texthl': 'NeoMakeMessageSign', + \ } + +function! <SID>LocationPrevious() + try + lprev + catch /^Vim\%((\a\+)\)\=:E553/ + llast + endtry +endfunction + +function! <SID>LocationNext() + try + lnext + catch /^Vim\%((\a\+)\)\=:E553/ + lfirst + endtry +endfunction + +nnoremap <Leader>[ :call <SID>LocationPrevious()<CR> +nnoremap <Leader>] :call <SID>LocationNext()<CR> + + +" Alchemist settings +let g:alchemist#elixir_erlang_src = '/usr/local/share/src' + + +" Airline Settings +" Enables the list of buffers. +let g:airline#extensions#tabline#enabled = 0 + +" Buffer numbers alongside files +let g:airline#extensions#tabline#buffer_nr_show = 0 + +" Shows the filename only. +let g:airline#extensions#tabline#fnamemod = ':t' + +" Allow glyphs in airline +let g:airline_powerline_fonts = 1 + +" Change Airline theme +let g:airline_theme = 'hybrid' + + +" Vim-Swoop Settings +" Edits colorscheme +let g:swoopHighlight = ["hi! link SwoopBufferLineHi Warning", "hi! link SwoopPatternHi Error"] + + +" Jump to buffers. +nmap <F1> :1b<CR> +nmap <F2> :2b<CR> +nmap <F3> :3b<CR> +nmap <F4> :4b<CR> +nmap <F5> :5b<CR> +nmap <F6> :6b<CR> +nmap <F7> :7b<CR> +nmap <F8> :8b<CR> +nmap <F9> :9b<CR> + + +" It's the twenty-first century...no swaps. +set noswapfile + + +" Allow visual tab completion in command mode +set wildmenu + + +" Show Vim commands as they're being input. +set showcmd + + +" Code folding +" set foldmethod=indent +" set foldnestmax=10 +" set nofoldenable +" set foldlevel=4 + + +" emulate ci" and ci' behavior +nnoremap ci( f(%ci( +nnoremap ci[ f[%ci[ + + +" extend functionality of <C-e> & <C-y> scrolling +nnoremap <C-e> <C-e>j +vnoremap <C-e> <C-e>j +nnoremap <C-y> <C-y>k +vnoremap <C-y> <C-y>k + + +" Opens all folds within the buffer +" nnoremap ZZ zR + +" Closes all folds within the buffer +" nnoremap zz zM + +" Opens all folds beneath the cursor +" NOTE: j is the character to go down +" nnoremap zJ zO + +" Opens single fold beneath the cursor +" NOTE: j is the character to go down +" nnoremap zj zo + +" Opens single fold beneath the cursor +" NOTE: k is the character to go down +" nnoremap zK zC + +" Opens single fold beneath the cursor +" NOTE: k is the character to go down +" nnoremap zk zc + + +" Save shortcut +nnoremap <C-s> :w<CR> + + +" Switch to MRU'd buffer +nnoremap <leader><leader> <C-^> + + +" Alternative MRU to CtrlP MRU +nnoremap <leader>b :MRU<CR> + + +" Supports mouse interaction. +set mouse=a + + +" Highlights matches during a search. +set hlsearch + +" Clear highlight +noremap <silent> <leader>h :nohlsearch<bar>:echo<CR> + + +" backspace settings +set backspace=2 +set backspace=indent,eol,start + + +" Javascript specific variables +let g:javascript_plugin_jsdoc = 1 + +" GlobalListchars +set list +set listchars=tab:··,trail:·,nbsp:· + + +" Keeps everything concealed at all times. Even when cursor is on the word. +set conceallevel=1 +set concealcursor=nvic + + +" map jk to <Esc> +inoremap jk <Esc> + + +" Hybrid mode for Vim +inoremap <C-a> <Esc>I +inoremap <C-e> <Esc>A + +inoremap <M-b> <S-Left> +inoremap <M-f> <S-Right> + +inoremap <C-b> <Left> +inoremap <C-f> <Right> +inoremap <C-p> <Up> +inoremap <C-n> <Down> + +" temporarily disable <C-p> in normal mode so it doesn't attempt to index all of +" Google3. +nnoremap <C-p> :echo "You are attempting to index all of Google3. Aborting..."<CR> + +" tab maintenence +nnoremap <C-t> :tabnew<CR> +nnoremap <C-w> :tabclose<CR> +nnoremap <Tab> :tabnext<CR> +nnoremap <S-Tab> :tabprevious<CR> + +" Manage Vertical and Horizontal splits +nnoremap sl <Esc>:vs<CR><C-w>l +nnoremap sh <Esc>:vs<CR> +nnoremap sj <Esc>:sp<CR><C-w>j +nnoremap sk <Esc>:sp<CR> + + +" Delete (i.e. "close") the currently opened buffer +" TODO: unless it's a split window, which should be :q +nnoremap <leader>q :bdelete<CR> + + +" Set CtrlP runtime path +set runtimepath^=~/.vim/bundle/ctrlp.vim + + +" Pane movement +let g:tmux_navigator_no_mappings = 1 + +nnoremap <silent> <M-h> :TmuxNavigateLeft<CR> +nnoremap <silent> <M-j> :TmuxNavigateDown<CR> +nnoremap <silent> <M-k> :TmuxNavigateUp<CR> +nnoremap <silent> <M-l> :TmuxNavigateRight<CR> +nnoremap <silent> <M-q> :q<CR> + +" make Y do what is intuitive given: +" D: deletes until EOL +" C: changes until EOL +" Y: (should) yank until EOL +nnoremap Y y$ + + +" scrolling and maintaing mouse position +" nnoremap <C-j> j<C-e> +" nnoremap <C-k> k<C-y> + + +" remap redo key that is eclipsed by `rotate` currently +nnoremap U :redo<CR> + + +" Define highlighting groups +" NOTE: The ANSII aliases for colors will change when iTerm2 settings are +" changed. +highlight InterestingWord1 ctermbg=Magenta ctermfg=Black +highlight InterestingWord2 ctermbg=Blue ctermfg=Black + +" h1 highlighting +nnoremap <silent> <leader>1 :execute '2match InterestingWord1 /\<<c-r><c-w>\>/'<CR> +nnoremap <silent> <leader>x1 :execute '2match none'<CR> +vnoremap <silent> <leader>1 :execute '2match InterestingWord1 /\<<c-r><c-w>\>/'<CR> + +" h2 highlighting +nnoremap <silent> <leader>2 :execute '3match InterestingWord2 /\<<c-r><c-w>\>/'<CR> +nnoremap <silent> <leader>x2 :execute '3match none'<CR> + +"clear all highlighted groups +nnoremap <silent> <leader>xx :execute '2match none'<CR> :execute '3match none'<CR> hh + + +" pasteboard copy & paste +set clipboard+=unnamedplus + + +" Manage 80 char line limits +highlight OverLength1 ctermbg=Magenta ctermfg=Black +highlight OverLength2 ctermbg=LightMagenta ctermfg=Black +highlight OverLength3 ctermbg=White ctermfg=Black +" match OverLength3 /\%81v.\+/ +match OverLength2 /\%91v.\+/ +" match OverLength3 /\%101v.\+/ + +nnoremap <leader>w :w<CR> + + +" Resize split to 10,20,...,100 chars +" Uncomment the next lines for support at those sizes. +" These bindings interfere with the highlight groups, however. +" Increases the width of a vertical split. +" nnoremap <leader>1 :vertical resize 10<CR> +" nnoremap <leader>2 :vertical resize 20<CR> +nnoremap <leader>3 :vertical resize 30<CR> +nnoremap <leader>4 :vertical resize 40<CR> +nnoremap <leader>5 :vertical resize 50<CR> +nnoremap <leader>6 :vertical resize 60<CR> +nnoremap <leader>7 :vertical resize 70<CR> +nnoremap <leader>8 :vertical resize 80<CR> +nnoremap <leader>9 :vertical resize 90<CR> +nnoremap <leader>0 :vertical resize 100<CR> + + +" Increases the height of a horizontal split. +nnoremap <leader>v1 :resize 5<CR> +nnoremap <leader>v2 :resize 10<CR> +nnoremap <leader>v3 :resize 15<CR> +nnoremap <leader>v4 :resize 20<CR> +nnoremap <leader>v5 :resize 25<CR> +nnoremap <leader>v6 :resize 30<CR> +nnoremap <leader>v7 :resize 35<CR> +nnoremap <leader>v8 :resize 40<CR> +nnoremap <leader>v9 :resize 45<CR> +nnoremap <leader>v0 :resize 50<CR> + + +" BOL and EOL +nnoremap H ^ +vnoremap H ^ +nnoremap L $ +vnoremap L $ + + +" Search for visually selected text +vnoremap // y/<C-r>"<CR>N + + +" trim trailing whitespace on save +" Are there any file type where I wouldn't want this? +autocmd BufWritePre *.{js,py,tpl,less,html,ex,exs,txt,hs,java,rs,ml} :%s/\s\+$//e + + +" Use .gitignore file to populate Ctrl-P +let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files . -co --exclude-standard', 'find %s -type f'] + + +" Ignores dirs and files +let g:ctrlp_custom_ignore = { + \ 'dir': 'node_modules', + \ 'file': '\v\.(exe|dll|png|jpg|jpeg)$' +\} + + +" WIP: Run elixir tests on that line +" TODO: only register binding in *.exs? file extensions +nnoremap <leader>t :call ExTestToggle()<CR> + + +" Jumps from an Elixir module file to an Elixir test file. +fun! ExTestToggle() + if expand('%:e') == "ex" + + let test_file_name = expand('%:t:r') . "_test.exs" + let test_file_dir = substitute(expand('%:p:h'), "/lib/", "/test/", "") + let full_test_path = join([test_file_dir, test_file_name], "/") + + e `=full_test_path` + + elseif match(expand('%:t'), "_test.exs") != -1 + + let test_file_name = expand('%:t:r') + let offset_amt = strlen(test_file_name) - strlen("_test") + let module_file_name = strpart(test_file_name, 0, offset_amt) . ".ex" + let module_file_dir = substitute(expand('%:p:h'), "/test/", "/lib/", "") + let full_module_path = join([module_file_dir, module_file_name], "/") + + e `=full_module_path` + + endif +endfun + + +" Creates intermediate directories and file to match current buffer's filepath +fun! CreateNonExistingDirsAndFile() + ! echo "Creating directory..." && mkdir -p %:p:h && echo "Created directory." && echo "Creating file..." && touch %:t:p && echo "Created file." + + " Write the buffer to the recently created file. + w +endfun diff --git a/configs/shared/.config/nvim/simple.vim b/configs/shared/.config/nvim/simple.vim new file mode 100644 index 000000000000..ea40964ee803 --- /dev/null +++ b/configs/shared/.config/nvim/simple.vim @@ -0,0 +1,98 @@ +" My barebones vimrc without any Vundle dependencies. +" +" I'm attempting to optimize the following: +" - Minimize dependencies +" - Maximize ergonomics +" - Maximize Tmux compatibility +" - Minimize shadowing of existing Vim KBDs +" +" Warning: This is currently unstable as it is a work-in-progress. +" +" Author: William Carroll <wpcarro@gmail.com> + +" Use <Space> as the leader key. +let mapleader = " " +nnoremap <leader>ev :tabnew<CR>:edit ~/.vimrc<CR> +nnoremap <leader>sv :source ~/.vimrc<CR> +nnoremap <leader>w :w<CR> +nnoremap <leader>h :help + +" increment,decrement numbers +nnoremap + <C-a> +" TODO: Restore with better KBD +" nnoremap - <C-x> + +" Visit the CWD +nnoremap - :e .<CR> + +" Turn line numbers on. +set number + +" Easily create vertical, horizontal window splits. +nnoremap sh :vsplit<CR> +nnoremap sj :split<CR>:wincmd j<CR> +nnoremap sk :split<CR> +nnoremap sl :vsplit<CR>:wincmd l<CR> + +" Move across window splits. +" TODO: Change to <M-{h,j,k,l}>. +nnoremap <C-h> :wincmd h<CR> +nnoremap <C-j> :wincmd j<CR> +nnoremap <C-k> :wincmd k<CR> +nnoremap <C-l> :wincmd l<CR> + +" TODO: Support these. +" nnoremap <M-q> :q<CR> +" nnoremap <M-h> :wincmd h<CR> +" nnoremap <M-j> :wincmd j<CR> +" nnoremap <M-k> :wincmd k<CR> +" nnoremap <M-l> :wincmd l<CR> + +" Use <Enter> instead of G to support: +" 20<Enter> - to jump to line 20 +" d20<Enter> - to delete from the current line until line 20 +" <C-v>20<Enter> - to select from the current line until line 20 +nnoremap <Enter> G +onoremap <Enter> G +vnoremap <Enter> G + +" Easily change modes on keyboards that don't have CapsLock mapped to <Esc> +inoremap jk <ESC> + +" CRUD tabs. +nnoremap <TAB> :tabnext<CR> +nnoremap <S-TAB> :tabprevious<CR> +nnoremap <C-t> :tabnew<CR>:edit .<CR> +nnoremap <C-w> :tabclose<CR> +" TODO: Re-enable these once <M-{h,j,k,l}> are supported. +" nnoremap <C-l> :+tabmove<CR> +" nnoremap <C-h> :-tabmove<CR> + +" Use H,L to goto beggining,end of a line. +" Swaps the keys to ensure original functionality of H,L are preserved. +nnoremap H ^ +nnoremap L $ +nnoremap ^ H +nnoremap $ L + +" Use H,L in visual mode too +vnoremap H ^ +vnoremap L $ +vnoremap ^ H +vnoremap $ L + +" Emacs hybrid mode +" TODO: model this after tpope's rsi.vim (Readline-style insertion) +cnoremap <C-g> <C-c> +cnoremap <C-a> <C-b> +inoremap <C-a> <C-o>^ +inoremap <C-e> <C-o>$ +inoremap <C-b> <C-o>h +inoremap <C-f> <C-o>l + +" Indenting +" The following three settings are based on option 2 of `:help tabstop` +set tabstop=4 +set shiftwidth=4 +set expandtab +set autoindent diff --git a/configs/shared/.config/nvim/templates/boilerplate.c b/configs/shared/.config/nvim/templates/boilerplate.c new file mode 100644 index 000000000000..949743d72587 --- /dev/null +++ b/configs/shared/.config/nvim/templates/boilerplate.c @@ -0,0 +1,6 @@ +#include <stdio.h> + +int main() { + printf("Hello, world!"); + return 0; +} diff --git a/configs/shared/.config/nvim/templates/boilerplate.rs b/configs/shared/.config/nvim/templates/boilerplate.rs new file mode 100644 index 000000000000..c83adbc69fa0 --- /dev/null +++ b/configs/shared/.config/nvim/templates/boilerplate.rs @@ -0,0 +1,5 @@ +fn main() { + // The statements here will be executed when the compiled binary is called. + + println!("Hello, world!"); +} diff --git a/configs/shared/.config/rofi/config b/configs/shared/.config/rofi/config new file mode 100644 index 000000000000..576ab5cd8e68 --- /dev/null +++ b/configs/shared/.config/rofi/config @@ -0,0 +1,6 @@ +rofi.font: Monospace 10 +rofi.color-normal: #31213f, #8de0e1, #31213f, #83526a, #8de0e1 +rofi.color-urgent: #31213f, #d6b48d, #22231D, #d6b48d, #8de0e1 +rofi.color-active: #31213f, #3CC2B5, #31213f, #3CC2B5, #31213f +rofi.color-window: #31213f, #83526a, #5a3849 +rofi.modi: window,run,ssh,combi diff --git a/configs/shared/.config/rofi/config.bak b/configs/shared/.config/rofi/config.bak new file mode 100644 index 000000000000..cd77833442f4 --- /dev/null +++ b/configs/shared/.config/rofi/config.bak @@ -0,0 +1,6 @@ +rofi.font: Source Code Pro 10 +rofi.color-normal: #01022E, #a7dff4, #01022E, #015f9e, #a7dff4 +rofi.color-urgent: #01022E, #d6b48d, #22231D, #d6b48d, #a7dff4 +rofi.color-active: #01022E, #3FA4E0, #01022E, #3FA4E0, #01022E +rofi.color-window: #01022E, #015f9e, #01416c +rofi.modi: window,run,ssh,combi diff --git a/configs/shared/.config/systemd/user/clipmenud.service b/configs/shared/.config/systemd/user/clipmenud.service new file mode 100644 index 000000000000..fac317f3f072 --- /dev/null +++ b/configs/shared/.config/systemd/user/clipmenud.service @@ -0,0 +1,18 @@ +[Unit] +Description=Clipmenu daemon + +[Service] +ExecStart=clipmenud +Restart=always +RestartSec=500ms +Environment=DISPLAY=:0 + +MemoryDenyWriteExecute=yes +NoNewPrivileges=yes +ProtectControlGroups=yes +ProtectKernelTunables=yes +RestrictAddressFamilies= +RestrictRealtime=yes + +[Install] +WantedBy=default.target diff --git a/configs/shared/.config/systemd/user/default.target.wants/clipmenud.service b/configs/shared/.config/systemd/user/default.target.wants/clipmenud.service new file mode 120000 index 000000000000..387f2023d2d2 --- /dev/null +++ b/configs/shared/.config/systemd/user/default.target.wants/clipmenud.service @@ -0,0 +1 @@ +/usr/local/google/home/wpcarro/.config/systemd/user/clipmenud.service \ No newline at end of file diff --git a/configs/shared/.config/terminator/config b/configs/shared/.config/terminator/config new file mode 100644 index 000000000000..9357a7ed29f9 --- /dev/null +++ b/configs/shared/.config/terminator/config @@ -0,0 +1,34 @@ +[global_config] + enabled_plugins = LaunchpadBugURLHandler, LaunchpadCodeURLHandler, APTURLHandler, TerminatorThemes +[keybindings] +[profiles] + [[default]] + background_color = "#ffffff" + cursor_shape = ibeam + cursor_color = "#E29B61" + font = Input Mono Medium 12 + foreground_color = "#000000" + show_titlebar = False + scrollbar_position = hidden + palette = "#31213f:#e29b61:#e8c35f:#565b87:#a56785:#20a89e:#3cc2b5:#8de0e1:#629c9d:#e29b61:#e8c35f:#565b87:#a56785:#20a89e:#3cc2b5:#8de0e1" + use_system_font = False + [[Molokai]] + background_color = "#121212" + cursor_shape = ibeam + cursor_color = "#bbbbbb" + font = Input Mono Medium 12 + foreground_color = "#bbbbbb" + show_titlebar = False + scrollbar_position = hidden + palette = "#121212:#fa2573:#98e123:#dfd460:#1080d0:#8700ff:#43a8d0:#bbbbbb:#555555:#f6669d:#b1e05f:#fff26d:#00afff:#af87ff:#51ceff:#ffffff" + use_system_font = False +[layouts] + [[default]] + [[[child1]]] + parent = window0 + type = Terminal + profile = Molokai + [[[window0]]] + parent = "" + type = Window +[plugins] diff --git a/configs/shared/.config/terminator/config.bak b/configs/shared/.config/terminator/config.bak new file mode 100644 index 000000000000..d25a89c99e60 --- /dev/null +++ b/configs/shared/.config/terminator/config.bak @@ -0,0 +1,23 @@ +[global_config] + enabled_plugins = LaunchpadBugURLHandler, LaunchpadCodeURLHandler, APTURLHandler +[keybindings] +[profiles] + [[default]] + background_color = "#01022E" + cursor_shape = ibeam + cursor_color = "#434AA6" + font = Source Code Pro 10 + foreground_color = "#0278C6" + show_titlebar = False + scrollbar_position = hidden + palette = "#01022E:#434AA6:#0278C6:#9B6DB0:#018CD5:#07AAE9:#3FA4E0:#a7dff4:#749caa:#434AA6:#0278C6:#9B6DB0:#018CD5:#07AAE9:#3FA4E0:#a7dff4" + use_system_font = False +[layouts] + [[default]] + [[[child1]]] + parent = window0 + type = Terminal + [[[window0]]] + parent = "" + type = Window +[plugins] diff --git a/configs/shared/.config/terminator/plugins/terminator-themes.py b/configs/shared/.config/terminator/plugins/terminator-themes.py new file mode 100644 index 000000000000..fa807c65bd2a --- /dev/null +++ b/configs/shared/.config/terminator/plugins/terminator-themes.py @@ -0,0 +1,250 @@ +import requests +import terminatorlib.plugin as plugin +from gi.repository import Gtk +from terminatorlib.config import ConfigBase +from terminatorlib.translation import _ +from terminatorlib.util import get_config_dir, err, dbg, gerr + +AVAILABLE = ['TerminatorThemes'] + +class TerminatorThemes(plugin.Plugin): + + capabilities = ['terminal_menu'] + config_base = ConfigBase() + base_url = 'https://api.github.com/repos/EliverLara/terminator-themes/contents/themes.json' + inherits_config_from = "default" + + def callback(self, menuitems, menu, terminal): + """Add our item to the menu""" + self.terminal = terminal + item = Gtk.ImageMenuItem(Gtk.STOCK_FIND) + item.connect('activate',self.configure) + item.set_label("Themes") + item.set_sensitive(True) + menuitems.append(item) + + def configure(self, widget, data = None): + ui = {} + dbox = Gtk.Dialog( _("Terminator themes"), None, Gtk.DialogFlags.MODAL) + + headers = { "Accept": "application/vnd.github.v3.raw" } + response = requests.get(self.base_url, headers=headers) + + if response.status_code != 200: + gerr(_("Failed to get list of available themes")) + return + + self.themes_from_repo = response.json()["themes"] + self.profiles = self.terminal.config.list_profiles() + + main_container = Gtk.HBox(spacing=5) + main_container.pack_start(self._create_themes_grid(ui), True, True, 0) + main_container.pack_start(self._create_settings_grid(ui), True, True, 0) + dbox.vbox.pack_start(main_container, True, True, 0) + + self.dbox = dbox + dbox.show_all() + res = dbox.run() + + if res == Gtk.ResponseType.ACCEPT: + self.terminal.config.save() + + del(self.dbox) + dbox.destroy() + + return + + def _create_themes_grid(self, ui): + grid = Gtk.Grid() + grid.set_column_spacing(5) + grid.set_row_spacing(7) + grid.set_column_homogeneous(True) + grid.set_row_homogeneous(True) + + scroll_window = self._create_themes_list(ui) + + #creating buttons to filter by theme type, and setting up their events + buttons = list() + for theme_type in ["light", "dark", "None"]: + button = Gtk.Button(theme_type) + buttons.append(button) + button.connect("clicked", self.on_filter_button_clicked) + + grid.attach(scroll_window, 0, 0, 4, 10) + grid.attach_next_to(buttons[0], scroll_window, Gtk.PositionType.BOTTOM, 1, 1) + + for i, button in enumerate(buttons[1:]): + grid.attach_next_to(button, buttons[i], Gtk.PositionType.RIGHT, 1, 1) + + return grid + + def _create_themes_list(self, ui): + + profiles_list_model = Gtk.ListStore(str, str,bool, object) + # Set add/remove buttons availability + for theme in self.themes_from_repo: + if theme["name"] in self.profiles: + profiles_list_model.append([theme["name"], theme["type"],False, theme]) + else: + profiles_list_model.append([theme["name"], theme["type"],True, theme]) + + self.current_filter_theme = None + self.theme_filter = profiles_list_model.filter_new() + self.theme_filter.set_visible_func(self.theme_filter_func) + + treeview = Gtk.TreeView.new_with_model(self.theme_filter) + + selection = treeview.get_selection() + selection.set_mode(Gtk.SelectionMode.SINGLE) + selection.connect("changed", self.on_selection_changed, ui) + ui['treeview'] = treeview + + for i, column_title in enumerate(["Theme", "Type"]): + renderer = Gtk.CellRendererText() + column = Gtk.TreeViewColumn(column_title, renderer, text=i) + treeview.append_column(column) + + scroll_window = Gtk.ScrolledWindow() + scroll_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + scroll_window.add(treeview) + + return scroll_window + + + def _create_settings_grid(self, ui): + grid = Gtk.Grid() + grid.set_column_spacing(5) + grid.set_row_spacing(7) + grid.attach(self._create_default_inherits_check(ui), 0, 0, 2, 1) + grid.attach(Gtk.Label("Available profiles: "), 0, 1, 1, 1) + grid.attach(self._create_inherits_from_combo(ui), 1, 1, 1, 1) + grid.attach(self._create_main_action_button(ui, "install", self.on_install), 0, 4, 1, 1) + grid.attach(self._create_main_action_button(ui, "remove", self.on_uninstall), 1, 4, 1, 1) + + return grid + + def _create_default_inherits_check(self, ui): + check = Gtk.CheckButton("Inherit preferences from default profile") + check.set_active(True) + check.connect("toggled", self.on_inheritsfromdefaultcheck_toggled, ui) + ui['check_inherits_from_default'] = check + + return check + + def _create_inherits_from_combo(self, ui): + combo = Gtk.ComboBoxText() + combo.set_entry_text_column(0) + combo.set_sensitive(False) + combo.connect("changed", self.on_inheritsfromcombo_changed, ui) + ui['inherits_from_combo'] = combo + + for profile in self.profiles: + combo.append_text(profile) + + combo.set_active(self.profiles.index(self.terminal.config.get_profile())) + + return combo + + def _create_main_action_button(self, ui, label, action): + btn = Gtk.Button(_(label.capitalize())) + btn.connect("clicked", action, ui) + btn.set_sensitive(False) + ui['button_' + label] = btn + + return btn + + def theme_filter_func(self, model, iter, data): + """Tests if the theme in the row is the one in the filter""" + if self.current_filter_theme is None or self.current_filter_theme == "None": + return True + else: + return model[iter][1] == self.current_filter_theme + + def on_filter_button_clicked(self, widget): + """Called on any of the button clicks""" + #we set the current theme filter to the button's label + self.current_filter_theme = widget.get_label() + + #we update the filter, which updates in turn the view + self.theme_filter.refilter() + + + def on_inheritsfromdefaultcheck_toggled(self, check, data=None): + if check.get_active() is not True: + data["inherits_from_combo"].set_sensitive(True) + self.inherits_config_from = self.profiles[data['inherits_from_combo'].get_active()] + else: + data["inherits_from_combo"].set_sensitive(False) + self.inherits_config_from = 'default' + + def on_inheritsfromcombo_changed(self, combo, data): + if combo.get_sensitive(): + self.inherits_config_from = self.profiles[combo.get_active()] + else: + self.inherits_config_from = 'default' + + def on_selection_changed(self, selection, data=None): + (model, iter) = selection.get_selected() + data['button_install'].set_sensitive(model[iter][2]) + data['button_remove'].set_sensitive(model[iter][2] is not True) + + def on_uninstall(self, button, data): + treeview = data['treeview'] + selection = treeview.get_selection() + (store, iter) = selection.get_selected() + target = store[iter][0] + + # If selected theme is active, sets terminal profile to default before unistalling + if self.terminal.get_profile() == target: + widget = self.terminal.get_vte() + self.terminal.force_set_profile(widget, 'default') + + self.terminal.config.del_profile(target) + self.terminal.config.save() + self.update_comboInheritsFrom(data) + + #'Add' button available again + data['treeview'].get_model().set_value(iter, 2, True) + self.on_selection_changed(selection, data) + + def on_install(self, button, data): + treeview = data['treeview'] + selection = treeview.get_selection() + (store, iter) = selection.get_selected() + target = store[iter][3] + widget = self.terminal.get_vte() + treeview.set_enable_tree_lines(False) + + if not iter: + return + + self.terminal.config.add_profile(target["name"]) + template_data = self.config_base.profiles[self.inherits_config_from].copy() + + for k, v in target.items(): + if k != 'background_image' and k != 'name' and k != 'type': + if k == 'background_darkness': + template_data[k] = float(v) + else: + template_data[k] = v + + for k, v in template_data.items(): + self.config_base.set_item(k, v, target["name"]) + + self.terminal.force_set_profile(widget, target["name"]) + self.terminal.config.save() + self.update_comboInheritsFrom(data) + + # "Remove" button available again + data['treeview'].get_model().set_value(iter, 2, False) + self.on_selection_changed(selection, data) + treeview.set_enable_tree_lines(True) + + def update_comboInheritsFrom(self, data): + data['inherits_from_combo'].remove_all() + profiles = self.terminal.config.list_profiles() + self.profiles = profiles + for profile in profiles: + data['inherits_from_combo'].append_text(profile) + + data['inherits_from_combo'].set_active(profiles.index(self.terminal.config.get_profile())) \ No newline at end of file |