Uma Lição de VIM #4: Recortar, Copiar e Colar

(Essa é a parte que você não deve fazer muitas vezes quando estiver programando.)

Assim como outros editores, o VIM tem um sistema de copiar e colar. E, como vimos vendo desde o começo, o VIM tem seu modo peculiar de lidar com isso.

Toda a parte de copiar-e-colar do VIM é feita em modo normal. E sem que você soubesse, você já stava vendo a parte de recordar textos desde a parte de comandos do modo normal: Qualquer comando que exclua texto imediatamente transfere a parte excluído para a área de transferência do VIM. A única parte que ficou faltando foi como você “cola” estes textos de volta.

E, para colar, você usa p (de “paste”, veja só!).

E, obviamente, existe o [Shift]+p também. E a diferença é facilmente explicada se voltarmos para o capítulo #2.2.

Quando falamos do cursor, eu disse que o cursor encontra-se na parte inferior esquerda do bloco do cursor. O colar do VIM é feito depois do cursor. Assim, ao pressionar p, o texto irá aparecer depois do caractere sob o cursor; se for pressionado [Shift]+p, o texto será colado antes do caractere atual, empurrando o mesmo pra frente.

O funcionamento muda um pouco se você recortar o texto usando o modo visual de linha (ou recortar usando algum movimento que desconsidere a coluna atual). Nestes casos, o VIM entende que você quer colar uma linha inteira e, ao invés de mover o conteúdo da linha atual, o texto é colado abaixo da linha atual, desconsiderando a posição do cursor. [Shift]+p irá colar o texto antes da linha atual.

(Embora pareça complicado, a medida que você for se aclimatando com o copiar-e-colar do VIM, você verá que não é tão diferente dos demais editores — com a exceção que os outros editores tentam adivinhar quando você quer fazer copia de linhas inteiras ou apenas pedaços, enquanto que o VIM deixa você mesmo decidir quando fazer isso.)

A única coisa que ficou faltando agora foi como copiar o texto sem remover o mesmo antes — porque, vamos admitir, recortar e colar de novo seria muita burrice.

O comando para copiar é y{movimentação}. Normalmente, ele é chamado de “yank” (arrancar) e por isso muitos chamam o sistema de “copy’n’paste” do VIM de “yank’n’paste”.

Para copiar a linha inteira, você pode usar yy. Isto copia toda a linha, incluindo o marcador de nova linha, e o VIM vai entender que, na hora de colar, você quer colar a linha inteira, seguindo as mesmas regras que eu expliquei acima sobre o modo visual de linha.

Assim como outros editores, o VIM mantém a área de transferência entre arquivos (com isso, você pode abrir um arquivo, copiar um texto, abrir outro arquivo e colar a parte selecionada do primeiro) e, normalmente, o VIM ainda consegue manter a área de transferência entre execuções. Entretanto, uma coisa que você pode não gostar é que a área de transferência pertence e é gerenciada exclusivamente pelo VIM — ou seja, ele não usa a área de transferência do sistema operacional[1]. Assim, você não vai conseguir copiar do VIM e colar no seu browser ou vice-versa.

… a não ser que você use registradores, que nós vamos ver a seguir.

[1] E não, o “botão do meio dentro do X” não é a mesma coisa a área de transferência.

Uma Lição de VIM #3: Outros Comandos

(Esta é a parte em que eu comento alguns comandos que você vai usar esporadicamente.)

Neste ponto você deve estar entendendo como os modos do VIM funcionam, para que cada um funciona e tento uma idéia básica de como editar arquivos. Como eu falei já duas vezes, a quantidade de comandos disponíveis é gigantesca, então vamos aproveitar esse pequeno momento em que as coisas começam a fazer sentido para ver mais alguns comandos.

[Shift]+j (Modo normal)

“Junta” a linha abaixo do cursor com a atual. Pode não parecer muito, mas o VIM irá colocar um espaço no final da linha atual[1] antes de juntar com a linha abaixo e removerá todo caractere branco da linha de baixo antes de juntar as duas linhas.

x (Modo normal)

Apaga o caractere sob o cursor. O mesmo que [Del].

gq (Modo normal)

Reformata o parágrafo. Não faz muito sentido para código, mas se você tiver configurado a coluna máxima (vou explicar como fazer isso na parte de configuração do VIM), você pode selecionar um comentário em modo visual e usar gq para que o VIM alinhe o comentário no espaço definido. Também serve para quando você estiver editando arquivos de markup (MarkDown, reSTRUCTURED text, HTML, etc).

gg e G (Modo normal)

gg move o cursor para o início do arquivo e G move o cursor para o fim do arquivo. Efetivamente, fazer ggdG (mover o cursor para o início do arquivo, remover tudo até o final do arquivo) irá remover todo o conteúdo do arquivo.

= (Modo normal)

Reidenta o código usando a sintaxe atual.

u e [Ctrl]+r (Modo normal)

Undo e redo, respectivamente.

[Ctrl]+y e [Ctrl]+e (Modo normal e Modo de inserção)

Dois comandos que funcionam de forma diferente se executados em modo normal ou modo de inserção.

No modo normal, [Ctrl]+y irá rolar o conteúdo do texto para baixo, mantendo o cursor na mesma posição enquanto que [Ctrl]+e irá rolar o conteúdo para cima, ainda mantendo o cursor na mesma posição. Se você abusar destes comandos, movendo a linha onde o cursor se encontra para fora da área visível, o cursor irá se mover.

No modo de inserção, no entanto, [Ctrl]+y irá copiar o caractere da linha de cima na mesma coluna na posição atual; [Ctrl]+e faz o mesmo, mas com a linha de baixo.

. (Modo normal)

Repete o último comando. Note que . irá repetir o último comando completo. Por exemplo, quando eu falei sobre ggdG, estamos falando, na verdade, de dois comandos completos: gg e d{movimentação}. ., neste caso, irá repetir o comando dG. Mais adiante veremos como criar “macros de teclado” e efetivamente permitir a execução de coleções de comandos.

:e e :files (Modo de comando)

Edita um arquivo. Se não for passado o nome do arquivo depois do comando, o mesmo arquivo é recarregado do disco (em outras palavras, o buffer é atualizado com o conteúdo do arquivo). :e# recarrega o último arquivo aberto (por exemplo, se você estiver com o arquivo “arquivo” aberto e fizer :e arquivo2, usar :e# irá recarregar “arquivo” para o editor; usando :e# de novo, “arquivo2” será apresentado).

Você pode ver os últimos arquivos abertos na sessão atual do VIM com :files. Se quiser recarregar algum destes arquivos de novo, basta usar :e#{número}, onde {número} é o número do arquivo na lista.

:sh (Modo de comando)

Abre um shell dentro do VIM. Para retornar ao VIM, basta encerrar o shell.

:{número} (Modo de comando)

Pula para a linha indicada. Por exemplo, :100 irá para a centésima linha do arquivo.

[Ctrl]+] e [Ctrl]+t (Modo normal)

[Ctrl]+] pula para a tag sob o cursor e [Ctrl]+t retorna. Mais adiante veremos como criar um arquivo de tags para que o VIM consiga navegar pelo código. A mesma idéia é usada no help do VIM: se você digitar :help irá ver a primeira página de ajuda do editor; para navegar entre os tópicos apresentados (marcados de forma diferente, dependendo do esquema de cor utilizado), é utilizado [Ctrl]+] para avançar e [Ctrl]+t para retornar para a página anterior.

~ (Modo normal)

Altera o caractere sob o cursor para maiúscula se for minúscula e vice-versa e move o cursor uma posição pra frente.

gu{movimentação}, gU{movimentação} e g~{movimentação} (Modo normal)

gu{movimentação} altera todos os caracteres em {movimentação} para minúsculas.

gU{movimentação} altera todos os caracteres em {movimentação} mara maiúsculas.

g~{movimentação} faz ~ nos caracteres em {movimentação} (ou seja, os caracteres da posição do cursor até movimentação ficarão em maiúsculas se estiverem em minúsculas e vice-versa).

[Ctrl]+p e [Ctrl]+n (Modo de inserção)

Auto-complete. [Ctrl]+p tenta completar a palavra antes do cursor voltando no texto enquanto que [Ctrl]+n tenta completar com palavras mais a frente no texto.

[Ctrl]+a e [Ctrl]+x (Modo normal)

Incrementa ([Ctrl]+a) ou decrementa ([Ctrl]+x) o número sob o cursor. O VIM automaticamente detecta se o número está em decimal, octal ou hexa.

Edit: E MAIS!

w (Modo normal)

Move o cursor para o começo da próxima palavra.

e (Modo normal)

Move o cursor para o fim da próxima palavra.

b (Modo normal)

Move o cursor para o começo da palavra anterior.

ge (Modo normal)

Move o cursor para o fim da palavra anterior.

[1] … a não ser que o primeiro caractere (não branco) da linha de baixo seja um ); neste caso, o VIM não adiciona o espaço.

Uma Lição de VIM #2.5: Mudando de Modos – Modo de Comando

(Essa é a parte onde você vai aprender a fazer as coisas que precisavam de um menu para serem feitas.)

Existem três “iniciadores” de comandos no modo de… erm… comando:

:
Inicia um comando de edição.
/
Comando de pesquisa.
!
Comando de filtro externo.

Comandos de Edição

Assim como os comandos do modo normal, a quantidade de comandos de edição é grande demais para cobrir de uma vez só. Então vamos dar uma olhada nos mais utilizados:

:q
Sai do VIM. Esse deve ser o comando mais infame da história do editor — pelo menos, para os não iniciados.
:w
Salva o arquivo atual em disco. Edit: Esqueci de mencionar: Você pode passar o nome do arquivo a ser salvo neste ponto. :w, por exemplo, irá salvar o conteúdo com o nome atual; :w outro-nome irá salvar o conteúdo no arquivo “outro-nome”.
:wall
Salva todos os arquivos arquivos. Mais adiante veremos como ter vários arquivos abertos ao mesmo tempo.
:wq
Salva o arquivo atual e o fecha.
:help
Abre o help do VIM no tópico indicado. Por exemplo, :help :w irá apresentar as opções existentes para o comando :w; :help c irá mostrar as opções do comando c do modo normal e assim por diante.
:set
Configura (ou apresenta) alguma configuração do VIM. Mais a frente veremos como configurar o VIM e veremos as opções este comando.
:r
(Ou :read) Não é muito comum, mas permite carregar o conteúdo de outro arquivo para dentro do arquivo atual. sem precisar fazer todo o processo de copiar-e-colar (que veremos mais adiante). Um fato interessante de :r é que se o nome do arquivo a ser carregado começar com !, o VIM irá tentar executar o comando ao invés de carregar o conteúdo. Por exemplo, :r date irá carregar o conteúdo do arquivo date para dentro do arquivo atual enquanto que :r !date irá carregar o resultado do comando date para dentro do arquivo atual.
:noh
(Ou :nohighlight) Desliga a marcação sobre elementos de pesquisa. A seguir nós vamos ver sobre o comando de pesquisa; ao fazer uma, o VIM irá colocar um “realce” (ou “highlight”) sobre as palavras encontradas. Para desligar esses realces no texto, você pode usar :noh.

Aqui eu preciso abrir três parenteses:

  • Quando o vim se recusar a executar um comando, você pode forçá-lo a executar o mesmo de qualquer forma adicionando uma exclamação ! no final do comando. Por exemplo, se o VIM se recusar a sair porque você tem alterações em um arquivo não salvo, :q! irá forçar o editor fechar, perdendo as alterações feitas; se o arquivo não tiver permissão de escrita, :w! irá fazer com que o VIM altere as permissão do arquivo para poder escrever (e, no final, esta alteração das permissões é revertida)[1].
  • Uma coisa que você vai encontrar frequentemente são referências a “buffer” e “arquivo”. Entenda assim: buffer é a representação do arquivo na memória enquanto que o arquivo é a representação do conteúdo no disco. Ao abrir um arquivo, o VIM cria um buffer com o conteúdo do arquivo e o mantém em memória; se o arquivo sumir, o buffer ainda existirá e poderá ser salvo ainda; vários comandos internos do VIM — se você se aventurar a escrever um plugin, por exemplo — fazem referência ao buffer e não ao arquivo, mas existem funções que retornam o buffer de um arquivo com o nome indicado. Em todo esse tempo usando VIM, a distinção entre ambos nunca me pareceu importante e considerar, simplesmente, que “buffer” é o arquivo em memória é o suficiente.
  • Todos os comandos internos do VIM iniciam com uma letra minuscula e plugins, quando adicionam comandos a mais, adicionam com letras maicúlas[2]. Ainda, boa parte dos comandos não precisa ser digitada completa; quando não há mais redundâncias, o comando é aceito. Por exemplo, se houverem os comandos “:Gblame” e “:Gbork“, “:Gb” não será aceito, mas “:Gba” será porque não há mais nenhum outro comando que comece com “:Gba” (por isso que “:noh” funciona como atalho para “:nohighlight“).

Comando de Pesquisa

O comando de pesquisa é, simplesmente, /. Uma vez pressionado, você verá o cursor indo para a última linha da tela esperando a pesquisa. Uma coisa a ter em mente é que o VIM utiliza expressões regulares — então algumas coisas que você procurar não irão funcionar exatamente como você está esperando. “.“, por exemplo. Eu não vou entrar em detalhes sobre expressões regulares porque há pilhas de informações sobre elas na internet — e há praticamente mais sobre elas do que essa série tem (e terá) sobre VIM.

Dois comandos do modo normal que eu não mencionei antes por estarem ligados ao comando de pesquisa são n e N. n irá mover o cursor para a próxima ocorrência da pesquisa, enquanto que N move o cursor para a anterior. Note que eu falei “move o cursor”; isso quer dizer que n e N são comandos de movimentação e, portanto, podem ser usados com outros comandos do modo normal que utilizam movimentação. Por exemplo, procurar por “olá” e, em modo normal, executar cn irá remover tudo da posição do cursor até a próxima ocorrência de “olá” (e entrará em modo de edição).

Comando de Filtro

O comando de filtro pega o conteúdo no editor e passa para outro programa. Por exemplo, se você tiver o aplicativo “rot13”, ao executar !rot13, todo o conteúdo do arquivo será convertido para ROT13. Se você digitar !!rot13, no entanto, o conteúdo ainda será passado para o filtro e o resultado irá substituir o conteúdo do buffer atual.

Não parece ser interessante, mas um dos aplicativos que normalmente vem com o VIM é “xxd”, que converte o conteúdo para sua representação hexadecimal. Ao executar “!xxd”, você verá todo o conteúdo do seu arquivo com os valores hexadecimais de cada caracter.

[1] Não confunda “Não ter permissão de escrita” com “O arquivo pertence ao root”. No primeiro caso, o usuário tem permissão de ler o arquivo e trocar as permissões enquanto que no segundo o editor teria que ter permissões especiais de execução para poder trocar as permissões. O VIM só consegue responder ao :w! se ele próprio — e, no caso, o próprio usuário — tiver permissões suficientes sem requisitar outro aplicativo.

[2] Na verdade, o VIM vem sim com comandos que inicial com letra maíuscula: São os comandos de exploração de diretório :Explore, :Rexplore, :Vexplore e o famigerado :Sexplore, que o pessoal costuma encurtar para :Sex.

Uma Lição de VIM #2.4: Mudando de Modos – Modo Visual

(Esta é a parte em que VIM deixa de ser um editor tão alienígena.)

Na nota de rodapé do primeiro capítulo eu comentei que a maior parte dos comandos do modo visual podem ser feitos no modo de comando. Como já vimos o modo de comando, fica mais fácil entender o modo visual.

Em suma, o modo visual é a versão do VIM para o “Shift+Direcionais” dos demais editores: Vai selecionando texto, deixando visível o que está sendo selecionado. A diferença é que não é preciso ficar segurando o Shift o tempo todo. E todos os demais comandos de movimentação ainda são válidos.

Para entrar no modo visual, você usa, em modo normal, v — e, de novo, você não precisa pressionar ou ficar segurando nenhuma tecla: o modo ficará ativo até que você cancele o modo visual (voltando para o modo normal com [Esc]) ou seja utilizado algum comando de alteração de texto (como s).

Uma vez que a região fique selecionada, você pode usar qualquer comando de alteração de textos para executar somente naquela região. Assim, ao invés de ficar contando quantos tempos a linha tem para chegar no número certo de saltos para o commando f, você pode facilmente ativar o modo visual, navegar a bel prazer, usado qualquer combinação de comandos de movimentação (incluindo repetir f a vontade) até chegar no ponto que quiser e executar o comando somente naquela região.

Além de v, existem outros dois outros comandos para entrar em modo visual: [Shift]+v e [Ctrl]+v.

[Shift]+v é chamado de “modo visual de linha” porque, bem, são selecionadas linhas inteiras neste modo, incluíndo o caracter de nova linha de cada uma das linhas selecionadas. Neste modo, não é possível selecionar apenas parte de uma linha, somente linhas inteiras — que é útil quando se quer remover aquela função inteira[1].

[Ctrl]+v é chamado de “modo visual de bloco” e faz algo que poucos outros editores conseguem: seleção de regiões retangulares. A pergunta que você deve estar se fazendo agora é: e como é que o VIM junta as linhas se eu apagar um bloco inteiro? Resposta indireta: O modo visual de bloco funciona como se várias seleções fossem feitas ao mesmo tempo, o que significa que cada linha é uma seleção diferente e que cada comando de alteração de texto é executado individualmente em cada linha. Assim, se você iniciar o modo visual de bloco, selecionar várias linhas mas apenas uma coluna, e executar o comando c,[Esc], o que vai acontecer é que o VIM irá substituir o caracter na coluna indicada por vírgula em cada uma das linhas. Ou seja, respondendo a pergunta feita logo no começo deste parágrafo: o VIM irá juntar as linhas como se você tivesse ido na primeira linha, executado o comando, retornado a coluna inicial, ido para a linha seguinte, repetido o comando e passado para a próxima linha.

[1] Ou copiar para outro arquivo, que nós vamos ver mais pra frente.

One Week With a Galaxy S4

I used to have an iPhone 4S for 2 years and an iPad 3 for a whole year but, last week, I had both stolen and, due some other purchases, I had to get something to replace a phone and a tablet in a single shot. So I decided to go with a Galaxy S4, just because it has a large screen that — supposedly — I could use like a tablet.

Reviewing any Android device is hard. Not because there are things that you will, accidentally or by ignorance, try to do in same old way, but because there isn’t a single Android. The first two days with the S4 were annoying as hell (partly my own fault for trying to do the same old things in the same old way) but after some people mentioning that I should replace my current Android with an “Android Google Edition for S4”, some things improved greatly. So even when we talk about Android, we are not talking only about the “mobile operating system by Google”, but all the range of stuff manufacturers stuff on it. So part of what I’ll call it “didn’t like” may be solved by some other manufacturer or by a third party application.

Also, there are some apps that can change a lot of the base operating system. So, again, part of what I call “didn’t like it” may be solved by someone else and available in the Google Play. Still, there are some things that I may consider really basic stuff that should work properly out of the box and not require something else, not matter how easy it is to install it.

And, in the end, I won’t go “this iOS app vs this Android app” because apps tend to be different anyway in different operating systems and any problem I’d find in them would be probably skewed due the fact that I’m trying to use any Android app as an iOS app, which makes absolutely no sense. So I’ll try my best to focus on the hardware and the base operating system instead of going app through app.

So, without further ado…

Things I’m Ambivalent About

The Earphones

The earphones that come with the S4 are really earphones, not “earbuds”. I really like the earbud design as it sits on your ear without any pressure anywhere. On the other hand, the S4 earphones, due their own design, provide a way better noise cancellation (not full noise cancellation, but still good enough) and, for me, they fit quite nicely.

So a bit down in the comfort zone, but somewhat up in the noise zone.

Just to add up: As the earbuds, the Galaxy earphones also have in-cable “remote” control. The difference is that, while the earbuds (and previous incarnations) use a single button (or surface) for all buttons, the Galaxy ones have two buttons: one for volume up and down and another to play. Personally, I prefer the Apple design simply because I could easily move my thumb to the remote and all controls were at “hand” easily (thumb on control: do I want to play/pause/skip? click straight away; volume up? just move thumb up; volume down? just move thumb down); with the Galaxy, I usually need to either move my thumb up or down ’cause I never really get exactly what I want — sometimes I want to increase the volume but the first thing I touch is the play/pause button and vice-versa. Still, it’s just a matter of getting used to it, so I’m not holding this against Galaxy (or praising it, for any chance).

Screen Space

This is quite weird for someone that was looking for a large screen say that he’s divided about it, but I really don’t know how to feel about it. Sure, there is plenty screen space and it feels less crowded than an iPhone and the fact that it can go from one corner of the device to the other is really amazing.

On the other hand, due the very small margins between the screen and the device edges, more than once I end up “clicking” something I really didn’t want. More than once I opened an ad due the very little space between the end of the screen and the “Back” button; once I even managed to call someone ’cause the telephone app was too close to the edge and I “clicked” the screen with part of the palm of my hand[1][2].

Music Transfer

The process to move a song to an iOS device is not really direct: You need to add the song to your iTunes Library and then sync it with your device[3][4]. So you’re required to firstly add them to a library to be able to have in your device. There is no way to add a song directly to the device[5].

On Android, I was expecting it to show as an USB device and drop the songs. My surprise is that you need a special application to transfer songs from my OS X to my S4[6].

So things appear to be basically the same: You need a special application that will either act as a library sync or something to transfer the files as you need them.

The “Desktop” Metaphor

On iOS, your “desktop” is also your application list: What you see is what you have installed; if you remove an app from your “desktop”, you remove it from your device. On Android, there is a distinction between those two: There is a desktop, in which you can add application launchers and widgets and installed apps; removing an app from the desktop will not remove the app from the device (but removing from the app list will remove from the desktop).

Personal opinion, on the iOS it is easier to realize things like “oh gee, I have too many stuff installed already, I may need to uninstall some stuff to free space”; it also makes it easier to see apps around and remove them when you don’t use them anymore. On Android, with the prominence of the desktop, this kind of stuff could be hard to spot.

On the other hand, because Android splits the launchers and the installed apps in two different “containers”, it’s way easier to not clutter your screen with rows and rows of icons; you can have that application that you eventually use hidden in the “All apps” part of the OS while the most used apps in the desktop (while in the iOS you’d probably end up throwing that less used app in the some very far away workspace).

Also, the Android desktop allows the mix of app launchers and widgets. I see that removing the desktop and using the same iOS idea of “app list = desktop” would really get messy with widgets, as you’d have two things behaving differently to add and remove. Because adding and removing launchers and widgets to the desktop is the same, it completely makes sense having this desktop metaphor[7].

I really like how every single thing an app requires is listed directly in the app page, before you can confirm your purchase/install. I can’t remember anything like that in the iTunes Store — the only way to find out that the application will use your address book for something is when it requests permission to do so. And, even so, the Play Store app page list every single thing the app will try to use, from internet access to changing some configuration option deep down in the system.

On the other hand — and this is totally my own pet peeve with this kind of stuff, and it doesn’t affect only Android, so this point could be kinda moot — if the app is requesting all those permissions, I’d like to be able to tell what I’d allow it to do. Oh sure, this Twitter client can access internet, but in any shape or form it should require to access and change my address book. I should be the one saying “yes, it can read and change” or “actually, this app can only read my address book, not change it” or even “there is no fucking what this app will access my address book”.

I find it a “win” that it lists everything, but a “loss” for going so deep into checking everything the app does and not letting me block it. iOS doesn’t list everything (loss), but the crucial parts are “user-blockable” (partial win, as you can’t only give permissions some stuff, not everything).

Back AND Home Buttons

While iPhones and iPads have a single button, called “Home”, the S4 have 3 buttons: A physical “Home” button, and two virtual buttons, one Menu button and a Back button.

Initially, it’s confusing — at least, coming from iDevices — to understand why you have two buttons that, at first glance, do the same thing. After using it for longer, though, the use of each become clear.

What I Really Enjoyed

The Keyboard

Ok, I admit: The coolest thing on Android is the “swype-like” keyboard: instead of pressing key-by-key to type words, you can just slide through the virtual keyboard and get the word you want. iOS can only do that in a jailbroken OS, so Android wins on this.

Install From a Page

This is something Google really did well. You go to Google Play on any browser, pick an app and select it to install and it will install on your device next time it finds a network.

On iOS, you need to access the Store with a single browser embedded in a single app which, let’s be honest, it’s less optimal when you’re on your work computer and find out that that awesome app finally launched, but you can’t install ’cause you’re not in the blessed OS with the blessed application.

App Stacking

The way Android stacks apps and unstacks them when you press the “Back” button really makes going through apps a breeze: Clicked a link in a Twitter client? No problem, pressing back on the browser will, eventually, lead you back to the Twitter app. On iOS, you need to enable the multigesture feature and use 4 fingers to the left to go back to the previous app, pretty much as you would Alt+Tab on a desktop. But it gets confusing most of the time and the app doesn’t react immeditally[8] when you switch back to it.

Adding Ringtones/Alarm/Notification Sound From Anywhere

There are two ways to add a new sound for your alarm/ringtone/notification sound on iOS: You either have to buy it or add them to iTunes and then sync your device — pretty much what you would do to add a new song to it. On Android, on the other hand, if you hear something interesting, it’s easy to simply replace the current setting to something else. No fuss.

Less Smudge

This is about the hardware now: I believe my S4 is accumulating way less smudge than my iPhone, in the long run. I’d guess that it’s related to the glass type used by each company but I really don’t know this well enough to give any points with certainty. On the other hand, it could simply be my impression — after all, I was using the same iPhone for 2 years and the screen could have some moisture under it.

Still, I have the feeling, in this week that there is something different in the production of the glass of each device that makes the S4 less prone to get finger marks all over the screen.

Side To Side Apps

It’s an app feature, not every app have it, but I’m guessing it’s a feature provided by the operating system and, thus, deserve to be listed here.

While iOS apps have a TabBar with some direct links, Android apps have a similar feature, but you can easily switch between them just sliding your finger towards it. I know, as a fact, that up to iOS 6 this was not in the base system and you had to do it manually (it was possible); due the amount of apps that use it on Android, I can only guess that it’s native and, thus, a good improvement.

Remove Apps From the Store

I tried doing this before my iPhone and iPad were stolen, but I couldn’t simply remove a purchased app from my list of applications. Why one would do that is probably a better question, as all it does is annoy the vendor as they have to keep a line in their database that I purchased some app. But still, it was something I did want to do with my iOS purchases and couldn’t. I can on Android + Play Store.

Per App Auto-Update

Just recently Apple rolled the automatic app update (on iOS7). My Android 4.3 already has this and more: I can select which applications can and which ones can’t be automatically updated.

(It’s a bit hidden in the Play Store instead of your “Installed Apps” list, but still, it’s there.)

Things That Are Annoying So Far

Battery Life

My 2 year old iPhone would last for 2.5 days without charging. My S4, in 20 hours, is all completely drained.

The “Samsung” Android

As I mentioned, my first 2 days of Android were… annoying. I had most of the stuff working in a bad way — remember, “bad way” as in “I was used to other mobile OS” — that cleared as I switched to another distribution of Android — which I think that’s what they should be called, “Android Distributions”.

The base system is the same, yes. The store is the same, yes. But the whole experience is different — pretty much what we have with Linux distributions already.

And, sadly, the whole affair felt so wrong to me. If I could relate this to something else, it would be like installing Windows from a vendor and having a shitload of bloatware installed that instead of helping you, just got in the way.

The whole process of installing a new distribution is also annoying: I had to use an specific app for an specific OS to be able to do convert my phone. Not only that, but I lost all the data I had in my apps, while installing Cydia — or even uninstalling it, for that matter — does not mess with your apps data.

Notifications

This is probably my greatest pet peeve with Android right now: Notifications.

Let me explain how iOS notifications work: First, all application that use notifications have their configuration in a single place, in the main configuration app. You can select how the notification will be displayed, if it will have sound, if it can show the notifications in the lock screen (basically, wake up the device to show you a notification) and even if the application have permission to show any notifications.

Nothing like this exist on Android. So I can’t say that emails can have small notifications without sound and without waking the device and that SMSes should have sound and show in the lock screen, unless the application explicitly allows that in its configuration.

Not only that, but the system apparently doesn’t understand the context in which the application is creating the notification. For example, I tried to buy an app in the Play Store; the card was declined because I had to allow foreign purchases; the bank sent me an SMS telling me that and, if I wanted, I should reply with some random code; I did reply; and then, a few seconds later, I got an SMS back and the notification at the same time. The OS basically gave me a notification for something that was right in front of me. I saw the message before the notification popped up (well, milliseconds before the notification) and I still got a notification.

Apart from that, there is a bug open since 2010 about notification sounds going through the speakers even when you have your earphones on. You have no idea how many looks I got when I set my notification sound to Peter Griffin saying “Oh my God, who the hell cares?” and it just popped up while I was listening to music with my earphones — which got muted while everyone was listening to the notification.

The solution for the above problem, if you try to find one, is to install an app that changes your settings based on events (time of the day, location, earphones in, etc). The solution is to install this app and add a configuration to change the phone profile to mute when earphones are in. But this is not really a solution, all you’re doing is silencing notifications, not making them go on the proper channel.

Also, it seems that, depending on the app that it is in the foreground, there is no way to access the notification to see what happened. On my iPad, I could pull the notification list (and the “quick setup dialog”) inside Pocket Trains; on Android, there is no way to see the notifications — ’cause hey, if I have to wait 2 minutes for the train to reach some station, I could pretty much just clean up my notification list, right? RIGHT?

Music Purchase

This is, pretty much, a #ThirdWorldProblem. Blame Apple all you want, but it was my source of legal music purchases without DRM (yes, DRM free, I’m listening to the songs I bought in the iTunes Store right now on my S4). I still didn’t get a “buy here” on my Android.

(Let me open a discussion here: I think the base for this problem is exactly the problem with the several Android distributions going around. I mean, sure, the number of Android devices surpasses the number of iOS devices, but I don’t think any vendor surpasses the number of devices of Apple[9]. So instead of going as “here, big record company, the Android vendors would like to license our catalog to sell on your devices”, each one is going there with their own numbers — and obviously, they don’t want to share this with anyone else, they want the ones who sell music in some particular country without having to share the chance of making digital sales money on music with other vendors. So it seems the Android ecosystem is more fragmented than what we talk about.)

Contact Mess

On iOS, I had a single contact/make call application; on Android, I have two (the “Phone” app and the “People” app). Not only that, but the list seems inconsistent in both. For example, some long time ago, I synced my iPhone and it stupidly added the Apple HQ phone number to my Gmail address book[10]. Well, I decided to remove it. Thing is, you can’t do that in the Phone app. All you can do in the Phone app are calls. So I went to the People app. Apple phone was not there.

I mean, seriously? How the hell the application that should be managing all my contacts had a contact that I could see as available to call?

I had to go to Gmail to finally remove the number.

Two Email Clients

On my iPad, I had two email accounts: My personal account and my work account. All emails were shown in a “Combined Inbox” folder which would display everything in order. Not only that, but the controls would change from “Move to Folder” to “Archive” when using my Gmail account.

On the S4, I have two email clients: One for Gmail, which tries to mimic the web interface and another client for my work email that looks almost different. And I really can’t understand that: The Gmail client have a toolbar on the top of the screen; the other email client have a toolbar on the bottom. So every time, after reading some email, I have to look for the toolbar to move the mail or archive it.

Not only that, but some behaviours are weird: on iOS, moving or achieving an email, the client will move to the next unread email, no matter if it is more recent or older; on Android, it will always move to the older email, even if it is already read[11].

(Someone mentioned that it was easier to just ignore work emails when in vacation, but I could easily do the same — if I wanted — by simply going to the settings and disabling the account. Not other configuration is lost.)

Also, none of the emails allow me to zoom out the original size. It usually it isn’t a problem, but your infrastructure guys have a template for tell the company when some server will go into maintenance or the no-breaks need to be replaced that never fits any screen, directly (not even my desktop — at least, not properly) and I could zoom out to read it. Now I can’t (but still, this is minor, but it’s annoying to scroll things horizontally back and forth).

No Landscape Desktop

I mentioned the split between desktop and apps list. What I didn’t mention was the fact that are a bunch of different launchers available, so I’m not stuck with this “5 workspaces, no way to add or remove workspaces” launcher.

On the other hand, the default desktop[12] does not support landscape view. Ok, this may sound silly, but it’s weird that you’re in some landscape app (say, a game, which doesn’t have a portrait mode), close it, see your desktop getting sideways, opening your Twitter client, which would just move to the landscape mode flawlessly.

Again, minor, but still…

The Configuration

I’m just putting this here to show some differences — this difference is annoying to me right now but I guess I’ll get used to it soon.

So, on iOS, you usually have a well defined settings window: I’d go to the global settings, look for something and then change it. With iOS7, a lot more applications moved their configurations — which were buried somewhere in their interface — to the general setup. So it was a “single stop configuration” place for almost everything. There was even a change to include more icons, to improve the way you could find the proper configuration place.

On Android… not so much. Sure, the move to a single configuration spot on iOS is recent, but the current configuration tools on most Android apps is poor, to put it blandly. There is very little idea of “drilling down” to proper places, some options are scattered around groups, some drill-down groups don’t even have arrows to indicate they are drill-downs…

And before everyone rages: Let me repeat that my current annoyance with it is just a matter of getting use to it. And some tweaking.

Conclusion

Ok, so you jumped over most of the text and now just want to know if you should change your iOS for an Android. The answer is clear:

I don’t know.

You see, there are some things — the app switching, for example — that Android puts iOS to shame; some others — like notifications — would be better if Android never had it in the first place, as shameful as they are. Mostly, things are the same in the base system and what would decide any change are the apps — and, honestly, Pocket Trains is the same on both, Plume is no Tweetbot[13], Jiffy is gorgeous compared to most time tracking apps on iOS…

“SHOULD. I. CHANGE? ANSWER. THE. FUCKING. QUESTION!”

Ok, you want an answer: Ask me again later. After this week I’ll start to really mess with this thing, installing new desktop managers and themes and all the matter of crap I can find. So far, as you could see, I still have mixed feelings about it but I’m not saying it’s better or worse till I finally get used to it and forget most of the iOS-risms I got over the years.

Footnotes

[1] Talk about “holding it wrong”. ;)

[2] And due the way the screen was locking when detecting something close, I couldn’t stop the call quick enough (but I was lying down on the couch, so I was not in the most probably position to not put something in front of the screen).

[3] … unless you purchased the song directly from the iTunes Store, in which it will “distribute” the song to all your devices automagically.

[4] If you have it enabled, the songs will sync through wireless, if you have your iTunes Library open and your iOS device on in the same net.

[5] Again, unless you purchased directly from iTunes Store. In that case, yes, it will download directly to your device.

[6] From what I read somewhere else, Windows requires special drivers (which it will automatically install) and then you can use the Windows Explorer to transfer things; Linux requires a special library and that applications have support for it (and I’m guessing Rhythmbox have it). In the end, it feels the same.

[7] Splitting apps and desktop also allows changing the desktop manager to something else, but since we are talking about the default ones in the phone, I’ll consider that the default behaviour. Maybe there is a desktop manager that displays everything in a single place, just like iOS, but, again, this is not the default behaviour.

[8] It wasn’t immediate on my iPhone 4S or iPad 3. Maybe it was a “hardware not powerful enough” to handle the switching on iOS 7 and things are smoother on newer devices, but that’s something I may find out only far away in the future.

[9] Yeah yeah yeah, because Apple is the only one selling iOS, while there are tenths of vendors selling Android, I get it. Also get it that no vendor, individually, have more devices than Apple. Are we good on that?

[10] The number is there to show you, new user, how the Contacts/Call works. I just left it there and never bothered to remove the entry. Sorry, no, I don’t know anyone in the Apple HQs.

[11] The whole sad fact about Android is that I could, in theory, just download the source and fix that myself — after all, it’s not a big, complicated thing just check if the next or previous email is unread. But I can’t fix the Gmail client ’cause the source of it is not available anymore (’cause it’s part of the Google package that it’s not part of the AOSP). Sure, on iOS, no matter how good programmer I wish I would, I could never change that myself, even if the change was simpler than that. But when you start looking at both platforms coldly as this… yes, it’s a bad point for Android ’cause the iOS behaviour feels “righter”.

[12] I believe this is the default desktop manager, as it is part of the “Google Edition” of Android. Someone correct me if I’m wrong.

[13] Tweetbot is better, if that wasn’t clear. But I bought a premium Plume, as it was the best Twitter client for Android I found in a 5 minute search.

Uma Lição de VIM #2.3: Mudando de Modos – Modo de Inserção

(Esta é a parte em que você vai finalmente começar a editar o texto.)

Agora que você sabe que existe mais de um modo de edição e como o cursor funciona, podemos finalmente começar a ver como se passa de um modo para o outro — e, no processo, entender como editar um texto no VIM.

Primeiro, é preciso saber que o Modo Normal é o ponto central para todos os outros modos — o jeito mais fácil de passar de um modo para o outro é através do Modo Normal. E, de qualquer modo[1], para ir para o modo normal basta pressionar Esc.

Lembre-se: Esc irá sempre voltar para o modo normal para que você possa passar para os demais modos. Esc em modo normal irá continuar em modo normal.

Para passar do modo normal para o modo de inserção, você deve usar o seguinte:

i
Vai para o modo de inserção na posição do cursor (lembre-se do capítulo anterior: o cursor está no canto inferior esquerdo do cursor, logo qualquer coisa que você digitar vai aparecer antes da letra onde o cursor se encontrava antes de pressionar i).
I
Move o cursor para o primeiro caracter que não seja espaço ou tabulação na linha e entra em modo de inserção (semelhante à _i).
a
Move o cursor uma posição pra frente e entra em modo de inserção (ou o mesmo que li).
A
Move o cursor para o fim da linha e entra em modo de inserção (Seria quase um $i, só que $ pára no último não branco da linha — se considerarmos o caracter de quebra de linha um caracter “branco” — e i ficará antes desse não-branco).
o
Insere uma linha em branco depois do cursor e entra em modo de inserção.
O
Insere uma linha em branco acima do cursor e entra em modo de inserção.
R
Entra em modo de inserção, mas substitui as letras atuais ao invés de adicionar mais. Sim, é um modo de substituição (“replace”), mas ainda é considerado um modo de inserção.

Ok, pequena pausa para acertar os ponteiros agora: Uma coisa que eu comentei anteriormente foi que, no modo normal é possível definir o número de vezes que um comando será repetido. Por mais estranho que isso possa parecer, todos os comandos acima também aceitam um número de repetições. Por exemplo, 20A-[Esc] irá repetir o comando A- 20 vezes, efetivamente colocando 20 “-” na linha atual; 20Oolá[Esc] irá adicionar 20 linhas de olá no seu texto, a partir da posição do cursor.

Sua vida acabou de mudar.

Sua vida acabou de mudar.

Quem estava prestando atenção deve ter notado que eu pulei r como opção de modo de inserção e todos os demais comandos tem uma versão em minúsculas e maiúsculas. O motivo é que r tem um funcionamento, digamos, peculiar.

r, por si só, espera por uma tecla para substituir o caracter sob o cursor. Seria o equivalente a fazer R, pressionar uma tecla e, na sequência, pressionar [Esc] para sair do modo de inserção. O estranho, no entando, é quando é definido um número de vezes que r deve ser executado: Neste caso, o caracter sob o cursor é alterado para o caracter indicado, o cursor é movido para o próximo caracter e o processo se repete até o número de vezes indicado (ou seja alcançado o final da linha). 20r-[Esc] irá, efetivametne, substituir os 20 próximos caracteres por - — que não seria o mesmo que digitar, manualmente, r- 20 vezes.

Existem ainda outros dois comandos para entrar em modo de inserção: c e s. Existem algumas diferenças configuráveis entre ambos, mas o funcionamento é o mesmo: Removem os caracteres indicados pela movimentação e passam para o modo de inserção.

Como assim "movimentação"?!?

Como assim “movimentação”?!?

De novo, pausa para acertar os ponteiros: no capítulo #2.2, eu falei sobre comandos do modo normal que movimentam o cursor. Aqui, c e s não vão entrar em modo de inserção até que você adicione uma sequência de movimentação. Assim: s$ irá remover tudo da posição de cursor até o final da linha e entrará em modo de inserção, s% irá remover tudo da posição do cursor até o próximo elemento que “fecha” o elemento atual (aspas, parênteses, colchetes, etc) e entrará em modo de inserção, c2f. irá remover tudo da posição do cursor até o segundo ponto na linha e entrará em modo de inserção e assim por diante.

A ficha finalmente caiu.

A ficha finalmente caiu.

Embora c e s funcionam de forma semelhante, C e S não: C irá apagar tudo da posição do cursor até o final da linha enquanto que S irá remover todo o conteúdo da linha, não importando a posição do cursor. Logicamente, depois de fazerem isso, ambos entram em modo de inserção. Com um número de repetições, no entanto, ambos funcionam da mesma forma — tanto 20S quanto 20C irão remover a linha atual e mais 19 e entrar em modo de edição.

E, só pra lembrar: Pressionar [Esc] irá voltar para o modo normal.

[1] … exceto o modo Ex, mas como eu falei antes, não é um modo muito útil hoje em dia e, portanto, eu estou ignorando ele daqui pra frente.

Nota: Todas as imagens são copyright (C) seus respectivos donos.

Uma Lição de VIM #2.2: Entendendo o Cursor

(Esta é a parte em que você vai lembrar quando o texto não parar exatamente onde você pensava que ele iria parar.)

Antes de passar para comandos do modo normal que realmente alteram o texto, é preciso entender como o VIM entende o cursor, porque o funcionamento pode parecer um pouco diferente dos demais editores.

Para todos os efeitos, considere que o cursor está sempre na parte inferior esquerda do bloco do cursor.

Screenshot from 2013-10-22 08:50:35

Mais uma foto de você, nesse exato momento.

Mais uma foto de você, nesse exato momento.

Porque é importante ter isso em mente?

Porque a maior parte dos editores trata as coisas um pouco diferentes: Por exemplo, se houver uma linha inteira no clipboard, o VIM irá inserir (com o comando padrão de colar, que vamos ver mais adiante) a nova linha abaixo na linha atual — a maior parte dos outros editores cola a nova linha no lugar da linha atual e move a antiga linha uma posição abaixo.

Apenas tenha isso em mente agora que vamos começar a mudar de modo e alguns comandos consideram a posição do cursor desta forma e tem uma “contraparte” para ações antes do cursor — e por isso o próximo capítulo parece ter comandos repetidos.

Nota: Todas as imagens são copyright (C) seus respectivos donos.

Uma Lição de VIM #2.1: O Modo Normal

(Esta é a parte em que você ainda vai precisar de um arquivo pronto para ver as coisas funcionando.)

Como vimos antes, o modo normal é o modo em que o VIM inicia e que, como padrão, oculta qualquer coisa que você esteja digitando.

A apresentação mais clássica do modo normal são todas as demais explicações que você vai achar por aí que dizem que é preciso usar h, j, k e l para mover o cursor na tela. Tirando o fato que isso é uma balela sem tamanho e que o VIM suporta movimentação com as teclas direcionais e que você não precisa ficar pensando em mnemônicos como “j tem uma perna pra baixo, k tem uma perna pra cima” e outras absurdices, estes são comandos normais válidos: ao pressionar k, o cursor irá mover para a linha de cima, j moverá o cursor para a linha de baixo e assim por diante.

Nem todos os comandos são acionados com apenas uma tecla. Alguns iniciam um comando, mas ficam esperando mais informações para saber o que fazer ou onde fazer. Assim, temos comandos que são de movimentação e outros de ação.

Comandos de Movimentação

Comandos de movimentação são comandos que movem o cursor no texto. Como já vimos, h, j, k e l são comandos de movimentação. Além destes temos[1]:

f[letra]
Posiciona o cursor na próxima [letra] na linha. Se [letra] não existir, não move o cursor. Por exemplo, fa irá mover o cursor para o próximo “a” na linha.
F[letra]
O mesmo que f[letra], mas voltando na linha ao invés de ir pra frente.
t[letra]
Posiciona o cursor uma posição antes de [letra] na linha. Praticamente o mesmo que f[letra], mas uma posição antes.
T[letra]
Assim como F““ faz o mesmo que t““, mas voltando na linha.
0
Move o cursor para a coluna 0.
_
Move o cursor para a primeira letra que não seja espaço ou tabulação na linha.
$
Move o cursor para o final da linha.
%
Move o cursor para o outro elemento do par (por exemplo, % quando cursor estiver sobre um “(” irá mover o cursor para o “)” correspondente).

Até aqui eu acredito que você esteja pensando “nada que mude minha vida”. Bom, então aqui vem a primeira grande dica:

Se você digitar um número antes de fazer um comando, VIM irá repetir o comando quantas vezes o número indicar.

Mind-Blown

Ok, talvez não tenha sido a revelação do século, mas isso quer dizer que se você digitar 3f., VIM irá mover o cursor para o terceiro ponto na linha atual. E isso também pode não parecer importante, mas daqui pra frente isso vai fazer sentido.

[1] De forma alguma, esta é uma lista completa de todos os comandos de movimentação existentes, apenas os mais interessantes.

Nota: Todas as imagens são copyright (C) seus respectivos donos.

Uma Lição de VIM #1: Modos

(Esta é a parte onde eu explico porque você não conseguia sair do VIM na primeira vez que tentou usá-lo.)

Uma das primeiras coisas que é preciso entender sobre VIM é que ele é um editor modal. Enquanto outros editores abrem os arquivos diretamente em “modo de edição” (para começar a usar a nomenclatura que o VIM adota) — permitindo que você possa, imediatamente, editar o texto –, o VIM entra em “modo normal” (que não é o modo “normal” dos outros editores).

Mas o que isso quer dizer?

Mas o que isso quer dizer?

O VIM tem 5 modos:

Modo Normal
O modo Normal é o modo que o VIM entra normalmente. Neste modo, as teclas são traduzidas para comandos de alteração do texto. Na configuração padrão, os comandos sequer são apresentados.
Modo de Inserção
O modo de Inserção é o modo que a maior parte dos outros editores funciona. Qualquer coisa editada irá aparecer/alterar o texto atual.
Modo Visual
O modo Visual é semelhante ao selecionar texto com “shift” em outros editores[1].
Modo de Comando
O modo de comando serve para ações que começam com “:” (comandos Ex), “/” e “?” (procura) e “|” (filtro).
Modo Ex
Semelhante ao modo de comando depois de usar “:”, mas permanece no modo Ex.

Praticamente todos os modos são utilizados, de alguma forma ou de outra, com exceção do modo Ex.

A pergunta que você deve estar se fazendo agora é: E daí?

Você, agora.

Você, agora.

Existem algumas coisas interessantes que podem ser feitas com VIM que não podem ser facilmente replicadas em outros editores justamente pela existência destes modos de operação. Sim, inicialmente, o fato de não poder entrar no editor e sair adicionando código pode parecer frustante, mas a medida que você for aprendendo como utilizar cada modo, você verá que eles fazem sentido e que não é nenhum mistério ficar pulando de modo para modo.

A verdadeira lição começa agora.

[1] Apenas a título de informação, praticamente tudo que pode ser feito em modo visual pode ser feito em modo normal.

Nota: Todas as imagens são copyright (C) seus respectivos donos.

Uma Lição de VIM #0: Introdução

(Esta é a parte em que eu explico porque eu escrevi tudo isso e cujo conteúdo não vai afetar em nada seu conhecimento de VIM ou a sua vida.)

Em 2000 tive meu primeiro contato com programação em Linux e, como era de se esperar, o primeiro editor sugerido foi “VIM”.

Foi WTF à primeira vista (e o clássico “Como é que eu fecho isso?”).

Ok, não é a mesma versão que eu usei a 8 anos atrás, mas a sensação é a mesma.

Ok, não é a mesma versão que eu usei a 8 anos atrás, mas a sensação é a mesma.

Depois de usar outros editores por algum tempo (cough FTE cough), finalmente decidi dar o braço a torcer e passei a usar VIM, continuo usando até hoje. Não que eu tenha usado somente VIM desde então, utilizei outros editores (TextMate, Sublime Text 2, Gedit) mas eu sempre sinto falta de alguma coisa nos outros editores que acabei de acostumando no VIM. E, ainda, VIM ainda é o editor que eu mais ouço “Cara, como é que tu fez isso?”.

Não que VIM seja um editor completo e perfeito. Existem coisas novas surgindo a todo momento que ninguém sequer imaginava quando VIM foi criado; existem coisas que pelas próprias limitações do editor, o VIM não faz. Para algumas dessas, existem plugins — e eu vou falar de alguns interessantes mais pra frente — e, infelizmente, para outras, não há nada que possa ser feito, a não ser saber que estas “faltas” existem e estar preparados para elas.

E vejamos quantos “Cara, como é que tu fez isso?” vão aparecer até o final dessa série.