에이스 편집기에서 여러 줄의 줄을 읽기 전용으로 만드는 방법

바 바니 라비

Ace 편집기에서 코드의 일부를 읽기 전용으로 만들려고했습니다.

JsFiddle에 제공된 코드를 사용하여 시도했습니다.

$(function() {
    var editor     = ace.edit("editor1")
        , session  = editor.getSession()
        , Range    = require("ace/range").Range
        , range    = new Range(1, 4, 1, 10)
        , markerId = session.addMarker(range, "readonly-highlight");

    session.setMode("ace/mode/javascript");
    editor.keyBinding.addKeyboardHandler({
        handleKeyboard : function(data, hash, keyString, keyCode, event) {
            if (hash === -1 || (keyCode <= 40 && keyCode >= 37)) return false;

            if (intersects(range)) {
                return {command:"null", passEvent:false};
            }
        }
    });

    before(editor, 'onPaste', preventReadonly);
    before(editor, 'onCut',   preventReadonly);

    range.start  = session.doc.createAnchor(range.start);
    range.end    = session.doc.createAnchor(range.end);
    range.end.$insertRight = true;

    function before(obj, method, wrapper) {
        var orig = obj[method];
        obj[method] = function() {
            var args = Array.prototype.slice.call(arguments);
            return wrapper.call(this, function(){
                return orig.apply(obj, args);
            }, args);
        }

        return obj[method];
    }

    function intersects(range) {
        return editor.getSelectionRange().intersects(range);
    }

    function preventReadonly(next, args) {
        if (intersects(range)) return;
        next();
    }
});

백 스페이스 키를 계속 누르면 읽기 전용 부분으로 들어가고 편집 가능한 부분이 남지 않았습니다.

여러 코드 청크를 읽기 전용으로 만들고 마지막 문자가 읽기 전용으로 삭제되는 것을 방지하려면 어떻게해야합니까?

또한 편집 가능한 부분을 지정하는 텍스트에 마커가있는 곳에서 모든 것을 동적으로 달성하는 방법은 무엇입니까?

A 씨

되돌릴 수없는 삭제 및 드래그 / 드롭 처리를 방지하기 위해 범위 끝에서 Enter를 사용하여 여러 줄의 읽기 전용을 허용하는 아래 코드를 확인하십시오.

function set_readonly(editor,readonly_ranges) {
      var  session  = editor.getSession()
          , Range    = require("ace/range").Range;
          ranges    = [];

      function before(obj, method, wrapper) {
        var orig = obj[method];
        obj[method] = function() {
          var args = Array.prototype.slice.call(arguments);
          return wrapper.call(this, function(){
              return orig.apply(obj, args);
          }, args);
        }
        return obj[method];
      }
      function intersects(range) {
          return editor.getSelectionRange().intersects(range);
      }
      function intersectsRange(newRange) {
        for (i=0;i<ranges.length;i++)
          if(newRange.intersects(ranges[i]))
            return true;
        return false;
      }
      function preventReadonly(next, args) {
          for(i=0;i<ranges.length;i++){if (intersects(ranges[i])) return;}
          next();
      }
      function onEnd(position){
        var row = position["row"],column=position["column"];
        for (i=0;i<ranges.length;i++)
          if(ranges[i].end["row"] == row && ranges[i].end["column"]==column)
            return true;
        return false;
      }
      function outSideRange(position){
        var row = position["row"],column=position["column"];
        for (i=0;i<ranges.length;i++){
          if(ranges[i].start["row"]< row && ranges[i].end["row"]>row)
              return false;
          if(ranges[i].start["row"]==row && ranges[i].start["column"]<column){
              if(ranges[i].end["row"] != row || ranges[i].end["column"]>column)
                return false;
          }
          else if(ranges[i].end["row"] == row&&ranges[i].end["column"]>column){
                return false;
          }
        }
        return true; 
      }
      for(i=0;i<readonly_ranges.length;i++){
        ranges.push(new Range(...readonly_ranges[i]));
      }
      ranges.forEach(function(range){session.addMarker(range, "readonly-highlight");});
      session.setMode("ace/mode/javascript");
      editor.keyBinding.addKeyboardHandler({
          handleKeyboard : function(data, hash, keyString, keyCode, event) {
            if (Math.abs(keyCode) == 13 && onEnd(editor.getCursorPosition())){
              return false;
            }
            if (hash === -1 || (keyCode <= 40 && keyCode >= 37)) return false;
            for(i=0;i<ranges.length;i++){
              if (intersects(ranges[i])) {
                  return {command:"null", passEvent:false};
              }
            }
          }
      });
      before(editor, 'onPaste', preventReadonly);
      before(editor, 'onCut',   preventReadonly);
      for(i=0;i<ranges.length;i++){
        ranges[i].start  = session.doc.createAnchor(ranges[i].start);
        ranges[i].end    = session.doc.createAnchor(ranges[i].end);
        ranges[i].end.$insertRight = true;
       }

      var old$tryReplace = editor.$tryReplace;
      editor.$tryReplace = function(range, replacement) {
          return intersectsRange(range)?null:old$tryReplace.apply(this, arguments);                        
      }
      var session = editor.getSession();
      var oldInsert = session.insert;
      session.insert = function(position, text) {
          return oldInsert.apply(this, [position, outSideRange(position)?text:""]);
      }
      var oldRemove = session.remove;
      session.remove = function(range) {
          return intersectsRange(range)?false:oldRemove.apply(this, arguments);                        
      }
      var oldMoveText = session.moveText;
      session.moveText = function(fromRange, toPosition, copy) {
          if (intersectsRange(fromRange) || !outSideRange(toPosition)) return fromRange;
          return oldMoveText.apply(this, arguments);
      }

}
function refresheditor(id,content,readonly) {
      var temp_id=id+'_temp';
      document.getElementById(id).innerHTML="<div id='"+temp_id+"'></div>";
      document.getElementById(temp_id).innerHTML=content;
      var editor     = ace.edit(temp_id);
      set_readonly(editor,readonly);

}

function get_readonly_by_editable_tag(id,content){
  var text= content.split("\n");
  var starts=[0],ends=[];
  text.forEach(function(line,index){
    if((line.indexOf("&lt;editable&gt;") !== -1))ends.push(index);
    if((line.indexOf("&lt;/editable&gt;") !== -1))starts.push(index+1);
  });
  ends.push(text.length);
  var readonly_ranges=[];
  for(i=0;i<starts.length;i++){
    readonly_ranges.push([starts[i],0,ends[i],0])
  }
  refresheditor(id,content,readonly_ranges);
}
var content=document.getElementById("code").innerHTML;
function readonly_lines(id,content,line_numbers){
  var readonly_ranges=[];
  all_lines= line_numbers.sort();
 
  for(i=0;i<line_numbers.length;i++){
    readonly_ranges.push([line_numbers[i]-1,0,line_numbers[i],0]);
  }
  refresheditor(id,content,readonly_ranges);
}
get_readonly_by_editable_tag("myeditor",content)
//readonly_lines("myeditor",content,[5,7,9]);
.ace_editor {
    width:100%;
    height:300px;
}
.readonly-highlight{
    background-color: red;
    opacity: 0.2;
    position: absolute;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ace.c9.io/build/src/ace.js"></script>
<link rel="stylesheet" type="text/css" href="http://jsfiddle.net/css/normalize.css">
<link rel="stylesheet" type="text/css" href="http://jsfiddle.net/css/result-light.css">

<button onclick="get_readonly_by_editable_tag('myeditor',content)">Readonly by tags</button>
<button onclick="readonly_lines('myeditor',content,[3,7])">Readonly lines 3 and 7 </button>
  <div id="myeditor" ></div>
  <div id="code" style="display:none;">//&lt;editable&gt;
//&lt;/editable&gt;
function refresheditor() {
   //&lt;editable&gt;
   document.getElementById("myeditor").innerHTML="&lt;div id='editor'&gt;&lt;/div&gt;";
   document.getElementById("editor").innerHTML=document.getElementById("code").innerHTML;
   //&lt;/editable&gt;
    var editor     = ace.edit("editor")
        , session  = editor.getSession()
        , Range    = require("ace/range").Range;
        ranges    = [];
        var text= document.getElementById("code").innerHTML.split("\n");
        var starts=[0],ends=[];
        text.forEach(function(line,index){
          if((line.indexOf("&amp;lt;editable&amp;gt;") !== -1))ends.push(index);
          if((line.indexOf("&amp;lt;/editable&amp;gt;") !== -1))starts.push(index+1);
        });
        ends.push(text.length);
        for(i=0;i&lt;starts.length;i++){
          ranges.push(new Range(starts[i], 0,ends[i] ,0));
        }
        ranges.forEach(function(range){session.addMarker(range, "readonly-highlight");});
    session.setMode("ace/mode/javascript");
    //&lt;editable&gt;
    editor.keyBinding.addKeyboardHandler({
        handleKeyboard : function(data, hash, keyString, keyCode, event) {
            var pos=editor.getCursorPosition();
            if (Math.abs(keyCode) == 13){
		 for (i=0;i&lt;ranges.length;i++){
			if((ranges[i].end["row"]==pos["row"])&&(ranges[i].end["column"]==pos["column"])){ return false;}
		 }
	    }
            if (hash === -1 || (keyCode &lt;= 40 && keyCode &gt;= 37)) return false;
            for(i=0;i&lt;ranges.length;i++){
              if (intersects(ranges[i])) {
                  return {command:"null", passEvent:false};
              }
            }
        }
    });
    //&lt;/editable&gt;
    before(editor, 'onPaste', preventReadonly);
    before(editor, 'onCut',   preventReadonly);
    for(i=0;i&lt;ranges.length;i++){
      ranges[i].start  = session.doc.createAnchor(ranges[i].start);
      ranges[i].end    = session.doc.createAnchor(ranges[i].end);
      ranges[i].end.$insertRight = true;
     }
    function before(obj, method, wrapper) {
        var orig = obj[method];
        obj[method] = function() {
            var args = Array.prototype.slice.call(arguments);
            return wrapper.call(this, function(){
                return orig.apply(obj, args);
            }, args);
        }
        return obj[method];
    }
    function intersects(range) {
        return editor.getSelectionRange().intersects(range);
    }
    function preventReadonly(next, args) {
        for(i=0;i&lt;ranges.length;i++){if (intersects(ranges[i])) return;}
        next();
    }
}
refresheditor();
        
</div>

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Xcode에서 여러 줄을 편집하는 방법 (바로 가기)

vim 편집기의 명령 줄에서 키를 눌러 연속 줄의 끝으로 이동하는 방법

ZSH의 전체 화면 편집기에서 명령 줄을 편집하는 방법은 무엇입니까?

텍스트 편집기에서 동시에 여러 줄에 탭 공간을 추가하는 방법

편집기에서 현재 줄을 세로 중앙에 유지하는 방법

Angular TypeScript에서 ACE 편집기를 사용하여 각 줄을 강조하는 방법은 무엇입니까?

Typescript를 사용하여 Ace 편집기에서 한 줄을 바꾸는 방법은 무엇입니까?

Pycharm에서 동시에 여러 줄을 편집하는 방법

Haskell에서 더 읽기 쉬운 여러 줄 문자열을 만드는 방법은 무엇입니까?

Visual Studio Code에서 편집기의 읽기 전용 설정을 변경하는 방법이 있습니까?

Android Studio 편집기에서 새 줄을 만드는 바로 가기

sed에서 여러 줄을 편집하는 방법

bash 스크립트에서 unix ed 편집기를 사용하여 마지막 줄을 제외한 모든 줄을 삭제하는 방법

MacOS의 Android Studio에서 편집 기용 단어 줄 바꿈을 활성화하는 방법

키보드의 Enter 키워드를 사용하여 한 줄 편집에서 다른 줄 편집으로 커서를 이동하는 방법

Java에서 여러 줄로 입력을 읽는 방법

확인란이 표시된 특정 행을 편집 가능하게 만들고 다른 행은 Winform에서 읽기 전용으로 만드는 방법

Python의 여러 파일에서 줄 생성기를 만드는 방법

Ansible에서 여러 줄 변수의 줄 수를 읽는 방법

MATLAB 편집기에서 여러 줄을 주석 처리하는 바로 가기 키가 있습니까?

반짝이는 앱에서 사용자가 만든 기능으로 만든 여러 줄의 텍스트를 인쇄하는 방법은 무엇입니까?

이러한 방식으로 사용자 지정 역할을 생성하고 정책 문서를 편집 할 때 AWS Lambda 코드에 대한 읽기 전용 RDS 데이터베이스 권한 만 부여합니까?

명령 줄을 사용하여 Geoserver에서 SQL보기를 만드는 방법

임의의 줄 번호 시작으로 에이스 편집기를 포함하는 방법

편집기에서 변수가 정의되는 줄로 이동

Ansible에 여러 줄을 값으로 전달하는 방법

Python에서 여러 줄의 텍스트 파일을 읽고 쓰는 방법

셸에서 여러 줄로 배열을 정의하는 방법

이미 히스토리에있는 기존 명령 줄을 여러 줄로 나누는 방법

TOP 리스트

뜨겁다태그

보관