2008-09-16 105 views
18

如何在Emacs中輕鬆複製10行?我找不到複製行快捷方式或功能。我可以使用C-aC-spcC-eM-w來費力地複製該行,但是如何將它粘貼多次?Emacs相當於Vim的yy10p?

任何想法,然後我去寫我自己的功能。

回答

11

複製

如果你經常用線工作,則可能會在沒有選擇的區域要進行復制(kill-ring-save)和切工(kill-region)上線工作:

(defadvice kill-ring-save (before slickcopy activate compile) 
    "When called interactively with no active region, copy a single line instead." 
    (interactive 
    (if mark-active (list (region-beginning) (region-end)) 
    (list (line-beginning-position) 
      (line-beginning-position 2))))) 
(defadvice kill-region (before slickcut activate compile) 
    "When called interactively with no active region, kill a single line instead." 
    (interactive 
    (if mark-active (list (region-beginning) (region-end)) 
    (list (line-beginning-position) 
      (line-beginning-position 2))))) 

然後你可以複製只有Mw的線。

粘貼

通常前綴參數只是執行一個動作多次,所以你所期望的銅10賽揚工作,但在這種情況下,賽揚使用它的參數來表示的kill-的哪個元素戒指「抽筋」(粘貼)。我能想到的唯一解決方案是kronoz所說的:用Cx(Cy Cx)記錄一個宏,然後讓Cu的參數代替kmacro-end-and-call-macro(即Cu 9 Cx e或甚至只是C-9 Cx e或M-9 Cx e)。

另一種方式: 你也可以留在M-x viper-mode和使用yy10p :)

+1

我推薦[Evil]( `viper-mode`上的http://www.emacswiki.org/emacs/Evil); [它有很多Vim功能,v蛇沒有](http://stackoverflow.com/questions/14291260/difference-between-viper-vimpulse-and-evil-for-emacs)。 – 2013-09-04 19:49:15

0

你會想要殺死這條線:C-a C-k,然後C-y或?

+1

呃..問題是如何做到十次,而不是一次。 – Baxissimo 2008-09-17 09:34:15

18

你可以使用一個鍵盤宏: -

鈣CK CX(CY CJ CX)銅9 CXË

說明: -

  • 鈣:轉到啓動行
  • Ck:殺線
  • Cx(:開始錄製鍵盤宏
  • 賽揚:猛拉殺線
  • CJ:移動到下一行
  • CX):停止錄製鍵盤宏
  • 銅9:重複9次
  • CX E:執行鍵盤宏
+3

請注意,自Emacs 22.1發佈以來,您實際上可以使用運行`kill-whole-line`的``,它在vi中等同於`dd`。所以,只要你發現自己在做'C-C-C C-K',你就可以'`。 – 2011-05-19 12:25:34

+0

上述工作正常,但只是在Emacs 25(可能更早的版本?)FYI而不是`C-x(`和`C-x)`,你可以分別鍵入`F3`和`F4`鍵。 [參見emacs手冊瞭解更多信息](https://www.gnu.org/software/emacs/manual/html_node/emacs/Basic-Keyboard-Macro.html#Basic-Keyboard-Macro) – user12345 2017-09-21 19:34:35

0

我不知道直接相當於(Cy 10倍是我所知道的最好的),但是您可能對Viper感興趣,它是用於emacs的vi仿真軟件包。它是標準emacs發行版的一部分。

2

我知道重複任意命令的唯一途徑是「通過論證重複」使用鍵盤宏的功能。

鈣C-空間向下的Mw CX(CY CX)C-9 CXÊ

  • 鈣:轉到開始線的
  • C-空間:設置標記
  • 向下:轉到開始下面一行的
  • Mw爲:複製區域
  • CX(:啓動鍵盤宏
  • 賽揚:揚克復制線
  • C-x):結束鍵盤宏
  • C-9 C-x e:執行鍵盤宏九次。

與vim相比,這有點弱。但僅僅是因爲vim在這類事情上效率非常高。

如果您真的想要進行模態vi式交互,您可以使用其中一種vi仿真模式,例如viper模式。檢查在線emacs手冊的「仿真」部分。

+1

嘿嘿,這是8擊鍵相比,10只是C - Y的十倍。我保證我可以輸入C-y的次數比我輸入的快十倍。 – Baxissimo 2008-09-17 09:37:39

7

您可能知道這一點,但對於許多命令「C-u 10」前綴將執行此操作。不幸的是,對於C-y yank命令,「C-u」被重新定義爲「將殺死戒指中的許多物品歸還,然後抽出該物品」。

我想你或許可以用C-u前綴命令使用copy-to-register和insert-register命令,但顯然這也不起作用。

另外C-x z,「重複上一個命令」似乎對C-u免疫。

另一個想法是使用M-:得到一個Eval提示符並輸入一點elisp。我認爲像(網絡'10'猛拉)可能會這樣做,但它似乎並沒有。

所以它看起來像在一個宏上使用C-u可能確實是你編寫自己的小函數的最佳選擇。

如果我有投票權,我會爲kronoz答案投票。

+5

(dotimes '10(yank))似乎對我有用 – quodlibetor 2009-10-29 02:18:53

3

這是我從Emacs的OS/2端口上取得的功能。 (是的,我使用Emacs已有一段時間。)

;; Author: Eberhard Mattes <[email protected]> 
(defun emx-dup-line (arg) 
    "Duplicate current line. 
Set mark to the beginning of the new line. 
With argument, do this that many times." 
    (interactive "*p") 
    (setq last-command 'identity) ; Don't append to kill ring 
    (let ((s (point))) 
    (beginning-of-line) 
    (let ((b (point))) 
     (forward-line) 
     (if (not (eq (preceding-char) ?\n)) (insert ?\n)) 
     (copy-region-as-kill b (point)) 
    (while (> arg 0) 
     (yank) 
     (setq arg (1- arg))) 
    (goto-char s)))) 

我有一個綁定到F9 d:

(global-set-key [f9 ?d] 'emx-dup-line) 

然後我會用銅10 F9 d重複線路10倍。

-1

你得到C-k的命令行,你用C-u 10命令發生下一個命令十次,然後用C-y粘貼該命令行。很簡單。

如果您總是希望C-k完成整個生產線,您可以將kill-whole-line設置爲t。沒有更多的C-a或C-e擺弄。

有很多你可以用花哨的殺死戒指,寄存器和宏做的事情,我鼓勵你學習它們,但是排行十次並不一定很難或很奇怪。

6

在這個例子中,你不需要C-x)和C-x e。

您可以直接給予重複參數C-x)。這將停止錄製並一次重複執行宏。或者您可以跳過C-x)並直接轉到C-x e,因爲C-x e將在重複之前結束記錄。

選擇哪種方式取決於您喜歡重複計數的工作方式。對於C-x)你說總共需要多少次重複(在這種情況下是10)。對於C-x e,您需要說明還有多少重複(即9)。


C-A C-K C-K也將殺死後換行,所以你不必把它後來回自己。它比使用標記更快,並且不需要您更改任何變量。

甚至更​​好(除非你在終端中),你可以使用C-S- Backspace *殺死整條生產線,無論你在哪裏。

[*如果您使用的X窗口,請確保輸入偏移( ALT),或者你可以終止你的會話!]終端

說到,M-9是一個不錯的選擇,如果你發現你不能輸入C-9。


在Emacs 22及更高版本中,默認情況下F3啓動宏,F4結束/重複宏。您只需按F3即可開始錄製,完成後按F4,再次按F4重複該宏。 (F4還需要一個參數。)


把所有這些組合起來,以獲得當前行的10個人副本:

  • CS-Backspace鍵:殺此行
  • F3:啓動宏
  • 賽揚:猛拉線
  • C-1 C-0 F4:使該10個洋基

不像10年前那麼短,但非常接近。 :)基於Baxissimo的回答

0

我defuned這樣的:

(defun yank-n-times (arg) 
    "yank prefix-arg number of times. Not safe in any way." 
    (interactive "*p") 
    (dotimes 'arg (yank))) 

設置,爲一些關鍵的,用一個前綴參數調用它,和您去。

編輯(還修改了上面的互動呼叫不太糟糕)

或者,這裏有一個版本,可以排序的替代使勁流行:

(defun yank-n-times (&optional arg) 
    "yank prefix-arg number of times. Call yank-pop if last command was yank." 
    (interactive "*p") 
    (if (or (string= last-command "yank") 
     (string= last-command "yank-pop")) 
     (yank-pop arg) 
    (if (> arg 1) 
    (dotimes 'arg (yank)) 
     (message "Previous arg was not a yank, and called without a prefix.")))) 

消息是怎麼樣的說謊,但是你不應該在沒有大於1的前綴的情況下調用它,所以。

不知道這是個好主意,但我用這個替換了M-Y,我會看看那是怎麼回事。

0

你可以抽出一本線(或地區)的十倍用較少的按鍵:

  • 標記線(或地區)
  • 猛拉選擇文本10倍:

C-w C-x (C-y C-1 C-0 C-x)使用F3和F4功能鍵開始和結束鍵盤宏:

C-w F3 C-y C-1 C-0 F4