【问题标题】:PHP #region for code folding?PHP #region 用于代码折叠?
【发布时间】:2011-04-10 23:31:28
【问题描述】:

PHP 中是否有 c# 的#region 等价物?

【问题讨论】:

  • 这是一个关于 IDE 功能的问题(这是一个 Visual Studio 功能,而不是 C# 功能),这里是题外话。
  • 总能把这些东西分解成另一个类或模块。我越看我的代码和区域,我就越觉得我在那里有类。现在回到在我的代码中创建更多区域
  • Kitek 的回答描述了 IDE 对 <editor-fold...> 的支持。 Darin Peterson 的回答描述了 phpstorm 最近对#region 的支持。

标签: php


【解决方案1】:

不,语言中没有直接的内容。

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

例如在 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?

Visual Studio Code 自版本 1.19 起包含它:

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

【讨论】:

  • 您可以写fcom 并按Tab 键插入带有编辑器折叠的代码模板。
  • 你可以在这里阅读:blog.jetbrains.com/webide/2012/03/…
  • InteliJ 在他们的 IDE(PHPStorm、idea ..)中也支持这一点以及“//region Description //endregion” 您可以使用 ctrl+shift+Y 包装任何选择
  • @Iscarneiro 不是,因为正确的答案是 PHP 没有它。这个答案虽然非常有用,但仅提供了几个 IDE 的示例。
  • @SQB 第一句话就是这样说的 ;)
【解决方案2】:

没有。

问题是,C# 被设计为仅由一个 IDE 编写,因为 Microsoft 需要您始终使用他们的工具。因此,语言中内置了一些影响 IDE 的东西。

另一方面,PHP 只是一种语言。它不应该与某个特定的编辑器有共生关系,所以它没有。所以,不,它无法控制您的编辑器。

不过,所有合适的编程文本编辑器都支持折叠类定义、函数定义和大多数范围块。一些编辑器可能允许某些扩展超出此范围。

【讨论】:

  • 您可以使用 C# 编写任何文本编辑器,就像使用任何其他语言一样。不用Visual Studio,反正用记事本写的效率很低。
  • @Kamil:当然可以,但是#Region 在“任何文本编辑器”中什么都不做。话又说回来,它仍然有它的语义。
  • 如果 PHP 有#region,所有的 php 编辑器都可以利用它来简化开发。 #region 真的很棒,因为在任何特定时间,您都可以专注于您直接从事的工作,并隐藏所有其他部分。
  • 嗯,你的回答是对的,但是 PHP 可以 做的是忽略 #region 代码行,并让 IDE 在它们上实现(或不实现)代码折叠。
  • Notepad++ 还可以识别和折叠 PHP 文件中的 #region
【解决方案3】:

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

【讨论】:

  • 仅供大家稍后阅读:#region 与 php 以及 notepad++、折叠和一切都可以正常工作。
  • //region Description#region Description 都适用于 PhpStorm
【解决方案4】:

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

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

    function SomeFunction() {
        return true;
    }

    function AnotherFunction() {
        return false;
    }

}

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

    function ThirdFunction() {
        return true;
    }

    function FourthFunction() {
        return false;
    }

}

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

折叠结果:

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

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

【讨论】:

  • 你真的认为它行不通吗?在课堂里?这个怎么样? 3v4l.org/3Z6HE
【解决方案5】:

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

#region [comment about what the code does]

code....

#endregion

【讨论】:

    【解决方案6】:

    如果您使用的是记事本++,您可以在用户定义的语言对话框中使用 ide 来定义这类东西,并且由于良好的旧区域以井号开头,因此效果很好,因为井号“#”实际上是一种标记方式在 php 中发表评论。但是,我在 notepad++ 6.6.6 版本中进行了尝试,它已经具有#region #endregion 功能,已经不需要做任何事情了。

    【讨论】:

      【解决方案7】:

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

      我知道有些编辑器可能会将其作为代码块选择,允许您折叠它,但它可能不允许您命名要折叠的部分,纯粹是因为该功能不是该语言的原生功能.

      【讨论】:

        【解决方案8】:

        我在 Linux 中使用 Geany 进行 PHP 编程,它确实支持 #region 和 #endregion 来标记代码区域,它的工作方式与使用 C# 语言的 MS Visual Studio 一样。

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

        【讨论】:

          【解决方案9】:

          我知道这是一个旧线程,但如果你有兴趣的话。

          我已经成功实现了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)
          )
          

          【讨论】:

          • 好的,我已经在答案中包含了代码。感谢您的建议。
          【解决方案10】:

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

          安装

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

          配置

          1. Shift+F5弹出折叠面板,选择Add another访问配置文件;
          2. 确保它有一个 default 和你想要的字符串(出于某种奇怪的原因,我在哈希之前有一个引号:'#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

          用法

          1. 添加您在配置文件中定义的封闭标签(您可以在每个标签后添加描述),在我的情况下:

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

          注释块的替代方案

          如果您只是对折叠注释块感兴趣,那么使用 Fold Comments 包您可以按 Ctrl+Shift+C 隐藏和显示所有 cmets(虽然它可能会隐藏 SyntaxFold 的标签)。

          【讨论】:

            【解决方案11】:

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

            【讨论】:

              【解决方案12】:

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

              【讨论】:

                【解决方案13】:

                亲吻解决方案:

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

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

                【讨论】:

                • 不起作用,它按缩进而不是按结构折叠。
                【解决方案14】:

                解决方法

                - if(true){
                     // some code
                  }
                

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

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

                【讨论】:

                  【解决方案15】:

                  虽然这是一个旧线程,但如果仍然有兴趣,可以在 NetBeans 中设置代码折叠的快捷方式。这个答案扩展了@krtek 的答案。要实现这一点,请按照以下步骤操作:

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

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

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

                  现在,如果您在编辑器中选择多行文本,您将在边距中看到“灯泡”图标。单击它,您将获得“使用代码折叠环绕”选项。选择它,输入描述就完成了。

                  参考链接:reference

                  【讨论】:

                    【解决方案16】:

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

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

                    【讨论】:

                      猜你喜欢
                      • 2011-07-05
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2016-10-26
                      • 1970-01-01
                      • 2017-03-10
                      • 2019-07-06
                      • 1970-01-01
                      相关资源
                      最近更新 更多