Suponha que eu tenha algum layout arbitrário de divisões no vim.
____________________
| one | two |
| | |
| |______|
| | three|
| | |
|___________|______|
Existe uma maneira de trocar one
e two
e manter o mesmo layout? É simples neste exemplo, mas estou procurando uma solução que ajude a layouts mais complexos.
ATUALIZAR:
Eu acho que deveria ser mais claro. Meu exemplo anterior foi uma simplificação do caso de uso real. Com uma instância real:
Como eu poderia trocar duas dessas divisões, mantendo o mesmo layout?
Atualizar! Mais de 3 anos depois ...
Coloquei a solução do sgriffin em um plugin do Vim que você pode instalar com facilidade! Instale-o com o seu gerenciador de plugins favorito e experimente: WindowSwap.vim
Respostas:
Um pouco atrasado para o post, mas me deparei com isso procurando por outra coisa. Escrevi duas funções há algum tempo para marcar uma janela e depois trocar buffers entre janelas. Parece ser o que você está pedindo.
Basta colocá-los no seu .vimrc e mapear as funções como achar melhor:
Para usar (assumindo que o mapleader esteja definido como \), você deve:
Voila! Buffers trocados sem estragar o layout da sua janela!
fonte
noremap
nos mapeamentos para fazê-lo funcionar. Não sei por que, mas espero que ajude quem descobrir isso mais tarde. : D0r!figlet one
[duas, três, etc], depois testei. Antes de prosseguir, verifiquei o github, encontrei seu plugin (wes), com trocas animadas de janelas de figlet e um link para essa mesma resposta (que eu tinha como comentário no meu .vimrc). Eu senti como se já tivesse feito e carregado, e depois esqueci. Enfim, bom trabalho! Salva-me algum trabalho :)Começando com isso:
Torne 'três' a janela ativa e, em seguida, emita o comando ctrl+ w J. Isso move a janela atual para preencher a parte inferior da tela, deixando você com:
Agora, torne 'um' ou 'dois' a janela ativa e, em seguida, emita o comando ctrl+ w r. Isso 'rotaciona' as janelas na linha atual, deixando você com:
Agora faça 'dois' a janela ativa e emita o comando ctrl+ w H. Isso move a janela atual para preencher a esquerda da tela, deixando você com:
Como você pode ver, a manobra é um pouco aleatória. Com 3 janelas, é um pouco como um daqueles quebra-cabeças de 'jogo de peças'. Eu não recomendo tentar isso se você tiver 4 ou mais janelas - seria melhor fechá-las e abri-las novamente nas posições desejadas.
Eu fiz um screencast demonstrando como trabalhar com janelas divididas no Vim .
fonte
ctrl-w r
funciona como um encanto. Obrigado pela dica! Aqui está o meu +1.\mw
/\pw
e este e tentei usar os dois por uma semana cada. Descobri que usar essa solução "nativa" funciona melhor, pois não preciso continuar instalando plug-ins nas dezenas de instalações do vim que tenho em servidores e máquinas e computadores remotos, desktops, laptops, tablets e todos os outros dispositivos. IOW, aprender esses comandos nativos (por exemploctrl-w r
) é realmente tudo o que você precisa para se comprometer com a memória muscular e pronto.Dê uma olhada
:h ctrl-w_ctrl-x
e / ou:h ctrl-w_ctrl-r
. Esses comandos permitem trocar ou girar janelas no layout atual.Editar: Na verdade, isso não funcionará nesta situação, porque somente será trocado na coluna ou linha atual. Você poderia ir a cada uma das janelas e selecionar o buffer de destino, mas isso é bem detalhado.
fonte
Randy está correto,
CTRL-W x
pois não deseja trocar janelas que não estão na mesma coluna / linha.Eu descobri que as
CTRL-W HJKL
chaves são mais úteis ao manipular janelas. Eles forçarão sua janela atual a sair de seu local atual e solicitarão que ocupe toda a borda indicada pela direção da tecla pressionada. Veja:help window-moving
para mais detalhes.Para o seu exemplo acima, se você iniciar na janela "one", faça o que deseja:
Por conveniência, você pode atribuir as seqüências necessárias aos mapeamentos de teclas (consulte
:help mapping
).fonte
Eu tenho uma versão ligeiramente aprimorada da solução da sgriffin, você pode trocar o Windows sem usar dois comandos, mas com comandos HJKL intuitivos.
Então, aqui está como vai:
Tente mover sua janela usando HJKL maiúsculo no nó normal, é muito legal :)
fonte
Construir fortemente na resposta de @ sgriffin, aqui está algo ainda mais perto do que você está pedindo:
Entre em contato se o comportamento não corresponder às suas expectativas.
fonte
Também com base na solução de sgriffin, vá para a janela que você deseja trocar, pressione
CTRL-w m
, vá para a janela que você deseja trocar e pressioneCTRL-w m
novamente.CTRL-w m
é uma má escolha mnemônica; portanto, se alguém tiver uma melhor, edite-a.Além disso, gostaria de receber um feedback do script conhecido como "Janela marcada. Por favor, repita no destino", no entanto, sendo um noob vimscript, não sei como fazer isso.
Tudo isso dito, o script funciona bem como é
fonte
A abordagem a seguir pode ser conveniente se as funções não estiverem disponíveis por algum motivo (por exemplo, não é o seu vim).
Use o
:buffers
comando para descobrir IDs de buffers abertos, navegue até a janela desejada e use comandos como:b 5
para abrir um buffer (neste caso, número de buffer 5). Repita duas vezes e o conteúdo das janelas é trocado."Inventei" esse método depois de várias tentativas de memorizar
ctrl-w-something
sequências, mesmo para layouts muito simples, como um-dois-três na pergunta original.fonte
Muito legal, mas a minha proposta para o mapeamento é usar ^ W ^ J em vez de J (porque todos hjkl já têm significados), além de também eu puxar no novo buffer, porque pelo tempo que você quiser trocar em torno de você provavelmente não deseja continuar editando o buffer em que você já está. Aqui vai:
fonte
Todas as respostas acima são ótimas, infelizmente essas soluções não funcionam bem em combinação com as janelas QuickFix ou LocationList (eu corri nesse problema ao tentar fazer com que o buffer da mensagem de erro do Ale funcionasse com isso).
Solução
Portanto, adicionei uma linha extra de código para fechar todas essas janelas antes de fazer a troca.
exe ':windo if &buftype == "quickfix" || &buftype == "locationlist" | lclose | endif'
O código total se parece;
Créditos para a função de swap para Brandon Orther
Por que é necessário
A razão pela qual as funções de troca não funcionam corretamente sem remover todas as janelas QuickFix (QF) e LocationList (LL) é porque, se o pai do QF / LL armazena o buffer em oculto (e não é mostrado em nenhum lugar em uma janela), o QF / LL acoplada a ele é removida. Isso não é um problema em si, mas quando a janela oculta todos os números de janela são reatribuídos e a troca é confusa, pois o número salvo da primeira janela marcada é (potencialmente) que não existe mais.
Para colocar essa perspectiva:
Primeira marca da janela
Segunda marca da janela
Primeiro comutador de buffer, a janela um é preenchida com o buffer da janela três. Assim, a janela QF é removida, pois não tem mais janela pai. Isso reorganiza os números do Windows. Observe que curNum (o número da janela selecionada em segundo lugar) está apontando para uma janela que não existe mais.
Portanto, ao alternar o segundo buffer, ele tenta selecionar a janela curNum, que não existe mais. Portanto, ele o cria e alterna o buffer, resultando em uma janela indesejada a ser aberta ainda.
fonte
Abordagem similar de marcar a janela e trocar o buffer, mas também permite reutilizar a última troca.
fonte
set hidden
.vimrc, não há necessidade de ocultar manualmente os buffers.Você também pode usar um gerenciador de janelas lado a lado como o X-monad
fonte