Μόλις ἀνέβασα ἕνα μικρό βίντεο γιὰ τῆν χρήση τοῦ κειμενογράφου Ἤμαξ ὡς τερματικοῦ, μπορεῖτε νὰ τὸ δεῖτε στὸν YouTube σύνδεσμο ἐδῶ.

Ἀκολουθοῦν οι σημειώσεις ποῦ παρουσιάστηκαν στὸ βίντεο, μεταφρασμένες στά Ἑλληνικά

  • Ὀ Ἤμαξ προσφέρει τῆν δυνατότητα χρήσης ἐργαλείων κελύφους & ἴσως εἶναι ὀ πιὸ ἐπεκτεινόμενος προσομοιωτής τερματικοῦ διαθέσιμος σήμερα.
  • Προσφέρει ἕνα ἐνσωματωμένο περιβάλλον γιὰ ἐπεξεργασία κειμένου καὶ γιά ἐργαλεῖα κελύφους.

Χρησιμοποιώντας ἐντολές κελύφους μέσα ἀπό μπάφερς

shell-command

  • M-! CMD <RET>
  • Ἐκτελεῖ τῆν CMD ἐντολή κελύφους καὶ δείχνει τὸ ἀποτέλεσμα σὲ ἕνα νέο buffer

async-shell-command

  • M-& CMD <RET>
  • Ἐκτελεῖ τῆν CMD ἐντολή κελύφους ἀσύγχρονα, καὶ δείχνει τὸ ἀποτέλεσμα σὲ ἕνα νέο buffer

shell-command-on-region

  • M-| CMD <RET>
  • Ἐκτελεῖ τῆν CMD ἐντολή κελύφους μὲ τῆν ἐπιλεγμένη περιοχή ὠς τήν «παροχή» (input).

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

Shell

  • M-x shell
  • Ἕνα υπό-κέλυφος ποῦ δέχεται ἐντολές μέσα ἀπό ἕνα μπάφερ, ἀπό τὸν ὅποιο σοῦ παρέχει καὶ τὸ ἀποτέλεσμα. Δέχεται ἐντολές διαδραστικά

My configuration

 (use-package shell
   :defer t
   :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

My configuration

 (use-package esh-mode
   :defer t
   :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

Emulate a terminal (Eat)

  • xterm-like προσομοιωτής, γραμμένος σὲ Emacs Lisp

My configuration

    (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 ὠς escape-char.
  • Ἐκτελεῖ ἕνα υπο-κέλυφος ποῦ δέχεται ἐντολές μέσα ἀπό ἕναν Ἤμαξ μπάφερ.

Πως τὸ χρησιμοποιοῦμαι

  • Ὅταν βρισκόμαστε σὲ term-mode, C-c CHAR εἶναι τὸ ἴδιο μὲ C-x CHAR
    • πχ C-c o εἶναι τὸ ἴδιο μὲ C-x o
  • C-c C-j ἀλλάζει σὲ term-line-mode ποῦ ἐπιτρέπει μετακίνηση τοῦ κέρσορα
  • C-c C-k ἐπιστρέφει σὲ term-char-mode