2009-02-09 1 views
1

В исходном дереве, в котором я работаю, есть файлы с отступом с разными значениями табуляции (не говоря уже о пробелах), и самое лучшее, что я могу сделать, это установить emacs в используйте стиль, найденный в области кода, который я модифицирую. Вместо того, чтобы использовать ширину табуляции M-x с переменной шириной до 4 или 8, привязка ключа для переключения ширины табуляции между этими двумя значениями очень помогла бы.Функция Emacs Lisp для переключения переменной 'tab-width' между 4 и 8

Спасибо.

ответ

12
;; Obviously substitute your preferred key for <f8> 
(global-set-key (kbd "<f8>") 'tf-toggle-tab-width-setting) ; ' "fix" highlighting 

(defun tf-toggle-tab-width-setting() 
    "Toggle setting tab widths between 4 and 8" 
    (interactive) 
    (setq tab-width (if (= tab-width 8) 4 8)) 
    (redraw-display)) 

Edited добавить перерисовки-дисплей в соответствии с комментарием предложил

+0

Спасибо Я добавил отображение перерисовывания после установки переменной, чтобы сразу изменить отражение. – user17880

+0

Спасибо! Вместо того, чтобы бить f8 каждый раз, когда я открываю буфер, могу ли я добавить что-то в свой .emacs, чтобы запустить это автоматически? –

+0

@IanCohen I Я не уверен, что вы хотите. Запрос был предназначен для переключения ширины. Если вы хотите, чтобы он был установлен на определенное значение для всех буферов, добавьте '(setq-default tab-width 4)' (или любое другое значение, которое вы хотите) –

0

Бросьте это в .emacs или .emacs.d/init.el файла:

(defun toggle-spaces() 
    "Toggle tab-width between 4 and 8" 
    (interactive) 
    (if (eq tab-width 4) 
     (setq tab-width 8) 
    (setq tab-width 4))) 

;; This will set Ctrl-g to toggle but you can set it to anything 
;; you want. 
(global-set-key "\C-g" 'toggle-spaces) 
+1

Cg жестко закодирован означает «бросить» в очень многих местах, которые я бы рекомендовать против перепривязки, что ключ в любом месте. Это просто не будет работать правильно – jrockway

+0

. Ах да. Хороший вопрос. –

5

Не совсем ответа на вопрос (ответы даны хорошие достаточно), но вы можете захотеть установить локальную переменную для каждого файла. Например, если предположить, что «//» означает комментарий на вашем языке, вы бы поместить следующее в первой строке файла:

// -*- tab-width: 4 -*- 

И Emacs установит переменную для вас, когда вы обращаетесь к файлу , См. http://www.gnu.org/software/emacs/manual/html_node/emacs/Specifying-File-Variables.html для получения дополнительной информации о переменных на основе файлов.

Конечно, это может быть не так, если файл разделяется между группой - если вы не можете убедить свои колледжи в том, что этот комментарий первой строки абсолютно безвреден, и чрезвычайно полезно!

+0

Спасибо. У нас есть специальная разметка редактора в некоторых файлах, но на нее обычно нахмуривают, поскольку каждый использует другой редактор: -/ – user17880

+1

И я думаю, было бы неплохо использовать setq-default, чтобы приоритет локальной буферной переменной. Я не думал об этом, когда задавал вопрос. Еще раз спасибо. – user17880

1

Спасибо за все ответы. Я добавил вызов перерисовывания, чтобы изменения сразу отражались. (Пробовал опубликовать это как комментарий, но не может.)

(global-set-key (kbd "<f8>") 'tf-toggle-tab-width-setting) 
(defun tf-toggle-tab-width-setting() "toggle setting tab widths between 4 and 8" 
    (interactive) 
    (setq tab-width (if (= tab-width 8) 4 8)) 
    (message "set tab-width to %d." tab-width) 
    (redraw-display) 
) 

И по тем же линиям. :(

(global-set-key (kbd "<f7>") 'tf-toggle-indent-mode-setting) 
(defun tf-toggle-indent-mode-setting() 
    "toggle indenting modes" 
    (interactive) 
    (setq indent-tabs-mode (if (eq indent-tabs-mode t) nil t)) 
    (message "Indenting using %s." (if (eq indent-tabs-mode t) "tabs" "spaces")) 
)