2013-02-08 7 views
2

Мне было интересно, есть ли способ сказать картуEmacs та же клавиатура другая команда

s-Y для двух разных команд.

Я думал, я хотел SY, чтобы открыть терминал в разделенном окне, которое было ниже, затем довести до Баш затем затем изменить фокус в новом окне, так

(defun bash-window() 
    (interactive) 
    (split-window-below) 
    (other-window 1) 
    (shell) 
) 

Затем с тем же команда завершает процесс оболочки, а un split нижнее окно - это способ, которым я могу это сделать с помощью lisp, похоже, что lisp не поддерживает состояние в emacs lisp programming .... если я не ошибаюсь в этом.

+1

Я не знаю точно, как это сделать, но не было бы: привязать SY к Elisp функции А , который делает расщепление и прочее, а также повторно связывает sY для сопоставления функции B. Функция B закрывает разделение и возвращает sY обратно к функции A. .emacs инициализирует sY для функции A. – Dave

+0

@Dave, это на самом деле действительно умный - я должен буду положить этот трюк в рукав в следующий раз! XD (Но серьезно, это круто.) –

+0

;; исправить функцию обратной функции aka undo (defun bash-window() (глобальный-set-key (kbd "sY") 'bash-window-undo) (интерактивный) (с разделенным окном ниже) (другое -window 1) (оболочки) ) (DEFUN Баш-оконная отмена() (глобальный установить ключ (KBD "SY") «баш-окно) (интерактивное) (другое окно -1-) (delete-other-windows-vertical) ) –

ответ

2

Почему бы не написать новую функцию, которая выполняет обе, а затем связать это?

Emacs Lisp (и большинство Lisps в целом) У есть состояние, вам просто нужно знать, где его искать. (Это самый большой отход CLISP от того чисто функциональной.)

Например,

(setq bash-window-active nil) 

(defun bash-window nil 
    (interactive) 
    (if bash-window-active 
     (function-to-reverse-those-performed-below) 
     (progn 
     (split-window-below) 
     (other-window 1) 
     (shell) 
     (setq bash-window-active t))) 

(global-set-key "\C-cb" 'bash-window) 
+0

Wow спасибо, ребята, оба замечательные, это работает еще лучше! –

+0

Кстати, есть ли какие-либо способы, которыми я могу иметь переменные состояния, которые сохраняют свое значение во время функции? вот как я могу инкапсулировать, bash-window-active nil в функцию bash-window? –

+0

Вы можете использовать выражения 'let' для представления локальных привязок (которые могут быть изменены с помощью' setq' и, следовательно, использоваться как переменные). Документация [здесь] (http://www.gnu.org/software/emacs/emacs-lisp-intro/html_node/Parts-of-let-Expression.html). –

Смежные вопросы