emacs - fix bug of sd/toggle-eshell-here default-directory
[dotfiles.git] / emacs.d / config.org
index e7e50e1..20411af 100644 (file)
@@ -827,26 +827,23 @@ extend org-mode's easy templates, refer to [[http://coldnew.github.io/coldnew-em
 
 [[https://github.com/magit/magit][Magit]] is a very cool git interface on Emacs.
 
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+and Defined keys, using vi keybindings, Refer abo-abo's setting [[https://github.com/abo-abo/oremacs/blob/c5cafdcebc88afe9e73cc8bd40c49b70675509c7/modes/ora-nextmagit.el][here]]
 
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package magit
     :ensure t
-    :commands magit-status magit-blame)
-
-#+END_SRC
-
-Defined keys, using vi keybindings, Refer abo-abo's setting [[https://github.com/abo-abo/oremacs/blob/c5cafdcebc88afe9e73cc8bd40c49b70675509c7/modes/ora-nextmagit.el][here]]
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (dolist (map (list magit-status-mode-map
-                     magit-log-mode-map
-                     magit-diff-mode-map
-                     magit-staged-section-map))
-    (define-key map "j" 'magit-section-forward)
-    (define-key map "k" 'magit-section-backward)
-    (define-key map "n" nil)
-    (define-key map "p" nil)
-    (define-key map "v" 'recenter-top-bottom)
-    (define-key map "i" 'magit-section-toggle))
+    :commands magit-status magit-blame
+    :config
+    (dolist (map (list magit-status-mode-map
+                       magit-log-mode-map
+                       magit-diff-mode-map
+                       magit-staged-section-map))
+      (define-key map "j" 'magit-section-forward)
+      (define-key map "k" 'magit-section-backward)
+      (define-key map "n" nil)
+      (define-key map "p" nil)
+      (define-key map "v" 'recenter-top-bottom)
+      (define-key map "i" 'magit-section-toggle)))
 #+END_SRC
 
 * IDO & SMEX
@@ -1205,37 +1202,89 @@ Eshell alias
 Quickly start eshll in split window below, refer [[http://www.howardism.org/Technical/Emacs/eshell-fun.html][eshell-here]]
 
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (defun eshell-x ()
-    (insert "exit")
-    (eshell-send-input)
-    (delete-window))
-
-  (defun eshell-here ()
-    "Opens up a new shell in the directory associated with the
-  current buffer's file. The eshell is renamed to match that
-  directory to make multiple eshell windows easier."
+  ;; (defun eshell-x ()
+  ;;   (insert "exit")
+  ;;   (eshell-send-input)
+  ;;   (delete-window))
+
+  ;; (defun sd/toggle-eshell ()
+  ;;   "Open a eshell windows vertically"
+  ;;   (interactive)
+  ;;   (if 1
+  ;;       (message "true")
+  ;;     (progn
+  ;;       (split-window-vertically (- (/ (window-total-height) 3)))
+  ;;       (other-window 1)
+  ;;       (switch-to-buffer eshell-buffer-name)
+  ;;       (goto-char (point-max))
+  ;;       (eshell-kill-input)
+  ;;       (insert (format "cd %s" default-directory))
+  ;;       (eshell-send-input)
+  ;;       (goto-char (point-max))
+  ;;       (insert (concat "ls"))
+  ;;       (eshell-send-input))))
+  ;; (defun eshell-here ()
+  ;;   "Opens up a new shell in the directory associated with the
+  ;; current buffer's file. The eshell is renamed to match that
+  ;; directory to make multiple eshell windows easier."
+  ;;   (interactive)
+  ;;   (let* ((parent (if (buffer-file-name)
+  ;;                      (file-name-directory (buffer-file-name))
+  ;;                    default-directory))
+  ;;          (height (/ (window-total-height) 3))
+  ;;          (name   (car (last (split-string parent "/" t))))
+  ;;          (eshell-name (concat "*eshell: " name "*")))
+  ;;     (split-window-vertically (- height))
+  ;;     (other-window 1)
+  ;;     (if (get-buffer eshell-name)
+  ;;         (progn
+  ;;           (message "buffer exist")
+  ;;           (switch-to-buffer eshell-name))
+  ;;       (progn
+  ;;         (eshell "new")
+  ;;         (rename-buffer eshell-name)
+
+  ;;         (insert (concat "ls"))
+  ;;         (eshell-send-input)))))
+
+  ;; (global-unset-key (kbd "M-`"))
+  ;; (global-set-key (kbd "M-`") #'eshell-here)
+#+END_SRC
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (defun sd/window-has-eshell ()
+    "Check if current windows list has a eshell buffer, and return the window"
+    (interactive)
+    (let ((ret nil))
+      (dolist (window (window-list))
+        (let ((modename (with-current-buffer (window-buffer window)
+                          major-mode)))
+          (if (equal modename 'eshell-mode)
+              (setq ret window))))
+      ret))
+
+  (defun sd/toggle-eshell-here ()
+    "Toggle a eshell buffer vertically"
     (interactive)
-    (let* ((parent (if (buffer-file-name)
-                       (file-name-directory (buffer-file-name))
-                     default-directory))
-           (height (/ (window-total-height) 3))
-           (name   (car (last (split-string parent "/" t))))
-           (eshell-name (concat "*eshell: " name "*")))
-      (split-window-vertically (- height))
-      (other-window 1)
-      (if (get-buffer eshell-name)
-          (progn
-            (message "buffer exist")
-            (switch-to-buffer eshell-name))
-        (progn
-          (eshell "new")
-          (rename-buffer eshell-name)
-
-          (insert (concat "ls"))
+    (if (sd/window-has-eshell)
+        (if (equal major-mode 'eshell-mode)
+            (delete-window)
+          (select-window (sd/window-has-eshell)))
+      (progn
+        (let ((dir default-directory))
+          
+          (split-window-vertically (- (/ (window-total-height) 3)))
+          (other-window 1)
+          (unless (and (boundp 'eshell-buffer-name) (get-buffer eshell-buffer-name))
+            (eshell))
+          (switch-to-buffer eshell-buffer-name)
+          (goto-char (point-max))
+          (eshell-kill-input)
+          (insert (format "cd %s" dir))
           (eshell-send-input)))))
 
   (global-unset-key (kbd "M-`"))
-  (global-set-key (kbd "M-`") #'eshell-here)
+  (global-set-key (kbd "M-`") 'sd/toggle-eshell-here)
 #+END_SRC
 
 * Misc Settings
@@ -1323,7 +1372,7 @@ Refer [[https://github.com/abo-abo/hydra/blob/master/hydra-examples.el][hydra-ex
            (interactive)
            (split-window-below)
            (windmove-down))
-     "horz" :exit)
+     "horz" :exit t)
     ("o" delete-other-windows "one" :exit t)
     ("a" ace-window "ace")
     ("s" ace-swap-window "swap")