Команда Emacs для вставки и отступа строки над курсором

Я часто нахожу себя на линии, когда понимаю, что мне нужно (ed) определение переменной (или что-то подобное) в строке выше. Я бы хотел, чтобы

  • нажмите C-return из любого места в строке и переместите курсор на вновь вставленную пустую строку выше, с правильным отступом (или, по крайней мере, таким же, как исходная строка).
  • иметь возможность выдергивать любой текст...
  • и C-u C-space, чтобы вернуться в исходное положение

Мне удалось сделать # 1, но мой emacs-fu недостаточно силен, чтобы сделать все остальное.

Ответ 1

Вот мое скромное решение:

(defun my-insert-before-line ()
  (interactive)
  (save-excursion
    (beginning-of-line)
    ; I've changed the order of (yank) and (indent-according-to-mode)
    ; in order to handle the case when yanked line comes with its own indent
    (yank)(indent-according-to-mode)
    ; could be as well changed to simple (newline) it metter of taste
    ; and of usage
    (newline-and-indent)))

Надеюсь, поможет.

Ответ 2

Вот что вы можете сделать, если вы не дзэн-хозяин emacs-чувак.

В Emacs есть запись-макро-вещь, kmacro-start-macro и kmacro-end-macro.

После записи вашего макроса выполните имя-last-kbd-macro. затем посетите .emacs и сделайте insert-kbd-macro.

У вас есть инструкция fset, которая определяет ваш макрос. Это может показаться забавным, и это не так удобно, как elisp, но если вы поместите его в свои .emacs, этот макрос (по этому имени) будет доступен для любого из ваших сеансов редактирования. И вы также можете привязать его к последовательности клавиш.

Ответ 3

Вероятно, плохая форма для ответа на мой собственный вопрос, но ответ Cheeso побудил меня сделать некоторое lisp программирование во второй раз за десять лет (моя оригинальная версия была названным макросом клавиатуры, но она шагнула по всему знаку kill/mark -кольца). Вот что я придумал

(defun insert-and-indent-line-above ()
  (interactive)
  (push-mark)
  (let* 
    ((ipt (progn (back-to-indentation) (point)))
     (bol (progn (move-beginning-of-line 1) (point)))
     (indent (buffer-substring bol ipt)))
    (newline)
    (previous-line)
    (insert indent)))

(global-set-key [ (control return) ] 'insert-and-indent-line-above)

вероятно, есть много лучших способов сделать это, но два часа lisp -hacking вряд ли можно назвать потраченным впустую временем: -)

Ответ 4

Просто задумайтесь над объявлением переменной, закончите вводить свой оператор, затем введите RET (хотя Cj обычно больше DWIM) и введите следующую строку для объявления переменной, а затем нажмите Cx Ct, чтобы транспонировать строки.