Как правильно настроить Ctrl-Tab в Emacs - PullRequest
7 голосов
/ 10 ноября 2010

Я перешел из Visual Studio в Emacs для большей части моей разработки (в основном из-за переключения языков программирования).Однако есть одна классная особенность Visual Studio, которую я действительно скучаю: Ctrl - Tab между "буферами".

ctrl - tab , который в Visual Studio отличается от C - x b в Emacs.Так что это не просто проблема с отображением клавиатуры.Вот особенности моего идеального Ctrl - Tab :

  1. Удерживая нажатой клавишу ctrl , нажмите на следующий буфер передвы отпускаете ctrl .
  2. Нет необходимости нажимать Enter.
  3. Если это не тот буфер, который вам нужен, нажимайте клавишу Tab снова, пока не увидите нужный буфер.хочу.
  4. В момент освобождения ctrl буферное кольцо обновляется.Следующий буфер в кольце - это буфер, в котором вы впервые нажали ctrl .

Я видел несколько плагинов Emacs, которые пытаются симулировать это поведение, но # 4 является наиболеесложно.Похоже, что Emacs не может определить, когда отпущена клавиша ctrl .Вместо этого код ожидает, пока пользователь не будет в буфере в течение определенного времени, или ожидает изменения буфера ... и затем буфер добавляется в кольцо.Это достаточно отличается, чтобы действительно расстроить меня и просто никогда больше не использовать мою любимую ctrl - tab .Сейчас я просто имею дело с C - x b .Режим ido делает C - x b более терпимым, но я все еще мечтаю о дне, когда я смогу ctrl - tab в emacs.

Кто-нибудь нашел способ настроить Ctrl - Tab в Emacs для работы подобно Visual Studio?

Ответы [ 5 ]

5 голосов
/ 15 октября 2011

Я искал именно то поведение, которое вы описываете, и сталкивалось пакет iflipb: http://www.emacswiki.org/emacs/iflipb и привязанный к C - tab , C - S - tab .

К сожалению, после запуска клавиши ctrl он также не перезапускает цикл, поэтому в этом отношении он аналогичен буферу my-switch-buffer в ответе выше. Любое новое понимание этого вопроса высоко ценится.

4 голосов
/ 11 ноября 2010

Если вы используете GNU Emacs 22.1 или более поздние версии, \C-x<Right> запускает M-x next-buffer, а \C-x<Left> запускает M-x previous-buffer.На этой странице EmacsWiki есть ссылка на C-TAB зацикливание буфера в стиле Windows.На странице также рассказывается о том, как привести такое поведение в более ранние выпуски Emacsen.

Этот вопрос со вчерашнего дня выглядит очень похоже на то, чего вы хотите достичь, за исключением того, что вместо этого речь идет о Notepad ++Visual Studio.

2 голосов
/ 10 ноября 2010

Я думаю, это близко к тому, что вы хотите. Как вы упомянули, Emacs не получает события для управляющей клавиши, поэтому вы не можете получить желаемую функциональность. Однако, это не будет записывать переключение буфера, пока вы не сделаете что-то кроме нажатия C-tab (т.е. прокрутите, напечатайте что-нибудь, щелкните мышью, используйте команду 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 голос
/ 27 января 2018

Добавьте в файл .emacs следующее:

(global-set-key (kbd "<C-tab>") 'next-buffer)
1 голос
/ 16 февраля 2013

Мне также нравится циклическое и переключающее поведение iflipb, оно очень похоже на поведение Windows Alt-Tab.Однако, как указывалось ранее, Emacs не позволяет легко заметить, когда вы отпускаете управляющую клавишу.Это делает переключение между двумя верхними буферами несовершенным: если вы нажмете C-Tab (и отпустите), а затем C-Tab (и отпустите), вы не переключитесь между двумя верхними.Вместо этого iflipb просто идет дальше по списку буферов.Но если вы выполняете любую другую команду Emacs между двумя событиями C-Tab, тогда iflipb распознает, что он запускается заново в ходе буфера, и переключается.

В Windows AutoHotKey может прийти на помощьи отправьте Emacs нажатие клавиши, когда вы отпустите клавишу управления.Вот мой сценарий:

#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

Всякий раз, когда в emacs нажимается C-Tab, сценарий начинает опрашивать состояние управляющей клавиши.Когда ключ отпускается, он отправляет Emacs последовательность клавиш C-c :.У меня есть этот ключ, связанный с «нулевой» командой, которой достаточно, чтобы iflipb заметил, что происходит.

Вот соответствующий отрывок .emacs:

; 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)

Итак, это отчасти хакерство, но оно работает.Спасибо постерам на http://www.autohotkey.com/board/topic/72433-controltab/,, которые пытались решить подобную проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...