2010-11-10 26 views
6

He convertido desde Visual Studio a Emacs durante la mayor parte de mi desarrollo (principalmente debido a la conmutación de lenguajes de programación). Sin embargo, hay una característica genial de Visual Studio que echo de menos: Ctrl - Pestaña entre "almacenamientos intermedios".Cómo configurar correctamente Ctrl-Tab en Emacs

El ctrl - pestaña que en Visual Studio no es lo mismo que C - xb en Emacs. Por lo tanto, no es solo un problema de mapeo de teclado. Aquí están las características de mi ideal Ctrl - Tab:

  1. Mantenga pulsado Ctrl pestaña golpe, se ve la próxima memoria intermedia antes de soltar ctrl.
  2. No es necesario presionar enter.
  3. Si este no es el buffer que desea, presione la pestaña nuevamente hasta que vea el buffer que desea.
  4. En el momento en que se libera ctrl, se actualiza el anillo intermedio. El siguiente búfer en el anillo es el búfer donde primero presionó ctrl.

He visto algunos complementos de Emacs que intentan simular este comportamiento, pero el # 4 es el más difícil. Parece que Emacs no puede detectar cuando se lanza la clave ctrl. En cambio, el código espera a que el usuario permanezca en el búfer durante un tiempo determinado o espera a que cambie el búfer ... y luego se agrega el búfer al anillo. Es lo suficientemente diferente como para realmente frustrarme y simplemente nunca usar mi querida ctrl - pestaña otra vez. Por ahora trato con C - xb. ido-modo hace C - xb más tolerable, pero yo todavía sueño de un día en que pueda ctrl - pestaña en emacs.

¿Alguien por ahí encontró una manera de configurar Ctrl - Tab en Emacs para trabajar como Visual Studio?

+0

duplicado? [pestaña emacs entre búferes] (http://stackoverflow.com/q/4133181/2509) – dmckee

+0

Parece muy similar, pero no estoy seguro de si son iguales. Específicamente quiero que el buffer de anillo se modifique cuando se suelta ctrl (no cuando se modifica el búfer o después de algún valor de tiempo de espera). A veces quiero leer rápidamente el contenido de un búfer y volver al lugar donde estaba. Emacs simplemente no puede hacerlo ... pero sí. – User1

+3

Está describiendo un comportamiento similar a una pila como alt-tab en Windows. ¿Por qué no usar la flecha izquierda/derecha C-x para ir al siguiente/anterior buffer? Puede asignar eso a una sola pulsación de tecla (C-Tab, C-S-Tab). – Demosthenex

Respuesta

2

Creo que esto es lo que usted quiere. Como mencionó, Emacs no recibe eventos para la clave de control, por lo que no puede obtener la funcionalidad que desea. Sin embargo, esto no va a grabar el interruptor de memoria intermedia hasta que haga algo que no sea de prensa C-pestaña (es decir, de desplazamiento, de tipo algo, haga clic en el ratón, utilice un comando Mx ...):

(global-set-key (kbd "<C-tab>") 'my-switch-buffer) 
(defun my-switch-buffer() 
    "Switch buffers, but don't record the change until the last one." 
    (interactive) 
    (let ((blist (copy-sequence (buffer-list))) 
     current 
     (key-for-this (this-command-keys)) 
     (key-for-this-string (format-kbd-macro (this-command-keys))) 
     done) 
    (while (not done) 
     (setq current (car blist)) 
     (setq blist (append (cdr blist) (list current))) 
     (when (and (not (get-buffer-window current)) 
       (not (minibufferp current))) 
     (switch-to-buffer current t) 
     (message "Type %s to continue cycling" key-for-this-string) 
     (when (setq done (not (equal key-for-this (make-vector 1 (read-event))))) 
      (switch-to-buffer current) 
      (clear-this-command-keys t) 
      (setq unread-command-events (list last-input-event))))))) 
+1

"Emacs no recibe eventos para la clave de control" :(Eso es lo que temía. Preferiría no tener que escribir algunos buffers, solo quiero leerlos y regresar (por ejemplo, la documentación de la API). ¿Hay alguna manera de "engañar" a emacs para ver la clave Ctrl lanzada? – User1

+0

@ Usuario1 En realidad, puede hacer cualquier cosa que no sea 'C-tab ', como hacer clic con el mouse, desplazarse hacia arriba/abajo, buscar, lo que sea.Actualizaré la respuesta para mostrar esto. –

2

Si está utilizando GNU Emacs 22.1 o versiones más recientes, \C-x<Right> dispara M-x next-buffer y \C-x<Left> dispara M-x previous-buffer.Esta página en EmacsWiki tiene un enlace a C-TAB Windows style buffer cycling. La página también habla sobre cómo llevar este comportamiento a versiones anteriores de Emacsen.

This question desde ayer se ve muy similar a lo que quiere lograr, excepto que la pregunta habla sobre Notepad ++ en lugar de Visual Studio.

4

que estaba buscando exactamente el comportamiento que usted describe y se encontró con el paquete iflipb: http://www.emacswiki.org/emacs/iflipb y lo envolvieron a C - pestaña,C - S - pestaña.

Lamentablemente, no reinicia el ciclo después de liberar la clave ctrl, por lo que en ese sentido es el mismo que el my-switch-buffer en la respuesta anterior. Cualquier nuevo conocimiento sobre este tema es muy apreciado.

1

Me gusta el comportamiento cíclico y de alternancia de iflipb también, es muy parecido al comportamiento de Windows Alt-Tab. Sin embargo, como se señaló anteriormente, Emacs no hace que sea fácil darse cuenta cuando suelta la tecla de control. Esto hace imperceptible el alternar entre los dos almacenamientos intermedios superiores: si presiona C-Tab (y suelta) y luego C-Tab (y suelta), no ha alternado entre los dos primeros. En cambio, iflipb simplemente avanza más abajo en la lista de buffer. Pero si realiza cualquier otro comando de Emacs entre los dos eventos de C-Tab, iflipb reconoce que está comenzando de nuevo en la marcha del búfer, por lo que hace el alternar.

En Windows, AutoHotKey puede acudir al rescate y enviar una tecla a Emacs cuando suelta la tecla de control. Aquí está mi guión:

#if WinActive("ahk_class Emacs") 
^Tab:: 
Send {Blind}^{Tab} 
SetTimer, WaitForCtrlUp, 10 
return 

WaitForCtrlUp: 
if(!GetKeyState("LControl", "P") and !GetKeyState("RControl","P")) 
{ 
    if WinActive("ahk_class Emacs") 
     Send ^c: 
    SetTimer, WaitForCtrlUp, Off 
} 
return 

Siempre C-Tab es presionada en emacs, el guión comienza a consultar el estado de la tecla de control. Cuando se suelta la tecla, envía a Emacs la secuencia de teclas C-c :. Tengo esa clave ligada a un comando "nulo", que es suficiente para obtener iflipb y darse cuenta de lo que está sucediendo.

Aquí está el .emacs correspondiente extracto:

; see http://www.emacswiki.org/emacs/iflipb 
(require 'iflipb) 

(global-set-key (kbd "<C-tab>") 'iflipb-next-buffer) 
(global-set-key 
(if (featurep 'xemacs) (kbd "<C-iso-left-tab>") (kbd "<C-S-tab>")) 
'iflipb-previous-buffer) 

(defun null-command() 
    "Do nothing (other than standard command processing such as remembering this was the last command executed)" 
    (interactive)) 

(global-set-key "\C-c:" 'null-command) 

Por lo tanto, es una especie de hacky, pero funciona. Gracias a los carteles al http://www.autohotkey.com/board/topic/72433-controltab/, que estaban tratando de resolver un problema similar.

+0

Lo probé en MacOSX, pero resultó que no puedo hacer 'C-x' o' C-s' (isearch) o etc ... Pero ignorar estos problemas, funciona. –

0

Añadir lo siguiente a sus .emacs archivo:

(global-set-key (kbd "<C-tab>") 'next-buffer) 
Cuestiones relacionadas