एक tmux सेशन को मारें और दूसरे tmux सेशन को चुनें


11

मैं Xनिम्नलिखित करने के लिए बाध्य करने की कोशिश कर रहा हूं :

  • उपयोगकर्ता को संकेत दें कि क्या सत्र को मार दिया जाना चाहिए
  • यदि yदर्ज किया गया है, तो सत्र को मारें
  • सत्र मारे जाने के बाद दूसरे सत्र का चयन करें (अंतिम, पिछला, या अगला सत्र)

कुछ इसी तरह के आदेश जो बिल्कुल सही नहीं हैं

  1. सत्र को मारें और टर्मिनल बंद करें:

    bind X confirm-before -p "Kill #S (y/n)?" kill-session
    
  2. मारने के लिए सत्र के नाम के लिए उपयोगकर्ता को प्रेरित करें और मारने के बाद अगले सत्र का चयन करें:

    bind X command-prompt -p "kill:"  "switch-client -n \; kill-session -t '%%'"
    
  3. मैं समान आदेशों के उदाहरण नहीं खोज पाया हूं। यहाँ एक समाधान कुछ है जो काम नहीं करता है:

    bind X confirm-before -p "Kill #S (y/n)?" "SESSION='#S' \; \
    switch-client -n \; kill-session -t \"$SESSION\""
    

जवाबों:


12

मुझे लगता है कि आप जो चाहते हैं, उसके करीब है:

bind-key X confirm-before -p "Kill #S (y/n)?" "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'"

आपका # 3 दृष्टिकोण सही लाइनों के साथ है, लेकिन समस्या यह है कि अपने कमांड स्ट्रिंग में -स्टाइल प्रतिस्थापन (जैसे ) confirm-beforeनहीं करते हैं ।status-left#S

उपरोक्त बंधन के लिए एक चेतावनी यह है कि चूंकि सब कुछ अंदर से किया जाता है run-shell, इसलिए कमांड किसी विशेष ग्राहक या सत्र के संदर्भ से बाहर चलाए जाते हैं। यह वास्तव में केवल इसलिए काम करता है क्योंकि "डिफ़ॉल्ट" क्लाइंट (के लिए switch-client) और "डिफ़ॉल्ट" सत्र (के लिए #S) सबसे हाल ही में सक्रिय हैं। यह तब तक काम करता है जब तक आप केवल एक सक्रिय ग्राहक की उम्मीद करते हैं (उदाहरण के लिए एक एकल उपयोगकर्ता जो शेल कमांड के समाप्त होने के बाद तक किसी अन्य tmux क्लाइंट में टाइप नहीं करता है ); यह विफल हो सकता है नाटकीय रूप से करता है, तो (उदाहरण के लिए) आप में बाध्यकारी गति प्रदान tmux ग्राहक एक है, लेकिन नए इनपुट द्वारा प्राप्त होता है tmux ग्राहक बी से पहले खोल द्वारा शुरू किया run-shellअपने आदेशों को चलाने का मौका मिला है।

यह विशेष रूप से दौड़ की स्थिति ग्राहक / सत्र / खिड़की / फलक सूचनाओं को run-shellआदेश देने के लिए एक अच्छी प्रेरणा की तरह लगती है । एक TODO प्रविष्टि प्राप्त करने if-shellऔर run-shellसमर्थन करने के बारे में है (वैकल्पिक?) status_replace()(यानी status-left-स्टाइल प्रतिस्थापन), हालांकि शायद एक बेहतर विकल्प होगा format_expand(), जो एक नए सुपर-सेट status_replace(ऑफ़र #{client_tty}, आदि) की तरह है।


यह वही दिखता है जो मैं देख रहा था। मैंने एक tmux display-message -p "#S"अन्य उत्तर में चाल खोजने के बाद एक समान विधि की कोशिश की थी । ऐसा लगता है कि रन-शेल में सब कुछ लपेटना महत्वपूर्ण था। धन्यवाद!
ट्रे हंटर

इसके बिना आप कैसे करते हैं confirm-before? मुझे सही भागने में परेशानी हो रही है।
माइल्स

2
@Miles: इस एक का प्रयास करें: bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'( tmux 1.8+ run-shellफैलता #Sसीधे, तो हम को छोड़ देते हैं करने के लिए मिलता display-messageहै और इसके अतिरिक्त के हवाले से)
क्रिस Johnsen

1

बस अगर कोई इस प्रश्न पर ठोकर खाता है - tmux-sessionist कई अन्य लोगों के साथ यह कार्यक्षमता प्रदान करता है।


0

एक और प्रश्न है जो एक समान प्रश्न पूछता है लेकिन यह थोड़ा अलग है।

यदि आप choose-sessionअतिरिक्त सुविधा के साथ मानक व्यवहार चाहते हैं जो मूल सत्र को मारता है यदि कोई अन्य ग्राहक इसके साथ संलग्न नहीं रहता है, तो यह प्रश्न भी रुचि का हो सकता है।


0

क्रिस जॉन्सन के उत्तर से (टिप्पणियों में) का विस्तार करते हुए, इसे बिना शीघ्र या कैसे करें confirm-before:

bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'

यदि केवल 1 सत्र शेष है (वह सत्र जो आप वर्तमान में अभी कर रहे हैं) और आप कमांड चलाते हैं, तो आपको "त्रुटि" संदेश प्राप्त होगा, और सत्र मारा नहीं गया है। आम तौर पर (यदि आप मेरे जैसे हैं) तो आप चाहते हैं कि कमांड सत्र को मारता रहे, भले ही कोई अन्य सत्र न हो लेकिन यह स्विच हो सकता है। तो यहाँ मैं क्या लेकर आया हूँ:

bind-key X if-shell '[ $(tmux list-sessions | wc -l) -ne 1 ]' \
                    "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'" \
                    "run-shell 'tmux kill-session -t \"#S\"'"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.