Textboxの編集モードでカーソル行の上下移動
code:scirpt.js
function moveDownLine(e, obj){
//オプション+下で行を下に移動
if(!(e.altKey && e.keyCode === 40) ){ return; }
e.preventDefault();
const selectpoint = obj.selectionStart;
const textbody = obj.value;
const arry = textbody.split('\n');
const textbefore = obj.value.substr(0, obj.selectionStart) ;
const currentLine = (textbefore.match( /\n/g ) || [] ).length;
obj.value = arry.join('\n');
obj.setSelectionRange(selectpoint + tempL.length+ 1,selectpoint + tempL.length +1 )
}
テキストエリアの内容を改行で分割して配列にして操作し、最終的に改行で接合してテキストエリアに戻す。
ブロック単位の移動を可能に
https://gyazo.com/a9458492ae7ffd438c4c7bb90b3bfbfa
code:script.js
function searchBlock(arry,index,level){
let a = index + 1;
const tabCh = "\\t";
regDown = new RegExp("^" + tabCh.repeat(level) + "\\*");
if(level == 0){
regUp = new RegExp("^\\*");
}else{
level--;
regUp= new RegExp("^" + tabCh.repeat(level) + "\\*");
}
for (step = a; arry.length > step; step++) {
if (regDown.test(arrystep)){ return step;
}else if (regUp.test(arrystep)){ alert("step up " + step)
return step;
}
}
return step;
}
function reverseSearchBlock(arry,index,level){
let a = index - 1;
const tabCh = "\\t";
regDown = new RegExp("^" + tabCh.repeat(level) + "\\*");
if(level == 0){
regUp = new RegExp("^\\*");
}else{
level--;
regUp= new RegExp("^" + tabCh.repeat(level) + "\\*");
}
for (let step = a;step > 0; step--) {
if (regDown.test(arrystep)){ return step;
}else if (regUp.test(arrystep)){ return step;
}
}
return a;
}
function moveDownLine(e, obj){
//オプション+下で行を下に移動
if(!(e.altKey && !(e.shiftKey) && e.keyCode === 40) ){ return; }
e.preventDefault();
const selectpoint = obj.selectionStart;
const textbody = obj.value;
const arry = textbody.split('\n');
const textbefore = obj.value.substr(0, obj.selectionStart) ;
const currentLine = (textbefore.match( /\n/g ) || [] ).length;
if (currentLine +1 == arry.length){
return;
}
const levelLIne = (arrycurrentLine.match(/\t/g) || [] ).length; const blockHeight = searchBlock(arry,currentLine,levelLIne);//かーそる行のブロックの最後の行を返す。
const targetLine = searchBlock(arry,blockHeight,levelLIne);//移動対象行の最後のブロックを返す
var moveBodyLength = 0;
for(i=blockHeight;i < targetLine ;i++){
moveBodyLength = moveBodyLength + arryi.length; }
let moveBody1 = arry.splice(currentLine,blockHeight-currentLine);
obj.value = arry.join('\n');
obj.setSelectionRange(selectpoint + moveBodyLength + 1,selectpoint + moveBodyLength + 1)
}
たぶん変なところがあるけど、動いているのでいまのところは気にしない。