O comportamento normal do Emacs quando o modo de marca transitória está ativo é que, quando você faz uma seleção de turno, se o próximo comando for um movimento sem turno, a marca será desativada. Por exemplo, após os comandos M-l
(para marcar a linha atual com a função abaixo) e C-f
, a marca é desativada. Como emular esse comportamento do elisp depois (set-mark-command nil)
?
Por exemplo:
(defun my-mark-current-line ()
(interactive)
(beginning-of-line)
(set-mark-command nil)
(end-of-line)
(forward-char))
(global-set-key (kbd "M-l") 'my-mark-current-line)
Agora Ml Cf e a região crescerão, mas, em vez disso, quero que o comportamento padrão, ou seja, a região desative quando Cf e cresça com CSf.
EDIT : deve usar uma função diferente para set-mark-command que permite isso? Não consegui encontrar nenhum.
C-S-f
é análogo aC-SPC
(ativar uma região) +C-f
(navegação). Provavelmente, você pode obter o que deseja vinculando-seC-f
a uma função de wrapper que primeiro desativa uma região, se ativa, e depois faz o queC-f
does (forward-char
); e vincularC-S-f
diretamente aforward-char
. Note que se você nunca usar emacs no modo terminal,C-f
eC-S-f
serão ambos se comportam comoC-f
como o terminal não pode distinguir entre os dois.C-f
aplicou também se aplicariam a todos os outros comandos de navegação usados.C-f
afterM-l
não estende a região porque não existe uma região ativa no final deM-l
(que é vinculadadowncase-word
por padrão).M-l
referido pelo OP não é a ligação (defaultdowncase-word
), mas a ligação do costumemy-mark-current-line
Respostas:
Como a conversão de turnos e a ativação temporária da marca são manipuladas pelo loop de comando, você precisará chamar as versões interativas das funções de movimento para obter o comportamento apropriado da seleção de turnos:
Atualizar:
Desde que escrevi a resposta acima, dediquei um tempo para aprender um pouco mais sobre como a seleção de turnos realmente funciona sob o capô. Ele define o valor do símbolo
transient-mark-mode
como uma célula de contras do formulário(only . OLDVAL)
, ondeOLDVAL
é o valor anterior à seleção de turno.A solução abaixo evita o uso de
call-interactively
, ativando a marca conforme necessário e definindo o valor apropriado detransient-mark-mode
. Basicamente, considero esta solução menos invasiva que a primeira.Como bônus, agora ele possui uma contagem de repetição opcional e estenderá a seleção atual em qualquer direção, se a marca já estiver ativa.
fonte