Saya menggunakan tmux
di tempat kerja sebagai IDE saya. Saya juga menjalankan vim
dalam berbagai panel tmux dan akan cukup sering menjadi latar belakang proses (atau sebagai alternatif saya hanya menutup jendela – saya telah mengonfigurasi vim untuk tidak menghapus buffer terbuka saat jendela ditutup). Sekarang saya punya masalah, karena file yang ingin saya edit terbuka di salah satu sesi vim saya yang lain tetapi saya tidak tahu yang mana.
Apakah mungkin untuk mengetahui yang mana, tanpa melalui semua jendela dan panel saya secara manual? Dalam kasus khusus saya, saya tahu bahwa saya tidak mengeditnya dengan vim ~/myfile.txt
karena ps aux | grep myfile.txt
tidak mengembalikan apa pun.
Jawaban yang Diterima:
Itu tidak memberitahuku segalanya , tapi saya menggunakan fuser ~/.myfile.txt.swp
yang memberi saya PID sesi vim. Menjalankan ps aux | grep <PID>
Saya dapat mengetahui sesi vim mana yang saya gunakan, yang memberi saya petunjuk tentang jendela mana saya membukanya.
Berkat inspirasi Giles dan sedikit ketekunan dan keberuntungan, saya mendapatkan perintah berikut:
⚘ (FNAME="/tmp/.fnord.txt.swp"; tmux switch -t $(tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}' | grep $(ps -o tty= -p $(lsof -t $FNAME))$ | awk '{ print $1 }'))
Untuk menjelaskan fungsinya:
(FNAME="/tmp/.fnord.txt.swp";
Ini membuat subkulit dan menyetel FNAME
sebagai variabel lingkungan. Sebenarnya tidak perlu – Anda bisa mengganti $FNAME
dengan nama file sendiri, tetapi itu membuat pengeditan menjadi lebih mudah. Sekarang, bekerja dari dalam ke luar:
lsof -t $FNAME
Ini menghasilkan hanya PID dari proses yang membuka file.
ps -o tty= -p $(...)
Ini menghasilkan pts
dari PID yang kami temukan menggunakan lsof
.
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}'
Ini menghasilkan daftar panel entri seperti session:0.1 /dev/pts/1
. Bagian pertama adalah format yang disukai tmux untuk target, dan bagian kedua adalah pts
| grep $(...)$
Ini memfilter daftar panel kami – $
. yang tertinggal jadi itu hanya akan cocok dengan satu kita peduli. Saya menemukan itu secara tidak sengaja karena saya memiliki pts/2
dan pts/22
, jadi ada dua cocok, ups!
| awk '{ print $1 }'
Ini menghasilkan session:0.1
bagian dari output panel, yang cocok untuk diteruskan ke tmux switch -t
.
Ini harus bekerja di seluruh sesi serta panel, sehingga memfokuskan panel yang berisi file swap Anda.
Terkait:Hapus baris header tambahan dari file, kecuali untuk baris pertama?