Continua a muoverti fino alla fine delle linee


9

L'impostazione predefinita dell'associazione dei tasti C-a/C-eè solo per una cosa, passa all'inizio / alla fine della riga, c'è qualche pacchetto che può far funzionare Emacs in questo modo:

  1. Se non sono alla fine di una riga, C-eandrà alla fine della riga, altrimenti andrà alla fine della riga successiva
  2. Se non sono all'inizio di una riga, C-aandrà all'inizio della riga, altrimenti andrà all'inizio della riga successiva.

Il punto è che puoi semplicemente continuare a colpire C-a/eper andare all'inizio / alla fine di ogni riga senza muovere il dito per raggiungere C-n/p.

E con un prefisso ( C-u) andranno all'inizio / fine della riga nella direzione opposta.


In un commento a una risposta sotto @kaushalmodi sottolinea che potrei aver interpretato male la tua domanda. Vuoi C-aandare "su" e C-eandare "giù"? In altre parole, il significato di "riga successiva" è lo stesso negli articoli 1 e 2?
Costantino,

@Constantine In realtà ho pensato al problema " C-asu e C-egiù" quando ho pubblicato questa domanda, ma poi ho pensato che se qualcuno avesse dato una defunsoluzione come te, qualcuno avrebbe saputo cosa fare se gli piaceva C-a"su" ..
CodyChan,

OK; Penso che valga ancora la pena riparare. Aggiornerò la risposta: è solo una modifica di una riga.
Costantino,

Risposte:


11

Non conosco un pacchetto che consentirebbe questo comportamento, ma ecco un modo per farlo.

Premere C-h k C-aper scoprire che C-aè legato a move-beginning-of-line; questa è la funzione che dobbiamo modificare --- o semplicemente usare per implementare la parte "spostamento all'inizio". Allo stesso modo, con C-h kposso trovare forward-line, che verrà utilizzato per spostarsi su / giù.

Per poter associare una funzione a un tasto dobbiamo renderlo un comando , quindi dobbiamo usare il interactivemodulo speciale (vedi Uso interattivo ). Per prendere l' C-uargomento prefisso abbiamo bisogno del "P"carattere di codice.

Combinando questo con bolp(controlla se all'inizio di una riga) e eolp(controlla se alla fine di una riga), possiamo scrivere:

(defun my-move-beginning-of-line (arg)
  (interactive "P")
  (when (bolp) (previous-line (if arg -1 1)))
  (move-beginning-of-line nil))

(defun my-move-end-of-line (arg)
  (interactive "P")
  (when (eolp) (forward-line (if arg -1 1)))
  (move-end-of-line nil))

Ora possiamo ricollegare C-ae C-echiamare questi:

(global-set-key [remap move-beginning-of-line] #'my-move-beginning-of-line)
(global-set-key [remap move-end-of-line] #'my-move-end-of-line)

In alternativa, si potrebbero aggiungere consigli a move-beginning-of-linee move-end-of-line.


Questa è una spiegazione davvero buona e una soluzione elegante. C'è un errore di battitura nella my-move-beginning-of-linefunzione .. Dovrebbe essere (previous-line (if arg -1 1))o (forward-line (if arg 1 -1))(1 e -1 commutati)?
Kaushal Modi,

@kaushalmodi: nella domanda entrambi gli articoli 1 e 2 dicono "riga successiva", che ho interpretato come "giù". Quindi, chiediamo all'autore della domanda! :-)
Costantino,

Ah, ho aggiunto il mio presupposto alla domanda del PO. Hai ragione, specifica di andare alla riga successiva quando si usa uno C-ao C-e.
Kaushal Modi,

@kaushalmodi: Si scopre che avevi ragione! Ho aggiornato la risposta per farmi C-a"alzare".
Costantino,

8

La biblioteca misc-cmds.elha da tempo questa funzionalità.

Questi sono i comandi pertinenti e le combinazioni di tasti suggerite (queste associazioni sono fatte in setup-keys.el).

(cond ((fboundp 'move-beginning-of-line)
       (substitute-key-definition 'move-beginning-of-line 'beginning-of-line+ global-map)
       (substitute-key-definition 'move-end-of-line 'end-of-line+ global-map))
      (t
       (substitute-key-definition 'beginning-of-line 'beginning-of-line+ global-map)
       (substitute-key-definition 'end-of-line 'end-of-line+ global-map)))
(when (boundp 'visual-line-mode-map)
  (define-key visual-line-mode-map [remap move-beginning-of-line] nil)
  (define-key visual-line-mode-map [remap move-end-of-line]       nil)
  (define-key visual-line-mode-map [home] 'beginning-of-line+)
  (define-key visual-line-mode-map [end]  'end-of-line+)
  (define-key visual-line-mode-map "\C-a" 'beginning-of-visual-line+)
  (define-key visual-line-mode-map "\C-e" 'end-of-visual-line+)))

Ecco cosa C-h f end-of-line+dice, ad esempio:

end-of-line+ is an interactive compiled Lisp function in
`misc-cmds.el'.

It is bound to C-e, end.

(end-of-line+ &optional N)

Move cursor to end of current line or end of next line if repeated.
This is similar to `end-of-line', but:
  If called interactively with no prefix arg:
     If the previous command was also `end-of-line+', then move to the
     end of the next line.  Else, move to the end of the current line.
  Otherwise, move to the end of the Nth next line (Nth previous line
     if N<0).  Command `end-of-line', by contrast, moves to the end of
     the (N-1)th next line.

È molto elegante.
sanityinc

1

Le seguenti due funzioni eseguono le azioni desiderate.

(defun move-beginning-of-line-or-previous (&optional pre)
  "Move to the start of the line. If we are already at the start
of the line, move to the start of the previous line or, if called 
with a prefix argument, the next line."
  (interactive "P")
  (let* ((pos (point)))
    (move-beginning-of-line nil)
    (if (= (point) pos)
        (if pre
            (next-line)
          (previous-line)))))

(defun move-end-of-line-or-next (&optional pre)
  "Move to the end of the line. If we are already at the end of
the line, move to the end of the next line or, if called with a 
prefix argument, the previous line."
  (interactive "P")
  (let* ((pos (point)))
    (move-end-of-line nil)
    (if (= (point) pos)
        (if pre
            (previous-line)
          (next-line)))))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.