Emacs Shift-Tab влево сдвинуть блок - PullRequest
29 голосов
/ 12 февраля 2010

Как мне получить Emacs для Shift Tab , чтобы переместить выделенный текст влево на 4 пробела?

Ответы [ 4 ]

50 голосов
/ 12 февраля 2010

Для этого я использую команду indent-rigidly, привязанную к C-x TAB. Введите аргумент -4, чтобы переместить выбранную область влево на четыре пробела: C-u -4 C-x TAB.

http://www.gnu.org/s/emacs/manual/html_node/elisp/Region-Indent.html

12 голосов
/ 12 февраля 2010

Это удаляет 4 пробела в начале текущей строки (при условии, что пробелы существуют).

(global-set-key (kbd "<S-tab>") 'un-indent-by-removing-4-spaces)
(defun un-indent-by-removing-4-spaces ()
  "remove 4 spaces from beginning of of line"
  (interactive)
  (save-excursion
    (save-match-data
      (beginning-of-line)
      ;; get rid of tabs at beginning of line
      (when (looking-at "^\\s-+")
        (untabify (match-beginning 0) (match-end 0)))
      (when (looking-at "^    ")
        (replace-match "")))))

Если ваша переменная tab-width окажется равной 4 (и это то, что вы хотите "отменить"), тогда вы можете заменить (looking-at "^ ") на что-то более общее, например (concat "^" (make-string tab-width ?\ )).

Кроме того, код преобразует вкладки в начале строки в пробелы, используя untabify .

8 голосов
/ 03 февраля 2016

Я сделал несколько функций для вставки области на четыре пробела влево или вправо в зависимости от того, используете ли вы tab или shift + tab:

(defun indent-region-custom(numSpaces)
    (progn 
        ; default to start and end of current line
        (setq regionStart (line-beginning-position))
        (setq regionEnd (line-end-position))

        ; if there's a selection, use that instead of the current line
        (when (use-region-p)
            (setq regionStart (region-beginning))
            (setq regionEnd (region-end))
        )

        (save-excursion ; restore the position afterwards            
            (goto-char regionStart) ; go to the start of region
            (setq start (line-beginning-position)) ; save the start of the line
            (goto-char regionEnd) ; go to the end of region
            (setq end (line-end-position)) ; save the end of the line

            (indent-rigidly start end numSpaces) ; indent between start and end
            (setq deactivate-mark nil) ; restore the selected region
        )
    )
)

(defun untab-region (N)
    (interactive "p")
    (indent-region-custom -4)
)

(defun tab-region (N)
    (interactive "p")
    (if (active-minibuffer-window)
        (minibuffer-complete)    ; tab is pressed in minibuffer window -> do completion
    ; else
    (if (string= (buffer-name) "*shell*")
        (comint-dynamic-complete) ; in a shell, use tab completion
    ; else
    (if (use-region-p)    ; tab is pressed is any other buffer -> execute with space insertion
        (indent-region-custom 4) ; region was selected, call indent-region
        (insert "    ") ; else insert four spaces as expected
    )))
)

(global-set-key (kbd "<backtab>") 'untab-region)
(global-set-key (kbd "<tab>") 'tab-region)

Редактировать : Добавлен код Maven для проверки наличия минибуфера, а также для завершения табуляции в определенных буферах ( shell , например).

1 голос
/ 23 марта 2017

Я улучшил ответ Стэнли Бака. Для меня это глобальное связывание ключей испортило завершение минибуфера.

Итак, я также включил чехол для минибуфера.

Редактировать : Переименование indent-region -> indent-region-custom.

indent-region конфликтует с существующей командой и выдает ошибку для отступа при сохранении (перехват до сохранения) и некоторых других комбинаций клавиш.

(defun indent-region-custom(numSpaces)
  (progn
    ;; default to start and end of current line
    (setq regionStart (line-beginning-position))
    (setq regionEnd (line-end-position))
    ;; if there's a selection, use that instead of the current line
    (when (use-region-p)
      (setq regionStart (region-beginning))
      (setq regionEnd (region-end))
      )

    (save-excursion ; restore the position afterwards
      (goto-char regionStart) ; go to the start of region
      (setq start (line-beginning-position)) ; save the start of the line
      (goto-char regionEnd) ; go to the end of region
      (setq end (line-end-position)) ; save the end of the line

      (indent-rigidly start end numSpaces) ; indent between start and end
      (setq deactivate-mark nil) ; restore the selected region
      )
    )
  )

(defun untab-region (N)
  (interactive "p")
  (indent-region-custom -4)
  )

(defun tab-region (N)
  (interactive "p")
  (if (active-minibuffer-window)
      (minibuffer-complete)    ; tab is pressed in minibuffer window -> do completion
    (if (use-region-p)    ; tab is pressed is any other buffer -> execute with space insertion
        (indent-region-custom 4) ; region was selected, call indent-region-custom
      (insert "    ") ; else insert four spaces as expected
      )
    )
  )

(global-set-key (kbd "<backtab>") 'untab-region)
(global-set-key (kbd "<tab>") 'tab-region)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...