Predictive Tab and Shift-Tab in selected text

By default, in most modern editors you can select a code snippet and indentation, or cancel a tab or no matter how much space you use; how do you do it in emacs?

So, for example, I just opened the sublime text, highlighted the following code fragment:

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

then click the tab and get

  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

one removable tab on this code brings it back to where it was, and if I keep pressing shift-tab, I end up with the following:

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

Quote from another answer:

The emacs language modes do not really have the concept of “indent this block 1 tab further.” Instead, they are very stubborn and have an idea of ​​“this is the right indent”, and what you get when you get into language mode.

, ( 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  

:

(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, Haskell.

+3
4

indent-region .

, string-rectangle, . (, , 4 ..). ​​ , , . open-rectangle, , .

indent-rigidly (C-x TAB). . , , . , , - :

(global-set-key 
 (kbd "<tab>")
 (lambda (start end)
   (interactive "r")
   (if (use-region-p)
       (save-excursion
     (let ((deactivate-mark nil))
       (indent-rigidly start end 4)))
     (indent-for-tab-command))))
+1

Haskell , "" .

haskell-mode , ( , ), , . , . :

  • , , , . , , getRandom
  • . ; module Bla where, . , Haskell , .
  • ; , , , haskell-mode . .

Haskell, haskell-mode, Haskell. . :

  • , "" , TAB. TAB, "" .
  • , ( ..) M-x indent-region, , , .

, , - "" , TAB , TAB , . " " , .

+2

C-M-\. indent-region, .

0

emacs ", 1 ". " " , , .

, . Haskell case , , - , . , emacs "" , , . c-mode, , , ( , Haskell, ).

: , - , Haskell, github, .

0

All Articles