2009-01-15 50 views
36

我經常想做一個多行函數調用並將其減少到一行。例如,轉換...Emacs命令刪除高達非空白字符

function_call(
    'first_arg', 
    'second') 

function_call('first_arg', 'second') 

的emacs是否有一些命令,以幫助這一點。具體來說,是否有一個命令將從點刪除所有空格到第一個非空白字符?

回答

51

你可以試試delete-indentation,我最喜歡的命令是將多行加入一行。在你的例子中,將光標放在具有「秒」的行上,並點擊兩次,然後點擊M-^。下面是文檔:

M-^運行命令delete-indentation,這是simple.el互動編譯Lisp函數。

它綁定到M-^

(delete-indentation &optional arg)

加入這一行以前,在加入修復了空白。如果有填充前綴,請從該行的開頭將其刪除。使用參數,將此行加入到以下行中。

+1

不錯的一個。我想知道在哪裏可以找到這樣的功能。幫助我很多。 – 2011-11-28 18:46:26

5

Alt-空格會將一串空格縮減爲單個空格字符,但不會刪除換行符。不過,這應該會有所幫助。要刪除從指向第一個非空白(或換行符)的所有內容,請鍵入一個非空白字符,Alt空格,退格鍵(以刪除最終的空格字符),然後退格(刪除您添加的字符。

要打開多線函數聲明成單行聲明,使用Alt鍵空間,退格,和Alt-E(後藤行尾)命令的組合。

+0

感謝您的Alt-空間..剛剛搜索,我知道這樣的事情必須存在。只是不知道名稱或鍵綁定。 – ahilsend 2013-08-05 07:42:56

+0

這很棒,我製作了一個宏,並將其綁定到一個鍵上。謝謝! – aeu 2014-07-26 02:56:40

24

看一看的fixup-whitespace Emacs在simple.el。它的文檔是:

修復點周圍物體之間的空白區域。 根據上下文留出一個空格或不填寫空格。

類似的功能,just-one-space,即

刪除所有的空間和周圍點突片,留下一個空間

通常結合到M-SPC

+3

M-SPACE是「只是一個空間」而不是「fixup-whitespace」。不過,他們似乎也做了幾乎相同的事情。 – 2009-01-15 15:45:09

4

您可以隨時使用M-z刪除一個字符。

比如,對於您的情況:

M-Z'刪除高達單引號(可惜這將刪除單引號爲好,但這是一個小小的不便)。

+0

一個非常有用的技術。我正在養成爲了克服這個小缺點而雙擊焦點鍵的習慣。 – 2016-04-02 15:49:55

1

我這樣做:

(defun move-line-up() 
    "Removes leading spaces from the current line, and then moves 
the current line to the end of the previous line." 
    (interactive) 
    (let (start end) 
    (save-excursion 
     (beginning-of-line) 
     ; get first non-space character, only look on this line 
     (let ((search-end (save-excursion (end-of-line) (point)))) 
     (re-search-forward "[^[:space:]]" search-end)) 
     (setq end (1- (point))) 
     (previous-line) 
     (end-of-line) 
     (setq start (point)) 
     (delete-region start end)) 
    (goto-char start))) 

(defun move-next-line-up() 
    "Moves the next line to the end of the current line" 
    (interactive) 
    (next-line) 
    (move-line-up)) 

並結合這些爲:

(global-set-key (kbd "C-x ,") 'move-line-up) 
(global-set-key (kbd "C-x .") 'move-next-line-up) 

所以要解決你的問題,上寫着 「秒)」 行了,只要運行C-x , C-x ,

15

具體來說,是否有一個命令將從點刪除所有空格到第一個非空白字符?

有,做幾乎是一個命令:

M- \運行命令刪除水平空間 這是在'simple.el」互動編譯Lisp函數。

它被綁定到M- \。

(刪除水平空間&可選的向後只)

刪除點周圍的所有空格和製表符。 如果僅向後是非零,則只在點之前刪除它們。

1

如果你想要所有的刪除操作,你可以檢查貪婪刪除。

5

我使用下面的宏將下一行「拉」到當前行的末尾,壓縮空白。

(defun pull-next-line() 
    (interactive) 
    (move-end-of-line 1) 
    (kill-line) 
    (just-one-space)) 

這正是@ jrockway相反的move-line-updelete-indentation,我覺得更自然。宏中的just-one-space命令正是@ Mike的M-SPACE

我使用綁定pull-next-lineM-J(與Vim的J比喻,對「加盟」,命令)在我.emacs以下。

(global-set-key (kbd "M-J") 'pull-next-line) 

例子。上的

function_call(
    'first_arg', 
    'second') 

第一行調用pull-next-line產生

function_call('first_arg', 
    'second') 

稱這是第二次產量

function_call('first_arg', 'second') 
3

稍微不同的方法將創建一個鍵盤宏做的工作爲你。 所以,用於創建宏階段的一般方案如下所示:

foo 


       bar 

[與「foo」的則幾行後面,並與一些空格行,寫「酒吧」]

然後foo和酒吧之間的任何地方站着,做到以下幾點:

 
C-x (     ; start recording macro 
M-b      ; move backwards to the beginning of foo 
END      ; move to the end of foo 
C-space     ; place mark 
C-M-f     ; move to the end of bar 
HOME      ; move to the beginning of the line 
C-w      ; yank out all the white space 
M-SPACE     ; leave only one space 
C-x)     ; end recording the macro 
M-x name-last-kbd-macro ; name it, call it jline or something 

現在,您可以隨時刪除啓用Mx兩個詞之間的所有空格一行

麥Ë一定要記住發出你的.emacs文件插入的Mx-KBD宏的地方,以節省您的鍵盤宏 - 這是它的外觀:

(fset 'jline 
    [?\M-b end ?\C- ?\C-\M-f home ?\C-w escape ? ]) 
4

這樣做的一個比較激烈的方式是Hungry-Delete模式:

Hungry-Delete是一種次要模式,它會導致刪除操作刪除所有正在刪除的方向上的空白。