2017-02-10 11 views
0

Я пытаюсь написать функцию LISP emacs, чтобы отступать область (жестко). Я могу передать префиксные аргументы indent-code-rigidly или или отступом, и все они работают нормально, но я не хочу всегда передавать отрицательный префиксный аргумент, чтобы сдвинуть вещи влево.indent- [code-] жестко вызван из emacs Функция LISP

Мой текущий код, как показано ниже, но, кажется, ничего не делать:

(defun undent() 
    "un-indent rigidly." 
    (interactive) 
    (list 
     (setq fline (line-number-at-pos (region-beginning))) 
     (setq lline (line-number-at-pos (region-end))) 
     (setq curIndent (current-indentation)) 
     ;;(indent-rigidly fline lline (- curIndent 1)) 
     (indent-region fline lline 2) 
     ;;(message "%d %d" curIndent (- curIndent 1)) 
    ) 
) 

я понимаю, что (current-indentation) не получит мне отступ первой строки региона, но первой линии после региона (так что второй quesiton как это получить!). Но даже когда я просто использовать константу для столбца (как показано на рисунке, я не вижу эту функцию делать какие-либо изменения. Хотя, если я раскомментировать (message) вызов, он отображает разумные числа.

GNU Emacs 24.3.1 на Ubuntu. и в случае, если это имеет значение, я использую (setq-default indent-tabs-mode nil) и (cua-mode).

Я должен что-то очевидное отсутствует? ...

ответ

1

Все, что сказал Тим X верно, но если вам просто нужно что-то, что работает, или пример, чтобы показать, в каком направлении принять свой собственный код, я думаю, что вы ищете что-то вроде этого:

(defun unindent-rigidly (start end arg &optional interactive) 
    "As `indent-rigidly', but reversed." 
    (interactive "r\np\np") 
    (indent-rigidly start end (- arg) interactive)) 

Все это - вызов indent-rigidly с соответствующим образом преобразованным аргументом префикса. Если вы вызываете это с префиксным аргументом n, он будет действовать так, как если бы вы вызвали indent-rigidly с аргументом -n. Если вы опустите аргумент префикса, он будет вести себя так, как если бы вы вызвали indent-rigidly с аргументом -1 (вместо перехода в интерактивный режим indent-rigidly).

+0

Ах! Спасибо, теперь я понял. Я начал искать способ «перехватить» префикс arg и отрицать его, но не смог его найти и оказался бесполезно сложным. Большое спасибо! – TextGeek

2

Есть целый ряд проблем, связанных с вашей функции, в том числе некоторые варьируются основополагающую elisp. Очень рекомендую прочитать Emacs Lisp Справочное руководство (в комплекте с emacs). Если вы новичок в программировании и lisp, , вы также можете найти An Introduction to Emacs Lisp полезный (также в комплекте с Emacs).

Несколько вещей, чтобы прочитать о котором, вероятно, поможет

  • Прочитайте раздел о цикле команды из ссылки Elisp. В частности, рассмотрим узел, который описывает, как определить новую команду, и использовать «интерактивный» , который вам понадобится, если вы хотите привязать свою функцию к ключу или позвонить ему с помощью M-x.

  • Прочтите раздел о переменных из ссылки lisp и понять область видимости переменной (локальная глобальная). Посмотрите, используя 'let' довольно , чем 'setq', и в чем разница.

  • Прочтите раздел «Позиции» в справочной системе elisp. В частности, посмотрите на «save-excursion» и «save-restriction». Понимание того, как определить и использовать , также важно.

Это не ясно, если ваше письмо эта функция только в качестве учебного упражнения или нет. Однако на всякий случай, если вы это делаете, потому что вам нужно сделать , а не просто что-то изучить elisp, обязательно ознакомьтесь с руководством и индексом Emacs . То, что вам кажется нужным, является общим и довольно хорошо обоснованным требованием . Это может немного усложниться, если задействованы режимы программирования (в отличие от обычного текста).Тем не менее, с emacs, если вам понадобится что-то, что было бы общим требованием, вы можете быть довольно уверены, что уже есть - вам просто нужно его найти (что может быть проблемой в первую очередь).

Общим соглашением является определение функций/команд, которые действуют «в обратном направлении» при наличии отрицательного или универсального аргумента. Любая команда, которую обладает этой способностью, также может быть вызвана как функция в elisp-коде с аргументом , необходимым для получения этого поведения, поэтому важно понимать взаимосвязь между командами, функциями и вызовами между играми .