2013-08-26 6 views
1

나는 명령을 원하는 복사 킬 (kill) 링 형태. emacs-live에서, 내가 찾을 수있는 가장 가까운 것은이 명령/키 결합간단한 '사본 형태의 명령

(global-set-key (kbd "M-]") 'kill-ring-save) 

그러나 죽일 - 링 - 저장 일부 남았습니다 행동을 가지고 있었다. Ii는 커서를 지나서 하나 이상의 양식을 복사합니다. 궁극적으로, 나는 아래의 내용을 따라 간단한 함수를 원한다.

(defun copy-form() 
    (kill-ring-save (line-beginning-position) (live-paredit-forward))) 

(global-set-key (kbd "M-]") 'copy-form) 

나는 높이 (SO questionGoogle search) 낮은 검색 한하지만, 균형 잡힌 식을 복사하는 간단한 작업 명령을 찾을 수 없습니다. 누군가 이미 이것을 했습니까?

감사

답변

1

기능 sexp-at-point 당신에게 커서에서 sexp ("양식")를 제공합니다. kill-ring-save을 사용하여 kill-ring에 복사하십시오. 예컨대 :

(defun copy-sexp-at-point() 
    (interactive) 
    (let ((bnds (bounds-of-thing-at-point 'sexp))) 
    (kill-ring-save (car bnds) (cdr bnds)))) 

는 다른 방법으로, 단지 kill-new를 사용

(defun copy-sexp-at-point() 
    (interactive) 
    (kill-new (thing-at-point 'sexp))) 
+0

이것은 정말 좋아 보인다. kill-ring-save는'(kill-ring-save BEG END)'형식을 기대합니다. 따라서 나는 i) 그것을 사용하거나 ii) sexp-at-point *** 결과를 kill-ring에 저장할 수있는 다른 기능을 사용해야합니다. 어떤 통찰력? – Nutritioustim

+0

그래서'BEG'와'END'를 얻기 위해'(BEG.END)'를 리턴하면'car'와' cdr'을'kill-ring-save'으로 바꾸십시오. – Drew

+0

이 방법을 시도하면 emacs가'잘못된 형식 인수 : symbolp, (one (two)) '오류를 표시합니다. 내 코드는 *** [online here] (https://www.refheap.com/18032) ***입니다. 나는 Emacs Lisp 초보자라고 언급해야한다. 그래서 나는 아주 명확한 설명이 필요합니다. 해당 코드 블록을 자유롭게 편집하거나 가장 쉬운 작업을 수행하십시오. 감사. – Nutritioustim

0

당신의 copy-form가 키에 바인딩 할 수없는 이유는 함수가 아닌 명령이라는 것이다 - 그것이 interactive 양식이 없습니다.

그러나 귀하의 경우에는 새 기능을 작성할 필요가 없습니다.

mark-sexp is an interactive compiled Lisp function in `lisp.el'.

It is bound to [email protected], C-M-SPC.

내가 질문을 이해 확실하지 않다

M-w runs the command kill-ring-save, which is an interactive compiled Lisp function in `simple.el'.

It is bound to <C-insertchar>, M-w, <menu-bar> <edit> <copy>.

+0

명령을 사용할 때, 이맥스는 여전히 '잘못된 형식 인수 : 정수 또는 마커 -p, nil' 오류를 제공합니다. 나는 단지'kill-ring-save *** '와 같은 방식으로'(kill-ring-save BEG END)'형식으로 정수를 되 돌리지 않을 것이라고 생각한다. – Nutritioustim

0

의 조합을 시도,하지만 난 고려해야 일을해야 할 때 "균형 잡힌 형태를 복사" 나는 다음과 같이한다 : M-C-SPC M-w. 대신 잘라내려면 M-C-SPC C-w을 사용하십시오.

0

내가 일반적으로 사용하는 것은 다음과 같습니다. 어떻게 든 복사 대신 균형 표현을 죽이려는 나를 위해 유용합니다. 대신 복사본을 원한다면 먼저 죽이고 실행 취소하십시오. 시점 즉 (), [], {}, <> 이든이 신택스에 의해 정의되는 내부 문자열 그렇지 평형 식이면

이 기능은, 캐릭터를 죽인다.

(defun kill-at-point() 
    "Kill the quoted string or the list that includes the point" 
    (interactive) 
    (let ((p (nth 8 (syntax-ppss)))) 
    (cond 
     ;; string 
     ((eq (char-after p) ?\") 
     (goto-char p) 
     (kill-sexp)) 
     ;; list 
     ((ignore-errors (when (eq (char-after) ?\() 
         (forward-char)) 
         (up-list) 
         t) 
     (let ((beg (point))) 
     (backward-list) 
     (kill-region beg (point))))))) 

나는 또한 포인트가 주석 내부 경우에 대한 특별한 경우를 추가하려고했지만, 나는 점에 의견의 경계를 결정하는 일반적인 방법을 찾을 수 없습니다. 아무도 모른다면, 말해주십시오.

이 다른 기능도 관련 될 수 있습니다. 이전과 마찬가지로 살인에 대해서는 으로 표시됩니다. 좋은 점은 라고 불릴 때마다 지역을 확장한다는 것입니다. 첫 번째 것은 C-, 및 두 번째 to C-M-,에 바인딩합니다.

(defun mark-at-point() 
    "Mark the quoted string or the list that includes the point" 
    (interactive) 
    (let ((p (nth 8 (syntax-ppss)))) 
    (if (eq (char-after p) ?\") 
    (progn 
     (goto-char p) 
      (set-mark (point)) 
     (forward-sexp)) 
     (progn 
     (when (eq (char-after) 40) 
      (forward-char)) 
     (condition-case nil 
      (progn 
       (up-list) 
       (set-mark (point)) 
       (let ((beg (point))) 
       (backward-list) 
       (exchange-point-and-mark))) 
      (error 
      (when (looking-back "}") 
      (exchange-point-and-mark) 
      ;; assumes functions are separated by one empty line 
      (re-search-backward "^[^A-Z-a-z]" nil t) 
      (forward-char)))))))) 
+0

안녕하세요. 응답 해 주셔서 감사합니다. 균형 잡힌 표현을 죽인 다음 그것을 취소하는 것은 현재 내가하는 일입니다. 그래서 나는 그 이상으로 뭔가를 원했습니다. @ 드류의 대답은 abouve, 나를 위해 속임수를했다. 나는 emacs/lisp에서 표준적인 것이 아니라고 놀랍다. 어쨌든, 다시 한번 감사드립니다. – Nutritioustim

+0

내 기능은 @ Drews와는 다르게 작동합니다. 그의 접근 방식은 포인트가 공백 문자 인 에 있거나 기호 위에 심볼을 복사 할 때 오류가 발생합니다. 내 함수는 식 더하기 괄호를 죽입니다. lisp/C++에 매우 유용합니다. –