Como mover o cursor palavra por palavra no OS X Terminal

762

Eu conheço a combinação Ctrl+ Apara pular para o início do comando atual e Ctrl+ Epara pular para o final.

Mas existe alguma maneira de pular palavra por palavra, como Alt+ / nos aplicativos de cacau faz?

o homem de lata
fonte
2
Qual shell você está usando? Bater?
Sargun Dhillon 17/09/08
4
O iTerm2 é muito melhor do que o terminal embutido. Eu postei instruções abaixo sobre como personalizar o teclado :)
CWD
21
Os ALTatalhos foram adicionados ao Terminal na versão mais recente do OS X.
Mosty Mostacho
7
Na minha opinião, isso não está fora de tópico, o Bash shell é um ambiente de programação relevante e as ligações de linha de leitura são difundidas nos aplicativos Linux CLI mais populares. Além disso, observe o número de votos, a comunidade falou.
GL2014
11
Reabra a votação, o OS X Terminal conta muito como uma ferramenta de programação.
27416 djechlin

Respostas:

567

Fora da caixa, você pode usar o Esc+ bastante bizarro Fpara ir para o início da próxima palavra e Esc+ Bpara ir para o início da palavra atual.

Kristian J.
fonte
47
Era inconveniente pressionar novamente as duas teclas para executar novamente o comando. Eu acho muito ruim fazer isso no Mac OSX Terminal, compare com o GNOME Terminal.
Phương Nguyễn
245
Você pode ativar "Use Option como meta key" em Terminal> Preferências> Configurações> [perfil]> Teclado . Então você não precisa digitar manualmente o Esc separadamente.
Chris Página
7
Além disso, se você pressionar Esc+ Fquando no final de uma linha ou a outra combinação de teclas no início da linha, ela apenas inserirá a letra. Irritante!
Noldorin
10
Re “bizarro”: Os “F” e “B” significam “Avançar” e “Voltar”. Control-F move o cursor para frente Um caractere e Control-B move o cursor para trás um. Usar o modificador Meta (ou ESC) significa "mover por palavras". Essas são ligações compatíveis com o emacs. Se você estiver usando o bash, há uma opção para usar ligações compatíveis com vi, ou você pode personalizá-las totalmente com ~/.inputrc.
Chris Page
5
Infelizmente, o uso da opção como meta não é uma opção para aqueles que precisam da tecla de opção para digitar símbolos importantes do shell, como ~ e | (como em um teclado francês).
Eric O Lebigot
417

No Mac OS X - os seguintes atalhos de teclado funcionam por padrão. Observe que você precisa fazer com que a tecla Option atue como meta nas preferências do terminal (na guia teclado)

  • alt (⌥)+ Fpara pular F com uma palavra
  • alt (⌥)+ Bpara pular B desajeitado por uma palavra

Eu observei que as combinações de teclas padrão do emacs para navegação simples por texto parecem funcionar em shells bash. Você pode usar

  • alt (⌥)+ Dpara excluir uma palavra começando na posição atual do cursor
  • ctrl+ Apara pular para o início da linha
  • ctrl+ Epara pular para o final da linha
  • ctrl+ Kpara eliminar a linha a partir da posição do cursor
  • ctrl+ Ypara colar texto do buffer de interrupção
  • ctrl+ Rpara reverter a pesquisa de comandos digitados no passado a partir do seu histórico
  • ctrl+ Spara encaminhar a pesquisa (funciona no zsh para mim, mas não no bash)
  • ctrl+ Fpara avançar com um caractere
  • ctrl+ Bpara retroceder um caractere
  • ctrl+ Wpara remover a palavra para trás da posição do cursor
Varun Katta
fonte
1
Obrigado! Fiquei me perguntando por que não funcionou imediatamente, era exatamente isso que eu precisava.
Flov 20/08/11
11
Você pode alterar a meta no iterm2 da seguinte maneira: Preferências -> Perfis -> Teclas -> Tecla de opção esquerda atua como +ESC, então você pode usar a OPÇÃO f / b para mover a palavra para frente e para trás de acordo. Mais
Alan Dong
5
[ Ctrl + W ] - para remover a palavra para trás a partir da posição do cursor
YemSalat
[ctrl + u] - para excluir a entrada inteira #
Cornelius
286

Veja como você pode fazer isso

Por padrão, o Terminal possui estes atalhos para mover (esquerda e direita) palavra por palavra:

  • esc+ B(esquerda)
  • esc+ F(direita)

Você pode configurar alt+ e gerar essas sequências para você:

  • Abra as preferências do Terminal ( cmd+ ,);
  • Na guia Configurações, selecione Teclado e clique duas vezes, ⌥ ←se houver, ou adicione-o, se não estiver.
  • Defina o modificador conforme desejado e digite a tecla de atalho na caixa: esc+ B, gerando o texto \033b(você não pode digitar esse texto manualmente).
  • Repita para a palavra direita ( esc+ Fse torna \033f)

Como alternativa, você pode consultar esta postagem do blog em textmate:

http://blog.macromates.com/2006/word-movement-in-terminal/

Fil
fonte
7
Para usuários do MacOSX 10+ e iTerm: você atribui o atalho de teclas nas preferências globais ou como uma combinação de teclas de perfil. Certifique-se de que você selecione: "Enviar Seqüência de Escape" no menu suspenso selecionar e entrada apenas Bpara trás ou Fpara a frente para o Esc+campo
Gus
+1 para um ótimo mnemônico no qual não pensei antes. Definitivamente vou / infelizmente não lembrar disso agora, porque eu configurado alt lefte alt rightpara gerar essas sequências
Arc676
Se eu adicionar o Mapeamento de Chaves ao Terminal, ele o vincula a '^ [B' em vez de Esc-B.
Andrea Bergonzo
164

Mude para o iTerm2 . É gratuito e muito melhor do que o terminal antigo comum. Também possui muito mais opções de personalização, como atalhos de teclado.

Também adoro o fato de você poder usar o cmd1-9 para alternar entre as guias. Experimente e você nunca voltará ao terminal normal :)

Como configurar preferências de teclado personalizadas no iterm2

  • Instale o iTerm2
  • Inicie e vá para o painel de preferências.
  • Escolha a guia perfis do teclado
  • Você precisará copiar o perfil para algo novo e excluir os atalhos das teclas de seta, como ^+ Right/ Leftou, se você não se importa com um backup, exclua-os do perfil padrão.
  • Em seguida, verifique se seu perfil modificado está selecionado (com estrela)

Figura 1.png

  • Agora escolha a guia do teclado (linha superior)

iTerm 2

  • Clique no botão de adição para adicionar um novo atalho de teclado
  • Na primeira caixa, digite CMD+Left arrow
  • Na segunda caixa, escolha "enviar código de escape"
  • Na terceira caixa, digite a letra B

Figura 2.png

  • Repita com as combinações de teclas desejadas. escape+ Bmove uma palavra para a esquerda, escape+ fmove uma palavra para a direita.
  • você também pode configurar cmd+ dpara excluir a palavra na frente do cursor com escape+d

Costumo pressionar o botão errado ( cmd/ control/ alt) com uma tecla de seta e, portanto, tenho minhas combinações de teclas de seta com esses botões configurados para pular para frente e para trás, mas faça o que melhor lhe convier.

cwd
fonte
4
Não importa o que eu faço, eu não posso entrar Ctrl + Arrow Leftou Right- Upe Downfunciona: / tentei com e sem o novo conjunto de perfis como padrão
Tobi
4
Solução: Eu tive que desativar os atalhos de controle de missão em Preferências MacOS Sistema -> Teclado :)
Tobi
A instrução acima não funciona mais com o iTerm2. Por favor, veja minhas respostas abaixo para o iTerm2 Build 3.3.4.
Pendure
150

Na verdade, existe uma abordagem muito melhor. Mantenha pressionado option( altem alguns teclados) e pressione as teclas de seta para a esquerda ou direita para mover por palavra. Simples assim.

option
option

Também ctrleo levará ao final da linha e ctrlao levará ao início.

mdubez
fonte
2
Às vezes, isso não funciona em certos casos. Para mim, quando abri o Terminal.app, estava tudo bem, mas para o IntelliJ, apenas imprimi [De [C. Para corrigir isso, adicione bind '"[D": backward-word'e bind '"[C": forward-word'ao meu .bashrc.
Jamie Counsell
@JamieCounsell adicionei coisa de ligação à minha, .bashrcmas não funcionou, algo de errado para mim? (Eu uso RubyMine)
#
@ 张艳军 Não sei se o RubyMine lê .bashrcquando o terminal é inicializado. Experimente echo "here"e veja se essa mensagem é exibida quando você abre um novo terminal. Além disso, você deve fechar e reabrir o terminal ou executar source ~/.bashrcpara que ele leia o novo arquivo.
Jamie Counsell
79

Tenho Alt+ / trabalhando: abra Preferências »Configurações» Teclado , defina a entrada para o cursor da opção à esquerda para enviar a string para o shell: \ 033b e defina a opção cursor para a direita para enviar a string para o shell: \ 033f . Você também pode usar isso para outras combinações de teclas de controle.

Peter Hilton
fonte
20
Para obter o \ 033b, você realmente precisa pressionar Esc e, em seguida, b.
Matthew Schinckel
7
Estou no Snow Leopard e acho que só funciona quando você habilita Enable option as meta key. A propósito, é muito legal. A chave é a certeza de ser muito mais conveniente para ser alcançado comparar com Esc + B ou Esc + F
Phương Nguyễn
2
Por curiosidade, o que exatamente está acontecendo aqui? Por que esse código é diferente para começar no OSX? Como posso encontrar outros códigos desse tipo?
31511 Koobz
no meu mac suas Preferências> Perfis> Chaves esquerda tecla de opção como + EFC
Arun
38

Na verdade, depende de qual shell você usa, no entanto, a maioria das conchas tem ligações semelhantes. As ligações às quais você está se referindo (por exemplo, Ctrl+ Ae Ctrl+ E) são ligações que você encontrará em muitos outros programas e são usadas há muito tempo; o BTW também funciona na maioria dos aplicativos de interface do usuário.

Aqui está uma olhada nas ligações padrão do Bash:

Atalhos de teclado Bash mais importantes

Observe também que você pode personalizá-los. Você precisa criar um arquivo com o nome que desejar, nomeei meu .bash_key_bindings e coloquei no meu diretório pessoal. Lá, você pode definir algumas opções gerais do bash e também as ligações de teclas. Para garantir que eles sejam aplicados, você precisa modificar um arquivo chamado ".bashrc" que o bash lê durante a inicialização (você deve criá-lo, se ele não existir) e fazer a seguinte chamada:

bind -f ~/.bash_key_bindings

~ significa o diretório home no bash, como mencionado acima, você pode nomear o arquivo como quiser e também colocá-lo onde quiser, desde que alimente o caminho certo + nome para vincular.

Deixe-me mostrar alguns trechos do meu arquivo .bash_key_bindings:

set meta-flag on
set input-meta on
set output-meta on
set convert-meta off
set show-all-if-ambiguous on
set bell-style none
set print-completions-horizontally off

Eles apenas definem algumas opções (por exemplo, desativar a campainha; isso pode ser consultado na página do bash).

"A": self-insert
"B": self-insert
"C": self-insert
"D": self-insert
"E": self-insert
"F": self-insert
"G": self-insert
"H": self-insert
"I": self-insert
"J": self-insert

Isso garante que os caracteres sozinhos não façam nada além de garantir que o caractere seja "digitado" (eles se inserem no shell).

"\C-dW": kill-word
"\C-dL": kill-line
"\C-dw": backward-kill-word
"\C-dl": backward-kill-line
"\C-da": kill-line

Isso é bem interessante. Se eu pressionar Ctrl+ Dsozinho (selecionei d para excluir), nada acontece. Mas se eu digitar uma letra minúscula w, a palavra à esquerda do cursor será excluída. Se eu digitar uma letra maiúscula, no entanto, a palavra à direita do cursor é eliminada. O mesmo vale para L e L em relação a toda a linha, começando pelo cursor. Se eu digitar um "a", toda a linha será realmente excluída (tudo antes e depois do cursor).

Coloquei pulando uma palavra para frente em Ctrl+ Fe uma palavra para trás em Ctrl+B

"\C-f": forward-word
"\C-b": backward-word

Como você pode ver, você pode criar um atalho, que leva a uma ação imediatamente, ou você pode criar um, que apenas inicia uma sequência de caracteres e é necessário digitar um (ou mais) caracteres para fazer com que uma ação ocorra como mostrado no exemplo mais acima.

Portanto, se você não estiver satisfeito com as ligações padrão, sinta-se à vontade para personalizá-las conforme desejar. Aqui está um link para o manual do bash para obter mais informações.

Mecki
fonte
como está o commandcódigo da chave? No seu exemplo, controlé \C, mas como é command?
Paschalis
Basicamente eu quero para mapear Ctrl + A para CMD + esquerda (vá para o início da linha)
Paschalis
1
@ Paschalis No MacOS X, a tecla de comando é mapeada para Metabash ( \M), cmd + left \M-\e[D. No entanto, você não pode mapear o cmd + ... para nada, todos os atalhos de comando são manipulados (e, portanto, engolidos) pelo próprio aplicativo Terminal (eles nunca são encaminhados para o shell) e o cmd + deixou os mapas na "janela anterior" se você tiver vários janelas do terminal abertas. Desculpe, mas não é possível com o aplicativo Terminal.
Mecki
18

Use a predefinição de edição de texto natural !

insira a descrição da imagem aqui

Essencialmente, ele liga, entre outras seqüências de teclas, Option + LeftArrow à ^[bsequência e Option + RightArrow a^[f

Isso funciona em fish e bash, assim como no terminal psql.

Dziamid
fonte
Essa é a maneira mais eficiente de definir um bom mapeamento antigo para chaves. Obrigado!
fedesismo
Caso alguém fique confuso como eu, observe que essa predefinição está disponível apenas na subguia Chaves do perfil , não na guia Chaves de nível superior .
ben-albrecht
15

Se você for um usuário do Vim, tente o modo vim do bash. Execute isso ou coloque-o no seu ~/.bashrcarquivo:

set -o vi

Por padrão, você está no modo de inserção; pressione escape e você poderá se movimentar da mesma maneira que no Vim de modo normal; portanto, o movimento por palavra é wou b, e as teclas de movimento habituais também funcionam .

jches
fonte
15

Se você marcar Use option as meta keya guia teclado das preferências, os comandos padrão do estilo emacs para palavra para frente e para trás e ⌥F( Alt+ F) e ⌥B( Alt+ B) respectivamente.

Eu recomendo ler From Bash to Z-Shell . Se você deseja aumentar suas proezas bash / zsh!

Matt
fonte
1
Sim, isso funciona. Mas o problema é quando eu quero digitar chaves ([] {} |) que estão na Opção-7, Opção-8 e Opção-9. As opções agora são meta, e acabam com Meta-7, Meta-8 ... Alguma idéia?
1013 Martin Martin Wickman
12

A partir do Mac OS X Lion 10.7, o Terminal mapeia Option- Left/Right Arrowpor Esc- b/fpor padrão, agora ele está embutido no bash e em outros programas que usam essas combinações de teclas compatíveis com o emacs.

Chris Page
fonte
12

Mantenha pressionada a tecla Opção e clique no local em que deseja mover o cursor

Dan Alboteanu
fonte
1
Não é uma solução alternativa ruim.
duyn9uyen 4/04
8

No Bash, eles estão vinculados a Esc- Be Esc- F. O Bash possui muitos, muitos outros atalhos de teclado; dê uma olhada na saída de bind -ppara ver o que são.

Andy Lynch
fonte
4

Sob iterm2's Preferências> Perfil> Chaves , você clique no +abaixo mapeamentos chave e gravar um novo atalho. Para Ação , selecione Send Escape Sequencee digite bou fpara trás e para frente, respectivamente.

Quando tentei gravar um para ( Ctrl+ ), notei no campo Atalho do teclado que a seta nunca apareceu. Acontece que eu tive que desativar os atalhos padrão do System Preferences> Keyboard> Shortcuts> Mission Control primeiro para fazer com que as coisas funcionassem, pois eles substituiriam os atalhos padrão do iterm2. Também deve ser verdadeiro para o aplicativo de terminal padrão.

Preferências do sistema do teclado

qix
fonte
1

Nova resposta para usuários do iTerm2 Build 3.3.4:

Etapa 1: Preferências do sistema (macOS X)> Teclado> guia Atalhos> Selecionar Controle de missão (painel esquerdo)> Desmarque os atalhos marcados como "Mover para a esquerda em um espaço" e "Mover para a direita em um espaço"

Etapa 2: (iTerm2 Build 3.3.4) Preferências> Perfis> Selecionar * Padrão (painel esquerdo)> guia Teclas> Exclua as entradas "⌥->" e "⌥ <-"> Defina ambas as teclas "Left Option (⌥)": "e" Tecla de opção direita (⌥): "para Esc +

Sem mexer com perfis de shell, sem mexer com o terminal masOS inferior (padrão), sem Esc + F / B estranho, enxaguar e repetir sem sentido.

Negócio feito!!!

Aproveite esta dica, meus colegas PROGRAMADORES!

Aguentar
fonte
0

Conforme respondido anteriormente, você pode adicionar set -o visuas combinações ~/.bashrcpara usar vi/ vimteclas, ou pode adicionar a seguinte parte .bashrcpara mover com Ctrlas teclas de seta e de seta:

# bindings to move 1 word left/right with ctrl+left/right in terminal, just some apple stuff!
bind '"\e[5C": forward-word'
bind '"\e[5D": backward-word'
# bindings to move 1 word left/right with ctrl+left/right in iTerm2, just some apple stuff!
bind '"\e[1;5C": forward-word'
bind '"\e[1;5D": backward-word'

Para iniciar o efeito dessas linhas de código, source ~/.bashrcinicie uma nova sessão de terminal.

Chinmay
fonte