From a30b53efdb27f46623d535c91dd62204af9d54ee Mon Sep 17 00:00:00 2001 From: Frantisek Bohacek Date: Fri, 10 May 2024 18:18:08 +0200 Subject: [PATCH] feat(emacs): use vterm, add functions to communicate with emacs from vterm --- .../profiles/development/emacs/default.nix | 28 ++++++++++++++++++- .../development/emacs/doom.d/config.el | 26 +++++++++++++++++ .../profiles/development/emacs/doom.d/init.el | 4 +-- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/home/modules/profiles/development/emacs/default.nix b/home/modules/profiles/development/emacs/default.nix index e058edc..129ea16 100644 --- a/home/modules/profiles/development/emacs/default.nix +++ b/home/modules/profiles/development/emacs/default.nix @@ -14,7 +14,9 @@ { config, lib, pkgs, ... }: let - doomRev = "5f5a163c49207a7083ab1ecc9e78d268fd6600b8"; + doomRev = "9620bb45ac4cd7b0274c497b2d9d93c4ad9364ee"; + vterm = pkgs.emacsPackages.vterm; + emacsVtermPath = "${vterm}/share/emacs/site-lisp/elpa/${vterm.pname}-${vterm.version}"; in { config = lib.mkIf config.profiles.development.enable { services.emacs = { @@ -35,6 +37,30 @@ in { ]; }; + programs.zsh.initExtra = '' + # Emacs + if [[ "$INSIDE_EMACS" = 'vterm' ]] \ + && [[ -n ${emacsVtermPath} ]] \ + && [[ -f ${emacsVtermPath}/etc/emacs-vterm-zsh.sh ]]; then + source ${emacsVtermPath}/etc/emacs-vterm-zsh.sh + + find_file() { + vterm_cmd find-file "$(realpath "''${@:-.}")" + } + + say() { + vterm_cmd message "%s" "$*" + } + + vterm_set_directory() { + vterm_cmd update-pwd "$PWD/" + } + + autoload -U add-zsh-hook + add-zsh-hook -Uz chpwd (){ vterm_set_directory } + fi + ''; + home.activation = { linkDoomConfig = { after = [ "writeBoundary" "createXdgUserDirectories" ]; diff --git a/home/modules/profiles/development/emacs/doom.d/config.el b/home/modules/profiles/development/emacs/doom.d/config.el index 3f29186..f57e21b 100644 --- a/home/modules/profiles/development/emacs/doom.d/config.el +++ b/home/modules/profiles/development/emacs/doom.d/config.el @@ -264,3 +264,29 @@ (remove-hook 'doom-first-buffer-hook #'smartparens-global-mode) (add-hook 'write-file-functions 'delete-trailing-whitespace) + +(add-to-list 'vterm-eval-cmds '("update-pwd" (lambda (path) (setq default-directory path)))) + +;; (after! vterm +;; (defun mog_cd_for_toggle (arg) +;; (vterm-send-string (concat "cd " arg) t) +;; (vterm-send-return) +;; ) +;; (defun my_cd_on_toggle (oldfun &rest arg) +;; (let* ((project-root (or (doom-project-root) default-directory)) +;; (default-directory +;; (if arg +;; default-directory +;; project-root)) +;; display-buffer-alist) +;; (apply oldfun arg) +;; (vterm-send-C-a) +;; (vterm-send-C-k) +;; (sleep-for 0.01) +;; (if +;; (vterm-cursor-in-command-buffer-p) +;; (mog_cd_for_toggle project-root) +;; ) +;; )) +;; (advice-add #'+vterm/toggle :around #'my_cd_on_toggle) +;; )) diff --git a/home/modules/profiles/development/emacs/doom.d/init.el b/home/modules/profiles/development/emacs/doom.d/init.el index 479c0a5..f20e4e3 100644 --- a/home/modules/profiles/development/emacs/doom.d/init.el +++ b/home/modules/profiles/development/emacs/doom.d/init.el @@ -75,9 +75,9 @@ :term eshell ; the elisp shell that works everywhere - ;;shell ; simple shell REPL for Emacs + shell ; simple shell REPL for Emacs term ; basic terminal emulator for Emacs - ;;vterm ; the best terminal emulation in Emacs + vterm ; the best terminal emulation in Emacs :checkers syntax ; tasing you for every semicolon you forget -- 2.48.1