2012-12-15 28 views
3

我覺得非常煩人的是,kill-word和forward-word將換行符視爲空格,例如把所有東西都殺了,直到下一行的單詞結尾。我希望它停止在該行的結尾處。kill-word/forward-word應該停在換行

我試圖修改語法表以包括新行字符到字定義如下:

(?修改 - 語法條目\ n「W」)

這給出了所希望的效果,但需要爲每個語法表單獨指定。

是否有辦法在全球範圍內實現這種效果?

回答

3

那麼,首先,我強烈建議習慣將大多數情況下將換行符視爲空白的想法。 Emacs通常會一直這樣做,試圖推翻這種趨勢可能是一場永無休止的戰鬥。

其次,我同意斯蒂芬給出的答案,即與語法表混淆,或者重新定義forward-word本身,只會給你帶來麻煩和悲傷。

如果你真的想你描述M-dM-f行爲,那麼也許這將是最好的定義一組新的具有此期望的行爲功能,並可以綁定的M-dM-f鍵。

事實上,這將是改變任何emacs中某些核心功能默認行爲的傳統方式。

也許這樣? (勉強測試)

(defun forward-word-stop-eol (arg) 
    (interactive "p") 
    (let ((start (point))) 
    (save-restriction 
     (save-excursion 
     (move-end-of-line 1) 
     (narrow-to-region start (point))) 
     (forward-word arg)))) 

(defun kill-to-end-of-word-or-line (arg) 
    (interactive "p") 
    (kill-region (point) (progn (forward-word-stop-eol arg) (point)))) 

(global-set-key "\ef" forward-word-stop-eol) 
(global-set-key "\ek" kill-to-end-of-word-or-line) 
+0

謝謝!這樣可行。我還沒有弄清楚導航代碼/文本的最有效方式是什麼,但這無疑提供了一個很好的起點。 –

+0

這很不錯,我適應了bacwkard-will-word-stop-eol。如果再打一次,我只想刪除換行符。基本上是反向擊殺詞的行爲,但在換行符上設置「一站式」 – mtourne

1

更改?\n字符的語法會使您很快陷入各種模式。相反,您想要改變forward-word這種交互式調用的方式(請注意,更改函數forward-word的行爲也會導致麻煩,因爲它經常用於縮進代碼等內容)。你可能想看看subword-mode是如何工作的一個例子,說明如何做到這一點。

+0

我查了子詞模式的代碼,它也是一個偉大的信息來源。如果我決定採用更復雜的導航功能,我一定會使用子字詞作爲例子。 –

0

我用with-syntax-table臨時(和全局)修改語法表。

例如,我用它與syntax-subword模式:

(defadvice syntax-subword-forward (around testing activate) 
    (with-syntax-table (copy-syntax-table (syntax-table)) 
    (modify-syntax-entry ?\n ">") 
    ad-do-it))