2010-08-03 13 views
27

In Emacs, C-u C-SPC "salta al segno e imposta il segno dalla posizione spuntata dall'anello del segno locale". C'è un modo per andare nella direzione opposta all'anello del marchio? Supponi di aver digitato C-u C-SPC diverse volte e di voler tornare a un marchio che hai visto senza andare intorno al ring.Come spostarsi avanti e indietro nell'anello segnapunti di Emacs

+3

In questi casi, potrebbe essere utile salvare il proprio segno nel registro, esp. se è una linea ben nota o frequentemente visitata. Non sono sicuro di passare attraverso il marchio da solo. –

+1

Anche se questo non consente di tornare indietro, aiuta a percorrere l'intero anello più velocemente, che potrebbe già essere tutto ciò che serve in molti casi: Imposta la variabile 'set-mark-command-repeat-pop' su non-' nil', questo ti permetterà di premere solo 'C-SPC' dopo aver premuto' Cu C-SPC' una volta. Dal [manuale] (http://www.gnu.org/software/emacs/manual/html_node/emacs/Mark-Ring.html) – quazgar

+3

Helm come sempre ha qualcosa per questo: helm-all-mark-rings mostrerà tutti segnano e consentono di utilizzare il normale completamento del timone per sfogliarli. È possibile completare il contenuto o il lino! – sandos

risposta

2

Non fa esattamente quello che stai chiedendo, ma potrebbe valere la pena cercare un pacchetto chiamato marker-visit.el che ti permetta di navigare tra i segni nel buffer corrente in "buffer position order" . Da quel file:

;;; Commentary: 

;; This file provides a simple way to navigate among marks in a 
;; buffer. C-u C-SPC is similar, but takes you haphazardly around the 
;; buffer. Setting bookmarks is a lot of extra work if you just want 
;; to jump around your buffer quickly; plus, you have to come up with 
;; a name for every bookmark. 

;; All the marks you've left while editing a buffer serve as bread 
;; crumb trails of areas in the buffer you've edited. It is 
;; convenient to navigate back and forth among these marks in order. 
;; This file provides two methods to do just that, marker-visit-prev 
;; and marker-visit-next. These two functions will take you, from 
;; point, to the nearest mark in either direction. The function 
;; marker-visit-truncate-mark-ring will truncate the mark ring. 

;; The marks you can visit in a buffer consist of: "the mark" plus the 
;; contents of the mark-ring. 

mi legano [S-up] e [S-down] al marcatore-visitare-prev e marcatore-visita-next, rispettivamente.

Se davvero vuoi/devi navigare nell'ordine in cui il tuo segnaposto ha attualmente, allora potresti arrivare da qualche parte osservando le funzioni pop-to-mark-command e pop-mark e implementando le tue versioni per ruotare il segno squilla nella direzione opposta.

+1

Sono riuscito a trovare una versione cache di Google qui: http://webcache.googleusercontent.com/search?q=cache:YGXiRhltPR4J:www.bloomington.in.us/~brutt/marker-visit.el+marker-visit. el & cd = 1 & hl = it & ct = clnk – Damyan

+0

Ah, mi scuso - non ho capito che era difficile da trovare. Sospetto che metà degli elfi riuniti nella mia configurazione stiano raccogliendo una pensione settimanale. – Simon

+0

Con [Segnalibro +] (http://www.emacswiki.org/emacs/BookmarkPlus), i segnalibri possono essere semplici come contrassegni: non è necessaria alcuna denominazione, ecc. E puoi scorrere tra di essi. Vedi [segnalibri autonome] (http: //www.emacswiki.org/emacs/BookmarkPlus # AutonamedBookmarks) – Drew

-2

Hai provato browse-kill-ring? Download it from Emacswiki, mettere in load-path e quindi aggiungere questo ai vostri emacs-conf:

(when (require 'browse-kill-ring nil 'noerror) 
    (browse-kill-ring-default-keybindings)) 

Poi, quando si preme mio vi verrà mostrato il kill-ring, cercatela come testo normale ecc . Davvero utile There is also some more practical info on emacs-fu su come utilizzare browse-kill-ring

+3

Questa sarebbe una risposta utile a una domanda sul kill ring. – phils

+0

Chiede informazioni sul marchio, che è un elenco circolare di luoghi in cui il marchio è stato impostato. –

+0

... doh. Nota per se stessi: non rispondere mai alle domande mentre sei estremamente stanco. – monotux

1

il manuale dice questo:

La variabile mark-ring-max specifica il numero massimo di voci per mantenere sul ring segno. Se esistono molte voci e un altro viene premuto, viene cancellato il primo nell'elenco . Ripetendo `C-u C- 'scorre ciclicamente le posizioni attualmente sul ring.

Suggerisco di utilizzarlo per contenere la dimensione dell'anello di riferimento (a 3 o 4, il mio è attualmente 16). Quindi puoi spostarti molto più velocemente usando i prefissi.

anche:

Se si vuole tornare nello stesso posto più e più volte, l'anello di marchio potrebbe non essere sufficiente conveniente. Se è , è possibile registrare la posizione in un registro per il recupero successivo (* nota Salvataggio posizioni nei registri: RegPos.).

5

Ecco una funzione per farlo:

(defun unpop-to-mark-command() 
    "Unpop off mark ring into the buffer's actual mark. 
Does not set point. Does nothing if mark ring is empty." 
    (interactive) 
    (let ((num-times (if (equal last-command 'pop-to-mark-command) 2 
        (if (equal last-command 'unpop-to-mark-command) 1 
         (error "Previous command was not a (un)pop-to-mark-command"))))) 
    (dotimes (x num-times) 
     (when mark-ring 
     (setq mark-ring (cons (copy-marker (mark-marker)) mark-ring)) 
     (set-marker (mark-marker) (+ 0 (car (last mark-ring))) (current-buffer)) 
     (when (null (mark t)) (ding)) 
     (setq mark-ring (nbutlast mark-ring)) 
     (goto-char (mark t))) 
     (deactivate-mark)))) 
+0

Qualche idea su un legame sensato per metterlo in relazione con il meccanismo esistente di pop-to-mark? per esempio. Se si inizia con 'C-u C-SPC C-SPC C-SPC ...' e si esegue un over-shoot, sarebbe opportuno avere qualcosa di semplice da invertire la direzione. Forse qualche consiglio precedente per 'set-mark-command' per far sì che' C-u C-SPC' agisca da interruttore tra le due funzioni? – phils

+2

Ordinato: http://stackoverflow.com/questions/3393834/how-to-move-forward-and-backward-in-emacs-mark-ring/5117076#5117076 – phils

5

In seguito il mio commento a scottfrazer di very handy solution, ecco qualche consiglio che funziona in congiunzione con quella di rendere più facile per le direzioni intorno al ring segno a invertirà, senza la necessità di utilizzare una diversa associazione di chiavi per ogni direzione.

Io uso cua-selection-mode, quindi per me C-SPC è destinata a cua-set-mark, ma ho scritto questo come una macro in modo da consigliare a seconda di quale funzione è destinata a C-SPC, e verificato che funziona con il valore predefinito set-mark-command.

Per disattivare, è sufficiente fornire un argomento con prefisso negativo. per esempio. C--   C-SPC

Una delle cose belle di cua-set-mark è che dopo un primo Cu   C-SPC, è possibile continuare a pop segni di riferimento successivi con un solo C-SPC, e ho incluso che il comportamento qui: Dopo una prima C--   C-SPC si può continuare a non-popping con appena C-SPC. Per invertire nuovamente la direzione e chiamare pop-to-mark, fornire semplicemente un argomento positivo ancora una volta con C-u   C-SPC.

4

Esistono due anelli di indicatori: uno locale per il buffer corrente e uno globale tra tutti i buffer

Per impostazione predefinita, in Icicles (in Icicle modo minore globale):

  • C-- C-SPC consente di viaggio tra i marcatori locali
  • C-- C-x C-SPC consente di viaggio tra i marcatori globali

IOW, con un prefisso negativo arg, C-SPC e C-x C-SPC navigate. Senza di esso, fanno semplicemente ciò che normalmente fanno (set-mark-command e pop-global-mark, rispettivamente).

Navigazione funziona come segue:

  • posizioni sono disponibili come candidati di completamento: il testo è quello della linea del marcatore.
  • Completamento: è possibile utilizzare sottostringa, regexp, prefisso, fuzzy (vari tipi).
  • È possibile scorrere tra uno dei candidati di completamento o accedere direttamente a uno di essi.

tasti disponibili durante il completamento comprendono:

  • up, down - ciclo tra i candidati in *Completions*, senza la navigazione verso le loro posizioni

  • C-up, C-down - ciclo, navigazione verso ogni posizione a turno

  • C-RET, C-mouse-2 - vai direttamente al candidato corrente/cliccato (ad es. in *Completions*)

  • RET, mouse-2 - come precedente (andare al candidato), ma alla fine il comando (fatto)

  • S-TAB - a proposito di completamento (substring/regexp)

  • TAB - prefisso o sfocata completa

10

differenza risposte precedenti, questo si fa solo esattamente ciò che è stato chiesto: il contrario di Cu C-SPC. Lo trovo il più utile.

(defun unpop-to-mark-command() 
    "Unpop off mark ring. Does nothing if mark ring is empty." 
    (interactive) 
     (when mark-ring 
     (setq mark-ring (cons (copy-marker (mark-marker)) mark-ring)) 
     (set-marker (mark-marker) (car (last mark-ring)) (current-buffer)) 
     (when (null (mark t)) (ding)) 
     (setq mark-ring (nbutlast mark-ring)) 
     (goto-char (marker-position (car (last mark-ring)))))) 

Confrontando la risposta scottfrazer, questo comando ha una sottile differenza di come si muove il cursore e punto, che rispecchia più accuratamente Cu C-SPC, e non richiede che il comando precedente era un unpop/pop-to-mark-comando.

+1

Questo funziona come pura magia. – yPhil

+0

La risposta di scottfrazer dal 2010 è estremamente simile (e risponde anche alla domanda come indicato). Ti potrebbe interessare discutere perché pensi che le differenze nella tua funzione siano un miglioramento rispetto a ciò. – phils

+0

Sicuro. Modificato la mia risposta. –

5

Ecco una soluzione che ho appena trascorso spendendo troppo tempo. La differenza tra questa e le altre soluzioni è che funziona attraverso i buffer, cioè funziona sul "global-mark-ring". Il mio obiettivo era emulare la cronologia di navigazione simile a Eclipse o IntelliJ. Lo lego a M-left e M-right, ovviamente puoi scegliere chiavi diverse per questo.

(defun marker-is-point-p (marker) 
    "test if marker is current point" 
    (and (eq (marker-buffer marker) (current-buffer)) 
     (= (marker-position marker) (point)))) 

(defun push-mark-maybe() 
    "push mark onto `global-mark-ring' if mark head or tail is not current location" 
    (if (not global-mark-ring) (error "global-mark-ring empty") 
    (unless (or (marker-is-point-p (car global-mark-ring)) 
       (marker-is-point-p (car (reverse global-mark-ring)))) 
     (push-mark)))) 


(defun backward-global-mark() 
    "use `pop-global-mark', pushing current point if not on ring." 
    (interactive) 
    (push-mark-maybe) 
    (when (marker-is-point-p (car global-mark-ring)) 
    (call-interactively 'pop-global-mark)) 
    (call-interactively 'pop-global-mark)) 

(defun forward-global-mark() 
    "hack `pop-global-mark' to go in reverse, pushing current point if not on ring." 
    (interactive) 
    (push-mark-maybe) 
    (setq global-mark-ring (nreverse global-mark-ring)) 
    (when (marker-is-point-p (car global-mark-ring)) 
    (call-interactively 'pop-global-mark)) 
    (call-interactively 'pop-global-mark) 
    (setq global-mark-ring (nreverse global-mark-ring))) 

(global-set-key [M-left] (quote backward-global-mark)) 
(global-set-key [M-right] (quote forward-global-mark)) 
Problemi correlati