Usando vi keybindings para readline, como eu vou para o início da linha?

2

Em um comando multilinha, há uma diferença entre

  • Início da linha
  • Início do comando

usando as combinações de teclas vim set -o vi PARA READLINE (ex., bash, psql etc) , como eu vou para o início da linha e não para o início do comando.

Esta questão não está no VIM. Está no vi keybinidngs para aplicações readline .

Copie isso ... tudo isso (a citação do bloco de múltiplas linhas abaixo)

In a multiline command, there is a difference between

  • Start of the line
  • Start of the command

using the vim keybindings set -o vi, how do I go to the start of the line and not the start of the command.

Agora siga estas instruções.

  1. Digite echo "
  2. Cole o acima.
  3. Digite " para finalizar o comando e pressione Enter .

Agora pressione a seta para cima para colocar isso no buffer de comando.

  1. Como você agora vai para o início e o fim de uma linha, não o comando ?
  2. Como você subiu uma linha em um comando de várias linhas, não para um comando diferente ?
por Evan Carroll 03.04.2017 / 22:34

4 respostas

2

  • Start of the line
  • Start of the command

É fácil provar que a distinção entre essas duas coisas (em um comando multilinha) dentro de readline / bash não pode ser executada . E desde que a distinção não pode ser realizada, não pode haver atalhos de teclado para cada um.

Tudo abaixo assume set -o vi

Digamos que eu digite o seguinte em um prompt bash (eu também pressiono Return e a saída é gerada):

[~]$ echo "yay
> yep
> yup"
yay
yep
yup

Em seguida, pressione Esc , k e obtenha o seguinte ( {.} é a localização do cursor):

[~]$ {e}cho "yay
yep
yup"

Observe algumas coisas:

  1. PS2 ( > na minha máquina) não foi impresso como quando eu digitei diretamente.
  2. Se eu continuar pressionando k e / ou j , eu rola os comandos anteriores, não as linhas no comando.

Portanto, vamos fazer uma hipótese de que estamos realmente editando não várias linhas , mas uma linha única que contém caracteres de nova linha (Sim, há uma grande diferença nisso. O comando o histórico (na memória) é armazenado como uma lista encadeada, não como texto separado por novas linhas.).

E vamos tentar encontrar uma maneira de provar que a linha se torna vários comandos apenas quando o interpretador a analisa. Aqui está um comando da seção readline de man bash :

comment-begin (''#'')
              The  string that is inserted when the readline insert-comment command is executed.  This command is bound to
              M-# in emacs mode and to # in vi command mode.

Basicamente, se atingirmos # , a linha deve ser comentada e passada para o interpretador (não tenho certeza porque é passada para o interpretador, para aparecer na história, eu acho). De qualquer maneira, sabemos que, se pressionarmos # , um comando readline será executado, ou seja, não é um biting de edição (que deve ser "search next" em Vi).

Vamos primeiro mais o cursor até o final pressionando $ :

[~]$ echo "yay
yep
yup{"}

E agora atingimos # , as coisas acontecem e é assim que a sessão do shell aparece:

[~]$ #echo "yay
yep
yup"
bash: yep: command not found
> { }

Isso parece estranho, certo? Mas é exatamente o que pedimos, readline comentou a linha e passou para o parser. echo "yay foi comentado, o shell tentou executar yep e vemos PS2 porque temos uma citação inacabada de yup" . Digite " Retorna para sair.

Então, o que podemos concluir é que readline não faz distinção entre as linhas no comando multilinha que inserimos acima. Se readline não faz uma distinção, o modo Vi, que está no topo, também não pode fazer a distinção.

Se você precisar editar várias linhas separadamente uma da outra, siga a resposta @ BartonChittenden (+1) e entre no editor. Um editor separa as linhas em entidades diferentes, para que você possa navegar entre elas.

    
por 04.04.2017 / 04:33
2

Não tenho certeza se isso é exatamente o que você está pedindo, mas suspeito que possa ser a coisa mais próxima que você conseguirá.

esc v

Será aberto o comando atual no editor escolhido (por exemplo, $EDITOR ou o editor definido em /etc/alternatives no debian). Presumivelmente, você terá este definido para vi ou vim, e você pode navegar de uma linha para outra usando j , k , 0 , < kbd> $ etc.

Como bônus,

shopt -s lithist

manterá a formatação de linhas no histórico, em vez de concatenar comandos separados por ponto e vírgula.

Como notado por Evan Carroll, isso só funciona para o bash, mas muitos outros programas que usam readline também têm editores externos ... por exemplo, psql permite a edição de comandos usando \e .

    
por 04.04.2017 / 04:23
1
O

bash simplesmente não faz o que é solicitado: ele fica bem perto da imitação de vi do ksh. O recurso solicitado aqui não é um recurso vi , mas uma extensão fornecida pelo vim.

    
por 03.04.2017 / 23:17
0

A sequência Shift ^ parece funcionar para mim.

    
por 03.04.2017 / 22:51