2009-03-07 4 views
10

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

  1. пресс C-возвращение из любой точки на линии, и есть движение курсор на вновь вставленную пустую строку выше, с правильным отступом (или, по крайней мере, такие же, как исходная линия).
  2. быть в состоянии дергать любой текст ...
  3. и Cu C-пространство, чтобы вернуться в исходное положение

мне удалось сделать # 1, но мой Emacs-фу не является достаточно сильным, чтобы сделать все остальное.

ответ

6

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

 
(defun insert-before-line() 
    (interactive) 
    (let ((pos (point)) 
     (cur-max (point-max))) 
    (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's metter of taste 
    ; and of usage 
    (newline-and-indent) 
    (goto-char (+ pos (- (point-max) cur-max))))) 

Надеется, что это помогает.

+1

Интересно. IIUC, ваше решение держит курсор неподвижным, а «авто-yanks» - правильно выровненной линией вверху. Я думаю, что это могло бы соответствовать моей модели использования лучше, чем то, о чем я просил. Спасибо :-) – thebjorn

+1

Код должен использовать 'save-excursion', должен избегать использования' yank' и должен быть общим для обработки, когда текст не находится в конце буфера ('point-max'). – ashawley

+0

@aaronhawley - почему «save-excursion»? Я не меняю метку, которую я обрабатываю правильно, и приведенный выше код вряд ли вызовет подавление буфера. Можете ли вы более конкретно сказать о том, «когда текст не находится в конце буфера», он делает то же самое, когда точка находится в момент вызова – Serge

3

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

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

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

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

3

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

(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) 

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

3

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

+3

Если бы я мог додуматься до тех пор, пока не дойду до конца линии, это не будет проблемой - вы поймете, когда вы станете «старше» ;-) – thebjorn

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