O modo Ex tem algum uso prático?

115

O Vim possui um modo Ex que pode ser inserido ao entrar Qe um modo de linha de comando que pode ser inserido com q:. Uma reclamação comum entre os novos usuários do vim é que eles entram nesses modos acidentalmente ao tentar sair do vim. Como tal, desativei essas chaves no meu ~/.vimrcpara não bater nelas acidentalmente (particularmente q:):

map q: <Nop>
nnoremap Q <nop>

Embora eu tenha lido a documentação do vim no Ex , sou um usuário moderadamente experiente do Vim e entenda a idéia básica por trás dele, ainda luto para encontrar algum uso para ele no meu uso diário do vim. Em geral, parece menos útil do que apenas digitar um comando de linha de comando padrão do vim com o prefixo :, pois as alterações não são repetidas imediatamente.

Ex tem algum uso diário prático no Vim moderno? Existe algo mais fácil de fazer no modo Ex do que com comandos padrão? Qual é a diferença entre o modo de linha de comando e o modo ex?

Andrew Ferrier
fonte
13
Qe q:são bem diferentes. Você está se referindo apenas à Qdireita?
51315 jamessan
@jamessan, na verdade, acontece que eu não tinha certeza ... você está certo, eles parecem fazer coisas diferentes, embora eu tenha assumido que eles eram basicamente os mesmos. Se você responder a essa pergunta, talvez ajude a esclarecer lá, como estou obviamente confuso.
Andrew Ferrier
Esta questão está sendo discutida no Meta .
200_success
1
@AndrewFerrier Você perguntou q:especificamente e o mencionou como, entre as duas principais sequências, a que você tem mais problemas. E duas das respostas aqui podem ser úteis para as pessoas que a procuram pelo termo correto.
usar o seguinte comando
4
Quando você aprender o que q/e q:fazer, provavelmente os considerará alguns dos comandos mais úteis no Vim. E sim, você sabe como usá-los, mas ainda não sabe o que eles fazem. Assista a este screencast para descobrir.
Sato Katsura

Respostas:

81

Qé, como você encontrou, no modo ex. Não é totalmente útil usar interativamente, mas existe porque o Vim pode ser usado para emular o exbinário antigo . De fato, muitos sistemas fornecem o excomando simplesmente simbolizando-o para vim.

q:, ou :<C-f>, em vez disso, fornece uma maneira de navegar pelo histórico da linha de comando e editá-lo como um buffer normal. Isso facilita a localização de um comando anterior executado, edita-o com os comandos normais do Vim e, em seguida, executa o comando modificado. Os comandos q/e q?existem para fornecer a mesma funcionalidade para o histórico de pesquisa.

jamessan
fonte
64

O Vim no modo Ex é útil quando:

  • Você precisa editar (vários) arquivos de maneira não interativa (como parte do script).
  • Sua conexão é muito lenta ou a tela não é atualizada após suas ações.
  • Mapeamentos e abreviações estão desativados.
  • Chaves comuns como Escapeou Controlnão funcionam corretamente.

Basicamente, vié o modo visual, exportanto, o Vim Ex Mode é apenas uma emulação de ex(eles ainda executam o mesmo código), portanto, é possível acessar o modo de comando exno vi e vice-versa. Na verdade, existem dois modos: modo Ex ( vim -e) e modo Ex aprimorado, que permite comandos mais avançados do que o modo Ex compatível com vi ( vim -E). Consulte: Qual é a diferença entre o modo Ex e o modo Ex aprimorado?

Ex é a raiz de uma família de editores: edit, exe vi. Ex é um superconjunto de ed, com a extensão mais notável sendo um recurso de edição de exibição. ex (1)

Editar arquivos de maneira não interativa é o uso mais comum e as pessoas o usam de maneira semelhante sede awk, no entanto, são mais orientadas para o fluxo - eles só lêem o arquivo do começo ao fim (não foram projetados para trabalhar com várias linhas) ) while vimé orientado a buffer - você pode avançar e retroceder o arquivo como quiser, o que o torna tão poderoso.

Basicamente:

sedé um editor ED do S tream , não um editor de arquivos.

No entanto, as pessoas parecem abusar dele por tentar editar arquivos e a verdade é que ele não edita arquivos. Em segundo lugar, suas opções como in-place ( -i) são extensões não-padrão do FreeBSD e podem não estar disponíveis em outros sistemas operacionais. Portanto, se você deseja evitar códigos não portáveis, sobrecarga de E / S e efeitos colaterais ruins (como destruir links simbólicos), use exo editor padrão baseado em comandos UNIX (junto com ed) o BashFAQ .


Outras coisas que acho úteis no modo Ex é usá-lo como um playground (semelhante ao pythonconsole), onde você pode executar muitos comandos seguidos, trabalhando / depurando expressões regulares, verificando a configuração do vim, executando comandos externos ou trabalhando com registradores, etc. .

Por exemplo:

let @d = '<td></td>'
let @r = '<tr>' . repeat(@d, 5) . '</tr>'
echo @r
let @t = '<table>' . repeat(@r, 5) . '</table>'
reg

o que é mais fácil no modo Ex do que no modo normal (onde você pode ver apenas o seu último comando).


Usos práticos

Eu tenho os seguintes aliases no meu .bash_aliases:

alias trim="ex +'bufdo!%s/\s\+$//e' -scxa"
alias retab="ex +'set ts=2' +'bufdo retab' -scxa"

Nota: O uso bufdonão é exum método compatível com POSIX (conforme manual ); portanto, você pode considerar usá-lo find. A !é usado para forçar a comutação das memórias intermédias sem guardar (de outra forma de aviso é gerado).

O primeiro que estou usando para aparar os espaços finais em todos os meus arquivos de origem, por exemplo:

trim **/*.php

O segundo converte todas as guias em espaços (recursivamente), por exemplo:

retab **/*.php

Para mim retab, basta usar , mas há algumas desvantagens descritas aqui . Adicione extra -Vpara aumentar a produção de verbosidade.

Observe que os exemplos acima usam zsh / bash4 globbing ( **), portanto, verifique se o seu shell suporta e está ativado.

Para exemplos mais práticos (como analisar arquivos html), verifique:

Aprenda também mais sobre o modo Ex em:

kenorb
fonte
Você pode por favor postar um exemplo de "edição (múltiplos) arquivos não interativa" operação que é mais simples de conseguir com exque está com ed, sedou awk?
Sato Katsura
1
@SatoKatsura Adicionado dois usos práticos que tratam de vários arquivos.
kenorb
Eu estive pesquisando a documentação para entender melhor o exmodo. Eu não entendo por que você tem um bang ( !) no seu comando de trimalias bufdo. Isso não abandonará todas as alterações em todos os arquivos, exceto o último? Se não, por que não?
Curinga
@Wildcard Sem !basicamente não funcionará, pois cada vez que o buffer é alternado, exreclamamos de alterações não salvas (e estamos salvando alterações no final xa). O aviso pode ser desativado, mas é muito mais fácil adicionar !.
Kenorb
Entendo ... Acho que estou interpretando mal a documentação; especifica que sem o !comando falhará se o buffer não puder ser abandonado, mas não especifica explicitamente que !fará com que o buffer não seja descartado ... Portanto, "abandonado" neste caso significa "descartado" , porque não contém nada que não esteja gravado no disco "? Ou o que? (Estou olhando para :help bufdo)
Curinga
18

Eu raramente uso ex-mode, mas quando preciso, sou grato por sua existência.

Às vezes, acesso a sistemas via ssh por VPN, e essas conexões às vezes podem ficar lentas. Para piorar o problema, às vezes eu preciso editar um arquivo no lado remoto que, além de estar atrás do ssh e da VPN, está em uma conexão serial lenta (9600 baud mais latência de rede).

Em momentos como esse, o feedback visual e as atualizações da tela se tornam mais um obstáculo, porque o que eu vejo é atrasado (o efeito é como falar em um microfone, mas com alto-falantes distantes, como em um estádio esportivo. e às vezes confuso devido ao atraso no feedback).

Nesse caso, fazer com que as alterações não sejam repetidas é uma vantagem útil, pois posso fazer mais em menos tempo quando não estou esperando a atualização da tela.

Quando terminar de editar, volto ao modo visual para uma atualização de tela única para revisar meu trabalho. Então eu posso voltar ao modo ex ou salvar, porque já terminei.

John O'M.
fonte
13

A janela da linha de comando é útil para escrever comandos longos e complicados. Como o histórico de comandos é aberto como uma janela, você pode usar qualquer navegação do vim ou comando / mapeamento de edição.

Digamos que você queira editar um longo comando de substituição que você executou uma vez, mas que cometeu um erro:

:%165,177s:here is a whole bunch of text I wnat to replace:here is the replacement:c

Para alterar a string de pesquisa, você não pode usar movimentos do vim como bna linha Ex para navegar (embora eu acredite que haja mapeamentos importantes para esta navegação). Em vez disso, a maioria das pessoas pressionava a tecla de seta para a esquerda várias vezes.

Uma maneira melhor: pressione q:para ir para a janela da linha de comandos, kpara ir até o último comando e navegar com movimentos normais para a parte do comando que você deseja alterar. Quer mudar uma palavra inteira, não há problema: ciw.

bsmith89
fonte
OK obrigado. Você tem certeza de que q: é a linha de comando Ex? A ajuda usa apenas a frase "Ex" para o modo mencionado Q, mas isso não suporta a edição padrão do vim a que você está se referindo - apenas o q:faz, que a ajuda chama simplesmente de "modo de linha de comando". Sei que confundi os dois no começo, mas provavelmente devemos ter certeza de que somos claros sobre a distinção aqui.
Andrew Ferrier
1
Eu procurei :help q:antes de decidir usar essa frase, mas posso estar confuso sobre a terminologia.
precisa saber é o seguinte
1
Também fiquei confuso com essa terminologia. Eu costumo falar sobre digitar um comando Ex como qualquer coisa a seguir :, mas eu poderia estar usando isso errado.
precisa saber é o seguinte
3
O conteúdo da sua resposta está correto, mas a maneira como você está usando a terminologia é (para mim) um pouco confusa. Acho que você está interpretando a documentação um pouco errado. q:não abre uma linha de comando Ex. Abre a janela do histórico de comandos , na qual os comandos Ex atuais e anteriores podem ser editados. A linha de comando Ex é o que você obtém quando pressiona :no modo Normal.
Rich
3
FWIW: Eu acho que a documentação do Vim também é um pouco confusa, pois em alguns locais ela se refere a todos os :comandos como sendo comandos 'Ex'. IMHO realmente apenas os comandos que estão realmente disponíveis no Ex devem ser considerados como comandos Ex.
Rich
6

Foi-me dito por uma pessoa com visão parcial que está ficando cega que ele está mudando para ex, então esse é um uso. Eu próprio sou consideravelmente mais velho que o vi e mudei de ed para ex há muito tempo (sim, eu sei, "ed é o editor padrão"). A única coisa que faço no modo vi é% -bouncing para combinar parens ao escrever o código Lisp.

John Cowan
fonte
Lembra-me desta entrevista . Não me lembro se exespecificamente foi mencionado.
Martin Tournoij 01/07/19
Excelente insight, eu nunca teria pensado nisso. Muito obrigado, ótima resposta.
Andrew Ferrier
2

Além dos usos já mencionados aqui, ex também é uma maneira de editar arquivos no console linux, se isso estiver na plataforma S / 390, e o console estiver orientado a linhas em vez de orientado a tela.

Thomas
fonte
0

O modo Ex tem algum uso prático?

Provavelmente não. No entanto, ao entrar no modo Ex não é realmente útil, aprender os comandos Ex ainda é útil, principalmente porque você usa comandos de edição ex com :g/comandos globais para operar nas linhas correspondentes.

Lie Ryan
fonte
-1

O "ex" original era a versão atualizada do editor de texto "ed" no Unix. No 2BSD, um modo visual foi adicionado e o novo editor foi chamado "vi".

Se alguém quiser usar a linha de comando ex, ele mudará para o modo de comando com a tecla ":". Portanto, no meu melhor entendimento, ex não existe realmente por nostalgia, é a parte de fornecer o modo de comando.

Você também pode entrar no modo de inserção pressionando

 :i 

pressione "enter" e digite seu texto. Saia com ^ c. Ou digite tudo em uma linha de comando, como

 :i my multiline text \with a second line.^c
if2
fonte
1
Dado que o modo Ex não é exatamente o mesmo que modo de linha de comando , isso não parece responder à pergunta. E como uma observação adicional: modo de comando é um sinônimo infeliz para o modo Normal, não para o modo de linha de comando.
8bittree
Ponto "Modo de comando" utilizado. Só desculpa, quando mudamos para vi a nova adição, fomos intoruduzidos como "visual" (não o atual modo visual do vim) em oposição a "comando" - agora ex. Por outro lado, a linha de comando parece chamar o mesmo do_cmdline () que ex. Não que isso sugira qualquer "uso prático", admito.
if2 30/10