У меня небольшая проблема с тем, как работают команды «backward-word» и «backward-kill-word». Когда я нажимаю "backward-kill-word" в строке, состоящей только из пробелов (например, первый символ строки с отступом), команда уничтожает все пробелы, а также последнее слово строки предыдущая строка.
Такое поведение мне совершенно не интуитивно. Я предпочитаю, как это работает, например, в Eclipse, который убивает символы пробела до начала строки при первом нажатии «backward-kill-word», перемещается в конец предыдущей строки при следующем ударе, и только тогда начнут убивать слова с конца строки.
Я почти уверен, что это поведение по умолчанию в большинстве приложений (поскольку оно кажется более интуитивным, вероятно, потому, что я к нему привык, но не уверен), поэтому мне интересно, есть ли способ настроить Emacs для такого же поведения. К сожалению, несколько поисков в Google ничего не дали.
Спасибо
Обновлено:
Спасибо всем за ответы (включая код elisp, который делает то, о чем я просил).
Та же проблема возникает, очевидно, с командами forward-kill-word и движением, и я надеялся, что в emacs есть только какой-то настраиваемый флаг для изменения поведения, но похоже, что я просто возьму эти функции elisp и переустановите для них команды движения и уничтожения по умолчанию.
Неповторимая красота Emacs позволяет вам определять смотрящего так, как вы хотите!





В этом случае вы можете попробовать M- \ (delete-horizontal-space), который сделает то, что вы хотите при первом нажатии клавиши. И если вам действительно нужна функция, которая объединяет эти два, не должно быть слишком сложно написать такую, которая проверяет, есть ли какие-либо непробельные символы в текущей строке перед курсором, и вызывает тот или иной на основе этого.
это довольно большой вопрос. вам нужно будет изучить программирование на emacs lisp и кое-что узнать об этом. Я бы посоветовал начать здесь: гремучая змея учебник по emacs, и продолжайте работать над этим.
просто для информации, просмотр моего файла TAGS говорит мне, что обратное слово определяется в simple.el и имеет следующую форму:
(defun backward-word (& необязательный аргумент)
«Двигайтесь назад, пока не встретите начало слова. С аргументом сделайте это столько раз».
(интерактивный "p")
(вперед-слово (- (или аргумент 1))))
так что следующим шагом будет добавление if к этому вызову.
Как насчет этого:
(defun my-backward-kill-word ()
"Kill words backward my way."
(interactive)
(if (bolp)
(backward-delete-char 1)
(if (string-match "^\\s-+$" (buffer-substring (point-at-bol) (point)))
(kill-region (point-at-bol) (point))
(backward-kill-word 1))))
Это должно сделать это:
(defun eclipse-kill-word (repeat)
"Redefine `backward-kill-word' to work as Eclipse does.
Now stops at the beginning of the line, deleting only whitespace."
(interactive "p")
(let (cnt)
(dotimes (cnt repeat)
(if (= (point) (save-excursion (beginning-of-line) (point)))
(kill-region (point) (save-excursion (backward-word) (point)))
(kill-region (point)
(max (save-excursion (beginning-of-line) (point))
(save-excursion (backward-word) (point))))))))
Имеет дополнительное преимущество повторения с помощью клавиши префикса (Ctrl-U).
Обратите внимание, что в cc-режим есть опция голодного удаления, и вы можете включить ее так:
(add-hook 'c-mode-common-hook (lambda () (c-toggle-auto-hungry-state 1)))
Очевидно, это применимо только к файлам C, C++, Java, ... и относится к клавише Backspace (а не к удалению слов).
Вы можете повторно использовать некоторые функции из viper, чтобы добиться желаемого поведения:
(setq viper-mode nil)
(require 'viper)
(defun viper-delete-word (arg)
"Delete word."
(interactive "p")
(save-excursion
(push-mark nil t)
(viper-forward-word arg)
(delete-region (point) (mark t))
(pop-mark)))
(defun viper-delete-backward-word (arg)
"Delete previous word."
(interactive "p")
(save-excursion
(push-mark nil t)
(viper-backward-word arg)
(delete-region (point) (mark t))
(pop-mark)))
(global-set-key [C-left] 'viper-backward-word)
(global-set-key [C-right] 'viper-forward-word)
(global-set-key [C-delete] 'viper-delete-word)
(global-set-key [C-backspace] 'viper-delete-backward-word)
Интуитивность в глазах смотрящего ... Когда я заказываю
backword-kill-word, я ожидаю, что курсор окажется на первом символе того места, где раньше находилось слово ... чего не было бы, если бы он заблокировался в начале строки.