简体   繁体   English

Textmate“comment”命令对css代码无法正常工作

[英]Textmate “comment” command not working properly for css code

I'm having some problems when I toggle the comments in TextMate for CSS source code. 当我在TextMate中为CSS源代码切换注释时,我遇到了一些问题。

Using the shortcut CMD + / I activate the "Comment Line/Selection" command from the "source" bundle. 使用快捷键CMD + / I激活“源”包中的“注释行/选择”命令。 The problem is that it inserts a series of // for all kinds of languages. 问题是它为各种语言插入了一系列// For example, in CSS files it is supposed to insert a /**/ block, but it doesn't. 例如,在CSS文件中,它应该插入/**/块,但它不会。 In CSS files I also tried the "Insert Block Comment" command from the source bundle with the weird result that I get the following // . 在CSS文件中,我还尝试了源包中的“插入块注释”命令,结果很奇怪,我得到以下结果//

// ----------------------------------------

instead of my code, deleting the code and inserting that. 而不是我的代码,删除代码并插入。

I know I am supposed to modify the command from the bundle, but I can't figure out how and what. 我知道我应该从捆绑中修改命令,但我无法弄清楚如何以及如何。

This is the code of the "Comment Line/Selection" command from the "Source" Bundle: 这是来自“Source”Bundle的“Comment Line / Selection”命令的代码:

#!/usr/bin/env ruby

# by James Edward Gray II <james (at) grayproductions.net>

# 
# To override the operation of this commond for your language add a Preferences
# bundle item that defines the following valiables as appropriate for your
# language:
# 
#   TM_COMMENT_START - the character string that starts comments, e.g. /*
#   TM_COMMENT_END   - the character string that ends comments (if appropriate),
#                      e.g. */
#   TM_COMMENT_MODE  - the type of comment to use - either 'line' or 'block'
# 

require "#{ENV["TM_SUPPORT_PATH"]}/lib/escape"

def out(*args)
  print( *args.map do |arg|
    escaped = e_sn(arg)
    $selected ? escaped.gsub("}", "\\}") : escaped.sub("\0", "${0}")
  end )
end

# find all available comment variables
var_suffixes = [""]
2.upto(1.0/0.0) do |n|
  if ENV.include? "TM_COMMENT_START_#{n}"
    var_suffixes << "_#{n}"
  else
    break
  end
end

text    = STDIN.read
default = nil  # the comment we will insert, if none are removed

# maintain selection
if text == ENV["TM_SELECTED_TEXT"]
  $selected = true
  print "${0:"
  at_exit { print "}" }
else
  $selected = false
end

# try a removal for each comment...
var_suffixes.each do |suffix|
  # build comment
  com = { :start     => ENV["TM_COMMENT_START#{suffix}"] || "# ",
          :end       => ENV["TM_COMMENT_END#{suffix}"]   || "",
          :mode      => ENV["TM_COMMENT_MODE#{suffix}"]  ||
                        (ENV["TM_COMMENT_END#{suffix}"] ? "block" : "line"),
          :no_indent => ENV["TM_COMMENT_DISABLE_INDENT#{suffix}"] }

  com[:esc_start], com[:esc_end] = [com[:start], com[:end]].map do |str|
    str.gsub(/[\\|()\[\].?*+{}^$]/, '\\\\\&').
        gsub(/\A\s+|\s+\z/, '(?:\&)?')
  end

  # save the first one as our insertion default
  default = com if default.nil?

  # try a removal
  case com[:mode]
  when "line"  # line by line comment
    if text !~ /\A[\t ]+\z/ &&
       text.send(text.respond_to?(:lines) ? :lines : :to_s).
            map { |l| !!(l =~ /\A\s*(#{com[:esc_start]}|$)/) }.uniq == [true]
      if $selected
        out text.gsub( /^(\s*)#{com[:esc_start]}(.*?)#{com[:esc_end]}(\s*)$/,
                       '\1\2\3' )
        exit
      else
        r = text.sub( /^(\s*)#{com[:esc_start]}(.*?)#{com[:esc_end]}(\s*)$/,
                      '\1\2\3' )
        i = ENV["TM_LINE_INDEX"].to_i
        i = i > text.index(/#{com[:esc_start]}/)            ?
            [[0, i - com[:start].length].max, r.length].min :
            [i, r.length].min
        r[i, 0] = "\0"
        out r
        exit
      end
    end
  when "block" # block comment
    regex = /\A(\s*)#{com[:esc_start]}(.*?)#{com[:esc_end]}(\s*)\z/m
    if text =~ regex
      if $selected
        out text.sub(regex, '\1\2\3')
        exit
      else
        r = text.sub(regex, '\1\2\3')
        i = ENV["TM_LINE_INDEX"].to_i
        i = i > text.index(/#{com[:esc_start]}/)            ?
            [[0, i - com[:start].length].max, r.length].min :
            [i, r.length].min
        r[i, 0] = "\0"
        out r
        exit
      end
    end
  end
end

# none of our removals worked, so preform an insert (minding indent setting)
text[ENV["TM_LINE_INDEX"].to_i, 0] = "\0" unless $selected or text.empty?
case default[:mode]
when "line"  # apply comment line by line
  if text.empty?
    out "#{default[:start]}\0#{default[:end]}"
  elsif default[:no_indent]
    out text.gsub(/^.*$/, "#{default[:start]}\\&#{default[:end]}")
  elsif text =~ /\A([\t ]*)\0([\t ]*)\z/
    out text.gsub(/^.*$/, "#{$1}#{default[:start]}#{$2}#{default[:end]}")
  else
    indent = text.scan(/^[\t \0]*(?=\S)/).
                  min { |a, b| a.length <=> b.length } || ""
    text.send(text.respond_to?(:lines) ? :lines : :to_s).map do |line|
      if line =~ /^(#{indent})(.*)$(\n?)/ then
        out $1 + default[:start] + $2 + default[:end] + $3
      elsif line =~ /^(.*)$(\n?)/ then
        out indent + default[:start] + $1 + default[:end] + $2
      end
    end
  end
when "block" # apply comment around selection
  if text.empty?
    out default[:start]
    print "${0}"
    out default[:end]
  elsif text =~ /\A([\t ]*)\0([\t ]*)\z/
    out $1, default[:start]
    print "${0}"
    out $2, default[:end]
  elsif default[:no_indent]
    out default[:start], text, default[:end]
  else
    lines = text.to_a
    if lines.empty?
      out default[:start], default[:end]
    else
      lines[-1].sub!(/^(.*)$/, "\\1#{default[:end]}")
      out lines.shift.sub(/^([\s\0]*)(.*)$/, "\\1#{default[:start]}\\2")
      out(*lines) unless lines.empty?
    end
  end
end

Ensure you have the "Source" bundle installed. 确保安装了“Source”软件包。 In the latest Textmate 2 Alpha at the time of writing, go to TextMate -> Preferences -> Bundles -> Check "Source" bundle to install. 在撰写本文时的最新Textmate 2 Alpha中,转到TextMate - > Preferences - > Bundles - > Check“Source”包进行安装。 The CMD + / shortcut should now work. CMD + /快捷方式现在应该可以工作。

It is small syntax problem if you're using a Ruby higher then 1.8.7. 如果你使用的是高于1.8.7的Ruby,这是一个很小的语法问题。 You will find that to_a method has been removed. 你会发现to_a方法已被删除。 If you want to fix the problem all you need to do is modify the code found in this file. 如果要解决问题,只需修改此文件中的代码即可。

In order to fix the problem you need to search for any location that they call to_a and replace it with Array("string") . 为了解决问题,您需要搜索他们调用to_a任何位置并将其替换为Array("string")

In my case I did this. 就我而言,我做到了这一点。 This also should work for you: 这也应该适合你:

lines = text.to_a

with

lines = text.lines.to_a

在此输入图像描述

This should be a solution for every thing. 这应该是每件事的解决方案。 Look to the image to see what file I ended up fixing. 查看图像,看看我最终修复了哪个文件。

I had the same problem and it turns out that I had an SCSS bundle installed that had a preference set to use "//" for comments with a scope selector for source.css as well as source.scss. 我遇到了同样的问题,结果发现我安装了一个SCSS软件包,其首选项设置为使用“//”作为带有source.css和source.scss范围选择器的注释。

I would check to make sure that you don't have the same SCSS bundle and if you do, change the scope selector of the comments preference to be just source.scss. 我会检查以确保您没有相同的SCSS包,如果这样做,请将注释首选项的范围选择器更改为source.scss。

Cmd / has been working for years and still is. Cmd /已经工作了多年,现在仍然如此。 Well, my copy of TM2 alpha is broken (doesn't work with the / in the numeric pad but, well, it's alpha) but TM 1.5.x works as it should. 好吧,我的TM2 alpha副本被破坏了(与数字键盘中的/不兼容,但是,它是alpha)但是TM 1.5.x可以正常工作。

You are not supposed to modify anything anywhere. 应该在任何地方修改任何东西。 The Comment Line/Selection command is smart enough to put the right kind of comment in "any" kind of file. 注释行/选择命令足够智能,可以在“任何”类型的文件中添加正确的注释。

Did you mess with language definitions? 你搞乱了语言定义吗? Is your file recognized as "CSS"? 您的文件是否被识别为“CSS”? Does it work when removing all or certain plugins/bundles? 删除所有或某些插件/包时它是否有效?

-- EDIT --

在此输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM