Embora não possa negar que eu também tenha lutado com o vi no começo, acho que é possível argumentar que o vi é realmente muito simples de aprender. (Quando eu comecei a usar o Unix, a escolha era vi ou emacs, então na época eu escolhi, sendo um editor de linhas muito simples, que eu já aprendi lendo os primeiros livros do Unix.) Eu uso vi diariamente, mas eu 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 poucos recursos e pode ser usado em conexões instáveis e lentas, onde outros editores podem falhar ou ser lentos e inutilizáveis. Ou, em situações em que o sistema está quebrado, as teclas de seta não são interpretadas corretamente (configurações de terminologia incorretas, por exemplo). Portanto, o vi pode ser usado para corrigir os arquivos de configuração que levam ao problema, sem ser afetado pelo problema.
E aqui está como aprender um subconjunto útil do vi:
Primeiro: pare de pensar no vi como um "editor" de interface gráfica e terminal, e veja-o como uma linguagem de programação para manipular arquivos de texto. No início, "vi" significava o modo visual, e o vi tem uma contraparte não-visual ex, que é um bom lugar para começar.
Digite ex no prompt do shell (vou usar ¬ 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¬" e 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 legal ver o que está no buffer:
:%p¬
Hello World
:
Esse foi o comando de impressão, p, obviamente. O% é uma abreviação do intervalo de linhas. Cada comando pode ser precedido por um número ou intervalo de linha ao qual o comando deve se aplicar. % significa "todas as linhas". $ significa a última linha e um ponto significa a linha atual. Um número significa essa linha particular. Um intervalo é escrito n, me um número pode ser adicionado ou subtraído, portanto, + 1, $ - 1 significam da próxima linha até a segunda e última linha. Um comando que consiste em apenas um número de linha vai para essa linha. Aqui está o pequeno subconjunto de comandos que eu uso:
:1i¬
this text is inserted before line 1.¬
.¬
:
:w /tmp/filename¬
"/tmp/filename" [New] 2L, 49C written
:
w escreve todas as linhas (ou o intervalo escolhido) para um arquivo.
:1d¬
exclui a linha 1.
:.s/Hello/Hello,/¬
Hello, World
:.s/$/!/¬
Hello, World!
s substitui uma expressão regular. É bom saber expressões regulares!
:q¬
E37: No write since last change (add ! to override)
q sai. wq escreve e sai. q! sai sem escrever, e de uma forma 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ê só consegue olhar para 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 faça o hjkl! h esquerda, j para baixo, k para cima e l direita. 0 move para o primeiro caractere e ^ (pense em regex aqui!) Para o primeiro caractere não espacial na linha. $ (regex novamente!) se move para o final da linha. Digitando: 999¬ vai para a linha 999, naturalmente, assim como no modo ex.
"i" entra no modo de inserção, que agora insere caracteres em vez de linhas e termina com a ação de pressionar o escape em vez de ".¬". "Eu" insere no início, "a" depois do caractere abaixo do cursor e "A" após o final da linha atual. Sempre pressione escape quando terminar de digitar o texto. "x" apaga o caractere sob o cursor e "D" apaga do cursor para o final da linha. "Y" puxa (copia) a linha atual e "P" cola-a de volta. ": pu" faz o mesmo, mas pode ser precedido por um número de linha. ": ya" é o ex equivalente de "Y" e, novamente, é útil para aplicar a um intervalo de linha. Eu acho que há um comando de marca também, mas admito que não me lembro disso. Eu não sinto falta disso.
O acima é o que eu uso, e eu sei que eu provavelmente não sou um usuário vi muito "eficiente". Por outro lado, eu uso a versatilidade do ex, por exemplo, para editar arquivos de configuração de scripts. Precisa mudar 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 eu acho que o problema com o vi é que as pessoas pensam nele como um editor difícil. Tudo o que precisamos é mudar um pouco a sua mentalidade e encará-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 um editor, mas como uma ferramenta geral e scriptável, bem integrada com o restante do Unix. Eu duvido que o nano faria tudo isso - emacs ... talvez.