Estou experimentando maneiras de configurar o Emacs para permitir que eu digite menos, mas obtendo a mesma coisa, explorando o fato de que, na programação, você faz (tipo) mais ou menos a mesma coisa repetidamente. Eu preciso disso por razões médicas, mas também porque faz sentido em geral.
A interface do Emacs que eu imagino é basicamente misturar comandos com argumentos. Vou apenas mostrar um exemplo e você entenderá imediatamente.
OK, você não precisa ser tão perspicaz para ver que, em C, o loop for, "menos que algo, incremento por um", é muito comum. Então eu pensei em escrever algo assim:
(defun C-for-loop-new-int-less-inc (var start stop)
"Shortcut for putting a C for loop at point.
Note: There are some specifics to i."
(interactive "sVariable: \nnStarts at: \nnLess than: ")
(insert
(format "for (int %s = %d; %s < %d; %s++) {\n\n}"
var start var stop var) )
(previous-line)
(c-indent-line-or-region) )
E para reduzir a digitação:
(defalias 'fnili 'C-for-loop-new-int-less-inc)
Agora, M-x fnili RET i RET 0 RET 10 RET
deve levar você
for (int i = 0; i < 10; i++) {
}
com o cursor na segunda linha, com recuo.
Embora isso seja uma melhoria, como posso disparar o comando assim:
fnii0l10i
Dessa maneira, todos os ciclos RET
-wait-reorient desapareceriam, em vez disso você escreveria o comando inteiro uma vez, e ele ficaria visível o tempo todo.
Agora, agora eu poderia escrever uma função que pega uma string, e depois analisa, mas eu não farei isso se o Emacs já tiver suporte para essa interface que eu busco.
Editar
Então, "template facility" é a designação?
Eu não acho que é difícil fazer. Se você quiser isso para toda a linguagem C, e para todas as voltas e reviravoltas possíveis, então eu concordo. Mas, para identificar apenas alguns casos demorados (para, switch case, o guarda em arquivos de cabeçalho) e implementá-los, isso seria um recurso útil.
É claro que, se o trabalho foi feito, não estou fazendo do zero (como eu disse :), então vou verificar seus links com certeza.
Mas ... Acho que meu exemplo foi muito complicado, então ofuscou a questão real, que é sobre a interface: em vez de acertar RET
e obter uma linha em branco para cada argumento, colocando tudo em uma única linha de comando .
Um exemplo muito mais simples: em vez de M-x man RET irssi RET
, como posso fazer M-x man"irssi" RET
? Neste exemplo, não é realmente benéfico (talvez levemente), porque é apenas um único argumento, e não há nada complicado para isso (que você precisa manter em seu cérebro), e você raramente cometerá um erro que você tem que "backtrack" para corrigir. Mas, no comando de exemplo for loop na postagem original (fictícia, como nunca a vi, se existir) - nesse caso, você realmente se beneficiaria dela.