Ἤμαξ Ὡς Προσομοιωτὴς Τερματικοῦ

Ἤμαξ Ὡς Προσομοιωτὴς Τερματικοῦ [Βίντεο]

  • Ὁ Ἤμαξ προσφέρει βελτιωμένη ἐμπειρία γιὰ ἀλληλεπίδραση μὲ ἐργαλεῖα κελύφους & μπορεῖ νὰ εἶναι ὁ πιὸ ἐπεκτάσιμος προσομοιωτὴς τερματικοῦ ποὺ διατίθεται.
  • Παρέχει ἀπρόσκοπτη ἐνσωμάτωση ἀνάμεσα σὲ ἐργαλεῖα κελύφους & δυνατότητες ἐπεξεργασίας.

Χρήση ἐντολῶν κελύφους μέσα ἀπὸ ἕνα μπάφερ

shell-command

  • M-! CMD <RET>
  • Ἐκτέλεσε τὴν ἐντολὴ κελύφους CMD καὶ ἐμφάνισε τὴν ἔξοδο.

async-shell-command

  • M-& CMD <RET>
  • Ἐκτέλεσε τὴν ἐντολὴ κελύφους CMD ἀσύγχρονα, καὶ ἐμφάνισε τὴν ἔξοδο

shell-command-on-region

  • M-| CMD <RET>
  • Ἐκτέλεσε τὴν ἐντολὴ κελύφους CMD μὲ τὰ περιεχόμενα τῆς περιοχῆς ὡς εἴσοδο· προαιρετικὰ ἀντικατέστησε τὴν περιοχὴ μὲ τὴν ἔξοδο

Ἤμαξ ὡς Προσομοιωτὴς Τερματικοῦ

Shell

  • M-x shell
  • Ὑποκέλυφος μὲ εἴσοδο καὶ ἔξοδο μέσῳ ἑνὸς μπάφερ τοῦ Ἤμαξ. Μπορεῖς ἔπειτα νὰ δίνεις ἐντολὲς διαδραστικά.

Ἡ διαμόρφωσή μου

(use-package shell
  :config
  (defun thanos/shell (n)
    "Create or switch to a shell buffer."
    (interactive "P")
    (let* ((num (if n (prefix-numeric-value n) nil))
           (buf-name (if num (format "*shell<%d>*" num) "*shell*")))
      (shell buf-name)))
  :bind (("C-c v" . thanos/shell)
         :map shell-mode-map
         ("C-l" . 'comint-clear-buffer))
  :hook ((shell-mode . (lambda () (display-line-numbers-mode -1)))))

Eshell

  • M-x eshell
  • Κέλυφος ὑλοποιημένο ὁλοκληρωτικὰ σὲ Emacs Lisp

Ἡ διαμόρφωσή μου

(use-package eshell
  :config
  ;; Prompt
  (defun eshell-git-info ()
    "Return a string with git info."
    (when (eq (call-process "git" nil nil nil "rev-parse" "--is-inside-work-tree") 0)
      (let* ((branch-raw (shell-command-to-string "git rev-parse --abbrev-ref HEAD"))
             (branch (if (or (string-match-p "^fatal" branch-raw)
                             (string-match-p "^error" branch-raw))
                         "Unknown"
                       (string-trim branch-raw)))
             (dirty (not
                     (string= "" (string-trim (shell-command-to-string "git status --porcelain")))))
             (dirty-info (if dirty " ✎" " ✔")))
        (concat (propertize "⎇ " 'face 'modus-themes-fg-green-warmer)
                (propertize branch 'face 'modus-themes-fg-magenta-warmer)
                (propertize dirty-info 'face
                            (if dirty 'modus-themes-fg-red 'modus-themes-fg-green))))))

  (defun eshell-prompt-multiline ()
    "Eshell Multiline Git prompt."
    (let ((separator (propertize " | " 'face 'font-lock-comment-face))
          (hr (propertize (concat "\n" (make-string (/ (window-total-width) 2) ?─) "\n") 'face 'font-lock-comment-face))
          (dir (propertize (format "%s" (abbreviate-file-name (eshell/pwd))) 'face 'modus-themes-fg-yellow-warmer))
          (git-info (eshell-git-info))
          (time (propertize (format-time-string "%H:%M:%S") 'face 'font-lock-comment-face))
          (sign (if (= (user-uid) 0)
                    (propertize "\n#" 'face 'modus-themes-fg-blue-intense)
                  (propertize "\nλ" 'face 'modus-themes-fg-red-warmer))))
      (concat hr dir separator git-info separator time sign " ")))

  (setf eshell-prompt-function 'eshell-prompt-multiline
        eshell-highlight-prompt nil)
  ;; Aliases
  (defun eshell/o (file)
    "Open FILE."
    (find-file file))

  (defvar thanos/aliases
    '((ll . "ls -lah")
      (clear . clear-scrollback)))

  (defun thanos/set-eshell-aliases (aliases)
    "Set ALIASES as eshell aliases."
    ;; Remove aliases file
    (when (and eshell-aliases-file
               (file-exists-p eshell-aliases-file))
      (delete-file eshell-aliases-file))
    (mapc (lambda (alias)
            (let ((name (symbol-name (car alias)))
                  (command (cdr alias)))
              (eshell/alias name
                            (cond
                             ((stringp command) command)
                             ((symbolp command) (symbol-name command))
                             (t (error "Unsupported alias command type"))))))
          aliases))

  ;; Rebinds
  (defun thanos/eshell-clear ()
    "Interactive call for clear-scrollback."
    (interactive)
    (eshell/clear-scrollback))

  (defun thanos/eshell-preview-insert ()
    (interactive)
    (completion-preview-insert)
    ;; This funciton just deletes the extra space inserted after
    ;; completion.
    (delete-char -1))
  :bind (("C-c e" . eshell)
         :map eshell-mode-map
         ("C-l" . 'thanos/eshell-clear)
         ("<tab>" . 'thanos/eshell-preview-insert)
         ("C-M-i" . 'completion-at-point))
  :hook ((eshell-mode . (lambda ()
                          (thanos/set-eshell-aliases thanos/aliases)
                          (display-line-numbers-mode -1)
                          (eshell-cmpl-mode -1)))))

Eat

Προσομοίωση τερματικοῦ (Eat)

  • Προσομοιωτὴς τύπου xterm, γραμμένος σὲ Emacs Lisp.
  • Παρόλο ποὺ εἶναι αὐτοτελὲς τερματικὸ γιὰ τὸν Ἤμαξ, παρόμοιο μὲ τὸ term, τὸ ἔχω χρησιμοποιήσει κυρίως γιὰ νὰ ἐνισχύσω τὸ eshell.

Ἡ διαμόρφωσή μου

(use-package eat
  :ensure t
  :config
  (setf eshell-visual-commands nil
        eat-term-name "xterm-256color")
  :bind (("C-c V" . eat))
  :hook ((eshell-mode . eat-eshell-mode)
         (eshell-mode . eat-eshell-visual-command-mode)
         (eat-mode . (lambda () (visual-line-mode -1)))))

Term & Ansi-Term

  • M-x term | M-x ansi-term
    • Τὸ ansi-term εἶναι τὸ ἴδιο μὲ τὸ term, ἐκτὸς τοῦ ὅτι πάντα δημιουργεῖ νέο μπάφερ καὶ τὸ C-x σημειώνεται ὡς χαρακτῆρας διαφυγῆς.
  • Τρέχει ὑποκέλυφος μὲ εἴσοδο καὶ ἔξοδο μέσῳ ἑνὸς μπάφερ τοῦ Ἤμαξ.

Πῶς νὰ τὸ χρησιμοποιήσεις

  • Ὅσο βρίσκεσαι σὲ term-mode τὸ C-c CHAR ἰσοδυναμεῖ μὲ C-x CHAR.
    • Παράδειγμα τὸ C-c o εἶναι ἡ καθολικὴ δέσμευση C-x o other-window
  • C-c C-j ἀλλάζει σὲ term-line-mode ποὺ ἐπιτρέπει πλοήγηση παρόμοια μὲ τοῦ κελύφους
  • C-c C-k ἐπιστρέφει σὲ term-char-mode