Можно ли на экране открыть все экземпляры vim в одном окне? (например, окно 2) Первоначально окно переключится на назначенное окно и откроет файл в буфере. И последующий вызов vim (из других окон) откроет файл в новой вкладке vim в этом окне. Я бегу Cygwin.
2 ответа
Это отличный вопрос и отличная идея! Я не могу дождаться, чтобы включить его в свой рабочий процесс.
В любом случае, на мой взгляд, лучший способ добиться этого - использовать функциональность сервера 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, если не внутри.
Вы не можете запустить два экземпляра vim в разных оконных окнах, что позволит вам редактировать один файл одновременно из обоих экземпляров. Если вы попытаетесь открыть второй экземпляр vim для редактирования того же файла, вы получите сообщение с предупреждением о том, что файл уже редактируется.
Тем не менее, вы можете открыть второй экземпляр vim в новом окне экрана, чтобы просмотреть текущий файл, выполнив эту команду в vim:
:!screen screen vim -R %
Опция -R
запускает vim в режиме только для чтения.