dotfiles/nyxt/.config/nyxt/init.lisp.org

4.8 KiB

Always restore the previous session when the browser starts.

  (define-configuration browser
    ((session-restore-prompt :always-restore)))

Add a function that automatically redirects certain URLs to free alternatives.

  (defun init-redirect-to-alternative (request-data)
    (labels ((log-uri (uri)
               (log:info "Switching to URL: ~a://~a~a"
                         (quri:uri-scheme uri)
                         (quri:uri-host uri)
                         (quri:uri-path uri))))
      (let* ((uri (url request-data))
             (host (quri:uri-host uri)))
        (cond
          ((search "blog.bitsrc.io" host)
           (setf (url request-data)
                 (progn
                   (setf (quri:uri-host uri) "scribe.rip"
                         (quri:uri-path uri) (concatenate 'string "/bitsrc" (quri:uri-path uri)))
                   (log-uri uri)
                   uri)))
          ((search "levelup.gitconnected.com" host)
           (setf (url request-data)
                 (progn
                   (setf (quri:uri-host uri) "scribe.rip"
                         (quri:uri-path uri) (concatenate 'string "/gitconnected" (quri:uri-path uri)))
                   (log-uri uri)
                   uri)))
          ((or (search "kevingosse.medium.com" host)
               (search "minidump.net" host))
           (setf (url request-data)
                 (progn
                   (setf (quri:uri-host uri) "scribe.rip"
                         (quri:uri-path uri) (concatenate 'string "/kevingosse" (quri:uri-path uri)))
                   (log-uri uri)
                   uri)))
          ((search "medium.com" host :end2 (length "medium.com"))
           (setf (url request-data)
                 (progn
                   (setf (quri:uri-host uri) "scribe.rip")
                   (log-uri uri)
                   uri)))
          ((search "twitter.com" host)
           (setf (url request-data)
                 (progn
                   (setf (quri:uri-host uri) "nitter.net")
                   (log-uri uri)
                   uri)))
          ((search "www.youtube.com" host)
           (setf (url request-data)
                 (progn
                   (setf (quri:uri-host uri) "redirect.invidious.io")
                   (log-uri uri)
                   uri))))))
    request-data)

I want the keys to function more like Emacs, so I enable emacs-mode for all buffers. I also want my downloads to go to ~/downloads instead of ~/Downloads.

  (define-configuration buffer
    ((default-modes (append '(emacs-mode) %slot-default%))
     (download-path (make-instance 'data-path :dirname "~/downloads"))
     (request-resource-hook
      (reduce #'hooks:add-hook
              (mapcar #'make-handler-resource (list #'init-redirect-to-alternative))
              :initial-value %slot-default%))
     ;; Bind org-capture to `C-c o c', but only in emacs-mode.
     (override-map
      (let ((map (make-keymap "override-map")))
        (define-key map "C-c o c" 'org-capture)))))

Set up capturing URLs with org-capture in Emacs. From https://ag91.github.io/blog/2021/07/09/org-capture-in-nyxt-taking-notes-while-browsing/.

(defun replace-all (string part replacement &key (test #'char=))
  "Return a new string in which all the occurences of the part is replaced with replacement."
  (with-output-to-string (out)
    (loop with part-length = (length part)
          for old-pos = 0 then (+ pos part-length)
          for pos = (search part string
                            :start2 old-pos
                            :test test)
          do (write-string string out
                           :start old-pos
                           :end (or pos (length string)))
          when pos do (write-string replacement out)
            while pos)))

(defun eval-in-emacs (&rest s-exps)
  "Evaluate S-EXPS with emacsclient."
  (let ((s-exps-string (replace-all
                        (write-to-string
                         `(progn ,@s-exps) :case :downcase)
                        ;; Discard the package prefix.
                        "nyxt::" "")))
    (format *error-output* "Sending to Emacs:~%~a~%" s-exps-string)
    (uiop:run-program
     (list "emacsclient" "--eval" s-exps-string))))

(define-command-global org-capture ()
  "Org-capture current page."
  (eval-in-emacs
   `(org-link-set-parameters
     "nyxt"
     :store (lambda ()
              (org-store-link-props
               :type "nyxt"
               :link ,(quri:render-uri (url (current-buffer)))
               :description ,(title (current-buffer)))))
   `(org-capture nil "U"))
  (echo "Note stored!"))

Start Swank so I can connect to it through Emacs.

  (defvar *init-swank-started* nil)

  (unless *init-swank-started*
    (start-swank)
    (setf *init-swank-started* t))