PHP #region用于代码折叠?

时间:2011-04-10 23:31:29

标签: php

PHP中是否有相当于c#的#region?

16 个答案:

答案 0 :(得分:52)

不,语言中没有任何内容。

但是每个体面的编辑都允许某种标记来实现这一点。

例如在Netbeans中:

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

此语法也适用于所有Intellij IDEA编辑器系列,请参阅http://blog.jetbrains.com/webide/2012/03/new-in-4-0-custom-code-folding-regions/

您还可以通过插件模拟Eclipse中的功能:Code folding plugin for Eclipse?

答案 1 :(得分:34)

事实上,C#只是由一个IDE编写,因为Microsoft需要你总是使用他们的工具。因此,内置于语言(某种程度)是影响IDE的事情。

另一方面,PHP 只是一种语言。它不应该与某个特定的编辑器有共生关系,所以它没有。所以,不,它没有任何东西可以控制你的编辑。

但是,所有正确的编程文本编辑器都支持折叠类定义,函数定义和大多数范围块。有些编辑可能会允许某些扩展超出此范围。

答案 2 :(得分:16)

正如大家之前所说,.Net中的#region实际上是一个Visual Studio功能,而不是C#,但C#语法支持语法的事实允许任何想要实现它的IDE使用它。因为在PHP中,'#'字符也用于注释,IDE也可以这样做。事实上,JetBrains的PhpStorm做到了: https://blog.jetbrains.com/phpstorm/2012/03/new-in-4-0-custom-code-folding-regions/

答案 3 :(得分:9)

没有相应的(其他答案解释了原因),但让我告诉你我是如何做到的:

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

    function SomeFunction() {
        return true;
    }

    function AnotherFunction() {
        return false;
    }

}

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

    function ThirdFunction() {
        return true;
    }

    function FourthFunction() {
        return false;
    }

}

花括号允许我折叠代码块(你的编辑器需要支持冷折叠,但几乎所有代码都支持),而我仍然看到区域名称并有一个简单的可视分隔符。

折叠结果:

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

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

答案 4 :(得分:7)

PhpStorm支持类似于C#的代码折叠:

#region [comment about what the code does]

code....

#endregion

答案 5 :(得分:6)

如果你正在使用notepad ++,你可以在用户定义的语言对话框中使用ide定义那种东西,并且因为好的旧区域以井号开头,所以它很有用,因为井#34;#&#34;实际上是一种在php中标记注释的方法。但是,我在版本6.6.6的notepad ++中尝试过,它已经有#region #endregion功能,已经无需做任何事情了。

答案 6 :(得分:3)

可能只能使用大括号{},但这实际上取决于你的编辑。

我知道有些编辑可能会选择它作为代码块,允许你折叠它,但它可能不允许你命名你正在折叠的部分,因为该函数不是语言的本机

答案 7 :(得分:1)

我在Linux中使用Geany进行PHP编程,它支持#region和#endregion标记代码区域,它就像MS Visual Studio一样用C#语言。

PHP注释可以使用//,/ *和* /以及#来完成,因此PHP将绕过以#开头的这些行,这取决于你的文本编辑器/ IDE来使用它...和Geany一样!

答案 8 :(得分:1)

我知道这是一个老线程,但万一你感兴趣。

我已经成功地在emacs中实现了#region / #endregion代码折叠,方法是将此代码示例调整为php模式:http://blogs.msdn.com/b/dotnetinterop/archive/2008/04/14/making-hideshow-el-work-with-csharp-mode-el-and-region-endregion.aspx

结果在这里:

; ===== 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)
)

答案 9 :(得分:1)

在Sublime Text中,有一个名为SyntaxFold的包。

安装

  1. Ctrl + Shift + P 输入 install 并选择 Package Control:Install Package ;
  2. 在新菜单中输入 SyntaxFold ,选择它开始下载和安装;
  3. 检查下面的状态栏是否正确安装。
  4. 配置

    1. Shift + F5 弹出折叠面板,然后选择添加另一个以访问配置文件;
    2. 确保它的默认包含您想要的字符串(由于某些奇怪的原因,我的哈希值在哈希值之前有一个引用:'#Start)。我最终将其更改为:

      {
          //you can change in here other config options
          "default":
          {
              "endMarker": "#EOB",
              "name": "Default",
              "startMarker": "#BOB"
          }
      }
      
    3. 您还可以通过在文件中更改键绑定来更改Windows上的键绑定(用法部分中的键绑定):

        

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

    4. 用法

      1. 添加您在配置文件中定义的封闭式代码(您可以在每个代码后添加说明),在我的情况下:

        #BOB pandora box
        public function alpha()
        {
            # code...
        }
        public function omega()
        {
            # code...
        }
        #EOB pandora box
        
      2. 要隐藏代码之间的代码,请将光标放在它们之间,然后按 Alt + 1 两次
      3. 要再次显示,请将光标放在第一个标记上,然后按 Alt + Shift + 1 两次即可。
      4. 注释块的替代

        如果您只想对评论块进行折叠,那么使用Fold Comments包可以按 Ctrl + Shift + C 隐藏并显示所有注释(尽管可能隐藏了SyntaxFold的标签)。

答案 10 :(得分:1)

在Visual Studio Code中,您可以使用c#样式区域“感到宾至如归”:

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

从技术上讲,region Constants不是必需的,它只需要#符号。但对于习惯于看到这种情况的c#开发人员(因为Visual Studio坚持这样做),它并不是真的很吵。它实际上是自我记录的。 PHP维护程序员不会因此受到阻碍。

话虽如此,这些方法也有效,但它会让人感到困惑(或者说不太清楚),也可能不适用于其他编辑器:

#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;
#

答案 11 :(得分:1)

K.I.S.S.解决方案:

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

或者,在大括号上方注释... 大括号不需要任何功能,伙计。

答案 12 :(得分:0)

解决方法

- if(true){
     // some code
  }

因此您可以点击破折号以折叠该部分。 另一种可能性:

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

答案 13 :(得分:0)

现在你可以在VSCode上使用#region了 https://twitter.com/daviwil/status/914925309220106241

答案 14 :(得分:0)

尽管这是一个旧线程,但是如果仍然有兴趣,可以设置一种在NetBeans中进行代码折叠的快捷方式。该答案扩展了@krtek的答案。为此,请按照以下步骤操作:

  1. 转到“工具”>“选项”>“编辑器”>“代码模板”

  2. 单击“新建”,输入“ cf”作为缩写,然后输入以下代码作为展开的文本:

     // <editor-fold defaultstate="collapsed" desc=" ${DESCRIPTION} ">
        ${selection line}${cursor}
        // </editor-fold>
  1. 在描述标签中,输入“代码折叠”,然后单击“确定”。

现在,如果在编辑器中选择多行文本,则在空白处将出现“灯泡”图标。单击它,您将获得“带有代码折叠的环绕”选项。选择它,输入描述,就完成了。

作为参考,请参见以下链接:reference

答案 15 :(得分:0)

老问题,但现在对于 PHP 开发越来越流行的 VS Code 用户来说,插件 Region Folder 完美而灵活地解决了这个问题

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