Estou usando uma nova instalação do ubuntu 16.04, com o shell bash. Há duas coisas que eu quero fazer:
- Configure o modo vi para que eu possa ter movimentos semelhantes a vim no terminal
- saia do modo de inserção digitando
jk
Eu li em outro post como isso pode ser feito zsh
, como eu posso fazer isso bash
?
tl; dr
colocar bind '"jk":vi-movement-mode'
no seu .bashrc
arquivo depois set -o vi
:)
server@thinkpad:~$ tail -n 2 .bashrc
set -o vi
bind '"jk":vi-movement-mode'
consulte a resposta de @ grochmal para obter uma explicação mais detalhada
bash
keyboard-shortcuts
vi
mbigras
fonte
fonte
jk
? Essa tecla é especial no seu teclado?.bashrc
normalmente é chamado em todos os shell (por exemplo, se você sairvi
), mas.bash_profile
é chamado apenas em shells de login. Então.bashrc
é o lugar certo paraset -o vi
. Eu não tenho uma resposta para a sua segunda pergunta revisada :-(set -o vi
entra.bashrc
, consulte Por que meu ~ / .bash_profile não funciona?Respostas:
TL; DR
O Bash tem uma funcionalidade semelhante à
zsh
dobindkey
meiobind
, mas não possui váriosvi
modos comozsh
. Depois queset -o vi
você pode fazer:que é o equivalente
zsh
abindkey -M <all vi modes> jk vi-movement-mode
As
vi-movement-mode
funções são origináriasinputrc
(veja/etc/inputrc
uma lista delas).Texto completo
Como Stephen Harris aponta em seu comentário:
.bashrc
é chamado porbash
sempre (e principalmente não por outras conchas)..bash_profile
é chamado apenas em shells de login (e novamente, somente no bash).Várias distros vêm com um
.bash_profile
esqueleto com a seguinte aparência:Qual é um bom conteúdo,
.bash_profile
pois você pode simplesmente esquecer que ele existe.Agora, para mapear jka Escna sessão shell, que não é realmente possível. Quando você faz:
No Vim, depois que você digita j, o Vim sabe que precisa esperar um pouco para ver se você digita a kseguir e deve chamar o mapeamento (ou que você digita outra chave e o mapeamento não deve ser acionado). Como um adendo, isso é controlado pelo
:set timeoutlen=<miliseconds>
Vim (consulte:h timeoutlen
).Vários shell ou X11 não têm esse controle de tempo limite e não permitem mapeamentos de caracteres múltiplos. Somente o mapeamento de uma única chave é permitido (mas consulte as notas de suporte abaixo.).
Não lê
.vimrc
, apenas imita algumas combinações de teclasvi
(nem mesmovim
) que podem ser usadas no shell. O mesmo pode ser dito sobre-o emacs
, ele não vem com todo o poder deemacs
.suporte zsh
zsh
realmente suporta o tempo limite do mapa. E você pode usar o seguinte para mapearjk
para<esc>
:(Isso precisará ir para
~/.zshrc
não~/.bashrc
)No entanto, eu aconselho contra isso. Eu uso
vim
e nazsh
maioria das vezes. Eu tenhoinoremap jk <esc>
no meuvimrc
e eu tentei usar abindkey
combinação acima.zsh
aguarda muito tempo para imprimirj
ao usá-lo, e isso me incomodou muito.suporte do bash
bash
suportareadline
bind
. Acredito quebash
possa ser compilado sem,readilne
portanto, pode haver alguns sistemas raros que possuem o bash que não suportambind
(fique atento). Para mapearjk
a<esc>
embash
que você precisa fazer:(sim, é necessário um duplo nível de citação)
Novamente, isso torna a digitação
j
bastante irritante. Mas de alguma forma menos irritante do que azsh
solução na minha máquina (provavelmente o tempo limite padrão é mais curto).Solução alternativa (para shells não bash e não zsh)
O motivo para remapear a Esctecla é que ela fica bem distante do teclado, e digitar leva tempo. Um truque que pode ser emprestado dos
emacs
caras é remapear, CapsLockjá que é uma chave inútil.emacs
caras remapear para Ctrlmas vamos remapear para Esc.Vamos usar
xev -event keyboard
para verificar o código-chave de CapsLock:E para verificar a função de Esc:
Muito bom, CapsLocké o keycode 66 e Esca função é chamada "Escape". Agora podemos fazer:
O acima deve ser feito nesta ordem. Agora, toda vez que você pressiona CapsLock, funciona como uma Escchave.
A parte complicada é onde definir isso. Um arquivo
~/.Xmodmap
com o conteúdo:Deve ser respeitado pela maioria das distros (na verdade, gerenciadores de exibição, mas estou dizendo distros por simplicidade), mas vi aqueles que não respeitam vários
~/X*
arquivos. Para tais distros, você pode tentar algo como:No seu
.bashrc
.(Em teoria, isso seria melhor colocado,
~/.xinitrc
mas se um gerente de exibição não o respeitar.Xmodmap
, definitivamente não o respeitará~/.xnintrc
.)Nota extra: Isso só remapeia CapsLocka Escem uma sessão X11, portanto, o mapa só irá funcionar em emuladores de terminal. O real
tty
não verá o mapa.Referências e leitura extra:
.bashrc
vs..bash_profile
fonte
jk
vez deCapsLock
? Coloquei na minha máquina osx; no entanto, eu não tê-lo para o resto do fim de semana e eu não me lembro como eu fiz isso :)zsh
:bindkey -v; bindkey -s jk \\e
. Mas isso é algo que vai voltar e mordê-lo de volta quando você precisajk
, porque o temporizador não é configurável e você não tem<leader>
nozsh
.zsh
e nãobash
, não é possível no bash?man bash
, acheibind
esse trabalho bem parecido comzsh
obindkey
. Vou atualizar a resposta. Lá vai você, estou usandozsh
demais.Obrigado, pelas respostas anteriores, eu uso isso no meu ~ / .zshrc para atalhos do tipo vi no meu terminal. Espero que ajude alguém.
fonte