Можно ли узнать, в каком vim / tmux открыт мой файл?

Из-за отсутствия знаний о команде find я просто использую менее эффективную, но, скорее всего, не менее полезную и, вероятно, более читабельную однострочную команду, которая также включает grep:

find . -type d | grep -v "/\.git"
4
14.09.2016, 03:13
2 ответа

Он не говорит мне всего , но я использовал fuser ~ / .myfile.txt.swp , который дал мне PID сеанса vim. Запуск ps aux | grep Мне удалось узнать, какой сеанс vim я использую, что дало мне подсказку, в каком окне он был открыт.

Благодаря вдохновению Джайлза, его настойчивости и удаче, Я придумал следующую команду:

⚘ (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 }'))

Чтобы объяснить, что это делает:

(FNAME="/tmp/.fnord.txt.swp";

Это создает подоболочку и устанавливает FNAME в качестве переменной среды. Строго говоря, в этом нет необходимости - вы можете просто заменить $ FNAME на имя файла самостоятельно, но это действительно упрощает редактирование. Теперь работаем изнутри:

lsof -t $FNAME

Это производит только PID процесса, открывшего файл.

ps -o tty= -p $(...)

Это дает pts PID, который мы нашли с помощью lsof .

tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}'

Это создает список панелей, содержащий записи типа session: 0.1 / dev / pts / 1 . Первая часть - это формат, который нравится tmux для целей, а вторая часть - это pts

| grep $(...)$

. Эта часть фильтрует наш список панелей - конечный $ соответствует только один , о котором мы заботимся.Я обнаружил это совершенно случайно, так как у меня было pts / 2 и pts / 22 , так что было два совпадений, упс!

| awk '{ print $1 }'

Это создает часть session: 0.1 вывода панели, которая подходит для передачи в tmux switch -t .

Это должно работать как для сеансов, так и для панелей, фокусируя внимание на панели, содержащей ваш файл подкачки.

9
27.01.2020, 20:49

общий ответ на ваш вопрос::

for all the tmux sessions:
  for all the windows in the session:
      for all the panes in windows:
         for all sub process pids (recursively):
            find the open files

все сеансы :список tmux -сеансы -F ' #{сеанс _идентификатор} :#{сеанс _имя}

все окна :tmux list -windows -F ' #{window _id}XX #{window _index}XX #{window _name}' -t "$ сеанс _идентификатор"

все панели :tmux list -panes -F ' #{pane _id} :#{pane _index} :#{pane _pid}' -t ""$session _id" :"$window _индекс""

все подпроцессы pids :ps -o pid --нет -заголовков --ppid $pid

открыть файлы :lsof -p $pid

Реализация вышеуказанного, которая отображает дерево:

sessions
   windows
      panes
         process
            open files

чтобы показать, какой процесс имеет открытый файл (vim и в моем случае ).

enter image description here

можно найти по адресуhttps://github.com/nkh/tmux-ls

он находится на github уже 5 лет, но я призываю вас клонировать его на случай его удаления (или сбоя github)

0
05.10.2021, 15:17

Теги

Похожие вопросы