1

Можно ли на экране открыть все экземпляры vim в одном окне? (например, окно 2) Первоначально окно переключится на назначенное окно и откроет файл в буфере. И последующий вызов vim (из других окон) откроет файл в новой вкладке vim в этом окне. Я бегу Cygwin.

2 ответа2

1

Это отличный вопрос и отличная идея! Я не могу дождаться, чтобы включить его в свой рабочий процесс.

В любом случае, на мой взгляд, лучший способ добиться этого - использовать функциональность сервера vim, которая позволяет вам управлять запущенным экземпляром vim с помощью команды vim.

Идея состоит в том, что при первом запуске vim вы будете запускать его так:

vim --servername $VIM_SERVER_NAME

и затем каждый раз, когда вы хотите открыть новую вкладку в этом экземпляре, вы будете запускать:

vim --servername $VIM_SERVER_NAME --remote-tab $PATH_TO_FILE_TO_OPEN

Помимо этого, единственное, что вам нужно добавить, - это логика для идентификации и переключения в окно vim (что можно сделать с помощью заголовка окна).

Я собрал все это вместе в следующую функцию оболочки:

v() {
  if [ $STY ]; then
    # screen
    VIM_SERVER_NAME="VIM-SCREEN-$STY"

    if [ "`vim --serverlist | grep -i $VIM_SERVER_NAME`" = "" ]; then
      # No vim server, become the server
      screen -X title vim
      vim --servername $VIM_SERVER_NAME "$@"
      screen -X title `basename $SHELL`
    else
      # A vim server exists, use it, then switch to it.
      vim --servername $VIM_SERVER_NAME --remote-tab "$@"
      screen -X select vim
    fi
  else
    vim $@
  fi
}

Если вы добавите это определение функции в ~/.profile (или ~/.bash_profile если вы используете bash), тогда всякий раз, когда вы захотите использовать vim, просто используйте v . Он проверит, находитесь ли вы в данный момент в сеансе экрана, и если это так, он будет использовать назначенное окно vim и переключится на него (или сделает текущее окно назначенным окном vim, если оно не существует), в противном случае он вернется к использованию vim. обычно. Это также должно работать, даже если вы используете несколько сеансов экрана одновременно и используете v во всех из них.

Обратите внимание, что я также сбрасываю заголовок окна на имя оболочки, если / когда вы выходите из сервера vim, это позволяет избежать наличия двух или более окон с заголовком "vim", если вы используете v в другом окне после закрытия его в одном.

Поскольку я больше похож на tmux, то это функция оболочки, которую я на самом деле планирую использовать:

v() {
  if [ $STY ]; then
    # screen
    VIM_SERVER_NAME="VIM-SCREEN-$STY"

    if [ "`vim --serverlist | grep -i $VIM_SERVER_NAME`" = "" ]; then
      # No vim server, become the server
      screen -X title vim
      vim --servername $VIM_SERVER_NAME "$@"
      screen -X title `basename $SHELL`
    else
      # A vim server exists, use it, then switch to it.
      vim --servername $VIM_SERVER_NAME --remote-tab "$@"
      screen -X select vim
    fi
  elif [ $TMUX ]; then
    # tmux
    VIM_SERVER_NAME="VIM-TMUX-`tmux list-windows -F '#{session_name}' | head -1`"

    if [ "`vim --serverlist | grep -i $VIM_SERVER_NAME`" = "" ]; then
      # No vim server, become the server
      tmux rename-window vim
      vim --servername $VIM_SERVER_NAME "$@"
      tmux rename-window `basename $SHELL`
    else
      # A vim server exists, use it, then switch to it.
      vim --servername $VIM_SERVER_NAME --remote-tab "$@"
      tmux select-window -t vim
    fi
  else
    vim "$@"
  fi
}

Эта версия функции будет работать как для tmux, так и для screen (столько раз, сколько вам захочется), и откатится к обычному vim, если не внутри.

0

Вы не можете запустить два экземпляра vim в разных оконных окнах, что позволит вам редактировать один файл одновременно из обоих экземпляров. Если вы попытаетесь открыть второй экземпляр vim для редактирования того же файла, вы получите сообщение с предупреждением о том, что файл уже редактируется.

Тем не менее, вы можете открыть второй экземпляр vim в новом окне экрана, чтобы просмотреть текущий файл, выполнив эту команду в vim:

:!screen screen vim -R %

Опция -R запускает vim в режиме только для чтения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .