GNU/Linux >> Znalost Linux >  >> Linux

Je možné zjistit, který Vim/tmux má soubor otevřený?

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?
Linux
  1. Je možné přenést výsledky FIND do příkazu COPY CP?

  2. Jak mohu upravit všechny soubory vrácené funkcí find in vi v systému Linux?

  3. Jak najít výchozího správce souborů?

  1. Jak znovu načíst konfigurační soubor tmux, který definoval více relací?

  2. Jak otevřít soubor ve vim pomocí pipe

  3. Zjistěte, který proces upravuje soubor

  1. Jak odstranit soubor, který má netisknutelné znaky?

  2. Je možné zjistit, kdy byl soubor stažen?

  3. Jak zjistit typ souboru Img a připojit jej?