Стандартно в большинстве современных редакторов вы можете выделить фрагмент кода и отступы или отменить вкладку или сколько бы пространства вы ни использовали; как вы это делаете в emacs?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
прижимаются язычок и получил
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, я в конечном итоге получаю следующее:
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 мод включен):
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.
Dunno о emacs, но в vim есть режим выбора прямоугольника; вставка текста в режим прямоугольного выделения вставляет этот текст в одно и то же место на каждой строке. Такая вещь должна решить вашу проблему, если emacs имеет аналог (и, вероятно, это делает). –