Deixe o Emacs mover o cursor para fora da tela

23

Esta pergunta foi originalmente feita em /programming/15895313/let-emacs-move-the-cursor-off-screen , mas todas as respostas que obtive mais ou menos disseram "não pode ser feito" , que com o emacs eu simplesmente não aceito.

É possível deixar o Emacs mover o cursor para fora da tela, como a maioria dos editores de texto da GUI funciona? Essa é uma das maiores coisas que me incomoda quando uso o Emacs sobre qualquer editor de GUI. Quando desloco para baixo, o cursor é "empurrado para frente" pela parte superior do buffer.

Anteriormente, eu pensava que isso era completamente impossível, porque isso está ligado à arquitetura do Emacs, mas vi vários cursores, o que faz exatamente isso para os cursores secundários (supondo que você impeça as funções de rolagem de atuar no secundário) cursores). Talvez seja possível usar cursores múltiplos para ter o cursor principal em algum buffer oculto, e o cursor efetivo é o que eu realmente edito? Ou talvez algum outro truque inteligente? Ou talvez meu Google tenha falhado comigo e isso já é possível sem mágica?

Eu uso o emacs do terminal, por isso deve funcionar lá.

asmeurer
fonte
Lembre-se de que tudo o que o pacote com múltiplos cursores faz é adicionar cursores falsos que não estão sujeitos às restrições do real. Espero que haja uma resposta com base nas sugestões da sua pergunta anterior.
Wasamasa
Suponho que esse problema seja específico do uso de barras de rolagem, certo?
Nispio 24/09/2014
1
Então, quais comandos de rolagem você está usando e esperaria não trazer o cursor com você? Na minha experiência, o cursor segue você em todos os editores ao usar PgUp / PgDn ou as teclas de seta.
Nispio
4
@nispio talvez rolando com a roda do mouse?
Ffevotte # 24/14
2
Page up e Page down (Cv e Mv) não movem o cursor no emacs, a menos que o cursor saia da tela. A rolagem é diferente de mover (o cursor).
asmeurer 24/09

Respostas:

11

Há um novo pacote disponível no GNU ELPA chamado scroll-restoreque tenta solucionar esse problema. Existem vários comportamentos diferentes para escolher, mas a maneira como eu o configurei (veja abaixo) faz com que o cursor fique invisível durante os comandos de rolagem e depois volte ao seu local original quando eu começar a digitar novamente.

Até agora, encontrei alguns bugs, mas o pacote parece funcionar como anunciado na maior parte. Você pode testá-lo instalando-o com

M-x package-install RET scroll-restore RET

Após a instalação do pacote, você pode ativar o modo secundário com

M-x scroll-restore-mode

Pessoalmente, estou vinculando-o à Scroll Lockchave porque parece incrivelmente apropriado! Isto é o que estou adicionando ao meu arquivo init:

(require 'scroll-restore)
(scroll-restore-mode 1)
;; Allow scroll-restore to modify the cursor face
(setq scroll-restore-handle-cursor t)
;; Make the cursor invisible while POINT is off-screen
(setq scroll-restore-cursor-type nil)
;; Jump back to the original cursor position after scrolling
(setq scroll-restore-jump-back t)
;; Toggle scroll-restore-mode with the Scroll Lock key
(global-set-key (kbd "<Scroll_Lock>") 'scroll-restore-mode)
nispio
fonte
1
Se você vinculou uma chave, suponho que você deseja desativá-la às vezes. Esse modo é irritante para edições normais?
21414 Ver todas as
1
@ T.Verron Parece bem complicado no momento, e um dos modos de falha é "prender" o cursor em uma área e não deixá-lo sair. A única maneira que encontrei para liberar meu cursor novamente é desativar o modo. Depois que todos os erros forem resolvidos, eu não me importaria de usá-lo o tempo todo.
Nispio 17/10/2014
2
Como é que isso deveria funcionar? Parece que não consigo fazer nada.
asmeurer
5

O método que eu sempre uso é definir a marca para a qual quero voltar e, quando terminar de ler o buffer, mostro a marca usando C-u C-SPC. Mesmo quando eu esqueço de marcar a marca antes de me afastar, percebo que esse tipo de marca geralmente me deixa bem perto de onde vim. Isso se deve em parte ao fato de que alguns comandos (como isearchpor exemplo) definem a marca sem você perceber. Assim, ao longo de sua edição, você inadvertidamente deixou uma pequena trilha de migalhas de pão.

A partir da documentação:

set-mark-command is an interactive compiled Lisp function in `simple.el'.

It is bound to C-@, C-SPC.

(set-mark-command ARG)

....

With prefix argument (e.g., C-u C-SPC), jump to the mark, and set the mark
from position popped off the local mark ring (this does not affect the global
mark ring).  Use C-x C-@ to jump to a mark popped off the global mark ring
(see `pop-global-mark').

Quase nunca me preocupo com a definição de marcadores ou registros, mas quase sempre consigo encontrar o caminho de volta de onde vim rapidamente usando um C-u C-SPCou outro pop-global-mark.

nispio
fonte
Francamente, acho que a principal razão pela qual as pessoas querem que o cursor possa sair da tela é porque estão acostumadas a editores que não têm um histórico adequado das posições do cursor. Você também pode fazer isso scroll-upe scroll-downdefinir automaticamente a marca, para C-u C-SPCgarantir que você volte de onde veio.
Radon Rosborough
0

O código a seguir é bom o suficiente para eu voltar depois da rolagem da roda do mouse:

(advice-add 'mwheel-scroll :before (lambda (arg) (if (not (eq last-command 'mwheel-scroll)) (setq point-before-mwheel-scroll (window-point)))))
(defun jump-back () (goto-char point-before-mwheel-scroll))
AhLeung
fonte