Julio Biason
6 years ago
12 changed files with 573 additions and 2 deletions
@ -0,0 +1,60 @@ |
|||||||
|
+++ |
||||||
|
title = "Macros de Teclado" |
||||||
|
date = 2015-12-22 |
||||||
|
+++ |
||||||
|
|
||||||
|
Essa é a parte em que você repete várias coisas sem repetir várias coisas. |
||||||
|
|
||||||
|
<!-- more --> |
||||||
|
|
||||||
|
No capítulo #3, eu falei rapidamente do commando `.`, que repete o último comando |
||||||
|
completo. Mas como repetir comandos que são, na verdade, uma composição de |
||||||
|
vários outros comandos? |
||||||
|
|
||||||
|
A resposta são macros de teclado. |
||||||
|
|
||||||
|
Macros de teclado permitem que você grave uma execução qualquer e depois a |
||||||
|
repita quantas vezes quiser. |
||||||
|
|
||||||
|
Para fazer uma macro de teclado, você deve, em modo normal, executar |
||||||
|
`q{registrador}`. Ao fazer isso, a última linha do VIM irá mostrar "recording", |
||||||
|
indicando que o editor está agora gravandos todas as teclas pressionadas no |
||||||
|
registrador. Para encerrar a gravação pressione `q` novamente (desta vez, sem o |
||||||
|
registrador). Para "tocar" a macro, é necessário usar `@{registrador}`. |
||||||
|
|
||||||
|
Quem prestou atenção no capítulo #5, deve ter notado que eu usei a palavra |
||||||
|
"registrador" de novo. E a base da questão é que realmente os dois são a mesma |
||||||
|
coisa: Se você copiar algo para o registrador `a` (`"ayy`, por exemplo) e depois |
||||||
|
gravar a macro "a", o conteúdo copiado para a área de transferência será perdido. |
||||||
|
Em compensação, se você criar a macro no registrador "a", você pode ver |
||||||
|
exatamente a sequência de comandos usados usando `"ap`. Ou ainda, você pode |
||||||
|
colocar a sequência de comandos desejada num arquivo (ou no próprio arquivo), |
||||||
|
copiar para o registrador necessário e depois só "tocar" o registrador. |
||||||
|
|
||||||
|
Como exemplo, imagine que você tem uma lista de constantes que você quer |
||||||
|
transformar em uma lista de strings. No caso, você teria que adicionar uma aspa |
||||||
|
no começo, uma aspa no final, uma vírgula e passar para a próxima linha. Se |
||||||
|
forem apenas 4 constantes, é fácil repetir os comandos em cada linha; mas se |
||||||
|
forem 100, a coisa fica diferente. |
||||||
|
|
||||||
|
Neste caso, você faria o seguinte: Na primeira linha, executaria |
||||||
|
`qaI"[Esc]A",[Esc]jq` -- ou seja, iniciaria a macro "a", entraria em modo de |
||||||
|
inserção no primeiro caractere não branco da linha (`I`), colocaria uma aspa, |
||||||
|
sairia do modo de inserção, entraria novamente no modo de inserção mas desta |
||||||
|
vez movendo o cursor para o último caractere antes (`A`), adicionaria a aspa que |
||||||
|
encerra a string e uma vírgula, moveria para a linha de baixo e encerraria a |
||||||
|
macro de teclado. Até aqui espero que não tenha nada de surpresas. Agora você |
||||||
|
pode repetir `@a` 99 vezes para as próximas linhas ou simplesmente executar `99@a` |
||||||
|
e deixar o VIM repetir a macro 99 vezes. No final, bastaria simplesmente |
||||||
|
remover a última vírgula. |
||||||
|
|
||||||
|
Uma coisa a ter em mente -- além da questão do registrador -- é que o VIM |
||||||
|
encerra tanto a macro quanto o número de repetições se houver qualquer |
||||||
|
problema. Por exemplo, se no meio da sua macro você colocar um `f.` para mover |
||||||
|
o cursor para o próximo ponto, mas no meio da execução não for encontrado |
||||||
|
nenhum ponto, a macro será interrompida e qualquer execução posterior será |
||||||
|
encerrada, não importando se for a 99<sup>a</sup> execução da macro ou a |
||||||
|
1</sup>a</sup>. Se você perceber que a execução não terminou onde deveria, |
||||||
|
basta executar `u` em modo de comando para desfazer a execução da macro. |
||||||
|
|
||||||
|
{{ chapters(prev_chapter_link="./05-marcadores", prev_chapter_title="Marcadores", next_chapter_link="./07-procurar-varios-arquivos", next_chapter_title="Procurar em Vários Arquivos") }} |
@ -0,0 +1,70 @@ |
|||||||
|
+++ |
||||||
|
title = "Procurar em Vários Arquivos" |
||||||
|
date = 2015-12-22 |
||||||
|
+++ |
||||||
|
|
||||||
|
Essa é a parte em que mais uma vez você vai ter que pesquisar sobre |
||||||
|
expressões regulares. |
||||||
|
|
||||||
|
<!-- more --> |
||||||
|
|
||||||
|
Já vimos o comando de pesquisa, que tem um modo inteiro só pra si[^1]. |
||||||
|
|
||||||
|
Mas como fazer para encontrar ocorrências de uma palavra em mais de um arquivo? |
||||||
|
Para isto, existe o comando `:grep`. |
||||||
|
|
||||||
|
O grep é uma ferramente comum em Unixes (e Linux) em geral, mas o VIM tem |
||||||
|
scripts que fazem a mesma coisa em outros sistemas operacionais (por exemplo, |
||||||
|
Windows). Assim, o mesmo comando vai funcionar da mesma forma não importando |
||||||
|
qual sistema você esteja utilizando. |
||||||
|
|
||||||
|
Como o `:grep` usa outras funcionalidades existentes no VIM, iremos ver um pouco |
||||||
|
mais do que simplesmente "Procurar", mas isso é necessário. |
||||||
|
|
||||||
|
Como o modo de pesquisa, `:grep` precisa de uma expressão regular. Ao contrário |
||||||
|
do modo de pesquisa, o `:grep` também precisa de uma lista de arquivos a serem |
||||||
|
pesquisados. Por baixo dos panos, o que o VIM faz é chamar o comando "grep" (do |
||||||
|
Unix), verifica o resultado e permite pular facilmente entre os elementos |
||||||
|
encontrados (então todas as opções disponíveis para o grep podem ser passadas |
||||||
|
diretamente de dentro do VIM). |
||||||
|
|
||||||
|
Por exemplo, para pesquisar por arquivos que contém a palavra "void", você só |
||||||
|
precisa executar o comando `:grep void *` (onde `:grep` é o comando, `void` é a |
||||||
|
expressão a ser pesquisada e `*` é a lista de arquivos a serem pesquisados). Como |
||||||
|
o grep (o aplicativo do Unix) somente pesquisa arquivos no diretório |
||||||
|
especificado (no nosso caso anterior, como não foi passado diretório algum, |
||||||
|
será considerado o diretório atual), o `:grep` (o comando do VIM) também não vai |
||||||
|
entrar em nenhum subdiretório (de novo, porque o VIM simplesmente chama o grep |
||||||
|
[aplicativo do Unix] e facilita pular entre os elementos encontrados). Para |
||||||
|
fazer uma procura que encontre a expressão além do diretório atual, basta |
||||||
|
adicionar a opção "-r" para o grep (`:grep void -r *`). |
||||||
|
|
||||||
|
Ok, agora que você sabe usar o `:grep`... Como é que você vê os resultados? |
||||||
|
|
||||||
|
Primeira informação periférica: O VIM tem um tipo de "janela" especial, chamada |
||||||
|
"Quickfix". Essa "janela" é, na verdade, um "split" da tela (e mais a frente |
||||||
|
veremos como trabalhar com "splits" e abas). Para exibir o Quickfix, é usado o |
||||||
|
comando `:copen`; para fechar o Quickfix, basta usar `:copen` de novo. Para |
||||||
|
passar para o próximo elemento existente no Quickfix, use `:cnext` (ou |
||||||
|
simplesmente `:cn`); para passar para o elemento anterior, use `:cprevious` (ou |
||||||
|
simplesmente `:cp`); para mover o cursor para a posição do elemento atual do |
||||||
|
Quickfix, use `:cc` (que é simplesmente `:cc` mesmo). |
||||||
|
|
||||||
|
A segunda informação periférica: Como eu falei, usar `:grep {expressão} *` irá |
||||||
|
procurar "{expressão}" a partir do diretório atual. Para descobrir qual é o |
||||||
|
"diretório atual" para o VIM, use `:pwd` (de "print working directory", que |
||||||
|
também é um comando Unix); para mudar para outro diretório, utilize o comando |
||||||
|
`:cd {diretório}`, como você faria num shell normal. |
||||||
|
|
||||||
|
(E antes que alguém pergunte: Sim, você pode fazer um grep fora do diretório |
||||||
|
atual passando o diretório em questão no próprio comando do grep: `:grep void |
||||||
|
/tmp -r` irá procurar por "void" em todos os arquivos existentes no diretório |
||||||
|
/tmp.) |
||||||
|
|
||||||
|
[^1] Apenas para lembrar, `/` entra no modo de pesquisa, onde só é preciso entrar |
||||||
|
a expressão regular a ser encontrada; para passar para a próxima |
||||||
|
ocorrência, use `n` em modo normal; para passar para a ocorrência anterior, |
||||||
|
use `N` também em modo normal; para remover o realce das palavras |
||||||
|
encontradas, use `:noh` em modo de comando. |
||||||
|
|
||||||
|
{{ chapters(prev_chapter_link="./06-macros-de-teclado", prev_chapter_title="Macros de Teclado", next_chapter_link="./07-procurar-varios-arquivos", next_chapter_title="Procurar em Vários Arquivos") }} |
@ -0,0 +1,87 @@ |
|||||||
|
+++ |
||||||
|
title = "Localizar e Substituir" |
||||||
|
date = 2015-12-22 |
||||||
|
+++ |
||||||
|
|
||||||
|
Essa é a parte em que você vai precisar aprender expressões regulares — mais |
||||||
|
uma vez. |
||||||
|
|
||||||
|
<!-- more --> |
||||||
|
|
||||||
|
Uma coisa relativamente comum quando se está programando é substituir todas as |
||||||
|
ocorrências de uma palavra por outra[^1]. |
||||||
|
|
||||||
|
Para fazer "localizar e substituir" ("search and replace") existe o comando |
||||||
|
`:substitute` em modo de comando (ou simplesmente `:s`). |
||||||
|
|
||||||
|
Até aí sem problemas, mas existe uma pequena pegadinha (na verdade, duas, mas |
||||||
|
uma de cada vez): `:s` é, na verdade, `:{range}s`, onde "{range}" é a parte do |
||||||
|
texto que o comando `:s` deve ser executado -- e sim, eu sei que não falei |
||||||
|
sobre este tipo de comando antes, mas essa era a melhor oportunidade. |
||||||
|
|
||||||
|
Então, {range}. {range} é opcional e, se não for passado, o comando será |
||||||
|
executado da linha atual. Isto, obviamente, não é muito útil. {range} é formado |
||||||
|
por um par[^2], separado por vírgulas, indicando o início e o fim da execução do |
||||||
|
comando. |
||||||
|
|
||||||
|
O uso básico de {range} é "linha inicial,linha final". Por exemplo, `:1,5s` irá |
||||||
|
executar o comando `:s` entre as linhas 1 (a primeira, não existe linha 0 no |
||||||
|
VIM) e 5. |
||||||
|
|
||||||
|
E, mais uma vez, existem indicadores especiais, inclusive para {range}. |
||||||
|
|
||||||
|
Um número indica o número da linha, como já comentei. "$" é a última linha do |
||||||
|
arquivo (assim, `:1,$s` irá executar `:s` em todo o arquivo); "%" é um alias |
||||||
|
para "1,$" (ou seja, todo o arquivo); `'{marcador}` irá, obviamente, utilizar |
||||||
|
os marcadores (ou seja, `:'a,'bs` irá executar `:s` entre o marcador "a" e o |
||||||
|
marcador "b" -- E marcadores entre arquivos [em maiúsculas] não são |
||||||
|
permitidos). |
||||||
|
|
||||||
|
(E existe outros dois marcadores especiais que eu não comentei antes por achar |
||||||
|
que não há uso fora do `:s` que são `'<` e `'>` que indicam, respectivamente, o |
||||||
|
início e o fim da região visual -- mas o VIM vai adicionar estes dois |
||||||
|
marcadores automaticamente se você tiver uma região visual selecionada e |
||||||
|
pressionar `:` e por isso ficaram pra trás. Então não se assuste se o VIM |
||||||
|
começar a colocar coisas na linha de comando sem que você tenha digitado.) |
||||||
|
|
||||||
|
Daqui pra frente, eu vou colocar o comando como `:%s`, já que esta é a execução |
||||||
|
mais comum do comando. Mas lembre-se que `%` = `1,$` = do começo ao fim. |
||||||
|
|
||||||
|
`:%s` funciona, assim como a pesquisa, com expressões regulares, só que ao invés |
||||||
|
de termos uma expressão, teremos duas: a de pesquisa e a de substituição. Em |
||||||
|
casos mais simples, onde você quer substituir "palavra 1" por "palavra 2", o |
||||||
|
comando será `:%s/palavra 1/palavra 2`. Mais uma vez, conhecer expressões |
||||||
|
regulares vai ajudar aqui -- e fica a dica para olhar sobre "grupos". |
||||||
|
|
||||||
|
A segunda pegadinha é que `:%s` executa o comando em cada linha do range e, como |
||||||
|
padrão, somente a primeira ocorrência é substituída. Assim, se "palavra 1" |
||||||
|
existir mais de uma vez em uma linha, somente a primeira será alterada. |
||||||
|
|
||||||
|
Para resolver isso, você deve usar o terceiro parâmetro de `:%s`, {flags}. As |
||||||
|
flags mais comuns são: |
||||||
|
|
||||||
|
<dl> |
||||||
|
<dt>g</dt> |
||||||
|
<dd>Substitui todas as ocorrências da expressão de procura na linha, não apenas |
||||||
|
a primeira.</dd> |
||||||
|
<dt>i</dt> |
||||||
|
<dd>Ignora maiúsculas e minúsculas ("ignore case")</dd> |
||||||
|
<dt>c</dt> |
||||||
|
<dd>Pede confirmação em cada alteração.</dd> |
||||||
|
</dl> |
||||||
|
|
||||||
|
Concluindo: para substituir "void" por "int\*" em todo o arquivo mas apenas no |
||||||
|
começo da linha, ignorando se está em maiúsculas ou minúsculas (porque o |
||||||
|
estagiário pensou que estava digitando uma monografia), mas confirmando cada |
||||||
|
mudança, você faria `:%s/^void/int*/ic` (como é apenas no começo da linha e nós |
||||||
|
forçamos isso na expressão regular -- o `^` ali -- não precisamos usar a flag "g", |
||||||
|
já que não teria efeito nenhum). |
||||||
|
|
||||||
|
[^1] E, mas pra frente, veremos que existem plugins que deixam esta parte mais |
||||||
|
fácil. |
||||||
|
|
||||||
|
[^2] Na verdade, não e um par mas, de novo, fazer substituição em apenas uma |
||||||
|
linha não é muito útil, principalmente considerando os comandos que o VIM |
||||||
|
tem para movimentação do cursor. |
||||||
|
|
||||||
|
{{ chapters(prev_chapter_link="./07-procurar-varios-arquivos", prev_chapter_title="Macros de Teclado", next_chapter_link="./09-splits", next_chapter_title="Splits") }} |
After Width: | Height: | Size: 79 KiB |
After Width: | Height: | Size: 41 KiB |
@ -0,0 +1,114 @@ |
|||||||
|
+++ |
||||||
|
title = "Splits" |
||||||
|
date = 2015-12-22 |
||||||
|
+++ |
||||||
|
|
||||||
|
Essa é a parte em que você vai passar uma hora dividindo a tela em pedacinhos |
||||||
|
cada vez mais pequenos. |
||||||
|
|
||||||
|
<!-- more --> |
||||||
|
|
||||||
|
Até agora, enquanto falávamos de editar textos no VIM, vimos apenas como editar |
||||||
|
um arquivo por vez. Existem formas de editar mais de um arquivo (usando `:e` e |
||||||
|
`:e#{número}`) mas estas estão longe de serem fáceis de serem utilizadas. |
||||||
|
|
||||||
|
Existem duas formas de manter dois (ou mais) arquivos abertos ao mesmo tempo. |
||||||
|
Uma delas são "splits". Basicamente, splits permitem que você "reparta" a tela |
||||||
|
em pedaços, podendo mostrar outros arquivos (ou até mesmo outra vez o mesmo |
||||||
|
arquivo). |
||||||
|
|
||||||
|
Para criar splits, existem dois comandos que devem ser usados em modo de |
||||||
|
comando: `:sp` e `:vsp`. Ambos comandos aceitam o nome do arquivo a ser aberto no |
||||||
|
novo split; se não for passado o nome de um arquivo, o arquivo que já está |
||||||
|
aberto será carregado. |
||||||
|
|
||||||
|
A diferença entre eles é que `:sp` irá criar um split horizontal... |
||||||
|
|
||||||
|
![](horizontal-split.png) |
||||||
|
|
||||||
|
... enquanto que `:vsp` irá criar um split vertical. |
||||||
|
|
||||||
|
![](vertical-split.png) |
||||||
|
|
||||||
|
Dentro de cada split, comandos executados irão afetar apenas o buffer atual: `:w` |
||||||
|
irá salvar apenas o arquivo apresentar no split atual, `:e` irá abrir um arquivo |
||||||
|
no split atual e assim por diante. |
||||||
|
|
||||||
|
Note que eu falei "buffer atual". Como falei antes, "buffer" é o nome dado para |
||||||
|
a representação do arquivo em memória e que tanto `:sp` quanto `:vsp` sem |
||||||
|
parâmetros irão abrir um split com o arquivo atual -- que, na verdade, é o |
||||||
|
buffer atual. Se você fizer isso e começar a editar o texto em um dos splits, o |
||||||
|
conteúdo do outro também irá mudar, já que ambos estão apresentando o mesmo |
||||||
|
buffer. |
||||||
|
|
||||||
|
Para fechar um split, basta fechar o arquivo, tanto com `:q` quanto `:wq` ou |
||||||
|
qualquer outro comando que feche um arquivo. O split será removido e o cursor |
||||||
|
irá para o próximo split. Se não houverem mais splits, o VIM irá fechar, como |
||||||
|
já vinhamos vendo desde o começo. |
||||||
|
|
||||||
|
E sim, você pode fazer quantos splits e de formas diversas quantas vezes quiser |
||||||
|
(até que não sobre mais espaço na tela, quer dizer). |
||||||
|
|
||||||
|
![](all.png) |
||||||
|
|
||||||
|
Para "manusear" splits, você irá utilizar comandos que começam com, em modo |
||||||
|
normal, `[Ctrl]w`. `[Ctrl]w`, por si só, não faz nada (a não ser que você |
||||||
|
repita o comando, mas isso é outra coisa) e requer uma ação a ser executada no |
||||||
|
split (assim como alguns comandos requerem uma movimentação). |
||||||
|
|
||||||
|
## [Ctrl]wj ou [Ctrl]w[direcional para baixo] |
||||||
|
|
||||||
|
Move o cursor para o split abaixo do atual. Se não houverem outros splits |
||||||
|
abaixo do atual, permanece no mesmo. Aceita um número de repetiçoes, ou seja, |
||||||
|
`3[Ctrl]wj` irá imediatamente pular para o 3o. split abaixo do atual. |
||||||
|
|
||||||
|
## [Ctrl]wh ou [Ctrl]w[direcional para a esquerda] e [Ctrl]wk ou [Ctrl]w[direcional para cima] e [Ctrl]wl ou [Ctrl]w[direcional para a direita] |
||||||
|
|
||||||
|
O mesmo que [Ctrl]wj, mas indo para o split da esquerda, acima ou direita, |
||||||
|
respectivamente. |
||||||
|
|
||||||
|
## [Ctrl]w+ e [Cltr]w- |
||||||
|
|
||||||
|
Aumenta ou diminui o tamanho do split em uma linha. Se for passado um número |
||||||
|
antes do comando -- por exemplo `3[Ctrl]w+` -- o número de linhas afetas será o |
||||||
|
número indicado. |
||||||
|
|
||||||
|
## [Ctrl]w> e [Ctrl]w< |
||||||
|
|
||||||
|
O mesmo que `[Ctrl]w+` e `[Ctrl]w-`, mas altera o número de colunas ao invés do número de linhas. |
||||||
|
|
||||||
|
## [Ctrl]w\_ e [Ctrl]w| |
||||||
|
|
||||||
|
Deixa o split com o maior altura possível (ou seja, coloca o máximo de linhas |
||||||
|
possíveis para o split) ou com a maior largura possível (ou seja, coloca o |
||||||
|
máximo de colunas possíveis para o split). |
||||||
|
|
||||||
|
## [Ctrl]w= |
||||||
|
|
||||||
|
Altera o tamanho dos splits para que estes fiquem o mais equilibrados |
||||||
|
possíveis. |
||||||
|
|
||||||
|
## [Ctrl]wH, [Ctrl]wJ, [Ctrl]wK,/tt> e [Ctrl]wL |
||||||
|
|
||||||
|
Move o split atual para o canto mais a esquerda, abaixo, acima ou direita, |
||||||
|
respectivamente (note que a letra de movimentação está em maiúsculas). |
||||||
|
|
||||||
|
## [Ctrl]ww |
||||||
|
|
||||||
|
Move o cursor para o split anterior. Se você está em um split qualquer e fizer |
||||||
|
`3[Ctrl]wj` para ir para o 3<sup>o</sup> split abaixo do atual, `[Ctrl]ww` irá |
||||||
|
mover o cursor de volta para o split original (e `[Ctrl]ww` irá mover o cursor |
||||||
|
de volta para o 3<sup>o</sup> split abaixo do atual). |
||||||
|
|
||||||
|
## [Ctrl]wf |
||||||
|
|
||||||
|
Abre o arquivo com o nome sob o cursor em um novo split. |
||||||
|
|
||||||
|
Quando falei do grep, eu comentei que existe o comando `:cope` para abrir a |
||||||
|
janela do Quickfix. Bom, se você quiser ficar pulando entre a janela do |
||||||
|
Quickfix e o texto, os comandos `[Ctrl]w` acima irão ajudar. |
||||||
|
|
||||||
|
Existem ainda alguns outros comandos para splits, mas veremos estes mais a |
||||||
|
frente. |
||||||
|
|
||||||
|
{{ chapters(prev_chapter_link="./08-localizar-substituir", prev_chapter_title="Localizar e Substituir", next_chapter_link="./10-abas", next_chapter_title="Abas") }} |
After Width: | Height: | Size: 68 KiB |
@ -0,0 +1,44 @@ |
|||||||
|
+++ |
||||||
|
title = "Abas" |
||||||
|
date = 2015-12-22 |
||||||
|
+++ |
||||||
|
|
||||||
|
Essa é a parte me que você acha coisas que já fazia antes. |
||||||
|
|
||||||
|
<!-- more --> |
||||||
|
|
||||||
|
Além dos splits, que vimos no capítulo anterior, VIM também tem suporte à abas. |
||||||
|
O mais interessante é que você pode usar abas tanto no VIM gráfico (também |
||||||
|
chamado de GVim) quanto no console. |
||||||
|
|
||||||
|
Para abrir um arquivo no VIM, sabemos que temos que usar o comando `:e`; para |
||||||
|
abrir o arquivo em uma aba, o comando é `:tabe`. |
||||||
|
|
||||||
|
Ao contrário de splits, criar uma nova aba sem passar um arquivo não cria uma |
||||||
|
nova aba com o buffer atual; `:tabe` sem um nome de arquivo irá criar uma nova |
||||||
|
aba com um buffer em branco. E sim, você pode abrir o mesmo arquivo em mais de |
||||||
|
uma aba e as alterações feitas em uma irão refletir na outra. |
||||||
|
|
||||||
|
Para pular entre abas, você poder usar o comando `gt` em modo normal ou `:tabn` em |
||||||
|
modo de comando. Se você usar um número de repetições (p.ex. `3gt` ou `:tabn 3`) o |
||||||
|
VIM irá pular diretamente para aquela aba (no caso, para a terceira), não |
||||||
|
importando a aba atual. `gT` em modo normal ou `:tabp` move o cursor para a aba |
||||||
|
anterior. |
||||||
|
|
||||||
|
Se quiser mover abas de posição, você deve usar `:tabm`. `:tabm` irá mover a aba |
||||||
|
atual para ficar depois da aba indicada (p.ex., `:tabm 3` irá mover a aba atual |
||||||
|
para depois da terceira aba). `:tabm` também aceita parâmetros considerando a aba |
||||||
|
atual: `:tabm +2` irá mover a aba atual duas abas pra frente (para a direita) e |
||||||
|
`:tabm -2` irá mover a aba duas abas pra trás (para a esquerda). |
||||||
|
|
||||||
|
Atalhos padrão para mover para a próxima aba do sistema operacional também são |
||||||
|
aceitos por padrão. `[Ctrl][PageDn]` e `[Ctrl][PageUp]` no Linux e |
||||||
|
`[Command][Shift]]` e `[Command][Shift][` no OS X, por exemplo. Como não existe |
||||||
|
nenhum padrão para consoles, não há nenhum atalho padrão e devem ser usados os |
||||||
|
comandos de seleção de abas que vimos antes. |
||||||
|
|
||||||
|
Mais pra frente, quando estivermos falando do arquivo de configuração, eu vou |
||||||
|
explicar um "truque" para pular diretamente para a aba desejada, assim como |
||||||
|
funciona no Firefox e no Chrome. |
||||||
|
|
||||||
|
{{ chapters(prev_chapter_link="./09-splits", prev_chapter_title="Splits", next_chapter_link="./11-config", next_chapter_title="Arquivos de Configuração") }} |
@ -0,0 +1,162 @@ |
|||||||
|
+++ |
||||||
|
title = "Arquivos de Configuração" |
||||||
|
date = 2015-12-22 |
||||||
|
+++ |
||||||
|
|
||||||
|
Essa é a parte em que eu menti. |
||||||
|
|
||||||
|
<!-- more --> |
||||||
|
|
||||||
|
Lembram que bem no começo, quando estávamos falando dos modos de execução, eu |
||||||
|
comentei que o modo Ex não era usado? |
||||||
|
|
||||||
|
Bom, eu menti. MUAHAHAHAHA! |
||||||
|
|
||||||
|
![](muahaha.jpg) |
||||||
|
|
||||||
|
Na verdade, o Modo Ex não é chamado comumente, mas os arquivos de configuração |
||||||
|
do VIM são um grande amontoado de comandos executando em modo Ex. |
||||||
|
|
||||||
|
E o que é o modo Ex, afinal de contas? O modo Ex nada mais é que o modo de |
||||||
|
comando sem a necessidade de usar `:` na frente de todos os comandos. Como |
||||||
|
ficaria complicado para, por exemplo, entrar no modo Ex, executar e arquivo, |
||||||
|
sair do modo ex e entrar em modo de inserção, até o momento temos usado o modo |
||||||
|
de comando para isso, já que economiza um monte de tecladas. Como não iremos |
||||||
|
ficar indo para o modo de inserção o tempo todo, e não faz sentido fazer um |
||||||
|
arquivo gigantesco com várias linhas começando com `:`, também faz sentido que o |
||||||
|
arquivo de configuração seja executado em modo Ex. |
||||||
|
|
||||||
|
O VIM tem um arquivo de configuração global (conhecido com "vimrc") e um arquivo |
||||||
|
para execução em modo gráfico ("gvimrc")[^1]. Ainda, existem duas versões de cada |
||||||
|
um destes arquivos: uma versão global para todos os usuários e uma versão |
||||||
|
definida para o usuário atual. Daqui pra frente, iremos ver as configurações do |
||||||
|
usuário, já que estas sobrepõem as globais. |
||||||
|
|
||||||
|
"vimrc" e "gvimrc" ficam no diretório dos dados do usuário; em qualquer um dos |
||||||
|
sistemas operacionais hoje, você consegue descobrir o diretório destes arquivos |
||||||
|
com `:echo $HOME` dentro do próprio VIM. Apenas note que embora eu venho chamando |
||||||
|
os arquivos de vimrc e gvimrc, os nomes são, na verdade, ".vimrc" e ".gvimrc" (ou |
||||||
|
"\_vimrc" e "\_gvimrc" no caso do Windows). |
||||||
|
|
||||||
|
Como existem muitas opções, não vou aqui explicar cada uma delas -- mas, no |
||||||
|
próximo capítulo eu vou mostrar o arquivo que eu estou usando para servir de |
||||||
|
guia. |
||||||
|
|
||||||
|
O que você vai ver quando abrir um arquivo de configuração: |
||||||
|
|
||||||
|
## set |
||||||
|
|
||||||
|
`set` é, efetivamente, a forma de "setar" alguma configuração no VIM. |
||||||
|
|
||||||
|
Existem dois tipos de configurações: As com valores e flags. |
||||||
|
|
||||||
|
Flags é mais fácil de ser explicado: você simplesmente seta a configuração. Por |
||||||
|
exemplo, fazer com que o VIM mostre uma coluna com o número de cada linha, |
||||||
|
você pode usar `:set number` (ou simplesmente `set number` dentro do arquivo de |
||||||
|
configuração). Para desligar uma opção deste tipo, você só precisa adicionar |
||||||
|
"no" na frente (para desligar number é usado `:set nonumber`). |
||||||
|
|
||||||
|
"Valores" é exatamente o que significa: Ao invés de ser uma simples flag, a |
||||||
|
opção recebe uma string ou número. Por exemplo, `:set tabstop=4` irá definir que |
||||||
|
o tamanho da tabulação é de 4 espaços. `:set notabstop` não tem efeito aqui, já |
||||||
|
que não é uma flag. |
||||||
|
|
||||||
|
Para fazer com que uma configuração volte ao seu valor/estado original, use |
||||||
|
`:set {opção}&`; para verificar o valor de uma opção, use `:set {opção}?`. |
||||||
|
|
||||||
|
Talvez a coisa não esteja muito clara aqui, mas quando examinarmos um arquivo |
||||||
|
de configuração real, as coisas irão clarear. |
||||||
|
|
||||||
|
## let |
||||||
|
|
||||||
|
`let` é usado para definir o valor de uma variável. Uma variável tem sempre um |
||||||
|
valor -- ou seja, não existem "variáveis flags". Variáveis são normalmente |
||||||
|
utilizadas por plugins ou arquivos de sintaxe e, portanto, as variáveis que |
||||||
|
você terá que usar vão depender do que você está usando. |
||||||
|
|
||||||
|
(Obviamente, se você estiver escrevendo seu próprio plugin — que eu não vou |
||||||
|
abordar aqui — o uso de variáveis vai ser praticamente obrigatório.) |
||||||
|
|
||||||
|
## if |
||||||
|
|
||||||
|
`if`, como em qualquer linguagem de programação, serve para execução |
||||||
|
condicional. Você pode, por exemplo, verificar se alguma feature foi ativada na |
||||||
|
compilação do binário, se alguma opção está ligada, etc. |
||||||
|
|
||||||
|
Por exemplo, para verificar se o suporte à scripts Python foi adicionado, você |
||||||
|
pode fazer: |
||||||
|
|
||||||
|
```viml |
||||||
|
if has('python') |
||||||
|
" configuração em python vai aqui |
||||||
|
end |
||||||
|
``` |
||||||
|
|
||||||
|
Para verificar se alguma opção está ativa: |
||||||
|
|
||||||
|
```viml |
||||||
|
if &compatible |
||||||
|
" configuração em modo de compatibilidade com o VI original |
||||||
|
end |
||||||
|
``` |
||||||
|
|
||||||
|
ou para conferir um valor: |
||||||
|
|
||||||
|
```viml |
||||||
|
if &t_Co > 2 |
||||||
|
" configuração quando há suporte a mais de 2 cores. |
||||||
|
end |
||||||
|
``` |
||||||
|
|
||||||
|
E assim por diante. |
||||||
|
|
||||||
|
## map, imap (e outros) |
||||||
|
|
||||||
|
`map` pode ser usado para mapear teclas para outras funções. Por exemplo `:map Y |
||||||
|
y$` irá mapear "Y" para executar `y$` (copiar da posição atual do cursor até o fim |
||||||
|
da linha). Com excessão de [Shift], qualquer modificador pode ser usado: |
||||||
|
|
||||||
|
* C - para `[Control]` |
||||||
|
* M - para `[Alt]` (que normalmente é chamado de "Meta" em sistemas Unix — e por isso "M") |
||||||
|
* O - para `[Command]` (somente em Macs) |
||||||
|
|
||||||
|
Por exemplo, `:map C-m yy` irá adicionar `[Ctrl]m` para copiar a linha inteira. |
||||||
|
|
||||||
|
Ainda, a diferença entre `map` e `imap` é que `map` é global enquanto que |
||||||
|
`imap` só irá funcionar em modo de inserção (e assim você pode imaginar o que |
||||||
|
`nmap` e `vmap` fazem, certo?) |
||||||
|
|
||||||
|
## au (ou autocmd) |
||||||
|
|
||||||
|
Comandos que são executados em determinadas condições. Condições podem desde |
||||||
|
"FileType" para ações confirme o tipo de arquivo e "BufRead", "BufWrite" e |
||||||
|
relacionados quando um buffer for aberto ou fechado. |
||||||
|
|
||||||
|
O que seriam os "relacionados"? Bom, alem de ser na leitura/escrita do arquivo, |
||||||
|
podem ser adicionados comandos antes da execução ("BufReadPre", "BufWritePre"), |
||||||
|
depois da execução ("BufReadPost", "BufWritePost") e durante ("BufReadCmd", |
||||||
|
"BufWriteCmd"). |
||||||
|
|
||||||
|
(Existem ainda auto-comandos para quando o editor entrar em modo de edição, |
||||||
|
abrir o VIM gráfico, VIM está fechando, e assim por diante. Para ver todos os |
||||||
|
eventos, digite `:help autocmd-events`.) |
||||||
|
|
||||||
|
Por exemplo, `au FileType smarty set ai` para ligar a auto-identação quando VIM |
||||||
|
detectar que você está editando um arquivo Smarty (engine de templates para |
||||||
|
PHP). Ou ainda `au BufRead set nocompatible` irá configurar o editor para entrar |
||||||
|
em modo de não-compatibilidade com VI depois de abrir qualquer arquivo. |
||||||
|
|
||||||
|
Ainda, é possível encadear auto-comandos, por exemplo, `autocmd FileType python |
||||||
|
autocmd BufWritePre :%s/\s\+$//e` irá fazer com que quando o tipo de arquivo for |
||||||
|
"python", seja criado um auto-comando que antes de salvar o arquivo, seja |
||||||
|
executado um comando de substituição no buffer -- que remove espaços em branco |
||||||
|
no final da linha). |
||||||
|
|
||||||
|
(Se você está perdido com o que está vendo aqui, não se preocupe -- a tendência |
||||||
|
é que, ao ver um arquivo de configuração real, você entenda o que está |
||||||
|
acontecendo). |
||||||
|
|
||||||
|
[^1] Existe um terceiro, .exrc, mas honestamente, em todo esse tempo usando o |
||||||
|
VIM, eu nunca tinha ouvido falar que este arquivo sequer existia. |
||||||
|
|
||||||
|
{{ chapters(prev_chapter_link="./10-abas", prev_chapter_title="Abas", next_chapter_link="./11-config", next_chapter_title="Arquivos de Configuração") }} |
After Width: | Height: | Size: 55 KiB |
@ -1,4 +1,38 @@ |
|||||||
+++ |
+++ |
||||||
transparent = true |
transparent = false |
||||||
title = "Uma Lição de VIM" |
title = "Uma Lição de VIM" |
||||||
|
template = "section-contentless.html" |
||||||
+++ |
+++ |
||||||
|
|
||||||
|
* [Introdução](00-intro) |
||||||
|
* [Modos](01-modos) |
||||||
|
* [Modo normal](01-01-modo-normal) |
||||||
|
* [Entendendo o Cursor](01-02-entendendo-o-cursor) |
||||||
|
* [Mudando de Modos - Modo de Inserção](01-03-modo-de-insercao) |
||||||
|
* [Mudando de Modos - Modo Visual](01-04-modo-visual) |
||||||
|
* [Mudando de Modos - Modo de Comando](01-05-modo-de-comando) |
||||||
|
* [Outros Comandos](02-outros-comandos) |
||||||
|
* [Recortar, Copiar e Colar](03-recortar-copiar-colar) |
||||||
|
* [Registradores](04-registradores) |
||||||
|
* [Marcadores](05-marcadores) |
||||||
|
* [Macros de Teclado](06-macros-de-teclado) |
||||||
|
* [Procurar em Vários Arquivos](07-procurar-varios-arquivos) |
||||||
|
* [Localizar e Substituir](08-localizar-substituir) |
||||||
|
* [Splits](09-splits) |
||||||
|
* [Abas](10-abas) |
||||||
|
* [Arquivos de Configuração](11-config) |
||||||
|
* [Meu .vimrc](121.md) |
||||||
|
* [Meu .gvimrc](122.md) |
||||||
|
* [Modelines](13.md) |
||||||
|
* [Tags](14.md) |
||||||
|
* [Plugins - Vundle](1501.md) |
||||||
|
* [Plugins - Airline](1502.md) |
||||||
|
* [Plugins - Fugitive](1503.md) |
||||||
|
* [Plugins - Commentary](1504.md) |
||||||
|
* [Plugins - Tabular](1505.md) |
||||||
|
* [Plugins - Auto-pairs](1506.md) |
||||||
|
* [Plugins - Syntastic](1507.md) |
||||||
|
* [Plugins - Snipmate](1508.md) |
||||||
|
* [Plugins - CtrlP e CtrlPFunky](1509.md) |
||||||
|
* [Plugins - Vim-Multiple-Cursors](1510.md) |
||||||
|
* [Conclusão](16.md) |
||||||
|
Loading…
Reference in new issue