Emacs缩进/取消当前行

时间:2012-03-14 17:09:49

标签: emacs elisp

我一直在使用Emacs,我真的很想念一个古老的Geany快捷方式 - “C-i”和“C-u”。

“C-i”缩进整个当前行(将鼠标光标保持在原位),“C-u”取消整个当前行。

我为Emacs找到了许多缩进命令,有些缩进了一个区域。基本上,我需要的是Vim的“>>”和“<<”,但将鼠标光标保持在原位。

然而,我的主要疑问是,我只能缩进当前行。

有什么想法吗?提前谢谢!

修改 Tab添加两个空格,我想要在行的任何位置,并在行的开头添加两个空格,或从行的开头删除两个空格。

2 个答案:

答案 0 :(得分:5)

这是我在emacs中对我的TAB键的默认行为,它运行命令indent-for-tab-command。来自documentation pages之一:

在编程模式中,在行的开头添加或删除一些空格和制表符的组合,给出前面几行中的文字。如果该区域处于活动状态并跨越多行,则所有这些行都以这种方式缩进。如果point最初位于当前行的缩进内,则在该缩进之后定位;否则,它将保留在新缩进文本中的同一点。请参阅程序缩进。

另外值得注意的是tab-always-indent变量:

变量tab-always-indent调整(indent-for-tab-command)命令的行为。默认值t给出上述行为。如果将值更改为符号complete,则首先尝试缩进当前行,如果该行已缩进,则尝试在点处完成文本(请参阅符号完成)。如果值为nil,则仅当point位于左边距或行的缩进中时才缩进当前行;否则,它会插入一个真正的制表符。

答案 1 :(得分:0)

我的init.el中有这个文件:

(defun rofrol/indent-region(numSpaces)
    (progn 
        ; default to start and end of current line
        (setq regionStart (line-beginning-position))
        (setq regionEnd (line-end-position))

        ; if there's a selection, use that instead of the current line
        (when (use-region-p)
            (setq regionStart (region-beginning))
            (setq regionEnd (region-end))
        )

        (save-excursion ; restore the position afterwards            
            (goto-char regionStart) ; go to the start of region
            (setq start (line-beginning-position)) ; save the start of the line
            (goto-char regionEnd) ; go to the end of region
            (setq end (line-end-position)) ; save the end of the line

            (indent-rigidly start end numSpaces) ; indent between start and end
            (setq deactivate-mark nil) ; restore the selected region
        )
    )
)

(defun rofrol/indent-lines(&optional N)
    (interactive "p")
    (indent-rigidly (line-beginning-position)
                    (line-end-position)
                    (* (or N 1) tab-width)))

(defun rofrol/untab-region (&optional N)
    (interactive "p")
    (rofrol/indent-region (* (* (or N 1) tab-width)-1)))

(defun  rofrol/tab-region (N)
    (interactive "p")
    (if (use-region-p)
        (rofrol/indent-region (* (or N 1) tab-width)) ; region was selected, call indent-region
        (rofrol/indent-lines N); else insert spaces as expected
    ))

(global-set-key (kbd "C->") 'rofrol/tab-region)
(global-set-key (kbd "C-<") 'rofrol/untab-region)