The source content for blog.juliobiason.me
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

488 lines
43 KiB

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<!-- Enable responsiveness on mobile devices-->
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape-->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover">
<title>Julio Biason .Me 4.3</title>
<!-- CSS -->
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print">
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css">
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface">
</head>
<body class=" ">
<div class="sidebar">
<div class="container sidebar-sticky">
<div class="sidebar-about">
<a href="https:&#x2F;&#x2F;blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a>
<p class="lead">Old school dev living in a 2.0 dev world</p>
</div>
<ul class="sidebar-nav">
<li class="sidebar-nav-item"><a href="&#x2F;">English</a></li>
<li class="sidebar-nav-item"><a href="&#x2F;pt">Português</a></li>
<li class="sidebar-nav-item"><a href="&#x2F;tags">Tags (EN)</a></li>
<li class="sidebar-nav-item"><a href="&#x2F;pt&#x2F;tags">Tags (PT)</a></li>
</ul>
</div>
</div>
<div class="content container">
<div class="post">
<h1 class="post-title">11.01. Meu .vimrc</h1>
<span class="post-date">
2015-12-22
</span>
<p>Essa é a parte em que você vai ver um arquivo de configuração meio
estranho.</p>
<span id="continue-reading"></span>
<p>Como falamos sobre arquivo de configuração, eu vou mostrar o que eu tenho hoje
configurado no meu VIM, explicando o que cada comando faz. Boa parte do que eu
tenho veio da configuração global do VIM, que eu copiei apenas para garantir
que não importando onde eu esteja ou qualquer alteração que seja feita neste
arquivo, as funcionalidades que eu estou acostumado continuarão funcionando
como esperado.</p>
<pre data-lang="viml" style="background-color:#2b303b;color:#c0c5ce;" class="language-viml "><code class="language-viml" data-lang="viml"><span style="color:#96b5b4;">set</span><span> encoding=utf</span><span style="color:#d08770;">-8
</span></code></pre>
<p>Garante que os arquivos salvos estarão em UTF-8, ao invés de tentar converter
para o encoding do sistema operacional.</p>
<pre data-lang="viml" style="background-color:#2b303b;color:#c0c5ce;" class="language-viml "><code class="language-viml" data-lang="viml"><span style="color:#96b5b4;">set</span><span> nocompatible
</span></code></pre>
<p>Desativa o modo de compatilidade com o VI original. Existem algumas diferenças
entre ambos (por exemplo, depois de um fazer um undo (<code>u</code>), no VI original fazer
undo de novo desfazia o undo anterior (efetivamente, fazendo um &quot;redo&quot;) e para
continuar fazendo undo, o primeiro comando depois de undo deveria ser <code>.</code>; no
VIM, fazer um undo depois de um undo irá continuar desfazendo o que foi entrado
no texto, até retornar ao estado original) e a não ser que você seja fã do VI
original, eu não recomendaria usar o modo de compatilibidade.</p>
<pre data-lang="viml" style="background-color:#2b303b;color:#c0c5ce;" class="language-viml "><code class="language-viml" data-lang="viml"><span style="color:#96b5b4;">set</span><span> backspace=indent,eol,start
</span></code></pre>
<p>Apenas garante que o backspace consiga remover identações, apagar o fim da
linha e o começo de uma linha (neste último, forçando a linha atual e se juntar
com a anterior). Esse é o funcionamento normal de qualquer editor.</p>
<pre data-lang="viml" style="background-color:#2b303b;color:#c0c5ce;" class="language-viml "><code class="language-viml" data-lang="viml"><span style="color:#65737e;">&quot; Don’t use Ex mode, use Q for formatting
</span><span style="color:#96b5b4;">map</span><span> Q gq
</span><span>
</span><span style="color:#65737e;">&quot; Map Y to do the same (well, almost) as the D command
</span><span style="color:#96b5b4;">map</span><span> Y y$
</span></code></pre>
<p>Estes dois mapeamentos eu peguei da configuração global, mas nunca efetivamente
usei. Mas, por via das dúvida...</p>
<p>Ainda, uma coisa que eu não havia comentado: Comentários. Você pode comentar
qualquer linha começando a mesma com aspas (&quot;) sem as aspas finais (senão o VIM
irá interpretar o conteúdo como string). Então: Uma aspa, comentário; duas
aspas, string; mais de duas, erro.</p>
<pre data-lang="viml" style="background-color:#2b303b;color:#c0c5ce;" class="language-viml "><code class="language-viml" data-lang="viml"><span style="color:#b48ead;">if </span><span style="color:#bf616a;">&amp;t_Co</span><span> &gt; </span><span style="color:#d08770;">2 </span><span style="color:#b48ead;">||</span><span style="color:#bf616a;">&amp;
</span><span> syntax on
</span><span> </span><span style="color:#96b5b4;">set </span><span>hlsearch
</span><span style="color:#b48ead;">endif
</span></code></pre>
<p>Ah, nosso primeiro encontro com ifs. Se o terminal tiver mais de duas cores
(<code>&amp;t_Co &gt; 2</code>) ou estivermos rodando em GUI (<code>has(&quot;gui_running&quot;)</code>) então o
suporte à sintaxes deve ser ligado (<code>syntax on</code>) e pesquisas devem marcar todas
as ocorrências encontradas no último comando de pesquisa(<code>set hlsearch</code>)<sup class="footnote-reference"><a href="#1">1</a></sup>.</p>
<pre data-lang="viml" style="background-color:#2b303b;color:#c0c5ce;" class="language-viml "><code class="language-viml" data-lang="viml"><span style="color:#65737e;">&quot; ------------------------
</span><span style="color:#65737e;">&quot; Those are my settings
</span><span style="color:#65737e;">&quot; ------------------------
</span><span>
</span><span style="color:#96b5b4;">set</span><span> tabstop=</span><span style="color:#d08770;">4 </span><span style="color:#65737e;">&quot; tabs are displayed as 4 spaces
</span><span style="color:#96b5b4;">set</span><span> shiftwidth=</span><span style="color:#d08770;">4 </span><span style="color:#65737e;">&quot; by default, when auto-identing, add 4 spaces (or 1 tabstop)
</span><span style="color:#96b5b4;">set</span><span> foldmethod=marker </span><span style="color:#65737e;">&quot; fold on markers
</span><span style="color:#96b5b4;">set</span><span> scrolloff=</span><span style="color:#d08770;">1 </span><span style="color:#65737e;">&quot; always show one line around the cursor
</span><span style="color:#96b5b4;">set</span><span> laststatus=</span><span style="color:#d08770;">2 </span><span style="color:#65737e;">&quot; always show the status bar (’cause I like to see the line and column, always)
</span><span style="color:#96b5b4;">set</span><span> showtabline=</span><span style="color:#d08770;">2 </span><span style="color:#65737e;">&quot; always show the tabline
</span><span style="color:#96b5b4;">set</span><span> showmatch </span><span style="color:#65737e;">&quot; show matching bracket
</span><span style="color:#96b5b4;">set</span><span> noerrorbells </span><span style="color:#65737e;">&quot; no error bells
</span><span style="color:#96b5b4;">set</span><span> autowrite </span><span style="color:#65737e;">&quot; write the file when switching between files or something
</span><span style="color:#96b5b4;">set</span><span> nowrap </span><span style="color:#65737e;">&quot; do not wrap long lines
</span><span style="color:#96b5b4;">set</span><span> nobackup </span><span style="color:#65737e;">&quot; do not keep a backup file, use versions instead
</span><span style="color:#96b5b4;">set</span><span> history=</span><span style="color:#d08770;">50 </span><span style="color:#65737e;">&quot; keep 50 lines of command line history
</span><span style="color:#96b5b4;">set</span><span> ruler </span><span style="color:#65737e;">&quot; show the cursor position all the time
</span><span style="color:#96b5b4;">set</span><span> showcmd </span><span style="color:#65737e;">&quot; display incomplete commands
</span><span style="color:#96b5b4;">set </span><span>incsearch </span><span style="color:#65737e;">&quot; do incremental searching
</span><span style="color:#96b5b4;">set</span><span> formatoptions=tcq </span><span style="color:#65737e;">&quot; wrap with textwidth, wrap comments, insert commend leader (twice), format comments
</span><span style="color:#96b5b4;">set</span><span> smartindent </span><span style="color:#65737e;">&quot; smart identation
</span><span style="color:#96b5b4;">set</span><span> number </span><span style="color:#65737e;">&quot; show line numbers
</span><span style="color:#96b5b4;">set</span><span> wim=longest,list </span><span style="color:#65737e;">&quot; file auto-completion
</span><span style="color:#96b5b4;">set</span><span> background=dark </span><span style="color:#65737e;">&quot; to follow most of the colorschemes I use
</span><span style="color:#96b5b4;">set</span><span> vb t_vb= </span><span style="color:#65737e;">&quot; convert bells to visual bells and do nothing as visual bell
</span><span>
</span><span style="color:#96b5b4;">set</span><span> t_Co=</span><span style="color:#d08770;">256 </span><span style="color:#65737e;">&quot; 256 color terminals
</span><span>
</span><span style="color:#96b5b4;">let</span><span> mapleader=</span><span style="color:#a3be8c;">&quot;,&quot; </span><span style="color:#65737e;">&quot; use comma to start user-defined (in plugins) functions
</span></code></pre>
<p>Um grande bloco de configurações. Vamos ver um por um:</p>
<ul>
<li><code>set tabstop=4</code>: Define o tamanho da tabulação. Se estiver usando o caractere
&quot;tab&quot; ao invés de espaço, estes caracteres serão mostrados como 4 espaços
(quando o padrão são 8).</li>
<li><code>set shiftwidth=4</code>: Quando o VIM for identar um pedaço de texto sozinho<sup class="footnote-reference"><a href="#2">2</a></sup>. Se
&quot;shiftwidth&quot; for igual a &quot;tabstop&quot; e você não tiver configurado para usar
espaços ao invés de tabulações (calma que eu já explico como se faz isso), o
VIM irá adicionar uma tabulação inteira; se &quot;shiftwidth&quot; for menor que
&quot;tabstop&quot;, espaços serão usados; se &quot;shiftwidth&quot; for maior que &quot;tabstop&quot;,
será usada uma mistura de tabulações e espaços até que o tamanho especificado
seja alcançado.</li>
<li><code>set foldmethod=marker</code>: &quot;Folding&quot; foi algo que eu não comentei até agora
porque eu até agora não consegui me aclimatar com folding (até porque eu não
consegui pensar num mnemônico para lembrar dos comandos). Mas, basicamente,
&quot;folding&quot; permite que você &quot;oculte&quot; partes do código com alguma condição.
Alguns arquivos de sintaxe definem início e fim de funções e isso pode ser
usado para ocultar toda uma função (apenas para exibição, a função continua
existindo lá). &quot;marker&quot; define que o método de folding são marcadores e os
marcadores padrão são &quot;{{{&quot; para o início e &quot;}}}&quot; para o fim.</li>
<li><code>set scrolloff=1</code>: Número de linhas que devem sempre ficar visíveis ao redor do
cursor. &quot;1&quot; significa que antes de chegar à primeira ou última linha da tela,
o VIM irá rolar o texto e apresentar a linha anterior (ou próxima) -- enquanto
possível.</li>
<li><code>set laststatus=2</code>: Quando estávamos vendo splits, você deve ter notado que o
VIM adicionou uma barrinha indicando a posição do cursor (e talvez mais
algumas outras informações). Esse é o padrão para &quot;1&quot; (mostrar a barra de
status quando houver splits); &quot;0&quot; nunca mostra e &quot;2&quot; mostra sempre.</li>
<li><code>set showtabline=2</code>: Assim como &quot;laststatus&quot;, se você estava vendo abas em modo
de console, deve ter reparado que a linha com as abas aparecia apenas quando
haviam duas ou mais abas. &quot;2&quot; define que essa linha de abas deve ser sempre
mostrada, mesmo quando há apenas uma aba.</li>
<li><code>set showmatch</code>: Quando estiver sobre um caractere como parênteses, colechetes
ou chave, faz o highlight do elemento que abre ou fecha o correspondente.</li>
<li><code>set noerrorbells</code>: Se ocorrer um erro, não utilize erros sons para
notificações<sup class="footnote-reference"><a href="#3">3</a></sup>.</li>
<li><code>set autowrite</code>: Quando o VIM passar o controle para outro aplicativo (&quot;grep&quot;,
&quot;make&quot; ou mesmo o &quot;shell&quot;), salva o arquivo atual antes de passar a execução.</li>
<li><code>set nowrap</code>: Quando uma linha for maior que a tela, desabilita a &quot;quebra&quot; da
linha e, com isso, é necessário &quot;rolar&quot; o conteúdo horizontalmente para ver o
resto. Um aviso: se você usar &quot;wrap&quot; (<code>set wrap</code>) o VIM vai continuar lidando a
linha como uma coisa só, desconsiderando como a mesma está sendo apresentada;
assim, se você estiver na primeira parte de uma linha que foi quebrada por
wrap, usar qualquer comando que vá para a próxima linha irá ir para a próxima
linha, não para a parte quebrada.</li>
<li><code>set nobackup</code>: Não grava arquivos de backup. Por padrão, antes de salvar um
arquivo, o VIM guarda uma cópia do original com o mesmo nome seguido de &quot;~&quot;.</li>
<li><code>set history=50</code>: Quando você usa um comando, o VIM pode guardar esse comando
para execução futura, como o prompt do shell. Aqui é definido quantos destes
comandos são guardados.</li>
<li><code>set ruler</code>: Sempre que possível, mostre a posição do cursor. Se &quot;laststatus&quot;
for &quot;0&quot; (ou &quot;1&quot; e não houver nenhum split), a posição é exibida na última
linha da tela, no canto direito; se &quot;laststatus&quot; for &quot;2&quot; (ou &quot;1&quot; e houver
pelo menos um split), a posição é exibida dentro da barra de status<sup class="footnote-reference"><a href="#4">4</a></sup>.</li>
<li><code>set showcmd</code>: Você deve ter notado que comandos que esperam mais informações
(por exemplo, aqueles que requerem uma movimentação) não são mostrados em
lugar algum. &quot;showcmd&quot; irá mostrar o comando até que ele seja concluído.</li>
<li><code>set incsearch</code>: Enquanto você estiver digitando uma pesquisa, já vai
posicionando o cursor na primeira ocorrência encontrada. &quot;noincsearch&quot; irá
manter o cursor na mesma posição até que o mesmo seja concluído.</li>
<li><code>set formatoptions=tcq</code>: Opções de formatação de textos. Cara um dos caracteres
representa algo diferente: &quot;t&quot; indica que se &quot;textwidth&quot; estiver definido, o
editor deve quebrar as linhas<sup class="footnote-reference"><a href="#5">5</a></sup>; &quot;c&quot; significa que se o texto for quebrado
durante um comentário (definido pela sintaxe atual), um novo caractere de
comentário deve ser adicionado; &quot;q&quot; indica que comentários podem ser
quebrados por &quot;textwidth&quot;.</li>
<li><code>set smartindent</code>: Utiliza identação inteligente, se a sintaxe não definir
nenhuma. Existem quatro tipos de identação: Nenhuma (&quot;nosmartindent&quot;)
indicando que ao adicionar uma nova linha, nenhuma identação é adicionada;
&quot;autoindent&quot; para que novas linhas tenham a mesma identação da linha
anterior; &quot;smartindent&quot;, que tenta usar o último caractere da linha para
identificar se deve ser adicionada uma nova identação ou não (por exemplo,
parênteses e chaves adicionam identação); e &quot;cindent&quot; que tenta seguir o
padrão para C. Note que essa configuração só vale para arquivos que não
definem uma identação no seu arquivo de sintaxe (que são bem poucos).</li>
<li><code>set number</code>: Adiciona uma área na esquerda da tela com o número da linha na
própria linha.</li>
<li><code>set wim=longest,list</code>: Duas coisas aqui: 1) comandos de set tem um nome
longo e um nome curto e &quot;wim&quot; é o nome curto para &quot;wildmode&quot;; 2) &quot;wildmode&quot;
define como serão completados os nomes dos arquivos quando você usar um
comando para abrir arquivos e usar [Tab] para tentar completar o nome do
arquivo automaticamente. &quot;longest,list&quot; emula o padrão de shells como Bash.</li>
<li><code>set background=dark</code>: Alguns colorschemes (temas de cor) definem dois
padrões de cores, um claro e um escuro. &quot;background=dark&quot; define que, na
existência de dois padrões, o padrão escuro deve ser usado.</li>
<li><code>set vb t_vb=:</code> Mais uma coisa nova: Duas configurações em uma linha só. Na
verdade, todas as configurações apresentadas aqui poderiam ficar em uma linha
só, mas eu mantive estas duas juntas por um motivo: Como defini
&quot;noerrorbell&quot;, o VIM cai para &quot;visualbell&quot; (nome longo de &quot;vb&quot;), que causa um
&quot;flash&quot; no conteúdo (as cores do tema rapidamente se invertem e voltam ao
normal) quando ocorre um erro; no caso, eu defini que sim, eu quero que o
tipo de erro visual (&quot;<code>t_vb</code>&quot;) seja... nada. Assim, quando ocorre um erro, o VIM
não bipa nem faz flash.</li>
<li><code>set t_Co=256</code>: Define que o terminal terá, por padrão, 256 cores. Algumas
vezes o VIM não consegue descobrir se o terminal tem suporte a mais de 16
cores ou não e esta configuração reafirma que sim, o terminal é capaz de usar
256 e, portanto, colorschemes podem ter mais cores.</li>
<li><code>let mapleader=&quot;,&quot;</code>: Define a variável &quot;mapleader&quot;. &quot;mapleader&quot; é o caractere
que o VIM utiliza em alguns plugins<sup class="footnote-reference"><a href="#5">5</a></sup>, quando estes define comandos em modo
normal. O padrão é &quot;/&quot;, eu mudei para vírgula.</li>
</ul>
<pre data-lang="viml" style="background-color:#2b303b;color:#c0c5ce;" class="language-viml "><code class="language-viml" data-lang="viml"><span style="color:#b48ead;">if </span><span style="color:#8fa1b3;">has</span><span>(</span><span style="color:#a3be8c;">&quot;autocmd&quot;</span><span>)
</span></code></pre>
<p>Eu falei sobre auto-commands, mas na verdade é uma feature que deve ser
adicionada na hora de compilar o VIM. Entretanto, até agora eu não vi um pacote
disponível que não tenha essa feature. Apenas para garantir, verificamos se a
funcionalidade foi adicionada mesmo ou não.</p>
<p>Boa parte do que tem daqui pra frente ou eu já falei ou veio do arquivo de
configuração global.</p>
<pre data-lang="viml" style="background-color:#2b303b;color:#c0c5ce;" class="language-viml "><code class="language-viml" data-lang="viml"><span> </span><span style="color:#96b5b4;">filetype</span><span> plugin indent on
</span></code></pre>
<p>Ativa as configurações vindas do arquivo de sintaxe. Quando eu disse que as
configurações de auto-identação vem do arquivo de sintaxe, é esta linha que
garante que isso vai acontecer.</p>
<pre data-lang="viml" style="background-color:#2b303b;color:#c0c5ce;" class="language-viml "><code class="language-viml" data-lang="viml"><span> </span><span style="color:#96b5b4;">autocmd </span><span>FileType text </span><span style="color:#96b5b4;">setlocal</span><span> textwidth=</span><span style="color:#d08770;">78
</span></code></pre>
<p>Quando o tipo de arquivo for texto (&quot;text&quot;) define localmente para aquele
buffer que o tamanho da linha é de 78 colunas. Como &quot;formatoptions&quot; tem um &quot;t&quot;,
o VIM irá automaticamente quebrar a linha (adicionando um [Enter] antes da
palavra que passa do limite) na coluna 78.<sup class="footnote-reference"><a href="#7">6</a></sup></p>
<pre data-lang="viml" style="background-color:#2b303b;color:#c0c5ce;" class="language-viml "><code class="language-viml" data-lang="viml"><span style="color:#65737e;"> &quot; When editing a file, always jump to the last known cursor position.
</span><span style="color:#65737e;"> &quot; Don’t do it when the position is invalid or when inside an event handler
</span><span style="color:#65737e;"> &quot; (happens when dropping a file on gvim).
</span><span> </span><span style="color:#96b5b4;">autocmd</span><span> BufReadPost </span><span style="color:#b48ead;">*
</span><span> </span><span style="color:#b48ead;">\ if </span><span style="color:#8fa1b3;">line</span><span>(</span><span style="color:#a3be8c;">&quot;’\&quot;&quot;</span><span>) &gt; </span><span style="color:#d08770;">0 </span><span style="color:#b48ead;">&amp;&amp; </span><span style="color:#8fa1b3;">line</span><span>(</span><span style="color:#a3be8c;">&quot;’\&quot;&quot;</span><span>) </span><span style="color:#b48ead;">&lt;= </span><span style="color:#8fa1b3;">line</span><span>(</span><span style="color:#a3be8c;">&quot;$&quot;</span><span>) |
</span><span> </span><span style="color:#b48ead;">\ </span><span style="color:#96b5b4;">exe </span><span style="color:#a3be8c;">&quot;normal g`\&quot;&quot;</span><span> |
</span><span> </span><span style="color:#b48ead;">\ endif
</span></code></pre>
<p>Este comando existe no arquivo de configuração global, mas é bem interessante.
Lendo exatamente o que ele faz: Depois de carregar qualquer arquivo, se a linha
que o marcador de saída do buffer existir e estiver entre o começo do arquivo e
antes do fim da linha, executa, em modo normal, <code>g\&quot;</code>, que efetivamente &quot;pula&quot;
para o marcador de saída do buffer. A diferença entre <code>\`` e </code>g`<code> é que `g</code> não mexe
no jumplist quando pular (logo, ```` não vai funcionar). Como não mexer no
jumplist é algo que não se faz normalmente, nem comentei antes.</p>
<pre data-lang="viml" style="background-color:#2b303b;color:#c0c5ce;" class="language-viml "><code class="language-viml" data-lang="viml"><span> </span><span style="color:#96b5b4;">autocmd </span><span>FileType python </span><span style="color:#96b5b4;">autocmd</span><span> BufWritePre &lt;buffer&gt; :</span><span style="color:#b48ead;">%</span><span>s</span><span style="color:#96b5b4;">/\s\+$/</span><span>/e
</span></code></pre>
<p>Eu falei deste comando antes, mas vamos de novo: Quando o tipo de arquivo for
&quot;python&quot;, adicione um auto-comando que antes de gravar o buffer, execute, no
buffer, a expressão regular <code>/\s\+$//e</code>, que basicamente, serve para remover
espaços em branco no final das linhas.</p>
<pre data-lang="viml" style="background-color:#2b303b;color:#c0c5ce;" class="language-viml "><code class="language-viml" data-lang="viml"><span style="color:#65737e;"> &quot; omni completion
</span><span> </span><span style="color:#96b5b4;">au </span><span>FileType python </span><span style="color:#96b5b4;">setlocal</span><span> ofu=pythoncomplete#Complete
</span><span> </span><span style="color:#96b5b4;">au </span><span>FileType javascript </span><span style="color:#96b5b4;">setlocal</span><span> ofu=javascriptcomplete#CompleteJS
</span><span> </span><span style="color:#96b5b4;">au </span><span>FileType html </span><span style="color:#96b5b4;">setlocal</span><span> ofu=htmlcomplete#CompleteTags
</span><span> </span><span style="color:#96b5b4;">au </span><span>FileType css </span><span style="color:#96b5b4;">setlocal</span><span> ofu=csscomplete#CompleteCSS
</span><span> </span><span style="color:#96b5b4;">au </span><span>FileType xml </span><span style="color:#96b5b4;">setlocal</span><span> ofu=xmlcomplete#CompleteTags
</span><span> </span><span style="color:#96b5b4;">au </span><span>FileType php </span><span style="color:#96b5b4;">setlocal</span><span> ofu=phpcomplete#CompletePHP
</span><span>
</span><span> </span><span style="color:#96b5b4;">set</span><span> completeopt-=preview
</span></code></pre>
<p>Eu não falei do Omni-complete antes porque até o momento o auto-complete
(<code>[Ctrl]p</code> e <code>[Ctrl]n</code> em modo de inserção) tem resolvido todos meus problemas.
Mas, em teoria, o omni-complete consegue detectar quais elementos fazem sentido
no contexto atual, &quot;encherga&quot; coisas que estão no arquivo de tags e conhece
toda a sintaxe da linguagem que você está usando. Mas, realmente, o simples
auto-complete já resolve 99% dos problemas que tenho encontrado.</p>
<p>E desliga a apresentação dos resultados do omni-complete na janela de preview,
que é semelhante ao quickfix, mas na minha experiência, ela quebra muito o
fluxo de edição do código.</p>
<p>Se você quiser tentar, para usar o omni complete basta usar <code>[Ctrl]x</code> seguido de
<code>[Ctrl]o</code>.</p>
<pre data-lang="viml" style="background-color:#2b303b;color:#c0c5ce;" class="language-viml "><code class="language-viml" data-lang="viml"><span style="color:#65737e;"> &quot; ------------------------
</span><span style="color:#65737e;"> &quot; Auto-commands
</span><span style="color:#65737e;"> &quot; ------------------------
</span><span>
</span><span style="color:#65737e;"> &quot; default python style
</span><span style="color:#65737e;"> &quot; (use spaces instead of tabs (expandtab), uses 4 spaces for tabs (tabstop),
</span><span style="color:#65737e;"> &quot; when auto-indenting, also use 4 spaces (shiftwidth), when deleting text, 4
</span><span style="color:#65737e;"> &quot; spaces are a tab (softtabstop) and break the line at column 78 (textwidth))
</span><span> </span><span style="color:#96b5b4;">au </span><span>FileType python </span><span style="color:#96b5b4;">setlocal expandtab</span><span> tabstop=</span><span style="color:#d08770;">4</span><span> shiftwidth=</span><span style="color:#d08770;">4</span><span> softtabstop=</span><span style="color:#d08770;">4</span><span> textwidth=</span><span style="color:#d08770;">78
</span><span>
</span><span style="color:#65737e;"> &quot; reStructured files follow python closely, but use 3 tab stops instead of 4
</span><span> </span><span style="color:#96b5b4;">au </span><span>FileType rst </span><span style="color:#96b5b4;">setlocal expandtab</span><span> tabstop=</span><span style="color:#d08770;">3</span><span> sw=</span><span style="color:#d08770;">3</span><span> sts=</span><span style="color:#d08770;">3</span><span> textwidth=</span><span style="color:#d08770;">78
</span><span>
</span><span style="color:#65737e;"> &quot; templates (Jinja2 in this case) will use tabs instead (to reduce file size)
</span><span> </span><span style="color:#96b5b4;">au </span><span>FileType htmldjango </span><span style="color:#96b5b4;">setlocal</span><span> noet tabstop=</span><span style="color:#d08770;">4</span><span> shiftwidth=</span><span style="color:#d08770;">4</span><span> softtabstop=</span><span style="color:#d08770;">4</span><span> textwidth=</span><span style="color:#d08770;">0
</span><span> </span><span style="color:#96b5b4;">au </span><span>FileType </span><span style="color:#96b5b4;">jinja setlocal</span><span> noet tabstop=</span><span style="color:#d08770;">4</span><span> shiftwidth=</span><span style="color:#d08770;">4</span><span> softtabstop=</span><span style="color:#d08770;">4</span><span> textwidth=</span><span style="color:#d08770;">0
</span><span>
</span><span style="color:#65737e;"> &quot; the smarty filetypes doesn’t have any sort of indentation, so we set it to
</span><span style="color:#65737e;"> &quot; auto
</span><span> </span><span style="color:#96b5b4;">au </span><span>FileType smarty </span><span style="color:#96b5b4;">setlocal</span><span> ai
</span><span>
</span><span style="color:#65737e;"> &quot; PHP break lines at column 79, like Python
</span><span> </span><span style="color:#96b5b4;">au </span><span>FileType php </span><span style="color:#96b5b4;">setlocal</span><span> textwidth=</span><span style="color:#d08770;">79
</span><span>
</span><span style="color:#65737e;"> &quot; svn (when editing svn commit messages, break lines at
</span><span style="color:#65737e;"> &quot; column 70)
</span><span> </span><span style="color:#96b5b4;">au </span><span>FileType svn </span><span style="color:#96b5b4;">setlocal</span><span> tw=</span><span style="color:#d08770;">70
</span><span>
</span><span style="color:#65737e;"> &quot; email (mostly mutt stuff)
</span><span> </span><span style="color:#96b5b4;">au </span><span>FileType mail </span><span style="color:#96b5b4;">setlocal</span><span> spell spelllang=en
</span><span>
</span><span style="color:#65737e;"> &quot; JavaScript (who though those were &quot;good&quot; defaults?)
</span><span> </span><span style="color:#96b5b4;">au </span><span>FileType javascript </span><span style="color:#96b5b4;">setlocal expandtab</span><span> tabstop=</span><span style="color:#d08770;">2</span><span> sw=</span><span style="color:#d08770;">2</span><span> sts=</span><span style="color:#d08770;">2</span><span> textwidth=</span><span style="color:#d08770;">0
</span></code></pre>
<p>Uma série de auto-comandos baseados no tipo de arquivo. Como eu falei antes
neste capítulo, você pode botar vários &quot;set&quot; um atrás do outro separados por
espaço e sets tem versões com nomes longos e nomes curtos (&quot;sts&quot; é um atalho
para &quot;softtabstop&quot;, &quot;sw&quot; para &quot;shiftwidth&quot;, &quot;noet&quot; para &quot;noexpandtabs&quot;, &quot;ai&quot;
para &quot;autoindent&quot; e &quot;tw&quot; para &quot;textwidth&quot;). E sim, eu sei que não manti nenhum
padrão no meio, mas pelo menos agora você alguns nomes curtos para algumas
opções.</p>
<pre data-lang="viml" style="background-color:#2b303b;color:#c0c5ce;" class="language-viml "><code class="language-viml" data-lang="viml"><span style="color:#b48ead;">else
</span><span> </span><span style="color:#96b5b4;">set</span><span> autoindent </span><span style="color:#65737e;">&quot; always set autoindenting on
</span><span style="color:#b48ead;">endif </span><span style="color:#a3be8c;">&quot; has(&quot;</span><span style="color:#96b5b4;">autocmd</span><span style="color:#65737e;">&quot;)
</span></code></pre>
<p>E, se autocmd não estiver disponível, simplesmente seta auto-indent.</p>
<pre data-lang="viml" style="background-color:#2b303b;color:#c0c5ce;" class="language-viml "><code class="language-viml" data-lang="viml"><span style="color:#65737e;">&quot; ------------------------
</span><span style="color:#65737e;">&quot; mapings
</span><span style="color:#65737e;">&quot; ------------------------
</span><span>
</span><span style="color:#65737e;">&quot; Easy switching between tabs (just use Alt+&lt;tab number&gt;)
</span><span style="color:#b48ead;">if </span><span style="color:#8fa1b3;">has</span><span>(‘mac’)
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;D-1&gt; :tabn </span><span style="color:#d08770;">1</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;D-2&gt; :tabn </span><span style="color:#d08770;">2</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;D-3&gt; :tabn </span><span style="color:#d08770;">3</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;D-4&gt; :tabn </span><span style="color:#d08770;">4</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;D-5&gt; :tabn </span><span style="color:#d08770;">5</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;D-6&gt; :tabn </span><span style="color:#d08770;">6</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;D-7&gt; :tabn </span><span style="color:#d08770;">7</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;D-8&gt; :tabn </span><span style="color:#d08770;">8</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;D-9&gt; :tabn </span><span style="color:#d08770;">9</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;D-0&gt; :tabn </span><span style="color:#d08770;">10</span><span>&lt;CR&gt;
</span><span>
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;D-1&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">1</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;D-2&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">2</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;D-3&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">3</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;D-4&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">4</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;D-5&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">5</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;D-6&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">6</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;D-7&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">7</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;D-8&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">8</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;D-9&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">9</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;D-0&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">10</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span style="color:#b48ead;">else
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;M-1&gt; :tabn </span><span style="color:#d08770;">1</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;M-2&gt; :tabn </span><span style="color:#d08770;">2</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;M-3&gt; :tabn </span><span style="color:#d08770;">3</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;M-4&gt; :tabn </span><span style="color:#d08770;">4</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;M-5&gt; :tabn </span><span style="color:#d08770;">5</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;M-6&gt; :tabn </span><span style="color:#d08770;">6</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;M-7&gt; :tabn </span><span style="color:#d08770;">7</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;M-8&gt; :tabn </span><span style="color:#d08770;">8</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;M-9&gt; :tabn </span><span style="color:#d08770;">9</span><span>&lt;CR&gt;
</span><span> </span><span style="color:#96b5b4;">map </span><span>&lt;M-0&gt; :tabn </span><span style="color:#d08770;">10</span><span>&lt;CR&gt;
</span><span>
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;M-1&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">1</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;M-2&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">2</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;M-3&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">3</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;M-4&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">4</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;M-5&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">5</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;M-6&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">6</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;M-7&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">7</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;M-8&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">8</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;M-9&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">9</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span> </span><span style="color:#96b5b4;">imap </span><span>&lt;M-0&gt; &lt;ESC&gt;:tabn </span><span style="color:#d08770;">10</span><span>&lt;CR&gt;</span><span style="color:#96b5b4;">a
</span><span style="color:#b48ead;">endif
</span></code></pre>
<p>Ok, este é um mapeamento que eu sempre achei interessante:</p>
<ol>
<li>
<p>Existe uma diferença entre OS X e outros sistemas que a tecla &quot;Command&quot; é
usada para praticamente tudo, inclusive trocar as abas nos browsers; já em
outros sistemas, a tecla para isto é &quot;Alt&quot;. Um VIM compilado para OS X tem,
estranhamente, uma feature chamada &quot;mac&quot;; checando isso você consegue
descobrir se está rodando num OS X ou não.</p>
</li>
<li>
<p>Mapeamentos diferentes para modo normal e de inserção: Se estiver no modo
normal, basta usar <code>:tabn {número}</code> para pular diretamente para uma aba (<code>:tabn {número}</code> é a versão de modo de comando do <code>{número}gt</code> do modo normal<sup class="footnote-reference"><a href="#8">7</a></sup><sup class="footnote-reference"><a href="#9">8</a></sup>);
quando estiver em modo de inserção, saida do modo de inserção (simulando
pressionar [Esc] com <ESC>, execute o mesmo comando usado no modo normal
para pular para uma aba específica e volte para o modo de inserção (&quot;a&quot;).</p>
</li>
</ol>
<p>BOOM! Você acabou de adicionar no VIM uma feature que existe nos browsers.</p>
<pre data-lang="viml" style="background-color:#2b303b;color:#c0c5ce;" class="language-viml "><code class="language-viml" data-lang="viml"><span style="color:#65737e;">&quot; custom PHP syntax file configuration
</span><span style="color:#96b5b4;">let</span><span> php_smart_members=</span><span style="color:#d08770;">1
</span></code></pre>
<p>Essa é uma das coisas que eu falei antes: &quot;let&quot; permite definir variáveis,
incluindo algumas dentro do arquivo de sintaxe. No caso &quot;php_smart_members&quot;
altera a forma como funções membro de uma classe em PHP seja coloridas de forma
diferente.</p>
<p>O resto do meu arquivo de configuração é usado para manter plugins, que eu vou
explicar o que cada um faz mais pra frente. Se você quiser ver o arquivo
original, ele pode ser encontrado no meu repositório de configurações (que eu
uso para manter as configurações sincronizadas entre meu computador pessoal e o
computador do trabalho).</p>
<p><sup class="footnote-reference"><a href="#1">1</a></sup> Apenas para fazer um gancho com o que foi falado anteriormente: No
capítulo #2.5, quando estava falando de comandos do modo de comando, eu
comentei sobre <code>:noh</code> para desmarcar as ocorrências encontradas no último
comando de pesquisa. Bom, <code>hlsearch</code> faz com que estas ocorrências sejam
marcadas e se você colocar set <code>nohlsearch</code>, nenhuma ocorrência será marcada
e você nunca irá precisar usar <code>:noh</code>.</p>
<p><sup class="footnote-reference"><a href="#2">2</a></sup> ... ou quando você usar <code>&gt;{movimentação}</code> ou <code>&lt;{movimentação}</code> em modo normal,
que eu não havia mencionado antes porque estávamos falando de edição de
qualquer texto e não de código fonte. <code>&gt;&gt;</code> irá adicionar um &quot;shiftwidth&quot;
para a direita e <code>&lt;&lt;</code> irá remover um &quot;shiftwidth&quot; na esquerda.</p>
<p><sup class="footnote-reference"><a href="#3">3</a></sup> Aqui acabamos de ver duas configurações de flags: Uma ativando uma
configuração (&quot;showmatch&quot;) e outra desligando (&quot;noerrorbells&quot;).</p>
<p><sup class="footnote-reference"><a href="#4">4</a></sup> Uma pequena nota sobre as posições apresentadas: algumas vezes, você verá
o VIM apresentar a coluna como &quot;{número}-{número}&quot;. Isso acontece
principalmente quando se está usando tabulações ao invés de espaços e o
VIM está indicando a contagem de caracteres na esquerda e a coluna de
exibição na direita (ou seja, o valor da direita é {quantidade de
caracteres menos tabulações} + ({quantidade de tabulações} * {&quot;tabstop&quot;}).</p>
<p><sup class="footnote-reference"><a href="#5">5</a></sup> E quando digo &quot;quebrar&quot; eu quero dizer &quot;quebrar&quot; mesmo: Enquanto que
&quot;wrap&quot; irá cuidar apenas da apresentação do texto, &quot;textwidth&quot; com
&quot;formatoptions=t&quot; irá inserir um caractere de nova linha quando a palavra
digitada ultrapassar o limite indicado.</p>
<p><sup class="footnote-reference"><a href="#6">9</a></sup> Note que o VIM define uma variável para isso, mas nada garante que o autor
do plugin utilizou essa tecla. Existe um padrão em usar &quot;mapleader&quot; como início
de comando normal de um plugin, mas nada obriga o autor do plugin à usar
esta tecla.</p>
<p><sup class="footnote-reference"><a href="#7">6</a></sup> E, recapitulando, para reformatar o parágrafo caso você altere alguma
coisa no texto, use gq sobre a região do mesmo. O VIM irá considerar o
&quot;textwidth&quot; na hora de reformatar.</p>
<p><sup class="footnote-reference"><a href="#8">7</a></sup> E não, não são todos os comandos que tem versões tanto em modo normal
o quanto em modo de comando.</p>
<p><sup class="footnote-reference"><a href="#9">8</a></sup> E porque eu usei <code>:tabn {número}</code> ao invés de <code>{número}gt</code>? Porque quando eu
pesquisei como pular de abas, este foi o primeiro resultado que eu encontrei.</p>
<div>
<div style="float:left">
&lt;&lt; <a href=".&#x2F;11-config">Arquivos de Configuração</a>
</div>
&nbsp;
<div style="float:right">
<a href=".&#x2F;11-02-gvimrc">Meu .gvimrc</a> &gt;&gt;
</div>
</div>
</div>
</div>
</body>
</html>