开发者

PHP #region for code folding?

Is there an equivilent of 开发者_StackOverflow社区c#'s #region in PHP?


No, there's nothing directly in the language.

But every decent editors allow some kind of markup to allow this.

For example in Netbeans :

// <editor-fold defaultstate="collapsed" desc="user-description">
  ...any code...
// </editor-fold>

This syntax also works in all the Intellij IDEA editor family, see http://blog.jetbrains.com/webide/2012/03/new-in-4-0-custom-code-folding-regions/

You can also emulate the feature in Eclipse via a plugin : Code folding plugin for Eclipse?

Visual Studio Code includes it since version 1.19 :

#region user description
...any code...
#endregion


No.

The thing is, C# is sort of designed to be written by only one IDE, because Microsoft need you to always use their tools. So, built into the language (sort of) are things that affect the IDE.

PHP, on the other hand, is just a language. It's not supposed to have a symbiotic relationship with some specific editor, so it doesn't. So, no, it has nothing to control your editor.

Still, all proper programming text editors support folding class definitions, function definitions, and most scope blocks. Some editors may allow certain extensions to go beyond this.


As everybody has said before, the #region in .Net is actually a Visual Studio feature, not a C# one, but the fact that the C# grammar supports the syntax, allows its usage by any IDE that wants to implement it. Since in PHP, the '#' character is also used for comments, the same can be done by the IDEs. In fact, JetBrains' PhpStorm does it: https://blog.jetbrains.com/phpstorm/2012/03/new-in-4-0-custom-code-folding-regions/


There is no equivalent (the other answers explain why), but let me show you how I do it:

//////////////////////////
/* REGION A */ {

    function SomeFunction() {
        return true;
    }

    function AnotherFunction() {
        return false;
    }

}

//////////////////////////
/* REGION B */ {

    function ThirdFunction() {
        return true;
    }

    function FourthFunction() {
        return false;
    }

}

The curly braces allow me to fold the block of code (your editor will need to support cold folding, but almost all of them do), while I still see the region name and have a simple visual divider.

Folded Result:

//////////////////////////
/* REGION A */ { 

//////////////////////////
/* REGION B */ { 


PhpStorm supports code folding similar to C#:

#region [comment about what the code does]

code....

#endregion


If you are using notepad++ you can define that sort of thing with the ide in user defined language dialog, and since good old region starts with the pound sign, it works great because the pound "#" is actually one way to mark in php a comment. But, I tried it in version 6.6.6 of notepad++ and it already has #region #endregion functionality already no need to do anything.


You might be able to just use curly brackets {}, but it really depends on your editor.

I know some editors might pick that up as a code block, allowing you to collapse it, but it probably won't allow you to name the section that you're collapsing purely because that function isn't native to the language.


K.I.S.S. solution:

{ // region name, description, etc.
   code;
}

Or, comment above the brace... Braces don't need no function, man.


I'm using Geany in Linux to do my PHP Programming, and it DO support the #region and #endregion to mark regions of code, and it works just like the MS Visual Studio to in C# language.

PHP Comments can be done using //, /* and */, and # too, so the PHP will just bypass these lines started with # and it's up to your text editor/IDE to make use of this... And Geany does!


I know it's an old thread, but in case you are interested.

I have successfully achieved #region / #endregion code folding in emacs, by adapting this code sample to php mode: http://blogs.msdn.com/b/dotnetinterop/archive/2008/04/14/making-hideshow-el-work-with-csharp-mode-el-and-region-endregion.aspx

The result is here:

; ===== PHP style region folding
(defun php-hs-forward-sexp (&optional arg)

  "I set hs-forward-sexp-func to this function.

I found this customization necessary to do the hide/show magic in PHP
code, when dealing with region/endregion. This routine
goes forward one s-expression, whether it is defined by curly braces
or region/endregion. It handles nesting, too.

The forward-sexp method takes an arg which can be negative, which
indicates the move should be backward.  Therefore, to be fully
correct this function should also handle a negative arg. However,
the hideshow.el package never uses negative args to its
hs-forward-sexp-func, so it doesn't matter that this function does not
do negative numbers.

The arg can also be greater than 1, which means go forward
multiple times. This function doesn't handle that EITHER.  But
again, I haven't see that as a problem."

(message "php-hs-forward-sexp, (arg %d) (point %d)..."
    (if (numberp arg) arg -1)
    (point)
    )

(let ((nestlevel 0)
    (mark1 (point))
    (done nil)
    )
    (if (and arg (< arg 0))
        (message "negative arg (%d) is not supported..." arg)

        ;; else, we have a positive argument, hence move forward.
        ;; simple case is just move forward one brace
        (if (looking-at "{")
            (forward-sexp arg)

        ; The more complex case is dealing with a "region/endregion" block.
        ; We have to deal with nested regions!
        (and
            (while (not done)
                (re-search-forward "^[ \\t]*#[ \\t]*\\(region\\|endregion\\)\\b"
                (point-max) 'move)
                (cond
                    ((eobp)) ; do nothing if at end of buffer
                ((and
                    (match-beginning 1)
                    ;; if the match is longer than 6 chars, we know it is "endregion"
                    (if (> (- (match-end 1) (match-beginning 1)) 6)
                        (setq nestlevel (1- nestlevel))
                        (setq nestlevel (1+ nestlevel))
                    )
                )))
                (setq done (not (and (> nestlevel 0) (not (eobp)))))
                ); while

            (if (= nest 0)
                (goto-char (match-end 2))
            )
        ))
    )
)
)


(unless (assoc 'php-mode hs-special-modes-alist)
    (push '(php-mode
        ; "\\(^\\s*#\\s*region\\b\\)\\|{"        ; regexp for start block DID NOT WORK
        "\\(^[ \\t]*#[ \\t]*region\\b\\)\\|{"    ; regexp for start block

        ; "\\(^\\s*#\\s*endregion\\b\\)\\|}"     ; regexp for end block NO WORKY!
        "\\(^[ \\t]*#[ \\t]*endregion\\b\\)\\|}" ; regexp for end block

        "/[*/]"                                  ; regexp for comment start

        php-hs-forward-sexp                      ; hs-forward-sexp-func
        hs-c-like-adjust-block-beginning         ; c-like adjust (1 char)
        ;php-hs-adjust-block-beginning           ; php adjust ?
        )
        hs-special-modes-alist)
    )


;;
;; To use this, put this into your php-mode-hook:
;;
; for hide/show support
(add-hook 'php-mode-hook 'php-region-mode-stuff)

(defun php-region-mode-stuff ()
    (hs-minor-mode 1)
    (setq hs-isearch-open t)
    ; with point inside the block, use these keys to hide/show
    (local-set-key "\C-c>"  'hs-hide-block)
    (local-set-key "\C-c<"  'hs-show-block)
)


In Sublime Text there's a package called SyntaxFold.

Installation

  1. Ctrl+Shift+P type install and select Package Control: Install Package;
  2. In the new menu type SyntaxFold, begin the download and installation by selecting it;
  3. Check on the status bar below if it was installed correctly.

Configuration

  1. Press Shift+F5 to pop-up the fold panel and select Add Another to accesss the config file;
  2. Ensure that it has a default with the strings you want (for some odd reason mine had a quote before the hash: '#Start). I ended up changing it to:

    {
        //you can change in here other config options
        "default":
        {
            "endMarker": "#EOB",
            "name": "Default",
            "startMarker": "#BOB"
        }
    }
    
  3. You can also alter the key bindings (the ones below in the Usage section) on Windows by changing them in the file:

    C:\Users\YOUR_USER\AppData\Roaming\Sublime Text 3\Packages\SyntaxFold\Default (Windows).sublime-keymap

Usage

  1. Add the enclosing tags you defined in the config file (you can add a description after each tag), in my case:

    #BOB pandora box
    public function alpha()
    {
        # code...
    }
    public function omega()
    {
        # code...
    }
    #EOB pandora box
    
  2. To hide the code between the tags, place the cursor between them and press Alt+1 twice.
  3. To show it again, place the cursor on the first tag and press Alt+Shift+1 twice.

Alternative for Comment blocks

If you are just interested in folding comment blocks then with Fold Comments package you can press Ctrl+Shift+C to hide and show all comments (it may hide tags of SyntaxFold though).


In Visual Studio Code, you can "feel at home" with c# style regions like this:

#region Constants
    const ICEBERGS_PER_TITANIC = 100000000;
    const COFFEE_IV_DRIP_RATE = 0.00005;
#endregion

Technically, the region Constants isn't required, all it needs is the # sign. But for c# developers who are used to seeing this (because Visual Studio insists on it being this way), it's not really noisy. And it's actually self-documenting. A PHP maintenance programmer would not by stymied by this.


Having said that, these ways also work, but it would be confusing (or just less clear) and might not work in another editor:

#deathstar Constants
    const ICEBERGS_PER_TITANIC = 100000000;
    const COFFEE_IV_DRIP_RATE = 0.00005;
#deathstar

# Constants
    const ICEBERGS_PER_TITANIC = 100000000;
    const COFFEE_IV_DRIP_RATE = 0.00005;
#


Now you can use #region on VSCode https://twitter.com/daviwil/status/914925309220106241


The # symbol can be used for a comment line as described in the documentation. You can gain this feature with a plugin for the folding feature.

In Visual Studio Code, I am using the PHP Region extension.

PHP #region for code folding?


Workaround

- if(true){
     // some code
  }

so you can click on dash to collapse the section. Another possibility:

 $region = 'load_parameters';
 if($region == 'load_parameters'){
     // some code
 }


Although this is an old thread, but if one is still interested one can set a shortcut to code folding in NetBeans. This answer extends @krtek 's answer. To achieve this follow the steps:

  1. Go to Tools> Options> Editor> Code templates

  2. Click New, enter "cf" as the abbreviation, then enter the following code as the expanded text:

     // <editor-fold defaultstate="collapsed" desc=" ${DESCRIPTION} ">
        ${selection line}${cursor}
        // </editor-fold>
  1. In the description tab, enter "Code folding", and click Ok.

Now, if you select multiple lines of text in the editor, you will get the "light bulb" icon in the margin. Click it, and you'll get the option "Surround with Code folding". Select it, enter a description and you're done.

For reference see this link: reference


old question, but now for users of VS Code which is becoming popular for PHP development, the plugin Region Folder does the trick perfectly and flexibly

https://marketplace.visualstudio.com/items?itemName=maptz.regionfolder

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜