Skip to content

Instantly share code, notes, and snippets.

@huytd huytd/emacs.init.el
Last active Apr 17, 2019

What would you like to do?
Emacs config with no Evil
;; Package configs
(require 'package)
(setq package-enable-at-startup nil)
(setq package-archives '(("org" . "")
("gnu" . "")
("melpa" . "")))
;; Bootstrap `use-package`
(unless (package-installed-p 'use-package)
(package-install 'use-package))
(require 'use-package)
;; Custom packages
(add-to-list 'load-path "/Users/huy/.emacs.d/custom-scripts/")
(require 'textobject)
;; Other configs
(setq confirm-kill-emacs 'yes-or-no-p)
(global-auto-revert-mode 1)
(setq ring-bell-function 'ignore)
(defalias 'yes-or-no-p 'y-or-n-p)
(let ((path (shell-command-to-string ". /Users/huy/.bash_profile; echo -n $PATH")))
(setenv "PATH" path)
(setq exec-path
(split-string-and-unquote path ":")
(setq make-backup-files nil)
(setq auto-save-default nil)
(setq lazy-highlight-cleanup nil)
(setq-default tab-width 2)
(setq-default default-tab-width 2)
(setq-default indent-tabs-mode nil)
(setq truncate-lines nil)
;; Linum enhancement
(setq linum-format " %3d ")
(defun enhance-ui-for-orgmode ()
"Enhance UI for orgmode."
(org-bullets-mode 1)
(org-autolist-mode 1)
(linum-mode nil)
(dolist (face '(org-level-1 org-level-2 org-level-3 org-level-4 org-level-5))
(set-face-attribute face nil :height 1.0 :background nil))
(defun kill-other-buffers ()
"Kill all other buffers."
(mapc 'kill-buffer (delq (current-buffer) (buffer-list))))
;; Deleting
(delete-selection-mode 1)
;; Some term enhancement
(defadvice term-sentinel (around my-advice-term-sentinel (proc msg))
(if (memq (process-status proc) '(signal exit))
(let ((buffer (process-buffer proc)))
(kill-buffer buffer))
(ad-activate 'term-sentinel)
(defadvice term (before force-bash)
(interactive (list "/bin/zsh")))
(ad-activate 'term)
(add-hook 'term-mode-hook (lambda ()
(linum-mode -1)
(local-unset-key (kbd "C-r"))))
(use-package multi-term
:ensure t
(setq multi-term-program "/bin/zsh"))
;; Splash Screen
(setq inhibit-startup-screen t)
(setq initial-scratch-message ";; Happy Hacking")
;; Appointment Setup
(require 'appt)
(setq appt-time-msg-list nil
appt-display-interval '2
appt-message-warning-time '10
appt-display-mode-line t
appt-display-format 'window)
(appt-activate 1)
(run-at-time "24:01" 3600 'org-agenda-to-appt)
(add-hook 'org-finalize-agenda-hook 'org-agenda-to-appt)
(defvar terminal-notifier-path
(defun user-appt-send-notification (title msg)
(shell-command (concat terminal-notifier-path
" -message " msg
" -title " title
" -timeout 59 -appIcon /Applications/")))
(defun user-appt-display (min-to-app new-time msg)
(format "'🔥 Appointment in %s minutes'" min-to-app)
(format "'%s'" msg)))
(setq appt-disp-window-function (function user-appt-display))
;; Show and jump between matching parens
(setq show-paren-delay 0)
(show-paren-mode 1)
(global-set-key "%" 'match-paren)
(defun match-paren (arg)
"Go to the matching paren if on a paren; otherwise insert %."
(interactive "p")
(cond ((looking-at "\\s(") (forward-list 1) (backward-char 1))
((looking-at "\\s)") (forward-char 1) (backward-list 1))
(t (self-insert-command (or arg 1)))))
;; Custom copy line function
(defun copy-line (arg)
"Copy lines (as many as prefix argument) in the kill ring.
Ease of use features:
- Move to start of next line.
- Appends the copy on sequential calls.
- Use newline as last char even on the last line of the buffer.
- If region is active, copy its lines."
(interactive "p")
(let ((beg (line-beginning-position))
(end (line-end-position arg)))
(when mark-active
(if (> (point) (mark))
(setq beg (save-excursion (goto-char (mark)) (line-beginning-position)))
(setq end (save-excursion (goto-char (mark)) (line-end-position)))))
(if (eq last-command 'copy-line)
(kill-append (buffer-substring beg end) (< end beg))
(kill-ring-save beg end)))
(kill-append "\n" nil)
(beginning-of-line (or (and arg (1+ arg)) 2))
(if (and arg (not (= 1 arg))) (message "%d lines copied" arg)))
;; Custom keybinding
;; Movement and editing
(global-set-key (kbd "C-0") 'beginning-of-line)
(global-set-key (kbd "C-o") (lambda ()
"insert new line"
(global-set-key (kbd "C-c C-l") 'copy-line)
(global-set-key (kbd "C-c >") 'indent-rigidly-right-to-tab-stop)
(global-set-key (kbd "C-c <") 'indent-rigidly-left-to-tab-stop)
;; Searching
(global-set-key (kbd "C-x /") 'helm-projectile-ag)
(global-set-key (kbd "C-x .") 'helm-resume)
;; Functions
(global-set-key (kbd "C-c SPC") 'helm-imenu)
(global-set-key (kbd "C-.") 'repeat)
(global-set-key (kbd "C-=") 'helm-M-x)
(global-set-key (kbd "C-c p p") 'helm-projectile-switch-project)
(global-set-key (kbd "C-c p f") 'helm-projectile-find-file)
(global-set-key (kbd "C-c f e d") (lambda ()
"open emacs config"
(find-file "~/.emacs.d/init.el")))
(global-set-key (kbd "C-c f e R") (lambda ()
"reload emacs config"
(load-file "~/.emacs.d/init.el")))
(global-set-key (kbd "C-c a t") 'multi-term)
(global-set-key (kbd "C-c f t") 'neotree-toggle)
(global-set-key (kbd "C-c C-c") 'lazy-highlight-cleanup)
(global-set-key (kbd "C-c TAB") 'previous-buffer)
(global-set-key (kbd "C-x p r") 'helm-show-kill-ring)
(global-set-key (kbd "C-z") 'undo)
(global-set-key (kbd "M-d") (lambda ()
"delete word sexp"
;; Window management
(global-set-key (kbd "C-c /") 'split-window-right)
(global-set-key (kbd "C-c \\") 'split-window-below)
(global-set-key (kbd "C-c l") 'windmove-right)
(global-set-key (kbd "C-c h") 'windmove-left)
(global-set-key (kbd "C-c k") 'windmove-up)
(global-set-key (kbd "C-c j") 'windmove-down)
(global-set-key (kbd "C-c =") 'balance-windows)
;; org journal
(global-set-key (kbd "C-c t n") 'org-journal-list--start)
(global-set-key (kbd "C-c t d") (lambda ()
"open agenda"
(org-agenda nil "c")))
(use-package htmlize :ensure t)
(use-package org-autolist :ensure t)
(use-package org-bullets
:ensure t)
(use-package deft
:ensure t
(setq deft-directory "/Users/huy/notes/"
deft-recursive t
deft-default-extension "org"
deft-text-mode 'org-mode
deft-use-filter-string-for-filename t)
(global-set-key (kbd "C-c d") 'deft))
;; OrgMode Configs
(setq org-startup-with-inline-images t)
(setq org-image-actual-width nil)
(setq org-link-frame-setup '((file . find-file)))
(defun org-sitemap-custom-entry-format (entry style project)
(let ((filename (org-publish-find-title entry project)))
(if (= (length filename) 0)
(format "*%s*" entry)
(format "%s - [[file:%s][%s]]"
(format-time-string "%Y-%m-%d" (org-publish-find-date entry project))
(setq org-publish-project-alist
:base-directory "/Users/huy/notes/src/"
:base-extension "org"
:publishing-directory "/Users/huy/code/play/"
:recursive t
:publishing-function org-html-publish-to-html
:exclude ".*/private/.*"
:auto-sitemap t
:sitemap-filename ""
:sitemap-title "/users/huy/notes"
:sitemap-format-entry org-sitemap-custom-entry-format
:html-head-extra "<link rel=\"stylesheet\" href=\"/_css/style.css\">"
:html-link-home "/")
:base-directory "/Users/huy/notes/src/"
:recursive t
:base-extension "jpg\\|png\\|gif\\|mp4"
:publishing-directory "/Users/huy/code/play/"
:publishing-function org-publish-attachment)
("notes" :components ("org-notes" "org-notes-static"))))
(add-to-list 'org-structure-template-alist
'("o" "#+TITLE: ?\n#+DATE: "))
(dolist (hook '(text-mode-hook))
(add-hook hook (lambda () (flyspell-mode 1))))
(add-hook 'org-mode-hook 'enhance-ui-for-orgmode)
(defun filter-org-skip-subtree-if-priority (priority)
"Skip an agenda subtree if it has a priority of PRIORITY.
PRIORITY may be one of the characters ?A, ?B, or ?C."
(let ((subtree-end (save-excursion (org-end-of-subtree t)))
(pri-value (* 1000 (- org-lowest-priority priority)))
(pri-current (org-get-priority (thing-at-point 'line t))))
(if (= pri-value pri-current)
(load-library "find-lisp")
(setq org-agenda-files (find-lisp-find-files "/Users/huy/notes/src/" "\.org$"))
(setq org-agenda-window-setup 'only-window)
(setq org-agenda-custom-commands
'(("c" "Custom agenda view"
((tags "PRIORITY=\"A\""
((org-agenda-overriding-header "High-priority unfinished tasks:")
(org-agenda-skip-function '(org-agenda-skip-if nil '(todo done)))))
(agenda "")
(alltodo ""
((org-agenda-skip-function '(or (filter-org-skip-subtree-if-priority ?A)
(org-agenda-skip-if nil '(scheduled deadline))))))
(setq org-return-follows-link t)
(setq org-hide-emphasis-markers t)
(setq org-html-validation-link nil)
(setq org-todo-keywords
'((sequence "TODO" "WORKING" "HOLD" "|" "DONE")))
(setq org-todo-keyword-faces
'(("TODO" . "#eb4d4b")
("WORKING" . "#f0932b")
("HOLD" . "#eb4d4b")
("DONE" . "#6ab04c")))
;; UI configurations
(scroll-bar-mode -1)
(tool-bar-mode -1)
(tooltip-mode -1)
(menu-bar-mode -1)
(global-linum-mode 1)
(setq-default line-spacing 1)
(add-to-list 'default-frame-alist '(font . "Code New Roman-14:antialias=true:hinting=false"))
(add-to-list 'default-frame-alist '(height . 38))
(add-to-list 'default-frame-alist '(width . 128))
(setq left-fringe-width 12)
;; Anzu for search matching
(use-package anzu
:ensure t
(global-anzu-mode 1)
(global-set-key [remap query-replace-regexp] 'anzu-query-replace-regexp)
(global-set-key [remap query-replace] 'anzu-query-replace))
;; Theme
(use-package doom-themes
:ensure t
(load-theme 'doom-one-light t))
(add-to-list 'custom-theme-load-path "/Users/huy/.emacs.d/custom-themes/")
;; Helm
(use-package helm
:ensure t
(setq helm-M-x-fuzzy-match t
helm-mode-fuzzy-match t
helm-buffers-fuzzy-matching t
helm-recentf-fuzzy-match t
helm-locate-fuzzy-match t
helm-semantic-fuzzy-match t
helm-imenu-fuzzy-match t
helm-completion-in-region-fuzzy-match t
helm-candidate-number-list 80
helm-split-window-in-side-p t
helm-move-to-line-cycle-in-source t
helm-echo-input-in-header-line t
helm-autoresize-max-height 0
helm-autoresize-min-height 20)
(helm-mode 1)
(define-key helm-map (kbd "<tab>") 'helm-execute-persistent-action)
(define-key helm-map (kbd "C-z") 'helm-select-action))
;; RipGrep
(use-package helm-rg :ensure t)
;; AG
(use-package helm-ag :ensure t)
;; Projectile
(use-package projectile
:ensure t
(setq projectile-require-project-root nil)
(projectile-mode 1))
;; Helm Projectile
(use-package helm-projectile
:ensure t
(setq helm-projectile-fuzzy-match t)
;; All The Icons
(use-package all-the-icons :ensure t)
;; NeoTree
(use-package neotree
:ensure t
(setq neo-theme (if (display-graphic-p) 'icons 'arrow)))
;; Which Key
(use-package which-key
:ensure t
(setq which-key-separator " ")
(setq which-key-prefix-prefix "+")
;; Editorconfig
(use-package editorconfig
:ensure t
(editorconfig-mode 1))
;; Git Diff
(use-package diff-hl
:ensure t
(global-diff-hl-mode 1))
;; Fancy titlebar for MacOS
(add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))
(add-to-list 'default-frame-alist '(ns-appearance . dark))
(setq ns-use-proxy-icon nil)
(setq frame-title-format nil)
(setq mac-allow-anti-aliasing t)
(setq mac-command-modifier 'meta)
(global-set-key (kbd "M-`") 'other-frame)
;; JavaScript and TypeScript
(use-package js2-mode
:ensure t
(add-to-list 'auto-mode-alist '("\\.js\\'" . js2-mode)))
(use-package tide
:ensure t
:after (typescript-mode company flycheck)
:hook ((typescript-mode . tide-setup)
(typescript-mode . tide-hl-identifier-mode)
(js2-mode . tide-setup)
(js2-mode . tide-hl-identifier-mode)
(before-save . tide-formater-before-save)))
(use-package web-mode
:ensure t
(add-to-list 'auto-mode-alist '("\\.html?\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.tsx\\'" . typescript-mode))
(setq web-mode-enable-current-element-highlight t))
;; Journal List
(use-package org-journal-list
:load-path "~/code/play/org-journal-list/"
(setq org-journal-list-default-directory "/Users/huy/notes/src/")
(setq org-journal-list-create-temp-buffer t))
;; Flycheck
(use-package flycheck
:ensure t
(add-hook 'prog-mode-hook 'flycheck-mode))
;; LSP
(use-package lsp-mode
:ensure t
(add-hook 'rust-mode-hook 'lsp))
(use-package lsp-ui
:ensure t
(add-hook 'lsp-mode-hook 'lsp-ui-mode)
(setq lsp-ui-doc-enable nil
lsp-ui-peek-enable nil
eldoc-echo-area-use-multiline-p nil))
;; Company mode
(use-package company
:ensure t
(setq company-minimum-prefix-length 3)
(setq company-auto-complete nil)
(setq company-idle-delay 0.1)
(setq company-require-match 'never)
(setq company-frontends
(setq tab-always-indent 'complete)
(defvar completion-at-point-functions-saved nil)
(global-company-mode 1)
(define-key company-active-map (kbd "TAB") 'company-complete-common-or-cycle)
(define-key company-active-map (kbd "<tab>") 'company-complete-common-or-cycle)
(define-key company-active-map (kbd "S-TAB") 'company-select-previous)
(define-key company-active-map (kbd "<backtab>") 'company-select-previous)
(define-key company-mode-map [remap indent-for-tab-command] 'company-indent-for-tab-command)
(defun company-indent-for-tab-command (&optional arg)
(interactive "P")
(let ((completion-at-point-functions-saved completion-at-point-functions)
(completion-at-point-functions '(company-complete-common-wrapper)))
(indent-for-tab-command arg)))
(defun company-complete-common-wrapper ()
(let ((completion-at-point-functions completion-at-point-functions-saved))
;; Rust
(use-package rust-mode
:ensure t
(add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-mode)))
(use-package cargo
:ensure t
(add-hook 'rust-mode-hook 'cargo-minor-mode))
;; Modeline
(use-package doom-modeline
:ensure t
:defer t
(setq doom-modeline-height 22)
:hook (after-init . doom-modeline-init))
(use-package hide-mode-line
:ensure t)
;; Quickrun
(use-package quickrun
:ensure t
(global-set-key (kbd "s-<return>") 'quickrun)
(quickrun-add-command "typescript"
'((:command . "ts-node")
(:exec . ("%c %s")))
:mode "typescript"
:override t)
;; Spell check
(use-package langtool
:ensure t
(setq langtool-java-classpath "/Users/huy/langtool:/Users/huy/langtool/*")
(setq langtool-language-tool-jar "/Users/huy/langtool/languagetool-commandline.jar"))
;; Writegood
(use-package writegood-mode :ensure t)
;; Elm
(use-package elm-mode
:ensure t
(add-to-list 'company-backends 'company-elm))
;; Haskell
(use-package haskell-mode
:ensure t)
;; Magit
(use-package magit :ensure t)
;; A hack for fixing projectile with ag/rg
;; Source:
(defun helm-projectile-ag (&optional options)
"Helm version of projectile-ag."
(interactive (if current-prefix-arg (list (read-string "option: " "" 'helm-ag--extra-options-history))))
(if (require 'helm-ag nil 'noerror)
(if (projectile-project-p)
(let ((helm-ag-command-option options)
(current-prefix-arg nil))
(helm-do-ag (projectile-project-root) (car (projectile-parse-dirconfig-file))))
(error "You're not in a project"))
(error "helm-ag not available")))
;; IRC
(defun user/rcirc-print-function (process sender response target text)
(if (not (eq target nil))
(with-current-buffer (rcirc-get-buffer process target)
((and (equal sender (rcirc-nick process))
(equal response "JOIN"))
(when (member target neale/rcirc-ignored-channels)
(setq rcirc-ignore-buffer-activity-flag t)))))))
(add-hook 'rcirc-print-functions 'user/rcirc-print-function)
;; Smooth scroll
(pixel-scroll-mode 1)
;; Automatically generated
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(anzu-cons-mode-line-p nil)
("732b807b0543855541743429c9979ebfb363e27ec91e82f463c91e68c772f6e3" "b54826e5d9978d59f9e0a169bbd4739dd927eead3ef65f56786621b53c031a7c" "2dfbe4e74de7139da2bb031054a651e1587d821b10439ca64d469c31ac3cafa5" "54472f6db535c18d72ca876a97ec4a575b5b51d7a3c1b384293b28f1708f961a" "151bde695af0b0e69c3846500f58d9a0ca8cb2d447da68d7fbf4154dcf818ebc" "b35a14c7d94c1f411890d45edfb9dc1bd61c5becd5c326790b51df6ebf60f402" "3898b4f9c3f6f2994f5010f766a7f7dac4ee2a5c5eb18c429ab8e71c5dad6947" "896e853cbacc010573cd82b6cf582a45c46abe2e45a2f17b74b4349ff7b29e34" "4697a2d4afca3f5ed4fdf5f715e36a6cac5c6154e105f3596b44a4874ae52c45" "6b289bab28a7e511f9c54496be647dc60f5bd8f9917c9495978762b99d8c96a0" "ecba61c2239fbef776a72b65295b88e5534e458dfe3e6d7d9f9cb353448a569e" "3a3de615f80a0e8706208f0a71bbcc7cc3816988f971b6d237223b6731f91605" "a3fa4abaf08cc169b61dea8f6df1bbe4123ec1d2afeb01c17e11fdc31fc66379" "a566448baba25f48e1833d86807b77876a899fc0c3d33394094cf267c970749f" "fe666e5ac37c2dfcf80074e88b9252c71a22b6f5d2f566df9a7aa4f9bea55ef8" "cd736a63aa586be066d5a1f0e51179239fe70e16a9f18991f6f5d99732cabb32" "b4c13d25b1f9f66eb769e05889ee000f89d64b089f96851b6da643cee4fdab08" "9d9fda57c476672acd8c6efeb9dc801abea906634575ad2c7688d055878e69d6" default)))
'(flycheck-disabled-checkers (quote (javascript-jshint)))
'(helm-M-x-fuzzy-match t)
'(helm-ag-base-command "rg --no-heading --ignore-case")
'(helm-ag-use-temp-buffer t)
'(helm-autoresize-max-height 0)
'(helm-autoresize-min-height 20)
'(helm-buffers-fuzzy-matching t)
'(helm-completion-in-region-fuzzy-match t)
'(helm-echo-input-in-header-line t)
'(helm-grep-ag-command "")
'(helm-locate-fuzzy-match t)
'(helm-mode t)
'(helm-mode-fuzzy-match t)
'(helm-move-to-line-cycle-in-source t)
'(helm-split-window-inside-p t)
'(magit-dispatch-arguments nil)
'(magit-log-arguments (quote ("--graph" "--color" "--decorate" "-n32")))
'(mouse-wheel-progressive-speed nil)
'(mouse-wheel-scroll-amount (quote (1 ((shift) . 5) ((control)))))
'(newsticker-date-format "(%A)")
'(newsticker-heading-format "%l
%t %d %s")
'(newsticker-treeview-date-format "%d.%m.%y %H:%M ")
(("Reddit" "" nil nil nil))))
(("LWN (Linux Weekly News)" "")
("slashdot" "" nil 3600)
("Wired News" ""))))
'(org-agenda-files nil)
(multi-term writegood-mode minimap deft ace-jump-mode package-lint emacs-htmlize langtool go-eldoc go-complete go-stacktracer go-mode helm-ag mu4e cargo evil-matchit org-autolist evil-surround evil-smartparens smartparens wrap-region lsp-javascript-typescript haskell-mode magit elm-mode lsp-symbol-outline outline-magic company-lsp web-mode tide quickrun org-bullets lsp-ui flycheck-rust spaceline-all-the-icons flycheck-inline lsp-rust f lsp-mode rust-mode pdf-tools company js2-mode diff-hl editorconfig general which-key helm doom-themes evil use-package)))
'(send-mail-function (quote smtpmail-send-it))
'(shr-width 75)
'(vc-annotate-background "#282c34")
(cons 20 "#98be65")
(cons 40 "#b4be6c")
(cons 60 "#d0be73")
(cons 80 "#ECBE7B")
(cons 100 "#e6ab6a")
(cons 120 "#e09859")
(cons 140 "#da8548")
(cons 160 "#d38079")
(cons 180 "#cc7cab")
(cons 200 "#c678dd")
(cons 220 "#d974b7")
(cons 240 "#ec7091")
(cons 260 "#ff6c6b")
(cons 280 "#cf6162")
(cons 300 "#9f585a")
(cons 320 "#6f4e52")
(cons 340 "#5B6268")
(cons 360 "#5B6268")))
'(vc-annotate-very-old-color nil))
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(default ((t (:inherit nil :stipple nil :background "#f7f9f9" :foreground "#383a42" :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight normal :height 140 :width normal :foundry "nil" :family "Code New Roman"))))
'(helm-grep-file ((t (:foreground "dark magenta"))))
'(helm-match ((t (:foreground "RoyalBlue1" :underline t))))
'(helm-moccur-buffer ((t (:foreground "#6ab04c" :underline t))))
'(helm-rg-active-arg-face ((t (:foreground "light green"))))
'(helm-rg-file-match-face ((t (:foreground "light green" :underline t))))
'(helm-rg-preview-line-highlight ((t (:background "light green" :foreground "green4"))))
'(mode-line ((t (:background "#ecf1f1" :box nil))))
'(mode-line-inactive ((t (:background "#e8eeee" :foreground "#a190a7" :box nil)))))

Here's a config for a minimal mode-line, with only one fancy thing is the major mode icon:

;; Modeline
(setq auto-revert-check-vc-info t)
(setq-default mode-line-format
                    (propertize " ⚿ "
                                'face '(:foreground "red" :weight 'bold)))
                    (propertize " ⛯ "
                                'face '(:foreground "orange")))
                   ((not (buffer-modified-p))
                    (propertize " ⛆ "
                                'face '(:foreground "gray85"))))))
               '(:eval (propertize (all-the-icons-icon-for-mode major-mode :height (/ all-the-icons-scale-factor 1.4) :v-adjust -0.05)))
               " %f "
               "] "
                 (if vc-mode
                     (let* ((noback (replace-regexp-in-string (format "^ %s" (vc-backend buffer-file-name)) " " vc-mode))
                            (face (cond ((string-match "^ -" noback) 'mode-line-vc)
                                        ((string-match "^ [:@]" noback) 'mode-line-vc-edit)
                                        ((string-match "^ [!\\?]" noback) 'mode-line-vc-modified))))
                       (format "[git:%s]" (substring noback 2)))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.