Estou usando o Bash no "modo vi". Qual é a sequência de teclas de atalho para editar a linha de comando atual usando um editor externo?

5

No modo "Emacs" do Bash ( set -o emacs ), eu posso editar a linha de comando atual no meu favorito externo $ EDITOR. Tudo o que tenho que fazer é pressionar Ctrl + X e depois Ctrl + E .

Mas, como mudei para o "modo vi" do Bash ( set -o vi ), esta sequência de teclas não faz nada. No "modo vi", como posso iniciar um editor externo para compor comandos mais longos?

    
por Alby 01.04.2014 / 17:47

3 respostas

8

A ligação do modo emacs executa o comando edit-and-execute-command. Para ver qual ligação o executa no modo vi, você pode dar o comando:

$ bind -m vi -q edit-and-execute-command
edit-and-execute-command is not bound to any keys.

O mais fácil seria adicionar uma ligação para ele

$ bind -m vi-insert '"\C-x\C-e": edit-and-execute-command'

Para torná-lo permanente, você pode adicioná-lo a ~ / .inputrc como

set keymap vi-insert
"\C-x\C-e": edit-and-execute-command
    
por 01.04.2014 / 21:35
1

Se você quiser especificar o editor padrão como vi , será necessário definir a variável de ambiente EDITOR :

export EDITOR=vi

Agora, o comando Ctrl-X Ctrl + E iniciaria vi .

    
por 01.04.2014 / 18:44
1

A resposta

Pressione ESC para entrar no modo de comando do vi e, em seguida, pressione v . O Bash iniciará o seu $ EDITOR escolhido. Se você não tiver escolhido um, o Bash iniciará o vi (o editor visual).

Explicação

Por que o ESC do Bash v inicia o vi?

Porque o bashline.c do Bash inclui a chamada de função:

rl_bind_key_if_unbound_in_map ('v', vi_edit_and_execute_command, vi_movement_keymap);

O que é vi_edit_and_execute_command ? É uma função Bash C, definida em outro lugar em bashline.c .

Um aparte. Eu experimentei um pouco, e o seguinte é o que eu agora suspeito ser verdade. Ligar Bash C funções é estranho. Você pode fazê-lo a partir do código-fonte do Bash, mas parece impossível fazê-lo usando o bind embutido no prompt do Bash. E, uma vez que você tenha feito isso, o bind builtin parece não reconhecer que já foi feito.

Agradeço Glenn Jackman por apontando que ESC v é a resposta, e dualbus e Riviera of Freenode #bash por me ajudar a descobrir a explicação acima.

    
por 08.01.2015 / 05:38