วิธีรันหลาย shells บน Emacs


147

ฉันใช้ Emacs 23.3.1 บน windows 7 ฉันรู้ว่าฉันสามารถเรียกใช้เชลล์จาก emacs โดยใช้ Mx เชลล์ได้ ฉันต้องการมีเชลล์ windows หลายหน้าต่างในเวลาเดียวกัน แต่การพิมพ์ Mx shell เป็นครั้งที่สองเพิ่งเปิดหน้าต่างเชลล์เดียวกันให้ฉัน

มีวิธีที่จะมี windows shell ที่แตกต่างกันหรือไม่?

คำตอบ:


210

C-u M-x shell จะทำมัน

มันจะแจ้งให้สำหรับชื่อเปลือกใหม่เพียงแค่กดตอบแทนสำหรับการเริ่มต้น *shell*<2>(ซึ่งจะเป็นสิ่งที่ชอบ

ยังทำงานร่วมกับ eshell

เคล็ดลับอื่นถ้าคุณใช้ eshell: เช่นเดียวกับที่M-x eshellคุณกลับไปที่*eshell*(แทนที่จะเริ่มสร้าง eshell ใหม่) ถ้าคุณใช้อาร์กิวเมนต์คำนำหน้าเป็นตัวเลขมันจะนำคุณไปที่บัฟเฟอร์ eshell นั้น ยกตัวอย่างเช่นจะนำคุณไปC-3M-xeshell *eshell*<3>น่าเศร้าถ้าคุณใช้เชลล์ (แทน eshell) เทคนิคนี้ดูเหมือนจะไม่ทำงาน (ใน Emacs ของฉัน 24.0.50.1 อย่างน้อย)


1
ตกลงอันนี้ใช้ได้ เปลือก Cu Mx ถามชื่อของเปลือกใหม่ ขอบคุณ!
S4M

1
ไม่มีปัญหา S4M ฉันเพิ่มเคล็ดลับสำหรับ eshell; อย่างที่คุณถามเกี่ยวกับเชลล์ฉันไม่รู้ว่าคุณจะพบว่ามันมีประโยชน์หรือไม่ แต่ผู้ใช้ eshell ที่มีคำถามเดียวกันอาจพบว่ามีประโยชน์
Matt Curtis

ขอบคุณแมตต์ Cu หมายถึงอะไร / ทำที่นี่
ทิม

4
C-uuniversal-argumentรันคำสั่ง มันเป็นวิธีในการฉีดอาร์กิวเมนต์เข้าไปในคำสั่งถัดไป คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ด้วยC-h k C-u( C-h kวิ่งdescribe-keyมีประโยชน์มาก ๆ !)
แมตต์เคอร์ติส

จากนั้นC-h f eshell( C-h fวิ่งdescribe-function) แสดงว่าฟังก์ชันeshellรับอาร์กิวเมนต์ที่เป็นทางเลือก อ้างอิง: คำนำหน้าตัวเลข ARG (เช่นในC-u 42 M-x eshell RET) สลับไปที่เซสชั่นด้วยหมายเลขนั้นสร้างมันถ้าจำเป็น คำนำหน้าไม่ใช่ตัวเลข arg หมายถึงการสร้างเซสชั่นใหม่
Matt Curtis

34

M-x rename-bufferคุณสามารถเปลี่ยนชื่อกันชนของเปลือกของคุณด้วย จากนั้นคุณจะสามารถเปิดเปลือกที่สอง


2
ฉันชอบที่จะไปกับการแก้ปัญหาของ Matt Curtis การใช้เชลล์ภายใต้ชื่อใหม่นั้นดูเหมือนว่าง่ายกว่าการเปลี่ยนชื่อเชลล์ปัจจุบันแล้วเรียกใช้เชลล์ใหม่
S4M

8

ดูMultiTermมันทำให้การจัดการหลายขั้วใน Emacs ง่ายขึ้นมาก


1
โปรดทราบว่าโหมดเชลล์และโหมดคำศัพท์เป็นสองสิ่งที่แตกต่างอย่างสิ้นเชิง
darkfeline

5

มันอาจจะมีประโยชน์ในการใช้อินเตอร์เฟสเหมือนหน้าจอกับเชลล์ของคุณ ผมเคยเขียนของตัวเอง แต่มีคนอื่น ๆ ออกมีเช่นEmacsScreen


5

หลังจากผ่านไปสี่ปีฉันเห็นว่าบางคนยังคงมองปัญหานี้อยู่ในบางครั้งดังนั้นฉันจะเผยแพร่ฟังก์ชันที่รวดเร็วที่ฉันเขียนเพื่อโหลดเชลล์และขอชื่อ ด้วยวิธีนี้คุณสามารถตั้งชื่อเชลล์เป็น "sort-files" ถ้ามันถูกใช้เพื่อการเรียงลำดับไฟล์และอีกหนึ่ง "ไฮฟ์" ถ้ามันถูกใช้เพื่อรันเคียวรีไฮฟ์ ฉันใช้มันทุกวันทันที (วันที่ 24 emacs):

(defun create-shell ()
    "creates a shell with a given name"
    (interactive);; "Prompt\n shell name:")
    (let ((shell-name (read-string "shell name: " nil)))
    (shell (concat "*" shell-name "*"))))

4

สิ่งนี้จะสร้างอินสแตนซ์เชลล์ใหม่โดยอัตโนมัติในบัฟเฟอร์ที่คุณใช้งาน ผูกไว้กับ MS หรือบางสิ่งเช่นนั้นและความสุขทันที:

(defun new-shell ()
  (interactive)

  (let (
        (currentbuf (get-buffer-window (current-buffer)))
        (newbuf     (generate-new-buffer-name "*shell*"))
       )

   (generate-new-buffer newbuf)
   (set-window-dedicated-p currentbuf nil)
   (set-window-buffer currentbuf newbuf)
   (shell newbuf)
  )
)

ขอบคุณมากสำหรับ phils ในการแนะนำให้เขียนใหม่โดยใช้ let แม้ว่าผลลัพธ์จะเป็นวงเล็บที่แย่ยิ่งกว่า ... : \


1
คุณจำเป็นต้องletผูกตัวแปรถ้าพวกเขามีไว้สำหรับการใช้งานในท้องถิ่น มันเป็นตอนนี้คุณมีค่าระดับโลกและcurrentbuf newbuf
phils

ฟังก์ชั่นเปลือกใหม่เปรียบเทียบกับฟังก์ชั่นการสร้างเปลือกของฉันได้อย่างไร
S4M

1
@ S4M ส่วนใหญ่เป็นปัญหาของการตั้งค่าฉันขี้เกียจและต้องการเปลือกของฉันทันทีในหน้าต่างที่ใช้งานในปัจจุบันและไม่ต้องพิมพ์ชื่อผู้ใช้ล่วงหน้า
bjsdaiyu

@phils ขอบคุณสำหรับเคล็ดลับฉันไม่คุ้นเคยกับเสียงกระเพื่อมดังนั้นจะทำงานซ้ำโดยใช้การมอบหมายในท้องถิ่น :-)
bjsdaiyu

อืมฉันคิดว่าคุณสามารถใช้ฟังก์ชั่นของฉันและเพิ่มชื่อเริ่มต้นที่จะเป็นเช่นshell_nโดยที่ n จะเป็นเชลล์ n-th ที่เปิดในขณะที่ Cu create-shell จะแสดงชื่อเชลล์
S4M

0

สิ่งนี้จะเปิดเชลล์ใหม่ทุกครั้งที่คุณเรียกใช้ฟังก์ชันและเปลี่ยนชื่อโดยอัตโนมัติหากจำเป็น เครื่องหมายบวกคือถ้าคุณแก้ไขไฟล์จากระยะไกล (dired / tramp ... ) สิ่งนี้จะเปิดเชลล์บนรีโมตโฮสต์และเปลี่ยนชื่อโดยอัตโนมัติด้วยชื่อโฮสต์รีโมต:

(defun ggshell (&optional buffer)
(interactive)
(let* (
       (tramp-path (when (tramp-tramp-file-p default-directory)
             (tramp-dissect-file-name default-directory)))
       (host (tramp-file-name-real-host tramp-path))
       (user (if (tramp-file-name-user tramp-path)
         (format "%s@" (tramp-file-name-user tramp-path)) ""))
       (new-buffer-nameA (format "*shell:%s*" host))
       (new-buffer-nameB (generate-new-buffer-name new-buffer-nameA))
       (currentbuf (get-buffer-window (current-buffer)))
       )
  (generate-new-buffer new-buffer-nameB)
  (set-window-dedicated-p currentbuf nil)
  (set-window-buffer currentbuf new-buffer-nameB)
  (shell new-buffer-nameB)
  ))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.