Používám tmux
v práci jako moje IDE. Také spouštím vim
v různých panelech tmux a poměrně často bude proces na pozadí (nebo případně jen zavřu okno – vim jsem nakonfiguroval tak, aby při zavření okna neodstraňoval otevřené vyrovnávací paměti). Nyní mám problém, protože soubor, který chci upravit, je otevřen v jedné z mých dalších relací vim, ale nevím ve které.
Je možné zjistit který z nich, aniž bych ručně procházel všechna okna a tabule? V mém konkrétním případě vím, že jsem to neupravoval pomocí vim ~/myfile.txt
protože ps aux | grep myfile.txt
nic nevrací.
Přijatá odpověď:
Neřekne mi to vše , ale použil jsem fuser ~/.myfile.txt.swp
což mi dalo PID relace vim. Spuštění ps aux | grep <PID>
Podařilo se mi zjistit, kterou relaci vim jsem používal, což mi dalo nápovědu, ve kterém okně jsem to měl otevřené.
Díky Gilesově inspiraci a troše vytrvalosti a štěstí jsem přišel s následujícím příkazem:
⚘ (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 }'))
Pro vysvětlení, co to dělá:
(FNAME="/tmp/.fnord.txt.swp";
Tím se vytvoří subshell a nastaví FNAME
jako proměnná prostředí. Přísně vzato to není nutné – stačí nahradit $FNAME
s názvem souboru sami, ale usnadňuje to úpravy. Nyní pracujme zevnitř ven:
lsof -t $FNAME
Tím se vytvoří pouze PID procesu, který otevřel soubor.
ps -o tty= -p $(...)
Tím se vytvoří pts
PID, které jsme našli pomocí lsof
.
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}'
Tím se vytvoří panelový seznam položek jako session:0.1 /dev/pts/1
. První část je formát, který má tmux rád pro cíle, a druhá část je pts
| grep $(...)$
Tím se filtruje náš seznam panelů – koncové $
bude tedy odpovídat pouze jednomu záleží nám na tom. Zjistil jsem to zcela náhodou, protože jsem měl pts/2
a pts/22
, takže byly dva zápasy, jupí!
| awk '{ print $1 }'
Tím vznikne session:0.1
část výstupu panelu, který je vhodný pro předání tmux switch -t
.
To by mělo fungovat napříč relacemi i podokny, čímž se zaměří podokno, které obsahuje váš odkládací soubor.
Související:Odstranit další řádky záhlaví ze souboru, kromě prvního řádku?