หน้าจอ: การจัดกลุ่มการเรียกใช้กลุ่มทั้งหมดภายใต้หน้าต่างเดียว


1

ในหน้าจอเป็นไปได้ไหมที่จะเปิดอินสแตนซ์ทั้งหมดของกลุ่มในหน้าต่างเดียว? (เช่นหน้าต่าง 2) เริ่มแรกหน้าต่างจะเปลี่ยนเป็นหน้าต่างที่กำหนดและเปิดไฟล์ในบัฟเฟอร์ และการเรียกใช้ vim (จากหน้าต่างอื่น) ที่ตามมาจะเปิดไฟล์ในแท็บใหม่ของ vim ในหน้าต่างนั้น ฉันกำลังใช้ cygwin

คำตอบ:


1

นี่เป็นคำถามที่ยอดเยี่ยมและเป็นความคิดที่ยอดเยี่ยม! ฉันไม่สามารถรอที่จะรวมไว้ในเวิร์กโฟลว์ของฉัน

อย่างไรก็ตามในความคิดของฉันวิธีที่ดีที่สุดในการดึงสิ่งนี้ออกคือการใช้ฟังก์ชั่นเซิร์ฟเวอร์ของ vim ซึ่งช่วยให้คุณควบคุมอินสแตนซ์ vim ที่ทำงานอยู่โดยใช้คำสั่ง vim

แนวคิดก็คือครั้งแรกที่คุณเรียกใช้กลุ่มคุณจะเรียกใช้เป็น:

vim --servername $VIM_SERVER_NAME

และทุกครั้งที่คุณต้องการเปิดแท็บใหม่ในอินสแตนซ์นี้คุณจะเรียกใช้:

vim --servername $VIM_SERVER_NAME --remote-tab $PATH_TO_FILE_TO_OPEN

นอกเหนือจากนี้สิ่งเดียวที่คุณจะต้องเพิ่มคือตรรกะในการระบุและสลับไปที่หน้าต่างกลุ่ม (ซึ่งสามารถทำได้โดยใช้ชื่อหน้าต่าง)

ฉันได้รวมทั้งหมดนี้ไว้ในฟังก์ชันเชลล์ต่อไปนี้:

v() {
  if [ $STY ]; then
    # screen
    VIM_SERVER_NAME="VIM-SCREEN-$STY"

    if [ "`vim --serverlist | grep -i $VIM_SERVER_NAME`" = "" ]; then
      # No vim server, become the server
      screen -X title vim
      vim --servername $VIM_SERVER_NAME "$@"
      screen -X title `basename $SHELL`
    else
      # A vim server exists, use it, then switch to it.
      vim --servername $VIM_SERVER_NAME --remote-tab "$@"
      screen -X select vim
    fi
  else
    vim $@
  fi
}

หากคุณเพิ่มนิยามฟังก์ชันนี้ใน~/.profile(หรือ~/.bash_profileถ้าคุณใช้ bash) ดังนั้นเมื่อใดก็ตามที่คุณต้องการใช้เสียงเรียกเข้าให้ใช้vแทน มันจะตรวจสอบว่าคุณกำลังอยู่ในเซสชั่นหน้าจอหรือไม่และถ้าเป็นเช่นนั้นมันจะใช้หน้าต่าง vim ที่กำหนดและสลับไปที่มัน (หรือทำให้หน้าต่างปัจจุบันเป็นหน้าต่าง vim ที่กำหนดถ้าไม่มีอยู่) มิฉะนั้นจะย้อนกลับไปใช้ vim ปกติ นอกจากนี้ยังควรใช้งานได้แม้ว่าคุณจะใช้เซสชันหลายหน้าจอในเวลาเดียวกันและคุณใช้vในทุกเซสชัน

โปรดสังเกตว่าฉันยังรีเซ็ตชื่อหน้าต่างเป็นชื่อเชลล์ถ้า / เมื่อคุณออกจากเซิร์ฟเวอร์ vim นี่คือการหลีกเลี่ยงการมีสองหน้าต่างขึ้นไปด้วยชื่อ "vim" หากคุณใช้vในหน้าต่างอื่นหลังจากปิดในหนึ่ง

เพราะฉันเป็นผู้ชายมากกว่า tmux นี่คือฟังก์ชั่นเชลล์ที่ฉันวางแผนจะใช้:

v() {
  if [ $STY ]; then
    # screen
    VIM_SERVER_NAME="VIM-SCREEN-$STY"

    if [ "`vim --serverlist | grep -i $VIM_SERVER_NAME`" = "" ]; then
      # No vim server, become the server
      screen -X title vim
      vim --servername $VIM_SERVER_NAME "$@"
      screen -X title `basename $SHELL`
    else
      # A vim server exists, use it, then switch to it.
      vim --servername $VIM_SERVER_NAME --remote-tab "$@"
      screen -X select vim
    fi
  elif [ $TMUX ]; then
    # tmux
    VIM_SERVER_NAME="VIM-TMUX-`tmux list-windows -F '#{session_name}' | head -1`"

    if [ "`vim --serverlist | grep -i $VIM_SERVER_NAME`" = "" ]; then
      # No vim server, become the server
      tmux rename-window vim
      vim --servername $VIM_SERVER_NAME "$@"
      tmux rename-window `basename $SHELL`
    else
      # A vim server exists, use it, then switch to it.
      vim --servername $VIM_SERVER_NAME --remote-tab "$@"
      tmux select-window -t vim
    fi
  else
    vim "$@"
  fi
}

ฟังก์ชั่นเวอร์ชั่นนี้จะใช้งานได้กับทั้ง tmux และหน้าจอ (เซสชันที่แตกต่างกันมากเท่าที่คุณต้องการ) และถอยกลับไปเป็นกลุ่มปกติหากไม่ได้อยู่ภายใน


หากใครสนใจนี่คือลิงค์ไปยัง github gist: gist.github.com/maljub01/5130023
maljub01

1
ขอโทษที่ตอบกลับมาช้า ฉันกำลังสำรวจความเป็นไปได้ของการเรียกใช้สคริปต์นี้ในสภาพแวดล้อม cygwin ฉันพบสิ่งนี้เป็นไปไม่ได้ด้วยการพึ่งพา XWin ปัจจุบันสำหรับ gVim และเช่นนั้น แต่ฉันพบว่าคุณตอบว่าดีที่สุดจนถึงตอนนี้และทำให้ฉันมีความคิดที่จะทำงานทุกอย่างใน gVim ผ่านการremote-silent-tabตั้งค่าสถานะ สิ่งนี้ไม่ผ่านscreenแต่ยังรวมกลุ่มอินสแตนซ์ทั้งหมดของ vim เข้าด้วยกัน
Forethinker

0

คุณไม่สามารถเรียกใช้อินสแตนซ์สองกลุ่มในหน้าต่างหน้าจอที่แตกต่างกันซึ่งจะช่วยให้คุณแก้ไขไฟล์เดียวพร้อมกันจากทั้งสองอินสแตนซ์ หากคุณพยายามเปิด vim อินสแตนซ์ที่สองเพื่อแก้ไขไฟล์เดียวกันคุณจะได้รับข้อความเตือนว่าไฟล์กำลังถูกแก้ไข

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

:!screen screen vim -R %

-Rตัวเลือกเริ่มต้นที่เป็นกลุ่มในโหมดอ่านอย่างเดียว


นี่เป็นการทำงานที่ดีที่ควรทราบ แต่ฉันแก้ไขคำถามอีกครั้งเพื่อความชัดเจน
ทำนายอนาคต
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.