получить и установить содержимое строки в буфере emacs программно - PullRequest
3 голосов
/ 24 июля 2010

Я бы хотел перевести следующую функцию из скрипта vim в emacs elisp (я использую ее для установки получателей электронной почты при написании писем).

Мой вопрос в основном состоит в том, как получить и установить строковое содержимое в emacsпотому что с быстрым поиском в Google я не мог этого выяснить (возможно, я просто не знал правильных терминов для Google, «getline» и «setline» в любом случае не дали результатов).

function! G_set_to()  
    let address = system('my-address-script')  "shell command to choose addresses  
    let line = getline (2)  
    if strlen(line) == 4  
        call setline(2,  line . address)  
    else  
        call setline(2,  line . "; " . address)  
    endif  
endfunction  

Извините, если ответ очевиден, я совершенно новичок в emacs и даже не знаю, как использовать встроенную справочную систему.

Приветствия Ариана

Ответы [ 2 ]

3 голосов
/ 24 июля 2010

Сделайте это, явно настраивая переменную G-address-script в соответствии с вашими потребностями.

(require 'sendmail)
(defvar G-address-script "echo hi@google.com")
(defun G-set-to ()
  "execute script in G-address-script and populate the To: line with the results"
  (interactive)
  (save-excursion
    (mail-to)
    (unless (= (current-column) 4)
      (insert "; "))
    (insert (shell-command-to-string G-address-script))
    (when (looking-at "^$") ; when shell command has extra newline, delete it
      (delete-backward-char 1))))

Что касается использования справки, здесь есть разумное введение в Emacs lisp здесь . Но быстрое вступление:

  • C-h i (это control-h затем i для просмотра информационных страниц, есть один для Emacs и один для Emacs Lisp.
  • M-x по поводу ищет термины
  • C-h f дает вам помощь по функции
  • C-h v дает вам помощь по переменной
  • В буфере *scratch* C-j вычислит выражение непосредственно перед точкой (курсором)
  • Mx edebug-defun когда точка находится в функции lisp emacs, включит отладчик, и при следующем запуске функции вы пройдете через нее ( Mx eval-defun в функции отключит отладчик)
  • M-x eldoc-mode включит автоматическое документирование функций и переменных lisp emacs по мере их ввода, подробнее здесь .
1 голос
/ 25 июля 2010

Я взял код Трея и изменил несколько вещей, и теперь, похоже, он работает:

(defvar G-address-script "goobook_dmenu_with_cache")  
  (defun G-set-to ()  
    "execute script in G-address-script and populate the To: line with the results"  
    (interactive)  
    (save-excursion  
  (goto-line 2)  
  (re-search-forward "$")  
  (unless (= (current-column) 4)  
    (insert "; "))  
  (insert (shell-command-to-string G-address-script))))

Некоторые оставшиеся вопросы:

  1. Бит, в котором код Трея проверяет, пуста ли строка, возвращаемая из G-address-script, в данный момент не работает, что мне нужно изменить?
  2. Неужели нет функции для получения содержимого указанной строки в виде строки?
  3. Есть ли лучший / более элегантный способ сделать это? Сценарий vim выглядит намного проще, наверняка я что-то упустил.

В любом случае, я отмечу это как решенное за день или около того, если больше не будет ответов, поскольку решение Trey в основном делает то, что я хотел. Спасибо Трей!

...