AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 484764
Accepted
user938271
user938271
Asked: 2018-11-29 13:06:05 +0800 CST2018-11-29 13:06:05 +0800 CST 2018-11-29 13:06:05 +0800 CST

Como evitar que o Vim traduza Cj em Cm quando iniciado pelo widget zle `edit-command-line`?

  • 772

Tenho o seguinte código no meu ~/.zshrc:

autoload -Uz edit-command-line
zle -N edit-command-line
bindkey '^X^E' edit-command-line

Ele liga o edit-command-linewidget zle à sequência de teclas C-x C-e. O widget é descrito em man zshcontrib(seção ZLE FUNCTIONS, subseção Widgets):

edit-command-line Edite a linha de comando usando seu editor visual, como em ksh.

          bindkey -M vicmd v edit-command-line

O objetivo é poder editar a linha de comando do shell atual, no editor padrão, pressionando C-x C-e, semelhante ao que a função readline edit-and-execute-commandfaz ( man bash, section READLINE, subsection Commands for Manipulating the History).

comando edit-and-execute (C-xC-e) Chama um editor na linha de comando atual e executa o resultado como comandos shell. O Bash tenta invocar $VISUAL, $EDITOR e emacs como editor, nessa ordem.

Meu editor padrão é o Vim 8.1(patches 1-538incluídos). Eu tenho mapeamentos do Vim, usando as teclas C-h, C-j, C-k, C-l, para mover o foco para as janelas vizinhas. Eles podem ser reduzidos a:

nnoremap <c-h> :<c-u>wincmd h<cr>
nnoremap <c-j> :<c-u>wincmd j<cr>
nnoremap <c-k> :<c-u>wincmd k<cr>
nnoremap <c-l> :<c-u>wincmd l<cr>

Todos eles funcionam como esperado em uma instância regular do Vim (iniciada executando $ vim). Mas C-jnão funciona como esperado quando o Vim foi iniciado por edit-command-line.

Quando pressiono C-x C-ewhile na linha de comando do shell, o zsh inicia o Vim. Se eu dividir a janela executando :split, pressione C-kpara mover para a janela superior, recebo duas janelas e o foco é movido para a superior. Mas então, se eu pressionar C-jpara voltar à janela inferior, nada acontece.

Não sei se é a causa do problema, mas se eu tentar inserir um literalC-j em um buffer do Vim (pressionando C-v C-j), ^Mé exibido (a notação de acento circunflexo para um retorno de carro). Em uma instância regular do Vim (iniciada executando $ vim), inserir um literal C-jresulta em um caractere cuja notação de acento circunflexo é ^@(um NUL).

Eu posso reproduzir o problema com este mínimo ~/.zshrc:

export EDITOR=vim
autoload -Uz edit-command-line
zle -N edit-command-line
bindkey '^X^E' edit-command-line

E este mínimo ~/.vimrc:

nnoremap <c-j> :echom 'C-j has been pressed'<cr>

PressionandoC-x C-e na linha de comando zsh inicia o Vim e, em seguida, pressionar C-jdeve imprimir e registrar a mensagem:

C-j has been pressed

Mas nada acontece.

Não consigo reproduzir o problema no bash, nem com o Neovim ( v0.3.2-752-g4d7c7f9). Além disso, inserir um literal C-jno Vim, quando este foi iniciado a partir do bash após pressionar C-x C-e, resulta em um NUL ( ^@). A mesma coisa quando o Neovim é iniciado a partir do bash ou zsh após pressionar C-x C-e.

┌────────┬──────┬─────┐
│        │ bash │ zsh │
├────────┼──────┼─────┤
│ Vim    │ ^@   │ ^M  │
├────────┼──────┼─────┤
│ Neovim │ ^@   │ ^@  │
└────────┴──────┴─────┘

Eu pensei que talvez alguma opção de terminal do Vim não estivesse configurada corretamente, então capturei a saída de:

:set termcap

do Vim iniciado por $ vim, e do Vim iniciado por C-x C-e. Mas a saída é idêntica em ambos os casos:

--- Terminal codes ---

  t_AL=^[[%p1%dL      t_DL=^[[%p1%dM      t_mr=^[[7m          t_se=^[[27m         t_us=^[[4m
  t_al=^[[L           t_dl=^[[M           t_ms=y              t_Sf=               t_ut=
  t_bc=               t_EC=               t_nd=^[[C           t_SH=               t_vb=^[g
  t_BE=               t_EI=^[[2 q         t_op=^[[39;49m      t_SI=^[[6 q         t_vi=^[[?25l
  t_BD=               t_fs=^G             t_RF=               t_Si=               t_VS=
  t_cd=^[[J           t_GP=               t_RB=               t_so=^[[7m          t_vs=^[[34l
  t_ce=^[[K           t_IE=               t_RC=               t_SR=^[[4 q         t_WP=
  t_cl=^[[H^[[J       t_IS=               t_RI=^[[%p1%dC      t_sr=^[M            t_WS=
  t_Ce=               t_ke=^[[?1l^[>      t_Ri=               t_ST=               t_xn=y
  t_Co=256            t_ks=^[[?1h^[=      t_RS=               t_Te=               t_xs=
  t_CS=               t_le=^H             t_RT=               t_Ts=               t_ZH=^[[3m
  t_CV=               t_mb=^[[5m          t_RV=               t_ts=^[]0;          t_ZR=^[[23m
  t_da=               t_md=^[[1m          t_Sb=               t_u7=               t_8f=
  t_db=               t_me=^[[0m          t_SC=               t_ue=^[[24m         t_8b=
  t_AB=^[[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m
  t_AF=^[[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m
  t_cm=^[[%i%p1%d;%p2%dH
  t_Cs=^[]12;%p1%s^G
  t_cs=^[[%i%p1%d;%p2%dr
  t_te=^[[2 q^[[?1004l^[[?1049l
  t_ti=^[[2 q^[[?1004h^[[?1049h
  t_ve=^[[34h^[[?25h

--- Terminal keys ---

t_#2 <S-Home>    ^[[1;2H   t_k6 <F6>        ^[[17~    t_kh <Home>      ^[[1~          <ð>        ^[p
t_#4 <S-Left>    ^[[1;2D   t_k7 <F7>        ^[[18~    t_kl <Left>      ^[OD           <ô>        ^[t
t_%i <S-Right>   ^[[1;2C   t_k8 <F8>        ^[[19~    t_kr <Right>     ^[OC           <õ>        ^[u
t_*7 <S-End>     ^[[1;2F   t_k9 <F9>        ^[[20~    t_ku <Up>        ^[OA           <ù>        ^[y
t_@7 <End>       ^[[4~     t_k; <F10>       ^[[21~         <á>        ^[a            <ú>        ^[z
t_F1 <F11>       ^[[23~    t_kB <S-Tab>     ^[[Z           <â>        ^[b            <Mouse>     ^[[M
t_F2 <F12>       ^[[24~    t_kD <Del>       ^[[3~          <ä>        ^[d            <S-F18>     ^[[O
t_k1 <F1>        ^[OP      t_kI <Insert>    ^[[2~          <å>        ^[e            <S-F19>     ^[[I
t_k2 <F2>        ^[OQ      t_kN <PageDown>  ^[[6~          <æ>        ^[f            <xUp>       ^[[1;*A
t_k3 <F3>        ^[OR      t_kP <PageUp>    ^[[5~          <ç>        ^[g            <xDown>     ^[[1;*B
t_k4 <F4>        ^[OS      t_kb <BS>        ^?             <í>        ^[m            <xLeft>     ^[[1;*D
t_k5 <F5>        ^[[15~    t_kd <Down>      ^[OB           <î>        ^[n            <xRight>    ^[[1;*C

A saída de $ stty -atambém é idêntica em bash e zsh:

speed 38400 baud; rows 33; columns 119; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff
-iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -flusho -extproc

estou a usarzsh 5.6.2-dev-1 (x86_64-pc-linux-gnu) .

Existe uma opção Vim ou zsh que deve ser definida para evitar que o Vim seja traduzido C-jquando C-miniciado pelo widget zle edit-command-line?

zsh vim
  • 1 1 respostas
  • 229 Views

1 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2018-12-03T03:01:41+08:002018-12-03T03:01:41+08:00

    Se você definir o seu $EDITORpara um script ou função que faz stty -a, você notará que as configurações do terminal no momento vimsão chamadas por edit-command-linezle (onde inlcro que faz com que o driver do dispositivo de terminal traduza NL para CR entre outras coisas) .

    ^Jé o caractere de nova linha, então vinculá-lo é um pouco delicado.

    Aqui, você pode contornar isso definindo uma vimfunção como:

    vim() STTY=sane command vim "$@"
    

    Ou adicione editar o STTY=sane(ou STTY=-inlcr) para edit-command-line.

    • 3

relate perguntas

  • Em que circunstâncias o executável encontrado primeiro no caminho não será usado

  • Symlinking para todos os arquivos de ponto e diretórios

  • Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _

  • Como incrementar uma variável nomeada dinamicamente em `zsh`

  • Por que não consigo definir uma variável somente leitura chamada path no zsh?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve