├── .gitignore ├── README.md ├── docs ├── kde_neon.md ├── ubuntu.md └── ubuntu │ ├── 1.png │ └── 2.png ├── images ├── ubuntu_18_1.png ├── ubuntu_20_1.png ├── ubuntu_20_2.png └── ubuntu_20_3.png └── setup.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.log -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WARNING 2 | This repo has been superseded by my [macify-linux](https://github.com/Jonchun/macify-linux) project. While I will still try and troubleshoot/maintain this as needed, my primary desktop environment is now KDE Neon rather than Ubuntu, so active progress on this repo is bound to be unlikely. This script is NOT well tested and does NOT have the greatest error logging and whatnot. I would recommend checking out the new repo if you are not married to the idea of Gnome (default Ubuntu) 3 | 4 | ## What is this? 5 | This is a script that you can run on your Ubuntu 18.04/20.04 install and it'll go through and apply themes/system settings, as well as replace your hotkeys to use cmd key bindings rather than ctrl key bindings thanks to the magic of [kinto.sh](http://kinto.sh). 6 | 7 | Additionally, I've archived the docs/notes I've taken when first starting my linux to mac adventure. You can find my notes for [Ubuntu](docs/ubuntu.md) and [KDE Neon](docs/kde_neon.md) in this repository. 8 | 9 | ## How to install 10 | Installation is simple. There are a few options to choose from, but they're self explanatory. If you don't know what icon set to pick from, I'd recomend trying out `Numix Circle` for a clean macOS like experience. 11 | ``` 12 | wget https://raw.githubusercontent.com/Jonchun/ubuntu2macOS/master/setup.py 13 | python3 setup.py 14 | ``` 15 | Near the end, during the kinto installation portion, I recommend choosing the following settings: 16 | ``` 17 | One time initialization tweaks are available. Would you like to view them? (Y/n) Y 18 | 1. gnome-init 19 | Description: Gnome - Remove Superkey Overlay keybinding to Activities Overview 20 | run: gsettings set org.gnome.mutter overlay-key '' 21 | 22 | 2. kde-init 23 | Description: KDE Plasma 5 - Removes Superkey Overlay from the Launcher Menu 24 | run: kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta "" 25 | qdbus org.kde.KWin /KWin reconfigure 26 | 27 | Please enter your init tweak(s) (eg 1 or 1 2 3 - leave blank to skip): 1 28 | Dynamic shortcut tweaks 29 | 30 | 1. Gnome Activities Overview 31 | Description: Cmd+Space activates Activities Overview 32 | run in gui mode: gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "['Space']" 33 | run in terminal mode: gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "['Space']" 34 | 35 | Please enter your dynamic shortcut tweak(s) (eg 1 or 1 2 3 - leave blank to skip): 1 36 | ``` 37 | After running this script, you'll likely want to make your own tweaks and customizations. While it is on the TODO list to document how to do specific things, referencing my personal [Ubuntu notes](docs/ubuntu.md) from when I was first going through all this stuff will likely be more than enough. After all, this script basically just automates everything in that notes file. 38 | 39 | ## Screenshots 40 | **Before:** 41 | ![Screenshot 20_1](https://raw.githubusercontent.com/Jonchun/ubuntu2macOS/master/images/ubuntu_20_1.png) 42 | **After:** 43 | ![Screenshot 20_2](https://raw.githubusercontent.com/Jonchun/ubuntu2macOS/master/images/ubuntu_20_2.png) 44 | ![Screenshot 20_3](https://raw.githubusercontent.com/Jonchun/ubuntu2macOS/master/images/ubuntu_20_3.png) 45 | 46 | **Light Theme:** 47 | ![Screenshot 18_1](https://raw.githubusercontent.com/Jonchun/ubuntu2macOS/master/images/ubuntu_18_1.png) 48 | 49 | ## Notes 50 | While my current desktop machine is KDE Neon because I like to tinker and mess around/customize things, my end goal with this project is to create an install script that can take a standard Ubuntu install, and with very minimal effort, transform it into an environment that is comfortable for a macOS primary user. IT IS NOT MEANT TO BE AN EXACT CLONE. THINGS WILL BE DIFFERENT. I know that KDE/XFCE can give closer/better replicas. HOWEVER, from my testing, just plain/stock Ubuntu in Gnome seems to be the most stable/consistent, and that is why I chose to go with it for this project. 51 | 52 | ## Credits 53 | - Jonathan Chun ([@jonchun](https://github.com/jonchun)) | Creator of this script. 54 | - Ben Reaves ([@rbreaves](https://github.com/rbreaves/)) | Creator of [kinto.sh](http://kinto.sh/). Let's be real... 99% of the greatness of this ubuntu2Mac conversion script is because of the hotkeys. 55 | -------------------------------------------------------------------------------- /docs/kde_neon.md: -------------------------------------------------------------------------------- 1 | # Steps 2 | ## Disclaimer 3 | These instructions were originally for Kubuntu, but I moved to KDE Neon and may not have caught every single difference. However, they should be "good-enough" for anyone who has basic linux experience and google skills. 4 | 5 | ## Start 6 | Standard update/upgrade to start. 7 | ``` 8 | sudo apt-get update 9 | sudo apt-get upgrade -y 10 | ``` 11 | --- 12 | Install Git/Python3 13 | ``` 14 | sudo apt-get install -y git python3 15 | ``` 16 | --- 17 | ## Keybinds 18 | Install [Kinto](https://github.com/rbreaves/kinto). This converts/remaps alt→ctrl and alt→ctrl+shift in terminal applications. This lets you use hotkeys like cmd+c and cmd+v, but in Linux. 19 | ``` 20 | sudo apt-get install -y xbindkeys xdotool ibus 21 | git clone https://github.com/rbreaves/kinto.git 22 | cd kinto/ 23 | ./setup.py 24 | ``` 25 | The options I selected are: 26 | ``` 27 | One time initialization tweaks are available. Would you like to view them? (Y/n) Y 28 | 1. gnome-init 29 | Description: Gnome - Remove Superkey Overlay keybinding to Activities Overview 30 | run: gsettings set org.gnome.mutter overlay-key '' 31 | 32 | 2. kde-init 33 | Description: KDE Plasma 5 - Removes Superkey Overlay from the Launcher Menu 34 | run: kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta "" 35 | qdbus org.kde.KWin /KWin reconfigure 36 | 37 | Please enter your init tweak(s) (eg 1 or 1 2 3 - leave blank to skip): 2 38 | Dynamic shortcut tweaks 39 | 40 | 1. Gnome Activities Overview 41 | Description: Cmd+Space activates Activities Overview 42 | run in gui mode: gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "['Space']" 43 | run in terminal mode: gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "['Space']" 44 | 45 | Please enter your dynamic shortcut tweak(s) (eg 1 or 1 2 3 - leave blank to skip): 46 | ``` 47 | For some reason, I needed to restart kinto before it worked. 48 | ``` 49 | systemctl --user restart keyswap 50 | ``` 51 | Additionally. ibus wasn't running. Started it with 52 | ``` 53 | ibus-setup 54 | ``` 55 | I cleared the Ctrl+Space default hotkey as well. Then, I ran 56 | ``` 57 | im-config -n ibus 58 | sudo reboot 59 | ``` 60 | as documented in [this issue](https://github.com/rbreaves/kinto/issues/65). 61 | 62 | ## System Settings 63 | ### Appearance 64 | #### Look and Feel 65 | ``` 66 | System Settings → Look and Feel → Get New Look and Feel Themes 67 | Search for "McMojave LAF": Download McMojave-light 68 | Set Look and Feel to McMojave-light 69 | ``` 70 | #### Workspace Theme 71 | 72 | ``` 73 | System Settings → Workspace Theme → Plasma Theme 74 | Set Breeze (Recommend McMojave if you prefer dark) 75 | System Settings → Workspace Theme → Cursors 76 | Set McMojave Cursors 77 | System Settings → Workspace Theme → Splash Screen 78 | Set McMojave-light 79 | ``` 80 | I don't want apple logos on my stuff! I edited the splash screen by editing `~/.local/share/plasma/look-and-feel/com.github.vinceliuice.McMojave-light/contents/splash/Splash.qml` 81 | and editing in 82 | ``` 83 | // source: "images/logo.svg" 84 | source: "/usr/share/plasma/look-and-feel/org.kde.breeze.desktop/contents/splash/images/plasma.svgz" 85 | ``` 86 | 87 | #### Fonts 88 | Download SFPro Fonts [here](https://github.com/blaisck/sfwin/tree/master/SFPro/TrueType). 89 | Download SFMono Fonts [here](https://github.com/blaisck/sfwin/tree/master/SFMono/TrueType). 90 | 91 | Install the fonts locally/globally. 92 | 93 | ``` 94 | System Settings → Fonts 95 | General: SF Pro Text 10pt 96 | Fixed Width: SF Mono 9pt 97 | Small: SF Pro Text 10pt 98 | Toolbar: SF Pro Text 10pt 99 | Menu: SF Pro Text 10pt 100 | Window title: SF Pro Text 10pt 101 | ``` 102 | #### Icons 103 | You can keep the McMojave-circle Icons if you want, but I found that the 'Papirus" icons look a lot better. 104 | ``` 105 | System Settings → Icons → Get New Icons 106 | Install Papirus 107 | Set Icons to Papirus 108 | ``` 109 | #### Application Style 110 | ``` 111 | System Settings → Application Style → GNOME/GTK Application Style 112 | GTK2 theme: Breeze 113 | GTK3 theme: Breeze 114 | Font: SF Pro Text 10 115 | Cursor theme: McMojave-cursors 116 | Icon theme: Papirus 117 | Fallback theme: Papirus 118 | ``` 119 | ``` 120 | System Settings → Application Style → Window Decorations → Theme 121 | Set McMojave-light 122 | ``` 123 | ``` 124 | System Settings → Application Style → Window Decorations → Tilebar Buttons 125 | Change to match macOS. [Close, Minimize, Maximize] on left. 126 | ``` 127 | Edit `~/.config/gtk-3.0/settings.ini` 128 | Append the following: 129 | ``` 130 | gtk-decoration-layout=close,minimize,maximize:menu 131 | ``` 132 | At this point, the window decorations for McMojave were broken for me. Perhaps this is fixed in the future as per [this issue](https://github.com/vinceliuice/McMojave-kde/issues/18). In order to not get the ugly borders on my windows, I installed the following: 133 | ``` 134 | sudo add-apt-repository ppa:krisives/kde-hello 135 | sudo apt install kde-hello 136 | ``` 137 | These windows decorations look way better anyways and comes with some fancy stuff like rounding out the borders. Set the Window Decorations: 138 | ``` 139 | System Settings → Application Style → Window Decorations → Theme 140 | Set hello 141 | ``` 142 | 143 | --- 144 | ### Workspace 145 | #### Desktop Behavior 146 | ``` 147 | System Settings → Desktop Behavior → Desktop Effects 148 | Search for "Blur" and check the box. Open settings and adjust. 149 | I set Noise to 0 and Blur Strength to ~60%. 150 | ``` 151 | ``` 152 | System Settings → Desktop Behavior → Screen Edges 153 | Top-Left Corner: No action 154 | ``` 155 | #### Window Management 156 | ``` 157 | System Settings → Window Management → Window Behavior → Advanced 158 | Window Placement: Centered 159 | ``` 160 | ``` 161 | System Settings → Window Management → Task Switcher → Main 162 | Visualization: Thumbnails 163 | Shortcuts → Forward: Ctrl+Tab (cmd+tab with kinto) 164 | Shortcuts → Reverse: Ctrl+Alt+Tab (cmd+opt+tab with kinto) 165 | 166 | System Settings → Window Management → Task Switcher → Alternative 167 | Visualization: Thumbnails 168 | Shortcuts → Forward: Ctrl+Shift+Tab (cmd+tab with kinto) 169 | Shortcuts → Reverse: Ctrl+Alt+Shift+Tab (cmd+opt+shift+tab with kinto) 170 | ``` 171 | 172 | ``` 173 | System Settings → Window Management → KWin Scripts → Get New Scripts → Force Blur 174 | Enable Force Blur 175 | ``` 176 | #### Startup and Shutdown 177 | ``` 178 | System Settings → Startup and Shutdown → Theme → Get New Login Screens... 179 | Install "Chili login theme for KDE Plasma" 180 | 181 | System Settings → Startup and Shutdown → Advanced 182 | Cursor Theme: McMojave Cursors 183 | ``` 184 | 185 | ## Kvantum Manager 186 | We need this to edit themes apparently. I'm guessing it's for qt apps. 187 | ``` 188 | sudo add-apt-repository ppa:papirus/papirus 189 | sudo apt-get install -y qt5-style-kvantum 190 | ``` 191 | Open up Kvantum Manager 192 | ``` 193 | Kvantum → Change/Delete Theme → Select a theme: KvMojaveLight 194 | Kvantum → Configure Active Theme → Hacks 195 | Transparent menu title: checked 196 | Kvantum → Configure Active Theme → Compositing & General Look 197 | Reduce window opacity by: 5% 198 | Reduce menu opacity by: 15% 199 | ``` 200 | Change Application Style back to Breeze 201 | ``` 202 | System Settings → Application Style → Application Style 203 | Set Application Style: Breeze 204 | ``` 205 | ## Top Panel 206 | ### Adding the widgets/plasmoids 207 | Video of this part at [6:55](https://youtu.be/UYn4UYQ-nTo?t=415) 208 | 209 | **Note**: The video uses some widgets that are different from the ones I am using. I recommend using the ones listed here. 210 | ``` 211 | Right Click near top of Desktop → Add Panel → Empty Panel 212 | Right Click Panel → Add Widgets → Get New Widgets → Download New Plasma Widgets 213 | Application title 214 | Chili Clock 215 | USwitch 216 | ``` 217 | 218 | Add to Left of Panel (In order Left to Right): 219 | - USwitcher 220 | - Application Title 221 | - Global Menu 222 | 223 | Add to Right of Panel (In order Right to Left): 224 | - Notifications 225 | - Search 226 | - Audio Volume 227 | - Networks 228 | - System Tray 229 | 230 | #### USwitcher 231 | ``` 232 | Right Click USwitcher → Configure... 233 | Show only icon 234 | Set the icon to whatever you want. I downloaded a kubuntu icon. 235 | ``` 236 | 237 | #### Customize Application Title 238 | ``` 239 | Right Click Application Title → Configure... 240 | No active window label: Custom text 241 | No active window custom text: Desktop 242 | Text type: Application Name 243 | Bold: Checked 244 | ``` 245 | 246 | #### Customize Chili Clock 247 | ``` 248 | Right Click Chili Clock → Configure... 249 | Show date: Check 250 | Show Separator: Uncheck 251 | Show seconds: Check 252 | Use 24-hour Clock: Uncheck 253 | Use fixed font size: Check 254 | Font Size: 14 255 | Date format: Custom Date → ddd 256 | ``` 257 | 258 | 259 | #### Customize System Tray 260 | Want to remove duplicates/Customize here. 261 | ``` 262 | Right Click System Tray (The down arrow) → Configure... 263 | Audio Volume: Uncheck 264 | Clipboard: Uncheck 265 | Keyboard Indicator: Uncheck 266 | Networks: Uncheck 267 | Notifications: Uncheck 268 | Vaults: Uncheck 269 | ``` 270 | 271 | #### Customize Panel 272 | This part is a bit hard to explain via text. Recommend watching the video of this part at [8:33](https://youtu.be/UYn4UYQ-nTo?t=513) to figure out the spacer stuff. 273 | ``` 274 | Right Click → Panel Options → Configure Panel 275 | Add Spacer. 276 | Right Click Spacer → Uncheck "Set Flexible Size" → Make as small as possible. 277 | Move spacer to very left of panel before the Simple Menu Icon. 278 | Repeat above to create another spacer. 279 | Move spacer to very right of panel after the notifications icon 280 | Repeat above to create another spacer. 281 | Move spacer in between Chili Clock and Search. 282 | Right click the big middle spacer → Uncheck "Set Flexible Size" 283 | Right Click → Panel Options → Configure Panel 284 | Change Height to 26 285 | Right click panel → Lock Widgets 286 | ``` 287 | #### Global Menu Fix 288 | Global menu doesn't work properly if you have multiple monitors like me. Installed a [custom applet](https://github.com/psifidotos/applet-window-appmenu) to fix this. 289 | ``` 290 | sudo apt-get install -y cmake extra-cmake-modules qtdeclarative5-dev libkf5plasma-dev libkf5windowsystem-dev libkf5configwidgets-dev libkdecorations2-dev libsm-dev 291 | git clone https://github.com/psifidotos/applet-window-appmenu.git 292 | cd applet-window-appmenu/ 293 | ./install.sh 294 | ``` 295 | Add Window AppMenu and replace Global Menu in top bar. 296 | ``` 297 | Right Click Window AppMenu → Configure... 298 | Buttons: Show full application menu: selected 299 | Menu Colors: KvMojaveLight 300 | Spacing: 6px 301 | ``` 302 | --- 303 | ## Configure Desktop 304 | Disable Desktop Toolbox and remove bottom panel 305 | ``` 306 | Right click desktop → Configure Desktop → Tweaks 307 | Show the desktop toolbox: Uncheck 308 | Right click bottom panel → Unlock Widgets 309 | Right Click → Panel Options → Configure Panel → Remove Panel 310 | ``` 311 | ### Install Dock 312 | Open Terminal 313 | ``` 314 | sudo apt-get install -y latte-dock 315 | ``` 316 | Launch Latte (You can find it from search) 317 | ``` 318 | Right Click → Dock Settings 319 | Advanced: Checked 320 | Appearance → Items 321 | Absolute: 48 322 | Zoom On Hover: 15 323 | 324 | Appearance → Margins 325 | Height: 20% 326 | 327 | Appearance → Background 328 | Background: on 329 | Size: 90% 330 | Opacity: 50% 331 | Blur: Off 332 | Shadow: Off 333 | 334 | Effects → Latte Indicator Options 335 | Dot: Selected 336 | Different color for minimized windows: Checked 337 | 338 | Tasks → Interaction 339 | Add launchers only in the Tasks Area: Unchecked 340 | ``` 341 | Remove Analog Clock and Add Trash 342 | ``` 343 | Right Click → Dock Settings 344 | Right Click Analog Clock → Remove 345 | Right Click Dock → Add Widget → Trash → Drag to Dock 346 | ``` 347 | --- 348 | ### Spotlight Replacement 349 | ``` 350 | sudo apt-get install -y curl 351 | curl https://build.opensuse.org/projects/home:manuelschneid3r/public_key | sudo apt-key add - 352 | sudo sh -c "echo 'deb http://download.opensuse.org/repositories/home:/manuelschneid3r/xUbuntu_19.10/ /' > /etc/apt/sources.list.d/home:manuelschneid3r.list" 353 | sudo apt-get update 354 | sudo apt-get install albert 355 | nohup albert & 356 | ``` 357 | Configure Albert to hotkey of choice. I picked Ctrl+Space (cmd+space with kinto) 358 | ``` 359 | Frontend: Widget Box Model 360 | Terminal: Konsole 361 | Style: BoxModel 362 | Theme: Spotlight 363 | Autostart on login: Checked 364 | Extensions: Applications, Calculator, Files, Hash Generator, Snippets, System, Terminal, WebSearch 365 | ``` 366 | Add another hotkey 367 | ``` 368 | System Settings → Shortcuts → Custom Shortcuts 369 | Create a folder called Custom 370 | Create a shortcut in the Custom folder called "Show Albert". 371 | Assign a trigger of Ctrl+Shift+Space. (cmd+shift+space with kinto). 372 | ``` 373 | This will allow you to trigger albert even from terminal windows. 374 | 375 | At this point, you should now have a workable macOS equivalent! 376 | 377 | 3/30: There is an issue with icon themes in albert right now. Built from source to patch a workaround documented [here](https://github.com/albertlauncher/albert/issues/778) 378 | -------------------------------------------------------------------------------- /docs/ubuntu.md: -------------------------------------------------------------------------------- 1 | ## Intro 2 | I recently was affected by [this problem](https://www.change.org/p/apple-fix-all-macbook-pro-2016-and-later-with-stage-light-effect-or-backlight-shutdown-flexgate) with my Macbook Pro, and Apple wanted to charge me almost $900 to fix it. Instead, I decided that I will never buy an Apple product again and just bought a new computer for the same price. However, at this point in my career, I've gotten used to development work on macOS (command key bindings, spotlight search with command+space, the themes, etc), and it would be a lot of work to retrain myself to something more Windows-like. After a few days of research/testing/tweaking things, I've finally landed in a spot that makes me feel as if I'm using macOS (with minor differences), but is running Ubuntu under the hood. 3 | 4 | **Important Note:** While my primary desktop/work machine has been macOS because that's what my job provided, I was already very familiar with Linux when working via CLI as working with Linux servers is part of my job. This made the transition extremely easy for me (and even preferable), but others who are not in the same situation will likely have a much steeper learning curve. This document is really meant to track the resources I used in order to convert my environment rather than be a step-by-step tutorial on how to get everything working. 5 | 6 | ## Screenshots 7 | ![Screenshot 1](https://raw.githubusercontent.com/Jonchun/ubuntu2macOS/master/docs/ubuntu/1.png) 8 | ![Screenshot 2](https://raw.githubusercontent.com/Jonchun/ubuntu2macOS/master/docs/ubuntu/2.png) 9 | 10 | ## Prerequisites 11 | ~~I initially started on Ubuntu 18.04, but then re-installed and redid everything on Ubuntu 19.10 because I didn't have badge counters working in my dock. This was eventually resolved (still not 100% sure what the issue was), but you can track my troubleshooting [here](https://github.com/micheleg/dash-to-dock/issues/1110). I suspect most/all of this will also work on 18.04 LTS, but Ubuntu 20.04 LTS is being released in April 2020, so I will be waiting until that release before updating to a LTS version and updating this document.~~ I ended up redo-ing all of this on Ubuntu 18.04 and it worked like a charm. I would recommend just starting from Ubuntu 18.04 LTS and then eventually moving to 20.04 once it's fully launched and all of the themes/extensions/features listed in here are supported there. I started with a minimal install, but I'm sure it would be fine to do a full install as well. 12 | 13 | **Troubleshooting Note:** On my desktop computer using an Nvidia GFX card, Ubuntu got stuck in a login screen loop where I couldn't log in. I was able to fix it by pressing Control+Alt+F2 to bring up a terminal, and installing Ubuntu drivers. 14 | ``` 15 | sudo ubuntu-drivers autoinstall 16 | sudo reboot 17 | ``` 18 | 19 | ## Steps 20 | 21 | Standard update/upgrade to start. 22 | ``` 23 | sudo apt-get update 24 | sudo apt-get upgrade -y 25 | ``` 26 | --- 27 | Install Git/Python3 28 | ``` 29 | sudo apt-get install -y git python3 30 | ``` 31 | --- 32 | Install [Kinto](https://github.com/rbreaves/kinto). This converts/remaps alt→ctrl and alt→ctrl+shift in terminal applications. This lets you use hotkeys like cmd+c and cmd+v, but in Linux. 33 | ``` 34 | sudo apt-get install -y xbindkeys xdotool 35 | git clone https://github.com/rbreaves/kinto.git 36 | cd kinto/ 37 | ./setup.py 38 | ``` 39 | The options I selected are: 40 | ``` 41 | One time initialization tweaks are available. Would you like to view them? (Y/n) Y 42 | 1. gnome-init 43 | Description: Gnome - Remove Superkey Overlay keybinding to Activities Overview 44 | run: gsettings set org.gnome.mutter overlay-key '' 45 | 46 | 2. kde-init 47 | Description: KDE Plasma 5 - Removes Superkey Overlay from the Launcher Menu 48 | run: kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta "" 49 | qdbus org.kde.KWin /KWin reconfigure 50 | 51 | Please enter your init tweak(s) (eg 1 or 1 2 3 - leave blank to skip): 1 52 | Dynamic shortcut tweaks 53 | 54 | 1. Gnome Activities Overview 55 | Description: Cmd+Space activates Activities Overview 56 | run in gui mode: gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "['Space']" 57 | run in terminal mode: gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "['Space']" 58 | 59 | Please enter your dynamic shortcut tweak(s) (eg 1 or 1 2 3 - leave blank to skip): 1 60 | 61 | ``` 62 | 63 | --- 64 | Install [Sublime Text 3](https://www.sublimetext.com/). Why? because I'm used to it. Replace with your Editor of choice. 65 | ``` 66 | wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add - 67 | sudo apt-get install apt-transport-https 68 | echo "deb https://download.sublimetext.com/ apt/stable/" | sudo tee /etc/apt/sources.list.d/sublime-text.list 69 | sudo apt-get update 70 | sudo apt-get install sublime-text 71 | ``` 72 | --- 73 | Install [Gnome Tweaks](https://github.com/GNOME/gnome-tweaks) and [Gnome Shell Extensions](https://gitlab.gnome.org/GNOME/gnome-shell-extensions). 74 | 75 | ``` 76 | sudo apt-get install -y gnome-tweaks gnome-shell-extensions 77 | ``` 78 | --- 79 | **OPTIONAL:** 80 | Install [Gnome Shell Integration](https://wiki.gnome.org/Projects/GnomeShellIntegrationForChrome/Installation) 81 | ``` 82 | sudo apt-get install chrome-gnome-shell 83 | ``` 84 | Then, install the [Firefox Extension](https://addons.mozilla.org/en-US/firefox/addon/gnome-shell-integration/) to go with the integration. 85 | 86 | --- 87 | Install [Dash to Dock](https://extensions.gnome.org/extension/307/dash-to-dock/). While it should install via the Gnome Shell Integration, I manually installed/reinstalled mine because I was trying to troubleshoot badge counters. Unsure if the manual installation is necessary. 88 | ``` 89 | cd ~/.local/share/gnome-shell/extensions/ 90 | # check GNOME Shell version 91 | gnome-shell --version 92 | # download zip file inside here (I was on GNOME Shell 3.34 at the time of writing) 93 | # unzip to ~/.local/share/gnome-shell/extensions/dash-to-dock@micxgx.gmail.com 94 | # At this point, might need to restart gnome-shell to get dash to dock working. 95 | killall -3 gnome-shell 96 | ``` 97 | --- 98 | Create themes/icons local directory 99 | ``` 100 | mkdir ~/.themes 101 | mkdir ~/.icons 102 | ``` 103 | Download theme [McOS-CTLina-Gnome-1.3.1.tar.xz](https://www.gnome-look.org/p/1241688/) and extract it to themes directory. 104 | ``` 105 | tar -xf McOS-CTLina-Gnome-1.3.1.tar.xz -C ~/.themes 106 | ``` 107 | Download icon pack [papirus-icon-theme-20200301.tar.xz](https://www.gnome-look.org/s/Gnome/p/1166289/) 108 | ``` 109 | tar -xf papirus-icon-theme-20200301.tar.xz -C ~/.icons 110 | ``` 111 | Alternatively, I also tried [Mojave-CT-Light.tar.xz](https://www.gnome-look.org/s/Gnome/p/1210856). I preferred the Papirus icons, but the Mojave CT icons are going to give you basically clones of the macOS icons if thats what you prefer. 112 | 113 | Open "Gnome Tweaks". These are the tweaks I made, but obviously read the options and use the ones you want. 114 | ``` 115 | Appearance → Theme → McOS-CTLina-Gnome-1.3.1 116 | Appearance → Icons → Papirus 117 | Appearance → Shell → McOS-CTLina-Gnome-1.3.1 118 | Top Bar → Clock → Weekday/Date/Seconds 119 | Windows Titlebars → Placement → Left 120 | ``` 121 | **Note:** After changing the Windows Titlebars to the Left placement, Gnome Tweaks gets all wonky in 19.10. It works fine in 18.04. I don't know how to fix it, and I found that other people are having the same issue. I don't think it's a huge deal though. 122 | 123 | --- 124 | 125 | Open Date & Time Settings. Search for "Date" in the Activities Overview. (cmd+space) 126 | ``` 127 | Automatic Date & Time → True 128 | Automatic Time Zone → True 129 | Time Format → AM/PM 130 | ``` 131 | 132 | --- 133 | 134 | Open Keyboard Shortcuts. Search for "Keyboard Shortcuts" in the Activities Overview. (cmd+space) 135 | ``` 136 | Switch Windows → Ctrl+Tab (cmd+tab) 137 | Screenshots → Shift+Ctrl+$ / Shift+Ctrl+% (to match macOS) 138 | ``` 139 | --- 140 | Edit Dash to Dock settings. 141 | ``` 142 | Gnome Tweaks → Extensions → Dash to Dock → settings icon 143 | Behavior → Click action → Focus or show previews 144 | Appearance → Customize Opacity → Fixed → 40% 145 | ``` 146 | 147 | --- 148 | 149 | Download SFPro Fonts [here](https://github.com/blaisck/sfwin/tree/master/SFPro/TrueType). 150 | Download SFMono Fonts [here](https://github.com/blaisck/sfwin/tree/master/SFMono/TrueType). 151 | 152 | Install the fonts, and then go to 153 | ``` 154 | Gnome Tweaks → Fonts → Interface Text → SFProDisplay-Regular.ttf 155 | Gnome Tweaks → Fonts → Document Text → SFProText-Regular.ttf 156 | Gnome Tweaks → Fonts → Monospace Text → SFMono-Regular.ttf 157 | Gnome Tweaks → Fonts → Monospace Text →SFProDisplay-Bold.ttf 158 | ``` 159 | 160 | --- 161 | 162 | One thing that annoyed me about the `McOS-CTLina-Gnome-1.3.1` theme was that the top-left icon was an Apple logo. I'm not using an Apple computer, so it didn't make much sense to me. I edited it out and replaced it with an orange Ubuntu logo instead. 163 | 164 | Open up `~/.themes/McOS-CTLina-Gnome-1.3.1/gnome-shell/gnome-shell.css` 165 | Edit in the following: 166 | ``` 167 | #panel #panelActivities.panel-button > * { 168 | /* 169 | background-image: url("assets/activities.svg"); 170 | */ 171 | background-image: url("assets/ubuntu.png"); 172 | background-size: 20px 20px; 173 | background-position: center top; 174 | width: 24px; 175 | height: 24px; 176 | background-color: transparent !important; 177 | background-gradient-direction: none !important; 178 | border: none; 179 | color: transparent; 180 | } 181 | ``` 182 | I then went to [FlatIcon](https://www.flaticon.com/) and found the Ubuntu logo and downloaded the 24x24px .png file. Place `ubuntu.png` inside `~/.themes/McOS-CTLina-Gnome-1.3.1/gnome-shell/assets`. 183 | 184 | --- 185 | 186 | I also installed nemo as it is much closer to mac's Finder compared to Nautilus. Unfortunately, I couldn't get Pantheon Files to work correctly (couldn't move files around) so that was a bust. 187 | ``` 188 | sudo apt-get install -y nemo 189 | ``` 190 | You can find Nemo in the Activity Overview and searching for "nemo" or "Files". 191 | If you choose to use nemo as well, the original mcOS theme I linked previously seems to break. I replaced it with 192 | [McOS-CTLina-Mint.tar.gz](https://www.gnome-look.org/p/1328034/). I am still using the original McOS theme for my Shell theme though. 193 | -------------------------------------------------------------------------------- /docs/ubuntu/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonchun/ubuntu2macOS/1f4b074e4be3761eac0ad8d4adf9119bcf8bb72b/docs/ubuntu/1.png -------------------------------------------------------------------------------- /docs/ubuntu/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonchun/ubuntu2macOS/1f4b074e4be3761eac0ad8d4adf9119bcf8bb72b/docs/ubuntu/2.png -------------------------------------------------------------------------------- /images/ubuntu_18_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonchun/ubuntu2macOS/1f4b074e4be3761eac0ad8d4adf9119bcf8bb72b/images/ubuntu_18_1.png -------------------------------------------------------------------------------- /images/ubuntu_20_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonchun/ubuntu2macOS/1f4b074e4be3761eac0ad8d4adf9119bcf8bb72b/images/ubuntu_20_1.png -------------------------------------------------------------------------------- /images/ubuntu_20_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonchun/ubuntu2macOS/1f4b074e4be3761eac0ad8d4adf9119bcf8bb72b/images/ubuntu_20_2.png -------------------------------------------------------------------------------- /images/ubuntu_20_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonchun/ubuntu2macOS/1f4b074e4be3761eac0ad8d4adf9119bcf8bb72b/images/ubuntu_20_3.png -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import logging 4 | import subprocess 5 | import os 6 | from pathlib import Path 7 | import platform 8 | 9 | logger = logging.getLogger('ubuntu2mac') 10 | 11 | def configure_logging(): 12 | logger.setLevel(logging.DEBUG) 13 | formatter = logging.Formatter('[%(levelname)s] %(name)s-%(asctime).19s | %(message)s') 14 | # create file handler which logs all debug messages 15 | fh = logging.FileHandler('ubuntu2mac.log') 16 | fh.setLevel(logging.DEBUG) 17 | fh.setFormatter(formatter) 18 | logger.addHandler(fh) 19 | 20 | # create console handler with a higher log level 21 | console_formatter = logging.Formatter('[%(levelname)s] %(message)s') 22 | ch = logging.StreamHandler() 23 | ch.setLevel(logging.INFO) 24 | ch.setFormatter(console_formatter) 25 | logger.addHandler(ch) 26 | 27 | def gnome_extension(extension_name, command=''): 28 | try: 29 | cmd = subprocess.check_output(['which', 'gnome-extensions']).decode().strip() 30 | subprocess.check_output([cmd, command, extension_name]) 31 | except subprocess.CalledProcessError: 32 | try: 33 | cmd = subprocess.check_output(['which', 'gnome-shell-extension-tool']).decode().strip() 34 | subprocess.check_output([cmd, '--{}'.format(command), extension_name]) 35 | except subprocess.CalledProcessError: 36 | logger.error('Unable to %s with gnome extension tools... Skipping %s', command, extension_name) 37 | return 1 38 | logger.info('Changed extension: `%s` | %s', extension_name, command) 39 | return 0 40 | 41 | def disable_gnome_extension(extension_name): 42 | return gnome_extension(extension_name, 'disable') 43 | 44 | def enable_gnome_extension(extension_name): 45 | return gnome_extension(extension_name, 'enable') 46 | 47 | def lsb_release(): 48 | lsb_output = subprocess.check_output(['lsb_release', '-a'], stderr=subprocess.DEVNULL).decode() 49 | lsb_split = lsb_output.split('\n') 50 | distributor = '' 51 | release = '' 52 | codename = '' 53 | for line in lsb_split: 54 | if 'distributor' in line.lower(): 55 | distributor = line.split(':')[1].strip() 56 | elif 'release' in line.lower(): 57 | release = line.split(':')[1].strip() 58 | elif 'codename' in line.lower(): 59 | codename = line.split(':')[1].strip() 60 | 61 | return (distributor, release, codename) 62 | 63 | def yes_no(prompt=''): 64 | while True: 65 | reply = input(prompt).lower().strip() 66 | if reply in ['y', 'yes']: 67 | return True 68 | if reply in ['n', 'no']: 69 | return False 70 | logger.error('Invalid Response! Please enter Yes/No') 71 | 72 | 73 | def menu(prompt='', choices=[], default=0): 74 | while True: 75 | print(prompt) 76 | for index, choice in enumerate(choices, 1): 77 | print(' {} - {}'.format(index, choice)) 78 | reply = input('Choice: ').lower().strip() 79 | try: 80 | reply = int(reply) - 1 81 | if reply < 0: 82 | raise ValueError 83 | choice = choices[reply] 84 | return choice 85 | except (IndexError, ValueError): 86 | logger.error('Invalid Response! Please try again.') 87 | 88 | def install_packages(package_names): 89 | command = ['sudo', 'apt-get', 'install', '-y'] 90 | command.extend(package_names) 91 | logger.info('Installing %s...', package_names) 92 | p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 93 | stdout, stderr = p.communicate() 94 | if p.returncode != 0: 95 | logger.error('Error while installing `%s`. Error Code %s.', package_names, p.returncode) 96 | logger.error(stderr.decode().strip()) 97 | return 1 98 | return 0 99 | 100 | def add_repo(repo): 101 | logger.info('Adding %s repo to sources...', repo) 102 | command = ['sudo', 'add-apt-repository', '-y', repo] 103 | try: 104 | subprocess.check_call(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 105 | return 0 106 | except subprocess.CalledProcessError: 107 | logger.error('Error while adding repo: `%s`', repo) 108 | return 1 109 | 110 | def remove_packages(package_names): 111 | command = ['sudo', 'apt-get', 'remove', '-y'] 112 | command.extend(package_names) 113 | logger.info('Removing %s...', package_names) 114 | p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 115 | stdout, stderr = p.communicate() 116 | if p.returncode != 0: 117 | logger.error('Error while removing `%s`. Error Code %s.', package_names, p.returncode) 118 | logger.error(stderr.decode().strip()) 119 | return 1 120 | return 0 121 | 122 | def git_clone(url, target): 123 | repo_name = url.split('/')[-1].rstrip('.git') 124 | command = ['git', '-C', target, 'clone', url] 125 | logger.info('Cloning repo %s...', repo_name) 126 | p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 127 | stdout, stderr = p.communicate() 128 | if p.returncode != 0: 129 | logger.error('Error while git cloning `%s`!', url) 130 | logger.error(stderr.decode().strip()) 131 | return 1 132 | return 0 133 | 134 | def gsettings_set(schema, key, val): 135 | command = ['gsettings', 'set', schema, key, val] 136 | try: 137 | subprocess.check_call(command) 138 | return 0 139 | except subprocess.CalledProcessError: 140 | logger.error('Error while setting `%s` to %s.', key, val) 141 | return 1 142 | 143 | def refresh_fonts(): 144 | logger.info('Refreshing font cache... This may take a while...') 145 | command = ['fc-cache', '-fv'] 146 | try: 147 | subprocess.check_call(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 148 | return 0 149 | except subprocess.CalledProcessError: 150 | logger.error('Error while refreshing font cache') 151 | return 1 152 | 153 | def run_shell(shell_command): 154 | # For when I'm being lazy and don't want to do it correctly. Will fix eventually.. 155 | p = subprocess.Popen(shell_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) 156 | stdout, stderr = p.communicate() 157 | if p.returncode != 0: 158 | logger.error(stderr.decode().strip()) 159 | return 1 160 | return 0 161 | 162 | def install(options): 163 | error_count = 0 164 | error_count += install_packages(['git', 'python3', 'gnome-tweaks', 'gnome-shell-extensions']) 165 | 166 | logger.info('Configuring some tweaks...') 167 | 168 | # This seems backwards to me, but that is what the setting seems to be when testing on 20.04 169 | if options['scroll_direction'] == 'Windows': 170 | gsettings_set('org.gnome.desktop.peripherals.mouse', 'natural-scroll', 'true') 171 | elif options['scroll_direction'] == 'macOS': 172 | gsettings_set('org.gnome.desktop.peripherals.mouse', 'natural-scroll', 'false') 173 | 174 | logger.info('Installing themes...') 175 | home = Path.home() 176 | icon_dir = home / Path('.icons') 177 | theme_dir = home / Path('.themes') 178 | sources_dir = home / Path('sources') 179 | font_dir = home / Path('.local/share/fonts') 180 | plank_theme_dir = Path('.local/share/plank/themes') 181 | 182 | icon_dir.mkdir(exist_ok=True, parents=True) 183 | theme_dir.mkdir(exist_ok=True, parents=True) 184 | sources_dir.mkdir(exist_ok=True, parents=True) 185 | font_dir.mkdir(exist_ok=True, parents=True) 186 | plank_theme_dir.mkdir(exist_ok=True, parents=True) 187 | 188 | # Theme 189 | git_clone('https://github.com/paullinuxthemer/Mc-OS-themes.git', str(sources_dir)) 190 | error_count += run_shell('ln -s ~/sources/Mc-OS-themes/McOS-CTLina-Gnome-1.3 ~/.themes') 191 | error_count += run_shell('ln -s ~/sources/Mc-OS-themes/Mc-OS-CTLina-Gnome-Dark-1.3 ~/.themes') 192 | error_count += run_shell('ln -s ~/sources/Mc-OS-themes/McOS-CTLina-Mint ~/.themes') 193 | error_count += run_shell('ln -s ~/sources/Mc-OS-themes/McOS-CTLina-Mint-Dark ~/.themes') 194 | 195 | if options['theme_style'] == 'Light': 196 | error_count += gsettings_set('org.gnome.desktop.interface', 'gtk-theme', 'McOS-CTLina-Gnome-1.3') 197 | elif options['theme_style'] == 'Dark': 198 | error_count += gsettings_set('org.gnome.desktop.interface', 'gtk-theme', 'Mc-OS-CTLina-Gnome-Dark-1.3') 199 | 200 | # Enable Shell Theme 201 | error_count += enable_gnome_extension('user-theme@gnome-shell-extensions.gcampax.github.com') 202 | if options['theme_style'] == 'Light': 203 | error_count += gsettings_set('org.gnome.shell.extensions.user-theme', 'name', 'McOS-CTLina-Gnome-1.3') 204 | elif options['theme_style'] == 'Dark': 205 | error_count += gsettings_set('org.gnome.shell.extensions.user-theme', 'name', 'Mc-OS-CTLina-Gnome-Dark-1.3') 206 | 207 | # Fonts 208 | git_clone('https://github.com/blaisck/sfwin.git', str(sources_dir)) 209 | run_shell('ln -s ~/sources/sfwin/SF* ~/.local/share/fonts') 210 | refresh_fonts() 211 | error_count += gsettings_set('org.gnome.desktop.interface', 'font-name', "'SF Pro Display 11'") 212 | error_count += gsettings_set('org.gnome.desktop.interface', 'document-font-name', "'SF Pro Text 11'") 213 | error_count += gsettings_set('org.gnome.desktop.interface', 'monospace-font-name', "'SF Mono 11'") 214 | error_count += gsettings_set('org.gnome.desktop.wm.preferences', 'titlebar-font', "'SF Pro Display Bold 11'") 215 | 216 | # Icons 217 | if 'Numix' in options['icon_style']: 218 | error_count += add_repo('ppa:numix/ppa') 219 | error_count += install_packages(['numix-icon-theme']) 220 | if options['icon_style'] == 'Numix Circle': 221 | error_count += install_packages(['numix-icon-theme-circle']) 222 | if options['theme_style'] == 'Light': 223 | icon_theme = 'Numix-Circle-Light' 224 | elif options['theme_style'] == 'Dark': 225 | icon_theme = 'Numix-Circle' 226 | error_count += gsettings_set('org.gnome.desktop.interface', 'icon-theme', icon_theme) 227 | elif options['icon_style'] == 'Numix': 228 | icon_theme = 'Numix' 229 | error_count += gsettings_set('org.gnome.desktop.interface', 'icon-theme', icon_theme) 230 | elif options['icon_style'] == 'Papirus': 231 | error_count += add_repo('ppa:papirus/papirus') 232 | error_count += install_packages(['papirus-icon-theme']) 233 | if options['theme_style'] == 'Light': 234 | icon_theme = 'Papirus-Light' 235 | elif options['theme_style'] == 'Dark': 236 | icon_theme = 'Papirus-Dark' 237 | error_count += gsettings_set('org.gnome.desktop.interface', 'icon-theme', icon_theme) 238 | 239 | # Dock 240 | # error_count += remove_packages(['gnome-shell-extension-ubuntu-dock']) 241 | error_count += disable_gnome_extension('ubuntu-dock@ubuntu.com') 242 | error_count += disable_gnome_extension('dash-to-dock@micxgx.gmail.com') 243 | error_count += install_packages(['plank']) 244 | p = subprocess.Popen('killall plank > /dev/null 2>&1', shell=True) 245 | git_clone('https://github.com/kennyh0727/plank-themes.git', str(sources_dir)) 246 | 247 | logger.info('Configuring Plank...') 248 | autostart = home / Path('.config/autostart') 249 | autostart.mkdir(exist_ok=True, parents=True) 250 | plank_desktop_file = home / Path('.config/autostart/plank.desktop') 251 | plank_desktop_contents = '''[Desktop Entry] 252 | Type=Application 253 | Exec=/usr/bin/plank 254 | Hidden=false 255 | NoDisplay=false 256 | X-GNOME-Autostart-enabled=true 257 | Name[en_US]=Plank 258 | Name=Plank 259 | Comment[en_US]=Plank Dock 260 | Comment=Plank Dock''' 261 | 262 | with plank_desktop_file.open('w') as f: 263 | f.write(plank_desktop_contents) 264 | 265 | p = subprocess.Popen('gtk-launch plank.desktop > /dev/null 2>&1', shell=True) 266 | 267 | if options['theme_style'] == 'Light': 268 | plank_theme = 'anti-shade' 269 | elif options['theme_style'] == 'Dark': 270 | plank_theme = 'shade' 271 | error_count += run_shell('dconf write /net/launchpad/plank/docks/dock1/theme "\'{}\'"'.format(plank_theme)) 272 | error_count += run_shell('dconf write /net/launchpad/plank/docks/dock1/zoom-percent 125') 273 | error_count += run_shell('dconf write /net/launchpad/plank/docks/dock1/zoom-enabled true') 274 | error_count += run_shell('dconf write /net/launchpad/plank/docks/dock1/hide-mode "\'window-dodge\'"') 275 | 276 | run_shell('ln -s ~/sources/plank-themes/shade ~/.local/share/plank/themes') 277 | run_shell('ln -s ~/sources/plank-themes/anti-shade ~/.local/share/plank/themes') 278 | 279 | # Window Titlebars 280 | error_count += gsettings_set('org.gnome.desktop.wm.preferences', 'titlebar-uses-system-font', 'true') 281 | error_count += gsettings_set('org.gnome.desktop.wm.preferences', 'button-layout', '"close,minimize,maximize:"') 282 | error_count += gsettings_set('org.gnome.mutter', 'center-new-windows', 'true') 283 | 284 | # Change Terminal Settings 285 | error_count += gsettings_set('org.gnome.Terminal.Legacy.Settings', 'theme-variant', "'system'") 286 | 287 | # Restart gnome-shell 288 | error_count += run_shell('killall -3 gnome-shell') 289 | 290 | # Kinto 291 | error_count += install_packages(['xbindkeys', 'xdotool', 'ibus']) 292 | error_count += git_clone('https://github.com/rbreaves/kinto.git', str(sources_dir)) 293 | subprocess.run('cd {}/kinto && python3 setup.py'.format(sources_dir), shell=True) 294 | 295 | logger.info('Kinto setup complete. Restart keyswap service for good measure...') 296 | p = subprocess.Popen('systemctl --user restart keyswap > /dev/null 2>&1', shell=True) 297 | logger.info('ubuntu2macOS has completed setup! Enjoy!') 298 | 299 | def main(): 300 | configure_logging() 301 | distro_name, distro_version, distro_codename = lsb_release() 302 | 303 | if distro_name.lower() not in ['ubuntu']: 304 | logger.warn('Ubuntu not detected! Your distro is `%s`. This script will likely fail.', distro_name) 305 | if not yes_no('Would you like to continue? (y/n): '): 306 | exit(1) 307 | 308 | tested_distros = ['18.04', '20.04'] 309 | if distro_version.lower() not in tested_distros: 310 | logger.warn('Your distro version is `%s`, but this script has only been tested against [%s]', distro_version, ', '.join(tested_distros)) 311 | if not yes_no('Would you like to continue? (y/n): '): 312 | exit(1) 313 | 314 | options = {} 315 | options['theme_style'] = menu('Choose a theme style:', ['Light', 'Dark']) 316 | options['icon_style'] = menu('Choose a icon style:', ['Numix Circle', 'Papirus', 'Numix']) 317 | options['scroll_direction'] = menu('Choose a scrolling direction:', ['macOS', 'Windows']) 318 | install(options) 319 | 320 | if __name__ == '__main__': 321 | try: 322 | main() 323 | except KeyboardInterrupt: 324 | print('') 325 | logger.error('Exiting due to user interrupt.') 326 | --------------------------------------------------------------------------------