Невозможно понять строку Emacs Lisp - PullRequest
4 голосов
/ 26 июня 2009

Линия

function info() { 
    emacs -eval "(progn (setq Man-notify-method 'bully) (info \"$1\"))" 
}

Я знаю из руководств, что

Progn

progn - это специальная форма в `C source код».

SETQ

setq - это специальная форма в `C source код'. (setq SYM VAL SYM VAL ...)

Установите для каждого SYM значение VAL. Символы SYM являются переменными; Oни являются буквальными (не оцениваются). значения VAL являются выражениями; они есть оценены. Таким образом, (setq x (1+ y)) устанавливает x' to the value of (1+ лет) '. второй VAL не рассчитывается до первый SYM установлен и т. д .; каждый VAL может использовать новое значение переменных ранее установленное в setq'. The return value of the setq 'форме это значение из последней VAL.

$ 1 кажется ссылкой на первый параметр после команды man, которую дает пользователь.

'задира кажется случайной величиной.

Man-notify-method представляется функцией действия, которая запускается при выполнении команды man.

-eval, кажется, оценщик состояний, который говорит Emacs запустить оператор, следующий за ним.

Однако я не совсем уверен насчет функции.

Мне нужно понять функцию, поскольку я хочу связать мой код bash с функцией действия человека. Man-notify-method , похоже, является функцией действия, по крайней мере, в Emacs.

Как вы понимаете линию Emacs Lisp?

Ответы [ 2 ]

12 голосов
/ 26 июня 2009

Код, который вы разместили, представляет собой комбинацию сценария оболочки и elisp.

function info()
{
    emacs -eval "(progn (setq Man-notify-method 'bully) (info \"$1\"))"
}

Определяет функцию сценария оболочки с именем info. Требуется 1 параметр с именем $1. Когда вы вызываете эту функцию (скажем, из другого сценария оболочки), значение аргумента подставляется вместо $1, и он выполняет команды, указанные в последовательности. Итак, если бы вы назвали это так:

info("something")

Оболочка выполнит эту команду:

emacs -eval "(progn (setq Man-notify-method 'bully) (info \"something\"))"

Это вызывает исполняемый файл emacs с двумя аргументами -eval и командной строкой, которая содержит встроенные экранированные кавычки. Это просит emacs вызвать следующий код elisp:

(progn (setq Man-notify-method 'bully) (info "something"))

progn - это специальная форма . Специальные формы оценивают свои аргументы иначе, чем обычные вызовы функций. Вы можете найти документацию для progn в главе 10.1 Справочного руководства по GNU Emacs Lisp . progn - это простая конструкция для выполнения последовательности операторов по порядку. Причина, по которой вам может потребоваться это сделать, относится к случаям, когда вы хотите выполнить несколько операторов, но контекст, в котором вы находитесь, ожидает только одного оператора.

Например, оператор if принимает 3 (или более) аргумента: условие для оценки, выражение для оценки, если true, и выражение для оценки, если false. Если указано более 3 аргументов, последующие аргументы являются частью ветви else. Если вы хотите использовать более одного оператора в истинной ветви, вы должны использовать progn:

(if condition
   (progn first-statement-if-true
          second-statement-if-true)
   first-statement-if-false
   second-statement-if-false
)

В этом случае, если condition истинно, тогда будут оцениваться first-statement-if-true и second-statement-if-true. В противном случае first-statement-if-false и second-statement-if-false будут оцениваться.

Таким образом, ваш код просто оценит два оператора (setq Man-notify-method 'bully) и (info "something") по порядку.

setq - другая специальная форма. См. главу 11.8 для документации. Он просто устанавливает переменную, названную первым параметром, в значение второго параметра. Первый параметр не оценивается - он принимается буквально.

Значение, которому предшествует одинарная кавычка (например, 'bully), не оценивается. См. главу 9.3 для получения подробной информации о цитировании. Следовательно, (setq Man-notify-method) устанавливает переменную с именем Man-notify-method в буквальный токен bully (это тип данных, называемый символом , который отличается от строки "bully").

Я не могу найти документацию по функции info онлайн, вы можете получить помощь по любой функции в emacs, набрав C-h f function-name. Итак, набрав C-h f info, я получил это:

info is an interactive autoloaded Lisp function in `info'.
[Arg list not available until function definition is loaded.]

Enter Info, the documentation browser.
Optional argument FILE specifies the file to examine;
the default is the top-level directory of Info.
Called from a program, FILE may specify an Info node of the form
`(FILENAME)NODENAME'.

In interactive use, a prefix argument directs this command
to read a file name from the minibuffer.

The search path for Info files is in the variable `Info-directory-list'.
The top-level Info directory is made by combining all the files named `dir'
in all the directories in that path.

Электронное справочное руководство очень полезно, и интерактивная помощь emacs также необходима. Если вы не понимаете, что делает определенная функция, просто C-h f.

6 голосов
/ 26 июня 2009

PROGN просто вычисляет выражения по порядку, возвращая возвращаемое значение последнего.

SETQ - основной оператор присваивания.

INFO входит в информационный браузер emacs.

Итак, для этого сначала назначьте символ 'bully переменной Man-notify-method, затем войдите в информационный браузер. 'bully - это, вероятно, имя функции, а Man-notify-method - место, где информационный браузер ищет функцию для вызова какого-либо уведомления (Внимание: я просто догадываюсь здесь).

Полагаю, вам придется определить свою собственную функцию, которая вызывает вашу команду оболочки следующим образом:

(defun my-cmd ()
  (call-process   ; Look up the syntax in the emacs lisp manual
  ))

Затем присвойте его символу Man-notify-method:

(setq Man-notify-method 'my-cmd)
...