2012-06-19 1 views
1

, 내가 첫 번째 행을 좀하고 싶습니다 에코,하지만 난 문제가 format 또는 echo와 경우Elisp : 형식으로 따옴표를 얻을 수/<code>.mailrc</code>에서

alias UIF "UIF Boxning <[email protected]>" # cool (written manually by me) 
alias test_alias test_name <test_mail> # no quotation marks (written by below defun) 

내가 확실하지 오전 두 번째 행을 얻을. 보라 :

(defun save-mail-address (address name alias) 
    "add an alias to the .mailrc file" 
    (interactive "sMail address: \nsFull name: \nsAlias: ") 
    (let ((compl-alias (format "alias %s \"%s \<%s\>\"" alias name address))) 
    (shell-command (concat "echo " compl-alias " >> .mailrc")))) 
(defalias 'sma 'save-mail-address) 

편집 :

:

또한
alias long  "Long Long <[email protected]>"     # 123456 
alias s   "S S <[email protected]>"         # 1 

, 내가 중복을 포함하도록 그렇게하지 확인했다 :

OK, 목표는 다음과 같이 유지하다

(defun append-blanks (str len) 
    (concat str (make-string (- len (length str)) ?))) 


(defun save-mail-address (mail name alias phone) 
"add an alias to the .mailrc file" 
(interactive "sMail mail: \nsFull name: \nsAlias: \nnPhone: ") 
    (let*(
    (alias-alias (format "alias %s" alias)) 
    (alias-alias-blanks (append-blanks alias-alias 16)) 
    (mail-str (append-blanks (format "\"%s \<%s\>\"" name mail) 48)) 
    (line (format "%s%s\# %d\n" alias-alias-blanks mail-str phone)) 
    (file "~/.mailrc")) 
     (with-temp-buffer 
     (insert-file file) 
     (if 
      (search-forward alias-alias (point-max) t) ; t = return nil on fail 
      (message (format "Error: The alias %s is already in use." alias)) 
      (progn 
       (insert line) 
       (sort-columns nil (point-min) (point-max)) ; nil = not reversed 
       (write-file file nil)))))) ; nil = inhibit confirm 
+0

을 죽이고, 버퍼에 .mailrc의 방문 텍스트를 추가, 버퍼를 저장하는 것이 일의 Lisp 다운 방법 . – tripleee

+0

맞아요, 제 솔루션이 (아래의 도움으로) 작동하지만, 빈'* Shell Command Output * '버퍼가 생성된다는 귀찮은 부작용이 있습니다. 하지만, 모든 것을 다시하기보다는 코드에서 마지막으로 버퍼를 죽이고 다음에 조언을받습니다. –

답변

3

셸 명령에 전달되는 가변 인수가 항상 적절히 탈출했다.

(shell-command (concat "echo " (shell-quote-argument compl-alias))) 
+0

"쉘 명령에 전달 된 가변 인수가 항상 적절히 이스케이프되어야합니다." 하하, 너 말 안해? 하지만 당신의 솔루션에 대한 감사는 매력처럼 작동합니다. –

+0

아마도''* shell-quote-argument'를 사용하는 것이 확실합니다. – phils

1

그냥 다음과 같을 것입니다 Elisp을 통해 텍스트를 추가 :

(defun save-mail-address (address name alias) 
    "add an alias to the .mailrc file" 
    (interactive "sMail address: \nsFull name: \nsAlias: ") 
    (let ((compl-alias (format "alias %s \"%s \<%s\>\"" alias name address))) 
    (with-temp-buffer 
     (insert compl-alias "\n") 
     (write-region (point-min) (point-max) "~/.mailrc" t)))) 
+0

맞아, Elisp와 쉘 도구를 혼합하는 것보다 일관성이 있습니다. 어쩌면 우리는 A를 설정하고 B를 설정하는 데 더 많은 기술이있는 것처럼 엄지 손가락의 규칙을 풀 수 있습니다. 다리를 만들려는 유혹에 빠지지 말고 대신 A를 마스터하십시오. –

+0

너 중복 파일도 추가하지 않았는지, 파일이 올바른 형식인지 확인하고 싶을 수도 있습니다. 이를 위해서는 파일을 읽고 구문 분석하고 추가하고 작성해야합니다. 파싱에 실패하거나 속임수가 나오면 보석금을 내야한다. 이것은 Elisp에 추가하기가 비교적 쉽지만, 쉘 스크립트를 작성하는 것이 어렵지는 않습니다. – tripleee

+0

@ tripleee : 내가 제안한 내용을 편집 내용으로 추가했습니다. 작동하는 것 같습니다. 보세요. –