mirror of https://github.com/Chizi123/.emacs.d.git

Chizi123
2018-11-21 5ddac8bd2392ec5b64392e8750d725029bf5aa79
commit | author | age
76bbd0 1 ;;; org-eshell.el - Support for Links to Working Directories in Eshell -*- lexical-binding: t; -*-
C 2
3 ;; Copyright (C) 2011-2018 Free Software Foundation, Inc.
4
5 ;; Author: Konrad Hinsen <konrad.hinsen AT fastmail.net>
6
7 ;; This file is part of GNU Emacs.
8
9 ;; GNU Emacs is free software: you can redistribute it and/or modify
10 ;; it under the terms of the GNU General Public License as published by
11 ;; the Free Software Foundation, either version 3 of the License, or
12 ;; (at your option) any later version.
13
14 ;; GNU Emacs is distributed in the hope that it will be useful,
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 ;; GNU General Public License for more details.
18
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
21
22 ;;; Commentary:
23
24 ;;; Code:
25
26 (require 'org)
27 (require 'eshell)
28 (require 'esh-mode)
29
30 (org-link-set-parameters "eshell"
31              :follow #'org-eshell-open
32              :store #'org-eshell-store-link)
33
34 (defun org-eshell-open (link)
35   "Switch to am eshell buffer and execute a command line.
36    The link can be just a command line (executed in the default
37    eshell buffer) or a command line prefixed by a buffer name
38    followed by a colon."
39   (let* ((buffer-and-command
40           (if (string-match "\\([A-Za-z0-9-+*]+\\):\\(.*\\)" link)
41           (list (match-string 1 link)
42             (match-string 2 link))
43             (list eshell-buffer-name link)))
44          (eshell-buffer-name (car buffer-and-command))
45          (command (cadr buffer-and-command)))
46     (if (get-buffer eshell-buffer-name)
47     (pop-to-buffer-same-window eshell-buffer-name)
48       (eshell))
49     (goto-char (point-max))
50     (eshell-kill-input)
51     (insert command)
52     (eshell-send-input)))
53
54 (defun org-eshell-store-link ()
55   "Store a link that, when opened, switches back to the current eshell buffer
56    and the current working directory."
57   (when (eq major-mode 'eshell-mode)
58     (let* ((command (concat "cd " dired-directory))
59            (link  (concat (buffer-name) ":" command)))
60       (org-store-link-props
61        :link (concat "eshell:" link)
62        :description command))))
63
64 (provide 'org-eshell)
65
66 ;;; org-eshell.el ends here