- 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:
-
PS2
(>
na minha máquina) não foi impresso como quando eu digitei diretamente. - 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.