Screen: Agrupando toda a invocação do vim em uma janela

1

Na tela, seria possível abrir todas as instâncias do vim em uma janela? (por exemplo, janela 2) Inicialmente, a janela mudará para a janela designada e abrirá o arquivo no buffer. E consequente invocação do vim (de outras janelas) irá abrir o arquivo em uma nova aba do vim naquela janela. Eu estou correndo cygwin.

    
por Forethinker 09.03.2013 / 21:59

2 respostas

1

Esta é uma ótima pergunta e uma ótima ideia! Mal posso esperar para incorporá-lo ao meu fluxo de trabalho.

De qualquer forma, na minha opinião, a melhor maneira de conseguir isso é usar a funcionalidade de servidor do vim, que permite controlar sua instância vim em execução usando o comando vim.

A ideia é que na primeira vez que você executar o vim, você o executará como:

vim --servername $VIM_SERVER_NAME

e, em seguida, toda vez que você quiser abrir uma nova guia nessa instância, será executado:

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

Além disso, a única coisa que você precisará adicionar é a lógica para identificar e alternar para a janela vim (que pode ser feita usando o título da janela).

Eu coloquei tudo isso junto na seguinte função de shell:

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
}

Se você adicionar essa definição de função em ~/.profile (ou ~/.bash_profile se você usar o bash), sempre que quiser usar o vim, use apenas v . Ele irá verificar se você está atualmente em uma sessão de tela e, em caso afirmativo, usará a janela designada do vim e mudará para ela (ou tornará a janela atual a janela designada do vim se não existir), caso contrário, usará o vim normalmente. Ele também deve funcionar mesmo se você estiver usando várias sessões de tela ao mesmo tempo e estiver usando v em todas elas.

Repare que eu também redefino o título da janela para o nome do shell se / quando você sair do servidor vim, isto é para evitar duas ou mais janelas com o título "vim" se você usar v em uma janela diferente após fechando em um.

Como sou mais do tipo tmux, esta é a função de shell que estou planejando usar:

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
}

Esta versão da função irá funcionar tanto para o tmux como para o screen (quantas sessões diferentes você quiser), e também para o vim normal, se não dentro de qualquer um dos dois.

    
por 10.03.2013 / 20:24
0

Você não pode executar duas instâncias do vim em diferentes janelas de tela que permitirão editar um arquivo simultaneamente de ambas as instâncias. Se você tentar abrir uma segunda instância do vim para editar o mesmo arquivo, receberá uma mensagem avisando que o arquivo já está sendo editado.

Dito isto, você pode abrir uma segunda instância do vim em uma nova janela de tela para visualizar o arquivo atual executando este comando dentro do vim:

:!screen screen vim -R %

A opção -R inicia o vim no modo somente leitura.

    
por 09.03.2013 / 22:41