【发布时间】:2012-05-08 19:15:37
【问题描述】:
在大多数现代编辑器中,您可以突出显示一段代码并缩进或取消缩进制表符或您正在使用的许多空格,这是标准的;你如何在 emacs 中做到这一点?
所以,比如我刚刚打开了 sublime text,高亮了下面这段代码:
variation1 person phoneMap carrierMap addressMap =
case M.lookup person phoneMap of
Nothing -> Nothing
Just number ->
case M.lookup number carrierMap of
Nothing -> Nothing
Just carrier -> M.lookup carrier addressMap
然后按tab键得到
variation1 person phoneMap carrierMap addressMap =
case M.lookup person phoneMap of
Nothing -> Nothing
Just number ->
case M.lookup number carrierMap of
Nothing -> Nothing
Just carrier -> M.lookup carrier addressMap
该代码上的一个 shift-tab 会将其返回到原来的位置,如果我继续按 shift-tab,我最终会得到以下信息:
variation1 person phoneMap carrierMap addressMap =
case M.lookup person phoneMap of
Nothing -> Nothing
Just number ->
case M.lookup number carrierMap of
Nothing -> Nothing
Just carrier -> M.lookup carrier addressMap
引用另一个回复:
emacs 语言模式并没有“缩进这个块”的概念 1 个标签进一步'。相反,他们非常固执己见,并且有一个概念 “这是正确的缩进”,这就是你点击时得到的 语言模式下的选项卡。
除非我使用以下代码执行此操作(haskell 模式和 ghc mod 已启用):
import Monad
import System
import IO
import Random
import Control.Monad.State
type RandomState a = State StdGen a
data CountedRandom = CountedRandom {
crGen :: StdGen
, crCount :: Int
}
type CRState = State CountedRandom
getRandom :: Random a => RandomState a
getRandom =
get >>= \gen ->
let (val, gen') = random gen in
put gen' >>
return val
我得到以下信息:
import Monad
import System
import IO
import Random
import Control.Monad.State
type RandomState a = State StdGen a
data CountedRandom = CountedRandom {
crGen :: StdGen
, crCount :: Int
}
type CRState = State CountedRandom
getRandom :: Random a => RandomState a
getRandom =
get >>= \gen ->
let (val, gen') = random gen in
put gen' >>
return val
当我想要的时候
import Monad
import System
import IO
import Random
import Control.Monad.State
type RandomState a = State StdGen a
data CountedRandom = CountedRandom {
crGen :: StdGen
, crCount :: Int
}
type CRState = State CountedRandom
getRandom :: Random a => RandomState a
getRandom =
get >>= \gen ->
let (val, gen') = random gen in
put gen' >>
return val
足够接近 ataylor 的解决方案:
(defcustom tab-shift-width 4
"Sets selected text shift width on tab"
:type 'integer)
(make-variable-buffer-local 'tab-shift-width)
(global-set-key
(kbd "<tab>")
(lambda (start end)
(interactive "r")
(if (use-region-p)
(save-excursion
(let ((deactivate-mark nil))
(indent-rigidly start end tab-shift-width)))
(indent-for-tab-command))))
(global-set-key
(kbd "S-<tab>")
(lambda (start end)
(interactive "r")
(if (use-region-p)
(save-excursion
(let ((deactivate-mark nil))
(indent-rigidly start end (- tab-shift-width))))
(indent-for-tab-command))))
如果 emacs 支持缩进检测就更好了(即,只获取某个变量的值);我发现最接近这个的是一个名为 dtrt indent 的插件,但它不适用于 Haskell。
【问题讨论】:
-
不知道emacs,但在vim中有一个矩形选择模式;在矩形选择模式下插入文本会将该文本插入每一行的相同位置。如果 emacs 有一个类似的东西(它可能有),这样的事情应该可以解决你的问题。