2012-02-06 137 views
2

当我在TextMate中为CSS源代码切换注释时遇到了一些问题。Textmate“comment”命令对于css代码无法正常工作

使用快捷CMD + /我激活从“源”束中的“注释行/选择”命令。问题在于它会为各种语言插入一系列//。例如,在CSS文件中,它应该插入一个/**/块,但它不会。在CSS文件中,我也尝试了源代码包中的“插入块注释”命令,结果很奇怪,我得到以下//

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

而不是我的代码,删除代码并插入。

我知道我应该修改捆绑的命令,但我无法弄清楚如何和什么。

这是“注释行/选项”命令,从“源”捆绑代码:

#!/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 

回答

0

Cmd的/已经工作了多年,现在仍然是。那么,我的TM2 alpha副本已经损坏(不适用于数字键盘中的/,但是,它是alpha),但TM 1.5.x正常工作。

你是不是应该在任何地方修改任何东西。 评论专栏/选择命令足够聪明,可以在“任何”类文件中提供正确的评论。

您是否混淆了语言定义?你的文件是否被识别为“CSS”?在删除所有或某些插件/软件包时它工作吗?

-- EDIT -- 

enter image description here

+0

对不起,我忘了指定我正在使用TM 1.5我不认为我弄乱了语言定义,因为你建议我关闭大部分的bundle,只留下活动的_css_ _source_ _text_和_textmate_ bundles,但没有结果。 Css文件已被正确识别。 – Leonardo 2012-02-06 12:32:21

+0

请粘贴命令的内容(见截图),以便有人可以将其与正常的比较。同时你应该重新安装整个事情。 – romainl 2012-02-06 14:52:45

2

我有同样的问题,事实证明,我有安装了SCSS捆绑有一个首选项设置为使用“//”征求意见与source.css一个范围选择为以及source.scss。

我会检查以确保您没有相同的SCSS包,如果是这样,请将注释首选项的范围选择器更改为source.scss。

4

确保您已安装“源代码”软件包。在编写本文时的最新Textmate 2 Alpha中,转至TextMate - >首选项 - > Bundles - >检查“Source”包以进行安装。 CMD + /快捷键现在应该可以工作。

+0

禁用所有不需要的Bundle,包括Source ...在再次安装Source之后为我工作得很好。 Tnx – mindore 2015-02-06 08:42:19

3

如果您使用的是高于1.8.7的Ruby,那么这是一个小的语法问题。你会发现to_a方法已被删除。如果你想解决这个问题,你需要做的只是修改这个文件中的代码。

为了解决这个问题,您需要搜索他们称之为to_a的任何位置,并将其替换为Array("string")

在我的情况下,我做到了。这也应该为你工作:

lines = text.to_a 

lines = text.lines.to_a 

enter image description here

这应该是每一件事情的解决方案。看看图像,看看我最终修复了哪个文件。

+0

呃,天啊.. *谢谢*。这让我开心***坚果***!在我的情况下,它只是对文件...'行139'进行单一修改。 (textmate 1.5.10,我认为) – 2013-09-27 23:21:11

+0

谢谢!...这让我困扰了几个月 – DaveG 2014-11-06 18:27:30