Embora eu não possa negar que lutei muito com vi no começo, acho que pode-se argumentar que vi é realmente muito simples de aprender. (Quando comecei a usar o Unix, a escolha era vi ou emacs; portanto, na época eu escolhi ed, sendo um editor de linhas muito simples, que eu já havia aprendido lendo os primeiros livros didáticos do Unix.) Uso o vi diariamente, mas provavelmente use apenas um subconjunto muito pequeno de seus recursos.
Aqui está primeiro um argumento para usar o vi: vi existe em todos os sistemas, usa muito poucos recursos e pode ser utilizável em conexões instáveis e lentas, onde outros editores podem falhar ou ficar lentos e inutilizáveis. Ou em situações em que o sistema está com defeito, portanto as teclas de seta não são interpretadas corretamente (configurações ruins de terminfo, por exemplo.) Portanto, o vi pode ser usado para corrigir os arquivos de configuração que levam ao problema, sem serem afetados pelo problema.
E aqui está como aprender um subconjunto útil do vi: Primeiro: pare de pensar no vi como um "editor" interativo da GUI do terminal e veja-o como uma linguagem de programação para manipular arquivos de texto. No início, "vi" significava modo visual, e vi tem uma contraparte não visual ex, que é um bom lugar para começar. Digite ex no prompt do shell (usarei ¬ para representar o retorno):
$ ex¬
Entering Ex mode. Type "visual" to go to Normal mode.
:
Agora pressione enter.
:¬
E749: empty buffer
:
Então, vamos colocar algo nele. Digite "a¬", digite uma linha de texto e, em seguida, um ponto em uma linha:
:a¬
Hello World¬
.¬
:
Esse foi o comando append. Fácil, curto e mnemônico. Mas seria bom ver o que está no buffer:
:%p¬
Hello World
:
Esse foi o comando de impressão, p, obviamente. O% é um atalho de intervalo de linha. Cada comando pode ser precedido por um número de linha ou intervalo ao qual o comando deve ser aplicado. % significa "todas as linhas". $ significa a última linha e um período significa a linha atual. Um número significa essa linha específica. Um intervalo é escrito n, me um número pode ser adicionado ou subtraído, portanto, + 1, $ - 1 significa da próxima linha para a segunda última linha. Um comando que consiste em apenas um número de linha vai para essa linha. Aqui está o pequeno subconjunto restante de comandos que eu uso:
:1i¬
this text is inserted before line 1.¬
.¬
:
:w /tmp/filename¬
"/tmp/filename" [New] 2L, 49C written
:
w grava todas (ou o intervalo escolhido) de linhas em um arquivo.
:1d¬
exclui a linha 1.
:.s/Hello/Hello,/¬
Hello, World
:.s/$/!/¬
Hello, World!
s substitui uma expressão regular. É bom conhecer expressões regulares!
:q¬
E37: No write since last change (add ! to override)
q sai. wq grava e sai. q! sai sem escrever e, de maneira semelhante, w! força uma gravação em um arquivo, se possível.
Agora legal:
:p
Hello, World!
:.!tr a-z A-Z
:p
HELLO, WORLD!
! como um comando filtra as linhas em um comando shell.
E finalmente:
:vi¬
entra no modo VISUAL. Não se deixe enganar. Parece um editor, mas ainda é apenas um shell de programação interativa. Você apenas vê o buffer o tempo todo e mais alguns comandos. No modo visual a: mostra o prompt: do modo ex. As teclas de seta (se elas funcionam) se movem e, se não, então hjkl! h esquerda, j para baixo, k para cima e eu para a direita. 0 move para o primeiro caractere e ^ (pense em regex aqui!) Para o primeiro caractere não espacial da linha. $ (regex novamente!) se move para o final da linha. Digitando: 999¬ vai para a linha 999, naturalmente, exatamente como no modo ex.
"i" entra no modo de inserção, que agora insere caracteres em vez de linhas e termina pressionando a tecla escape em vez de ".¬". "I" insere no início, "a" após o caractere sob o cursor e "A" após o final da linha atual. Sempre pressione Escape quando terminar de digitar o texto. "x" exclui o caractere sob o cursor e "D" exclui do cursor até o final da linha. "Y" puxa (copia) a linha atual e "P" a cola de volta. ": pu" faz o mesmo, mas pode ser precedido por um número de linha. ": ya" é o ex equivalente a "Y" e, novamente, útil para aplicar a um intervalo de linhas. Acho que também existe um comando de marca, mas admito que não me lembro. Eu não sinto falta disso.
O acima é o que eu uso, e sei que provavelmente não sou um usuário vi muito "eficiente". Por outro lado, uso a versatilidade de ex, por exemplo, para editar arquivos de configuração por script. Precisa alterar seu nome de host foo.bar.com para www.foobar.com em vários arquivos conf?
for file in conf/*
do (echo "%s/foo.bar.com/www.foobar.com/" ; echo "wq") |ex $file ; done
O que estou tentando dizer é que acho que o problema com o vi é que as pessoas pensam nisso como um editor difícil. Basta mudar um pouco a sua mentalidade e vê-la como uma linguagem de programação interativa muito simples, mas também muito poderosa. Tão poderoso que, mesmo com um subconjunto dos comandos disponíveis, você pode usá-lo com grande efeito - não apenas como editor, mas também como uma ferramenta de script geral bem integrada ao restante do Unix. Duvido que o nano faria tudo isso - emacs ... talvez.