Modo VI
Introdução

O modo VI do Kate é um projeto que visa trazer edição modal semelhante à do Vim para o editor de texto Kate e, por extensão, para outros programas do KDE que compartilham o mesmo componente do editor. O projeto começou como um projeto do Google Summer of Code em 2008 – onde todas as funcionalidades básicas foram escritas. Continuei a manter e desenvolver este código, e o número de funcionalidades ausentes do Vim está diminuindo lentamente. A maioria dos usuários do Vim já estará produtiva no modo VI do Kate. Uma lista do que está faltando pode ser encontrada no final da página.
Esta página pretende ser uma visão geral atualizada deste trabalho.
Configurações → Configurar Kate… → Edição → Modo de Entrada do VI.
Também é possível alternar com a configuração "Modo de Entrada do VI" no menu "Editar". (A tecla de atalho padrão é Meta+Ctrl+V – onde Meta geralmente é a tecla Windows).
Objetivos
O objetivo do modo VI não é ser um substituto completo para o Vim e suportar todos os recursos do Vim. Seu objetivo é tornar o "jeito Vim" de edição de texto – e os hábitos aprendidos com o Vim – disponíveis para programas que usam o editor de texto Kate como editor interno. Esses programas incluem
- O editor de texto Kate
- KWrite – O editor de texto simples do KDE
- KDevelop – Um IDE avançado para muitas linguagens de programação
- Kile – Um editor LaTeX
O modo VI visa integrar-se perfeitamente aos programas e desviar-se do comportamento do Vim onde fizer sentido. Por exemplo, :w
abrirá uma caixa de diálogo para salvar no modo VI do Kate.
Incompatibilidades com o Vim
Existem apenas alguns recursos do modo VI do Kate que são incompatíveis com o Vim (sem contar os que faltam). Eles estão listados abaixo, juntamente com os respectivos motivos.
- Kate:
U
eCtrl+r
são refazer
Vim:Ctrl+r
é refazer normalmente,U
é usado para desfazer todas as alterações mais recentes em uma linha
O motivo paraU
atuar como refazer no modo VI do Kate é que o atalhoctrl+r
, por padrão, é assumido pela função de substituição do Kate (pesquisar e substituir). Por padrão, o modo VI não substitui os atalhos do Kate (isso pode ser configurado em Configurações → Configurar o Kate… → Edição → Modo de Entrada do Vi), portanto, uma ação de refazer precisa estar disponível como um pressionamento de tecla "normal" também. Além disso, o comportamento do comando U no Vim não mapeia bem para o sistema de desfazer interno do Kate, então seria não trivial suportá-lo de qualquer maneira. - Kate:
:print
mostra o diálogo "imprimir"
Vim::print
imprime as linhas do intervalo fornecido como seu avô ed. Comandos como :print estão disponíveis não apenas no modo VI, mas também para usuários que usam o Kate "normal" – portanto, optei por deixar o comando:print
abrir o diálogo de impressão – seguindo o princípio da menor surpresa em vez de imitar o comportamento do Vim. - Kate:
Y
puxa para o fim da linha.
Vim:Y
puxa a linha inteira, assim comoyy
. O comportamento do VI para o comandoY
é, na prática, um bug; para os comandoschange
edelete
,cc
/dd
executará sua ação na linha atual eC
/D
trabalhará da coluna do cursor até o fim da linha. No entanto, tantoyy
quantoY
puxam a linha atual. No Modo VI de Kate,Y
puxa para o fim da linha. Isso é descrito como "mais lógico" na documentação do Vim. - Kate:
:map
altera as linhas selecionadas do documento usando a expressão JavaScript fornecida.
Vim::map
adiciona o mapeamento fornecido aos modos Normal e Visual. O comando "map" já estava reservado por Kate; na versão 4.12+, você pode usar uma combinação de:nmap
e:vmap
para substituí-lo.
Comandos suportados
Comandos suportados nos modos normal/visual
Chave | Descrição |
---|---|
a | Entra no modo de inserção e adiciona |
A | Entra no modo de inserção e adiciona ao final da linha |
i | Entra no modo de inserção |
I | Insere antes do primeiro caractere não branco na linha |
v | Entra no modo visual |
V | Entre no modo de linha visual |
<c-v> | Entra no modo de bloco visual |
gv | Re-seleciona visual |
o | Abre nova linha abaixo |
O | Abre nova linha acima |
J | Mescla (junta) as linhas |
c | Altera |
C | Altera até o final da linha |
cc | Altera linha |
s | Substitui caractere |
S | Substitui linha |
dd | Exclui linha |
d | Exclui |
D | Exclui até o fim da linha |
x | Exclui caractere |
X | Exclui caractere atrás |
gu | Torna minúscula |
guu | Torna a linha em minúsculas |
gU | Torna maiúscula |
gUU | Torna a linha em maiúsculas |
y | Copiar |
yy | Copiar linha |
Y | Copiar até o final da linha |
p | Colar |
P | Colar antes |
r. | Substituir caractere |
R | Entra no modo de substituição |
: | Alterna para a linha de comando |
/ | Pesquisar |
u | Desfazer |
<c-r> | Refazer |
U | Refazer |
m. | Definir marca |
>> | Recuar linha |
<< | Remover recuo da linha |
> | Recuar linhas |
< | Remover recuo de linhas |
<c-f> | Rolar página abaixo |
<pagedown> | Rolar página abaixo |
<c-b> | Rolar página acima |
<pageup> | Rolar página acima |
<c-u> | Rolar meia página acima |
<c-d> | Rolar meia página abaixo |
zz | Centralizar visualização no cursor |
ga | Imprimir cógido do caractere |
. | Repetir última mudança |
== | Alinhar linha |
= | Alinhar linhas |
~ | Alterar maiúsculas/minúsculas |
<c-a> | Adicionar ao número |
<c-x> | Subtrair do número |
<c-o> | Ir para salto anterior |
<c-i> | Ir para próximo salto |
<c-w>h | Alternar para visualização esquerda |
<c-w><c-h> | Alternar para visualização esquerda |
<c-w><left> | Alternar para visualização esquerda |
<c-w>j | Alternar para visualização inferior |
<c-w><c-j> | Alternar para visualização inferior |
<c-w><down> | Alternar para visualização inferior |
<c-w>k | Alternar para visualização superior |
<c-w><c-k> | Alternar para visualização superior |
<c-w><up> | Alternar para visualização superior |
<c-w>l | Alternar para visualização direita |
<c-w><c-l> | Alternar para visualização direita |
<c-w><right> | Alternar para visualização direita |
<c-w>w | Alternar para próxima visualização |
<c-w><c-w> | Alternar para próxima visualização |
<c-w>s | Dividir horizontalmente |
<c-w>S | Dividir horizontalmente |
<c-w><c-s> | Dividir horizontalmente |
<c-w>v | Dividir verticalmente |
<c-w><c-v> | Dividir verticalmente |
gt | Alternar para a próxima aba |
gT | Alternar para a aba anterior |
gqq | Formatar linha |
gq | Formatar linhas |
q. / q | Inicia/termina a gravação da macro usando o registro de macro nomeado. |
Movimentos suportados
Chave | Descrição |
---|---|
h | Esquerda |
<left> | Esquerda |
<backspace> | Esquerda |
j | Abaixo |
<down> | Abaixo |
<enter> | Abaixo para primeira não em branco |
k | Acima |
<up> | Acima |
– | Acima para primeira não em branco |
l | Direita |
<right> | Direita |
<space> | Direita |
$ | Para o fim da linha |
<end> | Para o fim da linha |
Para a coluna 0 | |
<home> | Para a coluna 0 |
^ | Para o primeiro caractere da linha |
f. | Procurar caractere |
F. | Procurar caractere para trás |
t. | Para caractere |
T. | Para caractere atrás |
; | Repetir último comando t. ou f. |
, | Repetir último comando t. ou f. |
n | Procurar próximo |
N | Procurar anterior |
gg | Para primeira linha |
G | Para última linha |
w | Palavra para frente |
W | PALAVRA para frente |
b | Palavra para trás |
B | PALAVRA para trás |
e | Para fim da palavra |
E | Para fim da PALAVRA |
ge | Para fim da palavra anterior |
gE | Para fim da PALAVRA anterior |
% | Para item correspondente |
`[a-zA-Z><] | Para marca |
'[a-zA-Z><] | Para linha da marca |
[[ | Para início do bloco de colchetes anterior |
]] | Para início do próximo bloco de colchetes |
[] | Para fim do bloco de colchetes anterior |
][ | Para fim do próximo bloco de colchetes |
* | Para a próxima ocorrência da palavra sob o cursor |
# | Para a ocorrência anterior da palavra sob o cursor |
H | Para a primeira linha da janela |
M | Para a linha do meio da janela |
L | Para a última linha da janela |
gj | Para a próxima linha visual |
gk | Para a linha visual anterior |
Objetos de texto suportados
Chave | Descrição |
---|---|
iw | Palavra interna |
aw | Uma palavra |
iW | PALAVRA interna |
aW | Uma PALAVRA |
i" | Aspas duplas internas |
a" | Aspas duplas |
i’ | Aspas simples internas |
a’ | Aspas simples |
i` | Acento grave interno |
a` | Acento grave |
ib | Parênteses interno |
i) | Parênteses interno |
i( | Parênteses interno |
ab | Parênteses |
a) | Parênteses |
a( | Parênteses |
iB | Chave interna |
o} | Chave interna |
i{ | Chave interna |
aB | Chave |
a} | Chave |
a{ | Chave |
i< | Sinal de diferente interno |
i> | Sinal de diferente interno |
a< | Sinal de diferente |
a> | Sinal de diferente |
i[ | Colchete interno |
I] | Colchete interno |
a[ | Colchete |
a] | Colchete |
i, | Vírgula interna |
a, | Vírgula |
Comandos de modo de inserção suportados
Chave | Descrição |
---|---|
<c-d> | Remover recuo |
<c-t> | Recuar |
<c-e> | Inserir abaixo |
<c-y> | Inserir acima |
<c-w> | Excluir palavra |
<c-r>. | Inserir conteúdo do registro |
<c-o> | Alternar para o modo normal para um comando |
<c-a> | Aumentar o número sob o cursor |
<c-x> | Diminuir o número sob o cursor |
O Objeto de Texto Vírgula
Isso é algo que eu sentia falta no Vim. O objeto de texto vírgula facilita a modificação de listas de parâmetros em linguagens do tipo C e outras listas separadas por vírgulas. É basicamente o espaço entre duas vírgulas ou entre uma vírgula e um colchete. Na linha mostrada na ilustração à direita, os três intervalos que este objeto de texto pode abranger estão destacados em vermelho.

Intervalos de objetos de texto com vírgula. Se o cursor estiver sobre, digamos, "arg2", pressionar c i , ("alterar vírgula interna") excluirá "arg2 duplo" e colocará o cursor entre as duas vírgulas no modo de inserção. Uma maneira muito conveniente de alterar os parâmetros de uma função.
Barra de comando emulado do vim
O Kate 4.11 introduziu uma opção de configuração oculta que faz com que /
, ?
e :
abram um novo comando de busca no lugar da barra de linha de comando/Localizar/Substituir do Kate. A barra visa replicar muitos dos recursos da barra de comando do Vim e também corrigir muitos dos problemas com a interação do modo Vim do Kate com a barra de Localizar/Substituir do Kate (substituição interativa não funciona; busca incremental não posiciona o cursor corretamente; não pode ser usada em mapeamentos/macros; etc.).
Os seguintes atalhos são fornecidos pela barra de comandos emulados; assim como no Vim, eles podem ser remapeados com cmap, cnoremap, etc.:
Chave | Descrição |
---|---|
<c-r>. | insere conteúdo do registro. |
<c-r><c-w> | Insere palavra sob o cursor (documento). |
<c-p> | Invoca conclusão específica do contexto (veja abaixo) move para trás/para cima na lista de conclusão. |
<c-p> | Avança/desce na lista de conclusão. |
<c-space> | Extensão do Vim no Kate. Completa automaticamente palavras de um documento. |
<c-d> | Extensão do Vim no Kate. Em uma expressão 'sed' de substituição (ou seja, s/procura/substitui/[g][c][i]), limpa o termo "procura" e coloca o cursor lá. |
<c-f> | Extensão do Vim no Kate. Em uma expressão 'sed' de substituição (ou seja, s/procura/substitui/[g][c][i]), limpa o termo “substitui” e coloca o cursor lá. |
<c-g>. | Extensão do Vim no Kate. Assim como com ., insere o conteúdo do registrador nomeado, mas escapa-o de tal forma que, quando usado com uma pesquisa, busca o conteúdo literal do registrador; não o conteúdo do registrador interpretado como uma regex. |
A "conclusão específica do contexto" é decidida da seguinte forma:
- Em uma barra de pesquisa (
/
ou?
), preenchimento automático a partir do histórico de pesquisa (que inclui pesquisas iniciadas por meio de*
; e#
; pesquisas feitas em expressões 'sed' de substituição; etc.) - Em uma barra de comando vazia (
:
), completa automaticamente a partir do histórico de comandos (NB: o preenchimento automático de nomes de comandos é invocado automaticamente quando você começa a digitar). - Em uma barra de comando contendo uma expressão 'sed' de substituição (por exemplo,
:s/procura/substitui/gc
), se o cursor estiver posicionado sobre "procura", completa automaticamente a partir do histórico de "pesquisa"; se estiver sobre "substitui", completa automaticamente a partir do histórico de termos de "substituição".
Ao executar uma expressão 'sed' de substituição na barra de comando com o sinalizador "c" (por exemplo, s/procura/substitui/gc
), uma expressão interativa de busca/substituição no estilo Vim será iniciada.
Alguns exemplos de uso da barra de comandos emulada, com animações GIF, são apresentados neste blog. Na versão 4.11, a barra de comandos emulados pode ser habilitada definindo a opção de configuração oculta "Vi Input Mode Emulate Command Bar" como ``true` em seu katerc/kwriterc/kdeveloprc.
Funcionalidades que faltam
Como mencionado anteriormente, o objetivo do Modo VI do Kate não é oferecer suporte a 100% dos recursos do Vim, no entanto, existem alguns recursos que fazem muita falta.
- Modo de bloco visual – especialmente a capacidade de acrescentar/adicionar texto à seleção de bloco visual.
- Ter comandos 'ex' disponíveis em outros programas além do aplicativo Kate.
- O código de pesquisa precisa ser melhorado e os comandos * e # devem ser apenas pesquisas regulares.
Se você sentir falta de outros recursos ou quiser ajudar com os mencionados acima, sinta-se à vontade para entrar em contato comigo ou enviar patches! :-)
Registro de alterações
- 16/05/2010:
Versão inicial. Coletei informações de entradas de blog e arquivos README para criar uma única fonte de informações atualizadas. - 17/05/2010:
Ctrl+A
eCtrl+X
adicionados (incrementa/decrementa o número sob o cursor). - 30/08/2010:
Página movida para kate-editor.org. - 10/09/2010:
Corrigimos o texto no objeto de texto vírgula e fizemos algumas correções de formatação - 03/02/2021:
Tabelas de atalhos de teclado convertidas para markdown para hugo.