내 파일이 열려 있는 vim/tmux를 찾을 수 있나요?

내 파일이 열려 있는 vim/tmux를 찾을 수 있나요?

저는 tmux직장에서 IDE로 사용하고 있습니다. 또한 vim다양한 tmux 창에서 실행하고 프로세스를 백그라운드에 두는 경우가 많습니다(또는 그냥 창을 닫습니다. 창이 닫힐 때 열려 있는 버퍼를 삭제하지 않도록 vim을 구성했습니다). 이제 편집하려는 파일이 다른 vim 세션 중 하나에 열려 있는데 어느 세션인지 모르기 때문에 문제가 발생했습니다.

모든 창과 창을 수동으로 확인하지 않고도 어느 창을 찾을 수 있습니까? 내 특별한 경우에는 아무것도 반환되지 않았기 vim ~/myfile.txt때문에 편집하지 않았다는 것을 알고 있습니다 .ps aux | grep myfile.txt

답변1

그것은 나에게 말하지 않는다모든 것, 그러나 나는 fuser ~/.myfile.txt.swpvim 세션의 PID를 제공하는 것을 사용했습니다. 이것을 실행한 후에 ps aux | grep <PID>는 내가 어떤 vim 세션을 사용하고 있는지 알 수 있었고, 어떤 창에서 열려 있는지에 대한 힌트를 얻었습니다.

Giles의 영감과 약간의 끈기와 행운 덕분에 저는 다음 명령을 생각해냈습니다.

⚘ (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.

이는 세션과 창 모두에서 작동하며 스왑 파일이 포함된 창에 포커스를 둡니다.

답변2

귀하의 질문에 대한 요약 답변은 다음과 같습니다.

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 list-sessions -F '#{session_id}:#{session_name}

모든 창: tmux list-windows -F '#{window_id}XX#{window_index}XX#{window_name}' -t "$session_id"

모든 창: tmux list-panes -F '#{pane_id}:#{pane_index}:#{pane_pid}' -t ""$session_id":"$window_index""

모든 하위 프로세스 pid: ps -o pid --no-headers --ppid $pid

파일 열기: lsof -p $pid

위의 구현은 트리를 보여줍니다.

sessions
   windows
      panes
         process
            open files

파일이 열려 있는 프로세스를 표시합니다(제 경우에는 vim이기도 함).

여기에 이미지 설명을 입력하세요.

다음에서 찾을 수 있습니다.https://github.com/nkh/tmux-ls

5년 동안 github에 있었지만 삭제되거나 github이 충돌할 경우를 대비해 복제하는 것이 좋습니다.

관련 정보