January 28, 2014

Multiple windows with tmux & gvim

ഞാൻ പ്രോഗ്രാമുകൾ എഴുതുമ്പോൾ കമ്പൈൽ ചെയ്യാനും ടെസ്റ്റ് ചെയ്യാനും മറ്റുമായി അഞ്ചാറ് ടെർമിലുകളും വിം സെഷനുകളും ഉണ്ടാകും. ഏതെങ്കിലും വിൻഡോയിലേക്ക് പോകണമെങ്കിൽ കുറേ alt + tab / alt + shift + tab അടിച്ചു നോക്കണം. അത്യാവശ്യമായി ഒരു വിൻഡോ നോക്കിയിട്ട് കിട്ടിയില്ലെങ്കിലത്തെ കാര്യം പറയണ്ടല്ലോ?
gvim വിൻഡോ സ്പ്ലിറ്റ് ചെയ്ത് ഫയലുകളുടെ കാര്യം ശരിയാക്കി. ടെർമിനലുകൾ നാലെണ്ണെം സ്ക്രീനിന്റെ നാലു കോർണറുകളിലാക്കി നോക്കി. alt + tab അടിക്കാതെ കൃത്യമായ ടെർമിനൽ സെലക്റ്റ് ചെയ്യണമെങ്കിൽ മൗസ് ഉപയോഗിക്കണം. അത് കുറച്ചു ബുദ്ധിമുട്ടുള്ള പണിയായതിനാൽ വേറെ വഴി അന്വേഷിക്കാൻ തുടങ്ങി. അങ്ങനെയാണ് tmux ൽ എത്തിച്ചേരുന്നത്.

tmux
GNU Screen പോലൊരു ടെർമിനൽ മൾട്ടിപ്ലക്സറാണ് tmux. ഞാൻ സ്ക്രീനിനു പകരം tmux ഉപയോഗിക്കാനുള്ള കാരണം tmux ൽ പുതിയ ഒരു വിൻഡോപേൻ (Window pane) ഉണ്ടാക്കുമ്പോൾ‌ നേരത്തേ വർക്ക് ചെയ്തുകൊണ്ടിരുന്ന ഡയറക്റ്ററിയിൽ തന്നെ ഒരു ഷെൽ കിട്ടും എന്നതാണ്. GNU screen ൽ നമ്മൾ തന്നെ ഒരു ഷെൽ സ്റ്റാർട്ട് ചെയ്യണം.

tmux എങ്ങനെ ഉപയോഗിക്കാം എന്നു നോക്കാം:
ഫെഡോറയിൽ sudo yum installl tmux എന്ന കമാന്റുപയോഗിച്ചും ഉബുണ്ടുവിൽ sudo apt-get install tmux എന്ന കമാന്റും ഉപയോഗിച്ച് tmux ഇൻസ്റ്റാൾ ചെയ്യാം.

അടുത്ത പരിപാടി tmux  നമുക്ക് വേണ്ട രീതിയിൽ കോൺഫ്യുഗർ ചെയ്യുകയാണ്. ഇതിനായി ഹോം ഡയറക്റ്ററിയിലെ .tmux.conf എന്ന ഫയലിൽ ആവശ്യമായ മാറ്റങ്ങൾ വരുത്തണം. എന്റെ .tmux.conf ഫയൽ ഇവിടെ ചേർക്കുന്നു.

unbind C-b
set -g prefix C-a
set -g display-panes-time 2000
set -g mode-mouse on
set -g mouse-select-pane on

ഇതിൽ unbind C-b & set -g prefix C-a എന്ന വരികൾ ഡിഫോൾട്ട് പ്രിഫിക്സ് കീ ആയ ctrl + b എന്നതിനു പകരം  ctrl + a ആക്കുന്നു. എനിക്ക്  ctrl + b അമർത്തുന്നതിനേക്കാൾ  ctrl + a അമർത്തുന്നതാണെളുപ്പം എന്നതുകൊണ്ടാണ് പ്രിഫിക്സ് കീ (ഇനി മുതൽ ഇത് C-a എന്നാകും എഴുതുന്നത്‌‌) മാറ്റിയത്.

tmux എന്ന കമാന്റ് കൊടുത്താൽ ഒരു tmux സെഷൻ തുടങ്ങും. ഈ സ്ക്രീൻ എങ്ങനെ സ്പ്ലിറ്റ് ചെയ്യാമെന്നു നോക്കാം. C-a + % എന്നു കൊടുത്താൽ സ്ക്രീൻ ലംബമായി സ്പ്ലിറ്റ് ചെയ്യും. C-a + " എന്നു കൊടുത്താൽ സ്ക്രീൻ തിരശ്ചീനമായും സ്പ്ലിറ്റ് ആകും. ആവശ്യാനുസരണം സ്പ്ലിറ്റ് ചെയ്ത് ഒരു സ്ക്രീനിൽ തന്നെ ഒന്നിലധികം ഷെല്ലുകൾ ഓപ്പൺ ചെയ്യാവുന്നതാണ്. ഒരു വിൻഡോപേനിൽ നിന്നും മറ്റൊരു വിൻഡോപേനിലേക്കു മാറാൻ പല രീതികളുണ്ട്. ഒന്നാമത്തേത് C-a q ഉപയോഗിച്ചാണ്. ഇങ്ങനെ ചെയ്യുമ്പോൾ ഓരോ വിൻഡോപേനിന്റെയും നമ്പരുകൾ സ്കീനിൽ തെളിഞ്ഞു വരും. നമുക്ക് പോകേണ്ട വിൻഡോപേനിന്റെ നമ്പർ അമർത്തിയാൽ അതിലേക്കു പോകും. ഈ നമ്പർ സ്ക്രീനിൽ കാണിക്കുന്ന സമയം കുറവാണെങ്കിൽ display-panes-time എന്ന ഓപ്ഷൻ .tmux.conf ൽ മാറ്റിയാൽ മതിയാകും. നമ്പരുകൾ എത്ര മില്ലി സെക്കന്റ് കാണിക്കണമെന്ന്  display-panes-time നോടു ചേർത്താൽ മതിയാകും.

രണ്ടാമത്തെ രീതി പ്രിഫിക്സ് കീയും ആരോ കീകളും ഉപയോഗിച്ചാണ്. പ്രിഫിക്സ് കീ അമർത്തിയ ശേഷം ആരോ കീകൾ അമർത്തുന്നതനുസരിച്ച് നമുക്ക് ആവശ്യമുള്ള വിൻഡോപേനുകളിലേക്ക് പോകാവുന്നതാണ്. പ്രിഫിക്സ് കീയും സെമികോളൻ (;) കീയും ഉപയോഗിച്ചാൽ നേരത്തേ ഉപയോഗിച്ച വിൻഡോപേനിലേക്ക് മാറാവുന്നതാണ്.

മൗസ് ഉപയോഗിച്ചും വിൻഡോപേനുകൾ മാറാവുന്നതാണ് . അതിനായി set -g mode-mouse on &‌ set -g mouse-select-pane on എന്നിവ .tmux.conf ൽ ചേർക്കണം. ഇങ്ങനെ ചെയ്താലുള്ള ഒരു പ്രശ്നം ഡിഫോൾട്ട് മൗസ് ഓപ്പറേഷനുകൾക്ക് ഷിഫ്റ്റ് കീ കൂടി ഉപയോഗിക്കണം എന്നതാണ്.



gvim
vim-ൽ സ്ക്രീൻ സ്പ്ലിറ്റ് ചെയ്യാൻ :sp [file name]  :vsp [file name]  കമാന്റുകൾ ഉപയോഗിക്കാം. ഫയലിന്റെ പേരുകൾ കൊടുത്തില്ലെങ്കിൽ ഇപ്പോഴുള്ള ഫയലിന്റെ വിൻഡോ സ്പ്ലിറ്റ് ചെയ്യും.
:sp സ്ക്രീൻ തിരശ്ചീനമായും :vsp സ്ക്രീൻ ലംബമായും സ്ക്രീൻ സ്പ്ലിറ്റ് ചെയ്യും. ctrl w+w ഉപയോഗിച്ച് ഒരു വിൻഡോയിൽ നിന്നും മറ്റൊന്നിലേക്ക് നീങ്ങാവുന്നതാണ്.
വിം ന്റെ ചിത്രത്തിൽ താഴെ വലതുവശത്ത് കാണുന്നത്  രണ്ടു ഫയലുകൾ diff ചെയ്യുന്നതാണ്. സ്പ്ലിറ്റ് ചെയ്ത് ഫയലുകൾ ഓപ്പൺ ചെയ്തശേഷം  :set diff  എന്നു കൊടുത്താൽ വിം തന്നെ ഡിഫ് ചെയ്യും. രണ്ടു വിൻഡോയിലും :set scrollbind എന്നുകൊടുത്താൽ ഒരു ഫയലിനെ സ്ക്രോൾ ചെയ്യുമ്പോൾ മറ്റേ ഫയലും അതുപോലെ സ്ക്രോൾ ആയിക്കൊള്ളും.

tmux-ഉം gvim-ഉം ഈ വിധത്തിൽ ഉപയോഗിച്ചാൽ ആറേഴു വിൻഡോകൾക്കു പകരം രണ്ടു വിൻഡോകൾ കൊണ്ട് കാര്യം നടക്കും.

2 comments:

  1. i3 വിൻഡോ മാനേജർ, അല്ലെങ്കിൽ Awesome വിൻഡോ മാനേജർ ഉപയോഗിച്ചു നോക്കൂ. കീബോർഡ് ഇഷ്ടപ്പെടുന്നവർക്കുള്ള ടൈലിങ്ങ് വിൻഡോ മാനേജറുകളാണ് അവ. ഞാൻ ഐ3 ആണ് ഉപയോഗിക്കുന്നത്.

    ReplyDelete
  2. ബാലശങ്കർ, വിൻഡോകളുടെ എണ്ണം കുറയ്ക്കുക എന്നതാണ് പ്രധാന ലക്ഷ്യം. അതുകൊണ്ടാണ് ഒരു വിൻഡോയെ തന്നെ സ്പ്ലിറ്റ് ചെയ്യാൻ നോക്കുന്നത്.
    ഞാൻ KDE ആണുപയോഗിക്കുന്നത്. KDE യിൽ നിന്ന് അടുത്തകാലത്തൊന്നും ഞാൻ മാറുമെന്നു തോന്നുന്നില്ല. :)

    ReplyDelete