2012-02-06 132 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