File: inferior-swift-mode.el

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (103 lines) | stat: -rw-r--r-- 3,775 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
;===--- inferior-swift.el --------------------------------------------------===;
;
; This source file is part of the Swift.org open source project
;
; Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
; Licensed under Apache License v2.0 with Runtime Library Exception
;
; See https://swift.org/LICENSE.txt for license information
; See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
;
;===------------------------------------------------------------------------===;

;;; Load modes that we build off of.
(require 'cl)
(require 'comint)
(require 'swift-mode)

;;; Declare variables.
(defcustom swift-command "swift"
  "Command to invoke `swift'."
  :group 'swift
  :type 'string)
(defcustom swift-args '()
  "Commandline arguments to pass to `swift-command'."
  :group 'swift
  :type 'string)
(defcustom swift-prompt-regexp "^\\(swift\\) "
  "Prompt for `run-swift'."
  :group 'swift
  :type 'regexp)
(defcustom swift-xcrun-command "xcrun"
  "Command used to invoke `xcrun'."
  :group 'swift
  :type 'string)
(defcustom swift-xcrun-sdk "macosx"
  "SDK to lookup from `xcrun'."
  :group 'swift
  :type 'string)

(defvar swift-comint-buffer nil
  "Swift process variable.")

;;; Entry point for creating the inferior-process from a swift mode buffer.
(defun run-swift ()
  "Run an inferior instance of `swift' inside Emacs."
  (interactive)
  (cl-flet ((chomp (str)
                   "Chomp leading and tailing whitespace from STR."
                   (while (string-match "\\`\n+\\|^\\s-+\\|\\s-+$\\|\n+\\'"
                                        str)
                     (setq str (replace-match "" t t str)))
                   str))
    (let* ((swift-sdk-path (chomp
                            (shell-command-to-string
                             (format "%s --show-sdk-path -sdk %s"
                                     swift-xcrun-command swift-xcrun-sdk))))
           (buffer (comint-check-proc "inferior-swift")))
      (pop-to-buffer-same-window
       (if (or buffer (not (derived-mode-p 'inferior-swift-mode))
               (comint-check-proc (current-buffer)))
           (get-buffer-create (or buffer "*inferior-swift*"))
         (current-buffer)))
      (unless buffer
        (apply 'make-comint-in-buffer "inferior-swift" buffer
               swift-xcrun-command nil (list swift-command "-sdk" swift-sdk-path))
        (setq swift-comint-buffer (get-buffer "*inferior-swift*"))
        (inferior-swift-mode)))))

(defun inferior-swift-mode--initialize ()
  "Helper function to initialize inferior-swift"
  (setq comint-process-echoes t)
  (setq comint-use-prompt-regexp t))

;;; Define the derived mode.
(define-derived-mode inferior-swift-mode comint-mode "inferior-swift"
  "Minor inferior mode for working with a swift repl."
  nil "inferior-swift"
  (setq comint-prompt-regexp swift-prompt-regexp)
  (setq comint-prompt-read-only t))

;;; Add initialization to the hook.
(add-hook 'inferior-swift-mode-hook 'inferior-swift-mode--initialize)

;;; Extra utility methods for sending swift definitions to repl.
(defun swift-eval-region (start end)
  (interactive "r")
  (let* ((lines (split-string (buffer-substring start end) "\n"))
         (region-string (mapconcat 'identity (remove-if-not (lambda (x) (not (string-equal x ""))) lines) "; ")))
    (comint-send-string swift-comint-buffer region-string))
  (comint-send-string swift-comint-buffer "\n"))

(defun switch-to-swift ()
  (interactive)
  (pop-to-buffer swift-comint-buffer))

;;; Add some things to the keymap for use in inferior lisp mode.
(define-key swift-mode-map "\C-c\C-r" 'swift-eval-region)
(define-key swift-mode-map "\C-c\C-z" 'switch-to-swift)

;; Provide inferior-swift
(provide 'inferior-swift-mode)

;;; end inferior-swift-mode.el